bcdice 3.1.3 → 3.5.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 (195) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +186 -76
  3. data/README.md +3 -2
  4. data/i18n/BeginningIdol/ja_jp.yml +2806 -0
  5. data/i18n/BeginningIdol/ko_kr.yml +1400 -0
  6. data/i18n/Cthulhu/zh_hans.yml +11 -0
  7. data/i18n/KillDeathBusiness/ja_jp.yml +1 -1
  8. data/i18n/MagicaLogia/ja_jp.yml +1 -1
  9. data/i18n/MagicaLogia/zh_hans.yml +564 -0
  10. data/i18n/MonotoneMuseum/ko_kr.yml +526 -53
  11. data/i18n/StellarKnights/ja_jp.yml +498 -0
  12. data/i18n/StellarKnights/ko_kr.yml +498 -0
  13. data/i18n/zh_hans.yml +7 -0
  14. data/lib/bcdice/command/parsed.rb +11 -3
  15. data/lib/bcdice/command/parser.rb +179 -100
  16. data/lib/bcdice/common_command/add_dice.rb +1 -1
  17. data/lib/bcdice/common_command/barabara_dice/node.rb +2 -2
  18. data/lib/bcdice/common_command/barabara_dice/result.rb +6 -0
  19. data/lib/bcdice/common_command/calc.rb +1 -1
  20. data/lib/bcdice/common_command/choice.rb +82 -7
  21. data/lib/bcdice/common_command/tally_dice/node.rb +135 -0
  22. data/lib/bcdice/common_command/tally_dice/parser.rb +302 -0
  23. data/lib/bcdice/common_command/tally_dice.rb +19 -0
  24. data/lib/bcdice/common_command.rb +2 -0
  25. data/lib/bcdice/dice_table/d66_half_grid_table.rb +33 -0
  26. data/lib/bcdice/dice_table/d66_left_range_table.rb +29 -0
  27. data/lib/bcdice/dice_table/d66_one_third_table.rb +34 -0
  28. data/lib/bcdice/dice_table/d66_table.rb +5 -1
  29. data/lib/bcdice/dice_table.rb +3 -0
  30. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  31. data/lib/bcdice/game_system/Ainecadette.rb +68 -0
  32. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  33. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  34. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  35. data/lib/bcdice/game_system/Amadeus.rb +110 -93
  36. data/lib/bcdice/game_system/AngelGear.rb +10 -5
  37. data/lib/bcdice/game_system/AnimaAnimus.rb +16 -9
  38. data/lib/bcdice/game_system/Aoharubaan.rb +91 -0
  39. data/lib/bcdice/game_system/Arianrhod.rb +6 -8
  40. data/lib/bcdice/game_system/AssaultEngine.rb +91 -0
  41. data/lib/bcdice/game_system/Avandner.rb +1 -1
  42. data/lib/bcdice/game_system/BadLife.rb +264 -289
  43. data/lib/bcdice/game_system/Bakenokawa.rb +244 -0
  44. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  45. data/lib/bcdice/game_system/BattleTech.rb +109 -28
  46. data/lib/bcdice/game_system/BeastBindTrinity.rb +28 -12
  47. data/lib/bcdice/game_system/BeginningIdol.rb +118 -2392
  48. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +10 -2312
  49. data/lib/bcdice/game_system/BladeOfArcana.rb +1 -1
  50. data/lib/bcdice/game_system/BlindMythos.rb +39 -38
  51. data/lib/bcdice/game_system/BloodCrusade.rb +6 -7
  52. data/lib/bcdice/game_system/BloodMoon.rb +9 -8
  53. data/lib/bcdice/game_system/CardRanker.rb +8 -7
  54. data/lib/bcdice/game_system/CastleInGray.rb +133 -0
  55. data/lib/bcdice/game_system/ChaosFlare.rb +21 -15
  56. data/lib/bcdice/game_system/Chill.rb +10 -10
  57. data/lib/bcdice/game_system/Chill3.rb +9 -9
  58. data/lib/bcdice/game_system/CodeLayerd.rb +39 -39
  59. data/lib/bcdice/game_system/ColossalHunter.rb +34 -47
  60. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  61. data/lib/bcdice/game_system/Cthulhu.rb +3 -3
  62. data/lib/bcdice/game_system/Cthulhu7th.rb +56 -18
  63. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  64. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  65. data/lib/bcdice/game_system/Cthulhu_SimplifiedChinese.rb +60 -0
  66. data/lib/bcdice/game_system/DarkBlaze.rb +0 -11
  67. data/lib/bcdice/game_system/DarkDaysDrive.rb +8 -7
  68. data/lib/bcdice/game_system/DeadlineHeroes.rb +11 -10
  69. data/lib/bcdice/game_system/DemonParasite.rb +5 -13
  70. data/lib/bcdice/game_system/DesperateRun.rb +1 -1
  71. data/lib/bcdice/game_system/DoubleCross.rb +8 -1
  72. data/lib/bcdice/game_system/Dracurouge.rb +3 -2
  73. data/lib/bcdice/game_system/EclipsePhase.rb +14 -14
  74. data/lib/bcdice/game_system/Elric.rb +18 -14
  75. data/lib/bcdice/game_system/Elysion.rb +1 -1
  76. data/lib/bcdice/game_system/EmbryoMachine.rb +9 -8
  77. data/lib/bcdice/game_system/Emoklore.rb +25 -20
  78. data/lib/bcdice/game_system/FateCoreSystem.rb +117 -0
  79. data/lib/bcdice/game_system/Fiasco.rb +1 -1
  80. data/lib/bcdice/game_system/FilledWith.rb +4 -0
  81. data/lib/bcdice/game_system/FutariSousa.rb +12 -10
  82. data/lib/bcdice/game_system/GURPS.rb +17 -28
  83. data/lib/bcdice/game_system/Garako.rb +1 -1
  84. data/lib/bcdice/game_system/GardenOrder.rb +12 -7
  85. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  86. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  87. data/lib/bcdice/game_system/Gorilla.rb +2 -8
  88. data/lib/bcdice/game_system/GranCrest.rb +189 -417
  89. data/lib/bcdice/game_system/Gundog.rb +9 -8
  90. data/lib/bcdice/game_system/GundogRevised.rb +10 -9
  91. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  92. data/lib/bcdice/game_system/GurpsFW.rb +16 -16
  93. data/lib/bcdice/game_system/HarnMaster.rb +19 -26
  94. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
  95. data/lib/bcdice/game_system/Hieizan.rb +12 -21
  96. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  97. data/lib/bcdice/game_system/HuntersMoon.rb +5 -10
  98. data/lib/bcdice/game_system/InfiniteFantasia.rb +19 -17
  99. data/lib/bcdice/game_system/Insane.rb +13 -20
  100. data/lib/bcdice/game_system/Irisbane.rb +154 -0
  101. data/lib/bcdice/game_system/IthaWenUa.rb +8 -15
  102. data/lib/bcdice/game_system/JamesBond.rb +10 -10
  103. data/lib/bcdice/game_system/JekyllAndHyde.rb +1 -1
  104. data/lib/bcdice/game_system/Kamigakari.rb +1 -1
  105. data/lib/bcdice/game_system/KanColle.rb +4 -9
  106. data/lib/bcdice/game_system/Karukami.rb +84 -0
  107. data/lib/bcdice/game_system/KemonoNoMori.rb +26 -39
  108. data/lib/bcdice/game_system/KillDeathBusiness.rb +7 -15
  109. data/lib/bcdice/game_system/KurayamiCrying.rb +142 -3
  110. data/lib/bcdice/game_system/LiveraDoll.rb +254 -304
  111. data/lib/bcdice/game_system/LogHorizon.rb +10 -7
  112. data/lib/bcdice/game_system/MagicaLogia_SimplifiedChinese.rb +66 -0
  113. data/lib/bcdice/game_system/MeikyuDays.rb +10 -8
  114. data/lib/bcdice/game_system/MeikyuKingdom.rb +26 -26
  115. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +4 -3
  116. data/lib/bcdice/game_system/MetalHead.rb +12 -22
  117. data/lib/bcdice/game_system/MetalHeadExtream.rb +5 -5
  118. data/lib/bcdice/game_system/MonotoneMuseum.rb +8 -6
  119. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
  120. data/lib/bcdice/game_system/Nechronica.rb +63 -90
  121. data/lib/bcdice/game_system/NinjaSlayer.rb +6 -7
  122. data/lib/bcdice/game_system/NjslyrBattle.rb +8 -11
  123. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  124. data/lib/bcdice/game_system/Paradiso.rb +1 -1
  125. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  126. data/lib/bcdice/game_system/Peekaboo.rb +4 -9
  127. data/lib/bcdice/game_system/Pendragon.rb +7 -7
  128. data/lib/bcdice/game_system/PersonaO.rb +86 -0
  129. data/lib/bcdice/game_system/PhantasmAdventure.rb +8 -8
  130. data/lib/bcdice/game_system/Postman.rb +1 -1
  131. data/lib/bcdice/game_system/PulpCthulhu.rb +1 -1
  132. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  133. data/lib/bcdice/game_system/Revulture.rb +123 -0
  134. data/lib/bcdice/game_system/RuneQuest.rb +8 -8
  135. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  136. data/lib/bcdice/game_system/SRS.rb +17 -16
  137. data/lib/bcdice/game_system/SamsaraBallad.rb +38 -11
  138. data/lib/bcdice/game_system/Satasupe.rb +32 -32
  139. data/lib/bcdice/game_system/ScreamHighSchool.rb +5 -5
  140. data/lib/bcdice/game_system/SharedFantasia.rb +19 -23
  141. data/lib/bcdice/game_system/ShinobiGami.rb +14 -6
  142. data/lib/bcdice/game_system/Skynauts.rb +103 -142
  143. data/lib/bcdice/game_system/SkynautsBouken.rb +228 -0
  144. data/lib/bcdice/game_system/StarryDolls.rb +318 -0
  145. data/lib/bcdice/game_system/SteamPunkers.rb +25 -7
  146. data/lib/bcdice/game_system/StellarKnights.rb +85 -706
  147. data/lib/bcdice/game_system/StellarKnights_Korean.rb +79 -0
  148. data/lib/bcdice/game_system/{SterileLife.rb → StellarLife.rb} +162 -226
  149. data/lib/bcdice/game_system/StratoShout.rb +8 -16
  150. data/lib/bcdice/game_system/Strave.rb +1 -1
  151. data/lib/bcdice/game_system/SwordWorld.rb +22 -9
  152. data/lib/bcdice/game_system/SwordWorld2_0.rb +22 -7
  153. data/lib/bcdice/game_system/SwordWorld2_5.rb +8 -2
  154. data/lib/bcdice/game_system/TalesFromTheLoop.rb +83 -0
  155. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  156. data/lib/bcdice/game_system/TokumeiTenkousei.rb +4 -3
  157. data/lib/bcdice/game_system/TokyoGhostResearch.rb +1 -1
  158. data/lib/bcdice/game_system/TorgEternity.rb +2 -2
  159. data/lib/bcdice/game_system/ToshiakiHolyGrailWar.rb +92 -0
  160. data/lib/bcdice/game_system/TrinitySeven.rb +279 -280
  161. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  162. data/lib/bcdice/game_system/Utakaze.rb +53 -48
  163. data/lib/bcdice/game_system/Villaciel.rb +1 -1
  164. data/lib/bcdice/game_system/WARPS.rb +11 -9
  165. data/lib/bcdice/game_system/WaresBlade.rb +4 -9
  166. data/lib/bcdice/game_system/Warhammer.rb +15 -6
  167. data/lib/bcdice/game_system/Warhammer4.rb +15 -11
  168. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  169. data/lib/bcdice/game_system/YankeeYogSothoth.rb +4 -9
  170. data/lib/bcdice/game_system/YearZeroEngine.rb +40 -19
  171. data/lib/bcdice/game_system/Yggdrasill.rb +1 -1
  172. data/lib/bcdice/game_system/ZettaiReido.rb +20 -25
  173. data/lib/bcdice/game_system/beginning_idol/accessories_table.rb +31 -0
  174. data/lib/bcdice/game_system/beginning_idol/bad_status_table.rb +43 -0
  175. data/lib/bcdice/game_system/beginning_idol/chain_d66_table.rb +29 -0
  176. data/lib/bcdice/game_system/beginning_idol/chain_table.rb +37 -0
  177. data/lib/bcdice/game_system/beginning_idol/costume_table.rb +37 -0
  178. data/lib/bcdice/game_system/beginning_idol/d6_twice_table.rb +36 -0
  179. data/lib/bcdice/game_system/beginning_idol/item_table.rb +51 -0
  180. data/lib/bcdice/game_system/beginning_idol/my_skill_name_table.rb +44 -0
  181. data/lib/bcdice/game_system/beginning_idol/random_event_table.rb +31 -0
  182. data/lib/bcdice/game_system/beginning_idol/skill_table.rb +63 -0
  183. data/lib/bcdice/game_system/beginning_idol/table.rb +193 -0
  184. data/lib/bcdice/game_system/beginning_idol/with_abnormality.rb +74 -0
  185. data/lib/bcdice/game_system/beginning_idol/work_table.rb +57 -0
  186. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +1 -1
  187. data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +4 -4
  188. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +50 -7
  189. data/lib/bcdice/game_system/sword_world/rating_parser.rb +148 -107
  190. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +26 -8
  191. data/lib/bcdice/game_system.rb +18 -1
  192. data/lib/bcdice/repl.rb +1 -1
  193. data/lib/bcdice/result.rb +26 -0
  194. data/lib/bcdice/version.rb +1 -1
  195. metadata +48 -6
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "bcdice/base"
3
4
  require "bcdice/game_system/sword_world/rating_parser"
