bcdice 3.1.3 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -18,87 +18,92 @@ module BCDice
18
18
  n個のサイコロで行為判定ロール。ゾロ目の最大個数を成功レベルとして表示。nを省略すると2UK扱い。
19
19
  例)3UK :サイコロ3個で行為判定
20
20
  例)UK :サイコロ2個で行為判定
21
- 不等号用いた成否判定は現時点では実装してません。
21
+ ・難易度付き行為判定ロール(nUK>=t)
22
+ tに難易度を指定した行為判定ロール。
23
+ 成功レベルと難易度tを比べて成否を判定します。
24
+ 例)6UK>=3 :サイコロ6個で行為判定して、成功レベル3が出れば成功。
22
25
  ・クリティカルコール付き行為判定ロール(nUK@c or nUKc)
23
-  cに「龍のダイス目」を指定した行為判定ロール。
24
- ゾロ目ではなく、cと同じ値の出目数x2が成功レベルとなります。
26
+ cに「龍のダイス目」を指定した行為判定ロール。
27
+ ゾロ目ではなく、cと同じ値の出目数x2が成功レベルとなります。難易度の指定も可能です。
25
28
  例)3UK@5 :龍のダイス「月」でクリティカルコール宣言したサイコロ3個の行為判定
26
29
  MESSAGETEXT
27
30
 
28
- register_prefix('\d*UK[@\d]*')
29
-
30
- def initialize(command)
31
- super(command)
32
- @arrayDragonDiceName = ['', '風', '雨', '雲', '影', '月', '歌']
33
- @enabled_upcase_input = false
34
- end
31
+ register_prefix('\d*UK')
35
32
 
36
33
  def eval_game_system_specific_command(command)
37
34
  debug('eval_game_system_specific_command command', command)
38
35
 
39
- result = ''
36
+ check_roll(command)
37
+ end
40
38
 
41
- case command
42
- when /(\d+)?UK(@?(\d))?(>=(\d+))?/i
43
- base = (Regexp.last_match(1) || 2).to_i
44
- crit = Regexp.last_match(3).to_i
45
- diff = Regexp.last_match(5).to_i
46
- result = checkRoll(base, crit, diff)
47
- end
39
+ private
48
40
 
49
- return nil if result.empty?
41
+ DRAGON_DICE_NAME = {
42
+ 1 => "風",
43
+ 2 => "雨",
44
+ 3 => "雲",
45
+ 4 => "影",
46
+ 5 => "月",
47
+ 6 => "歌"
48
+ }.freeze
50
49
 
51
- return "#{command} > #{result}"
52
- end
50
+ def check_roll(command)
51
+ m = /^(\d+)?UK(@?(\d))?(>=(\d+))?$/i.match(command)
52
+ return nil unless m
53
53
 
54
- def checkRoll(base, crit, diff = 0)
55
- result = ""
54
+ base = (m[1] || 2).to_i
55
+ crit = m[3].to_i
56
+ diff = m[5].to_i
56
57
 
57
58
  base = getValue(base)
58
59
  crit = getValue(crit)
59
60
 
60
- return result if base < 1
61
+ return nil if base < 1
61
62
 
62
63
  crit = 6 if crit > 6
63
64
 
64
- result += "(#{base}d6)"
65
+ dice_list = @randomizer.roll_barabara(base, 6).sort
66
+ result = get_roll_result(dice_list, crit, diff)
65
67
 
66
- diceList = @randomizer.roll_barabara(base, 6).sort
67
-
68
- result += " > [#{diceList.join(',')}] > "
69
- result += getRollResultString(diceList, crit, diff)
68
+ sequence = [
69
+ command,
70
+ "(#{base}D6)",
71
+ "[#{dice_list.join(',')}]",
72
+ result.text
73
+ ]
74
+ result.text = sequence.join(" > ")
70
75
 
71
76
  return result
72
77
  end
73
78
 
74
- def getRollResultString(diceList, crit, diff)
75
- success, maxnum, setCount = getSuccessInfo(diceList, crit, diff)
79
+ def get_roll_result(diceList, crit, diff)
80
+ success, maxnum, setCount = getSuccessInfo(diceList, crit)
76
81
 
