bcdice 3.1.2 → 3.4.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 (161) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +154 -75
  3. data/README.md +3 -2
  4. data/i18n/Cthulhu/zh_hans.yml +11 -0
  5. data/i18n/MagicaLogia/zh_hans.yml +564 -0
  6. data/i18n/StellarKnights/ja_jp.yml +498 -0
  7. data/i18n/StellarKnights/ko_kr.yml +498 -0
  8. data/i18n/zh_hans.yml +7 -0
  9. data/lib/bcdice/command/parsed.rb +11 -3
  10. data/lib/bcdice/command/parser.rb +179 -100
  11. data/lib/bcdice/common_command/add_dice.rb +1 -1
  12. data/lib/bcdice/common_command/barabara_dice/node.rb +2 -2
  13. data/lib/bcdice/common_command/barabara_dice/result.rb +6 -0
  14. data/lib/bcdice/common_command/calc.rb +1 -1
  15. data/lib/bcdice/common_command/choice.rb +78 -7
  16. data/lib/bcdice/dice_table.rb +3 -0
  17. data/lib/bcdice/dice_table/d66_half_grid_table.rb +33 -0
  18. data/lib/bcdice/dice_table/d66_left_range_table.rb +29 -0
  19. data/lib/bcdice/dice_table/d66_one_third_table.rb +34 -0
  20. data/lib/bcdice/game_system.rb +10 -0
  21. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  22. data/lib/bcdice/game_system/Ainecadette.rb +68 -0
  23. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  24. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  25. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  26. data/lib/bcdice/game_system/Amadeus.rb +110 -93
  27. data/lib/bcdice/game_system/AngelGear.rb +10 -5
  28. data/lib/bcdice/game_system/AnimaAnimus.rb +16 -9
  29. data/lib/bcdice/game_system/Arianrhod.rb +6 -8
  30. data/lib/bcdice/game_system/Avandner.rb +1 -1
  31. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  32. data/lib/bcdice/game_system/BattleTech.rb +109 -28
  33. data/lib/bcdice/game_system/BeastBindTrinity.rb +28 -12
  34. data/lib/bcdice/game_system/BeginningIdol.rb +5 -5
  35. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +5 -5
  36. data/lib/bcdice/game_system/BladeOfArcana.rb +1 -1
  37. data/lib/bcdice/game_system/BlindMythos.rb +39 -38
  38. data/lib/bcdice/game_system/BloodCrusade.rb +6 -7
  39. data/lib/bcdice/game_system/BloodMoon.rb +9 -8
  40. data/lib/bcdice/game_system/CardRanker.rb +8 -7
  41. data/lib/bcdice/game_system/ChaosFlare.rb +21 -15
  42. data/lib/bcdice/game_system/Chill.rb +10 -10
  43. data/lib/bcdice/game_system/Chill3.rb +9 -9
  44. data/lib/bcdice/game_system/CodeLayerd.rb +39 -39
  45. data/lib/bcdice/game_system/ColossalHunter.rb +34 -47
  46. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  47. data/lib/bcdice/game_system/Cthulhu.rb +1 -1
  48. data/lib/bcdice/game_system/Cthulhu7th.rb +50 -12
  49. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  50. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  51. data/lib/bcdice/game_system/Cthulhu_SimplifiedChinese.rb +60 -0
  52. data/lib/bcdice/game_system/DarkBlaze.rb +0 -11
  53. data/lib/bcdice/game_system/DarkDaysDrive.rb +8 -7
  54. data/lib/bcdice/game_system/DeadlineHeroes.rb +11 -10
  55. data/lib/bcdice/game_system/DemonParasite.rb +5 -13
  56. data/lib/bcdice/game_system/DesperateRun.rb +1 -1
  57. data/lib/bcdice/game_system/DoubleCross.rb +3 -1
  58. data/lib/bcdice/game_system/Dracurouge.rb +3 -2
  59. data/lib/bcdice/game_system/EclipsePhase.rb +14 -14
  60. data/lib/bcdice/game_system/Elric.rb +18 -14
  61. data/lib/bcdice/game_system/Elysion.rb +1 -1
  62. data/lib/bcdice/game_system/EmbryoMachine.rb +9 -8
  63. data/lib/bcdice/game_system/Emoklore.rb +25 -20
  64. data/lib/bcdice/game_system/Fiasco.rb +1 -1
  65. data/lib/bcdice/game_system/FilledWith.rb +4 -0
  66. data/lib/bcdice/game_system/FutariSousa.rb +12 -10
  67. data/lib/bcdice/game_system/GURPS.rb +17 -28
  68. data/lib/bcdice/game_system/Garako.rb +1 -1
  69. data/lib/bcdice/game_system/GardenOrder.rb +12 -7
  70. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  71. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  72. data/lib/bcdice/game_system/Gorilla.rb +2 -8
  73. data/lib/bcdice/game_system/GranCrest.rb +189 -417
  74. data/lib/bcdice/game_system/Gundog.rb +9 -8
  75. data/lib/bcdice/game_system/GundogRevised.rb +10 -9
  76. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  77. data/lib/bcdice/game_system/GurpsFW.rb +16 -16
  78. data/lib/bcdice/game_system/HarnMaster.rb +19 -26
  79. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
  80. data/lib/bcdice/game_system/Hieizan.rb +12 -21
  81. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  82. data/lib/bcdice/game_system/HuntersMoon.rb +5 -10
  83. data/lib/bcdice/game_system/InfiniteFantasia.rb +19 -17
  84. data/lib/bcdice/game_system/Insane.rb +13 -20
  85. data/lib/bcdice/game_system/Irisbane.rb +154 -0
  86. data/lib/bcdice/game_system/IthaWenUa.rb +8 -15
  87. data/lib/bcdice/game_system/JamesBond.rb +10 -10
  88. data/lib/bcdice/game_system/JekyllAndHyde.rb +1 -1
  89. data/lib/bcdice/game_system/Kamigakari.rb +1 -1
  90. data/lib/bcdice/game_system/KanColle.rb +4 -9
  91. data/lib/bcdice/game_system/KemonoNoMori.rb +26 -39
  92. data/lib/bcdice/game_system/KillDeathBusiness.rb +7 -15
  93. data/lib/bcdice/game_system/KurayamiCrying.rb +141 -2
  94. data/lib/bcdice/game_system/LiveraDoll.rb +254 -304
  95. data/lib/bcdice/game_system/LogHorizon.rb +13 -10
  96. data/lib/bcdice/game_system/MagicaLogia_SimplifiedChinese.rb +66 -0
  97. data/lib/bcdice/game_system/MeikyuDays.rb +10 -8
  98. data/lib/bcdice/game_system/MeikyuKingdom.rb +26 -26
  99. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +4 -3
  100. data/lib/bcdice/game_system/MetalHead.rb +12 -22
  101. data/lib/bcdice/game_system/MetalHeadExtream.rb +5 -5
  102. data/lib/bcdice/game_system/MonotoneMuseum.rb +8 -6
  103. data/lib/bcdice/game_system/Nechronica.rb +63 -90
  104. data/lib/bcdice/game_system/NinjaSlayer.rb +6 -7
  105. data/lib/bcdice/game_system/NjslyrBattle.rb +8 -11
  106. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  107. data/lib/bcdice/game_system/Paradiso.rb +3 -3
  108. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  109. data/lib/bcdice/game_system/Peekaboo.rb +4 -9
  110. data/lib/bcdice/game_system/Pendragon.rb +7 -7
  111. data/lib/bcdice/game_system/PersonaO.rb +86 -0
  112. data/lib/bcdice/game_system/PhantasmAdventure.rb +8 -8
  113. data/lib/bcdice/game_system/Postman.rb +1 -1
  114. data/lib/bcdice/game_system/PulpCthulhu.rb +1 -1
  115. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  116. data/lib/bcdice/game_system/Revulture.rb +123 -0
  117. data/lib/bcdice/game_system/RuneQuest.rb +8 -8
  118. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  119. data/lib/bcdice/game_system/SRS.rb +17 -16
  120. data/lib/bcdice/game_system/SamsaraBallad.rb +38 -11
  121. data/lib/bcdice/game_system/Satasupe.rb +32 -32
  122. data/lib/bcdice/game_system/ScreamHighSchool.rb +5 -5
  123. data/lib/bcdice/game_system/SharedFantasia.rb +19 -23
  124. data/lib/bcdice/game_system/ShinobiGami.rb +14 -6
  125. data/lib/bcdice/game_system/Skynauts.rb +103 -142
  126. data/lib/bcdice/game_system/SkynautsBouken.rb +228 -0
  127. data/lib/bcdice/game_system/StarryDolls.rb +318 -0
  128. data/lib/bcdice/game_system/SteamPunkers.rb +25 -7
  129. data/lib/bcdice/game_system/StellarKnights.rb +85 -706
  130. data/lib/bcdice/game_system/StellarKnights_Korean.rb +79 -0
  131. data/lib/bcdice/game_system/SterileLife.rb +2 -3
  132. data/lib/bcdice/game_system/StratoShout.rb +8 -16
  133. data/lib/bcdice/game_system/Strave.rb +1 -1
  134. data/lib/bcdice/game_system/SwordWorld.rb +16 -7
  135. data/lib/bcdice/game_system/SwordWorld2_0.rb +2 -2
  136. data/lib/bcdice/game_system/SwordWorld2_5.rb +2 -2
  137. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  138. data/lib/bcdice/game_system/TokumeiTenkousei.rb +4 -3
  139. data/lib/bcdice/game_system/TokyoGhostResearch.rb +1 -1
  140. data/lib/bcdice/game_system/TorgEternity.rb +2 -2
  141. data/lib/bcdice/game_system/ToshiakiHolyGrailWar.rb +92 -0
  142. data/lib/bcdice/game_system/TrinitySeven.rb +279 -280
  143. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  144. data/lib/bcdice/game_system/Utakaze.rb +53 -48
  145. data/lib/bcdice/game_system/Villaciel.rb +1 -1
  146. data/lib/bcdice/game_system/WARPS.rb +11 -9
  147. data/lib/bcdice/game_system/WaresBlade.rb +4 -9
  148. data/lib/bcdice/game_system/Warhammer.rb +15 -6
  149. data/lib/bcdice/game_system/Warhammer4.rb +15 -11
  150. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  151. data/lib/bcdice/game_system/YankeeYogSothoth.rb +4 -9
  152. data/lib/bcdice/game_system/Yggdrasill.rb +1 -1
  153. data/lib/bcdice/game_system/ZettaiReido.rb +20 -25
  154. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +1 -1
  155. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +4 -4
  156. data/lib/bcdice/game_system/sword_world/rating_parser.rb +1 -1
  157. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +26 -8
  158. data/lib/bcdice/repl.rb +1 -1
  159. data/lib/bcdice/result.rb +26 -0
  160. data/lib/bcdice/version.rb +1 -1
  161. metadata +22 -5
