bcdice 3.0.0.pre.alpha.1 → 3.0.0.pre.alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +1 -1
  3. data/.rubocop.yml +12 -0
  4. data/.rubocop_todo.yml +1 -0
  5. data/CHANGELOG.md +34 -0
  6. data/Gemfile +6 -3
  7. data/Rakefile +52 -18
  8. data/bcdice.gemspec +2 -0
  9. data/i18n/Amadeus/ja_jp.yml +386 -0
  10. data/i18n/Amadeus/ko_kr.yml +148 -0
  11. data/i18n/Cthulhu/ja_jp.yml +11 -0
  12. data/i18n/Cthulhu/ko_kr.yml +11 -0
  13. data/i18n/Cthulhu/zh_hant.yml +11 -0
  14. data/i18n/DetatokoSaga/ja_jp.yml +74 -0
  15. data/i18n/DetatokoSaga/ko_kr.yml +74 -0
  16. data/i18n/DoubleCross/ja_jp.yml +53 -0
  17. data/i18n/DoubleCross/ko_kr.yml +53 -0
  18. data/i18n/Dracurouge/ja_jp.yml +1374 -0
  19. data/i18n/Dracurouge/ko_kr.yml +295 -0
  20. data/i18n/Fiasco/ja_jp.yml +10 -0
  21. data/i18n/Fiasco/ko_kr.yml +10 -0
  22. data/i18n/FutariSousa/ja_jp.yml +720 -0
  23. data/i18n/FutariSousa/ko_kr.yml +746 -0
  24. data/i18n/Insane/ja_jp.yml +454 -0
  25. data/i18n/Insane/ko_kr.yml +502 -0
  26. data/i18n/Kamigakari/ja_jp.yml +276 -0
  27. data/i18n/Kamigakari/ko_kr.yml +204 -0
  28. data/i18n/KillDeathBusiness/ja_jp.yml +1092 -0
  29. data/i18n/KillDeathBusiness/ko_kr.yml +1062 -0
  30. data/i18n/LogHorizon/ja_jp.yml +3082 -0
  31. data/i18n/LogHorizon/ko_kr.yml +923 -0
  32. data/i18n/MagicaLogia/ja_jp.yml +564 -0
  33. data/i18n/MonotoneMuseum/ja_jp.yml +525 -0
  34. data/i18n/MonotoneMuseum/ko_kr.yml +89 -0
  35. data/i18n/Nechronica/ja_jp.yml +57 -0
  36. data/i18n/Nechronica/ko_kr.yml +14 -0
  37. data/i18n/StratoShout/ja_jp.yml +160 -0
  38. data/i18n/StratoShout/ko_kr.yml +160 -0
  39. data/i18n/ja_jp.yml +5 -0
  40. data/i18n/ko_kr.yml +7 -0
  41. data/i18n/zh_hant.yml +3 -0
  42. data/lib/bcdice/arithmetic/node.rb +154 -0
  43. data/lib/bcdice/base.rb +87 -101
  44. data/lib/bcdice/common_command.rb +2 -0
  45. data/lib/bcdice/common_command/add_dice.rb +5 -41
  46. data/lib/bcdice/common_command/add_dice/node.rb +92 -16
  47. data/lib/bcdice/common_command/add_dice/parser.rb +374 -274
  48. data/lib/bcdice/common_command/add_dice/parser.y +153 -0
  49. data/lib/bcdice/common_command/add_dice/randomizer.rb +25 -33
  50. data/lib/bcdice/common_command/barabara_dice.rb +6 -47
  51. data/lib/bcdice/common_command/barabara_dice/node.rb +84 -0
  52. data/lib/bcdice/common_command/barabara_dice/parser.rb +336 -0
  53. data/lib/bcdice/common_command/barabara_dice/parser.y +107 -0
  54. data/lib/bcdice/common_command/calc.rb +7 -30
  55. data/lib/bcdice/common_command/calc/node.rb +30 -0
  56. data/lib/bcdice/common_command/calc/parser.rb +271 -0
  57. data/lib/bcdice/common_command/calc/parser.y +79 -0
  58. data/lib/bcdice/common_command/choice.rb +137 -19
  59. data/lib/bcdice/common_command/d66_dice.rb +48 -34
  60. data/lib/bcdice/common_command/lexer.rb +46 -0
  61. data/lib/bcdice/common_command/repeat.rb +102 -0
  62. data/lib/bcdice/common_command/reroll_dice.rb +8 -158
  63. data/lib/bcdice/common_command/reroll_dice/node.rb +198 -0
  64. data/lib/bcdice/common_command/reroll_dice/parser.rb +421 -0
  65. data/lib/bcdice/common_command/reroll_dice/parser.y +158 -0
  66. data/lib/bcdice/common_command/upper_dice.rb +10 -129
  67. data/lib/bcdice/common_command/upper_dice/node.rb +181 -0
  68. data/lib/bcdice/common_command/upper_dice/parser.rb +412 -0
  69. data/lib/bcdice/common_command/upper_dice/parser.y +143 -0
  70. data/lib/bcdice/common_command/version.rb +9 -17
  71. data/lib/bcdice/deprecated/checker.rb +78 -0
  72. data/lib/bcdice/dice_table/d66_grid_table.rb +8 -0
  73. data/lib/bcdice/dice_table/d66_table.rb +10 -0
  74. data/lib/bcdice/dice_table/sai_fic_skill_table.rb +75 -17
  75. data/lib/bcdice/dice_table/sai_fic_skill_table/category.rb +25 -0
  76. data/lib/bcdice/dice_table/sai_fic_skill_table/skill.rb +23 -0
  77. data/lib/bcdice/dice_table/table.rb +8 -0
  78. data/lib/bcdice/game_system.rb +7 -1
  79. data/lib/bcdice/game_system/AFF2e.rb +1 -1
  80. data/lib/bcdice/game_system/AceKillerGene.rb +2 -2
  81. data/lib/bcdice/game_system/Airgetlamh.rb +3 -3
  82. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  83. data/lib/bcdice/game_system/Alshard.rb +1 -1
  84. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  85. data/lib/bcdice/game_system/Amadeus.rb +46 -507
  86. data/lib/bcdice/game_system/Amadeus_Korean.rb +12 -456
  87. data/lib/bcdice/game_system/AnimaAnimus.rb +1 -1
  88. data/lib/bcdice/game_system/Arianrhod.rb +0 -1
  89. data/lib/bcdice/game_system/ArsMagica.rb +1 -1
  90. data/lib/bcdice/game_system/Avandner.rb +1 -1
  91. data/lib/bcdice/game_system/BBN.rb +1 -1
  92. data/lib/bcdice/game_system/BadLife.rb +1 -1
  93. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  94. data/lib/bcdice/game_system/BeastBindTrinity.rb +1 -2
  95. data/lib/bcdice/game_system/BeginningIdol.rb +2 -3
  96. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +2 -3
  97. data/lib/bcdice/game_system/BladeOfArcana.rb +2 -2
  98. data/lib/bcdice/game_system/BlindMythos.rb +1 -1
  99. data/lib/bcdice/game_system/BloodCrusade.rb +0 -1
  100. data/lib/bcdice/game_system/BloodMoon.rb +0 -1
  101. data/lib/bcdice/game_system/CardRanker.rb +1 -2
  102. data/lib/bcdice/game_system/ChaosFlare.rb +1 -1
  103. data/lib/bcdice/game_system/Chill.rb +1 -1
  104. data/lib/bcdice/game_system/CodeLayerd.rb +1 -1
  105. data/lib/bcdice/game_system/ColossalHunter.rb +1 -2
  106. data/lib/bcdice/game_system/Comes.rb +50 -0
  107. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  108. data/lib/bcdice/game_system/Cthulhu.rb +94 -97
  109. data/lib/bcdice/game_system/Cthulhu7th.rb +108 -67
  110. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  111. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  112. data/lib/bcdice/game_system/CthulhuTech.rb +8 -14
  113. data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +7 -190
  114. data/lib/bcdice/game_system/Cthulhu_Korean.rb +5 -186
  115. data/lib/bcdice/game_system/DarkBlaze.rb +9 -5
  116. data/lib/bcdice/game_system/DarkDaysDrive.rb +17 -15
  117. data/lib/bcdice/game_system/DarkSouls.rb +1 -1
  118. data/lib/bcdice/game_system/DeadlineHeroes.rb +2 -2
  119. data/lib/bcdice/game_system/DemonParasite.rb +1 -2
  120. data/lib/bcdice/game_system/DetatokoSaga.rb +48 -149
  121. data/lib/bcdice/game_system/DetatokoSaga_Korean.rb +6 -274
  122. data/lib/bcdice/game_system/DiceOfTheDead.rb +9 -6
  123. data/lib/bcdice/game_system/DoubleCross.rb +102 -81
  124. data/lib/bcdice/game_system/DoubleCross_Korean.rb +13 -330
  125. data/lib/bcdice/game_system/Dracurouge.rb +376 -1678
  126. data/lib/bcdice/game_system/Dracurouge_Korean.rb +16 -271
  127. data/lib/bcdice/game_system/EarthDawn.rb +1 -1
  128. data/lib/bcdice/game_system/EarthDawn3.rb +1 -1
  129. data/lib/bcdice/game_system/EarthDawn4.rb +1 -1
  130. data/lib/bcdice/game_system/Elysion.rb +3 -4
  131. data/lib/bcdice/game_system/EmbryoMachine.rb +1 -1
  132. data/lib/bcdice/game_system/Emoklore.rb +131 -0
  133. data/lib/bcdice/game_system/EndBreaker.rb +1 -2
  134. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +1 -1
  135. data/lib/bcdice/game_system/Fiasco.rb +87 -70
  136. data/lib/bcdice/game_system/Fiasco_Korean.rb +7 -95
  137. data/lib/bcdice/game_system/FilledWith.rb +462 -566
  138. data/lib/bcdice/game_system/FullMetalPanic.rb +1 -1
  139. data/lib/bcdice/game_system/FutariSousa.rb +103 -938
  140. data/lib/bcdice/game_system/FutariSousa_Korean.rb +7 -948
  141. data/lib/bcdice/game_system/{Gurps.rb → GURPS.rb} +184 -217
  142. data/lib/bcdice/game_system/Garako.rb +131 -39
  143. data/lib/bcdice/game_system/GardenOrder.rb +2 -2
  144. data/lib/bcdice/game_system/GehennaAn.rb +1 -1
  145. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  146. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  147. data/lib/bcdice/game_system/GoldenSkyStories.rb +1 -1
  148. data/lib/bcdice/game_system/Gorilla.rb +1 -1
  149. data/lib/bcdice/game_system/GranCrest.rb +2 -3
  150. data/lib/bcdice/game_system/GundogRevised.rb +1 -1
  151. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  152. data/lib/bcdice/game_system/GurpsFW.rb +2 -3
  153. data/lib/bcdice/game_system/HarnMaster.rb +2 -2
  154. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -2
  155. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  156. data/lib/bcdice/game_system/HuntersMoon.rb +1 -2
  157. data/lib/bcdice/game_system/Illusio.rb +2 -2
  158. data/lib/bcdice/game_system/Insane.rb +90 -717
  159. data/lib/bcdice/game_system/Insane_Korean.rb +7 -719
  160. data/lib/bcdice/game_system/Kamigakari.rb +47 -242
  161. data/lib/bcdice/game_system/Kamigakari_Korean.rb +6 -394
  162. data/lib/bcdice/game_system/KanColle.rb +3 -3
  163. data/lib/bcdice/game_system/KemonoNoMori.rb +1 -1
  164. data/lib/bcdice/game_system/KillDeathBusiness.rb +162 -1144
  165. data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +6 -1459
  166. data/lib/bcdice/game_system/KurayamiCrying.rb +1 -1
  167. data/lib/bcdice/game_system/LiveraDoll.rb +2 -2
  168. data/lib/bcdice/game_system/LogHorizon.rb +350 -3379
  169. data/lib/bcdice/game_system/LogHorizon_Korean.rb +55 -1357
  170. data/lib/bcdice/game_system/LostRecord.rb +0 -1
  171. data/lib/bcdice/game_system/LostRoyal.rb +1 -2
  172. data/lib/bcdice/game_system/MagicaLogia.rb +158 -1044
  173. data/lib/bcdice/game_system/MeikyuDays.rb +1 -2
  174. data/lib/bcdice/game_system/MeikyuKingdom.rb +4 -4
  175. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +4 -5
  176. data/lib/bcdice/game_system/MetalHead.rb +1 -1
  177. data/lib/bcdice/game_system/MetalHeadExtream.rb +2 -2
  178. data/lib/bcdice/game_system/MetallicGuardian.rb +1 -1
  179. data/lib/bcdice/game_system/MonotoneMuseum.rb +38 -239
  180. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +10 -270
  181. data/lib/bcdice/game_system/NSSQ.rb +159 -0
  182. data/lib/bcdice/game_system/Nechronica.rb +34 -73
  183. data/lib/bcdice/game_system/Nechronica_Korean.rb +11 -128
  184. data/lib/bcdice/game_system/NeverCloud.rb +1 -1
  185. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  186. data/lib/bcdice/game_system/NightWizard3rd.rb +1 -1
  187. data/lib/bcdice/game_system/NinjaSlayer.rb +12 -11
  188. data/lib/bcdice/game_system/NjslyrBattle.rb +1 -1
  189. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -2
  190. data/lib/bcdice/game_system/OracleEngine.rb +1 -1
  191. data/lib/bcdice/game_system/OrgaRain.rb +2 -2
  192. data/lib/bcdice/game_system/Paradiso.rb +1 -1
  193. data/lib/bcdice/game_system/Paranoia.rb +1 -1
  194. data/lib/bcdice/game_system/ParanoiaRebooted.rb +1 -1
  195. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  196. data/lib/bcdice/game_system/Peekaboo.rb +22 -122
  197. data/lib/bcdice/game_system/Postman.rb +2 -2
  198. data/lib/bcdice/game_system/PulpCthulhu.rb +3 -3
  199. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  200. data/lib/bcdice/game_system/RecordOfLodossWar.rb +1 -1
  201. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  202. data/lib/bcdice/game_system/RokumonSekai2.rb +1 -1
  203. data/lib/bcdice/game_system/RuinBreakers.rb +296 -0
  204. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  205. data/lib/bcdice/game_system/SRS.rb +1 -2
  206. data/lib/bcdice/game_system/SamsaraBallad.rb +1 -1
  207. data/lib/bcdice/game_system/Satasupe.rb +1 -2
  208. data/lib/bcdice/game_system/ScreamHighSchool.rb +2 -2
  209. data/lib/bcdice/game_system/SevenFortressMobius.rb +1 -1
  210. data/lib/bcdice/game_system/ShadowRun5.rb +2 -2
  211. data/lib/bcdice/game_system/SharedFantasia.rb +1 -1
  212. data/lib/bcdice/game_system/ShinMegamiTenseiKakuseihen.rb +1 -1
  213. data/lib/bcdice/game_system/ShinkuuGakuen.rb +2 -2
  214. data/lib/bcdice/game_system/ShinobiGami.rb +1 -2
  215. data/lib/bcdice/game_system/ShoujoTenrankai.rb +2 -2
  216. data/lib/bcdice/game_system/Skynauts.rb +1 -1
  217. data/lib/bcdice/game_system/SteamPunkers.rb +1 -1
  218. data/lib/bcdice/game_system/StellarKnights.rb +1 -2
  219. data/lib/bcdice/game_system/SterileLife.rb +1 -1
  220. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +1 -2
  221. data/lib/bcdice/game_system/StratoShout.rb +44 -247
  222. data/lib/bcdice/game_system/StratoShout_Korean.rb +6 -282
  223. data/lib/bcdice/game_system/Strave.rb +2 -2
  224. data/lib/bcdice/game_system/SwordWorld.rb +8 -9
  225. data/lib/bcdice/game_system/SwordWorld2_0.rb +2 -3
  226. data/lib/bcdice/game_system/SwordWorld2_5.rb +2 -3
  227. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  228. data/lib/bcdice/game_system/TokumeiTenkousei.rb +1 -1
  229. data/lib/bcdice/game_system/TokyoGhostResearch.rb +2 -2
  230. data/lib/bcdice/game_system/Torg.rb +2 -2
  231. data/lib/bcdice/game_system/Torg1_5.rb +1 -1
  232. data/lib/bcdice/game_system/TorgEternity.rb +1 -1
  233. data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
  234. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  235. data/lib/bcdice/game_system/TwilightGunsmoke.rb +1 -2
  236. data/lib/bcdice/game_system/UnsungDuet.rb +139 -0
  237. data/lib/bcdice/game_system/Utakaze.rb +1 -1
  238. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +1 -1
  239. data/lib/bcdice/game_system/Villaciel.rb +1 -2
  240. data/lib/bcdice/game_system/Warhammer.rb +1 -1
  241. data/lib/bcdice/game_system/Warhammer4.rb +329 -0
  242. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  243. data/lib/bcdice/game_system/WorldOfDarkness.rb +1 -1
  244. data/lib/bcdice/game_system/YankeeYogSothoth.rb +15 -15
  245. data/lib/bcdice/game_system/YearZeroEngine.rb +1 -1
  246. data/lib/bcdice/game_system/ZettaiReido.rb +1 -1
  247. data/lib/bcdice/game_system/filled_with/cook_tables.rb +119 -0
  248. data/lib/bcdice/game_system/filled_with/lot_tables.rb +155 -0
  249. data/lib/bcdice/loader.rb +6 -8
  250. data/lib/bcdice/preprocessor.rb +15 -40
  251. data/lib/bcdice/repl.rb +1 -1
  252. data/lib/bcdice/result.rb +83 -0
  253. data/lib/bcdice/translate.rb +11 -0
  254. data/lib/bcdice/version.rb +1 -1
  255. metadata +80 -4