4
5
 
5
6
  module BCDice
@@ -9,7 +10,7 @@ module BCDice
9
10
  ID = 'SwordWorld'
10
11
 
11
12
  # ゲームシステム名
12
- NAME = 'ソードワールドRPG'
13
+ NAME = 'ソード・ワールドRPG'
13
14
 
14
15
  # ゲームシステム名の読みがな
15
16
  SORT_KEY = 'そおとわあると'
@@ -17,7 +18,7 @@ module BCDice
17
18
  # ダイスボットの使い方
18
19
  HELP_MESSAGE = "・SW レーティング表 (Kx[c]+m$f) (x:キー, c:クリティカル値, m:ボーナス, f:出目修正)\n"
19
20
 
20
- register_prefix('H?K\d+')
21
+ register_prefix('H?K')
21
22
 
22
23
  def initialize(command)
23
24
  super(command)
@@ -67,6 +68,10 @@ module BCDice
67
68
  return "キーナンバーは#{keyMax}までです"
68
69
  end
69
70
 
71
+ if command.infinite_roll?
72
+ return Result.new("C値を#{command.min_critical}以上にしてください")
73
+ end
74
+
70
75
  newRates = getNewRates(rate_sw2_0)
71
76
 
72
77
  output = "#{command} > "
@@ -82,7 +87,7 @@ module BCDice
82
87
  first_modify = command.first_modify