77
- result = ""
82
+ sequence = []
78
83
 
79
84
  if isDragonDice(crit)
80
- result += "龍のダイス「#{@arrayDragonDiceName[crit]}」(#{crit})を使用"
85
+ sequence.push("龍のダイス「#{DRAGON_DICE_NAME[crit]}」(#{crit})を使用")
81
86
  end
82
87
 
83
- if success
84
- result += "成功レベル:#{maxnum} (#{setCount}セット)"
85
- if diff != 0
86
- diffSuccess = (maxnum >= diff)
87
- if diffSuccess
88
- result += " > 成功"
89
- else
90
- result += " > 失敗"
91
- end
92
- end
93
-
88
+ if success
89
+ sequence.push("成功レベル:#{maxnum} (#{setCount}セット)")
94
90
  else
95
- result += "失敗"
91
+ sequence.push("失敗")
92
+ return Result.failure(sequence.join(" > "))
96
93
  end
97
94
 
98
- return result
95
+ if diff == 0
96
+ return Result.success(sequence.join(" > ")) # 難易度なしでも成功として扱う
97
+ elsif maxnum >= diff
98
+ sequence.push("成功")
99
+ return Result.success(sequence.join(" > "))
100
+ else
101
+ sequence.push("失敗")
102
+ return Result.failure(sequence.join(" > "))
103
+ end
99
104
  end
100
105
 
101
- def getSuccessInfo(diceList, crit, _diff)
106
+ def getSuccessInfo(diceList, crit)
102
107
  debug("checkSuccess diceList, crit", diceList, crit)
103
108
 
104
109
  diceCountHash = getDiceCountHash(diceList, crit)
@@ -109,7 +114,7 @@ module BCDice
109
114
  countThreshold = (isDragonDice(crit) ? 1 : 2)
110
115
 
111
116
  diceCountHash.each do |dice, count|
112
- maxnum = count if count > maxnum
117
+ maxnum = count if count > maxnum
113
118
  successDiceList << dice if count >= countThreshold
114
119
  end
115
120
 
@@ -47,7 +47,7 @@ module BCDice
47
47
  ・改良種表      IS
48
48
  MESSAGETEXT
49
49
 
50
- register_prefix('\\d+VBS(>=\\d+)?', '\\d+VF', '\\d+VM', '\\d+VG', 'PJ[VA]?', 'PQ[VA]?', 'AC', 'MM([IAD]|V[VA]?)', 'F[LRWGBCS]', 'IP[VA]?', 'EP[VA]?\\d?', 'MP', 'IS')
50
+ register_prefix('\d+VBS(>=\d+)?', '\d+VF', '\d+VM', '\d+VG', 'PJ[VA]?', 'PQ[VA]?', 'AC', 'MM([IAD]|V[VA]?)', 'F[LRWGBCS]', 'IP[VA]?', 'EP[VA]?', 'MP', 'IS')
51
51
 
52
52
  def initialize(command)
53
53
  super(command)
@@ -15,17 +15,19 @@ module BCDice
15
15
  # ダイスボットの使い方
16
16
  HELP_MESSAGE = "失敗、成功度の自動判定を行います。\n"
17
17
 
18
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
18
+ def result_2d6(total, dice_total, _dice_list, cmp_op, target)
19
+ return nil unless cmp_op == :<=
20
+
19
21
  if dice_total <= 2
20
- "クリティカル"
22
+ Result.critical("クリティカル")
21
23
  elsif dice_total >= 12
22
- "ファンブル"
23
- elsif cmp_op == :<= && target != "?"
24
- if total <= target
25
- " #{target - total}成功"
26
- else
27
- " > 失敗"
28
- end
24
+ Result.fumble("ファンブル")
25
+ elsif target == "?"
26
+ Result.nothing
27
+ elsif total <= target
28
+ Result.success("#{target - total}成功")
29
+ else
30
+ Result.failure("失敗")
29
31
  end
30
32
  end
