bcdice 3.0.0 → 3.2.0

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 (183) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +79 -2
  3. data/README.md +32 -0
  4. data/i18n/MonotoneMuseum/ja_jp.yml +3 -3
  5. data/i18n/StellarKnights/ja_jp.yml +496 -0
  6. data/lib/bcdice/common_command/add_dice.rb +1 -1
  7. data/lib/bcdice/common_command/calc.rb +1 -1
  8. data/lib/bcdice/dice_table.rb +2 -0
  9. data/lib/bcdice/dice_table/d66_half_grid_table.rb +33 -0
  10. data/lib/bcdice/dice_table/d66_one_third_table.rb +34 -0
  11. data/lib/bcdice/dice_table/sai_fic_skill_table.rb +1 -1
  12. data/lib/bcdice/game_system.rb +4 -0
  13. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  14. data/lib/bcdice/game_system/Ainecadette.rb +68 -0
  15. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  16. data/lib/bcdice/game_system/AlchemiaStruggle.rb +1 -1
  17. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  18. data/lib/bcdice/game_system/Alshard.rb +1 -1
  19. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  20. data/lib/bcdice/game_system/AngelGear.rb +123 -0
  21. data/lib/bcdice/game_system/AnimaAnimus.rb +1 -1
  22. data/lib/bcdice/game_system/Arianrhod.rb +6 -8
  23. data/lib/bcdice/game_system/ArsMagica.rb +1 -1
  24. data/lib/bcdice/game_system/Avandner.rb +1 -1
  25. data/lib/bcdice/game_system/BBN.rb +1 -1
  26. data/lib/bcdice/game_system/BadLife.rb +1 -1
  27. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  28. data/lib/bcdice/game_system/BattleTech.rb +1 -1
  29. data/lib/bcdice/game_system/BeastBindTrinity.rb +2 -2
  30. data/lib/bcdice/game_system/BeginningIdol.rb +5 -5
  31. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +5 -5
  32. data/lib/bcdice/game_system/BladeOfArcana.rb +1 -1
  33. data/lib/bcdice/game_system/BlindMythos.rb +1 -1
  34. data/lib/bcdice/game_system/BloodCrusade.rb +48 -49
  35. data/lib/bcdice/game_system/BloodMoon.rb +50 -8
  36. data/lib/bcdice/game_system/CardRanker.rb +10 -9
  37. data/lib/bcdice/game_system/ChaosFlare.rb +21 -15
  38. data/lib/bcdice/game_system/Chill.rb +10 -10
  39. data/lib/bcdice/game_system/Chill3.rb +9 -9
  40. data/lib/bcdice/game_system/CodeLayerd.rb +1 -1
  41. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  42. data/lib/bcdice/game_system/Cthulhu.rb +8 -4
  43. data/lib/bcdice/game_system/Cthulhu7th.rb +86 -342
  44. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +2 -2
  45. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +2 -2
  46. data/lib/bcdice/game_system/CthulhuTech.rb +1 -1
  47. data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +1 -1
  48. data/lib/bcdice/game_system/Cthulhu_Korean.rb +1 -1
  49. data/lib/bcdice/game_system/DarkBlaze.rb +1 -12
  50. data/lib/bcdice/game_system/DarkDaysDrive.rb +8 -7
  51. data/lib/bcdice/game_system/DeadlineHeroes.rb +2 -2
  52. data/lib/bcdice/game_system/DemonParasite.rb +5 -13
  53. data/lib/bcdice/game_system/DesperateRun.rb +1 -1
  54. data/lib/bcdice/game_system/DiceOfTheDead.rb +1 -1
  55. data/lib/bcdice/game_system/DoubleCross.rb +2 -2
  56. data/lib/bcdice/game_system/Dracurouge.rb +1 -1
  57. data/lib/bcdice/game_system/EarthDawn.rb +1 -1
  58. data/lib/bcdice/game_system/EarthDawn3.rb +1 -1
  59. data/lib/bcdice/game_system/EarthDawn4.rb +1 -1
  60. data/lib/bcdice/game_system/EclipsePhase.rb +14 -14
  61. data/lib/bcdice/game_system/Elric.rb +18 -14
  62. data/lib/bcdice/game_system/Elysion.rb +3 -3
  63. data/lib/bcdice/game_system/EmbryoMachine.rb +9 -8
  64. data/lib/bcdice/game_system/Emoklore.rb +3 -3
  65. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +1 -1
  66. data/lib/bcdice/game_system/Fiasco.rb +1 -1
  67. data/lib/bcdice/game_system/FilledWith.rb +205 -1272
  68. data/lib/bcdice/game_system/FullMetalPanic.rb +1 -1
  69. data/lib/bcdice/game_system/GURPS.rb +17 -28
  70. data/lib/bcdice/game_system/Garako.rb +12 -4
  71. data/lib/bcdice/game_system/GardenOrder.rb +1 -1
  72. data/lib/bcdice/game_system/GehennaAn.rb +1 -1
  73. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  74. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  75. data/lib/bcdice/game_system/Gorilla.rb +3 -9
  76. data/lib/bcdice/game_system/GranCrest.rb +18 -11
  77. data/lib/bcdice/game_system/Gundog.rb +9 -8
  78. data/lib/bcdice/game_system/GundogRevised.rb +10 -9
  79. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  80. data/lib/bcdice/game_system/GurpsFW.rb +16 -16
  81. data/lib/bcdice/game_system/HarnMaster.rb +19 -26
  82. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
  83. data/lib/bcdice/game_system/Hieizan.rb +12 -21
  84. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  85. data/lib/bcdice/game_system/HuntersMoon.rb +5 -10
  86. data/lib/bcdice/game_system/Illusio.rb +25 -34
  87. data/lib/bcdice/game_system/InfiniteFantasia.rb +19 -17
  88. data/lib/bcdice/game_system/Insane.rb +13 -20
  89. data/lib/bcdice/game_system/IthaWenUa.rb +8 -15
  90. data/lib/bcdice/game_system/JamesBond.rb +10 -10
  91. data/lib/bcdice/game_system/JekyllAndHyde.rb +1 -1
  92. data/lib/bcdice/game_system/Kamigakari.rb +1 -1
  93. data/lib/bcdice/game_system/KanColle.rb +4 -9
  94. data/lib/bcdice/game_system/KemonoNoMori.rb +1 -1
  95. data/lib/bcdice/game_system/KillDeathBusiness.rb +7 -15
  96. data/lib/bcdice/game_system/KurayamiCrying.rb +55 -2
  97. data/lib/bcdice/game_system/LogHorizon.rb +3 -3
  98. data/lib/bcdice/game_system/LostRoyal.rb +1 -1
  99. data/lib/bcdice/game_system/MeikyuDays.rb +11 -9
  100. data/lib/bcdice/game_system/MeikyuKingdom.rb +28 -28
  101. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +5 -5
  102. data/lib/bcdice/game_system/MetalHead.rb +12 -22
  103. data/lib/bcdice/game_system/MetalHeadExtream.rb +5 -5
  104. data/lib/bcdice/game_system/MetallicGuardian.rb +1 -1
  105. data/lib/bcdice/game_system/MonotoneMuseum.rb +9 -7
  106. data/lib/bcdice/game_system/Nechronica.rb +28 -21
  107. data/lib/bcdice/game_system/NeverCloud.rb +540 -5
  108. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  109. data/lib/bcdice/game_system/NightWizard3rd.rb +1 -1
  110. data/lib/bcdice/game_system/NinjaSlayer.rb +4 -13
  111. data/lib/bcdice/game_system/NjslyrBattle.rb +8 -11
  112. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  113. data/lib/bcdice/game_system/OracleEngine.rb +1 -1
  114. data/lib/bcdice/game_system/OrgaRain.rb +17 -25
  115. data/lib/bcdice/game_system/Paradiso.rb +3 -3
  116. data/lib/bcdice/game_system/ParanoiaRebooted.rb +1 -1
  117. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  118. data/lib/bcdice/game_system/Peekaboo.rb +4 -9
  119. data/lib/bcdice/game_system/Pendragon.rb +7 -7
  120. data/lib/bcdice/game_system/PhantasmAdventure.rb +8 -8
  121. data/lib/bcdice/game_system/Postman.rb +2 -2
  122. data/lib/bcdice/game_system/PulpCthulhu.rb +1 -1
  123. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  124. data/lib/bcdice/game_system/RecordOfLodossWar.rb +1 -1
  125. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  126. data/lib/bcdice/game_system/Revulture.rb +123 -0
  127. data/lib/bcdice/game_system/RokumonSekai2.rb +1 -1
  128. data/lib/bcdice/game_system/RuneQuest.rb +8 -8
  129. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  130. data/lib/bcdice/game_system/SRS.rb +1 -1
  131. data/lib/bcdice/game_system/SamsaraBallad.rb +1 -1
  132. data/lib/bcdice/game_system/Satasupe.rb +79 -860
  133. data/lib/bcdice/game_system/ScreamHighSchool.rb +2 -2
  134. data/lib/bcdice/game_system/SevenFortressMobius.rb +1 -1
  135. data/lib/bcdice/game_system/SharedFantasia.rb +20 -24
  136. data/lib/bcdice/game_system/ShinkuuGakuen.rb +2 -2
  137. data/lib/bcdice/game_system/ShinobiGami.rb +17 -9
  138. data/lib/bcdice/game_system/Skynauts.rb +4 -4
  139. data/lib/bcdice/game_system/SkynautsBouken.rb +228 -0
  140. data/lib/bcdice/game_system/SteamPunkers.rb +1 -1
  141. data/lib/bcdice/game_system/StellarKnights.rb +59 -696
  142. data/lib/bcdice/game_system/SterileLife.rb +2 -3
  143. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +2 -2
  144. data/lib/bcdice/game_system/StratoShout.rb +8 -16
  145. data/lib/bcdice/game_system/Strave.rb +1 -1
  146. data/lib/bcdice/game_system/SwordWorld.rb +58 -185
  147. data/lib/bcdice/game_system/SwordWorld2_0.rb +22 -150
  148. data/lib/bcdice/game_system/SwordWorld2_5.rb +127 -41
  149. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  150. data/lib/bcdice/game_system/TokyoGhostResearch.rb +1 -1
  151. data/lib/bcdice/game_system/Torg.rb +1 -1
  152. data/lib/bcdice/game_system/TorgEternity.rb +2 -2
  153. data/lib/bcdice/game_system/TrinitySeven.rb +4 -4
  154. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  155. data/lib/bcdice/game_system/TwilightGunsmoke.rb +1 -1
  156. data/lib/bcdice/game_system/UnsungDuet.rb +1 -1
  157. data/lib/bcdice/game_system/Utakaze.rb +1 -1
  158. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +1 -1
  159. data/lib/bcdice/game_system/Villaciel.rb +1 -1
  160. data/lib/bcdice/game_system/WARPS.rb +11 -9
  161. data/lib/bcdice/game_system/WaresBlade.rb +4 -9
  162. data/lib/bcdice/game_system/Warhammer.rb +16 -7
  163. data/lib/bcdice/game_system/Warhammer4.rb +16 -12
  164. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  165. data/lib/bcdice/game_system/WorldOfDarkness.rb +1 -1
  166. data/lib/bcdice/game_system/YankeeYogSothoth.rb +4 -9
  167. data/lib/bcdice/game_system/YearZeroEngine.rb +1 -1
  168. data/lib/bcdice/game_system/ZettaiReido.rb +1 -1
  169. data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +294 -0
  170. data/lib/bcdice/game_system/cthulhu7th/rollable.rb +41 -0
  171. data/lib/bcdice/game_system/filled_with/enemy_data_tables.rb +322 -0
  172. data/lib/bcdice/game_system/filled_with/event_tables.rb +392 -0
  173. data/lib/bcdice/game_system/filled_with/tresure_tables.rb +179 -0
  174. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +1 -1
  175. data/lib/bcdice/game_system/satasupe/tables.rb +723 -0
  176. data/lib/bcdice/game_system/sword_world/rating_lexer.rb +47 -0
  177. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +99 -0
  178. data/lib/bcdice/game_system/sword_world/rating_parser.rb +457 -0
  179. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +122 -0
  180. data/lib/bcdice/repl.rb +1 -1
  181. data/lib/bcdice/result.rb +26 -0
  182. data/lib/bcdice/version.rb +1 -1
  183. metadata +20 -4
