bcdice 3.1.0 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (160) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +78 -1
  3. data/README.md +1 -1
  4. data/i18n/MagicaLogia/zh_hans.yml +564 -0
  5. data/i18n/StellarKnights/ja_jp.yml +498 -0
  6. data/i18n/StellarKnights/ko_kr.yml +498 -0
  7. data/i18n/zh_hans.yml +7 -0
  8. data/lib/bcdice/command/parsed.rb +11 -3
  9. data/lib/bcdice/command/parser.rb +179 -100
  10. data/lib/bcdice/common_command/add_dice.rb +1 -1
  11. data/lib/bcdice/common_command/barabara_dice/node.rb +2 -2
  12. data/lib/bcdice/common_command/barabara_dice/result.rb +6 -0
  13. data/lib/bcdice/common_command/calc.rb +1 -1
  14. data/lib/bcdice/dice_table.rb +2 -0
  15. data/lib/bcdice/dice_table/d66_half_grid_table.rb +33 -0
  16. data/lib/bcdice/dice_table/d66_one_third_table.rb +34 -0
  17. data/lib/bcdice/dice_table/sai_fic_skill_table.rb +1 -1
  18. data/lib/bcdice/game_system.rb +6 -0
  19. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  20. data/lib/bcdice/game_system/Ainecadette.rb +68 -0
  21. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  22. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  23. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  24. data/lib/bcdice/game_system/Amadeus.rb +110 -93
  25. data/lib/bcdice/game_system/AngelGear.rb +2 -2
  26. data/lib/bcdice/game_system/AnimaAnimus.rb +16 -9
  27. data/lib/bcdice/game_system/Arianrhod.rb +6 -8
  28. data/lib/bcdice/game_system/Avandner.rb +1 -1
  29. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  30. data/lib/bcdice/game_system/BattleTech.rb +109 -28
  31. data/lib/bcdice/game_system/BeastBindTrinity.rb +28 -12
  32. data/lib/bcdice/game_system/BeginningIdol.rb +5 -5
  33. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +5 -5
  34. data/lib/bcdice/game_system/BladeOfArcana.rb +1 -1
  35. data/lib/bcdice/game_system/BlindMythos.rb +39 -38
  36. data/lib/bcdice/game_system/BloodCrusade.rb +6 -7
  37. data/lib/bcdice/game_system/BloodMoon.rb +9 -8
  38. data/lib/bcdice/game_system/CardRanker.rb +8 -7
  39. data/lib/bcdice/game_system/ChaosFlare.rb +21 -15
  40. data/lib/bcdice/game_system/Chill.rb +10 -10
  41. data/lib/bcdice/game_system/Chill3.rb +9 -9
  42. data/lib/bcdice/game_system/CodeLayerd.rb +39 -39
  43. data/lib/bcdice/game_system/ColossalHunter.rb +34 -47
  44. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  45. data/lib/bcdice/game_system/Cthulhu.rb +1 -1
  46. data/lib/bcdice/game_system/Cthulhu7th.rb +48 -10
  47. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +2 -2
  48. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +2 -2
  49. data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +1 -1
  50. data/lib/bcdice/game_system/Cthulhu_Korean.rb +1 -1
  51. data/lib/bcdice/game_system/DarkBlaze.rb +0 -11
  52. data/lib/bcdice/game_system/DarkDaysDrive.rb +8 -7
  53. data/lib/bcdice/game_system/DeadlineHeroes.rb +11 -10
  54. data/lib/bcdice/game_system/DemonParasite.rb +5 -13
  55. data/lib/bcdice/game_system/DesperateRun.rb +1 -1
  56. data/lib/bcdice/game_system/DoubleCross.rb +3 -1
  57. data/lib/bcdice/game_system/Dracurouge.rb +1 -1
  58. data/lib/bcdice/game_system/EclipsePhase.rb +14 -14
  59. data/lib/bcdice/game_system/Elric.rb +18 -14
  60. data/lib/bcdice/game_system/Elysion.rb +1 -1
  61. data/lib/bcdice/game_system/EmbryoMachine.rb +9 -8
  62. data/lib/bcdice/game_system/Emoklore.rb +25 -20
  63. data/lib/bcdice/game_system/Fiasco.rb +1 -1
  64. data/lib/bcdice/game_system/FilledWith.rb +205 -1272
  65. data/lib/bcdice/game_system/FutariSousa.rb +12 -10
  66. data/lib/bcdice/game_system/GURPS.rb +17 -28
  67. data/lib/bcdice/game_system/Garako.rb +1 -1
  68. data/lib/bcdice/game_system/GardenOrder.rb +12 -7
  69. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  70. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  71. data/lib/bcdice/game_system/Gorilla.rb +2 -8
  72. data/lib/bcdice/game_system/GranCrest.rb +18 -11
  73. data/lib/bcdice/game_system/Gundog.rb +9 -8
  74. data/lib/bcdice/game_system/GundogRevised.rb +10 -9
  75. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  76. data/lib/bcdice/game_system/GurpsFW.rb +16 -16
  77. data/lib/bcdice/game_system/HarnMaster.rb +19 -26
  78. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
  79. data/lib/bcdice/game_system/Hieizan.rb +12 -21
  80. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  81. data/lib/bcdice/game_system/HuntersMoon.rb +5 -10
  82. data/lib/bcdice/game_system/InfiniteFantasia.rb +19 -17
  83. data/lib/bcdice/game_system/Insane.rb +13 -20
  84. data/lib/bcdice/game_system/IthaWenUa.rb +8 -15
  85. data/lib/bcdice/game_system/JamesBond.rb +10 -10
  86. data/lib/bcdice/game_system/JekyllAndHyde.rb +1 -1
  87. data/lib/bcdice/game_system/Kamigakari.rb +1 -1
  88. data/lib/bcdice/game_system/KanColle.rb +4 -9
  89. data/lib/bcdice/game_system/KemonoNoMori.rb +26 -39
  90. data/lib/bcdice/game_system/KillDeathBusiness.rb +7 -15
  91. data/lib/bcdice/game_system/KurayamiCrying.rb +141 -2
  92. data/lib/bcdice/game_system/LiveraDoll.rb +254 -304
  93. data/lib/bcdice/game_system/LogHorizon.rb +13 -10
  94. data/lib/bcdice/game_system/MagicaLogia_SimplifiedChinese.rb +66 -0
  95. data/lib/bcdice/game_system/MeikyuDays.rb +10 -8
  96. data/lib/bcdice/game_system/MeikyuKingdom.rb +26 -26
  97. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +5 -4
  98. data/lib/bcdice/game_system/MetalHead.rb +12 -22
  99. data/lib/bcdice/game_system/MetalHeadExtream.rb +5 -5
  100. data/lib/bcdice/game_system/MonotoneMuseum.rb +8 -6
  101. data/lib/bcdice/game_system/Nechronica.rb +63 -90
  102. data/lib/bcdice/game_system/NinjaSlayer.rb +6 -7
  103. data/lib/bcdice/game_system/NjslyrBattle.rb +8 -11
  104. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  105. data/lib/bcdice/game_system/Paradiso.rb +3 -3
  106. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  107. data/lib/bcdice/game_system/Peekaboo.rb +4 -9
  108. data/lib/bcdice/game_system/Pendragon.rb +7 -7
  109. data/lib/bcdice/game_system/PhantasmAdventure.rb +8 -8
  110. data/lib/bcdice/game_system/Postman.rb +1 -1
  111. data/lib/bcdice/game_system/PulpCthulhu.rb +1 -1
  112. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  113. data/lib/bcdice/game_system/Revulture.rb +123 -0
  114. data/lib/bcdice/game_system/RuneQuest.rb +8 -8
  115. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  116. data/lib/bcdice/game_system/SRS.rb +17 -16
  117. data/lib/bcdice/game_system/SamsaraBallad.rb +38 -11
  118. data/lib/bcdice/game_system/Satasupe.rb +32 -32
  119. data/lib/bcdice/game_system/ScreamHighSchool.rb +5 -5
  120. data/lib/bcdice/game_system/SharedFantasia.rb +19 -23
  121. data/lib/bcdice/game_system/ShinobiGami.rb +14 -6
  122. data/lib/bcdice/game_system/Skynauts.rb +103 -142
  123. data/lib/bcdice/game_system/SkynautsBouken.rb +228 -0
  124. data/lib/bcdice/game_system/StarryDolls.rb +318 -0
  125. data/lib/bcdice/game_system/SteamPunkers.rb +11 -6
  126. data/lib/bcdice/game_system/StellarKnights.rb +85 -706
  127. data/lib/bcdice/game_system/StellarKnights_Korean.rb +79 -0
  128. data/lib/bcdice/game_system/SterileLife.rb +2 -3
  129. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +1 -1
  130. data/lib/bcdice/game_system/StratoShout.rb +8 -16
  131. data/lib/bcdice/game_system/Strave.rb +1 -1
  132. data/lib/bcdice/game_system/SwordWorld.rb +16 -7
  133. data/lib/bcdice/game_system/SwordWorld2_0.rb +2 -2
  134. data/lib/bcdice/game_system/SwordWorld2_5.rb +2 -2
  135. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  136. data/lib/bcdice/game_system/TokumeiTenkousei.rb +4 -3
  137. data/lib/bcdice/game_system/TokyoGhostResearch.rb +1 -1
  138. data/lib/bcdice/game_system/TrinitySeven.rb +279 -280
  139. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  140. data/lib/bcdice/game_system/Utakaze.rb +53 -48
  141. data/lib/bcdice/game_system/Villaciel.rb +1 -1
  142. data/lib/bcdice/game_system/WARPS.rb +11 -9
  143. data/lib/bcdice/game_system/WaresBlade.rb +4 -9
  144. data/lib/bcdice/game_system/Warhammer.rb +15 -6
  145. data/lib/bcdice/game_system/Warhammer4.rb +15 -11
  146. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  147. data/lib/bcdice/game_system/YankeeYogSothoth.rb +4 -9
  148. data/lib/bcdice/game_system/Yggdrasill.rb +1 -1
  149. data/lib/bcdice/game_system/ZettaiReido.rb +20 -25
  150. data/lib/bcdice/game_system/filled_with/enemy_data_tables.rb +322 -0
  151. data/lib/bcdice/game_system/filled_with/event_tables.rb +392 -0
  152. data/lib/bcdice/game_system/filled_with/tresure_tables.rb +179 -0
  153. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +1 -1
  154. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +4 -4
  155. data/lib/bcdice/game_system/sword_world/rating_parser.rb +1 -1
  156. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +26 -8
  157. data/lib/bcdice/repl.rb +1 -1
  158. data/lib/bcdice/result.rb +26 -0
  159. data/lib/bcdice/version.rb +1 -1
  160. metadata +18 -4