31
33
  end
@@ -15,18 +15,13 @@ module BCDice
15
15
  # ダイスボットの使い方
16
16
  HELP_MESSAGE = "nD10>=m 方式の判定で成否、完全成功、完全失敗を自動判定します。\n"
17
17
 
18
- def check_nD10(total, _dice_total, dice_list, cmp_op, target)
19
- return '' if target == '?'
20
- return '' unless cmp_op == :>=
18
+ def result_nd10(_total, _dice_total, dice_list, cmp_op, _target)
19
+ return nil unless cmp_op == :>=
21
20
 
22
21
  if dice_list.count(10) == dice_list.size
23
- ' > 完全成功'
22
+ Result.critical("完全成功")
24
23
  elsif dice_list.count(1) == dice_list.size
25
- ' > 絶対失敗'
26
- elsif total >= target
27
- ' > 成功'
28
- else
29
- ' > 失敗'
24
+ Result.fumble("絶対失敗")
30
25
  end
31
26
  end
32
27
  end
@@ -51,14 +51,23 @@ module BCDice
51
51
  return output_msg
52
52
  end
53
53
 
54
- def check_1D100(total, _dice_total, cmp_op, target)
55
- return '' if target == '?'
56
- return '' unless cmp_op == :<=
54
+ def result_1d100(total, _dice_total, cmp_op, target)
55
+ return Result.nothing if target == '?'
56
+ return nil unless cmp_op == :<=
57
57
 
58
58
  if total <= target
59
- "成功(成功度#{(target - total) / 10})"
59
+ Result.success("成功(成功度#{(target - total) / 10})")
60
60
  else
61
- "失敗(失敗度#{(total - target) / 10})"
61
+ Result.failure("失敗(失敗度#{(total - target) / 10})")
62
+ end
63
+ end
64
+
65
+ def result_1d100_text(total, dice_total, cmp_op, target)
66
+ result = result_1d100(total, dice_total, cmp_op, target)&.text
67
+ if result.nil?
68
+ ""
69
+ else
70
+ " > #{result}"
62
71
  end
63
72
  end
64
73
 
@@ -322,7 +331,7 @@ module BCDice
322
331
  total_n = @randomizer.roll_once(100)
323
332
 
324
333
  output = "(#{string}) > #{total_n}"
325
- output += check_1D100(total_n, total_n, :<=, diff)
334
+ output += result_1d100_text(total_n, total_n, :<=, diff)
326
335
 
327
336
  pos_num = (total_n % 10) * 10 + (total_n / 10).to_i
328
337
  pos_num = 100 if total_n >= 100
@@ -28,7 +28,7 @@ module BCDice
28
28
 
29
29
  ■ 命中判定 (WHx)
30
30
  "WH(命中値)"の形で指定します。
31
- 命中判定を行って、命中してクリティカルでなければ部位も表示します。
31
+ 命中判定を行って、クリティカルかファンブルでなければ部位も表示します。
32
32
  例)wh60  wh(43-20)
33
33
  INFO_MESSAGE_TEXT
34
34
 
@@ -44,9 +44,9 @@ module BCDice
44
44
  roll_critical_table(command) || roll_attack(command) || roll_tables(command, TABLES)
45
45
  end
46
46
 
47
- def check_1D100(total, _dice_total, cmp_op, target)
48
- return '' if target == '?'
49
- return '' unless cmp_op == :<=
47
+ def result_1d100(total, _dice_total, cmp_op, target)
48
+ return Result.nothing if target == '?'
49
+ return nil unless cmp_op == :<=
50
50
 
51
51
  t10 = total / 10
52
52
  d10 = target / 10
@@ -62,18 +62,19 @@ module BCDice
62
62
 
63
63
  result =
64
64
  if total <= 5
65
- "自動成功"
65
+ Result.success("自動成功")
66
66
  elsif total >= 96
67
- "自動失敗"
67
+ Result.failure("自動失敗")
68
68
  elsif total <= target
69
- "成功"
69
+ Result.success("成功")
70
70
  else
71
- "失敗"
71
+ Result.failure("失敗")
72
72
  end