@@ -28,7 +28,7 @@ module BCDice
28
28
   例)12NW-5@7#2$3 1NW 50nw+5@7,10#2,5 50nw-5+10@7,10#2,5+15+25
29
29
  INFO_MESSAGE_TEXT
30
30
 
31
- register_prefix('([-+]?\d+)?NW.*', '2R6.*')
31
+ register_prefix('([-+]?\d+)?NW', '2R6')
32
32
 
33
33
  def initialize(command)
34
34
  super(command)
@@ -14,7 +14,7 @@ module BCDice
14
14
  # ゲームシステムの識別子
15
15
  ID = 'NightWizard3rd'
16
16
 
17
- register_prefix('([-+]?\d+)?NW.*', '2R6.*')
17
+ register_prefix('([-+]?\d+)?NW', '2R6')
18
18
 
19
19
  def fumble_base_number(parsed)
20
20
  parsed.passive_modify_number + parsed.active_modify_number
@@ -40,15 +40,6 @@ module BCDice
40
40
   KIDS=K,EASY=E,NORMAL=N,HARD=H,ULTRA HARD=UH 数字にも対応
41
41
  MESSAGETEXT
42
42
 
43
- # ダイスボットで使用するコマンドを配列で列挙する
44
- register_prefix(
45
- 'NJ\d+.*',
46
- 'EV\d+.*',
47
- 'AT\d+.*',
48
- 'EL\d+.*',
49
- 'SB'
50
- )
51
-
52
43
  def initialize(command)