83
88
 
84
89
  loop do
85
- dice_raw, diceText = rollDice(command)
90
+ dice_raw, diceText = rollDice(command, round)
86
91
  dice = dice_raw
87
92
 
88
93
  if first_to != 0
@@ -125,10 +130,17 @@ module BCDice
125
130
  break unless dice >= command.critical
126
131
  end
127
132
 
128
- output += getResultText(totalValue, command, diceResults, diceResultTotals,
129
- rateResults, diceOnlyTotal, round)
133
+ result_text, critical, fumble = getResultText(
134
+ totalValue, command, diceResults, diceResultTotals,
135
+ rateResults, diceOnlyTotal, round
136
+ )
137
+ output += result_text
130
138
 
131
- return output
139
+ return Result.new.tap do |r|
140
+ r.text = output
141
+ r.critical = critical
142
+ r.fumble = fumble
143
+ end
132
144
  end
133
145
 
134
146
  def getSW2_0_RatingTable
@@ -287,7 +299,7 @@ module BCDice
287
299
  return newRates
288
300
  end
289
301
 
290
- def rollDice(_command)
302
+ def rollDice(_command, _round)
291
303
  dice_list = @randomizer.roll_barabara(2, 6)
292
304
  total = dice_list.sum()
293
305
  dice_str = dice_list.join(",")