73
73
 
74
74
  sl_text = format("(SL%+d)", sl)
75
+ result.text += "#{sl_text} > #{result_detail(sl, total, target)}"
75
76
 
76
- " > #{result}#{sl_text} > #{result_detail(sl, total, target)}"
77
+ return result
77
78
  end
78
79
 
79
80
  private
@@ -249,7 +250,7 @@ module BCDice
249
250
 
250
251
  target_number = m[1].to_i
251
252
  total = @randomizer.roll_once(100)
252
- result = check_1D100(total, total, :<=, target_number).delete_prefix(" > ")
253
+ result = result_1d100(total, total, :<=, target_number)&.text
253
254
 
254
255
  sequence = [
255
256
  "(#{command})",
@@ -266,6 +267,9 @@ module BCDice
266
267
  if (total > target_number) || (total > 95) # 自動失敗時のファンブル処理も
267
268
  if ones == tens
268
269
  "ファンブル"
270
+ else
271
+ # 一の位と十の位を入れ替えて参照する
272
+ "(#{HIT_PARTS_TABLE.fetch(merge_d100(ones, tens)).content})"
269
273
  end
270
274
  elsif ones == tens
271
275
  "クリティカル"
@@ -317,7 +321,7 @@ module BCDice
317
321
  [61..70, '君はひどく躓きバランスを回復するのに手間取る。次の「移動」を失う。'],
318
322
  [71..80, '君は武器を取り回しを誤る。次の「アクション」を失う。'],
319
323
  [81..90, '君は筋を違えるか、足首をひねってしまう。「筋断裂(軽度)」の負傷を得る。「致命的負傷」としてカウントされる。'],
320
- [91..100, '君は射程内のランダムな味方を攻撃してしまう。命中判定の出目の1の位をSLとして用いること。攻撃可能な味方が居ない場合は、自己を攻撃ししまい「朦朧状態」1つを得る。'],
324
+ [91..100, '君は射程内のランダムな味方を攻撃してしまう。命中判定の出目の1の位をSLとして用いること。攻撃可能な味方が居ない場合は、自己を攻撃してしまい「朦朧状態」1つを得る。'],
321
325
  ]
322
326
  )
323
327
  }.freeze
@@ -22,7 +22,7 @@ module BCDice
22
22
   例)SET1 SET48
23
23
  MESSAGETEXT
24
24
 
25
- register_prefix('WQ\d+', 'SET\d+')
25
+ register_prefix('WQ', 'SET')
26
26
 
27
27
  def eval_game_system_specific_command(command)
28
28
  case command
@@ -49,18 +49,13 @@ module BCDice
49
49
  end
50
50
 
51
51
  # ゲーム別成功度判定(2D6)
52
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
53
- return '' if target == '?'
54
- return '' unless cmp_op == :>=
52
+ def result_2d6(_total, dice_total, _dice_list, cmp_op, _target)
53
+ return nil unless cmp_op == :>=
55
54
 
56
55
  if dice_total <= 2
57
- "ファンブル(判定失敗。ファンブル表(FT)を振ること)"
56
+ Result.fumble("ファンブル(判定失敗。ファンブル表(FT)を振ること)")
58
57
  elsif dice_total >= 12
59
- "スペシャル(判定成功。【テンション】が1段階上昇)"
60
- elsif total >= target
61
- " > 成功"
62
- else
63
- " > 失敗"
58
+ Result.critical("スペシャル(判定成功。【テンション】が1段階上昇)")
64
59
  end
65
60
  end
66
61
 
@@ -19,15 +19,17 @@ module BCDice
19
19
 
20
20
  ・判定コマンド(nMYZx+x+x)
21
21
  (難易度)MYZ(能力ダイス数)+(技能ダイス数)+(アイテムダイス数) # (1と6を数え、プッシュ可能数を表示)
22
+ (難易度)MYZ(能力ダイス数)-(技能ダイス数)+(アイテムダイス数) # (1と6を数え、プッシュ可能数を表示、技能のマイナス指定)
22
23
 