53
44
  super(command)
54
45
 
@@ -262,10 +253,10 @@ module BCDice
262
253
 
263
254
  # ダイスボットで使用するコマンドを配列で列挙する
264
255
  register_prefix(
265
- 'NJ\d+.*',
266
- 'EV\d+.*',
267
- 'AT\d+.*',
268
- 'EL\d+.*',
256
+ 'NJ',
257
+ 'EV',
258
+ 'AT',
259
+ 'EL',
269
260
  TABLES.keys
270
261
  )
271
262
  end
@@ -21,21 +21,18 @@ module BCDice
21
21
  INFO_MESSAGE_TEXT
22
22
 
23
23
  # ゲーム別成功度判定(2D6)
24
- def check_2D6(total, _dice_total, dice_list, cmp_op, target)
25
- return '' if target == '?'
26
- return '' if cmp_op != :<=
24
+ def result_2d6(total, _dice_total, dice_list, cmp_op, target)
25
+ return Result.nothing if target == "?"
26
+ return nil if cmp_op != :<=
27
27
 
28
- return success_text(total, target) + juuten(dice_list)
29
- end
28
+ result = (total <= target ? Result.success("成功") : Result.failure("失敗"))
29
+ result.text += juuten(dice_list)
30
30
 
31
- def success_text(total, target)
32
- if total <= target
33
- " > 成功"
34
- else
35
- " > 失敗"
36
- end
31
+ return result
37
32
  end