@@ -24,14 +24,15 @@ module BCDice
24
24
  end
25
25
 
26
26
  # ゲーム別成功度判定(1d100)
27
- def check_1D100(total, _dice_total, cmp_op, target)
28
- return '' if target == '?'
29
- return '' unless cmp_op == :<=
27
+ def result_1d100(total, _dice_total, cmp_op, target)
28
+ return nil unless cmp_op == :<=
30
29
 
31
30
  if total >= 100
32
- "ファンブル"
31
+ Result.fumble("ファンブル")
33
32
  elsif total <= 1
34
- "絶対成功(達成値1+SL)"
33
+ Result.critical("絶対成功(達成値1+SL)")
34
+ elsif target == "?"
35
+ Result.nothing
35
36
  elsif total <= target
36
37
  dig10 = total / 10
37
38
  dig1 = total - dig10 * 10
@@ -39,12 +40,12 @@ module BCDice
39
40
  dig1 = 0 if dig1 >= 10 # 条件的にはあり得ない(笑
40
41
 
41
42
  if dig1 <= 0
42
- "クリティカル(達成値20+SL)"
43
+ Result.critical("クリティカル(達成値20+SL)")
43
44
  else
44
- "成功(達成値#{dig10 + dig1}+SL)"
45
+ Result.success("成功(達成値#{dig10 + dig1}+SL)")
45
46
  end