23
24
  ※ 難易度と技能、アイテムダイス数は省略可能
24
25
  INFO_MESSAGE_TEXT
25
26
 
26
- DIFFICULTY_INDEX = 1 # 難易度のインデックス
27
- COMMAND_TYPE_INDEX = 2 # コマンドタイプのインデックス
28
- ABILITY_INDEX = 3 # 能力値ダイスのインデックス
29
- SKILL_INDEX = 5 # 技能値ダイスのインデックス
30
- MODIFIED_INDEX = 7 # 修正ダイスのインデックス
27
+ DIFFICULTY_INDEX = 1 # 難易度のインデックス
28
+ COMMAND_TYPE_INDEX = 2 # コマンドタイプのインデックス
29
+ ABILITY_INDEX = 3 # 能力値ダイスのインデックス
30
+ SKILL_SIGNED_INDEX = 5 # 技能値ダイス符号のインデックス
31
+ SKILL_INDEX = 6 # 技能値ダイスのインデックス
32
+ GEAR_INDEX = 8 # アイテムダイスのインデックス
31
33
 
32
34
  register_prefix('(\d+)?(YZE|MYZ)')
33
35
 
@@ -42,7 +44,7 @@ module BCDice
42
44
  end
43
45
 
44
46
  def eval_game_system_specific_command(command)
45
- m = /\A(\d+)?(YZE|MYZ)(\d+)(\+(\d+))?(\+(\d+))?/.match(command)
47
+ m = /\A(\d+)?(YZE|MYZ)(\d+)((\+|-)(\d+))?(\+(\d+))?/.match(command)
46
48
  unless m
47
49
  return ''
48
50
  end
@@ -70,18 +72,27 @@ module BCDice
70
72
  dice_pool = m[SKILL_INDEX].to_i
71
73
  skill_dice_text, success_dice, botch_dice = make_dice_roll(dice_pool)
72
74
 
73
- @total_success_dice += success_dice
75
+ skill_unsigned = m[SKILL_SIGNED_INDEX]
76
+ if command_type == 'YZE' && skill_unsigned == '-'
77
+ # YZEはシンプルに動作するコマンドなのでマイナス技能の処理は対応しない。
78
+ return "YZEコマンドでは技能ダイスをマイナス指定できません。"
79
+ elsif command_type == 'MYZ' && skill_unsigned == '-'
80
+ @total_success_dice -= success_dice # マイナス技能の成功は通常の成功と相殺される
81
+ else
82
+ @total_success_dice += success_dice
83
+ end
84
+
74
85
  @total_botch_dice += botch_dice
75
- @skill_botch_dice += botch_dice # 技能ダイスの1はpushで振り直し可能
76
- @push_dice += (dice_pool - success_dice) # 技能ダイスのみ1を含む
86
+ @skill_botch_dice += botch_dice # 技能ダイスの1はpushで振り直し可能(例えマイナス技能でも)
87
+ @push_dice += (dice_pool - success_dice) # 技能ダイスのみ1を含むので、ここでは1を計算に入れない
77
88
 
78
- dice_count_text += "+(#{dice_pool}D6)"
79
- dice_text += "+#{skill_dice_text}"
89
+ dice_count_text += "#{skill_unsigned}(#{dice_pool}D6)"
90
+ dice_text += "#{skill_unsigned}#{skill_dice_text}"
80
91
  end
81
92
 
82
- if m[MODIFIED_INDEX]
83
- dice_pool = m[MODIFIED_INDEX].to_i
84
- modified_dice_text, success_dice, botch_dice = make_dice_roll(dice_pool)
93
+ if m[GEAR_INDEX]
94
+ dice_pool = m[GEAR_INDEX].to_i
95
+ gear_dice_text, success_dice, botch_dice = make_dice_roll(dice_pool)
85
96
 
86
97
  @total_success_dice += success_dice
87
98
  @total_botch_dice += botch_dice
@@ -89,8 +100,9 @@ module BCDice
89
100
  @push_dice += (dice_pool - (success_dice + botch_dice))
90
101
 