38
33
 
34
+ private
35
+
39
36
  def juuten(dice_list)
40
37
  juuten = dice_list.count(1) + dice_list.count(6)
41
38
 
@@ -127,7 +127,7 @@ module BCDice
127
127
  return "失敗"
128
128
  end
129
129
 
130
- register_prefix('\d*JD.*', 'RETP?\d+', 'DNGNP?\d+', TABLES.keys)
130
+ register_prefix('\d*JD', 'RETP?', 'DNGNP?', TABLES.keys)
131
131
  end
132
132
  end
133
133
  end
@@ -34,7 +34,7 @@ module BCDice
34
34
  MESSAGETEXT
35
35
 
36
36
  # ダイスボットで使用するコマンドを配列で列挙する
37
- register_prefix('\d+CL.*', '\d+R6.*', '\d+D6.*\$[\+\-]?\d+.*')
37
+ register_prefix('\d+CL', '\d+R6', '\d+D6.*\$[\+\-]?\d+')
38
38
 
39
39
  def initialize(command)
40
40
  super(command)
@@ -31,46 +31,38 @@ module BCDice
31
31
  end
32
32
 
33
33
  register_prefix(
34
- '(\d+)?OR([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?'
34
+ '(\d+)?OR(\d{0,6})?'
35
35
  )
36
36
 