@@ -301,6 +313,7 @@ module BCDice
301
313
  # @param rateResults [Array<String>]
302
314
  # @param dice_total [Integer]
303
315
  # @param round [Integer]
316
+ # @return [Array(String, Boolean, Boolean)] output, critical, fumble
304
317
  def getResultText(rating_total, command, diceResults, diceResultTotals,
305
318
  rateResults, dice_total, round)
306
319
  sequence = []
@@ -310,7 +323,7 @@ module BCDice
310
323
  if dice_total <= 2
311
324
  sequence.push(rateResults.join(','))
312
325
  sequence.push("自動的失敗")
313
- return sequence.join(" > ")
326
+ return sequence.join(" > "), false, true
314
327
  end
315
328
 
316
329
  # rate回数が1回で、修正値がない時には途中式と最終結果が一致するので、途中式を省略する
@@ -347,7 +360,7 @@ module BCDice
347
360
  total_text = total.to_s
348
361
  sequence.push(total_text)
349
362
 
350
- return sequence.join(" > ")
363
+ return sequence.join(" > "), round > 1, false
351
364
  end
352
365
  end
353
366
  end
@@ -12,7 +12,7 @@ module BCDice
12
12
  ID = 'SwordWorld2.0'
13
13
 
14
14
  # ゲームシステム名