91
102
  dice_count_text += "+(#{dice_pool}D6)"
92
- dice_text += "+#{modified_dice_text}"
103
+ dice_text += "+#{gear_dice_text}"
93
104
  end
105
+
94
106
  return make_result_text(command_type, dice_count_text, dice_text)
95
107
  end
96
108
 
@@ -108,18 +120,27 @@ module BCDice
108
120
  result_text = "#{dice_count_text} > #{dice_text} 成功数:#{@total_success_dice}"
109
121
  if @difficulty > 0
110
122
  if @total_success_dice >= @difficulty
111
- result_text = "#{result_text} 難易度=#{@difficulty}:判定成功!"
123
+ return Result.success("#{result_text} 難易度=#{@difficulty}:判定成功!")
112
124
  else
113
- result_text = "#{result_text} 難易度=#{@difficulty}:判定失敗!"
125
+ return Result.failure("#{result_text} 難易度=#{@difficulty}:判定失敗!")
114
126
  end
115
127
  end
116
128
  return result_text
117
129
  end
118
130
 
119
131
  def make_result_with_myz(dice_count_text, dice_text)
120
- result_text = make_result_with_yze(dice_count_text, dice_text)
132
+ result_text = "#{dice_count_text} > #{dice_text} 成功数:#{@total_success_dice}"
133
+ atter_text = "\n出目1:[能力:#{@base_botch_dice},技能:#{@skill_botch_dice},アイテム:#{@gear_botch_dice}) プッシュ可能=#{@push_dice}ダイス"
134
+
135
+ if @difficulty > 0
136
+ if @total_success_dice >= @difficulty
137
+ return Result.success("#{result_text} 難易度=#{@difficulty}:判定成功!#{atter_text}")
138
+ else
139
+ return Result.failure("#{result_text} 難易度=#{@difficulty}:判定失敗!#{atter_text}")
140
+ end
141
+ end
121
142
 
122
- return "#{result_text}\n出目1:[能力:#{@base_botch_dice},技能:#{@skill_botch_dice},アイテム:#{@gear_botch_dice}) プッシュ可能=#{@push_dice}ダイス"
143
+ return "#{result_text}#{atter_text}"
123
144
  end
124
145
 
125
146
  def make_dice_roll(dice_pool)
@@ -88,7 +88,7 @@ module BCDice
88
88
 
89
89
  add_dice_randomizer = CommonCommand::AddDice::Randomizer.new(@randomizer, self)
90
90
  total = node.lhs.eval(self, add_dice_randomizer)
91
- rand_values = @randomizer.rand_results.map(&:first)
91
+ rand_values = add_dice_randomizer.rand_results.map(&:value)
92
92
 
93
93
  n1 = count_fumble(rand_values, lucky_state)
94
94
  n_max = count_critical(rand_values, lucky_state)
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bcdice/base'
4
+
3
5
  module BCDice
4
6
  module GameSystem
5
7
  class ZettaiReido < Base
@@ -38,20 +40,23 @@ module BCDice
38
40
  mod, modText = getModInfo(modText)
39
41
  diff, diffText = getDiffInfo(diffValue)
40
42
 
41
- output = ""
42
- output += "(#{baseAvility}-2DR#{modText}#{diffText})"
43
- output += " > #{baseAvility}-#{diceTotal}[#{diceText}]#{modText}"
44
-
43
+ baseCommandText = "(#{baseAvility}-2DR#{modText}#{diffText})"
44
+ diceCommandText = "#{baseAvility}-#{diceTotal}[#{diceText}]#{modText}"
45
45
  total = baseAvility - diceTotal + mod
46
- output += " > #{total}"
47
46
 
48
- successText = getSuccessText(diceTotal, total, diff)
49
- output += successText
47
+ result = getResult(diceTotal, total, diff)
50
48
 
51
- darkPointText = getDarkPointResult(total, diff, darkPoint)
52
- output += darkPointText
49
+ darkPointText = "#{darkPoint}DP" if darkPoint > 0
53
50
 