37
37
  def eval_game_system_specific_command(command)
38
- if command =~ /(\d+)?OR([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?$/i
39
- diceCount = (Regexp.last_match(1) || 1).to_i
40
- countNo = [(Regexp.last_match(2) || -1).to_i, (Regexp.last_match(3) || -1).to_i, (Regexp.last_match(4) || -1).to_i, (Regexp.last_match(5) || -1).to_i, (Regexp.last_match(6) || -1).to_i, (Regexp.last_match(7) || -1).to_i]
41
- countNo.delete(-1)
42
- countNo = countNo.sort
38
+ m = command.match(/(\d+)?OR(\d{0,6})$/i)
39
+ return nil unless m
43
40
 
44
- return checkRoll(diceCount, countNo)
45
- end
46
-
47
- return nil
41
+ dice_count = (m[1] || 1).to_i
42
+ count_no = (m[2] || "").each_char.map(&:to_i).sort
43
+ return check_roll(dice_count, count_no)
48
44
  end
49
45
 
50
- def checkRoll(diceCount, countNo)
51
- diceArray = @randomizer.roll_barabara(diceCount, 10).sort
52
- diceText = diceArray.join(',')
46
+ def check_roll(dice_count, count_no)
47
+ dice_array = @randomizer.roll_barabara(dice_count, 10).sort
48
+ dice_text = dice_array.join(',')
53
49
 
54
- diceArray.map! { |x| x == 10 ? 0 : x }
55
-
56
- resultArray = []
50
+ result_array = []
57
51
  success = 0
58
- diceArray.each do |i|
59
- multiple = countNo.count(i)
52
+ dice_array.map { |x| x == 10 ? 0 : x }.each do |i|
53
+ multiple = count_no.count(i)
60
54
  if multiple > 0
61
- resultArray.push("#{i}(x#{multiple})")
55
+ result_array.push("#{i}(x#{multiple})")
62
56
  success += multiple
63
57
  else
64
- resultArray.push("×")
58
+ result_array.push("×")
65
59
  end
66
60
  end
67
61
 
68
- countText = countNo.join(',')
69
- resultText = resultArray.join(',')
70
-
71
- result = "#{diceCount}D10(命数:#{countText}) > #{diceText} > #{resultText} > 成功数:#{success}"
62
+ count_text = count_no.join(',')
63
+ result_text = result_array.join(',')
72
64
 
73
- return result
65
+ return "#{dice_count}D10(命数:#{count_text}) > #{dice_text} > #{result_text} > 成功数:#{success}"
74
66
  end
75
67
  end
76
68
  end
@@ -25,7 +25,7 @@ module BCDice
25
25
   例)DC4:【攻撃力】4でダメージチェック DC5[20]:【攻撃力】5でダメージチェック、うち1つは20mm機銃 DC5[20,30]:【攻撃力】5でダメージチェック、うち1つは20mm機銃、うち1つは30mmガンポッド
26
26
  MESSAGETEXT
27
27
 
28
- register_prefix('(\d+)*D20<=.*', '(\d+)*CP.*', 'RMT', 'TOT', 'EXT', 'SUT', 'DC(\d+).*')
28
+ register_prefix('\d*D20<=', '\d*CP', 'RMT', 'TOT', 'EXT', 'SUT', 'DC')
29
29
 
30
30
  def eval_game_system_specific_command(command) # ダイスロールコマンド
31
31
  # 通常判定部分をgetJudgeResultコマンドに切り分け
@@ -53,13 +53,13 @@ module BCDice
53
53
  # 通常判定
54
54
  def getJudgeResult(command)
55
55
  case command
56
- when /^(\d+)*D20<=(\d+)?(\[(\d+)(,(\d+))?\])?(@(\d+))?$/i
56
+ when /^(\d+)?D20<=(\d+)?(\[(\d+)(,(\d+))?\])?(@(\d+))?$/i
57
57
  number = (Regexp.last_match(1) || 1).to_i # ダイス数。省略時は1
58
58
  target = (Regexp.last_match(2) || 14).to_i # 目標値。省略時は14 if 空白 then 14 else 記載の値
59
59
  fumble1 = (Regexp.last_match(4) || 21).to_i # 追加ファンブル値。省略時は21
60
60
  fumble2 = (Regexp.last_match(6) || 21).to_i # 追加ファンブル値。省略時は21
61
61
  critical = (Regexp.last_match(8) || 21).to_i # 追加クリティカル値。省略時は21
62
- when /^(\d+)*CP(\d+)?(\[(\d+)(,(\d+))?\])?(@(\d+))?$/i
62
+ when /^(\d+)?CP(\d+)?(\[(\d+)(,(\d+))?\])?(@(\d+))?$/i
63
63
  number = (Regexp.last_match(1) || 1).to_i
64
64
  target = (Regexp.last_match(2) || 14).to_i
65
65
  fumble1 = (Regexp.last_match(4) || 21).to_i
@@ -26,7 +26,7 @@ module BCDice
26
26
  例)MP2
