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
@@ -90,7 +90,7 @@ module BCDice
90
90
  }.freeze
91
91
 
92
92
  # ダイスボットで使用するコマンドを配列で列挙する
93
- register_prefix(['\d+AN<=\d([\+\-]\d+)*'] + TABLES.keys)
93
+ register_prefix('\d+AN<=\d([\+\-]\d+)*', TABLES.keys)
94
94
  end
95
95
  end
96
96
  end
@@ -22,7 +22,6 @@ module BCDice
22
22
  super(command)
23
23
 
24
24
  @sort_add_dice = true
25
- @enabled_d66 = true
26
25
  @d66_sort_type = D66SortType::NO_SORT
27
26
  end
28
27
 
@@ -26,7 +26,7 @@ module BCDice
26
26
    最初の0が判断基準で、その右側5つがボッチダイスです。1*2,8*2,0*1なので1botchという訳です。
27
27
  INFO_MESSAGE_TEXT
28
28
 
29
- register_prefix(['ArS.*', '1R10.*'])
29
+ register_prefix('ArS.*', '1R10.*')
30
30
 
31
31
  def eval_game_system_specific_command(string)
32
32
  unless parse_ars(string) || parse_1r10(string)
@@ -34,7 +34,7 @@ module BCDice
34
34
  ・8av4*7+10 → 8d10で目標値4、攻撃力7、クリティカルトリガー10の命中判定。
35
35
  MESSAGETEXT
36
36
 
37
- register_prefix(['\d+AV\d+((x|\*)\d+(\+\d+)?)?(c\d+)?'])
37
+ register_prefix('\d+AV\d+((x|\*)\d+(\+\d+)?)?(c\d+)?')
38
38
 
39
39
  def initialize(command)
40
40
  super(command)
@@ -2,7 +2,7 @@ module BCDice
2
2
  module GameSystem
3
3
  class BBN < Base
4
4
  # ダイスボットで使用するコマンドを配列で列挙する
5
- register_prefix(['\d+BN.*'])
5
+ register_prefix('\d+BN.*')
6
6
 
7
7
  ID = 'BBN'.freeze
8
8
 
@@ -41,7 +41,7 @@ module BCDice
41
41
  ・スキル表:SKL
42
42
  MESSAGETEXT
43
43
 
44
- register_prefix(['\d?(BAD|BL|GL).*', '[TDGKSB]RN', 'SKL'])
44
+ register_prefix('\d?(BAD|BL|GL).*', '[TDGKSB]RN', 'SKL')
45
45
 
46
46
  def eval_game_system_specific_command(command)
47
47
  command = command.upcase
@@ -26,7 +26,7 @@ module BCDice
26
26
   セット数が1以上の時はセット数も表示し、攻撃判定の場合は命中部位も表示します。
27
27
  INFO_MESSAGE_TEXT
28
28
 
29
- register_prefix(['\d+BK.*', '\d+BA.*', '\d+BKC\d+.*', '\d+BAC\d+.*', '\d+R6.*'])
29
+ register_prefix('\d+BK.*', '\d+BA.*', '\d+BKC\d+.*', '\d+BAC\d+.*', '\d+R6.*')
30
30
 
31
31
  def initialize(command)
32
32
  super(command)
@@ -63,7 +63,6 @@ module BCDice
63
63
  def initialize(command)
64
64
  super(command)
65
65
 
66
- @enabled_d66 = true
67
66
  @d66_sort_type = D66SortType::ASC
68
67
  end
69
68
 
@@ -342,7 +341,7 @@ module BCDice
342
341
  ),
343
342
  }.freeze
344
343
 
345
- register_prefix(['\d+BB.*', '\d+R6.*'] + TABLES.keys)
344
+ register_prefix('\d+BB.*', '\d+R6.*', TABLES.keys)
346
345
  end
347
346
  end
348
347
  end
@@ -54,7 +54,7 @@ module BCDice
54
54
  []内は省略可 D66入れ替えあり
55
55
  INFO_MESSAGE_TEXT
56
56
 