54
- return output
51
+ result.text = [
52
+ baseCommandText,
53
+ diceCommandText,
54
+ total.to_i,
55
+ result.text,
56
+ darkPointText,
57
+ ].compact.join(" > ")
58
+
59
+ return result
55
60
  end
56
61
 
57
62
  def roll2DarkDice()
@@ -107,23 +112,13 @@ module BCDice
107
112
  return diffValue, diffText
108
113
  end
109
114
 
110
- def getDarkPointResult(_total, _diff, darkPoint)
111
- text = ''
112
-
113
- if darkPoint > 0
114
- text = " > #{darkPoint}DP"
115
- end
116
-
117
- return text
118
- end
119
-
120
- def getSuccessText(diceTotal, total, diff)
115
+ def getResult(diceTotal, total, diff)
121
116
  if diceTotal == 0
122
- return "クリティカル"
117
+ return Result.critical("クリティカル")
123
118
  end
124
119
 
125
120
  if diceTotal == 10
126
- return "ファンブル"
121
+ return Result.fumble("ファンブル")
127
122
  end
128
123
 
129
124
  if diff.nil?
@@ -132,10 +127,10 @@ module BCDice
132
127
 
133
128
  successLevel = (total - diff)
134
129
  if successLevel >= 0
135
- return "#{successLevel} 成功"
130
+ return Result.success("#{successLevel} 成功")
136
131
  end
137
132
 
138
- return ' > 失敗'
133
+ return Result.failure("失敗")
139
134
  end
140
135
  end
141
136
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class BeginningIdol < Base
6
+ class << self
7
+ private
8
+
9
+ # @params locale [Symbol]
10
+ # @return [ChainTable]
11
+ def translate_accessories_table(locale)
12
+ items = I18n.t("BeginningIdol.ACT.items", locale: locale)
13
+ subtables = [
14
+ DiceTable::D66Table.from_i18n("BeginningIdol.ACT.subtables.head", locale),
15
+ DiceTable::D66Table.from_i18n("BeginningIdol.ACT.subtables.hat", locale),
16
+ DiceTable::D66Table.from_i18n("BeginningIdol.ACT.subtables.body", locale),
17
+ DiceTable::D66Table.from_i18n("BeginningIdol.ACT.subtables.arm", locale),
18
+ DiceTable::D66Table.from_i18n("BeginningIdol.ACT.subtables.foot", locale),
19
+ DiceTable::D66Table.from_i18n("BeginningIdol.ACT.subtables.other", locale),
20
+ ]
21
+
22
+ ChainTable.new(
23
+ I18n.t("BeginningIdol.ACT.name", locale: locale),
24
+ "1D6",
25
+ items.zip(subtables)
26
+ )
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class BeginningIdol < Base
6
+ class BadStatusTable
7
+ def initialize(locale)
8
+ @locale = locale
9
+ end
10
+
11
+ def roll_command(randomizer, command)
12
+ m = /^BT(\d+)?$/.match(command)
13
+ unless m
14
+ return nil
15
+ end
16
+
17
+ roll_counts = m[1]&.to_i || 1
18
+ return roll(randomizer, roll_counts)
19
+ end
20
+
21
+ # @param randomizer [BCDice::Randomizer]
22
+ # @param counts [Integer]
23
+ def roll(randomizer, roll_counts = 1)
24
+ if roll_counts <= 0
25
+ return nil
26
+ end
27
+
28
+ name = I18n.t("BeginningIdol.BT.name", locale: @locale)
29
+ items = I18n.t("BeginningIdol.BT.items", locale: @locale)
30
+ prefix_format = I18n.t("BeginningIdol.BT.prefix_format", locale: @locale)
31
+
32
+ dice_list = randomizer.roll_barabara(roll_counts, 6).sort
33
+ index_list = dice_list.uniq
34
+
35
+ result_prefix = format(prefix_format, count_bad_status: index_list.size) + "\n" if index_list.size > 1
36
+ result_text = index_list.map { |i| items[i - 1] }.join("\n")
37
+
38
+ return "#{name} > [#{dice_list.join(',')}] > #{result_prefix}#{result_text}"
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end