15
- NAME = 'ソードワールド2.0'
15
+ NAME = 'ソード・ワールド2.0'
16
16
 
17
17
  # ゲームシステム名の読みがな
18
18
  SORT_KEY = 'そおとわあると2.0'
@@ -54,6 +54,12 @@ module BCDice
54
54
  ・グレイテストフォーチュンは末尾に gf
55
55
   例)K20gf K30+24@8GF K40+24@8$12r10gf
56
56
 
57
+ ・威力表を1d+sfで参照 クリティカル後も継続 sf4
58
+  例)k10sf4 k0+5SF4@13 k70+26sf3@9
59
+
60
+ ・威力表を1d+tfで参照 クリティカル後は2dで参照 tf3
61
+  例)k10tf3 k0+5TF4@13 k70+26tf3@9
62
+
57
63
  ・超越判定用に2d6ロールに 2D6@10 書式でクリティカル値付与が可能に。
58
64
   例)2D6@10 2D6@10+11>=30
59
65
 
@@ -68,7 +74,7 @@ module BCDice
68
74
   絡み効果表を出すことができます。
69
75
  INFO_MESSAGE_TEXT
70
76
 
71
- register_prefix('H?K\d+', 'Gr(\d+)?', '2D6?@\d+', 'FT', 'TT')
77
+ register_prefix('H?K', 'Gr', '2D6?@\d+', 'FT', 'TT')
72
78
 
73
79
  def initialize(command)
74
80
  super(command)
@@ -108,14 +114,23 @@ module BCDice
108
114
  return RatingParser.new(version: :v2_0)
109
115
  end
110
116
 
