bcdice 3.0.0.pre.alpha.1 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +70 -0
- data/README.md +34 -7
- data/i18n/Amadeus/ja_jp.yml +386 -0
- data/i18n/Amadeus/ko_kr.yml +148 -0
- data/i18n/Cthulhu/ja_jp.yml +11 -0
- data/i18n/Cthulhu/ko_kr.yml +11 -0
- data/i18n/Cthulhu/zh_hant.yml +11 -0
- data/i18n/DetatokoSaga/ja_jp.yml +75 -0
- data/i18n/DetatokoSaga/ko_kr.yml +75 -0
- data/i18n/DoubleCross/ja_jp.yml +53 -0
- data/i18n/DoubleCross/ko_kr.yml +53 -0
- data/i18n/Dracurouge/ja_jp.yml +1374 -0
- data/i18n/Dracurouge/ko_kr.yml +295 -0
- data/i18n/Fiasco/ja_jp.yml +10 -0
- data/i18n/Fiasco/ko_kr.yml +10 -0
- data/i18n/FutariSousa/ja_jp.yml +720 -0
- data/i18n/FutariSousa/ko_kr.yml +746 -0
- data/i18n/Insane/ja_jp.yml +454 -0
- data/i18n/Insane/ko_kr.yml +502 -0
- data/i18n/Kamigakari/ja_jp.yml +276 -0
- data/i18n/Kamigakari/ko_kr.yml +204 -0
- data/i18n/KillDeathBusiness/ja_jp.yml +1092 -0
- data/i18n/KillDeathBusiness/ko_kr.yml +1063 -0
- data/i18n/LogHorizon/ja_jp.yml +3082 -0
- data/i18n/LogHorizon/ko_kr.yml +923 -0
- data/i18n/MagicaLogia/ja_jp.yml +564 -0
- data/i18n/MagicaLogia/ko_kr.yml +564 -0
- data/i18n/MonotoneMuseum/ja_jp.yml +561 -0
- data/i18n/MonotoneMuseum/ko_kr.yml +89 -0
- data/i18n/Nechronica/ja_jp.yml +57 -0
- data/i18n/Nechronica/ko_kr.yml +14 -0
- data/i18n/StratoShout/ja_jp.yml +160 -0
- data/i18n/StratoShout/ko_kr.yml +160 -0
- data/i18n/ja_jp.yml +5 -0
- data/i18n/ko_kr.yml +7 -0
- data/i18n/zh_hant.yml +3 -0
- data/lib/bcdice.rb +4 -1
- data/lib/bcdice/arithmetic.rb +22 -0
- data/lib/bcdice/arithmetic/node.rb +223 -0
- data/lib/bcdice/arithmetic/parser.rb +240 -0
- data/lib/bcdice/arithmetic_evaluator.rb +7 -156
- data/lib/bcdice/base.rb +94 -101
- data/lib/bcdice/command/lexer.rb +57 -0
- data/lib/bcdice/command/parsed.rb +65 -0
- data/lib/bcdice/command/parser.rb +489 -0
- data/lib/bcdice/common_command.rb +4 -0
- data/lib/bcdice/common_command/add_dice.rb +8 -42
- data/lib/bcdice/common_command/add_dice/node.rb +221 -72
- data/lib/bcdice/common_command/add_dice/parser.rb +391 -274
- data/lib/bcdice/common_command/add_dice/randomizer.rb +27 -33
- data/lib/bcdice/common_command/barabara_dice.rb +8 -47
- data/lib/bcdice/common_command/barabara_dice/node.rb +92 -0
- data/lib/bcdice/common_command/barabara_dice/parser.rb +336 -0
- data/lib/bcdice/common_command/barabara_dice/result.rb +22 -0
- data/lib/bcdice/common_command/calc.rb +9 -30
- data/lib/bcdice/common_command/calc/node.rb +39 -0
- data/lib/bcdice/common_command/calc/parser.rb +271 -0
- data/lib/bcdice/common_command/choice.rb +137 -19
- data/lib/bcdice/common_command/d66_dice.rb +52 -34
- data/lib/bcdice/common_command/lexer.rb +47 -0
- data/lib/bcdice/common_command/repeat.rb +102 -0
- data/lib/bcdice/common_command/reroll_dice.rb +8 -158
- data/lib/bcdice/common_command/reroll_dice/node.rb +198 -0
- data/lib/bcdice/common_command/reroll_dice/parser.rb +421 -0
- data/lib/bcdice/common_command/upper_dice.rb +12 -129
- data/lib/bcdice/common_command/upper_dice/node.rb +181 -0
- data/lib/bcdice/common_command/upper_dice/parser.rb +433 -0
- data/lib/bcdice/common_command/version.rb +11 -17
- data/lib/bcdice/deprecated/checker.rb +78 -0
- data/lib/bcdice/dice_table.rb +3 -0
- data/lib/bcdice/dice_table/chain_table.rb +2 -0
- data/lib/bcdice/dice_table/d66_grid_table.rb +10 -0
- data/lib/bcdice/dice_table/d66_parity_table.rb +36 -0
- data/lib/bcdice/dice_table/d66_range_table.rb +2 -0
- data/lib/bcdice/dice_table/d66_table.rb +12 -0
- data/lib/bcdice/dice_table/roll_result.rb +2 -0
- data/lib/bcdice/dice_table/sai_fic_skill_table.rb +75 -17
- data/lib/bcdice/dice_table/sai_fic_skill_table/category.rb +25 -0
- data/lib/bcdice/dice_table/sai_fic_skill_table/skill.rb +23 -0
- data/lib/bcdice/dice_table/table.rb +10 -0
- data/lib/bcdice/enum.rb +2 -0
- data/lib/bcdice/format.rb +2 -0
- data/lib/bcdice/game_system.rb +17 -1
- data/lib/bcdice/game_system/AFF2e.rb +1 -1
- data/lib/bcdice/game_system/AceKillerGene.rb +3 -3
- data/lib/bcdice/game_system/Airgetlamh.rb +3 -3
- data/lib/bcdice/game_system/AlchemiaStruggle.rb +346 -0
- data/lib/bcdice/game_system/Alsetto.rb +1 -1
- data/lib/bcdice/game_system/Alshard.rb +1 -2
- data/lib/bcdice/game_system/AlterRaise.rb +2 -2
- data/lib/bcdice/game_system/Amadeus.rb +47 -508
- data/lib/bcdice/game_system/Amadeus_Korean.rb +12 -456
- data/lib/bcdice/game_system/AngelGear.rb +123 -0
- data/lib/bcdice/game_system/AnimaAnimus.rb +2 -6
- data/lib/bcdice/game_system/Arianrhod.rb +0 -1
- data/lib/bcdice/game_system/ArsMagica.rb +1 -1
- data/lib/bcdice/game_system/Avandner.rb +1 -1
- data/lib/bcdice/game_system/BBN.rb +7 -5
- data/lib/bcdice/game_system/BadLife.rb +2 -2
- data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
- data/lib/bcdice/game_system/BeastBindTrinity.rb +3 -13
- data/lib/bcdice/game_system/BeginningIdol.rb +6 -7
- data/lib/bcdice/game_system/BeginningIdol_Korean.rb +6 -7
- data/lib/bcdice/game_system/BladeOfArcana.rb +6 -6
- data/lib/bcdice/game_system/BlindMythos.rb +12 -10
- data/lib/bcdice/game_system/BloodCrusade.rb +54 -81
- data/lib/bcdice/game_system/BloodMoon.rb +43 -3
- data/lib/bcdice/game_system/CardRanker.rb +24 -65
- data/lib/bcdice/game_system/ChaosFlare.rb +4 -4
- data/lib/bcdice/game_system/Chill.rb +1 -1
- data/lib/bcdice/game_system/CodeLayerd.rb +37 -67
- data/lib/bcdice/game_system/ColossalHunter.rb +3 -4
- data/lib/bcdice/game_system/Comes.rb +50 -0
- data/lib/bcdice/game_system/CrashWorld.rb +1 -1
- data/lib/bcdice/game_system/Cthulhu.rb +99 -98
- data/lib/bcdice/game_system/Cthulhu7th.rb +117 -370
- data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
- data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
- data/lib/bcdice/game_system/CthulhuTech.rb +8 -15
- data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +7 -190
- data/lib/bcdice/game_system/Cthulhu_Korean.rb +5 -186
- data/lib/bcdice/game_system/DarkBlaze.rb +13 -9
- data/lib/bcdice/game_system/DarkDaysDrive.rb +17 -15
- data/lib/bcdice/game_system/DarkSouls.rb +1 -1
- data/lib/bcdice/game_system/DeadlineHeroes.rb +3 -3
- data/lib/bcdice/game_system/DemonParasite.rb +1 -2
- data/lib/bcdice/game_system/DesperateRun.rb +163 -0
- data/lib/bcdice/game_system/DetatokoSaga.rb +69 -152
- data/lib/bcdice/game_system/DetatokoSaga_Korean.rb +9 -277
- data/lib/bcdice/game_system/DiceBot.rb +22 -4
- data/lib/bcdice/game_system/DiceOfTheDead.rb +9 -6
- data/lib/bcdice/game_system/DoubleCross.rb +145 -157
- data/lib/bcdice/game_system/DoubleCross_Korean.rb +13 -330
- data/lib/bcdice/game_system/Dracurouge.rb +376 -1678
- data/lib/bcdice/game_system/Dracurouge_Korean.rb +16 -271
- data/lib/bcdice/game_system/EarthDawn.rb +1 -1
- data/lib/bcdice/game_system/EarthDawn3.rb +1 -1
- data/lib/bcdice/game_system/EarthDawn4.rb +1 -1
- data/lib/bcdice/game_system/Elysion.rb +5 -6
- data/lib/bcdice/game_system/EmbryoMachine.rb +6 -6
- data/lib/bcdice/game_system/Emoklore.rb +131 -0
- data/lib/bcdice/game_system/EndBreaker.rb +1 -2
- data/lib/bcdice/game_system/EtrianOdysseySRS.rb +1 -2
- data/lib/bcdice/game_system/Fiasco.rb +87 -70
- data/lib/bcdice/game_system/Fiasco_Korean.rb +7 -95
- data/lib/bcdice/game_system/FilledWith.rb +465 -569
- data/lib/bcdice/game_system/FullMetalPanic.rb +1 -2
- data/lib/bcdice/game_system/FutariSousa.rb +103 -938
- data/lib/bcdice/game_system/FutariSousa_Korean.rb +7 -948
- data/lib/bcdice/game_system/{Gurps.rb → GURPS.rb} +184 -217
- data/lib/bcdice/game_system/Garako.rb +140 -39
- data/lib/bcdice/game_system/GardenOrder.rb +3 -3
- data/lib/bcdice/game_system/GehennaAn.rb +4 -4
- data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
- data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
- data/lib/bcdice/game_system/GoldenSkyStories.rb +1 -1
- data/lib/bcdice/game_system/Gorilla.rb +1 -1
- data/lib/bcdice/game_system/GranCrest.rb +2 -3
- data/lib/bcdice/game_system/Gundog.rb +1 -1
- data/lib/bcdice/game_system/GundogRevised.rb +4 -4
- data/lib/bcdice/game_system/GundogZero.rb +3 -3
- data/lib/bcdice/game_system/GurpsFW.rb +4 -8
- data/lib/bcdice/game_system/HarnMaster.rb +2 -2
- data/lib/bcdice/game_system/HatsuneMiku.rb +2 -3
- data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
- data/lib/bcdice/game_system/HuntersMoon.rb +17 -111
- data/lib/bcdice/game_system/Illusio.rb +27 -36
- data/lib/bcdice/game_system/InfiniteBabeL.rb +518 -0
- data/lib/bcdice/game_system/Insane.rb +90 -717
- data/lib/bcdice/game_system/Insane_Korean.rb +7 -719
- data/lib/bcdice/game_system/JekyllAndHyde.rb +42 -0
- data/lib/bcdice/game_system/JuinKansen.rb +251 -0
- data/lib/bcdice/game_system/Kamigakari.rb +47 -242
- data/lib/bcdice/game_system/Kamigakari_Korean.rb +6 -394
- data/lib/bcdice/game_system/KanColle.rb +20 -169
- data/lib/bcdice/game_system/KemonoNoMori.rb +1 -1
- data/lib/bcdice/game_system/KillDeathBusiness.rb +189 -1180
- data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +8 -1460
- data/lib/bcdice/game_system/KurayamiCrying.rb +1 -1
- data/lib/bcdice/game_system/LiveraDoll.rb +2 -2
- data/lib/bcdice/game_system/LogHorizon.rb +350 -3379
- data/lib/bcdice/game_system/LogHorizon_Korean.rb +55 -1357
- data/lib/bcdice/game_system/LostRecord.rb +0 -1
- data/lib/bcdice/game_system/LostRoyal.rb +3 -6
- data/lib/bcdice/game_system/MagicaLogia.rb +158 -1044
- data/lib/bcdice/game_system/MagicaLogia_Korean.rb +66 -0
- data/lib/bcdice/game_system/MeikyuDays.rb +2 -3
- data/lib/bcdice/game_system/MeikyuKingdom.rb +7 -7
- data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +7 -8
- data/lib/bcdice/game_system/MetalHead.rb +1 -1
- data/lib/bcdice/game_system/MetalHeadExtream.rb +7 -7
- data/lib/bcdice/game_system/MetallicGuardian.rb +1 -2
- data/lib/bcdice/game_system/MonotoneMuseum.rb +41 -241
- data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +10 -270
- data/lib/bcdice/game_system/NSSQ.rb +159 -0
- data/lib/bcdice/game_system/Nechronica.rb +37 -76
- data/lib/bcdice/game_system/Nechronica_Korean.rb +11 -128
- data/lib/bcdice/game_system/NeverCloud.rb +540 -5
- data/lib/bcdice/game_system/NightWizard.rb +2 -2
- data/lib/bcdice/game_system/NightWizard3rd.rb +1 -1
- data/lib/bcdice/game_system/NightmareHunterDeep.rb +3 -4
- data/lib/bcdice/game_system/NinjaSlayer.rb +33 -43
- data/lib/bcdice/game_system/NjslyrBattle.rb +1 -1
- data/lib/bcdice/game_system/OneWayHeroics.rb +1 -2
- data/lib/bcdice/game_system/OracleEngine.rb +14 -18
- data/lib/bcdice/game_system/OrgaRain.rb +19 -27
- data/lib/bcdice/game_system/Paradiso.rb +3 -3
- data/lib/bcdice/game_system/Paranoia.rb +1 -1
- data/lib/bcdice/game_system/ParanoiaRebooted.rb +1 -1
- data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
- data/lib/bcdice/game_system/Peekaboo.rb +23 -123
- data/lib/bcdice/game_system/PhantasmAdventure.rb +0 -4
- data/lib/bcdice/game_system/Postman.rb +3 -3
- data/lib/bcdice/game_system/PulpCthulhu.rb +3 -3
- data/lib/bcdice/game_system/Raisondetre.rb +3 -3
- data/lib/bcdice/game_system/RecordOfLodossWar.rb +8 -7
- data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
- data/lib/bcdice/game_system/RokumonSekai2.rb +3 -3
- data/lib/bcdice/game_system/RuinBreakers.rb +296 -0
- data/lib/bcdice/game_system/RyuTuber.rb +6 -4
- data/lib/bcdice/game_system/Ryutama.rb +2 -2
- data/lib/bcdice/game_system/SRS.rb +1 -7
- data/lib/bcdice/game_system/SamsaraBallad.rb +5 -4
- data/lib/bcdice/game_system/Satasupe.rb +90 -866
- data/lib/bcdice/game_system/ScreamHighSchool.rb +4 -4
- data/lib/bcdice/game_system/SevenFortressMobius.rb +1 -1
- data/lib/bcdice/game_system/ShadowRun5.rb +2 -2
- data/lib/bcdice/game_system/SharedFantasia.rb +1 -1
- data/lib/bcdice/game_system/ShinMegamiTenseiKakuseihen.rb +1 -1
- data/lib/bcdice/game_system/ShinkuuGakuen.rb +5 -5
- data/lib/bcdice/game_system/ShinobiGami.rb +75 -40
- data/lib/bcdice/game_system/ShoujoTenrankai.rb +3 -3
- data/lib/bcdice/game_system/Skynauts.rb +2 -2
- data/lib/bcdice/game_system/SteamPunkers.rb +7 -5
- data/lib/bcdice/game_system/StellarKnights.rb +2 -5
- data/lib/bcdice/game_system/SterileLife.rb +2 -2
- data/lib/bcdice/game_system/StrangerOfSwordCity.rb +2 -3
- data/lib/bcdice/game_system/StratoShout.rb +39 -268
- data/lib/bcdice/game_system/StratoShout_Korean.rb +8 -283
- data/lib/bcdice/game_system/Strave.rb +2 -2
- data/lib/bcdice/game_system/SwordWorld.rb +52 -189
- data/lib/bcdice/game_system/SwordWorld2_0.rb +21 -150
- data/lib/bcdice/game_system/SwordWorld2_5.rb +126 -41
- data/lib/bcdice/game_system/TherapieSein.rb +3 -3
- data/lib/bcdice/game_system/TokumeiTenkousei.rb +2 -2
- data/lib/bcdice/game_system/TokyoGhostResearch.rb +2 -2
- data/lib/bcdice/game_system/Torg.rb +3 -3
- data/lib/bcdice/game_system/Torg1_5.rb +1 -1
- data/lib/bcdice/game_system/TorgEternity.rb +5 -8
- data/lib/bcdice/game_system/TrinitySeven.rb +3 -3
- data/lib/bcdice/game_system/TunnelsAndTrolls.rb +7 -7
- data/lib/bcdice/game_system/TwilightGunsmoke.rb +2 -3
- data/lib/bcdice/game_system/UnsungDuet.rb +139 -0
- data/lib/bcdice/game_system/Utakaze.rb +2 -2
- data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +1 -1
- data/lib/bcdice/game_system/Villaciel.rb +1 -2
- data/lib/bcdice/game_system/Warhammer.rb +7 -7
- data/lib/bcdice/game_system/Warhammer4.rb +326 -0
- data/lib/bcdice/game_system/WitchQuest.rb +1 -1
- data/lib/bcdice/game_system/WorldOfDarkness.rb +1 -1
- data/lib/bcdice/game_system/YankeeYogSothoth.rb +15 -15
- data/lib/bcdice/game_system/YearZeroEngine.rb +1 -1
- data/lib/bcdice/game_system/Yggdrasill.rb +605 -0
- data/lib/bcdice/game_system/ZettaiReido.rb +2 -2
- data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +294 -0
- data/lib/bcdice/game_system/cthulhu7th/rollable.rb +41 -0
- data/lib/bcdice/game_system/filled_with/cook_tables.rb +119 -0
- data/lib/bcdice/game_system/filled_with/lot_tables.rb +155 -0
- data/lib/bcdice/game_system/meikyu_kingdom/item_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom/kingdom_name_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom/landscape_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom/name_tables.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom/placename_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom/tables.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom/word_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/item_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/name_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/word_table.rb +2 -0
- data/lib/bcdice/game_system/one_way_heroics/dungeon_table.rb +2 -0
- data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +2 -0
- data/lib/bcdice/game_system/one_way_heroics/tables.rb +2 -0
- data/lib/bcdice/game_system/satasupe/tables.rb +723 -0
- data/lib/bcdice/game_system/sword_world/rating_lexer.rb +47 -0
- data/lib/bcdice/game_system/sword_world/rating_parsed.rb +99 -0
- data/lib/bcdice/game_system/sword_world/rating_parser.rb +457 -0
- data/lib/bcdice/game_system/sword_world/transcendent_test.rb +104 -0
- data/lib/bcdice/loader.rb +17 -12
- data/lib/bcdice/normalize.rb +3 -1
- data/lib/bcdice/preprocessor.rb +23 -44
- data/lib/bcdice/randomizer.rb +14 -0
- data/lib/bcdice/repl.rb +4 -2
- data/lib/bcdice/result.rb +87 -0
- data/lib/bcdice/translate.rb +13 -0
- data/lib/bcdice/user_defined_dice_table.rb +28 -15
- data/lib/bcdice/version.rb +3 -1
- metadata +101 -24
- data/.editorconfig +0 -21
- data/.github/.codecov.yaml +0 -10
- data/.github/workflows/coverage.yaml +0 -21
- data/.github/workflows/lint.yaml +0 -13
- data/.github/workflows/test.yml +0 -20
- data/.gitignore +0 -14
- data/.rubocop.yml +0 -96
- data/.rubocop_todo.yml +0 -113
- data/Gemfile +0 -11
- data/ROADMAP.md +0 -30
- data/Rakefile +0 -118
- data/bcdice.gemspec +0 -27
- data/bin/repl.rb +0 -21
- data/docs/README.txt +0 -2028
- data/docs/dicebot_sort_key.md +0 -72
- data/docs/how_to_make_dicebot.md +0 -453
- data/lib/bcdice/command_parser.rb +0 -242
@@ -1,8 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "bcdice/game_system/DetatokoSaga"
|
4
|
+
|
3
5
|
module BCDice
|
4
6
|
module GameSystem
|
5
|
-
class DetatokoSaga_Korean <
|
7
|
+
class DetatokoSaga_Korean < DetatokoSaga
|
6
8
|
# ゲームシステムの識別子
|
7
9
|
ID = 'DetatokoSaga:Korean'
|
8
10
|
|
@@ -14,9 +16,9 @@ module BCDice
|
|
14
16
|
|
15
17
|
# ダイスボットの使い方
|
16
18
|
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
17
|
-
・통상판정 xDS or xDSy or xDS>=z or xDSy>=
|
18
|
-
(x=스킬레벨, y=현재 플래그(생략=0), z=목표치(생략=8))
|
19
|
-
예)3DS 2DS5 0DS 3DS>=10 3DS7>=12
|
19
|
+
・통상판정 xDS or xDSy or xDS>=t or xDSy>=t or xDS+z>=t or xDSy+z>=t
|
20
|
+
(x=스킬레벨, y=현재 플래그(생략=0), z=수정치(생략=0), t=목표치(생략=8))
|
21
|
+
예)3DS 2DS5 0DS 3DS>=10 3DS7>=12 2DS3+1 3DS2+1>=10
|
20
22
|
・판정치 xJD or xJDy or xJDy+z or xJDy-z or xJDy/z
|
21
23
|
(x=스킬레벨, y=현재 플래그(생략=0), z=수정치(생략=0))
|
22
24
|
예)3JD 2JD5 3JD7+1 4JD/3
|
@@ -26,285 +28,15 @@ module BCDice
|
|
26
28
|
・기력 배드엔딩표 WBET (WillBadEndTable)
|
27
29
|
INFO_MESSAGE_TEXT
|
28
30
|
|
29
|
-
|
30
|
-
'\d+DS.*', '\d+JD.*',
|
31
|
-
'SST', 'StrengthStigmaTable',
|
32
|
-
'WST', 'WillStigmaTable',
|
33
|
-
'SBET', 'StrengthBadEndTable',
|
34
|
-
'WBET', 'WillBadEndTable'
|
35
|
-
])
|
31
|
+
register_prefix_from_super_class()
|
36
32
|
|
37
33
|
def initialize(command)
|
38
34
|
super(command)
|
39
35
|
|
40
|
-
@
|
41
|
-
@enabled_d66 = true
|
42
|
-
@d66_sort_type = D66SortType::ASC
|
43
|
-
end
|
44
|
-
|
45
|
-
def eval_game_system_specific_command(command)
|
46
|
-
debug("eval_game_system_specific_command begin string", command)
|
47
|
-
|
48
|
-
result = checkRoll(command)
|
49
|
-
return result unless result.empty?
|
50
|
-
|
51
|
-
result = checkJudgeValue(command)
|
52
|
-
return result unless result.empty?
|
53
|
-
|
54
|
-
debug("각종표로서 처리")
|
55
|
-
return rollTableCommand(command)
|
56
|
-
end
|
57
|
-
|
58
|
-
# 통상판정 xDS or xDSy or xDS>=z or xDSy>=z
|
59
|
-
def checkRoll(string)
|
60
|
-
debug("checkRoll begin string", string)
|
61
|
-
|
62
|
-
return '' unless /^(\d+)DS(\d+)?((>=)(\d+))?$/i =~ string
|
63
|
-
|
64
|
-
target = 8
|
65
|
-
|
66
|
-
skill = Regexp.last_match(1).to_i
|
67
|
-
flag = Regexp.last_match(2).to_i
|
68
|
-
target = Regexp.last_match(5).to_i unless Regexp.last_match(5).nil?
|
69
|
-
|
70
|
-
result = "판정! 스킬레벨:#{skill} 플래그:#{flag} 목표치:#{target}"
|
71
|
-
|
72
|
-
total, rollText = getRollResult(skill)
|
73
|
-
result += " > #{total}[#{rollText}] > 판정치:#{total}"
|
74
|
-
|
75
|
-
success = getSuccess(total, target)
|
76
|
-
result += " > #{success}"
|
77
|
-
|
78
|
-
result += getCheckFlagResult(total, flag)
|
79
|
-
|
80
|
-
return result
|
81
|
-
end
|
82
|
-
|
83
|
-
def getRollResult(skill)
|
84
|
-
diceCount = skill + 1
|
85
|
-
diceCount = 3 if skill == 0
|
86
|
-
|
87
|
-
dice = @randomizer.roll_barabara(diceCount, 6)
|
88
|
-
diceText = dice.join(',')
|
89
|
-
|
90
|
-
dice = dice.sort
|
91
|
-
dice = dice.reverse if skill != 0
|
92
|
-
|
93
|
-
total = dice[0] + dice[1]
|
94
|
-
|
95
|
-
return total, diceText
|
96
|
-
end
|
97
|
-
|
98
|
-
def getSuccess(check, target)
|
99
|
-
if check >= target
|
100
|
-
return "목표치 이상!【성공】"
|
101
|
-
end
|
102
|
-
|
103
|
-
return "목표치 미달… 【실패】"
|
104
|
-
end
|
105
|
-
|
106
|
-
def getCheckFlagResult(total, flag)
|
107
|
-
if total > flag
|
108
|
-
return ""
|
109
|
-
end
|
110
|
-
|
111
|
-
willText = getDownWill(flag)
|
112
|
-
result = ", 플래그 이하! 【기력#{willText}점 감소】"
|
113
|
-
result += " 【판정치 변경 불가】"
|
114
|
-
|
115
|
-
return result
|
36
|
+
@locale = :ko_kr
|
116
37
|
end
|
117
38
|
|
118
|
-
|
119
|
-
if flag >= 10
|
120
|
-
return "6"
|
121
|
-
end
|
122
|
-
|
123
|
-
dice = @randomizer.roll_once(6)
|
124
|
-
return "1D6->#{dice}"
|
125
|
-
end
|
126
|
-
|
127
|
-
# 스킬판정치 xJD or xJDy or xJDy+z or xJDy-z or xJDy/z
|
128
|
-
def checkJudgeValue(string)
|
129
|
-
debug("checkJudgeValue begin string", string)
|
130
|
-
|
131
|
-
return '' unless %r{^(\d+)JD(\d+)?(([+]|[-]|[/])(\d+))?$}i =~ string
|
132
|
-
|
133
|
-
skill = Regexp.last_match(1).to_i
|
134
|
-
flag = Regexp.last_match(2).to_i
|
135
|
-
operator = Regexp.last_match(4)
|
136
|
-
value = Regexp.last_match(5).to_i
|
137
|
-
|
138
|
-
result = "판정! 스킬레벨:#{skill} 플래그:#{flag}"
|
139
|
-
|
140
|
-
modifyText = getModifyText(operator, value)
|
141
|
-
result += " 수정치:#{modifyText}" unless modifyText.empty?
|
142
|
-
|
143
|
-
total, rollText = getRollResult(skill)
|
144
|
-
result += " > #{total}[#{rollText}]#{modifyText}"
|
145
|
-
|
146
|
-
totalResult = getTotalResultValue(total, value, operator)
|
147
|
-
result += " > #{totalResult}"
|
148
|
-
|
149
|
-
result += getCheckFlagResult(total, flag)
|
150
|
-
|
151
|
-
return result
|
152
|
-
end
|
153
|
-
|
154
|
-
def getModifyText(operator, value)
|
155
|
-
return '' if value == 0
|
156
|
-
|
157
|
-
operatorText =
|
158
|
-
case operator
|
159
|
-
when "+"
|
160
|
-
"+"
|
161
|
-
when "-"
|
162
|
-
"-"
|
163
|
-
when "/"
|
164
|
-
"÷"
|
165
|
-
else
|
166
|
-
return ""
|
167
|
-
end
|
168
|
-
|
169
|
-
return "#{operatorText}#{value}"
|
170
|
-
end
|
171
|
-
|
172
|
-
def getTotalResultValue(total, value, operator)
|
173
|
-
case operator
|
174
|
-
when "+"
|
175
|
-
return "#{total}+#{value} > 판정치:#{total + value}"
|
176
|
-
when "-"
|
177
|
-
return "#{total}-#{value} > 판정치:#{total - value}"
|
178
|
-
when "/"
|
179
|
-
return getTotalResultValueWhenSlash(total, value)
|
180
|
-
else
|
181
|
-
return "판정치:#{total}"
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
def getTotalResultValueWhenSlash(total, value)
|
186
|
-
return "0으로는 나누어지지 않습니다" if value == 0
|
187
|
-
|
188
|
-
quotient = ((1.0 * total) / value).ceil
|
189
|
-
|
190
|
-
result = "#{total}÷#{value} > 판정치:#{quotient}"
|
191
|
-
return result
|
192
|
-
end
|
193
|
-
|
194
|
-
####################
|
195
|
-
# 각종표
|
196
|
-
|
197
|
-
def rollTableCommand(command)
|
198
|
-
command = command.upcase
|
199
|
-
|
200
|
-
debug("eval_game_system_specific_command command", command)
|
201
|
-
|
202
|
-
name = ''
|
203
|
-
text = ''
|
204
|
-
total = 0
|
205
|
-
|
206
|
-
case command.upcase
|
207
|
-
when "SST", "StrengthStigmaTable".upcase
|
208
|
-
name, text, total = choiceStrengthStigmaTable()
|
209
|
-
when "WST", "WillStigmaTable".upcase
|
210
|
-
name, text, total = choiceWillStigmaTable()
|
211
|
-
when "SBET", "StrengthBadEndTable".upcase
|
212
|
-
name, text, total = choiceStrengthBadEndTable()
|
213
|
-
when "WBET", "WillBadEndTable".upcase
|
214
|
-
name, text, total = choiceWillBadEndTable()
|
215
|
-
else
|
216
|
-
return
|
217
|
-
end
|
218
|
-
|
219
|
-
result = "#{name}(#{total}) > #{text}"
|
220
|
-
|
221
|
-
return result
|
222
|
-
end
|
223
|
-
|
224
|
-
# ##표 목록
|
225
|
-
|
226
|
-
def choiceStrengthStigmaTable()
|
227
|
-
name = "체력 낙인표"
|
228
|
-
table = [
|
229
|
-
"당신은 【낙인】을 2개 받는다. 이 표를 다시 2번 굴려 받을 【낙인】을 정한다(그 경우, 다시 이 눈이 나와도 【낙인】은 늘어나지 않는다).",
|
230
|
-
"【상처】 심한 상처를 입었다. 어떻게든 싸울 수는 있지만…….",
|
231
|
-
"【출혈】 피가 흘러넘쳐, 눈이 흐릿하다…….",
|
232
|
-
"【쇠약】 몸이 약해져, 그 마음마저도 시들어버릴 거 같다.",
|
233
|
-
"【고통】 아픔과 괴로움, 한심함. 눈에서 눈물이 새어 나온다.",
|
234
|
-
"【충격】 날려져서, 벽이나 나무에 부딪힌다. 빨리 일어서지 않으면.",
|
235
|
-
"【피로】 당신의 얼굴에 피로의 색이 강해진다……이 싸움이 힘겨워졌다.",
|
236
|
-
"【노호】 성가신 공격에 분노의 함성을 지른다. 분노가 싸움을 어렵게 할까?",
|
237
|
-
"【부상】 상처를 입었다…….",
|
238
|
-
"【경상】 당신의 피부에 상처가 남았다. 이것만이라면 아무렇지도 않다.",
|
239
|
-
"기적적으로 당신은 【낙인】을 받지 않았다.",
|
240
|
-
]
|
241
|
-
|
242
|
-
text, total = get_table_by_2d6(table)
|
243
|
-
return name, text, total
|
244
|
-
end
|
245
|
-
|
246
|
-
def choiceWillStigmaTable()
|
247
|
-
name = "기력 낙인표"
|
248
|
-
|
249
|
-
table = [
|
250
|
-
"당신은 【낙인】을 2개 받는다. 이 표를 다시 2번 굴려 받을 【낙인】을 정한다(그 경우, 다시 이 눈이 나와도 【낙인】은 늘어나지 않는다).",
|
251
|
-
"【절망】 어떻게 하지 못하는 상황. 희망은 사라지고……무릎을 꿇을 수밖에 없다.",
|
252
|
-
"【통곡】 너무도 부조리함에, 어린아이처럼 울음을 터트릴 수밖에 없다.",
|
253
|
-
"【후회】 이럴 생각은 아니었는데. 하지만 현실은 비정했다.",
|
254
|
-
"【공포】 공포에 사로잡혔다! 적이, 자신의 손이, 무서워서 참을 수 없다!",
|
255
|
-
"【갈등】 정말로 이걸로 괜찮은 걸까? 몇 번이고 자신에게 의문이 일어난다…….",
|
256
|
-
"【증오】 분노와 증오에 사로잡힌 당신은, 본래의 힘을 발휘할 수 있을까?",
|
257
|
-
"【망연】 이것은 현실인가? 몽롱한 정신으로 당신은 생각한다.",
|
258
|
-
"【주저】 망설임을 가졌다. 그것은 싸울 의지를 둔하게 할 것인가?",
|
259
|
-
"【악몽】 이제부터 때때로, 당신은 이 순간을 악몽으로 볼 것이다.",
|
260
|
-
"기적적으로 당신은 【낙인】을 받지 않았다.",
|
261
|
-
]
|
262
|
-
|
263
|
-
text, total = get_table_by_2d6(table)
|
264
|
-
return name, text, total
|
265
|
-
end
|
266
|
-
|
267
|
-
def choiceStrengthBadEndTable()
|
268
|
-
name = "체력 배드엔딩표"
|
269
|
-
|
270
|
-
table = [
|
271
|
-
"【사망】 당신은 죽었다. 다음 세션에 참가하기 위해서는, 클래스 1개를 『몬스터』나 『암흑』으로 클래스 체인지해야만 한다.",
|
272
|
-
"【목숨 구걸】 당신은 공포를 느껴, 목숨을 구걸했다! 다음 세션 개시 시에, 클래스 1개가 『자코』로 변경된다!",
|
273
|
-
"【망각】 당신은 기억을 잃고, 우두커니 섰다. 다음 세션에 참가하기 위해서는, 클래스 1개를 변경해야만 한다.",
|
274
|
-
"【비극】 당신의 공격은 적이 아니라 아군을 맞췄다! 모든 것이 끝날 때까지 당신은 우두커니 서 있게 된다. 임의의 아군의 【체력】을 1D6점 감소시킨다.",
|
275
|
-
"【폭주】 당신은 이성을 잃고, 충동에 따라 폭주한다! 같은 씬에 있는 전원의 【체력】을 1D6점 감소시킨다.",
|
276
|
-
"【전락】 당신은 단애절벽에서 떨어진다.",
|
277
|
-
"【포로】 당신은 적에게 사로잡혔다.",
|
278
|
-
"【도주】 당신은 겁에 질려, 동료를 버리고 도망쳤다.",
|
279
|
-
"【중상】 당신은 어찌할 수 없는 상처를 입고, 쓰러졌다.",
|
280
|
-
"【기절】 당신은 의식을 잃었다. 그리고 정신이 들면 모든 것이 끝나있었다.",
|
281
|
-
"그래도 아직 일어선다! 당신은 배드엔드를 맞이하지 않았다. 체력의 【낙인】을 1개 지워도 좋다.",
|
282
|
-
]
|
283
|
-
|
284
|
-
text, total = get_table_by_2d6(table)
|
285
|
-
return name, text, total
|
286
|
-
end
|
287
|
-
|
288
|
-
def choiceWillBadEndTable()
|
289
|
-
name = "기력 배드엔딩표"
|
290
|
-
|
291
|
-
table = [
|
292
|
-
"【자해】 당신은 스스로 죽음을 골랐다. 다음 세션에 참가하기 위해서는 클래스 1개를 『암흑』으로 클래스 체인지해야만 한다.",
|
293
|
-
"【타락】 당신은 마음속의 어둠에 먹혔다. 다음 세션 개시 시에, 클래스 1개가 『암흑』이나 『몬스터』로 변경된다!",
|
294
|
-
"【예속】 당신은 적의 말에 거스를 수 없다. 다음 세션에 당신의 스탠스는 『종속』이 된다.",
|
295
|
-
"【배반】 배반의 충동. 임의의 아군의 【체력】을 1D6점 감소시키고, 그 자리에서 도망친다.",
|
296
|
-
"【폭주】 당신은 이성을 잃고, 충동에 따라 폭주한다! 같은 씬에 있는 전원의 【체력】을 1D6점 감소시킨다.",
|
297
|
-
"【저주】 마음의 어둠이 현재화한 것인가. 적의 원한인가. 저주에 삼켜진 당신은, 그저 고통에 몸부림칠 수밖에 없다.",
|
298
|
-
"【포로】 당신은 적에게 사로잡혀, 그 자리에서 끌려갔다.",
|
299
|
-
"【도주】 당신은 겁에 질려, 동료를 버리고 도망쳤다.",
|
300
|
-
"【방심】 당신은 그저 멍하니 서 있을 수밖에 없다. 정신을 차렸을 때, 모든 것은 끝나있었다.",
|
301
|
-
"【기절】 당신은 의식을 잃었다. 그리고 정신이 들면 모든 것이 끝나있었다.",
|
302
|
-
"그래도 아직 포기하지 않아! 당신은 배드엔드를 맞이하지 않았다. 기력의 【낙인】을 1개 지워도 좋다.",
|
303
|
-
]
|
304
|
-
|
305
|
-
text, total = get_table_by_2d6(table)
|
306
|
-
return name, text, total
|
307
|
-
end
|
39
|
+
TABLES = translate_tables(:ko_kr)
|
308
40
|
end
|
309
41
|
end
|
310
42
|
end
|
@@ -1,17 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BCDice
|
2
4
|
module GameSystem
|
3
5
|
class DiceBot < Base
|
4
6
|
# ゲームシステムの識別子
|
5
|
-
ID = 'DiceBot'
|
7
|
+
ID = 'DiceBot'
|
6
8
|
|
7
9
|
# ゲームシステム名
|
8
|
-
NAME = 'DiceBot'
|
10
|
+
NAME = 'DiceBot'
|
9
11
|
|
10
12
|
# ゲームシステム名の読みがな
|
11
|
-
SORT_KEY = '*たいすほつと'
|
13
|
+
SORT_KEY = '*たいすほつと'
|
12
14
|
|
13
15
|
# ダイスボットの使い方
|
14
|
-
HELP_MESSAGE =
|
16
|
+
HELP_MESSAGE = <<~HELP
|
17
|
+
3D6+1>=9 :3d6+1で目標値9以上かの判定
|
18
|
+
1D100<=50 :D100で50%目標の下方ロールの例
|
19
|
+
3U6[5] :3d6のダイス目が5以上の場合に振り足しして合計する(上方無限)
|
20
|
+
3B6 :3d6のダイス目をバラバラのまま出力する(合計しない)
|
21
|
+
10B6>=4 :10d6を振り4以上のダイス目の個数を数える
|
22
|
+
2R6[>3]>=5 :2D6のダイス目が3より大きい場合に振り足して、5以上のダイス目の個数を数える
|
23
|
+
(8/2)D(4+6)<=(5*3):個数・ダイス・達成値には四則演算も使用可能
|
24
|
+
c(10-4*3/2+2):c(計算式)で計算だけの実行も可能
|
25
|
+
choice[a,b,c]:列挙した要素から一つを選択表示。ランダム攻撃対象決定などに
|
26
|
+
S3d6 : 各コマンドの先頭に「S」を付けると他人結果の見えないシークレットロール
|
27
|
+
3d6/2 : ダイス出目を割り算(端数処理はゲームシステム依存)。切り上げは /2C、四捨五入は /2R、切り捨ては /2F
|
28
|
+
D66 : D66ダイス。順序はゲームに依存。D66N:そのまま、D66A:昇順、D66D:降順
|
29
|
+
|
30
|
+
詳細は下記URLのコマンドガイドを参照
|
31
|
+
https://docs.bcdice.org/
|
32
|
+
HELP
|
15
33
|
end
|
16
34
|
end
|
17
35
|
end
|
@@ -21,13 +21,12 @@ module BCDice
|
|
21
21
|
(上記二つは最初からシークレットダイスで行われます)
|
22
22
|
INFO_MESSAGE_TEXT
|
23
23
|
|
24
|
-
register_prefix(
|
24
|
+
register_prefix('ZMB', 'BIO')
|
25
25
|
|
26
26
|
def initialize(command)
|
27
27
|
super(command)
|
28
28
|
|
29
29
|
@sort_add_dice = true
|
30
|
-
@enabled_d66 = true
|
31
30
|
@d66_sort_type = D66SortType::ASC
|
32
31
|
end
|
33
32
|
|
@@ -35,14 +34,18 @@ module BCDice
|
|
35
34
|
case command
|
36
35
|
when /^BIO(\d+)?$/
|
37
36
|
roll_times = (Regexp.last_match(1) || 1).to_i
|
38
|
-
@is_secret = true
|
39
37
|
|
40
|
-
|
38
|
+
Result.new.tap do |r|
|
39
|
+
r.secret = true
|
40
|
+
r.text = checkInfection(roll_times)
|
41
|
+
end
|
41
42
|
when /^ZMB(\+(\d+))?$/
|
42
43
|
value = Regexp.last_match(2).to_i
|
43
|
-
@is_secret = true
|
44
44
|
|
45
|
-
|
45
|
+
Result.new.tap do |r|
|
46
|
+
r.secret = true
|
47
|
+
r.text = rollZombie(value)
|
48
|
+
end
|
46
49
|
end
|
47
50
|
end
|
48
51
|
|
@@ -30,10 +30,12 @@ module BCDice
|
|
30
30
|
・D66ダイスあり
|
31
31
|
INFO_MESSAGE_TEXT
|
32
32
|
|
33
|
-
register_prefix(
|
33
|
+
register_prefix('\d+DX', 'ET')
|
34
34
|
|
35
35
|
# 成功判定コマンドのノード
|
36
36
|
class DX
|
37
|
+
include Translate
|
38
|
+
|
37
39
|
# ノードを初期化する
|
38
40
|
# @param [Integer] num ダイス数
|
39
41
|
# @param [Integer] critical_value クリティカル値
|
@@ -47,18 +49,20 @@ module BCDice
|
|
47
49
|
|
48
50
|
@modifier_str = Format.modifier(@modifier)
|
49
51
|
@expression = node_expression()
|
52
|
+
|
53
|
+
@locale = :ja_jp
|
50
54
|
end
|
51
55
|
|
52
56
|
# 成功判定を行う
|
53
57
|
# @param randomizer [Randomizer]
|
54
|
-
# @return [
|
58
|
+
# @return [Result] 判定結果
|
55
59
|
def execute(randomizer)
|
56
60
|
if @critical_value < 2
|
57
|
-
return "(#{@expression}) >
|
61
|
+
return Result.new("(#{@expression}) > #{translate('DoubleCross.DX.invalid_critical')}")
|
58
62
|
end
|
59
63
|
|
60
64
|
if @num < 1
|
61
|
-
return "(#{@expression}) >
|
65
|
+
return Result.failure("(#{@expression}) > #{translate('DoubleCross.DX.auto_failure')}")
|
62
66
|
end
|
63
67
|
|
64
68
|
# 出目のグループの配列
|
@@ -81,7 +85,7 @@ module BCDice
|
|
81
85
|
loop_count += 1
|
82
86
|
end
|
83
87
|
|
84
|
-
return
|
88
|
+
return result(value_groups)
|
85
89
|
end
|
86
90
|
|
87
91
|
private
|
@@ -94,47 +98,51 @@ module BCDice
|
|
94
98
|
return @target_value ? "#{lhs}>=#{@target_value}" : lhs
|
95
99
|
end
|
96
100
|
|
97
|
-
#
|
101
|
+
# 判定結果を返す
|
98
102
|
# @param [Array<ValueGroup>] value_groups 出目のグループの配列
|
99
|
-
# @return [
|
100
|
-
def
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
103
|
+
# @return [Result]
|
104
|
+
def result(value_groups)
|
105
|
+
r = Result.new
|
106
|
+
|
107
|
+
r.fumble = value_groups[0].values.all?(1)
|
108
|
+
|
109
|
+
sum = value_groups.map(&:max).sum
|
110
|
+
achieved_value = r.fumble? ? 0 : (sum + @modifier)
|
111
|
+
|
112
|
+
# ファンブルかどうかを含む達成値の表記
|
113
|
+
achieved_value_with_if_fumble =
|
114
|
+
if r.fumble?
|
115
|
+
"#{achieved_value} (#{translate('fumble')})"
|
116
|
+
else
|
117
|
+
achieved_value.to_s
|
118
|
+
end
|
105
119
|
|
106
120
|
parts = [
|
107
121
|
"(#{@expression})",
|
108
122
|
"#{value_groups.join('+')}#{@modifier_str}",
|
109
|
-
achieved_value_with_if_fumble
|
110
|
-
compare_result(achieved_value, fumble)
|
123
|
+
achieved_value_with_if_fumble
|
111
124
|
]
|
112
125
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
return nil unless @target_value
|
126
|
+
if @target_value
|
127
|
+
# 行為判定成功か?
|
128
|
+
#
|
129
|
+
# ファンブル時は自動失敗、達成値が目標値以上ならば行為判定成功
|
130
|
+
# [3rd ルールブック1 pp. 186-187]
|
131
|
+
success = !r.fumble? && (achieved_value >= @target_value)
|
132
|
+
|
133
|
+
if success
|
134
|
+
r.success = true
|
135
|
+
else
|
136
|
+
r.failure = true
|
137
|
+
end
|
138
|
+
|
139
|
+
compare_result_text = translate(success ? 'success' : 'failure')
|
140
|
+
parts.push(compare_result_text)
|
141
|
+
end
|
130
142
|
|
131
|
-
|
132
|
-
# [3rd ルールブック1 pp. 186-187]
|
133
|
-
return '失敗' if fumble
|
143
|
+
r.text = parts.join(' > ')
|
134
144
|
|
135
|
-
|
136
|
-
# [3rd ルールブック1 p. 187]
|
137
|
-
return achieved_value >= @target_value ? '成功' : '失敗'
|
145
|
+
return r
|
138
146
|
end
|
139
147
|
end
|
140
148
|
|
@@ -173,9 +181,7 @@ module BCDice
|
|
173
181
|
# クリティカルの発生数を返す
|
174
182
|
# @return [Integer]
|
175
183
|
def num_of_critical_occurrences
|
176
|
-
@values
|
177
|
-
.select { |value| critical?(value) }
|
178
|
-
.length
|
184
|
+
@values.count { |value| critical?(value) }
|
179
185
|
end
|
180
186
|
|
181
187
|
private
|
@@ -191,19 +197,6 @@ module BCDice
|
|
191
197
|
end
|
192
198
|
end
|
193
199
|
|
194
|
-
def check_nD10(total, _dice_total, dice_list, cmp_op, target)
|
195
|
-
return '' if target == '?'
|
196
|
-
return '' unless cmp_op == :>=
|
197
|
-
|
198
|
-
if dice_list.count(1) == dice_list.size
|
199
|
-
" > ファンブル"
|
200
|
-
elsif total >= target
|
201
|
-
" > 成功"
|
202
|
-
else
|
203
|
-
" > 失敗"
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
200
|
# ダイスボット固有コマンドの処理を行う
|
208
201
|
# @param [String] command コマンド
|
209
202
|
# @return [String] ダイスボット固有コマンドの結果
|
@@ -222,74 +215,52 @@ module BCDice
|
|
222
215
|
|
223
216
|
private
|
224
217
|
|
225
|
-
# OD Tool式の成功判定コマンドの正規表現
|
226
|
-
#
|
227
|
-
# キャプチャ内容は以下のとおり:
|
228
|
-
#
|
229
|
-
# 1. ダイス数
|
230
|
-
# 2. 修正値
|
231
|
-
# 3. クリティカル値
|
232
|
-
# 4. 達成値
|
233
|
-
DX_OD_TOOL_RE = /\A(\d+)DX([-+]\d+(?:[-+*]\d+)*)?@(\d+)(?:>=(\d+))?\z/io.freeze
|
234
|
-
|
235
|
-
# 疾風怒濤式の成功判定コマンドの正規表現
|
236
|
-
#
|
237
|
-
# キャプチャ内容は以下のとおり:
|
238
|
-
#
|
239
|
-
# 1. ダイス数
|
240
|
-
# 2. クリティカル値
|
241
|
-
# 3. 修正値
|
242
|
-
# 4. 達成値
|
243
|
-
DX_SHIPPU_DOTO_RE = /\A(\d+)DX(\d+)?([-+]\d+(?:[-+*]\d+)*)?(?:>=(\d+))?\z/io.freeze
|
244
|
-
|
245
218
|
# 成功判定コマンドの構文解析を行う
|
246
219
|
# @param [String] command コマンド文字列
|
247
220
|
# @return [DX, nil]
|
248
221
|
def parse_dx(command)
|
249
|
-
|
250
|
-
when DX_OD_TOOL_RE
|
251
|
-
return parse_dx_od(Regexp.last_match)
|
252
|
-
when DX_SHIPPU_DOTO_RE
|
253
|
-
return parse_dx_shippu_doto(Regexp.last_match)
|
254
|
-
end
|
255
|
-
|
256
|
-
return nil
|
222
|
+
parse_dx_od(command) || parse_dx_shippu_doto(command)
|
257
223
|
end
|
258
224
|
|
259
225
|
# OD Tool式の成功判定コマンドの正規表現マッチ情報からノードを作る
|
260
|
-
# @param [
|
226
|
+
# @param command [String]
|
261
227
|
# @return [DX]
|
262
|
-
def parse_dx_od(
|
263
|
-
|
264
|
-
|
265
|
-
|
228
|
+
def parse_dx_od(command)
|
229
|
+
parser = Command::Parser.new(/\d+DX/, round_type: round_type)
|
230
|
+
.enable_critical
|
231
|
+
.restrict_cmp_op_to(nil, :>=)
|
232
|
+
parsed = parser.parse(command)
|
233
|
+
return nil unless parsed
|
266
234
|
|
267
|
-
|
235
|
+
num = parsed.command.to_i
|
236
|
+
critical_value = parsed.critical || 10
|
268
237
|
|
269
|
-
|
238
|
+
self.class::DX.new(num, critical_value, parsed.modify_number, parsed.target_number)
|
270
239
|
end
|
271
240
|
|
272
241
|
# 疾風怒濤式の成功判定コマンドの正規表現マッチ情報からノードを作る
|
273
242
|
# @param [MatchData] m 正規表現のマッチ情報
|
274
243
|
# @return [DX]
|
275
|
-
def parse_dx_shippu_doto(
|
276
|
-
|
277
|
-
|
278
|
-
|
244
|
+
def parse_dx_shippu_doto(command)
|
245
|
+
parser = Command::Parser.new(/\d+DX\d*/, round_type: round_type)
|
246
|
+
.restrict_cmp_op_to(nil, :>=)
|
247
|
+
parsed = parser.parse(command)
|
248
|
+
return nil unless parsed
|
279
249
|
|
280
|
-
|
250
|
+
num, critical_value = parsed.command.split("DX", 2).map { |x| x&.to_i }
|
251
|
+
critical_value ||= 10
|
281
252
|
|
282
|
-
|
253
|
+
self.class::DX.new(num, critical_value, parsed.modify_number, parsed.target_number)
|
283
254
|
end
|
284
255
|
|
285
256
|
# 感情表を振る
|
286
257
|
#
|
287
258
|
# ポジティブとネガティブの両方を振って、表になっている側に○を付ける。
|
288
259
|
#
|
289
|
-
# @return [
|
260
|
+
# @return [Result]
|
290
261
|
def roll_emotion_table
|
291
|
-
pos_result = POSITIVE_EMOTION_TABLE.roll(@randomizer)
|
292
|
-
neg_result = NEGATIVE_EMOTION_TABLE.roll(@randomizer)
|
262
|
+
pos_result = self.class::POSITIVE_EMOTION_TABLE.roll(@randomizer)
|
263
|
+
neg_result = self.class::NEGATIVE_EMOTION_TABLE.roll(@randomizer)
|
293
264
|
|
294
265
|
positive = @randomizer.roll_once(2) == 1
|
295
266
|
pos_neg_text =
|
@@ -299,75 +270,92 @@ module BCDice
|
|
299
270
|
[pos_result.content, "○#{neg_result.content}"]
|
300
271
|
end
|
301
272
|
|
273
|
+
name = translate("DoubleCross.ET.name")
|
302
274
|
output_parts = [
|
303
|
-
"
|
275
|
+
"#{name}(#{pos_result.sum}-#{neg_result.sum})",
|
304
276
|
pos_neg_text.join(' - ')
|
305
277
|
]
|
306
278
|
|
307
|
-
return output_parts.join(' > ')
|
279
|
+
return Result.new(output_parts.join(' > '))
|
280
|
+
end
|
281
|
+
|
282
|
+
class << self
|
283
|
+
private
|
284
|
+
|
285
|
+
# @param locale [Symbol]
|
286
|
+
# @return [RangeTable]
|
287
|
+
def positive_emotion_table(locale)
|
288
|
+
DiceTable::RangeTable.new(
|
289
|
+
I18n.translate("DoubleCross.ET.positive.name", locale: locale),
|
290
|
+
"1D100",
|
291
|
+
[
|
292
|
+
# [0, '傾倒(けいとう)'],
|
293
|
+
[1..5, I18n.translate("DoubleCross.ET.positive.items.1_5", locale: locale)],
|
294
|
+
[6..10, I18n.translate("DoubleCross.ET.positive.items.6_10", locale: locale)],
|
295
|
+
[11..15, I18n.translate("DoubleCross.ET.positive.items.11_15", locale: locale)],
|
296
|
+
[16..20, I18n.translate("DoubleCross.ET.positive.items.16_20", locale: locale)],
|
297
|
+
[21..25, I18n.translate("DoubleCross.ET.positive.items.21_25", locale: locale)],
|
298
|
+
[26..30, I18n.translate("DoubleCross.ET.positive.items.26_30", locale: locale)],
|
299
|
+
[31..35, I18n.translate("DoubleCross.ET.positive.items.31_35", locale: locale)],
|
300
|
+
[36..40, I18n.translate("DoubleCross.ET.positive.items.36_40", locale: locale)],
|
301
|
+
[41..45, I18n.translate("DoubleCross.ET.positive.items.41_45", locale: locale)],
|
302
|
+
[46..50, I18n.translate("DoubleCross.ET.positive.items.46_50", locale: locale)],
|
303
|
+
[51..55, I18n.translate("DoubleCross.ET.positive.items.51_55", locale: locale)],
|
304
|
+
[56..60, I18n.translate("DoubleCross.ET.positive.items.56_60", locale: locale)],
|
305
|
+
[61..65, I18n.translate("DoubleCross.ET.positive.items.61_65", locale: locale)],
|
306
|
+
[66..70, I18n.translate("DoubleCross.ET.positive.items.66_70", locale: locale)],
|
307
|
+
[71..75, I18n.translate("DoubleCross.ET.positive.items.71_75", locale: locale)],
|
308
|
+
[76..80, I18n.translate("DoubleCross.ET.positive.items.76_80", locale: locale)],
|
309
|
+
[81..85, I18n.translate("DoubleCross.ET.positive.items.81_85", locale: locale)],
|
310
|
+
[86..90, I18n.translate("DoubleCross.ET.positive.items.86_90", locale: locale)],
|
311
|
+
[91..95, I18n.translate("DoubleCross.ET.positive.items.91_95", locale: locale)],
|
312
|
+
[96..100, I18n.translate("DoubleCross.ET.positive.items.96_100", locale: locale)],
|
313
|
+
# [101, '懐旧(かいきゅう)'],
|
314
|
+
# [102, '任意(にんい)'],
|
315
|
+
]
|
316
|
+
)
|
317
|
+
end
|
318
|
+
|
319
|
+
# @param locale [Symbol]
|
320
|
+
# @return [RangeTable]
|
321
|
+
def negative_emotion_table(locale)
|
322
|
+
DiceTable::RangeTable.new(
|
323
|
+
I18n.translate("DoubleCross.ET.negative.name", locale: locale),
|
324
|
+
"1D100",
|
325
|
+
[
|
326
|
+
# [0, '侮蔑(ぶべつ)'],
|
327
|
+
[1..5, I18n.translate("DoubleCross.ET.negative.items.1_5", locale: locale)],
|
328
|
+
[6..10, I18n.translate("DoubleCross.ET.negative.items.6_10", locale: locale)],
|
329
|
+
[11..15, I18n.translate("DoubleCross.ET.negative.items.11_15", locale: locale)],
|
330
|
+
[16..20, I18n.translate("DoubleCross.ET.negative.items.16_20", locale: locale)],
|
331
|
+
[21..25, I18n.translate("DoubleCross.ET.negative.items.21_25", locale: locale)],
|
332
|
+
[26..30, I18n.translate("DoubleCross.ET.negative.items.26_30", locale: locale)],
|
333
|
+
[31..35, I18n.translate("DoubleCross.ET.negative.items.31_35", locale: locale)],
|
334
|
+
[36..40, I18n.translate("DoubleCross.ET.negative.items.36_40", locale: locale)],
|
335
|
+
[41..45, I18n.translate("DoubleCross.ET.negative.items.41_45", locale: locale)],
|
336
|
+
[46..50, I18n.translate("DoubleCross.ET.negative.items.46_50", locale: locale)],
|
337
|
+
[51..55, I18n.translate("DoubleCross.ET.negative.items.51_55", locale: locale)],
|
338
|
+
[56..60, I18n.translate("DoubleCross.ET.negative.items.56_60", locale: locale)],
|
339
|
+
[61..65, I18n.translate("DoubleCross.ET.negative.items.61_65", locale: locale)],
|
340
|
+
[66..70, I18n.translate("DoubleCross.ET.negative.items.66_70", locale: locale)],
|
341
|
+
[71..75, I18n.translate("DoubleCross.ET.negative.items.71_75", locale: locale)],
|
342
|
+
[76..80, I18n.translate("DoubleCross.ET.negative.items.76_80", locale: locale)],
|
343
|
+
[81..85, I18n.translate("DoubleCross.ET.negative.items.81_85", locale: locale)],
|
344
|
+
[86..90, I18n.translate("DoubleCross.ET.negative.items.86_90", locale: locale)],
|
345
|
+
[91..95, I18n.translate("DoubleCross.ET.negative.items.91_95", locale: locale)],
|
346
|
+
[96..100, I18n.translate("DoubleCross.ET.negative.items.96_100", locale: locale)],
|
347
|
+
# [101, '無関心(むかんしん)'],
|
348
|
+
# [102, '任意(にんい)'],
|
349
|
+
]
|
350
|
+
).freeze
|
351
|
+
end
|
308
352
|
end
|
309
353
|
|
310
354
|
# 感情表(ポジティブ)
|
311
|
-
POSITIVE_EMOTION_TABLE =
|
312
|
-
'感情表(ポジティブ)',
|
313
|
-
'1D100',
|
314
|
-
[
|
315
|
-
# [0, '傾倒(けいとう)'],
|
316
|
-
[1..5, '好奇心(こうきしん)'],
|
317
|
-
[6..10, '憧憬(どうけい)'],
|
318
|
-
[11..15, '尊敬(そんけい)'],
|
319
|
-
[16..20, '連帯感(れんたいかん)'],
|
320
|
-
[21..25, '慈愛(じあい)'],
|
321
|
-
[26..30, '感服(かんぷく)'],
|
322
|
-
[31..35, '純愛(じゅんあい)'],
|
323
|
-
[36..40, '友情(ゆうじょう)'],
|
324
|
-
[41..45, '慕情(ぼじょう)'],
|
325
|
-
[46..50, '同情(どうじょう)'],
|
326
|
-
[51..55, '遺志(いし)'],
|
327
|
-
[56..60, '庇護(ひご)'],
|
328
|
-
[61..65, '幸福感(こうふくかん)'],
|
329
|
-
[66..70, '信頼(しんらい)'],
|
330
|
-
[71..75, '執着(しゅうちゃく)'],
|
331
|
-
[76..80, '親近感(しんきんかん)'],
|
332
|
-
[81..85, '誠意(せいい)'],
|
333
|
-
[86..90, '好意(こうい)'],
|
334
|
-
[91..95, '有為(ゆうい)'],
|
335
|
-
[96..100, '尽力(じんりょく)'],
|
336
|
-
# [101, '懐旧(かいきゅう)'],
|
337
|
-
# [102, '任意(にんい)'],
|
338
|
-
]
|
339
|
-
).freeze
|
355
|
+
POSITIVE_EMOTION_TABLE = positive_emotion_table(:ja_jp).freeze
|
340
356
|
|
341
357
|
# 感情表(ネガティブ)
|
342
|
-
NEGATIVE_EMOTION_TABLE =
|
343
|
-
'感情表(ネガティブ)',
|
344
|
-
'1D100',
|
345
|
-
[
|
346
|
-
# [0, '侮蔑(ぶべつ)'],
|
347
|
-
[1..5, '食傷(しょくしょう)'],
|
348
|
-
[6..10, '脅威(きょうい)'],
|
349
|
-
[11..15, '嫉妬(しっと)'],
|
350
|
-
[16..20, '悔悟(かいご)'],
|
351
|
-
[21..25, '恐怖(きょうふ)'],
|
352
|
-
[26..30, '不安(ふあん)'],
|
353
|
-
[31..35, '劣等感(れっとうかん)'],
|
354
|
-
[36..40, '疎外感(そがいかん)'],
|
355
|
-
[41..45, '恥辱(ちじょく)'],
|
356
|
-
[46..50, '憐憫(れんびん)'],
|
357
|
-
[51..55, '偏愛(へんあい)'],
|
358
|
-
[56..60, '憎悪(ぞうお)'],
|
359
|
-
[61..65, '隔意(かくい)'],
|
360
|
-
[66..70, '嫌悪(けんお)'],
|
361
|
-
[71..75, '猜疑心(さいぎしん)'],
|
362
|
-
[76..80, '厭気(いやけ)'],
|
363
|
-
[81..85, '不信感(ふしんかん)'],
|
364
|
-
[86..90, '不快感(ふかいかん)'],
|
365
|
-
[91..95, '憤懣(ふんまん)'],
|
366
|
-
[96..100, '敵愾心(てきがいしん)'],
|
367
|
-
# [101, '無関心(むかんしん)'],
|
368
|
-
# [102, '任意(にんい)'],
|
369
|
-
]
|
370
|
-
).freeze
|
358
|
+
NEGATIVE_EMOTION_TABLE = negative_emotion_table(:ja_jp).freeze
|
371
359
|
end
|
372
360
|
end
|
373
361
|
end
|