@@ -0,0 +1,228 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class SkynautsBouken < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'SkynautsBouken'
8
+
9
+ # ゲームシステム名
10
+ NAME = '歯車の塔の探空士(冒険企画局)'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'はくるまのとうのすかいのおつ2'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ・行為判定(nSNt#f) n:ダイス数(省略時2)、t:目標値(省略時7)、f:ファンブル値(省略時1)
18
+ 例)SN6#2 3SN
19
+ ・ダメージチェック (Dx/y@m) x:ダメージ範囲、y:攻撃回数
20
+   m:《弾道学》(省略可)上:8、下:2、左:4、右:6
21
+   例) D/4 D19/2 D/3@8 D[大揺れ]/2
22
+ ・回避(AVO@mダメージ)
23
+   m:回避方向(上:8、下:2、左:4、右:6)、ダメージ:ダメージチェック結果
24
+   例)AVO@8[1,4],[2,6],[3,8] AVO@2[6,4],[2,6]
25
+ ・FT ファンブル表(p76)
26
+ ・NV 航行表
27
+
28
+ ■ 判定セット
29
+ ・《回避運動》判定+回避(nSNt#f/AVO@ダメージ)
30
+   nSNt#f → 成功なら AVO@m
31
+   例)SN/AVO@8[1,4],[2,6],[3,8] 3SN#2/AVO@2[6,4],[2,6]
32
+ ・砲撃判定+ダメージチェック (nSNt#f/Dx/y@m)
33
+   行為判定の出目変更タイミングを逃すので要GMの許可
34
+   nSNt#f → 成功なら Dx/y@m
35
+   例)SN/D/4 3SN#2/D[大揺れ]/2
36
+ MESSAGETEXT
37
+
38
+ TABLES = {
39
+ 'FT' => DiceTable::Table.new(
40
+ 'ファンブル表',
41
+ '1D6', [
42
+ "なんとか大事にはいたらなかった。通常の失敗と同様の処理を行うこと。",
43
+ "転んでしまった。キミは[転倒](p107)する。",
44
+ "失敗にイライラしてしまった。キミは獲得している【キズナ】1つの「支援チェック」にチェックを入れる。",
45
+ "自身のいるマスを[破損](p104)させる。この[破損]によって、キミの【生命点】は減少しない。",
46
+ "頭をぶつけてしまった。キミの【生命点】を「1d6点」減少する。",
47
+ "奇跡的な結果。 この行為判定は成功となる。",
48
+ ]
49
+ ),
50
+ 'NV' => DiceTable::Table.new(
51
+ '航海表',
52
+ '1d6',
53
+ [
54
+ 'スポット1つ分進む',
55
+ 'スポット1つ分進む',
56
+ 'スポット1つ分進む',
57
+ 'スポット2つ分進む',
58
+ 'スポット2つ分進む',
59
+ 'スポット3つ分進む',
60
+ ]
61
+ )
62
+ }.freeze
63
+
64
+ register_prefix('D', '\d?SN', 'NV', 'FT', 'AVO')
65
+
66
+ def initialize(command)
67
+ super(command)
68
+ @round_type = RoundType::FLOOR # 端数切り捨て
69
+ end
70
+
71
+ def eval_game_system_specific_command(command)
72
+ command_sn(command) || command_d(command) || command_avo(command) || command_snavo(command) ||
73
+ command_snd(command) || roll_tables(command, TABLES)
74
+ end
75
+
76
+ private
77
+
78
+ DIRECTION_INFOS = {
79
+ 0 => {name: "", position_diff: [0, 0]},
80
+ 1 => {name: "左下", position_diff: [-1, +1]},
81
+ 2 => {name: "下", position_diff: [0, +1]},
82
+ 3 => {name: "右下", position_diff: [+1, +1]},
83
+ 4 => {name: "左", position_diff: [-1, 0]},
84
+ 5 => {name: "", position_diff: [0, 0]},
85
+ 6 => {name: "右", position_diff: [+1, 0]},
86
+ 7 => {name: "左上", position_diff: [-1, -1]},
87
+ 8 => {name: "上", position_diff: [0, -1]},
88
+ 9 => {name: "右上", position_diff: [+1, -1]},
89
+ }.freeze
90
+
91
+ D_REGEXP = %r{^D([1-46-9]{0,8})(\[.+\]|S|F|SF|FS)?/(\d{1,2})(@([2468]))?$}.freeze
92
+
93
+ def command_sn(command)
94
+ debug("SN", command)
95
+ cmd = Command::Parser.new(/[1-9]?SN(\d{0,2})/, round_type: round_type)
96
+ .restrict_cmp_op_to(nil)
97
+ .enable_fumble.parse(command)
98
+ return nil unless cmd
99
+
100
+ # [dice_count]SN[target]
101
+ dice_count, target = cmd.command.split("SN", 2).map(&:to_i)
102
+ dice_count = 2 if dice_count == 0
103
+ target = 7 if target == 0
104
+ fumble = cmd.fumble.nil? ? 1 : cmd.fumble
105
+
106
+ debug("SN Parsed", dice_count, target, fumble)
107
+
108
+ dice_list = @randomizer.roll_barabara(dice_count, 6)
109
+ dice_top_two = dice_list.sort[-2..-1]
110
+ res = if dice_top_two == [6, 6]
111
+ Result.critical("スペシャル(【生命点】1d6回復)")
112
+ elsif dice_list.max <= fumble
113
+ Result.fumble("ファンブル(ファンブル表FT)")
114
+ elsif dice_top_two.sum >= target
115
+ Result.success("成功")
116
+ else
117
+ Result.failure("失敗")
118
+ end
119
+
120
+ if dice_count == 2
121
+ res.text = ["(#{dice_count}SN#{target}##{fumble})", "#{dice_top_two.sum}[#{dice_list.join(',')}]", res.text]
122
+ .compact.join(" > ")
123
+ else
124
+ res.text = ["(#{dice_count}SN#{target}##{fumble})", "[" + dice_list.join(",") + "]", "#{dice_top_two.sum}[#{dice_top_two.join(',')}]", res.text]
125
+ .compact.join(" > ")
126
+ end
127
+ res
128
+ end
129
+
130
+ def command_d(command)
131
+ m = D_REGEXP.match(command)
132
+ return nil unless m
133
+
134
+ fire_count = m[3].to_i # 砲撃回数
135
+ fire_range = m[1].to_s # 砲撃範囲
136
+ ballistics = m[5].to_i # 《弾道学》
137
+
138
+ points = get_fire_points(fire_count, fire_range)
139
+ command = command.sub("SF/", "[大揺れ,火災]/").sub("FS/", "[火災,大揺れ]/").sub("F/", "[火災]/").sub("S/", "[大揺れ]/")
140
+ result = ["(#{command})", get_points_text(points, 0, 0)]
141
+ if ballistics != 0
142
+ dir = DIRECTION_INFOS[ballistics]
143
+ diff_x, diff_y = dir[:position_diff]
144
+ result[-1] += "\n"
145
+ result << "《弾道学》#{dir[:name]}"
146
+ result << get_points_text(points, diff_x, diff_y)
147
+ end
148
+
149
+ result.compact.join(" > ")
150
+ end
151
+
152
+ def command_avo(command)
153
+ debug("AVO", command)
154
+ dmg = command.match(/^AVO@([2468])(.*?)$/)
155
+ return nil unless dmg
156
+
157
+ dir = DIRECTION_INFOS[dmg[1].to_i]
158
+ diff_x, diff_y = dir[:position_diff]
159
+ "《回避運動》#{dir[:name]} > " + dmg[2].gsub(/\(?\[(\d),(\d{1,2})\]\)?/) do
160
+ y = Regexp.last_match(1).to_i + diff_y
161
+ x = Regexp.last_match(2).to_i + diff_x
162
+ get_xy_text(x, y)
163
+ end
164
+ end
165
+
166
+ def command_snavo(command)
167
+ sn, avo = command.split(%r{/?AVO}, 2)
168
+ debug("SNAVO", sn, avo)
169
+ am = /^@([2468])(.*?)$/.match(avo)
170
+ return nil unless am
171
+
172
+ res = command_sn(sn)
173
+ return nil unless res
174
+
175
+ if res.success?
176
+ res.text += "\n > " + command_avo("AVO" + avo)
177
+ end
178
+ res
179
+ end
180
+
181
+ def command_snd(command)
182
+ sn, d = command.split(%r{/?D}, 2)
183
+ debug("SND", sn, d)
184
+ m = D_REGEXP.match("D#{d}")
185
+ return nil unless m
186
+
187
+ res = command_sn(sn)
188
+ return nil unless res
189
+
190
+ if res.success?
191
+ res.text += "\n > #{command_d('D' + d)}"
192
+ end
193
+ res
194
+ end
195
+
196
+ def get_points_text(points, diff_x, diff_y)
197
+ "[縦,横]=" + points.map do |list|
198
+ list.map do |x, y|
199
+ get_xy_text(x + diff_x, y + diff_y)
200
+ end.join()
201
+ end.join(",")
202
+ end
203
+
204
+ # 範囲内なら[y,x]、範囲外なら([y,x])と表示
205
+ def get_xy_text(x, y)
206
+ if (2..12).include?(x) && (1..6).include?(y)
207
+ "[#{y},#{x}]"
208
+ else
209
+ "([#{y},#{x}])"
210
+ end
211
+ end
212
+
213
+ # 命中場所と範囲から、ダメージ位置を割り出す
214
+ def get_fire_points(fire_count, fire_range)
215
+ range = fire_range.chars.map(&:to_i)
216
+ fire_count.times.map do
217
+ y = @randomizer.roll_once(6) # 縦
218
+ x = @randomizer.roll_sum(2, 6) # 横
219
+
220
+ [[x, y]] + range.map do |r|
221
+ xdiff, ydiff = DIRECTION_INFOS[r][:position_diff]
222
+ [x + xdiff, y + ydiff]
223
+ end
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end
@@ -0,0 +1,318 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/dice_table/chain_table"
4
+ require "bcdice/dice_table/sai_fic_skill_table"
5
+ require "bcdice/dice_table/table"
6
+ require "bcdice/format"
7
+
8
+ module BCDice
9
+ module GameSystem
10
+ class StarryDolls < Base
11
+ # ゲームシステムの識別子
12
+ ID = "StarryDolls"
13
+
14
+ # ゲームシステム名
15
+ NAME = "スタリィドール"
16
+
17
+ # ゲームシステム名の読みがな
18
+ SORT_KEY = "すたりいとおる"
19
+
20
+ # ダイスボットの使い方
21
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
22
+ ・行為判定 nD6±m@s>=t
23
+  nD6の行為判定を行う。スペシャル/ファンブル/成功/失敗を判定。
24
+   n: ダイス数
25
+   m: 修正(省略可)
26
+   s: スペシャル値(省略時 12)
27
+   t: 目標値(?指定可)
28
+ ・各種表
29
+  ・ランダム特技決定表 RTTn (n:分野番号、省略可能)
30
+    1願望 2元素 3星使い 4動作 5召喚 6人間性
31
+  ・ランダム分野表 RCT
32
+  ・ランダム星座表 HOR
33
+    ランダム星座表A HORA/ランダム星座表B HORB
34
+  ・主人関係表 MRT/関係属性表 RAT
35
+  ・奇跡表 MIR
36
+  ・戦果表 BRT
37
+  ・事件表 TRO
38
+  ・遭遇表 ENC
39
+  ・致命傷表 FWT
40
+  ・カタストロフ表 CAT
41
+  ・回想表
42
+    〈魔術師の庭〉回想表 JDSRT/〈セブンス・ヘブン〉回想表 SHRT
43
+    /〈祝福の鐘〉回想表 BCRT/〈オメガ探偵社〉回想表 ODRT
44
+ ・D66ダイスあり
45
+ INFO_MESSAGE_TEXT
46
+
47
+ def initialize(command)
48
+ super(command)
49
+
50
+ @d66_sort_type = D66SortType::ASC
51
+ end
52
+
53
+ def eval_game_system_specific_command(command)
54
+ action_roll(command) ||
55
+ roll_tables(command, TABLES) ||
56
+ RTT.roll_command(@randomizer, command)
57
+ end
58
+
59
+ private
60
+
61
+ SPECIAL = "スペシャル(【星命力】を1D6点回復)"
62
+ FUMBLE = "ファンブル(ランダムなサインが【蝕】状態へ変化)"
63
+
64
+ RTT = DiceTable::SaiFicSkillTable.new(
65
+ [
66
+ ["願望", ["創造", "研究", "守護", "絆", "*かに座", "夢", "*しし座", "自由", "恋愛", "脚光", "世界"]],
67
+ ["元素", ["光", "雷", "*ふたご座", "水", "火", "風", "木", "氷", "*おとめ座", "土", "闇"]],
68
+ ["星使い", ["*おうし座", "幸運", "幻影", "テレパシー", "予知夢", "星読み", "治癒", "天候", "変身", "時間停止", "*てんびん座"]],
69
+ ["動作", ["*おひつじ座", "精密", "高速", "怪力", "隠密", "飛行", "言霊", "模倣", "軽業", "歌舞", "*さそり座"]],
70
+ ["召喚", ["リボン", "照明具", "*うお座", "料理", "獣", "花", "乗り物", "書物", "*いて座", "武器", "財宝"]],
71
+ ["人間性", ["勇気", "知恵", "熱意", "調和", "*みずがめ座", "愛情", "*やぎ座", "センス", "根気", "礼節", "理性"]],
72
+ ]
73
+ )
74
+
75
+ def action_roll(command)
76
+ parser = Command::Parser.new("D6", round_type: round_type)
77
+ .has_prefix_number
78
+ .restrict_cmp_op_to(:>=)
79
+ .enable_critical
80
+ .enable_question_target
81
+ cmd = parser.parse(command)
82
+ return nil unless cmd
83
+
84
+ times = cmd.prefix_number
85
+ return nil if times < 1
86
+
87
+ fumble = 2
88
+ special = cmd.critical || 12
89
+
90
+ if special <= fumble
91
+ special = fumble + 1 # p.180
92
+ cmd.critical = special
93
+ end
94
+
95
+ dice_list = @randomizer.roll_barabara(times, 6)
96
+ dice_total = dice_list.sum()
97
+ total = dice_total + cmd.modify_number
98
+
99
+ result =
100
+ if dice_total <= fumble
101
+ Result.fumble(FUMBLE)
102
+ elsif dice_total >= special
103
+ Result.critical(SPECIAL)
104
+ elsif cmd.question_target?
105
+ Result.new
106
+ elsif total >= cmd.target_number
107
+ Result.success("成功")
108
+ else
109
+ Result.failure("失敗")
110
+ end
111
+
112
+ sequence = [
113
+ "(#{cmd.to_s(:after_modify_number)})",
114
+ "#{dice_total}[#{dice_list.join(',')}]#{Format.modifier(cmd.modify_number)}",
115
+ total,
116
+ result.text
117
+ ].compact
118
+
119
+ result.text = sequence.join(" > ")
120
+ result
121
+ end
122
+
123
+ HOR_TABLE_A = DiceTable::Table.new(
124
+ "ランダム星座表A", # p.177
125
+ "1D6",
126
+ [
127
+ "おひつじ座",
128
+ "おうし座",
129
+ "ふたご座",
130
+ "かに座",
131
+ "しし座",
132
+ "おとめ座",
133
+ ]
134
+ )
135
+
136
+ HOR_TABLE_B = DiceTable::Table.new(
137
+ "ランダム星座表B", # p.177
138
+ "1D6",
139
+ [
140
+ "てんびん座",
141
+ "さそり座",
142
+ "いて座",
143
+ "やぎ座",
144
+ "みずがめ座",
145
+ "うお座",
146
+ ]
147
+ )
148
+
149
+ TABLES = {
150
+ "HORA" => HOR_TABLE_A,
151
+ "HORB" => HOR_TABLE_B,
152
+ "HOR" => DiceTable::ChainTable.new(
153
+ "ランダム星座表", # p.177
154
+ "1D6",
155
+ [
156
+ HOR_TABLE_A,
157
+ HOR_TABLE_A,
158
+ HOR_TABLE_A,
159
+ HOR_TABLE_B,
160
+ HOR_TABLE_B,
161
+ HOR_TABLE_B,
162
+ ]
163
+ ),
164
+ "MRT" => DiceTable::Table.new(
165
+ "主人関係表", # p.186
166
+ "1D6",
167
+ [
168
+ "親",
169
+ "友人",
170
+ "恩師",
171
+ "相棒",
172
+ "上司",
173
+ "恋人",
174
+ ]
175
+ ),
176
+ "RAT" => DiceTable::Table.new(
177
+ "関係属性表", # p.186
178
+ "1D6",
179
+ [
180
+ "尊敬/優越感",
181
+ "理解/反抗",
182
+ "愉快/恐怖",
183
+ "友情/競争",
184
+ "恋心/不気味",
185
+ "庇護/劣等感",
186
+ ]
187
+ ),
188
+ "MIR" => DiceTable::Table.new(
189
+ "奇跡表", # p.177
190
+ "1D6",
191
+ [
192
+ "空から降る一筋の光が星人形の体を包み込み、不思議な力を与えてくれる。",
193
+ "守護星座に関連する人や動物が現れ、星人形に力を貸してくれる。",
194
+ "運命が不自然なまでに星人形の味方をし、すべてが上手く進んでいく。",
195
+ "星人形の必要とするものが空中から次々と現れる。",
196
+ "少しの間だけ〈劇場〉の住人が正気に戻り、一致団結して星人形に協力してくれる。",
197
+ "体中に星命力が溢れ出し、限界を超えた大規模な星術を扱えるようになる。",
198
+ ]
199
+ ),
200
+ "BRT" => DiceTable::Table.new(
201
+ "戦果表", # p.191
202
+ "1D6",
203
+ [
204
+ "所持しているアイテムから一つを選び、同じものをもう一つ獲得する。所持していない場合はもう一度戦果表を使用する。",
205
+ "時計を獲得する。",
206
+ "ロザリオを獲得する。",
207
+ "コンパスを獲得する。",
208
+ "星の欠片を獲得する。",
209
+ "自由なアイテムを一つ獲得する。",
210
+ ]
211
+ ),
212
+ "TRO" => DiceTable::Table.new(
213
+ "事件表", # p.193
214
+ "2D6",
215
+ [
216
+ "〈変晶体〉を手にした途端、人形兵の軍勢に見つかり追われることに……! なんとかして振り切ろう!",
217
+ "〈変晶体〉を乗せた物体が空を飛んでいる。接触する方法はないだろうか。",
218
+ "不気味な商人が現れた。価値あるものを差し出せば、〈変晶体〉と交換してくれるという。上手く交渉しよう。",
219
+ "〈変晶体〉の影響で理性を失った人々が大喧嘩をしている。これでは浄化するのも困難だ……仲間と協力して仲裁しよう。",
220
+ "〈変晶体〉は建物の中にあるようだが、警備が厳重だ。どうやって侵入しようか……。",
221
+ "罪のない人たちが〈変晶体〉を持つ敵に捕らわれているようだ。仲間と共に人々を助け出し、〈変晶体〉を浄化しよう。",
222
+ "〈変晶体〉に操られた人々がこちらへ敵意の目を向けている。危害は加えたくないが、一体どうすれば……!",
223
+ "〈変晶体〉に取り憑かれた動物が、仲間に襲いかかった! 早く助け出さなければ!",
224
+ "仲間が敵にさらわれてしまった! 敵は〈変晶体〉も持っているようだ。追跡して仲間を助けなければ!",
225
+ "入り組んだ場所に迷い込んでしまった。〈変晶体〉の気配は近いはずだが、どこにあるのだろう?",
226
+ "〈変晶体〉は深い水の底に沈んでいるようだ。浄化する方法はないだろうか……。",
227
+ ]
228
+ ),
229
+ "ENC" => DiceTable::Table.new(
230
+ "遭遇表", # p.193
231
+ "1D6",
232
+ [
233
+ "『弁士』コオロギのパルランテ\n指定特技: 《調和/人間性5》\n効果: プラネタリカードルール非採用時、このセッション中【運命力】を1点上昇させる。\nプラネタリカードルール採用時、ベネフィックを1枚獲得する。",
234
+ "『航空士』鳩のコロンボ\n指定特技: 《熱意/人間性4》\n効果: コンパスを1つ獲得する。",
235
+ "『医者』カラスのコルヴォ\n指定特技: 《礼節/人間性11》\n効果: 星の欠片を1つ獲得する。",
236
+ "『御者』むく犬のメドーラ\n指定特技: 《知恵/人間性3》\n効果: 時計を1つ獲得する。",
237
+ "『道化』ピエロのアルレッキーノ\n指定特技: 《センス/人間性9》\n効果: 【関係】の使用チェックをすべてはずす。使用チェックがなければ、アルレッキーノに【関係】を獲得する。",
238
+ "『少女』ヤギのカプレッティーナ\n指定特技: 《愛情/人間性7》\n効果: ロザリオを1つ獲得する。",
239
+ ]
240
+ ),
241
+ "FWT" => DiceTable::Table.new(
242
+ "致命傷表", # p.184
243
+ "1D6",
244
+ [
245
+ "敵の攻撃は星人形の瞳を直撃し、宝石は鮮血のごとく砕け散った。PCは形骸化する。",
246
+ "なんとか致命傷は免れたが、もう戦闘は難しそうだ……。PCは戦闘から脱落する。",
247
+ "最後の力をふり絞り、星人形は持っていたものを仲間へ投げ渡した。PCは所持しているアイテムを誰かに譲渡したのち戦闘から脱落する。",
248
+ "星人形は自分の気持ちを誰かに託しながら、地面に倒れ込んだ。仲間のうち誰か一人がPCに対する【関係】を獲得したのち、PCは戦闘から脱落する。",
249
+ "ただでやられるわけにはいかない……! 星人形は捨て身の攻撃を放つ。PCはエネミー1体に霧装の【耐久値】と同じダメージを与えたのち、戦闘から脱落する。",
250
+ "こんなところで倒れるわけにはいかない。星人形は【星命力】1点で戦闘に復帰する。再度【星命力】が0になった場合、PCは致命傷表を使用せず戦闘から脱落する。",
251
+ ]
252
+ ),
253
+ "CAT" => DiceTable::Table.new(
254
+ "カタストロフ表", # p.198
255
+ "1D6",
256
+ [
257
+ "〈劇場〉全体が大きく揺れ、空間に裂け目が生じる。現実は塗り替えられ……〈変容区〉と化した。最も恐れていた事態に、星人形たちは呆然と立ち尽くすほかなかった。",
258
+ "激しい地鳴りと共に人形兵たちの増援が押し寄せ、形成が逆転してしまう。星人形たちはやむを得ず〈劇場〉を後にした。",
259
+ "「時間切れです」戦場に〈悪魔派〉がやってきた。星座の加護は遮られ、星人形の体から力が抜けていく。「いずれまた」という声を最後に星人形の意識は途絶え……現実世界で目を覚ました。",
260
+ "突如〈型堕ち〉が苦しみ始め、体に残っていた〈悪夢の霧〉を爆発させた。意識を失った星人形たちが目覚めたのは現実世界だった。……まだ再挑戦する時間はあるはずだ。",
261
+ "〈型堕ち〉は自分を制御できなくなり、〈悪夢の霧〉に呑まれて姿を消してしまった。主を失った〈劇場〉は成長も衰退もしないまま、鏡の中に残り続けることになるだろう。",
262
+ "〈型堕ち〉の体は膨張する〈悪夢の霧〉の圧力に耐えきれず、宝石を内側から破壊してしまった。〈型堕ち〉に残された命はあとわずかだ。星人形は〈型堕ち〉の最期を看取ることになる。",
263
+ ]
264
+ ),
265
+ "JDSRT" => DiceTable::Table.new(
266
+ "〈魔術師の庭〉回想表", # p.187
267
+ "1D6",
268
+ [
269
+ "仕事に必要な道具が不足し、急遽買い出しへ。荷物が重くなりそうだからと、キーNPCも手伝ってくれることになった。",
270
+ "キーNPCはあなたの仕事に感謝し、プレゼントを贈ってくれた。箱の中身はキーNPCのお気に入りの一品らしい。",
271
+ "主人はお客さんと話し込んでいる。あなたが部屋の片隅で退屈そうにしていると、キーNPCと目が合った。",
272
+ "整備作業がひと区切りついたところで、キーNPCがお茶とお菓子を持ってきてくれた。少し休憩しよう。",
273
+ "整備中、星人形の体に傷が見つかった。どこで付けたのだろう? あなたはキーNPCに聞いてみることにした。",
274
+ "部屋を移動中、あるものが目に留まる。それはキーNPCにとって思い出深いものであるようだ。",
275
+ ]
276
+ ),
277
+ "SHRT" => DiceTable::Table.new(
278
+ "〈セブンス・ヘブン〉回想表", # p.187
279
+ "1D6",
280
+ [
281
+ "掃除をしていたら、お家のものを引っ掛けて壊してしまった! そこへキーNPCがやってきて……。",
282
+ "キーNPCはちょっとお疲れの様子。あなたはお茶とお菓子を持って労ってあげることにした。",
283
+ "料理の材料を取りたいのに、棚に手が届かない……。あなたはキーNPCに助けを求めた。",
284
+ "キーNPCの仕事をお手伝い。こんな体験は初めてだ! あなたはワクワクしながら挑戦する。",
285
+ "お客さんの星人形に制服を貸し出して、一緒に写真撮影をすることに。照れてるだろうか? それともノリノリ?",
286
+ "今日はセブンス・ヘブンのファン感謝イベント。会場には、差し入れを持ったキーNPCの姿もあった。",
287
+ ]
288
+ ),
289
+ "BCRT" => DiceTable::Table.new(
290
+ "〈祝福の鐘〉回想表", # p.187
291
+ "1D6",
292
+ [
293
+ "終演後のエントランスで挨拶をしていると、キーNPCが誰かと話し込んでいる。ちょっと様子を見に行こう。",
294
+ "次の公演に向けて衣装合わせ。どんな役をやる? 衣装のフィット具合はどう? 確認していると、キーNPCが様子を見にやってきた。",
295
+ "基礎練習。地道なルーチンワークの間、スパイスとなるのはキーNPCとのおしゃべりだ。",
296
+ "学校での公演。終わったあと、子どもたちに囲まれてもみくちゃになる。キーNPCは、子どもが好きだったっけ?",
297
+ "地方巡業。一緒に移動するキーNPCと、あれこれ話し込んでいると、意外な話題に移っていって……。",
298
+ "撤収作業も終わりに近づくステージの上。誰もいない客席に向けて、キーNPCが遠い目をしている。",
299
+ ]
300
+ ),
301
+ "ODRT" => DiceTable::Table.new(
302
+ "〈オメガ探偵社〉回想表", # p.187
303
+ "1D6",
304
+ [
305
+ "事件調査のため、キーNPCに聞き込み。何か有益な情報は出るだろうか。世間話になってしまうかも?",
306
+ "依頼もなく平和な探偵事務所へ、キーNPCがやってきた。これが事件の序章に……なるんだろうか?",
307
+ "みんなで、近所の家のペット探し。キーNPCの見知ったペットらしく、ちょっと心配そうな顔をしている。",
308
+ "警察の事件調査を手伝うことに。キーNPCは、事件の重要参考人として呼び出されているようだ。",
309
+ "地道な張り込み調査をしているところへ、キーNPCがやってきた。あなたに差し入れもあるようだ。",
310
+ "華麗なる事件解決! 主人の推理をたくさん手伝うことができた。キーNPCも、あなたに一目置いてくれそう。",
311
+ ]
312
+ ),
313
+ }.freeze
314
+
315
+ register_prefix('\d+D6', RTT.prefixes, TABLES.keys)
316
+ end
317
+ end
318
+ end