57
- register_prefix([
57
+ register_prefix(
58
58
  '[1-7]*PD\d+(?:[\+\-]\d+)?',
59
59
  'HW',
60
60
  'BWT',
@@ -142,13 +142,12 @@ module BCDice
142
142
  'LIT',
143
143
  'TIT',
144
144
  'CIT'
145
- ])
145
+ )
146
146
 
147
147
  def initialize(command)
148
148
  super(command)
149
149
 
150
150
  @sort_add_dice = true
151
- @enabled_d66 = true
152
151
  @d66_sort_type = D66SortType::ASC
153
152
  end
154
153
 
@@ -52,7 +52,7 @@ module BCDice
52
52
  []内は省略可 D66 다이스가 존재
53
53
  INFO_MESSAGE_TEXT
54
54
 
55
- register_prefix([
55
+ register_prefix(
56
56
  '[1-7]*PD\d+(?:[\+\-]\d+)?',
57
57
  'HW',
58
58
  'BWT',
@@ -137,13 +137,12 @@ module BCDice
137
137
  'LIT',
138
138
  'TIT',
139
139
  'CIT'
140
- ])
140
+ )
141
141
 
142
142
  def initialize(command)
143
143
  super(command)
144
144
 
145
145
  @sort_add_dice = true
146
- @enabled_d66 = true
147
146
  @d66_sort_type = D66SortType::ASC
148
147
  end
149
148
 
@@ -32,13 +32,13 @@ module BCDice
32
32
    例)CTR+→因縁表(R版)を出目2~21でロールする。
33
33
  INFO_MESSAGE_TEXT
34
34
 
35
- register_prefix([
35
+ register_prefix(
36
36
  '\d+A\d*[CF]?\d*[CF]?\d*',
37
37
  'CT3[\+\-]?',
38
38
  'CTR[\+\-]?',
39
39
  'DJV\-?',
40
40
  'AKST[\+\-]?'
41
- ])
41
+ )
42
42
 
43
43
  def initialize(command)
44
44
  super(command)
@@ -454,7 +454,7 @@ module BCDice
454
454
  ),
455
455
  }.freeze
456
456
 
457
- register_prefix(['BM.*', 'ReRoll\d+.*', 'RP\d+', 'DT'] + TABLES.keys)
457
+ register_prefix('BM.*', 'ReRoll\d+.*', 'RP\d+', 'DT', TABLES.keys)
458
458
  end
459
459
  end
460
460
  end
@@ -40,7 +40,6 @@ module BCDice
40
40
  super(command)
41
41
 
42
42
  @sort_add_dice = true
43
- @enabled_d66 = true
44
43
  @d66_sort_type = D66SortType::ASC
45
44
  @round_type = RoundType::CEIL # 端数切り上げに設定
46
45
  end
@@ -38,7 +38,6 @@ module BCDice
38
38
  super(command)
39
39
 
40
40
  @sort_add_dice = true
41
- @enabled_d66 = true
42
41
  @d66_sort_type = D66SortType::ASC
43
42
  @round_type = RoundType::CEIL # 端数切り上げに設定
44
43
  end
@@ -32,7 +32,6 @@ module BCDice
32
32
  super(command)
33
33
 
34
34
  @sort_add_dice = true
35
- @enabled_d66 = true
36
35
  @d66_sort_type = D66SortType::ASC
37
36
  end
38
37
 
@@ -243,7 +242,7 @@ module BCDice
243
242
  ]
244
243
  ),
245
244
  }.freeze
246
- register_prefix(['RM', 'CM.*'] + TABLES.keys)
245
+ register_prefix('RM', 'CM.*', TABLES.keys)
247
246
  end
248
247
  end
249
248
  end
@@ -41,7 +41,7 @@ module BCDice
41
41
  - FT7
42
42
  INFO_MESSAGE_TEXT
43
43
 
44
- register_prefix(['\d*CF.*', 'FT\d*'])
44
+ register_prefix('\d*CF.*', 'FT\d*')
45
45
 
46
46
  # ゲーム別成功度判定(2D6)。以前の処理をそのまま残しています。
47
47
  def check_2D6(total, dice_total, _dice_list, cmp_op, target)