46
47
  else
47
- "失敗"
48
+ Result.failure("失敗")
48
49
  end
49
50
  end
50
51
  end
@@ -26,7 +26,7 @@ module BCDice
26
26
   修正を後ろに書くことも出来ます。
27
27
  INFO_MESSAGE_TEXT
28
28
 
29
- register_prefix('(.DPT|.FT)(\+|\-)?\d*')
29
+ register_prefix('.DPT', '.FT')
30
30
 
31
31
  def initialize(command)
32
32
  super(command)
@@ -35,14 +35,15 @@ module BCDice
35
35
 
36
36
  # ---- 以降、Gundog.rbよりほぼコピペ(絶対成功→ベアリーに用語変更対応の為、継承だと不都合)
37
37
  # ゲーム別成功度判定(1d100)
38
- def check_1D100(total, _dice_total, cmp_op, target)
39
- return '' if target == '?'
40
- return '' unless cmp_op == :<=
38
+ def result_1d100(total, _dice_total, cmp_op, target)
39
+ return nil unless cmp_op == :<=
41
40
 
42
41
  if total >= 100
43
- "ファンブル"
42
+ Result.fumble("ファンブル")
44
43
  elsif total <= 1
45
- "ベアリー(達成値1+SL)"
44
+ Result.critical("ベアリー(達成値1+SL)")
45
+ elsif target == "?"
46
+ Result.nothing
46
47
  elsif total <= target