@@ -2,7 +2,7 @@
2
2
 
3
3
  module BCDice
4
4
  module GameSystem
5
- class Gurps < Base
5
+ class GURPS < Base
6
6
  # ゲームシステムの識別子
7
7
  ID = 'GURPS'
8
8
 
@@ -32,12 +32,11 @@ module BCDice
32
32
  ・D66ダイスあり
33
33
  INFO_MESSAGE_TEXT
34
34
 
35
- register_prefix(['\w*CRT', '\w*FMB', 'HIT', 'FEAR((\+)?\d*)', 'REACT((\+|\-)?\d*)', '[\d\+\-]+\-3[dD]6?[\d\+\-]*'])
35
+ register_prefix('FEAR(\+?\d+)?', 'REACT((\+|\-)?\d*)', '[\d\+\-]+\-3D6?[\d\+\-]*')
36
36
 
37
37
  def initialize(command)
38
38
  super(command)
39
39
 
40
- @enabled_d66 = true
41
40
  @d66_sort_type = D66SortType::NO_SORT
42
41
  end
43
42
 
@@ -47,84 +46,150 @@ module BCDice
47
46
  return '' unless dice_list.size == 3 && cmp_op == :<=
48
47
 
49
48
  success = target - total # 成功度
50
- crt_string = " > クリティカル(成功度:#{success})"
51
- fmb_string = " > ファンブル(失敗度:#{success})"
52
- fail_string = " > 自動失敗(失敗度:#{success})"
53
-
54
- # クリティカル
55
- if (dice_total <= 6) && (target >= 16)
56
- return crt_string
57
- elsif (dice_total <= 5) && (target >= 15)
58
- return crt_string
59
- elsif dice_total <= 4
60
- return crt_string
61
- end
62
-
63
- # ファンブル
64
- if (target - dice_total) <= -10
65
- return fmb_string
66
- elsif (dice_total >= 17) && (target <= 15)
67
- return fmb_string
68
- elsif dice_total >= 18
69
- return fmb_string
70
- elsif dice_total >= 17
71
- return fail_string
72
- end
73
-
74
- if total <= target
75
- return " > 成功(成功度:#{success})"
76
- else
77
- return " > 失敗(失敗度:#{success})"
78
- end
49
+
50
+ result =
51
+ if critical?(dice_total, target)
52
+ "クリティカル(成功度:#{success})"
53
+ elsif fumble?(dice_total, target)
54
+ "ファンブル(失敗度:#{success})"
55
+ elsif dice_total >= 17
56
+ "自動失敗(失敗度:#{success})"
57
+ elsif total <= target
58
+ "成功(成功度:#{success})"
59
+ else
60
+ "失敗(失敗度:#{success})"
61
+ end
62
+
63
+ " #{result}"
79
64
  end
