bcdice 3.13.0 → 3.15.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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +104 -0
  3. data/i18n/Arianrhod/ko_kr.yml +3 -0
  4. data/i18n/Cthulhu/en_us.yml +11 -0
  5. data/i18n/Cthulhu/zh_hant.yml +1 -1
  6. data/i18n/CyberpunkRed/ja_jp.yml +389 -0
  7. data/i18n/CyberpunkRed/ko_kr.yml +389 -0
  8. data/i18n/DoubleCross/ja_jp.yml +53 -0
  9. data/i18n/DoubleCross/ko_kr.yml +52 -0
  10. data/i18n/FinalFantasyXIV/en_us.yml +4 -0
  11. data/i18n/FinalFantasyXIV/ja_jp.yml +4 -0
  12. data/i18n/FutariSousa/ja_jp.yml +284 -127
  13. data/i18n/KillDeathBusiness/ja_jp.yml +198 -0
  14. data/i18n/KizunaBullet/ja_jp.yml +653 -0
  15. data/i18n/MagicaLogia/ko_kr.yml +2 -2
  16. data/i18n/MonotoneMuseum/ja_jp.yml +246 -14
  17. data/i18n/MonotoneMuseum/ko_kr.yml +227 -0
  18. data/i18n/SkynautsBouken/ja_jp.yml +114 -0
  19. data/i18n/SkynautsBouken/ko_kr.yml +114 -0
  20. data/i18n/StratoShout/ko_kr.yml +102 -102
  21. data/i18n/TensaiGunshiNiNaro/ja_jp.yml +126 -0
  22. data/i18n/UnsungDuet/ja_jp.yml +62 -0
  23. data/i18n/UnsungDuet/ko_kr.yml +62 -0
  24. data/i18n/en_us.yml +5 -0
  25. data/i18n/zh_hant.yml +5 -0
  26. data/lib/bcdice/dice_table/range_table.rb +24 -0
  27. data/lib/bcdice/game_system/Agnostos.rb +248 -0
  28. data/lib/bcdice/game_system/Aionia.rb +131 -0
  29. data/lib/bcdice/game_system/AniMalus.rb +99 -59
  30. data/lib/bcdice/game_system/Arianrhod_Korean.rb +32 -0
  31. data/lib/bcdice/game_system/ArknightsFan.rb +245 -87
  32. data/lib/bcdice/game_system/BlackJacket.rb +244 -0
  33. data/lib/bcdice/game_system/BlackJacket_Korean.rb +244 -0
  34. data/lib/bcdice/game_system/CharonSanctions.rb +112 -0
  35. data/lib/bcdice/game_system/ConvictorDrive.rb +5 -4
  36. data/lib/bcdice/game_system/Cthulhu7th.rb +1 -1
  37. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional/full_auto.rb +293 -0
  38. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional/rollable.rb +43 -0
  39. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +470 -306
  40. data/lib/bcdice/game_system/Cthulhu_English.rb +59 -0
  41. data/lib/bcdice/game_system/CyberpunkRed.rb +15 -6
  42. data/lib/bcdice/game_system/CyberpunkRed_Korean.rb +66 -0
  43. data/lib/bcdice/game_system/DivineCharger.rb +841 -0
  44. data/lib/bcdice/game_system/DoubleCross.rb +18 -1
  45. data/lib/bcdice/game_system/DoubleCross_Korean.rb +5 -1
  46. data/lib/bcdice/game_system/FinalFantasyXIV.rb +115 -0
  47. data/lib/bcdice/game_system/FinalFantasyXIV_English.rb +39 -0
  48. data/lib/bcdice/game_system/FullFace.rb +63 -12
  49. data/lib/bcdice/game_system/FutariSousa.rb +105 -13
  50. data/lib/bcdice/game_system/Garactier.rb +479 -0
  51. data/lib/bcdice/game_system/GardenOrder.rb +390 -9
  52. data/lib/bcdice/game_system/GundogRevised.rb +8 -8
  53. data/lib/bcdice/game_system/Insane_Korean.rb +1 -1
  54. data/lib/bcdice/game_system/InvisibleLiar.rb +79 -0
  55. data/lib/bcdice/game_system/KillDeathBusiness.rb +155 -3
  56. data/lib/bcdice/game_system/KimitoYell.rb +568 -0
  57. data/lib/bcdice/game_system/KizunaBullet.rb +240 -0
  58. data/lib/bcdice/game_system/KyokoShinshoku.rb +51 -8
  59. data/lib/bcdice/game_system/Magius.rb +125 -0
  60. data/lib/bcdice/game_system/Magius_3rdNewTokyoCity.rb +62 -0
  61. data/lib/bcdice/game_system/MonotoneMuseum.rb +14 -1
  62. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
  63. data/lib/bcdice/game_system/NRR.rb +2 -2
  64. data/lib/bcdice/game_system/NSSQ.rb +17 -9
  65. data/lib/bcdice/game_system/NervWhitePaper.rb +129 -0
  66. data/lib/bcdice/game_system/RogueLikeHalf.rb +198 -0
  67. data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +16 -13
  68. data/lib/bcdice/game_system/ShinobiGami.rb +73 -43
  69. data/lib/bcdice/game_system/ShuumatsuBargainWars.rb +203 -0
  70. data/lib/bcdice/game_system/SkynautsBouken.rb +49 -134
  71. data/lib/bcdice/game_system/SkynautsBouken_Korean.rb +57 -0
  72. data/lib/bcdice/game_system/StratoShout_Korean.rb +1 -1
  73. data/lib/bcdice/game_system/SwordWorld.rb +5 -1
  74. data/lib/bcdice/game_system/SwordWorld2_5.rb +3 -2
  75. data/lib/bcdice/game_system/TensaiGunshiNiNaro.rb +262 -0
  76. data/lib/bcdice/game_system/TheIndieHack.rb +82 -0
  77. data/lib/bcdice/game_system/TheOneRing2nd.rb +406 -0
  78. data/lib/bcdice/game_system/TheUnofficialHollowKnightRPG.rb +185 -0
  79. data/lib/bcdice/game_system/TorgEternity.rb +35 -6
  80. data/lib/bcdice/game_system/TrailOfCthulhu.rb +139 -0
  81. data/lib/bcdice/game_system/UnsungDuet.rb +17 -75
  82. data/lib/bcdice/game_system/UnsungDuet_Korean.rb +41 -0
  83. data/lib/bcdice/game_system/Utakaze.rb +55 -2
  84. data/lib/bcdice/game_system/Warhammer4.rb +124 -3
  85. data/lib/bcdice/game_system/WoW.rb +161 -0
  86. data/lib/bcdice/game_system/YankeeMustDie.rb +192 -0
  87. data/lib/bcdice/game_system/YearZeroEngine.rb +225 -28
  88. data/lib/bcdice/game_system/Yotabana.rb +62 -0
  89. data/lib/bcdice/game_system/YuMyoKishi.rb +141 -0
  90. data/lib/bcdice/game_system/cyberpunk_red/tables.rb +111 -473
  91. data/lib/bcdice/game_system/kizuna_bullet/tables.rb +171 -0
  92. data/lib/bcdice/game_system/sword_world/rating_lexer.rb +1 -0
  93. data/lib/bcdice/game_system/sword_world/rating_options.rb +4 -1
  94. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +5 -0
  95. data/lib/bcdice/game_system/sword_world/rating_parser.rb +129 -115
  96. data/lib/bcdice/game_system.rb +31 -0
  97. data/lib/bcdice/version.rb +1 -1
  98. metadata +50 -6