47
48
  dig10 = total / 10
48
49
  dig1 = total - dig10 * 10
@@ -50,12 +51,12 @@ module BCDice
50
51
  dig1 = 0 if dig1 >= 10 # 条件的にはあり得ない(笑
51
52
 
52
53
  if dig1 <= 0
53
- "クリティカル(達成値20+SL)"
54
+ Result.critical("クリティカル(達成値20+SL)")
54
55
  else
55
- "成功(達成値#{dig10 + dig1}+SL)"
56
+ Result.success("成功(達成値#{dig10 + dig1}+SL)")
56
57
  end
57
58
  else
58
- "失敗"
59
+ Result.failure("失敗")
59
60
  end
60
61
  end
61
62
 
@@ -26,7 +26,7 @@ module BCDice
26
26
   修正を後ろに書くことも出来ます。
27
27
  INFO_MESSAGE_TEXT
28
28
 
29
- register_prefix('(.DPT|.FT)\d*')
29
+ register_prefix('.DPT', '.FT')
30
30
 
31
31
  def eval_game_system_specific_command(command)
32
32
  string = command.upcase
@@ -55,18 +55,18 @@ module BCDice
55
55
  'FMB',
56
56
  'MFMB',
57
57
  'HIT',
58
- 'FEAR((\+)?\d*)',
59
- 'REACT((\+|\-)?\d*)',
60
- 'TRAP(E|N|H|L)',
61
- 'TRS((E|N|H|L)\d+)((\+|\-)?\d*)',
62
- 'RAND(E|N|H|L)[1-6]?',
63
- 'RENC(E|N|H|L)[1-6]?',
58
+ 'FEAR',
59
+ 'REACT',
60
+ 'TRAP[ENHL]',
61
+ 'TRS[ENHL]',
62
+ 'RAND[ENHL]',
63
+ 'RENC[ENHL]',
64
64
  'AREA',
65
- 'DROP(N)?((\+)?\d)?',
65
+ 'DROPN?',
66
66
  'HST',
67
67
  'KHST',
68
68
  'RANDOP',
69
- 'LOT(N|P)'
69
+ 'LOT[NP]'
70
70
  )
71
71
 
72
72
  def initialize(command)
@@ -75,14 +75,14 @@ module BCDice
75
75
  @d66_sort_type = D66SortType::NO_SORT
76
76
  end
77
77
 
78
- def check_nD6(total, dice_total, dice_list, cmp_op, target)
79
- return '' if target == '?'
80
- return "" unless dice_list.size == 3 && cmp_op == :<=
78
+ def result_nd6(total, dice_total, dice_list, cmp_op, target)
79
+ return Result.nothing if target == '?'
80
+ return nil unless dice_list.size == 3 && cmp_op == :<=
81
81
 