80
65
 
81
66
  def eval_game_system_specific_command(command)
82
- result = getRollDiceResult(command)
83
- return result unless result.nil?
67
+ roll_3d6(command) || roll_fear(command) || roll_react(command) || roll_tables(command, TABLES)
68
+ end
69
+
70
+ private
71
+
72
+ def critical?(dice_total, target)
73
+ (dice_total <= 6 && target >= 16) || (dice_total <= 5 && target >= 15) || dice_total <= 4
74
+ end
84
75
 
85
- # クリティカル・ファンブル表
86
- result = getCFTableResult(command)
87
- return result unless result.nil?
76
+ def fumble?(dice_total, target)
77
+ (target - dice_total <= -10) || (dice_total >= 17 && target <= 15) || dice_total >= 18
78
+ end
79
+
80
+ def roll_3d6(command)
81
+ m = /^([\d\+\-]+)\-3D6?([\d\+\-]*)$/.match(command)
82
+ return nil unless m
88
83
 
89
- # 恐怖表
90
- result = getFearResult(command)
91
- return result unless result.nil?
84
+ target_number = ArithmeticEvaluator.eval(m[1])
85
+ modifier = ArithmeticEvaluator.eval(m[2])
86
+ formated_modifier = Format.modifier(modifier)
92
87
 