@@ -22,7 +22,7 @@ module BCDice
22
22
   例)SR7   sr13   SR(7+4)   Ssr10
23
23
  INFO_MESSAGE_TEXT
24
24
 
25
- register_prefix(['SR\d+.*'])
25
+ register_prefix('SR\d+.*')
26
26
 
27
27
  def check_1D100(total, _dice_total, cmp_op, target)
28
28
  return '' if target == '?'
@@ -28,7 +28,7 @@ module BCDice
28
28
  0CL : 1CL[0]と同じ判定
29
29
  MESSAGETEXT
30
30
 
31
- register_prefix(['[+-]?\d*CL([+-]\d+)?[@\d]*.*'])
31
+ register_prefix('[+-]?\d*CL([+-]\d+)?[@\d]*.*')
32
32
 
33
33
  def eval_game_system_specific_command(command)
34
34
  debug('eval_game_system_specific_command command', command)
@@ -32,7 +32,6 @@ module BCDice
32
32
 
33
33
  def initialize(command)
34
34
  super(command)
35
- @enabled_d66 = true
36
35
  @d66_sort_type = D66SortType::NO_SORT
37
36
  end
38
37
 
@@ -563,7 +562,7 @@ module BCDice
563
562
 
564
563
  }.freeze
565
564
 
566
- register_prefix(["CH.*", "B6T", "CNP"] + TABLES.keys)
565
+ register_prefix("CH.*", "B6T", "CNP", TABLES.keys)
567
566
  end
568
567
  end
569
568
  end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Comes < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'Comes'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'カムズ'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'かむす'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・各種表
18
+  判定ペナルティ表 PT
19
+ INFO_MESSAGE_TEXT
20
+
21
+ def initialize(command)
22
+ super(command)
23
+
24
+ @sort_add_dice = true
25
+ @d66_sort_type = D66SortType::ASC
26
+ end
27
+
28
+ def eval_game_system_specific_command(command)
29
+ return roll_tables(command, self.class::TABLES)
30
+ end
31
+
32
+ TABLES = {
33
+ 'PT' => DiceTable::Table.new(
34
+ '判定ペナルティ表',
35
+ '1D6',
36
+ [
37
+ '恐ろしい目に合う。『恐怖』を与える。',
38
+ '今見ているものを理解できない。『混乱』を与える。',
39
+ '我を忘れて見とれてしまう。『魅了』を与える。',
40
+ '思わぬ遠回りをしてしまう。『疲労』を与える。',
41
+ '大きな失態を演じてしまう。『負傷』を与える。',
42
+ '別の困難が立ちはだかる。新たに判定を行わせる。',
43
+ ]
44
+ )
45
+ }.freeze
46
+
47
+ register_prefix(TABLES.keys)
48
+ end
49
+ end
50
+ end
@@ -19,7 +19,7 @@ module BCDice
19
19
  例・CW8
20
20
  INFO_MESSAGE_TEXT
21
21
 
22
- register_prefix(['CW\d+'])
22
+ register_prefix('CW\d+')
23
23
 
24
24
  def eval_game_system_specific_command(command)
25
25
  result = nil
@@ -48,7 +48,7 @@ module BCDice
48
48
 
49
49
  INFO_MESSAGE_TEXT
50
50
 
51
- register_prefix(['CC(B)?\(\d+\)', 'CC(B)?.*', 'RES(B)?.*', 'CBR(B)?\(\d+,\d+\)'])
51
+ register_prefix('CC(B)?\(\d+\)', 'CC(B)?.*', 'RES(B)?.*', 'CBR(B)?\(\d+,\d+\)')
52
52
 
53
53
  def initialize(command)
54
54
  super(command)
@@ -94,90 +94,95 @@ module BCDice
94
94
  return nil
95
95
  end
96
96
 
97
+ private
98
+
97
99
  def getCheckResult(command)