82
82
  success = target - total # 成功度
83
- crt_string = "クリティカル(成功度:#{success})"
84
- fmb_string = "ファンブル(失敗度:#{success})"
85
- fail_string = "自動失敗(失敗度:#{success})"
83
+ crt_string = Result.critical("クリティカル(成功度:#{success})")
84
+ fmb_string = Result.fumble("ファンブル(失敗度:#{success})")
85
+ fail_string = Result.failure("自動失敗(失敗度:#{success})")
86
86
 
87
87
  # クリティカル
88
88
  if (dice_total <= 6) && (target >= 16)
@@ -105,9 +105,9 @@ module BCDice
105
105
  end
106
106
 
107
107
  if total <= target
108
- return "成功(成功度:#{success})"
108
+ return Result.success("成功(成功度:#{success})")
109
109
  else
110
- return "失敗(失敗度:#{success})"
110
+ return Result.failure("失敗(失敗度:#{success})")
111
111
  end
112
112
  end
113
113
 
@@ -21,32 +21,25 @@ module BCDice
21
21
  ・人型用 中段命中部位表 (SLH)/上段命中部位 (SLHU)/上段命中部位 (SLHD)
22
22
  MESSAGETEXT
23
23
 
24
- register_prefix('SHK\d+', 'SLH', 'SLHU', 'SLHD')
25
-
26
- def check_1D100(total, _dice_total, cmp_op, target)
27
- return '' if target == '?'
28
- return '' unless cmp_op == :<=
29
-
30
- result = getCheckResult(total, target)
31
- return " #{result}"
32
- end
33
-
34
- def getCheckResult(total, diff)
35
- return getFailResult(total) if total > diff
36
-
37
- return getSuccessResult(total)
38
- end
39
-
40
- def getFailResult(total)
41
- return "致命的失敗" if (total % 5) == 0
42
-
43
- return "失敗"
44
- end
45
-
46
- def getSuccessResult(total)
47
- return "決定的成功" if (total % 5) == 0
48
-
49
- return "成功"
24
+ register_prefix('SHK', 'SLH', 'SLHU', 'SLHD')
25
+
26
+ def result_1d100(total, _dice_total, cmp_op, target)
27
+ return Result.nothing if target == '?'
28
+ return nil unless cmp_op == :<=
29
+
30
+ if total <= target
31
+ if total % 5 == 0
32
+ Result.critical("決定的成功")
33
+ else
34
+ Result.success("成功")
35
+ end
36
+ else
37
+ if total % 5 == 0
38
+ Result.fumble("致命的失敗")
39
+ else
40
+ Result.failure("失敗")
41
+ end
42
+ end
50
43
  end
51
44
 
52
45
  def eval_game_system_specific_command(command)
@@ -699,7 +699,7 @@ module BCDice
699
699
  ),
700
700
  }.freeze
701
701
 
702
- register_prefix('R([A-DS]|\d+)', TABLES.keys)
702
+ register_prefix('R[A-DS]?', TABLES.keys)
703
703
  end
704
704
  end
705
705
  end
@@ -16,31 +16,22 @@ module BCDice
16
16
  HELP_MESSAGE = "大成功、自動成功、失敗、自動失敗、大失敗の自動判定を行います。\n"
17
17
 
18
18
  # ゲーム別成功度判定(1d100)
19
- def check_1D100(total, _dice_total, _cmp_op, target)
20
- return '' if target == '?'
19
+ def result_1d100(total, _dice_total, cmp_op, target)
20
+ return Result.nothing if target == '?'
21
+ return nil unless cmp_op == :<=
21
22
 
22
- if total <= 1
23
- # 1は自動成功
24
- if total <= (target / 5)
25
- " > 大成功"
26
- else
27
- " > 自動成功"
28
- end
29
- elsif total >= 100
30
- # 00は大失敗(大失敗は自動失敗でもある)
31
- " > 大失敗"
23
+ if total >= 100
24
+ Result.fumble("大失敗")
32
25
  elsif total >= 96