27
27
  INFO_MESSAGE_TEXT
28
28
 
29
- register_prefix('ND.*', 'MP.*')
29
+ register_prefix('ND', 'MP')
30
30
 
31
31
  def eval_game_system_specific_command(command)
32
32
  case command
@@ -26,7 +26,7 @@ module BCDice
26
26
  ・D66ダイスあり
27
27
  INFO_MESSAGE_TEXT
28
28
 
29
- register_prefix('(N|A|M|U|C|)?URGE\d+')
29
+ register_prefix('[NAMUC]?URGE')
30
30
 
31
31
  def get_urge(string) # パラサイトブラッドの衝動表
32
32
  unless /(\w*)URGE\s*(\d+)/i =~ string
@@ -45,18 +45,13 @@ module BCDice
45
45
  end
46
46
 
47
47
  # ゲーム別成功度判定(2D6)
48
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
49
- return '' if target == '?'
50
- return '' unless cmp_op == :>=
48
+ def result_2d6(_total, dice_total, _dice_list, cmp_op, _target)
49
+ return nil unless cmp_op == :>=
51
50
 
52
51
  if dice_total <= 2
53
- return "ファンブル(【眠気】が1d6点上昇)"
52
+ Result.fumble("ファンブル(【眠気】が1d6点上昇)")
54
53
  elsif dice_total >= 12
55
- return "スペシャル(【魔力】あるいは【眠気】が1d6点回復)"
56
- elsif total >= target
57
- return " > 成功"
58
- else
59
- return " > 失敗"
54
+ Result.critical("スペシャル(【魔力】あるいは【眠気】が1d6点回復)")
60
55
  end
61
56
  end
62
57
 
@@ -18,20 +18,20 @@ module BCDice
18
18
  INFO_MESSAGE_TEXT
19
19
 
20
20
  # ゲーム別成功度判定(1d20)
21
- def check_1D20(total, _dice_total, cmp_op, target)
22
- return '' if target == '?'
23
- return '' unless cmp_op == :<=
21
+ def result_1d20(total, _dice_total, cmp_op, target)
22
+ return Result.nothing if target == '?'
23
+ return nil unless cmp_op == :<=
24
24
 
25
25
  if total <= target
26
26
  if (total >= (40 - target)) || (total == target)
27
- "クリティカル"
27
+ Result.critical("クリティカル")
28
28
  else
29
- "成功"
29
+ Result.success("成功")
30
30
  end
31
31
  elsif total == 20
32
- "ファンブル"
32
+ Result.fumble("ファンブル")
33
33
  else
34
- "失敗"
34
+ Result.failure("失敗")
35
35
  end
36
36
  end
37
37
  end
@@ -18,9 +18,9 @@ module BCDice
18
18
  INFO_MESSAGE_TEXT
19
19
 
20
20
  # ゲーム別成功度判定(1d20)
21
- def check_1D20(total, _dice_total, cmp_op, diff)
22
- return '' if diff == '?'
23
- return '' unless cmp_op == :<=
21
+ def result_1d20(total, _dice_total, cmp_op, diff)
22
+ return Result.nothing if diff == '?'
23
+ return nil unless cmp_op == :<=
24
24
 
25
25
  # 技能値の修正を計算する
26
26
  skill_mod = 0
@@ -46,7 +46,7 @@ module BCDice
46
46
  else
47
47
  fum_str += "-#{skill_mod}=#{fum_num}"
48
48
  end