93
- # 反応表
94
- result = getReactResult(command)
95
- return result unless result.nil?
88
+ dice_list = @randomizer.roll_barabara(3, 6)
89
+ dice_total = dice_list.sum()
90
+ dice_str = dice_list.join(",")
96
91
 
97
- # 命中部位表
98
- result = getHitResult(command)
99
- return result unless result.nil?
92
+ total = dice_total + modifier
100
93
 
101
- return ""
94
+ "(3D6#{formated_modifier}<=#{target_number}) "\
95
+ "#{dice_total}[#{dice_str}]#{formated_modifier} > "\
96
+ "#{total}"\
97
+ "#{check_nD6(total, dice_total, dice_list, :<=, target_number)}"
102
98
  end
103
99
 
104
- def getRollDiceResult(command)
105
- return nil unless command =~ /([\d\+\-]+)\-3[dD]6?([\d\+\-]*)/
100
+ def roll_fear(command)
101
+ m = /^FEAR(\+?\d+)?$/.match(command)
102
+ return nil unless m
106
103
 
107
- diffStr = Regexp.last_match(1)
108
- modStr = (Regexp.last_match(2) || '')
104
+ modifier = m[1].to_i
109
105
 
110
- diceList = @randomizer.roll_barabara(3, 6)
111
- dice_n = diceList.sum()
112
- dice_str = diceList.join(",")
106
+ dice = @randomizer.roll_sum(3, 6)
107
+ number = dice + modifier
113
108
 