33
- # 96-00は自動失敗
34
- " 自動失敗"
26
+ Result.failure("自動失敗")
27
+ elsif total <= (target / 5)
28
+ Result.critical("大成功")
29
+ elsif total <= 1
30
+ Result.success("自動成功")
35
31
  elsif total <= target
36
- if total <= (target / 5)
37
- # 目標値の1/5以下は大成功
38
- " > 大成功"
39
- else
40
- " > 成功"
41
- end
32
+ Result.success("成功")
42
33
  else
43
- "失敗"
34
+ Result.failure("失敗")
44
35
  end
45
36
  end
46
37
  end
@@ -31,7 +31,7 @@ module BCDice
31
31
  例)Hourai : 仁義八徳は、【義】(奇数、奇数、偶数)
32
32
  INFO_MESSAGE_TEXT
33
33
 
34
- register_prefix('ROL', 'MED\(\d+,\d+\)', 'RES\(\d+,\d+\)', 'INY', 'HTK', 'GOG')
34
+ register_prefix('ROL', 'MED', 'RES', 'INY', 'HTK', 'GOG')
35
35
 
36
36
  # ゲームの名前
37
37
  # チャット欄表示名
@@ -47,18 +47,13 @@ module BCDice
47
47
  end
48
48
 
49
49
  # ゲーム別成功度判定(2D6)
50
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
51
- return '' if target == '?'
52
- return '' unless cmp_op == :>=
50
+ def result_2d6(_total, dice_total, _dice_list, cmp_op, _target)
51
+ return nil unless cmp_op == :>=
53
52
 
54
53
  if dice_total <= 2
55
- "ファンブル(モノビースト追加行動+1)"
54
+ Result.fumble("ファンブル(モノビースト追加行動+1)")
56
55
  elsif dice_total >= 12
57
- "スペシャル(変調1つ回復orダメージ+1D6)"
58
- elsif total >= target
59
- " > 成功"
60
- else
61
- " > 失敗"
56
+ Result.critical("スペシャル(変調1つ回復orダメージ+1D6)")
62
57
  end
63
58
  end
64
59
 
@@ -403,7 +398,7 @@ module BCDice
403
398
  ),
404
399
  }.freeze
405
400
 
406
- register_prefix(RTT.prefixes, 'SA2?T\d*', TABLES.keys)
401
+ register_prefix(RTT.prefixes, 'SA', TABLES.keys)
407
402
  end
408
403
  end
409
404
  end
@@ -13,38 +13,40 @@ module BCDice
13
13
  SORT_KEY = 'むけんのふあんたしあ'
14
14
 
15
15
  # ダイスボットの使い方
16
- HELP_MESSAGE = "失敗、成功レベルの自動判定を行います。\n"
16
+ HELP_MESSAGE = "失敗、成功レベルの自動判定を行います。"
17
17
 
18
18
  # ゲーム別成功度判定(1d20)
19
- def check_1D20(total, _dice_total, cmp_op, target)
20
- return '' if target == '?'
19
+ def result_1d20(total, _dice_total, cmp_op, target)
20
+ return Result.nothing if target == '?'
21
+ return nil unless cmp_op == :<=
21
22
 
22
- if cmp_op != :<=
23
- return ''
24
- elsif total > target
25
- return " > 失敗"
23
+ if total > target
24
+ return Result.failure("失敗")
26
25
  end
27
26
 
28
27
  output =
29
28
  if total <= (target / 32)
30
- "32レベル成功(32Lv+)"
29
+ "32レベル成功(32Lv+)"
31
30
  elsif total <= (target / 16)
32
- "16レベル成功(16LV+)"
31
+ "16レベル成功(16Lv+)"
33
32
  elsif total <= (target / 8)
34
- "8レベル成功"
33
+ "8レベル成功"
35
34
  elsif total <= (target / 4)
36
- "4レベル成功"
35
+ "4レベル成功"
37
36
  elsif total <= (target / 2)
38
- "2レベル成功"
37
+ "2レベル成功"
39
38
  else
40
- "1レベル成功"
39
+ "1レベル成功"
41
40
  end
42
41
 
43
- if total <= 1
44
- output += "/クリティカル"
42
+ Result.new.tap do |r|
43
+ r.text = output
44
+ r.success = true
45
+ if total <= 1
46
+ r.critical = true
47
+ r.text += "/クリティカル"
48
+ end
45
49
  end