98
- broken_num = 0
99
- diff = 0
100
+ m = %r{CCB?(\d+)?(?:<=([+-/*\d]+))?}i.match(command)
101
+ broken_num = m[1].to_i
102
+ diff = ArithmeticEvaluator.eval(m[2])
100
103
 
101
- if (m = %r{CCB?(\d+)?<=([+-/*\d]+)}i.match(command))
102
- broken_num = m[1].to_i
103
- diff = ArithmeticEvaluator.eval(m[2])
104
+ if diff <= 0
105
+ total = @randomizer.roll_once(100)
106
+ return Result.new("(1D100) > #{total}")
104
107
  end
105
108
 
106
- output = ""
107
-
108
- if diff > 0
109
- output = "(1D100<=#{diff})"
110
-
111
- if broken_num > 0
112
- output += " 故障ナンバー[#{broken_num}]"
113
- end
109
+ expr = "(1D100<=#{diff})"
110
+ if broken_num > 0
111
+ expr += " #{translate('Cthulhu.broken_number')}[#{broken_num}]"
112
+ end
114
113
 
115
- total_n = @randomizer.roll_once(100)
114
+ total = @randomizer.roll_once(100)
115
+ compare_result = compare(total, diff, broken_num)
116
116
 
117
- output += " > #{total_n}"
118
- output += " > #{getCheckResultText(total_n, diff, broken_num)}"
119
- else
120
- total_n = @randomizer.roll_once(100)
121
- output = "(1D100) > #{total_n}"
117
+ compare_result.to_result.tap do |r|
118
+ r.text = "#{expr} > #{total} #{compare_result.text}"
122
119
  end
123
-
124
- return output
125
120
  end
126
121
 
127
- def getCheckResultText(total_n, diff, broken_num = 0)
128
- result = ""
129
- diff_special = 0
130
- fumble = false
122
+ class CompareResult
123
+ include Translate
124
+ attr_accessor :success, :failure, :critical, :fumble, :special, :broken
125
+
126
+ def initialize(locale)
127
+ @locale = locale
128
+
129
+ @success = false
130
+ @failure = false
131
+ @critical = false
132
+ @fumble = false
133
+ @special = false
134
+ @broke = false
135
+ end
131
136
 
132
- if @special_percentage > 0
133
- # specialの値設定が無い場合はクリティカル/ファンブル判定もしない
134
- diff_special = (diff * @special_percentage / 100).floor
135
- if diff_special < 1
136
- diff_special = 1
137
+ def text
138
+ if critical && special
139
+ translate("Cthulhu.critical_special")
140
+ elsif critical
141
+ translate("Cthulhu.critical")
142
+ elsif special
143
+ translate("Cthulhu.special")
144
+ elsif success
145
+ translate("success")
146
+ elsif broken && fumble
147
+ "#{translate('Cthulhu.fumble')}/#{translate('Cthulhu.broken')}"
148
+ elsif broken
149
+ translate("Cthulhu.broken")
150
+ elsif fumble
151
+ translate("Cthulhu.fumble")
152
+ elsif failure
153
+ translate("failure")
137
154
  end
138
155
  end
139
156
 
140
- if (total_n <= diff) && (total_n < 100)
141
- @is_success = true
142
- result = "成功"
143
-
144
- if diff_special > 0
145
- if total_n <= @critical_percentage
146
- @is_critical = true
147
- if total_n <= diff_special
148
- result = "決定的成功/スペシャル"
149
- else
150
- result = "決定的成功"
151
- end
152
- else
153
- if total_n <= diff_special
154
- result = "スペシャル"
155
- end
156
- end
157
+ def to_result
158
+ Result.new.tap do |r|
159
+ r.success = success
160
+ r.failure = failure
161
+ r.critical = critical
162
+ r.fumble = fumble
157
163
  end
164
+ end
165
+ end
166
+
167
+ def compare(total, target, broken_number = 0)
168
+ result = CompareResult.new(@locale)
169
+ target_special = (target * @special_percentage / 100).clamp(1, 100)
170
+
171
+ if (total <= target) && (total < 100)
172
+ result.success = true
173
+ result.special = total <= target_special
174
+ result.critical = total <= @critical_percentage
158
175
  else
159
- @is_failure = true
160
- result = "失敗"
161
-
162
- if diff_special > 0
163
- if (total_n >= (101 - @fumble_percentage)) && (diff < 100)
164
- @is_fumble = true
165
- result = "致命的失敗"
166
- fumble = true
167
- end
168
- end
176
+ result.failure = true
177
+ result.fumble = total >= (101 - @fumble_percentage)
169
178
  end
170
179
 
171
- if broken_num > 0
172
- if total_n >= broken_num
173
- @is_success = false
174
- @is_failure = true
175
- if fumble
176
- result += "/故障"
177
- else
178
- result = "故障"
179
- end
180
- end
180
+ if broken_number > 0 && total >= broken_number
181
+ result.broken = true
182
+ result.failure = true
183
+ result.success = false
184
+ result.special = false
185
+ result.critical = false
181
186
  end
182
187
 
183
188
  return result
@@ -186,33 +191,33 @@ module BCDice
186
191
  def getRegistResult(command)
187
192
  m = /RES(B)?([-\d]+)/i.match(command)
188
193
  unless m
189
- return "1"
194
+ return nil
190
195
  end
191
196
 
192
197
  value = m[2].to_i
193
198
  target = value * 5 + 50
194
199
 
195
200
  if target < 5
196
- @is_failure = true
197
- return "(1d100<=#{target}) > 自動失敗"
201
+ return Result.failure("(1d100<=#{target}) > #{translate('Cthulhu.automatic_failure')}")
198
202
  end
199
203
 
200
204
  if target > 95
201
- @is_success = true
202
- return "(1d100<=#{target}) > 自動成功"
205
+ return Result.success("(1d100<=#{target}) > #{translate('Cthulhu.automatic_success')}")
203
206
  end
204
207
 
205
208
  # 通常判定
206
209
  total_n = @randomizer.roll_once(100)
207
- result = getCheckResultText(total_n, target)
210
+ compare_result = compare(total_n, target)
208
211
 
209
- return "(1d100<=#{target}) > #{total_n} > #{result}"
212
+ compare_result.to_result.tap do |r|
213
+ r.text = "(1d100<=#{target}) > #{total_n} > #{compare_result.text}"
214
+ end
210
215
  end
211
216
 
212
217
  def getCombineRoll(command)
213
218
  m = /CBR(B)?\((\d+),(\d+)\)/i.match(command)
214
219
  unless m
215
- return "1"
220
+ return nil
216
221
  end
217
222
 
218
223
  diff_1 = m[2].to_i
@@ -220,32 +225,24 @@ module BCDice
220
225
 
221
226
  total = @randomizer.roll_once(100)
222
227
 
223
- result_1 = getCheckResultText(total, diff_1)
224
- result_2 = getCheckResultText(total, diff_2)
225
-
226
- successList = ["決定的成功/スペシャル", "決定的成功", "スペシャル", "成功"]
227
-
228
- succesCount = 0
229
- succesCount += 1 if successList.include?(result_1)
230
- succesCount += 1 if successList.include?(result_2)
231
- debug("succesCount", succesCount)
232
-
233
- @is_failure = false
234
- @is_success = false
228
+ result_1 = compare(total, diff_1)
229
+ result_2 = compare(total, diff_2)
235
230
 
236
231
  rank =
237
- if succesCount >= 2
238
- @is_success = true
239
- "成功"
240
- elsif succesCount == 1
241
- @is_success = true
242
- "部分的成功"
232
+ if result_1.success && result_2.success
233
+ translate("success")
234
+ elsif result_1.success || result_2.success
235
+ translate("Cthulhu.partial_success")
243
236
  else
244
- @is_failure = true
245
- "失敗"
237
+ translate("failure")
246
238
  end
247
239
 
248
- return "(1d100<=#{diff_1},#{diff_2}) > #{total}[#{result_1},#{result_2}] > #{rank}"
240
+ Result.new.tap do |r|
241
+ r.text = "(1d100<=#{diff_1},#{diff_2}) > #{total}[#{result_1.text},#{result_2.text}] > #{rank}"
242
+ r.critical = result_1.critical || result_2.critical
243
+ r.fumble = result_1.fumble || result_2.fumble
244
+ r.condition = result_1.success || result_2.success
245
+ end
249
246
  end
250
247
  end
251
248
  end