114
- diff = getValue(diffStr, 0)
115
- total_n = dice_n + getValue(modStr, 0)
109
+ num =
110
+ if number > 40
111
+ 36
112
+ else
113
+ number - 4
114
+ end
116
115
 
117
- result = "(3D6#{modStr}<=#{diff}) > #{dice_n}[#{dice_str}]#{modStr} > #{total_n}#{check_nD6(total_n, dice_n, diceList, :<=, diff)}"
118
- return result
116
+ "恐怖表(#{number}) > #{FEAR_TABLE[num]}"
119
117
  end
120
118
 
121
- def getCFTableResult(command)
122
- return nil unless command =~ /\w*(FMB|CRT)/
119
+ FEAR_TABLE = [
120
+ '1ターン朦朧状態。2ターン目に自動回復。',
121
+ '1ターン朦朧状態。2ターン目に自動回復。',
122
+ '1ターン朦朧状態。以後、毎ターン不利な修正を無視した意志判定を行い、成功すると回復。',
123
+ '1ターン朦朧状態。以後、毎ターン不利な修正を無視した意志判定を行い、成功すると回復。',
124
+ '1ターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
125
+ '1ターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
126
+ '1Dターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
127
+ '2Dターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
128
+ '思考不能。15ターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
129
+ '新たな癖をひとつ植え付けられる。',
130
+ '1D点疲労。さらに1Dターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
131
+ '1D点疲労。さらに1Dターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
132
+ '新たな癖をひとつ獲得。さらに1Dターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
133
+ '1D分間意識を失う。以後、1分ごとに生命力判定を行い、成功すると回復。',
134
+ '生命力判定を行い、失敗すると1点の負傷を受ける。さらに1D分間意識を失う。以後、1分ごとに生命力判定を行い、成功すると回復。',
135
+ '1点負傷。2D分間意識を失う。以後、1分ごとに生命力判定を行い、成功すると回復。',
136
+ '卒倒。4D分間意識不明。1D点疲労。',
137
+ 'パニック。1D分間のあいだ、叫びながら走り回ったり、座り込んで泣きわめいたりする。以後、1分ごとに知力判定(修正なし)を行い、成功すると回復。',
138
+ '-10CPの妄想を植え付けられる。',
139
+ '-10CPの軽い恐怖症を植え付けられる。',
140
+ '肉体的な変化。髪が真白になったり、老化したりする。-15CPぶんの肉体的特徴に等しい。',
141
+ 'その恐怖に関連する軽い恐怖症を持っているならそれが強い恐怖症(CP2倍)になる。そうでなければ、-10CPぶんの精神的特徴を植え付けられる。',
142
+ '-10CPの妄想を植え付けられる。生命力判定を行い、失敗すると1点の負傷を受ける。さらに1D分間意識を失う。以後、1分ごとに生命力判定を行い、成功すると回復。',
143
+ '-10CPの軽い恐怖症を植え付けられる。生命力判定を行い、失敗すると1点の負傷を受ける。さらに1D分間意識を失う。以後、1分ごとに生命力判定を行い、成功すると回復。',
144
+ '浅い昏睡状態。30分ごとに生命力判定を行い、成功すると目覚める。目覚めてから6時間はあらゆる判定に-2の修正。',
145
+ '昏睡状態。1時間ごとに生命力判定を行い、成功すると目覚める。目覚めてから6時間はあらゆる判定に-2の修正。',
146
+ '硬直。1D日のあいだ身動きしない。その時点で生命力判定を行い、成功すると動けるようになる。失敗するとさらに1D日硬直。その間、適切な医学的処置を受けていないかぎり、初日に1点、2日目に2点、3日目に3点と生命力を失っていく。動けるようになってからも、硬直していたのと同じ日数だけ、あらゆる判定に-2の修正。',
147
+ '痙攣。1D分間地面に倒れて痙攣する。2D点疲労。また、生命力判定に失敗すると1D点負傷。これがファンブルなら生命力1点を永遠に失う。',
148
+ '発作。軽い心臓発作を起こし、地面に倒れる。2D点負傷。',
149
+ '大パニック。キャラクターは支離滅裂な行動に出る。GMが3Dを振り、目が大きければ大きいほど馬鹿げた行動を行う。その行動が終わったら知力判定を行い、成功すると我に返る。失敗すると新たな馬鹿げた行動をとる。',
150
+ '強い妄想(-15CP)を植え付けられる。',
151
+ '強い恐怖症、ないし-15CPぶんの精神的特徴を植え付けられる。',
152
+ '激しい肉体的変化。髪が真白になったり、老化したりする。-20CPぶんの肉体的特徴に等しい。',
153
+ '激しい肉体的変化。髪が真白になったり、老化したりする。-30CPぶんの肉体的特徴に等しい。',
154
+ '昏睡状態。1時間ごとに生命力判定を行い、成功すると目覚める。目覚めてから6時間はあらゆる判定に-2の修正。さらに強い妄想(-15CP)を植え付けられる。',
155
+ '昏睡状態。1時間ごとに生命力判定を行い、成功すると目覚める。目覚めてから6時間はあらゆる判定に-2の修正。さらに強い恐怖症、ないし-30CPぶんの精神的特徴を植え付けられる。',
156
+ '昏睡状態。1時間ごとに生命力判定を行い、成功すると目覚める。目覚めてから6時間はあらゆる判定に-2の修正。さらに強い恐怖症、ないし-30CPぶんの精神的特徴を植え付けられる。知力が1点永遠に低下する。あわせて精神系の技能、呪文、超能力のレベルも低下する。',
157
+ ].freeze
158
+
159
+ def roll_react(command)
160
+ m = /^REACT([+-]?\d*)$/.match(command)
161
+ return nil unless m
162
+
163
+ modifier = m[1].to_i
164
+
165
+ dice = @randomizer.roll_sum(3, 6)
166
+ number = dice + modifier
123
167
 