46
-
47
- output
48
50
  end
49
51
  end
50
52
  end
@@ -46,27 +46,20 @@ module BCDice
46
46
  end
47
47
 
48
48
  # ゲーム別成功度判定(2D6)
49
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
50
- return '' unless cmp_op == :>=
51
-
52
- result =
53
- if dice_total <= 2
54
- translate("Insane.fumble")
55
- elsif dice_total >= 12
56
- translate("Insane.special")
57
- elsif target == "?"
58
- ""
59
- elsif total >= target
60
- translate("success")
61
- else
62
- translate("failure")
63
- end
64
-
65
- if result.empty?
66
- return ""
49
+ def result_2d6(total, dice_total, _dice_list, cmp_op, target)
50
+ return nil unless cmp_op == :>=
51
+
52
+ if dice_total <= 2
53
+ Result.fumble(translate("Insane.fumble"))
54
+ elsif dice_total >= 12
55
+ Result.critical(translate("Insane.special"))
56
+ elsif target == "?"
57
+ Result.nothing
58
+ elsif total >= target
59
+ Result.success(translate("success"))
60
+ else
61
+ Result.failure(translate("failure"))
67
62
  end
68
-
69
- return " > #{result}"
70
63
  end
71
64
 
72
65
  def eval_game_system_specific_command(command)
