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.
Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +70 -0
  3. data/README.md +34 -7
  4. data/i18n/Amadeus/ja_jp.yml +386 -0
  5. data/i18n/Amadeus/ko_kr.yml +148 -0
  6. data/i18n/Cthulhu/ja_jp.yml +11 -0
  7. data/i18n/Cthulhu/ko_kr.yml +11 -0
  8. data/i18n/Cthulhu/zh_hant.yml +11 -0
  9. data/i18n/DetatokoSaga/ja_jp.yml +75 -0
  10. data/i18n/DetatokoSaga/ko_kr.yml +75 -0
  11. data/i18n/DoubleCross/ja_jp.yml +53 -0
  12. data/i18n/DoubleCross/ko_kr.yml +53 -0
  13. data/i18n/Dracurouge/ja_jp.yml +1374 -0
  14. data/i18n/Dracurouge/ko_kr.yml +295 -0
  15. data/i18n/Fiasco/ja_jp.yml +10 -0
  16. data/i18n/Fiasco/ko_kr.yml +10 -0
  17. data/i18n/FutariSousa/ja_jp.yml +720 -0
  18. data/i18n/FutariSousa/ko_kr.yml +746 -0
  19. data/i18n/Insane/ja_jp.yml +454 -0
  20. data/i18n/Insane/ko_kr.yml +502 -0
  21. data/i18n/Kamigakari/ja_jp.yml +276 -0
  22. data/i18n/Kamigakari/ko_kr.yml +204 -0
  23. data/i18n/KillDeathBusiness/ja_jp.yml +1092 -0
  24. data/i18n/KillDeathBusiness/ko_kr.yml +1063 -0
  25. data/i18n/LogHorizon/ja_jp.yml +3082 -0
  26. data/i18n/LogHorizon/ko_kr.yml +923 -0
  27. data/i18n/MagicaLogia/ja_jp.yml +564 -0
  28. data/i18n/MagicaLogia/ko_kr.yml +564 -0
  29. data/i18n/MonotoneMuseum/ja_jp.yml +561 -0
  30. data/i18n/MonotoneMuseum/ko_kr.yml +89 -0
  31. data/i18n/Nechronica/ja_jp.yml +57 -0
  32. data/i18n/Nechronica/ko_kr.yml +14 -0
  33. data/i18n/StratoShout/ja_jp.yml +160 -0
  34. data/i18n/StratoShout/ko_kr.yml +160 -0
  35. data/i18n/ja_jp.yml +5 -0
  36. data/i18n/ko_kr.yml +7 -0
  37. data/i18n/zh_hant.yml +3 -0
  38. data/lib/bcdice.rb +4 -1
  39. data/lib/bcdice/arithmetic.rb +22 -0
  40. data/lib/bcdice/arithmetic/node.rb +223 -0
  41. data/lib/bcdice/arithmetic/parser.rb +240 -0
  42. data/lib/bcdice/arithmetic_evaluator.rb +7 -156
  43. data/lib/bcdice/base.rb +94 -101
  44. data/lib/bcdice/command/lexer.rb +57 -0
  45. data/lib/bcdice/command/parsed.rb +65 -0
  46. data/lib/bcdice/command/parser.rb +489 -0
  47. data/lib/bcdice/common_command.rb +4 -0
  48. data/lib/bcdice/common_command/add_dice.rb +8 -42
  49. data/lib/bcdice/common_command/add_dice/node.rb +221 -72
  50. data/lib/bcdice/common_command/add_dice/parser.rb +391 -274
  51. data/lib/bcdice/common_command/add_dice/randomizer.rb +27 -33
  52. data/lib/bcdice/common_command/barabara_dice.rb +8 -47
  53. data/lib/bcdice/common_command/barabara_dice/node.rb +92 -0
  54. data/lib/bcdice/common_command/barabara_dice/parser.rb +336 -0
  55. data/lib/bcdice/common_command/barabara_dice/result.rb +22 -0
  56. data/lib/bcdice/common_command/calc.rb +9 -30
  57. data/lib/bcdice/common_command/calc/node.rb +39 -0
  58. data/lib/bcdice/common_command/calc/parser.rb +271 -0
  59. data/lib/bcdice/common_command/choice.rb +137 -19
  60. data/lib/bcdice/common_command/d66_dice.rb +52 -34
  61. data/lib/bcdice/common_command/lexer.rb +47 -0
  62. data/lib/bcdice/common_command/repeat.rb +102 -0
  63. data/lib/bcdice/common_command/reroll_dice.rb +8 -158
  64. data/lib/bcdice/common_command/reroll_dice/node.rb +198 -0
  65. data/lib/bcdice/common_command/reroll_dice/parser.rb +421 -0
  66. data/lib/bcdice/common_command/upper_dice.rb +12 -129
  67. data/lib/bcdice/common_command/upper_dice/node.rb +181 -0
  68. data/lib/bcdice/common_command/upper_dice/parser.rb +433 -0
  69. data/lib/bcdice/common_command/version.rb +11 -17
  70. data/lib/bcdice/deprecated/checker.rb +78 -0
  71. data/lib/bcdice/dice_table.rb +3 -0
  72. data/lib/bcdice/dice_table/chain_table.rb +2 -0
  73. data/lib/bcdice/dice_table/d66_grid_table.rb +10 -0
  74. data/lib/bcdice/dice_table/d66_parity_table.rb +36 -0
  75. data/lib/bcdice/dice_table/d66_range_table.rb +2 -0
  76. data/lib/bcdice/dice_table/d66_table.rb +12 -0
  77. data/lib/bcdice/dice_table/roll_result.rb +2 -0
  78. data/lib/bcdice/dice_table/sai_fic_skill_table.rb +75 -17
  79. data/lib/bcdice/dice_table/sai_fic_skill_table/category.rb +25 -0
  80. data/lib/bcdice/dice_table/sai_fic_skill_table/skill.rb +23 -0
  81. data/lib/bcdice/dice_table/table.rb +10 -0
  82. data/lib/bcdice/enum.rb +2 -0
  83. data/lib/bcdice/format.rb +2 -0
  84. data/lib/bcdice/game_system.rb +17 -1
  85. data/lib/bcdice/game_system/AFF2e.rb +1 -1
  86. data/lib/bcdice/game_system/AceKillerGene.rb +3 -3
  87. data/lib/bcdice/game_system/Airgetlamh.rb +3 -3
  88. data/lib/bcdice/game_system/AlchemiaStruggle.rb +346 -0
  89. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  90. data/lib/bcdice/game_system/Alshard.rb +1 -2
  91. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  92. data/lib/bcdice/game_system/Amadeus.rb +47 -508
  93. data/lib/bcdice/game_system/Amadeus_Korean.rb +12 -456
  94. data/lib/bcdice/game_system/AngelGear.rb +123 -0
  95. data/lib/bcdice/game_system/AnimaAnimus.rb +2 -6
  96. data/lib/bcdice/game_system/Arianrhod.rb +0 -1
  97. data/lib/bcdice/game_system/ArsMagica.rb +1 -1
  98. data/lib/bcdice/game_system/Avandner.rb +1 -1
  99. data/lib/bcdice/game_system/BBN.rb +7 -5
  100. data/lib/bcdice/game_system/BadLife.rb +2 -2
  101. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  102. data/lib/bcdice/game_system/BeastBindTrinity.rb +3 -13
  103. data/lib/bcdice/game_system/BeginningIdol.rb +6 -7
  104. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +6 -7
  105. data/lib/bcdice/game_system/BladeOfArcana.rb +6 -6
  106. data/lib/bcdice/game_system/BlindMythos.rb +12 -10
  107. data/lib/bcdice/game_system/BloodCrusade.rb +54 -81
  108. data/lib/bcdice/game_system/BloodMoon.rb +43 -3
  109. data/lib/bcdice/game_system/CardRanker.rb +24 -65
  110. data/lib/bcdice/game_system/ChaosFlare.rb +4 -4
  111. data/lib/bcdice/game_system/Chill.rb +1 -1
  112. data/lib/bcdice/game_system/CodeLayerd.rb +37 -67
  113. data/lib/bcdice/game_system/ColossalHunter.rb +3 -4
  114. data/lib/bcdice/game_system/Comes.rb +50 -0
  115. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  116. data/lib/bcdice/game_system/Cthulhu.rb +99 -98
  117. data/lib/bcdice/game_system/Cthulhu7th.rb +117 -370
  118. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  119. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  120. data/lib/bcdice/game_system/CthulhuTech.rb +8 -15
  121. data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +7 -190
  122. data/lib/bcdice/game_system/Cthulhu_Korean.rb +5 -186
  123. data/lib/bcdice/game_system/DarkBlaze.rb +13 -9
  124. data/lib/bcdice/game_system/DarkDaysDrive.rb +17 -15
  125. data/lib/bcdice/game_system/DarkSouls.rb +1 -1
  126. data/lib/bcdice/game_system/DeadlineHeroes.rb +3 -3
  127. data/lib/bcdice/game_system/DemonParasite.rb +1 -2
  128. data/lib/bcdice/game_system/DesperateRun.rb +163 -0
  129. data/lib/bcdice/game_system/DetatokoSaga.rb +69 -152
  130. data/lib/bcdice/game_system/DetatokoSaga_Korean.rb +9 -277
  131. data/lib/bcdice/game_system/DiceBot.rb +22 -4
  132. data/lib/bcdice/game_system/DiceOfTheDead.rb +9 -6
  133. data/lib/bcdice/game_system/DoubleCross.rb +145 -157
  134. data/lib/bcdice/game_system/DoubleCross_Korean.rb +13 -330
  135. data/lib/bcdice/game_system/Dracurouge.rb +376 -1678
  136. data/lib/bcdice/game_system/Dracurouge_Korean.rb +16 -271
  137. data/lib/bcdice/game_system/EarthDawn.rb +1 -1
  138. data/lib/bcdice/game_system/EarthDawn3.rb +1 -1
  139. data/lib/bcdice/game_system/EarthDawn4.rb +1 -1
  140. data/lib/bcdice/game_system/Elysion.rb +5 -6
  141. data/lib/bcdice/game_system/EmbryoMachine.rb +6 -6
  142. data/lib/bcdice/game_system/Emoklore.rb +131 -0
  143. data/lib/bcdice/game_system/EndBreaker.rb +1 -2
  144. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +1 -2
  145. data/lib/bcdice/game_system/Fiasco.rb +87 -70
  146. data/lib/bcdice/game_system/Fiasco_Korean.rb +7 -95
  147. data/lib/bcdice/game_system/FilledWith.rb +465 -569
  148. data/lib/bcdice/game_system/FullMetalPanic.rb +1 -2
  149. data/lib/bcdice/game_system/FutariSousa.rb +103 -938
  150. data/lib/bcdice/game_system/FutariSousa_Korean.rb +7 -948
  151. data/lib/bcdice/game_system/{Gurps.rb → GURPS.rb} +184 -217
  152. data/lib/bcdice/game_system/Garako.rb +140 -39
  153. data/lib/bcdice/game_system/GardenOrder.rb +3 -3
  154. data/lib/bcdice/game_system/GehennaAn.rb +4 -4
  155. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  156. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  157. data/lib/bcdice/game_system/GoldenSkyStories.rb +1 -1
  158. data/lib/bcdice/game_system/Gorilla.rb +1 -1
  159. data/lib/bcdice/game_system/GranCrest.rb +2 -3
  160. data/lib/bcdice/game_system/Gundog.rb +1 -1
  161. data/lib/bcdice/game_system/GundogRevised.rb +4 -4
  162. data/lib/bcdice/game_system/GundogZero.rb +3 -3
  163. data/lib/bcdice/game_system/GurpsFW.rb +4 -8
  164. data/lib/bcdice/game_system/HarnMaster.rb +2 -2
  165. data/lib/bcdice/game_system/HatsuneMiku.rb +2 -3
  166. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  167. data/lib/bcdice/game_system/HuntersMoon.rb +17 -111
  168. data/lib/bcdice/game_system/Illusio.rb +27 -36
  169. data/lib/bcdice/game_system/InfiniteBabeL.rb +518 -0
  170. data/lib/bcdice/game_system/Insane.rb +90 -717
  171. data/lib/bcdice/game_system/Insane_Korean.rb +7 -719
  172. data/lib/bcdice/game_system/JekyllAndHyde.rb +42 -0
  173. data/lib/bcdice/game_system/JuinKansen.rb +251 -0
  174. data/lib/bcdice/game_system/Kamigakari.rb +47 -242
  175. data/lib/bcdice/game_system/Kamigakari_Korean.rb +6 -394
  176. data/lib/bcdice/game_system/KanColle.rb +20 -169
  177. data/lib/bcdice/game_system/KemonoNoMori.rb +1 -1
  178. data/lib/bcdice/game_system/KillDeathBusiness.rb +189 -1180
  179. data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +8 -1460
  180. data/lib/bcdice/game_system/KurayamiCrying.rb +1 -1
  181. data/lib/bcdice/game_system/LiveraDoll.rb +2 -2
  182. data/lib/bcdice/game_system/LogHorizon.rb +350 -3379
  183. data/lib/bcdice/game_system/LogHorizon_Korean.rb +55 -1357
  184. data/lib/bcdice/game_system/LostRecord.rb +0 -1
  185. data/lib/bcdice/game_system/LostRoyal.rb +3 -6
  186. data/lib/bcdice/game_system/MagicaLogia.rb +158 -1044
  187. data/lib/bcdice/game_system/MagicaLogia_Korean.rb +66 -0
  188. data/lib/bcdice/game_system/MeikyuDays.rb +2 -3
  189. data/lib/bcdice/game_system/MeikyuKingdom.rb +7 -7
  190. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +7 -8
  191. data/lib/bcdice/game_system/MetalHead.rb +1 -1
  192. data/lib/bcdice/game_system/MetalHeadExtream.rb +7 -7
  193. data/lib/bcdice/game_system/MetallicGuardian.rb +1 -2
  194. data/lib/bcdice/game_system/MonotoneMuseum.rb +41 -241
  195. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +10 -270
  196. data/lib/bcdice/game_system/NSSQ.rb +159 -0
  197. data/lib/bcdice/game_system/Nechronica.rb +37 -76
  198. data/lib/bcdice/game_system/Nechronica_Korean.rb +11 -128
  199. data/lib/bcdice/game_system/NeverCloud.rb +540 -5
  200. data/lib/bcdice/game_system/NightWizard.rb +2 -2
  201. data/lib/bcdice/game_system/NightWizard3rd.rb +1 -1
  202. data/lib/bcdice/game_system/NightmareHunterDeep.rb +3 -4
  203. data/lib/bcdice/game_system/NinjaSlayer.rb +33 -43
  204. data/lib/bcdice/game_system/NjslyrBattle.rb +1 -1
  205. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -2
  206. data/lib/bcdice/game_system/OracleEngine.rb +14 -18
  207. data/lib/bcdice/game_system/OrgaRain.rb +19 -27
  208. data/lib/bcdice/game_system/Paradiso.rb +3 -3
  209. data/lib/bcdice/game_system/Paranoia.rb +1 -1
  210. data/lib/bcdice/game_system/ParanoiaRebooted.rb +1 -1
  211. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  212. data/lib/bcdice/game_system/Peekaboo.rb +23 -123
  213. data/lib/bcdice/game_system/PhantasmAdventure.rb +0 -4
  214. data/lib/bcdice/game_system/Postman.rb +3 -3
  215. data/lib/bcdice/game_system/PulpCthulhu.rb +3 -3
  216. data/lib/bcdice/game_system/Raisondetre.rb +3 -3
  217. data/lib/bcdice/game_system/RecordOfLodossWar.rb +8 -7
  218. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  219. data/lib/bcdice/game_system/RokumonSekai2.rb +3 -3
  220. data/lib/bcdice/game_system/RuinBreakers.rb +296 -0
  221. data/lib/bcdice/game_system/RyuTuber.rb +6 -4
  222. data/lib/bcdice/game_system/Ryutama.rb +2 -2
  223. data/lib/bcdice/game_system/SRS.rb +1 -7
  224. data/lib/bcdice/game_system/SamsaraBallad.rb +5 -4
  225. data/lib/bcdice/game_system/Satasupe.rb +90 -866
  226. data/lib/bcdice/game_system/ScreamHighSchool.rb +4 -4
  227. data/lib/bcdice/game_system/SevenFortressMobius.rb +1 -1
  228. data/lib/bcdice/game_system/ShadowRun5.rb +2 -2
  229. data/lib/bcdice/game_system/SharedFantasia.rb +1 -1
  230. data/lib/bcdice/game_system/ShinMegamiTenseiKakuseihen.rb +1 -1
  231. data/lib/bcdice/game_system/ShinkuuGakuen.rb +5 -5
  232. data/lib/bcdice/game_system/ShinobiGami.rb +75 -40
  233. data/lib/bcdice/game_system/ShoujoTenrankai.rb +3 -3
  234. data/lib/bcdice/game_system/Skynauts.rb +2 -2
  235. data/lib/bcdice/game_system/SteamPunkers.rb +7 -5
  236. data/lib/bcdice/game_system/StellarKnights.rb +2 -5
  237. data/lib/bcdice/game_system/SterileLife.rb +2 -2
  238. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +2 -3
  239. data/lib/bcdice/game_system/StratoShout.rb +39 -268
  240. data/lib/bcdice/game_system/StratoShout_Korean.rb +8 -283
  241. data/lib/bcdice/game_system/Strave.rb +2 -2
  242. data/lib/bcdice/game_system/SwordWorld.rb +52 -189
  243. data/lib/bcdice/game_system/SwordWorld2_0.rb +21 -150
  244. data/lib/bcdice/game_system/SwordWorld2_5.rb +126 -41
  245. data/lib/bcdice/game_system/TherapieSein.rb +3 -3
  246. data/lib/bcdice/game_system/TokumeiTenkousei.rb +2 -2
  247. data/lib/bcdice/game_system/TokyoGhostResearch.rb +2 -2
  248. data/lib/bcdice/game_system/Torg.rb +3 -3
  249. data/lib/bcdice/game_system/Torg1_5.rb +1 -1
  250. data/lib/bcdice/game_system/TorgEternity.rb +5 -8
  251. data/lib/bcdice/game_system/TrinitySeven.rb +3 -3
  252. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +7 -7
  253. data/lib/bcdice/game_system/TwilightGunsmoke.rb +2 -3
  254. data/lib/bcdice/game_system/UnsungDuet.rb +139 -0
  255. data/lib/bcdice/game_system/Utakaze.rb +2 -2
  256. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +1 -1
  257. data/lib/bcdice/game_system/Villaciel.rb +1 -2
  258. data/lib/bcdice/game_system/Warhammer.rb +7 -7
  259. data/lib/bcdice/game_system/Warhammer4.rb +326 -0
  260. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  261. data/lib/bcdice/game_system/WorldOfDarkness.rb +1 -1
  262. data/lib/bcdice/game_system/YankeeYogSothoth.rb +15 -15
  263. data/lib/bcdice/game_system/YearZeroEngine.rb +1 -1
  264. data/lib/bcdice/game_system/Yggdrasill.rb +605 -0
  265. data/lib/bcdice/game_system/ZettaiReido.rb +2 -2
  266. data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +294 -0
  267. data/lib/bcdice/game_system/cthulhu7th/rollable.rb +41 -0
  268. data/lib/bcdice/game_system/filled_with/cook_tables.rb +119 -0
  269. data/lib/bcdice/game_system/filled_with/lot_tables.rb +155 -0
  270. data/lib/bcdice/game_system/meikyu_kingdom/item_table.rb +2 -0
  271. data/lib/bcdice/game_system/meikyu_kingdom/kingdom_name_table.rb +2 -0
  272. data/lib/bcdice/game_system/meikyu_kingdom/landscape_table.rb +2 -0
  273. data/lib/bcdice/game_system/meikyu_kingdom/name_tables.rb +2 -0
  274. data/lib/bcdice/game_system/meikyu_kingdom/placename_table.rb +2 -0
  275. data/lib/bcdice/game_system/meikyu_kingdom/tables.rb +2 -0
  276. data/lib/bcdice/game_system/meikyu_kingdom/word_table.rb +2 -0
  277. data/lib/bcdice/game_system/meikyu_kingdom_basic/item_table.rb +2 -0
  278. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +2 -0
  279. data/lib/bcdice/game_system/meikyu_kingdom_basic/name_table.rb +2 -0
  280. data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +2 -0
  281. data/lib/bcdice/game_system/meikyu_kingdom_basic/word_table.rb +2 -0
  282. data/lib/bcdice/game_system/one_way_heroics/dungeon_table.rb +2 -0
  283. data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +2 -0
  284. data/lib/bcdice/game_system/one_way_heroics/tables.rb +2 -0
  285. data/lib/bcdice/game_system/satasupe/tables.rb +723 -0
  286. data/lib/bcdice/game_system/sword_world/rating_lexer.rb +47 -0
  287. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +99 -0
  288. data/lib/bcdice/game_system/sword_world/rating_parser.rb +457 -0
  289. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +104 -0
  290. data/lib/bcdice/loader.rb +17 -12
  291. data/lib/bcdice/normalize.rb +3 -1
  292. data/lib/bcdice/preprocessor.rb +23 -44
  293. data/lib/bcdice/randomizer.rb +14 -0
  294. data/lib/bcdice/repl.rb +4 -2
  295. data/lib/bcdice/result.rb +87 -0
  296. data/lib/bcdice/translate.rb +13 -0
  297. data/lib/bcdice/user_defined_dice_table.rb +28 -15
  298. data/lib/bcdice/version.rb +3 -1
  299. metadata +101 -24
  300. data/.editorconfig +0 -21
  301. data/.github/.codecov.yaml +0 -10
  302. data/.github/workflows/coverage.yaml +0 -21
  303. data/.github/workflows/lint.yaml +0 -13
  304. data/.github/workflows/test.yml +0 -20
  305. data/.gitignore +0 -14
  306. data/.rubocop.yml +0 -96
  307. data/.rubocop_todo.yml +0 -113
  308. data/Gemfile +0 -11
  309. data/ROADMAP.md +0 -30
  310. data/Rakefile +0 -118
  311. data/bcdice.gemspec +0 -27
  312. data/bin/repl.rb +0 -21
  313. data/docs/README.txt +0 -2028
  314. data/docs/dicebot_sort_key.md +0 -72
  315. data/docs/how_to_make_dicebot.md +0 -453
  316. 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 < Base
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>=z
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
- register_prefix([
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
- @sort_add_dice = true
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
- def getDownWill(flag)
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'.freeze
7
+ ID = 'DiceBot'
6
8
 
7
9
  # ゲームシステム名
8
- NAME = 'DiceBot'.freeze
10
+ NAME = 'DiceBot'
9
11
 
10
12
  # ゲームシステム名の読みがな
11
- SORT_KEY = '*たいすほつと'.freeze
13
+ SORT_KEY = '*たいすほつと'
12
14
 
13
15
  # ダイスボットの使い方
14
- HELP_MESSAGE = ''.freeze
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(['(ZMB|BIO).*'])
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
- return checkInfection(roll_times)
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
- return rollZombie(value)
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(['\d+DX.*', 'ET'])
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 [String] 判定結果
58
+ # @return [Result] 判定結果
55
59
  def execute(randomizer)
56
60
  if @critical_value < 2
57
- return "(#{@expression}) > クリティカル値が低すぎます。2以上を指定してください。"
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 result_str(value_groups)
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 [String]
100
- def result_str(value_groups)
101
- fumble = value_groups[0].values.all? { |value| value == 1 }
102
- # TODO: Ruby 2.4以降では Array#sum が使える
103
- sum = value_groups.map(&:max).reduce(0, &:+)
104
- achieved_value = fumble ? 0 : (sum + @modifier)
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(achieved_value, fumble),
110
- compare_result(achieved_value, fumble)
123
+ achieved_value_with_if_fumble
111
124
  ]
112
125
 
113
- return parts.compact.join(' > ')
114
- end
115
-
116
- # ファンブルかどうかを含む達成値の表記を返す
117
- # @param [Integer] achieved_value 達成値
118
- # @param [Boolean] fumble ファンブルしたか
119
- # @return [String]
120
- def achieved_value_with_if_fumble(achieved_value, fumble)
121
- fumble ? "#{achieved_value} (ファンブル)" : achieved_value.to_s
122
- end
123
-
124
- # 達成値と目標値を比較した結果を返す
125
- # @param [Integer] achieved_value 達成値
126
- # @param [Boolean] fumble ファンブルしたか
127
- # @return [String, nil]
128
- def compare_result(achieved_value, fumble)
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
- case command
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 [MatchData] m 正規表現のマッチ情報
226
+ # @param command [String]
261
227
  # @return [DX]
262
- def parse_dx_od(m)
263
- num = m[1].to_i
264
- modifier = m[2] ? ArithmeticEvaluator.eval(m[2]) : 0
265
- critical_value = m[3] ? m[3].to_i : 10
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
- target_value = m[4]&.to_i
235
+ num = parsed.command.to_i
236
+ critical_value = parsed.critical || 10
268
237
 
269
- return DX.new(num, critical_value, modifier, target_value)
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(m)
276
- num = m[1].to_i
277
- critical_value = m[2] ? m[2].to_i : 10
278
- modifier = m[3] ? ArithmeticEvaluator.eval(m[3]) : 0
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
- target_value = m[4]&.to_i
250
+ num, critical_value = parsed.command.split("DX", 2).map { |x| x&.to_i }
251
+ critical_value ||= 10
281
252
 
282
- return DX.new(num, critical_value, modifier, target_value)
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 [String]
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
- "感情表(#{pos_result.sum}-#{neg_result.sum})",
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 = DiceTable::RangeTable.new(
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 = DiceTable::RangeTable.new(
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