@@ -0,0 +1,479 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Garactier < Base
6
+ # ゲームシステムの識別子
7
+ ID = "Garactier"
8
+
9
+ # ゲームシステム名
10
+ NAME = "ガラクティア"
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = "からくていあ"
14
+
15
+ HELP_MESSAGE = <<~TEXT
16
+ ガラクティアVer1.04
17
+ x:基準値
18
+ y:目標値
19
+ x, yについては四則演算の入力が可能
20
+
21
+ ■達成値の算出(GRx)
22
+ クリティカル・ファンブルの判定、達成値の表示を行う。
23
+ ■通常判定(GRx>=y)
24
+ 通常の判定を行う。
25
+ ■命中判定(GRHx>=y)
26
+ 命中判定を行う。
27
+ ■回避判定(GRDx>=y)
28
+ 回避判定を行う。
29
+ ■抵抗判定(GRMx>=y)
30
+ 抵抗判定を行う。
31
+ ■探索成功マスレベル算出(GRSx)
32
+ 探索・索敵判定時の最大成功マスレベル(ML)を算出する
33
+ ■ 表
34
+ アイテム決定表(ITMn)
35
+ ランクnのアイテム表を振る。例)ITM2 ランク2アイテム表
36
+ 上級アイテムの判定も行います。
37
+ 命中部位決定表(BUI)
38
+ 命中時の部位を決定します。
39
+ 増強可能施設決定表(SST)
40
+ 報告フェイズの増強可能施設を決定します。
41
+ TEXT
42
+
43
+ # アイテム用テーブル
44
+ ITEM_TABLES = {
45
+ 'ITM2' => DiceTable::D66Table.new(
46
+ 'ランク2アイテム決定表',
47
+ D66SortType::NO_SORT,
48
+ {
49
+ 11 => 'リペアスプレー',
50
+ 12 => '防壁シャボン',
51
+ 13 => '応援ボットちゃん',
52
+ 14 => '偵察ボットちゃん',
53
+ 15 => '回収ボットちゃん',
54
+ 16 => 'ブラストチャージャー',
55
+ 21 => '仕掛け爆弾',
56
+ 22 => 'おなじみドリル',
57
+ 23 => '清掃ボットちゃん',
58
+ 24 => '突撃ボットちゃん',
59
+ 25 => '修繕ボットちゃん',
60
+ 26 => 'アンプリファイア',
61
+ 31 => 'コバルトエール',
62
+ 32 => 'カステラ',
63
+ 33 => 'エアガン',
64
+ 34 => '安全靴',
65
+ 35 => 'ヘルメット',
66
+ 36 => 'フラッシュバルブ',
67
+ 41 => 'クリアワックス',
68
+ 42 => '目薬',
69
+ 43 => 'ラプチャーヒール',
70
+ 44 => '防弾盾',
71
+ 45 => 'プレートアーマー',
72
+ 46 => 'ホーリーチャーム',
73
+ 51 => 'カーネルシガー',
74
+ 52 => 'ニトロギャンディー',
75
+ 53 => '鉱樹の花飾り',
76
+ 54 => 'アンプルシューター',
77
+ 55 => 'メタル包帯',
78
+ 56 => '炸裂発煙筒',
79
+ 61 => 'シグナルドラッグ',
80
+ 62 => '毒手',
81
+ 63 => 'グルーガン',
82
+ 64 => '縫い針',
83
+ 65 => 'パイロン',
84
+ 66 => '☆上級品☆',
85
+ }
86
+ ),
87
+ 'ITM3' => DiceTable::D66Table.new(
88
+ 'ランク3アイテム決定表',
89
+ D66SortType::NO_SORT,
90
+ {
91
+ 11 => 'バナナ',
92
+ 12 => 'イージーバズーカ',
93
+ 13 => 'マルチバーニア',
94
+ 14 => '赤い鉢巻き',
95
+ 15 => 'カクテルポイズン',
96
+ 16 => 'リペアジェル',
97
+ 21 => '金砕棒',
98
+ 22 => 'オシャレステッキ',
99
+ 23 => '掃除機',
100
+ 24 => 'ソーラーキャップ',
101
+ 25 => 'タクティカルベスト',
102
+ 26 => 'ホイッスル',
103
+ 31 => 'パノラマバイザー',
104
+ 32 => 'フリーズランチャー',
105
+ 33 => 'オシャレスーツ',
106
+ 34 => '暗器',
107
+ 35 => '無限軌道',
108
+ 36 => 'イルミネーション',
109
+ 41 => '光線銃',
110
+ 42 => '十手',
111
+ 43 => '銅鑼',
112
+ 44 => 'オシャレハット',
113
+ 45 => '忍び足',
114
+ 46 => '釣り竿',
115
+ 51 => 'ブラックパウダー',
116
+ 52 => 'ダーティーマント',
117
+ 53 => 'バッテリーケイン',
118
+ 54 => 'バンデッドショルダー',
119
+ 55 => 'オシャレシューズ',
120
+ 56 => 'サテライト',
121
+ 61 => 'キーパーゴーレム',
122
+ 62 => '混迷香',
123
+ 63 => '応援旗',
124
+ 64 => '黒子頭巾',
125
+ 65 => 'バーナーランス',
126
+ 66 => '☆上級品☆',
127
+ }
128
+ ),
129
+ 'ITM4' => DiceTable::D66Table.new(
130
+ 'ランク4アイテム決定表',
131
+ D66SortType::NO_SORT,
132
+ {
133
+ 11 => '金塊',
134
+ 12 => 'パラボラアンテナ',
135
+ 13 => 'くらましの敷布',
136
+ 14 => '無影灯',
137
+ 15 => '油圧ショベル',
138
+ 16 => 'マシンテール',
139
+ 21 => '黒曜石の像',
140
+ 22 => '黄金のクローバー',
141
+ 23 => '朝霧の箒',
142
+ 24 => 'ヘッドキャノン',
143
+ 25 => 'レッグバルカン',
144
+ 26 => 'ダイナモブロック',
145
+ 31 => 'ジョウロ',
146
+ 32 => 'スナイパーライフル',
147
+ 33 => 'おてがるスコープ',
148
+ 34 => 'ドーザーブレード',
149
+ 35 => 'テツゲタ',
150
+ 36 => 'ジェットスラスター',
151
+ 41 => '宝剣',
152
+ 42 => '指揮棒',
153
+ 43 => '大兜',
154
+ 44 => '妖精さん',
155
+ 45 => 'ロングホーン',
156
+ 46 => '鎖がま',
157
+ 51 => '鳥籠',
158
+ 52 => 'カタパルトアーム',
159
+ 53 => 'スタンドマイク',
160
+ 54 => '臆病なカカシ',
161
+ 55 => 'ローラーダッシュ',
162
+ 56 => 'モミジ',
163
+ 61 => 'マスターキー',
164
+ 62 => '隠れ蓑',
165
+ 63 => '番傘',
166
+ 64 => '駆動甲冑',
167
+ 65 => '波紋の杖',
168
+ 66 => '☆上級品☆',
169
+ }
170
+ ),
171
+ 'ITM5' => DiceTable::D66Table.new(
172
+ 'ランク5アイテム決定表',
173
+ D66SortType::NO_SORT,
174
+ {
175
+ 11 => '因果の卵',
176
+ 12 => 'ランプ',
177
+ 13 => '常盤の琥珀',
178
+ 14 => '新緑の冠',
179
+ 15 => '萌芽の靴',
180
+ 16 => '星の骸',
181
+ 21 => '夜の帳',
182
+ 22 => 'スリップブローチ',
183
+ 23 => '拳法着',
184
+ 24 => 'めがね',
185
+ 25 => '白旗',
186
+ 26 => 'ディラックナイフ',
187
+ 31 => 'エレキドレッサー',
188
+ 32 => 'ネイルガン',
189
+ 33 => '木漏れ日のポプリ',
190
+ 34 => 'ミスリルピッケル',
191
+ 35 => 'デスマッチカフス',
192
+ 36 => 'アダムスキースカート',
193
+ 41 => '主砲',
194
+ 42 => 'マイクロポッド',
195
+ 43 => '樹皮の円盤',
196
+ 44 => 'リンゴと蛇の紋章',
197
+ 45 => 'セントリーガンナー',
198
+ 46 => '化生の仮面',
199
+ 51 => 'ガトリング',
200
+ 52 => 'オカモチ',
201
+ 53 => '芭蕉扇',
202
+ 54 => 'ハッピートリガー',
203
+ 55 => '蠢く湿布',
204
+ 56 => 'メガホン',
205
+ 61 => 'トランシーバー',
206
+ 62 => '好奇の鋲',
207
+ 63 => 'スレッジハンマー',
208
+ 64 => 'セントール',
209
+ 65 => 'ケーブルナイト',
210
+ 66 => '☆上級品☆',
211
+ }
212
+ ),
213
+ 'ITM6' => DiceTable::D66Table.new(
214
+ 'ランク6アイテム決定表',
215
+ D66SortType::NO_SORT,
216
+ {
217
+ 11 => '禍福の勾玉',
218
+ 12 => '祭壇',
219
+ 13 => 'ネジまき心臓',
220
+ 14 => 'まどろみの頭蓋',
221
+ 15 => '猛進拍車',
222
+ 16 => '炉心結晶',
223
+ 21 => '狂奔の鞭',
224
+ 22 => '暁のベル',
225
+ 23 => 'ネコシッポ',
226
+ 24 => '鬼蜘蛛',
227
+ 25 => '戦上手の脚',
228
+ 26 => '薄絹の外套',
229
+ 31 => 'ネコクロー',
230
+ 32 => 'クライムチャンバー',
231
+ 33 => '古の灯火',
232
+ 34 => 'かしこい触手',
233
+ 35 => 'オペラグラス',
234
+ 36 => '大鉄拳',
235
+ 41 => '妖刀',
236
+ 42 => 'ヘビーライター',
237
+ 43 => '緋緋色の針',
238
+ 44 => 'バーサクシール',
239
+ 45 => '光芒のアンクレット',
240
+ 46 => 'ネコブーツ',
241
+ 51 => '旅するコイン',
242
+ 52 => '光子鏡壁',
243
+ 53 => 'フェザージャケット',
244
+ 54 => 'レーザーミニオン',
245
+ 55 => 'マニピュレーター',
246
+ 56 => 'ランパートシールド',
247
+ 61 => '選定者の瞳',
248
+ 62 => '打ち上げ花火',
249
+ 63 => '魔笛',
250
+ 64 => '指輪',
251
+ 65 => 'ネコミミ',
252
+ 66 => '☆上級品☆',
253
+ }
254
+ ),
255
+ }.freeze()
256
+
257
+ # 施設表
258
+ SISETSU_TABLES = {
259
+ "SST" => DiceTable::Table.new(
260
+ "増強可能施設決定表",
261
+ "1D6",
262
+ [
263
+ '広場 マーケット 楽団',
264
+ '広場 ガレージ 鉄工所',
265
+ '広場 訓練場 農園 保健所',
266
+ '広場 学舎 骨董屋',
267
+ '広場 塗装工 菓子屋 貯蔵庫',
268
+ '広場 診療所 礼拝堂',
269
+ ]
270
+ ),
271
+ }.freeze
272
+
273
+ # 部位表
274
+ BUI_TABLES = {
275
+ "BUI" => DiceTable::Table.new(
276
+ "命中部位決定表",
277
+ "1D6",
278
+ [
279
+ '頭部',
280
+ '胴体',
281
+ '右腕',
282
+ '左腕',
283
+ '脚部',
284
+ '任意部位',
285
+ ]
286
+ ),
287
+ }.freeze
288
+
289
+ register_prefix('^GR[HDMS]?', 'ITM[2-6]', 'BUI', 'SST')
290
+
291
+ def eval_game_system_specific_command(command)
292
+ cmd_gr(command) ||
293
+ roll_item(command) ||
294
+ roll_tables(command, BUI_TABLES) ||
295
+ roll_tables(command, SISETSU_TABLES)
296
+ end
297
+
298
+ # GR系コマンドの分割
299
+ def cmd_gr(command)
300
+ case command
301
+ when /^GRS/
302
+ roll_search(command)
303
+ when /^GR[HDM]/
304
+ roll_target(command)
305
+ when /^GR/
306
+ roll_gr(command)
307
+ end
308
+ end
309
+
310
+ # 探索・索敵判定
311
+ def roll_search(command)
312
+ m = %r{^GRS([+-/*\d]+)?$}.match(command)
313
+ unless m
314
+ return nil
315
+ end
316
+
317
+ modifier = Arithmetic.eval(m[1] || "", RoundType::FLOOR) || 0
318
+
319
+ dice_result = roll_dice_with_modifier(modifier)
320
+ r = determine_no_target_result("S", dice_result[:total], dice_result[:critical], dice_result[:fumble])
321
+
322
+ r.text = "(#{m[0]}) > #{dice_result[:dice_sum]}[#{dice_result[:dice_list].join(',')}]#{m[1]} > #{dice_result[:total]} > #{r.text}"
323
+ return r
324
+ end
325
+
326
+ # 目標値を持つ判定ロール
327
+ def roll_target(command)
328
+ m = %r{^GR([HDM])([+-/*\d]+)?(?:>=?([+-/*\d]+)+)$}.match(command)
329
+ unless m
330
+ return nil
331
+ end
332
+
333
+ roll_type = m[1].to_str
334
+ modifier = Arithmetic.eval(m[2] || "", RoundType::FLOOR) || 0
335
+ target = Arithmetic.eval(m[3] || "", RoundType::FLOOR) || 0
336
+
337
+ dice_result = roll_dice_with_modifier(modifier)
338
+ r = determine_target_result(roll_type, dice_result[:total], target, dice_result[:critical], dice_result[:fumble])
339
+
340
+ r.text = "(#{m[0]}) > #{dice_result[:dice_sum]}[#{dice_result[:dice_list].join(',')}]#{m[2]} > #{dice_result[:total]} > #{r.text}"
341
+ return r
342
+ end
343
+
344
+ # GRのみの基本判定
345
+ def roll_gr(command)
346
+ m = %r{^GR([+-/*\d]+)?(>=)?\(?([+-/*\d]+)?\)?$}.match(command)
347
+ unless m
348
+ return nil
349
+ end
350
+
351
+ modifier = Arithmetic.eval(m[1] || "", RoundType::FLOOR) || 0
352
+
353
+ target_flag = !m[2].nil?
354
+ dice_result = roll_dice_with_modifier(modifier)
355
+
356
+ if target_flag
357
+ target = Arithmetic.eval(m[3] || "", RoundType::FLOOR) || 0
358
+ r = determine_target_result("", dice_result[:total], target, dice_result[:critical], dice_result[:fumble])
359
+ else
360
+ r = determine_no_target_result("", dice_result[:total], dice_result[:critical], dice_result[:fumble])
361
+ end
362
+ r.text = "(#{m[0]}) > #{dice_result[:dice_sum]}[#{dice_result[:dice_list].join(',')}]#{m[1]} > #{dice_result[:total]} > #{r.text}"
363
+ return r
364
+ end
365
+
366
+ # 基準値(modifier)をもとに2d6+基準値の判定を行う
367
+ def roll_dice_with_modifier(modifier)
368
+ dice_list = randomizer.roll_barabara(2, 6)
369
+ dice_sum = dice_list.sum
370
+ total = dice_sum + modifier
371
+ critical_flag = dice_list.count(6) == 2
372
+ fumble_flag = dice_list.count(1) == 2
373
+ return {dice_list: dice_list, dice_sum: dice_sum, total: total, critical: critical_flag, fumble: fumble_flag}
374
+ end
375
+
376
+ # roll_typeごとにResultを作成(目標値あり)
377
+ def determine_target_result(roll_type, total, target, critical, fumble)
378
+ case roll_type
379
+ when "H"
380
+ if critical
381
+ Result.critical("クリティカル命中")
382
+ elsif fumble
383
+ Result.fumble("ファンブル")
384
+ elsif total >= target + 4
385
+ Result.success("急所命中")
386
+ elsif total >= target
387
+ Result.success("命中")
388
+ else
389
+ Result.failure("失敗")
390
+ end
391
+ when "D"
392
+ if critical
393
+ Result.critical("クリティカル")
394
+ elsif fumble
395
+ Result.fumble("ファンブル")
396
+ elsif total >= target
397
+ Result.success("回避成功")
398
+ elsif total >= target - 4
399
+ Result.failure("半減命中")
400
+ else
401
+ Result.failure("失敗")
402
+ end
403
+ when "M"
404
+ # 抵抗判定は基準値以上(激情)のほうが悪い効果のことが多いためResultを反転[6,6]の場合にファンブル
405
+ if critical
406
+ Result.fumble("必ず激情")
407
+ elsif fumble
408
+ Result.critical("必ず平静")
409
+ elsif total >= target
410
+ Result.failure("激情")
411
+ else
412
+ Result.success("平静")
413
+ end
414
+ else
415
+ if critical
416
+ Result.critical("クリティカル")
417
+ elsif fumble
418
+ Result.fumble("ファンブル")
419
+ elsif total >= target
420
+ Result.success("成功")
421
+ else
422
+ Result.failure("失敗")
423
+ end
424
+ end
425
+ end
426
+
427
+ # roll_typeごとにResultを作成(目標値なし)
428
+ def determine_no_target_result(roll_type, total, critical, fumble)
429
+ case roll_type
430
+ when "S"
431
+ if critical
432
+ Result.critical("クリティカル")
433
+ elsif fumble
434
+ Result.fumble("ファンブル")
435
+ else
436
+ success_level = (total - 4) / 2
437
+ if success_level >= 11
438
+ success_level = 11
439
+ elsif success_level <= 0
440
+ success_level = 1
441
+ end
442
+ r = Result.new
443
+ r.text = "成功ML #{success_level}"
444
+ return r
445
+ end
446
+ else
447
+ if critical
448
+ Result.critical("クリティカル")
449
+ elsif fumble
450
+ Result.fumble("ファンブル")
451
+ else
452
+ r = Result.new
453
+ r.text = "達成値 #{total}"
454
+ return r
455
+ end
456
+ end
457
+ end
458
+
459
+ ## アイテム表ロール ランク
460
+ def roll_item(command)
461
+ unless command.include?("ITM")
462
+ return nil
463
+ end
464
+
465
+ # 1回目のアイテムロール
466
+ result = roll_tables(command, ITEM_TABLES)
467
+ # 上級判定
468
+ if result.include?("(66)")
469
+ result = roll_tables(command, ITEM_TABLES) + "*上級アイテム*"
470
+ end
471
+ # 選択判定
472
+ if result.include?("(66)")
473
+ result = "上級アイテムを自由選択!!"
474
+ end
475
+ return result
476
+ end
477
+ end
478
+ end
479
+ end