49
- return "致命的失敗(#{fum_str})"
49
+ return Result.fumble("致命的失敗(#{fum_str})")
50
50
 
51
51
  elsif (total <= critical) || (total <= 1)
52
52
  crit_num = dice_now + skill_mod
@@ -54,14 +54,14 @@ module BCDice
54
54
  crit_num = 1 if crit_num < 1
55
55
 
56
56
  if skill_mod < 0
57
- return "成功"
57
+ return Result.success("成功")
58
58
  end
59
59
 
60
- return "決定的成功(#{dice_now}+#{skill_mod}=#{crit_num})"
60
+ return Result.critical("決定的成功(#{dice_now}+#{skill_mod}=#{crit_num})")
61
61
  elsif total <= diff
62
- return "成功"
62
+ return Result.success("成功")
63
63
  else
64
- return "失敗"
64
+ return Result.failure("失敗")
65
65
  end
66
66
  end
67
67
  end
@@ -38,8 +38,8 @@ module BCDice
38
38
  MESSAGETEXT
39
39
 
40
40
  register_prefix(
41
- 'WEA\d*',
42
- '(\d+)?PO.*',
41
+ 'WEA',
42
+ '(\d+)?PO',
43
43
  'FRE'
44
44
  )
45
45
 
@@ -47,7 +47,7 @@ module BCDice
47
47
   ・プッシュ時のキャスティング・ロールの失敗(Failed Casting Effects)表 FCE
48
48
  INFO_MESSAGE_TEXT
49
49
 
50
- register_prefix('CC\(\d+\)', 'CC.*', 'CBR\(\d+,\d+\)', 'FAR.*', 'BMR', 'BMS', 'FCE', 'PH', 'MA', 'IT')
50
+ register_prefix('CC', 'CBR', 'FAR', 'BMR', 'BMS', 'FCE', 'PH', 'MA', 'IT')
51
51
 
52
52
  def eval_game_system_specific_command(command)
53
53
  case command
@@ -39,8 +39,8 @@ module BCDice
39
39
  end
40
40
 
41
41
  register_prefix(
42
- '(-)?(\d+)?RD(\d+)?(@(\d+))?',
43
- '(-)?(\d+)?DD([1-9])?([\+\-]\d+)?'
42
+ '(-)?(\d+)?RD',
43
+ '(-)?(\d+)?DD'
44
44
  )
45
45
 
46
46
  def eval_game_system_specific_command(command)
@@ -19,7 +19,7 @@ module BCDice
19
19
   判定と回避判定は、どちらもコマンドだけの場合、出目の表示と自動成功と自動失敗の判定のみを行います。
20
20
  INFO_MESSAGE_TEXT
21
21
 
22
- register_prefix('LW.*')
22
+ register_prefix('LW')
23
23
 
24
24
  def eval_game_system_specific_command(command)
25
25
  parser = Command::Parser.new("LWD", "LW", round_type: round_type)
@@ -21,7 +21,7 @@ module BCDice
21
21
  RecordOfSteam : (4S3@2) > 2,1,2,4,4,4,2,3,4,5,6,6 > 4回転 > 成功数5
22
22
  MESSAGETEXT
23
23
 
24
- register_prefix('\d+S\d+.*')
24
+ register_prefix('\d+S\d+')
25
25
 
26
26
  # サンプルのダイスコマンドは「nSt@c」で n=ダイス個数, t=目標値, c=クリティカル値。@cのみ省略可