111
- def rollDice(command)
117
+ def rollDice(command, round)
118
+ if command.semi_fixed_val > 0
119
+ dice = @randomizer.roll_once(6)
120
+ return dice + command.semi_fixed_val, "#{dice},#{command.semi_fixed_val}"
121
+ end
122
+ if round == 0 && command.tmp_fixed_val > 0
123
+ dice = @randomizer.roll_once(6)
124
+ return dice + command.tmp_fixed_val, "#{dice},#{command.tmp_fixed_val}"
125
+ end
112
126
  unless command.greatest_fortune
113
- return super(command)
127
+ return super(command, round)
114
128
  end
115
129
 
116
- dice = @randomizer.roll_once(6)
117
-
118
- return dice * 2, "#{dice},#{dice}"
130
+ if command.greatest_fortune
131
+ dice = @randomizer.roll_once(6)
132
+ return dice * 2, "#{dice},#{dice}"
133
+ end
119
134
  end
120
135
 
121
136
  def growth(count = 1)
@@ -9,7 +9,7 @@ module BCDice
9
9
  ID = 'SwordWorld2.5'
10
10
 
11
11
  # ゲームシステム名
12
- NAME = 'ソードワールド2.5'
12
+ NAME = 'ソード・ワールド2.5'
13
13
 
14
14
  # ゲームシステム名の読みがな
15
15
  SORT_KEY = 'そおとわあると2.5'
@@ -56,6 +56,12 @@ module BCDice
56
56
  ・グレイテストフォーチュンは末尾に gf
57
57
   例)K20gf K30+24@8GF K40+24@8$12r5gf
58
58
 
59
+ ・威力表を1d+sfで参照 クリティカル後も継続 sf4
60
+  例)k10sf4 k0+5sf4@13 k70+26sf3@9
61
+
62
+ ・威力表を1d+tfで参照 クリティカル後は2dで参照 tf3
63
+  例)k10tf3 k0+5tf4@13 k70+26tf3@9
64
+
59
65
  ・超越判定用に2d6ロールに 2D6@10 書式でクリティカル値付与が可能に。
60
66
   例)2D6@10 2D6@10+11>=30
61
67
 
@@ -76,7 +82,7 @@ module BCDice
76
82
   アビスカース表を出すことができます。
77
83
  INFO_MESSAGE_TEXT
78
84
 
79
- register_prefix('H?K\d+', 'Gr(\d+)?', '2D6?@\d+', 'FT', 'TT', 'Dru\[\d+,\d+,\d+\]', 'ABT')
85
+ register_prefix('H?K', 'Gr', '2D6?@\d+', 'FT', 'TT', 'Dru', 'ABT')
80
86
 