@@ -0,0 +1,154 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Irisbane < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'Irisbane'
8
+
9
+ # ゲームシステム名
10
+ NAME = '瞳逸らさぬイリスベイン'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'ひとみそらさぬいりすへいん'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~HELP
17
+ ■攻撃判定( ATTACKx@y<=z )
18
+ x: 攻撃力
19
+ y: 判定数
20
+ z: 目標値
21
+ (※ ATTACK は ATK または AT と簡略化可能)
22
+ 例) ATTACK2@3<=5
23
+ 例) ATK10@2<=4
24
+ 例) AT8@3<=2
25
+
26
+ 上記 x y z にはそれぞれ四則演算を指定可能。
27
+ 例) ATTACK2+7@3*2<=5-1
28
+
29
+ □攻撃判定のダメージ増減( ATTACKx@y<=z[+a] ATTACKx@y<=z[-a])
30
+ 末尾に [+a] または [-a] と指定すると、最終的なダメージを増減できる。
31
+ a: 増減量
32
+ 例) ATTACK2@3<=5[+10]
33
+ 例) ATK10@2<=4[-8]
34
+ 例) AT8@3<=2[-8+5]
35
+
36
+ ■シチュエーション(p115)
37
+ SceneSituation, SSi
38
+ HELP
39
+
40
+ ATTACK_ROLL_REG = %r{^AT(TACK|K)?([+\-*/()\d]+)@([+\-*/()\d]+)<=([+\-*/()\d]+)(\[([+\-])([+\-*/()\d]+)\])?}i.freeze
41
+ register_prefix('AT(TACK|K)?')
42
+
43
+ def initialize(command)
44
+ super(command)
45
+
46
+ @sort_barabara_dice = true
47
+ @round_type = RoundType::CEIL
48
+ end
49
+
50
+ def eval_game_system_specific_command(command)
51
+ command = ALIAS[command] || command
52
+
53
+ if (m = ATTACK_ROLL_REG.match(command))
54
+ roll_attack(m[2], m[3], m[4], m[6], m[7])
55
+ else
56
+ roll_tables(command, TABLES)
57
+ end
58
+ end
59
+
60
+ private
61
+
62
+ def roll_attack(power_expression, dice_count_expression, border_expression, modification_operator, modification_expression)
63
+ power = Arithmetic.eval(power_expression, RoundType::CEIL)
64
+ dice_count = Arithmetic.eval(dice_count_expression, RoundType::CEIL)
65
+ border = Arithmetic.eval(border_expression, RoundType::CEIL)
66
+ modification_value = modification_expression.nil? ? nil : Arithmetic.eval(modification_expression, RoundType::CEIL)
67
+ return if power.nil? || dice_count.nil? || border.nil?
68
+ return if modification_operator && modification_value.nil?
69
+
70
+ power = 0 if power < 0
71
+ border = border.clamp(1, 6)
72
+
73
+ command = make_command_text(power, dice_count, border, modification_operator, modification_value)
74
+
75
+ if dice_count <= 0
76
+ return "#{command} > 判定数が 0 です"
77
+ end
78
+
79
+ dices = @randomizer.roll_barabara(dice_count, 6).sort
80
+
81
+ success_dice_count = dices.count { |dice| dice <= border }
82
+ damage = success_dice_count * power
83
+
84
+ message_elements = []
85
+ message_elements << command
86
+ message_elements << dices.join(',')
87
+ message_elements << "成功ダイス数 #{success_dice_count}"
88
+ message_elements << "× 攻撃力 #{power}" if success_dice_count > 0
89
+
90
+ if success_dice_count > 0
91
+ if modification_operator && modification_value
92
+ message_elements << "ダメージ #{damage}#{modification_operator}#{modification_value}"
93
+ damage = parse_operator(modification_operator).call(damage, modification_value)
94
+ damage = 0 if damage < 0
95
+ message_elements << damage.to_s
96
+ else
97
+ message_elements << "ダメージ #{damage}"
98
+ end
99
+ end
100
+
101
+ Result.new(message_elements.join(' > ')).tap do |r|
102
+ r.condition = success_dice_count > 0
103
+ end
104
+ end
105
+
106
+ def make_command_text(power, dice_count, border, modification_operator, modification_value)
107
+ text = "(ATTACK#{power}@#{dice_count}<=#{border}"
108
+ text += "[#{modification_operator}#{modification_value}]" if modification_operator
109
+ text += ")"
110
+ text
111
+ end
112
+
113
+ def parse_operator(operator)
114
+ case operator
115
+ when '+'
116
+ lambda { |x, y| x + y }
117
+ when '-'
118
+ lambda { |x, y| x - y }
119
+ end
120
+ end
121
+
122
+ TABLES = {
123
+ "SceneSituation" => DiceTable::D66LeftRangeTable.new(
124
+ "シチュエーション",
125
+ BCDice::D66SortType::NO_SORT,
126
+ [
127
+ [1..3, [
128
+ "【日常】何一つ変わることの無い日々の一幕。移ろい易い世界では、それはとても大切である。",
129
+ "【準備】何かを為すための用意をする一幕。情報収集、買物遠征、やるべきことは一杯だ。",
130
+ "【趣味】自分の時間を、有効活用している一幕。必要に追われていない分、心は軽く晴れやかだ。",
131
+ "【喫茶】一息入れ、嗜好品を嗜む時の一幕。穏やかな空気は、だが、往々にして変わりやすい。",
132
+ "【鍛錬】体を鍛え、心を養う修練の一幕。己さえ良ければ、その方法も何だって良い。",
133
+ "【職務】役割の元、仕事に精を出す時の一幕。目的が何であれ、為すべきことに変わりはない。",
134
+ ]],
135
+ [4..6, [
136
+ "【移動】何処かから何処かへと向かう一幕。進んでいるなら、手段も目的地も関係あるまい。",
137
+ "【墓前】故人が眠る場所へと赴く一幕。共に眠ることだけは無いように。",
138
+ "【操作】何かを操り、望みを果たしている一幕。運転にせよ何にせよ、脇見には注意が必要だ。",
139
+ "【食事】何かを糧とし、己の力を蓄える一幕。行動すれば消耗する。腹が減っては何とやらだ。",
140
+ "【休息】日々の合間の、憩いの一幕。“何もしない”というのも、立派な行いである。",
141
+ "【夢幻】現実に存在しない何かへと耽る一幕。時間帯に関わらず、何時かは必ず覚めるだろう。",
142
+ ]],
143
+ ]
144
+ ),
145
+ }.transform_keys(&:upcase).freeze
146
+
147
+ ALIAS = {
148
+ "SSi" => "SceneSituation",
149
+ }.transform_keys(&:upcase).transform_values(&:upcase).freeze
150
+
151
+ register_prefix(TABLES.keys, ALIAS.keys)
152
+ end
153
+ end
154
+ end