27
27
 
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Revulture < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'Revulture'
8
+
9
+ # ゲームシステム名
10
+ NAME = '光砕のリヴァルチャー'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'こうさいのりうあるちやあ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~HELP
17
+ ■アタック判定( xAT, xATK, xATTACK )
18
+ x: ダイス数(加算 + と除算 / を使用可能)
19
+ 例) 3AT, 4ATK, 5+6ATTACK, 15/2AT
20
+
21
+ □アタック判定 目標値つき( xAT<=y, xATK<=y, xATTACK<=y )
22
+ x: ダイス数(加算 + と除算 / を使用可能)
23
+ y: 目標値( 1 以上 6 以下。加算 + を使用可能)
24
+ 例) 3AT<=4, 3AT<=2+1
25
+
26
+ □アタック判定 目標値&追加ダメージつき( xAT<=y[>=a:+b], xATK<=y[>=a:+b], xATTACK<=y[z] )
27
+ x: ダイス数(加算 + と除算 / を使用可能)
28
+ y: 目標値( 1 以上 6 以下。加算 + を使用可能)
29
+ z: 追加ダメージの規則(詳細は後述)(※複数同時に指定可能)
30
+
31
+ ▽追加ダメージの規則 [a:+b]
32
+ a: ヒット数が a なら
33
+  =a (ヒット数が a に等しい)
34
+  >=a (ヒット数が a 以上)
35
+ b: ダメージを b 点追加
36
+
37
+ 例) 3AT<=4[>=2:+3] #ルールブックp056「グレングラントAR」
38
+ 例) 2AT<=4[=1:+5][>=2:+8] #ルールブックp067「ファーボル・ドラゴンブレス」
39
+ HELP
40
+
41
+ ATTACK_ROLL_REG = %r{^(\d+([+/]\d+)*)?AT(TACK|K)?(<=([1-6](\+\d)*))?((\[>?=\d+:\+\d+\])+)?}i.freeze
42
+ register_prefix('\d+([+\/]\d+)*AT')
43
+
44
+ def eval_game_system_specific_command(command)
45
+ if (m = ATTACK_ROLL_REG.match(command))
46
+ roll_attack(m[1], m[5], m[7])
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def roll_attack(dice_count_expression, border_expression, additional_damage_rules)
53
+ dice_count = Arithmetic.eval(dice_count_expression, round_type: RoundType::FLOOR)
54
+ border = Arithmetic.eval(border_expression, round_type: RoundType::FLOOR).clamp(1, 6) if border_expression
55
+
56
+ command = make_command_text(dice_count, border, additional_damage_rules)
57
+
58
+ if dice_count <= 0
59
+ return "#{command} > ダイス数が 0 です"
60
+ elsif border.nil? && additional_damage_rules
61
+ return "#{command} > 目標値が指定されていないため、追加ダメージを算出できません"
62
+ end
63
+
64
+ dices = @randomizer.roll_barabara(dice_count, 6).sort
65
+
66
+ critical_hit_count = dices.count(1)
67
+ hit_count = dices.count { |dice| dice <= border } + critical_hit_count if border
68
+ damage = calc_damage(hit_count, additional_damage_rules)
69
+
70
+ message_elements = []
71
+ message_elements << command
72
+ message_elements << dices.join(',')
73
+ message_elements << "クリティカル #{critical_hit_count}" if critical_hit_count > 0
74
+ message_elements << "ヒット数 #{hit_count}" if hit_count
75
+ message_elements << "ダメージ #{damage}" if damage
76
+
77
+ Result.new(message_elements.join(' > ')).tap do |r|
78
+ r.condition = hit_count > 0 if hit_count
79
+ r.critical = critical_hit_count > 0
80
+ end
81
+ end
82
+
83
+ def make_command_text(dice_count, border, additional_damage_rules)
84
+ command = "#{dice_count}attack"
85
+ command += "<=#{border}" if border
86
+ command += additional_damage_rules if additional_damage_rules
87
+
88
+ "(#{command})"
89
+ end
90
+
91
+ def calc_damage(hit_count, additional_damage_rules)
92
+ return nil unless additional_damage_rules
93
+
94
+ damage = hit_count
95
+ parse_additional_damage_rules(additional_damage_rules).each do |rule|
96
+ if rule[:condition].call(hit_count)
97
+ damage += rule[:additinal_damage]
98
+ end
99
+ end
100
+
101
+ damage
102
+ end
103
+
104
+ def parse_additional_damage_rules(source)
105
+ source.scan(/\[(>?=)(\d+):\+(\d+)\]/).map do |matched|
106
+ {
107
+ condition: make_additional_damage_condition(matched[0], matched[1].to_i),
108
+ additinal_damage: matched[2].to_i,
109
+ }
110
+ end
111
+ end
112
+
113
+ def make_additional_damage_condition(comparer, comparing_target)
114
+ case comparer
115
+ when '='
116
+ lambda { |hit_count| hit_count == comparing_target }
117
+ when '>='
118
+ lambda { |hit_count| hit_count >= comparing_target }
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end