81
87
  ABYSS_CURSE_TABLE = DiceTable::D66GridTable.new(
82
88
  'アビスカース表', [
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class TalesFromTheLoop < Base
6
+ # ゲームシステムの識別子
7
+ ID = "TalesFromTheLoop"
8
+
9
+ # ゲームシステム名
10
+ NAME = "ザ・ループTRPG"
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = "さるうふTRPG"
14
+
15
+ HELP_MESSAGE = <<~TEXT
16
+ ■ 判定コマンド(nTFLx-x+x or nTFLx+x-x)
17
+ (必要成功数)TFL(判定ダイス数)+/-(修正ダイス数)
18
+
19
+ ※ 必要成功数と修正ダイス数は省略可能
20
+
21
+ 例1) 必要成功数1、判定ダイスは能力値3
22
+ 1TFL3
23
+
24
+ 例2)必要成功数不明、あるいはダイスボットの成功判定を使わない、判定ダイスは能力値3+技能1で4、アイテムの修正+1
25
+ TFL4+1
26
+
27
+ 例3)必要成功数1、判定ダイスは能力値2+技能1で3、コンディションにチェックが2つ、アイテムの修正+1
28
+ 1TFL3-2+1
29
+ あるいは以下のようにカッコ書きで内訳を詳細に記述することも可能。
30
+ 1TFL(2+1)-(1+1)+1
31
+ 修正ダイスのプラスとマイナスは逆でもよい。
32
+ 1TFL(2+1)+1-(1+1)
33
+ TEXT
34
+
35
+ register_prefix('(\d+)?(TFL)')
36
+
37
+ def eval_game_system_specific_command(command)
38
+ parser = Command::Parser.new(/\d*TFL\d+/, round_type: round_type)
39
+ parsed = parser.parse(command)
40
+ return nil unless parsed
41
+
42
+ difficulty, dice_pool = parsed.command.split("TFL", 2).map(&:to_i)
43
+ dice_pool += parsed.modify_number
44
+ if dice_pool <= 0
45
+ dice_pool = 1
46
+ end
47
+
48
+ ability_dice_text, success_dice = make_dice_roll(dice_pool)
49
+
50
+ return make_dice_roll_text(difficulty, dice_pool, ability_dice_text, success_dice)
51
+ end
52
+
53
+ private
54
+
55
+ def make_dice_roll_text(difficulty, dice_pool, ability_dice_text, success_dice)
56
+ dice_count_text = "(#{dice_pool}D6) > #{ability_dice_text} 成功数:#{success_dice}"
57
+ push_dice = (dice_pool - success_dice)
58
+
59
+ if push_dice > 0
60
+ dice_count_text = "#{dice_count_text} 振り直し可能:#{push_dice}"
61
+ reroll_command = "\n振り直しコマンド: TFL#{push_dice}"
62
+ end
63
+
64
+ if difficulty > 0
65
+ if success_dice >= difficulty
66
+ return Result.success("#{dice_count_text} 成功!#{reroll_command}")
67
+ else
68
+ return Result.failure("#{dice_count_text} 失敗!#{reroll_command}")
69
+ end
70
+ end
71
+
72
+ return "#{dice_count_text}#{reroll_command}"
73
+ end
74
+
75
+ def make_dice_roll(dice_pool)
76
+ dice_list = @randomizer.roll_barabara(dice_pool, 6)
77
+ success_dice = dice_list.count(6)
78
+
79
+ return "[#{dice_list.join(',')}]", success_dice
80
+ end
81
+ end
82
+ end
83
+ end
@@ -30,7 +30,7 @@ module BCDice
30
30
  ・OP3@12 → ダイス合計+3の達成値&クリティカル、判定の成否を表示。
31
31
  MESSAGETEXT
32
32
 
33
- register_prefix('(TS|OP)(\d+)?([\+\-]\d)*(\@\d+)?')
33
+ register_prefix('TS', 'OP')
34
34
 
35
35
  def eval_game_system_specific_command(command)
36
36
  output =
@@ -52,18 +52,19 @@ module BCDice
52
52
 
53
53
  result =
54
54
  if cmd.cmp_op
55
- total.send(cmd.cmp_op, cmd.target_number) ? "成功" : "失敗"
55
+ total.send(cmd.cmp_op, cmd.target_number) ? Result.success("成功") : Result.failure("失敗")
56
56
  end
57
57
 
58
58
  sequence = [
59
59
  "(#{cmd})",
60
60
  interim_expr(cmd, dice_total),
61
61
  total.to_s,
62
- result,
62
+ result.text,
63
63
  epp(count_one)
64
64
  ].compact
65
65
 
66
- return sequence.join(" > ")
66
+ result.text = sequence.join(" > ")
67
+ return result
67
68
  end
68
69
 
69
70
  # 出目が全て同じか
@@ -25,7 +25,7 @@ module BCDice
25
25
 
26
26
  # ダイスボットで使用するコマンドを配列で列挙する
27
27
  register_prefix(
28
- 'OP', 'TB', 'TK?\(\d+\)'
28
+ 'OP', 'TB', 'TK?'
29
29
  )
30
30
 
31
31
  def eval_game_system_specific_command(command)