124
- case command
125
- when "CRT"
126
- tableName = "クリティカル表"
127
- table = [
168
+ "反応表(#{number}) > #{reaction(number)}"
169
+ end
170
+
171
+ def reaction(number)
172
+ REACTION_TABLE.find { |tuple| tuple.range.include?(number) }.text
173
+ end
174
+
175
+ Tuple = Struct.new(:range, :text)
176
+
177
+ REACTION_TABLE = [
178
+ [-Float::INFINITY..0, "最悪"],
179
+ [1..3, "とても悪い"],
180
+ [4..6, "悪い"],
181
+ [7..9, "良くない"],
182
+ [10..12, "中立"],
183
+ [13..15, "良い"],
184
+ [16..18, "とても良い"],
185
+ [19..Float::INFINITY, "最高"],
186
+ ].map { |range, text| Tuple.new(range, text) }.freeze
187
+
188
+ TABLES = {
189
+ "CRT" => DiceTable::Table.new(
190
+ "クリティカル表",
191
+ "3D6",
192
+ [
128
193
  '体を狙っていたら、相手は気絶(回復は30分後に生命力判定)。他はダメージ3倍。',
129
194
  '相手の防御点を無視。',
130
195
  'ダメージ3倍。',
@@ -142,10 +207,11 @@ module BCDice
142
207
  'ダメージ3倍。',
143
208
  '体を狙っていたら、相手は気絶(回復は30分後に生命力判定)。他はダメージ3倍。',
144
209
  ]
145
-
146
- when "HCRT"
147
- tableName = "頭部打撃クリティカル表"
148
- table = [
210
+ ),
211
+ "HCRT" => DiceTable::Table.new(
212
+ "頭部打撃クリティカル表",
213
+ "3D6",
214
+ [
149
215
  '敵は即死する。',
150
216
  '敵は意識を失う。30分ごとに生命力判定をして、成功すると意識を回復する。',
151
217
  '敵は意識を失う。30分ごとに生命力判定をして、成功すると意識を回復する。',
@@ -163,10 +229,11 @@ module BCDice
163
229
  '敵は通常のダメージを受け、朦朧状態になる。',
164
230
  '敵は通常のダメージを受け、朦朧状態になる。',
165
231
  ]
166
-
167
- when "FMB"
168
- tableName = "ファンブル表"
169
- table = [
232
+ ),
233
+ "FMB" => DiceTable::Table.new(
234
+ "ファンブル表",
235
+ "3D6",
236
+ [
170
237
  '武器が壊れる。ただし、メイスなど固い"叩き"武器は壊れない(ふりなおし)。',
171
238
  '武器が壊れる。ただし、フレイルなど固い"叩き"武器は壊れない(ふりなおし)。',
172
239
  '自分の腕か足に命中(通常ダメージ)。ただし"刺し"武器や射撃ならふりなおし。',
@@ -184,10 +251,11 @@ module BCDice
184
251
  '武器が壊れる。ただし、モールなど固い"叩き"武器は壊れない(ふりなおし)。',
185
252
  '武器が壊れる。ただし、金属バットなど固い"叩き"武器は壊れない(ふりなおし)。',
186
253
  ]
187
-
188
- when "MFMB"
189
- tableName = "呪文ファンブル表"
190
- table = [
254
+ ),
255
+ "MFMB" => DiceTable::Table.new(
256
+ "呪文ファンブル表",
257
+ "3D6",
258
+ [
191
259
  '呪文が完全に失敗する。術者は1D点のダメージを受ける。',
192
260
  '呪文が術者にかかる。',
193
261
  '呪文が術者の仲間にかかる(対象はランダムに決定)。',
@@ -205,10 +273,11 @@ module BCDice
205
273
  '呪文が完全に失敗し、術者の右腕が損なわれる。回復に1週間を要する。',
206
274
  '呪文が完全に失敗する。GMから見て、術者や呪文が純粋で善良なものでなければ、悪魔(第3版文庫版P.384参照)があらわれ、術者を攻撃する。',
207
275
  ]
208
-
209
- when "YSCRT"
210
- tableName = "妖魔夜行スペシャルクリティカル表"
211
- table = [
276
+ ),
277
+ "YSCRT" => DiceTable::Table.new(
278
+ "妖魔夜行スペシャルクリティカル表",
279
+ "3D6",
280
+ [
212
281
  '目(あるいは急所)に当たった!目(あるいは急所)が無ければ3倍ダメージ。',
213
282
  '胴体を狙っていたら、相手は気絶(回復は30分後に生命力判定)。他は3倍ダメージ。',
214
283
  '相手の防護点を無視。通常ダメージ。',
@@ -226,10 +295,11 @@ module BCDice
226
295
  'ダメージ3倍。',
227
296
  '胴体を狙っていたら、相手は気絶(回復は30分後に生命力判定)。他は3倍ダメージ。',
228
297
  ]
229
-
230
- when "YSFMB"
231
- tableName = "妖魔夜行スペシャルファンブル表"
232
- table = [
298
+ ),
299
+ "YSFMB" => DiceTable::Table.new(
300
+ "妖魔夜行スペシャルファンブル表",
301
+ "3D6",
302
+ [
233
303
  'この表を2回振って、両方の結果を適用する。',
234
304
  '自分に命中。通常ダメージ。防護点、吸収、反射は無視(「◯◯に無敵」の妖力は有効)。',
235
305
  '自分に命中。半分ダメージ。防護点、吸収、反射は無視(「◯◯に無敵」の妖力は有効)。',
@@ -247,10 +317,11 @@ module BCDice
247
317
  '自分に命中。半分ダメージ。防護点は無効。',
248
318
  'この表を2回振って、プレイヤーが好きな方を適用する。',
249
319
  ]
250
-
251
- when "YFMB"
252
- tableName = "妖術ファンブル表"
253
- table = [
320
+ ),
321
+ "YFMB" => DiceTable::Table.new(
322
+ "妖術ファンブル表",
323
+ "3D6",
324
+ [
254
325
  '妖術が完全に失敗する。術者は3D点のダメージを受ける。',
255
326
  '妖術が完全に失敗する。術者は1D点のダメージを受ける。',
256
327
  '妖術が術者にかかる。',
@@ -268,136 +339,32 @@ module BCDice
268
339
  '妖術が完全に失敗し、術者の弱点が明らかにされる。弱点がなければ振り直して良い。',
269
340
  '妖術が完全に失敗する。術者は完全な行動不能におちいる。回復は反日ごとに生命力で判定を行う。',
270
341
  ]
342
+ ),
343
+ "HIT" => DiceTable::Table.new(
344
+ "命中部位表",
345
+ "3D6",
346
+ [
347
+ '脳',
348
+ '脳',
349
+ '頭',
350
+ '遠い腕',
351
+ '手首(左右ランダム)',
352
+ '近い腕',
353
+ '胴体',
354
+ '胴体',
355
+ '胴体',
356
+ '遠い足',
357
+ '近い足',
358
+ '近い足',
359
+ '足首(左右ランダム)',
360
+ '足首(左右ランダム)',
361
+ '重要機関(胴体の)',
362
+ '武器',
363
+ ]
364
+ ),
365
+ }.freeze
271
366
 
272
- else
273
- return nil
274
- end
275
-
276
- result, number = get_table_by_nD6(table, 3)
277
-
278
- return "#{tableName}(#{number}):#{result}"
279
- end
280
-
281
- def getFearResult(command)
282
- return nil unless command =~ /FEAR((\+)?\d+)?/
283
-
284
- modify = Regexp.last_match(1).to_i
285
-
286
- tableName = "恐怖表"
287
- table = [
288
- '1ターン朦朧状態。2ターン目に自動回復。',
289
- '1ターン朦朧状態。2ターン目に自動回復。',
290
- '1ターン朦朧状態。以後、毎ターン不利な修正を無視した意志判定を行い、成功すると回復。',
291
- '1ターン朦朧状態。以後、毎ターン不利な修正を無視した意志判定を行い、成功すると回復。',
292
- '1ターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
293
- '1ターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
294
- '1Dターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
295
- '2Dターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
296
- '思考不能。15ターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
297
- '新たな癖をひとつ植え付けられる。',
298
- '1D点疲労。さらに1Dターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
299
- '1D点疲労。さらに1Dターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
300
- '新たな癖をひとつ獲得。さらに1Dターン朦朧状態。以後、毎ターン通常の意志判定を行い、成功すると回復。',
301
- '1D分間意識を失う。以後、1分ごとに生命力判定を行い、成功すると回復。',
302
- '生命力判定を行い、失敗すると1点の負傷を受ける。さらに1D分間意識を失う。以後、1分ごとに生命力判定を行い、成功すると回復。',
303
- '1点負傷。2D分間意識を失う。以後、1分ごとに生命力判定を行い、成功すると回復。',
304
- '卒倒。4D分間意識不明。1D点疲労。',
305
- 'パニック。1D分間のあいだ、叫びながら走り回ったり、座り込んで泣きわめいたりする。以後、1分ごとに知力判定(修正なし)を行い、成功すると回復。',
306
- '-10CPの妄想を植え付けられる。',
307
- '-10CPの軽い恐怖症を植え付けられる。',
308
- '肉体的な変化。髪が真白になったり、老化したりする。-15CPぶんの肉体的特徴に等しい。',
309
- 'その恐怖に関連する軽い恐怖症を持っているならそれが強い恐怖症(CP2倍)になる。そうでなければ、-10CPぶんの精神的特徴を植え付けられる。',
310
- '-10CPの妄想を植え付けられる。生命力判定を行い、失敗すると1点の負傷を受ける。さらに1D分間意識を失う。以後、1分ごとに生命力判定を行い、成功すると回復。',
311
- '-10CPの軽い恐怖症を植え付けられる。生命力判定を行い、失敗すると1点の負傷を受ける。さらに1D分間意識を失う。以後、1分ごとに生命力判定を行い、成功すると回復。',
312
- '浅い昏睡状態。30分ごとに生命力判定を行い、成功すると目覚める。目覚めてから6時間はあらゆる判定に-2の修正。',
313
- '昏睡状態。1時間ごとに生命力判定を行い、成功すると目覚める。目覚めてから6時間はあらゆる判定に-2の修正。',
314
- '硬直。1D日のあいだ身動きしない。その時点で生命力判定を行い、成功すると動けるようになる。失敗するとさらに1D日硬直。その間、適切な医学的処置を受けていないかぎり、初日に1点、2日目に2点、3日目に3点と生命力を失っていく。動けるようになってからも、硬直していたのと同じ日数だけ、あらゆる判定に-2の修正。',
315
- '痙攣。1D分間地面に倒れて痙攣する。2D点疲労。また、生命力判定に失敗すると1D点負傷。これがファンブルなら生命力1点を永遠に失う。',
316
- '発作。軽い心臓発作を起こし、地面に倒れる。2D点負傷。',
317
- '大パニック。キャラクターは支離滅裂な行動に出る。GMが3Dを振り、目が大きければ大きいほど馬鹿げた行動を行う。その行動が終わったら知力判定を行い、成功すると我に返る。失敗すると新たな馬鹿げた行動をとる。',
318
- '強い妄想(-15CP)を植え付けられる。',
319
- '強い恐怖症、ないし-15CPぶんの精神的特徴を植え付けられる。',
320
- '激しい肉体的変化。髪が真白になったり、老化したりする。-20CPぶんの肉体的特徴に等しい。',
321
- '激しい肉体的変化。髪が真白になったり、老化したりする。-30CPぶんの肉体的特徴に等しい。',
322
- '昏睡状態。1時間ごとに生命力判定を行い、成功すると目覚める。目覚めてから6時間はあらゆる判定に-2の修正。さらに強い妄想(-15CP)を植え付けられる。',
323
- '昏睡状態。1時間ごとに生命力判定を行い、成功すると目覚める。目覚めてから6時間はあらゆる判定に-2の修正。さらに強い恐怖症、ないし-30CPぶんの精神的特徴を植え付けられる。',
324
- '昏睡状態。1時間ごとに生命力判定を行い、成功すると目覚める。目覚めてから6時間はあらゆる判定に-2の修正。さらに強い恐怖症、ないし-30CPぶんの精神的特徴を植え付けられる。知力が1点永遠に低下する。あわせて精神系の技能、呪文、超能力のレベルも低下する。',
325
- ]
326
-
327
- dice = @randomizer.roll_sum(3, 6)
328
- number = dice + modify
329
- if number > 40
330
- num = 36
331
- else
332
- num = number - 4
333
- end
334
- result = table[num]
335
-
336
- return "#{tableName}(#{number}):#{result}"
337
- end
338
-
339
- def getReactResult(command)
340
- return nil unless command =~ /REACT((\+|\-)?\d*)/
341
-
342
- modify = Regexp.last_match(1).to_i
343
-
344
- tableName = "反応表"
345
- dice = @randomizer.roll_sum(3, 6)
346
- number = dice + modify
347
-
348
- if number < 1
349
- result = "最悪"
350
- elsif number < 4
351
- result = "とても悪い"
352
- elsif number < 7
353
- result = "悪い"
354
- elsif number < 10
355
- result = "良くない"
356
- elsif number < 13
357
- result = "中立"
358
- elsif number < 16
359
- result = "良い"
360
- elsif number < 19
361
- result = "とても良い"
362
- else
363
- result = "最高"
364
- end
365
-
366
- return "#{tableName}(#{number}):#{result}"
367
- end
368
-
369
- def getHitResult(command)
370
- return nil unless command == "HIT"
371
-
372
- tableName = "命中部位表"
373
- table = [
374
- '脳',
375
- '脳',
376
- '頭',
377
- '遠い腕',
378
- '手首(左右ランダム)',
379
- '近い腕',
380
- '胴体',
381
- '胴体',
382
- '胴体',
383
- '遠い足',
384
- '近い足',
385
- '近い足',
386
- '足首(左右ランダム)',
387
- '足首(左右ランダム)',
388
- '重要機関(胴体の)',
389
- '武器',
390
- ]
391
- result, number = get_table_by_nD6(table, 3)
392
-
393
- return "#{tableName}(#{number}):#{result}"
394
- end
395
-
396
- def getValue(text, defaultValue)
397
- return defaultValue if text.nil? || text.empty?
398
-
399
- ArithmeticEvaluator.eval(text)
400
- end
367
+ register_prefix(TABLES.keys)
401
368
  end
402
369
  end
403
370
  end