@@ -6,9 +6,9 @@ module BCDice
6
6
  # ゲームシステムの識別子
7
7
  ID = 'TorgEternity'
8
8
  # ゲームシステム名
9
- NAME = 'TORG Eternity'
9
+ NAME = 'トーグ エタニティ'
10
10
  # ゲームシステム名の読みがな
11
- SORT_KEY = 'とおくえたあにてい'
11
+ SORT_KEY = 'とおくえたにてい'
12
12
  # ダイスボットの使い方
13
13
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
14
14
  ・判定
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class ToshiakiHolyGrailWar < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'ToshiakiHolyGrailWar'
8
+ # ゲームシステム名
9
+ NAME = 'としあきの聖杯戦争TRPG'
10
+ # ゲームシステム名の読みがな
11
+ SORT_KEY = 'としあきのせいはいせんそうTRPG'
12
+ # ダイスボットの使い方
13
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
14
+ ■ 判定 (Fx+y-z@a>=t)
15
+ 補正値ペナルティを自動計算してダイスの面数を決定しダイスロールを実行します。
16
+ ダイス面数は2以上、10以下の範囲に制限されます。
17
+ x: ステータス
18
+ y: 補正値 (任意)
19
+ z: マイナス補正値 (任意)
20
+ a: ダイス面数の増量 (任意)
21
+ t: 目標値 (任意)
22
+ 例)
23
+ F8+11, F8+11-5, F8+11-5@1, F8+11+9-3-2@-1, F8+11-5>=50, F8
24
+ INFO_MESSAGE_TEXT
25
+
26
+ register_prefix('F')
27
+
28
+ def eval_game_system_specific_command(command)
29
+ roll_f(command)
30
+ end
31
+
32
+ private
33
+
34
+ def roll_f(command)
35
+ parser = Command::Parser.new(/F(\d+)(\+\d+)*(-\d+)*/, round_type: RoundType::CEIL)
36
+ .disable_modifier
37
+ .enable_critical
38
+ cmd = parser.parse(command)
39
+ unless cmd
40
+ return nil
41
+ end
42
+
43
+ m = cmd.command.match(/^F(\d+)((?:\+\d+)+)?((?:-\d+)+)?$/)
44
+ unless m
45
+ return nil
46
+ end
47
+
48
+ status = m[1].to_i
49
+ positive_modifier = m[2] ? Arithmetic.eval(m[2], RoundType::CEIL) : 0
50
+ negative_modifier = m[3] ? Arithmetic.eval(m[3], RoundType::CEIL) : 0
51
+ side_bonus = cmd.critical || 0
52
+
53
+ times = [status + positive_modifier + negative_modifier, 0].max
54
+ sides = (6 - positive_modifier_penalty(positive_modifier) + negative_modifier_bonus(negative_modifier) + side_bonus).clamp(2, 10)
55
+
56
+ list = @randomizer.roll_barabara(times, sides)
57
+ total = list.sum()
58
+ result =
59
+ if cmd.cmp_op.nil?
60
+ Result.new
61
+ elsif total.send(cmd.cmp_op, cmd.target_number)
62
+ Result.success("成功")
63
+ else
64
+ Result.failure("失敗")
65
+ end
66
+
67
+ sequence = [
68
+ cmd,
69
+ "(#{times}D#{sides}#{cmd.cmp_op}#{cmd.target_number})",
70
+ "#{total}[#{list.join(',')}]",
71
+ total,
72
+ result.text,
73
+ ].compact
74
+
75
+ result.text = sequence.join(" > ")
76
+ return result
77
+ end
78
+
79
+ def positive_modifier_penalty(modifier)
80
+ if modifier <= 10
81
+ 0
82
+ else
83
+ modifier / 10
84
+ end
85
+ end
86
+
87
+ def negative_modifier_bonus(modifier)
88
+ modifier <= -5 ? 1 : 0
89
+ end
90
+ end
91
+ end
92
+ end