bcdice 3.13.0 → 3.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -0
  3. data/i18n/Arianrhod/ko_kr.yml +3 -0
  4. data/i18n/Cthulhu/en_us.yml +11 -0
  5. data/i18n/CyberpunkRed/ja_jp.yml +389 -0
  6. data/i18n/FinalFantasyXIV/en_us.yml +4 -0
  7. data/i18n/FinalFantasyXIV/ja_jp.yml +4 -0
  8. data/i18n/FutariSousa/ja_jp.yml +158 -1
  9. data/i18n/KizunaBullet/ja_jp.yml +653 -0
  10. data/i18n/MonotoneMuseum/ja_jp.yml +246 -14
  11. data/i18n/SkynautsBouken/ja_jp.yml +114 -0
  12. data/i18n/TensaiGunshiNiNaro/ja_jp.yml +126 -0
  13. data/i18n/UnsungDuet/ja_jp.yml +62 -0
  14. data/i18n/UnsungDuet/ko_kr.yml +62 -0
  15. data/i18n/en_us.yml +5 -0
  16. data/lib/bcdice/dice_table/range_table.rb +24 -0
  17. data/lib/bcdice/game_system/Agnostos.rb +248 -0
  18. data/lib/bcdice/game_system/AniMalus.rb +99 -59
  19. data/lib/bcdice/game_system/Arianrhod_Korean.rb +30 -0
  20. data/lib/bcdice/game_system/BlackJacket.rb +244 -0
  21. data/lib/bcdice/game_system/ConvictorDrive.rb +5 -4
  22. data/lib/bcdice/game_system/Cthulhu_English.rb +59 -0
  23. data/lib/bcdice/game_system/CyberpunkRed.rb +14 -4
  24. data/lib/bcdice/game_system/DivineCharger.rb +841 -0
  25. data/lib/bcdice/game_system/FinalFantasyXIV.rb +115 -0
  26. data/lib/bcdice/game_system/FinalFantasyXIV_English.rb +39 -0
  27. data/lib/bcdice/game_system/FullFace.rb +39 -10
  28. data/lib/bcdice/game_system/FutariSousa.rb +88 -8
  29. data/lib/bcdice/game_system/Insane_Korean.rb +1 -1
  30. data/lib/bcdice/game_system/InvisibleLiar.rb +79 -0
  31. data/lib/bcdice/game_system/KizunaBullet.rb +240 -0
  32. data/lib/bcdice/game_system/KyokoShinshoku.rb +51 -8
  33. data/lib/bcdice/game_system/MonotoneMuseum.rb +14 -1
  34. data/lib/bcdice/game_system/NRR.rb +2 -2
  35. data/lib/bcdice/game_system/ShuumatsuBargainWars.rb +203 -0
  36. data/lib/bcdice/game_system/SkynautsBouken.rb +45 -130
  37. data/lib/bcdice/game_system/SwordWorld.rb +1 -1
  38. data/lib/bcdice/game_system/TensaiGunshiNiNaro.rb +228 -0
  39. data/lib/bcdice/game_system/TheOneRing2nd.rb +406 -0
  40. data/lib/bcdice/game_system/TheUnofficialHollowKnightRPG.rb +185 -0
  41. data/lib/bcdice/game_system/TrailOfCthulhu.rb +139 -0
  42. data/lib/bcdice/game_system/UnsungDuet.rb +17 -75
  43. data/lib/bcdice/game_system/UnsungDuet_Korean.rb +41 -0
  44. data/lib/bcdice/game_system/Utakaze.rb +55 -2
  45. data/lib/bcdice/game_system/Warhammer4.rb +124 -3
  46. data/lib/bcdice/game_system/Yotabana.rb +62 -0
  47. data/lib/bcdice/game_system/cyberpunk_red/tables.rb +111 -473
  48. data/lib/bcdice/game_system/kizuna_bullet/tables.rb +171 -0
  49. data/lib/bcdice/game_system.rb +16 -0
  50. data/lib/bcdice/version.rb +1 -1
  51. metadata +30 -2
@@ -0,0 +1,139 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class TrailOfCthulhu < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'TrailOfCthulhu'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'トレイル・オブ・クトゥルー'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'とれいるおふくとうるう'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
17
+ ■技能判定 TCb[>=t] b:消費プール・ポイント t:難易度(省略可能)
18
+
19
+ 例)TC2>=5:消費プール・ポイント2,難易度5で技能判定し、その結果を表示する。
20
+ TC>=3: 難易度3で技能判定し、その結果を表示する。
21
+ TC: 難易度指定せずに技能判定する。
22
+ TC3: 消費プール・ポイント3,難易度指定せずに技能判定する。
23
+
24
+ ■神話的狂気表 MMT[a,b] a,b:除外する神話的狂気(省略時は全神話的狂気を表示する)
25
+
26
+ 例)MMT[1,8]: 神話的狂気のうち、1番と8番を除外してロールし、神話的狂気を決定する。
27
+ MMT2,6: 神話的狂気のうち、2番と6番を除外してロールし、神話的狂気を決定する。
28
+ MMT: 神話的狂気を1番から8番まで列挙する。
29
+
30
+ INFO_MESSAGETEXT
31
+
32
+ register_prefix("TC", "MMT")
33
+
34
+ def initialize(command)
35
+ super(command)
36
+
37
+ @round_type = RoundType::CEIL
38
+ end
39
+
40
+ def eval_game_system_specific_command(command)
41
+ resolute_action(command) ||
42
+ roll_mythos_madness_table(command)
43
+ end
44
+
45
+ private
46
+
47
+ # 技能判定
48
+ # @param [String] command
49
+ # @return [Result]
50
+ def resolute_action(command)
51
+ m = /^TC([+\d]*)(>=(\d+))?/.match(command)
52
+ return nil unless m
53
+
54
+ bonus =
55
+ if m[1].empty?
56
+ 0
57
+ else
58
+ Arithmetic.eval(m[1], @round_type)
59
+ end
60
+
61
+ if bonus.nil?
62
+ return nil
63
+ end
64
+
65
+ difficulty = m[3].to_i
66
+
67
+ dice = @randomizer.roll_once(6)
68
+ total = dice + bonus
69
+
70
+ return Result.new.tap do |result|
71
+ if difficulty > 0
72
+ result.condition = (total >= difficulty)
73
+
74
+ sequence = [
75
+ "(TC#{bonus}>=#{difficulty})",
76
+ "#{dice}+#{bonus}",
77
+ total.to_s,
78
+ result.success? ? "成功" : "失敗"
79
+ ].compact
80
+ else
81
+ sequence = [
82
+ "(TC#{bonus})",
83
+ "#{dice}+#{bonus}",
84
+ total.to_s,
85
+ ].compact
86
+ end
87
+
88
+ result.text = sequence.join(" > ")
89
+ end
90
+ end
91
+
92
+ # 神話的狂気表
93
+ MITHOS_MADDNESS = [
94
+ "1:強迫性障害",
95
+ "2:恐怖症",
96
+ "3:誇大妄想狂",
97
+ "4:殺人狂",
98
+ "5:恣意的記憶喪失",
99
+ "6:多重人格障害",
100
+ "7:偏執症",
101
+ "8:妄想症",
102
+ ].freeze
103
+
104
+ def roll_mythos_madness_table(command)
105
+ m = /^MMT(\[?([1-8],[1-8])\]?)?/.match(command)
106
+ return nil unless m
107
+
108
+ sequence = []
109
+ result_text = ""
110
+ if m[1]
111
+ exclusion_number = m[2].split(',')
112
+ return nil unless exclusion_number.length == 2
113
+
114
+ sequence = ["(MMT[#{exclusion_number.join(',')}])"]
115
+ is_exclusion_number = true
116
+ while is_exclusion_number
117
+ idx = @randomizer.roll_once(8).to_i
118
+ if idx != exclusion_number[0].to_i && idx != exclusion_number[1].to_i
119
+ result_text = MITHOS_MADDNESS[idx - 1]
120
+ is_exclusion_number = false
121
+ end
122
+ end
123
+ else
124
+ sequence = ["(MMT)"]
125
+ mithos_maddness_all = []
126
+ (1..8).each do |i|
127
+ mithos_maddness_all.push(MITHOS_MADDNESS[i - 1])
128
+ end
129
+ result_text = mithos_maddness_all.join(", ")
130
+ end
131
+
132
+ return Result.new.tap do |result|
133
+ sequence.push(result_text)
134
+ result.text = sequence.join(" > ")
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
@@ -40,7 +40,7 @@ module BCDice
40
40
 
41
41
  roll_replaced_command_if_match(command, SHIFTER_ALIAS_REG, "1D10") ||
42
42
  roll_replaced_command_if_match(command, BINDER_ALIAS_REG, "2D6") ||
43
- roll_tables(command, TABLES)
43
+ roll_tables(command, self.class::TABLES)
44
44
  end
45
45
 
46
46
  def roll_replaced_command_if_match(command, regexp, dist)
@@ -58,80 +58,22 @@ module BCDice
58
58
  "HOther" => "HOT",
59
59
  }.transform_keys(&:upcase)
60
60
 
61
- TABLES = {
62
- "HIN" => DiceTable::Table.new(
63
- "変異表:外傷",
64
- "1D6",
65
- [
66
- "顔の傷 顔にできた傷。じわりと血がにじむ",
67
- "大きな怪我 早く手当てをしないと命に関わる",
68
- "痛みのない傷 大きな傷なのに、なぜか痛くない",
69
- "喪失 身体のどこかが消えてしまった",
70
- "文字のような傷跡 読めない文字のような傷",
71
- "模様を描くアザ 模様のような、身体にできたアザ",
72
- ]
73
- ),
74
- "HPH" => DiceTable::Table.new(
75
- "変異表:体調の変化",
76
- "1D6",
77
- [
78
- "視界がぼやける → 目の焦点が合わない",
79
- "耳鳴り → ずっと甲高い音が鳴り続けている気がする",
80
- "異様な寒気 → 凍えそうなほどに寒く感じる",
81
- "発汗 → 暑いわけでもないのに、汗がだらだらと",
82
- "幻覚 → それが本物か幻か、区別がつかない",
83
- "走馬灯 → 過去のことを次々と思い出してしまう",
84
- ]
85
- ),
86
- "HFE" => DiceTable::Table.new(
87
- "変異表:恐怖",
88
- "1D6",
89
- [
90
- "不安 → 漠然とした不安が心を蝕む",
91
- "狭い場所が怖い → 狭い場所に入りたくない",
92
- "震えが止まらない → どうしても落ち着かない",
93
- "物音が怖い → ほんの小さな物音にも怯えてしまう",
94
- "暗い場所が怖い → 灯りのない場所がひどく恐ろしい",
95
- "誰かがついてくる → 誰かが後ろにいる気がする……",
96
- ]
97
- ),
98
- "HFA" => DiceTable::Table.new(
99
- "変異表:幻想化",
100
- "1D6",
101
- [
102
- "硝子化 → 身体の一部がガラスのように透明に",
103
- "羽毛化 → 身体のどこかから羽毛が生えてくる",
104
- "植物化 → ツタや葉が身体から生えてくる",
105
- "動物の瞳 → 瞳の形が動物のそれに変わってしまう",
106
- "有角化 → 額や側頭部から角が生えてくる",
107
- "陶器化 → 皮膚が陶器のようなものに変わっていく",
108
- ]
109
- ),
110
- "HMI" => DiceTable::Table.new(
111
- "変異表:精神",
112
- "1D6",
113
- [
114
- "記憶の混乱 → ここはどこ、どうしてこんなところに?",
115
- "幼少期の記憶 → 口調や態度が幼くなってしまう",
116
- "素直 → 思ったことを全部言ってしまう",
117
- "蛮勇 → パートナーを守るために無茶ばかりする",
118
- "疑心暗鬼 → 何もかもが悪い方向にしか考えられない",
119
- "食べちゃいたい → パートナーをかじりたくなる",
120
- ]
121
- ),
122
- "HOT" => DiceTable::Table.new(
123
- "変異表:そのほか",
124
- "1D6",
125
- [
126
- "影絵化 → 身体の一部が影のようになる",
127
- "水槽化 → 身体の一部が水槽のようなものになる",
128
- "涙が止まらない → なぜか涙が流れ続ける",
129
- "鉤爪 → 手や足が、獣のような鉤爪になる",
130
- "未来視 → 未来が見えてしまう。本当かどうかは不明",
131
- "帰りたくない → 現実に帰りたくないと微かに思う",
132
- ]
133
- ),
134
- }.freeze
61
+ class << self
62
+ private
63
+
64
+ def translate_tables(locale)
65
+ {
66
+ "HIN" => DiceTable::Table.from_i18n('UnsungDuet.MutatingInjuryTable', locale),
67
+ "HPH" => DiceTable::Table.from_i18n('UnsungDuet.MutatingPhysicalConditionTable', locale),
68
+ "HFE" => DiceTable::Table.from_i18n('UnsungDuet.MutatingFearTable', locale),
69
+ "HFA" => DiceTable::Table.from_i18n('UnsungDuet.MutatingFantasyTable', locale),
70
+ "HMI" => DiceTable::Table.from_i18n('UnsungDuet.MutatingMindTable', locale),
71
+ "HOT" => DiceTable::Table.from_i18n('UnsungDuet.MutatingOtherTable', locale),
72
+ }.freeze
73
+ end
74
+ end
75
+
76
+ TABLES = translate_tables(:ja_jp)
135
77
 
136
78
  register_prefix(ALIAS.keys, TABLES.keys)
137
79
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/game_system/UnsungDuet"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class UnsungDuet_Korean < UnsungDuet
8
+ ID = 'UnsungDuet:Korean'
9
+ NAME = '언성 듀엣'
10
+ SORT_KEY = '国際化:Korean:언성 듀엣'
11
+
12
+ HELP_MESSAGE = <<~MESSAGETEXT
13
+ ■ 시프터 용 판정 (shifter, UDS)
14
+ 1D10을 다이스롤 해서 판정을 행합니다.
15
+ 예) shifter, UDS, shifter>=5, shifter+1>=6
16
+
17
+ ■ 바인더 용 판정 (binder, UDB)
18
+ 2D6을 다이스롤 해서 판정을 행합니다.
19
+ 예) binder, UDB, binder>=5, binder+1>=6
20
+
21
+ ■ 변이표
22
+ ・상처 (HIN, HInjury)
23
+ ・몸 상태의 변화 (HPH, HPhysical)
24
+ ・공포 (HFE, HFear)
25
+ ・환상화 (HFA, HFantasy)
26
+ ・정신 (HMI, HMind)
27
+ ・기타 (HOT, HOther)
28
+ MESSAGETEXT
29
+
30
+ register_prefix_from_super_class()
31
+
32
+ def initialize(command)
33
+ super(command)
34
+
35
+ @locale = :ko_kr
36
+ end
37
+
38
+ TABLES = translate_tables(:ko_kr)
39
+ end
40
+ end
41
+ end
@@ -26,14 +26,19 @@ module BCDice
26
26
  cに「龍のダイス目」を指定した行為判定ロール。
27
27
  ゾロ目ではなく、cと同じ値の出目数x2が成功レベルとなります。難易度の指定も可能です。
28
28
  例)3UK@5 :龍のダイス「月」でクリティカルコール宣言したサイコロ3個の行為判定
29
+ ・対抗判定ロール(nUR[@c], nUO[@c]) n:ダイス数 c:クリティカルコール
30
+  行為判定ロールと同様にロールするが、最期に成功レベルとセット数から求めたマジックナンバーが表示される。
31
+  マジックナンバーの大きいものが成功、同値は引き分け。
32
+  ダイスは18個まで対応。
29
33
  MESSAGETEXT
30
34
 
31
- register_prefix('\d*UK')
35
+ register_prefix('\d*U[KRO]')
32
36
 
33
37
  def eval_game_system_specific_command(command)
34
38
  debug('eval_game_system_specific_command command', command)
35
39
 
36
- check_roll(command)
40
+ check_roll(command) ||
41
+ opposed_roll(command)
37
42
  end
38
43
 
39
44
  private
@@ -103,6 +108,54 @@ module BCDice
103
108
  end
104
109
  end
105
110
 
111
+ # 対抗判定
112
+ def opposed_roll(command)
113
+ m = /^(\d+)?U[R|O](@?(\d))?$/i.match(command)
114
+ return nil unless m
115
+
116
+ base = (m[1] || 2).to_i
117
+ crit = m[3].to_i
118
+
119
+ base = getValue(base)
120
+ crit = getValue(crit)
121
+
122
+ return nil if base < 1 || base > 18
123
+
124
+ crit = 6 if crit > 6
125
+
126
+ dice_list = @randomizer.roll_barabara(base, 6).sort
127
+ result = get_opposed_roll_result(dice_list, crit)
128
+
129
+ sequence = [
130
+ command,
131
+ "(#{base}D6)",
132
+ "[#{dice_list.join(',')}]",
133
+ result.text
134
+ ]
135
+ result.text = sequence.join(" > ")
136
+
137
+ return result
138
+ end
139
+
140
+ def get_opposed_roll_result(diceList, crit)
141
+ success, maxnum, setCount = getSuccessInfo(diceList, crit)
142
+
143
+ sequence = []
144
+
145
+ if isDragonDice(crit)
146
+ sequence.push("龍のダイス「#{DRAGON_DICE_NAME[crit]}」(#{crit})を使用")
147
+ end
148
+
149
+ if success
150
+ sequence.push("成功レベル:#{maxnum} (#{setCount}セット)")
151
+ sequence.push("(" + format("%#02d%#1d", maxnum, setCount) + ")")
152
+ return Result.success(sequence.join(" > ")) # 出力上は成功として扱う
153
+ else
154
+ sequence.push("(000)")
155
+ return Result.failure(sequence.join(" > "))
156
+ end
157
+ end
158
+
106
159
  def getSuccessInfo(diceList, crit)
107
160
  debug("checkSuccess diceList, crit", diceList, crit)
108
161
 
@@ -24,7 +24,18 @@ module BCDice
24
24
  命中部位をランダムに決定します。(クリティカル用)
25
25
 
26
26
  ■ やっちまった!表 (WHFT)
27
-  やっちまった!表をロールして、結果を表示します。
27
+ やっちまった!表をロールして、結果を表示します。
28
+
29
+ ■ 神々の天罰表 (WHWGTx)
30
+ "WHWGT(原罪点)"の形で指定します。
31
+ 原罪点を省略した場合は、原罪点=0として処理します。
32
+ 神々の天罰表をロールして、結果を表示します。
33
+
34
+ ■ 小誤発動表 (WHMIT)
35
+ 小誤発動表をロールして、結果を表示します。
36
+
37
+ ■ 大誤発動表 (WHMAT)
38
+ 大誤発動表をロールして、結果を表示します。
28
39
 
29
40
  ■ 命中判定 (WHx)
30
41
  "WH(命中値)"の形で指定します。
@@ -41,7 +52,10 @@ module BCDice
41
52
  end
42
53
 
43
54
  def eval_game_system_specific_command(command)
44
- roll_critical_table(command) || roll_attack(command) || roll_tables(command, TABLES)
55
+ roll_critical_table(command) ||
56
+ roll_attack(command) ||
57
+ roll_wrath_of_god_table(command) ||
58
+ roll_tables(command, TABLES)
45
59
  end
46
60
 
47
61
  def result_1d100(total, _dice_total, cmp_op, target)
@@ -313,6 +327,61 @@ module BCDice
313
327
  ]
314
328
  )
315
329
 
330
+ # 神々の天罰表
331
+ def roll_wrath_of_god_table(command)
332
+ m = /^WHWGT(\d*)$/.match(command)
333
+ return nil unless m
334
+
335
+ sin_point = m[1].to_i
336
+ total = @randomizer.roll_once(100) + sin_point * 10
337
+ total = 151 if total > 151
338
+
339
+ sequence = [
340
+ "神々の天罰表(#{total})",
341
+ WRATH_OF_GOD_TABLE.fetch(total).content
342
+ ].compact
343
+
344
+ return sequence.join(" > ")
345
+ end
346
+
347
+ WRATH_OF_GOD_TABLE = DiceTable::RangeTable.new(
348
+ "神々の天罰表",
349
+ "1D200",
350
+ [
351
+ [1..5, '聖なる幻視:神の幻視が君の感覚を苦しめる。「普通」(+20)の〈肉体抵抗〉テストを行なうこと。失敗すると「朦朧状態」1つを得る。幻視の内容はGMが定めること。'],
352
+ [6..10, '行ないを顧みよ:次の1週間にわたって、成功したすべての〈祈念〉テストで得られる成功レベル(SL)の上限が+0となる。'],
353
+ [11..15, '戒めを心に留めよ:次の1d10+「原罪点」のラウンドにわたって、〈祈念〉技能に-10のペナルティを被る。'],
354
+ [16..20, '忠誠を示せ:「伏せ状態」になる。この「状態」は、「普通」(+20)の〈祈念〉テストに成功するまで取り除くことができない。'],
355
+ [21..25, '物事には限度というものがある:1d10ラウンドの間、君はいかなる〈祈念〉テストも行なうことができない。'],
356
+ [26..30, '我が意図を理解しておらず:次の1d10+「原罪点」の時間数にわたって、君は仕える神に関連するすべての技能(GMが決定する)に-10のペナルティを被る。'],
357
+ [31..35, '信念の欠如が心をかき乱すのだ:1d10+「原罪点」のラウンドにわたって、君はいかなる〈祈念〉テストも行なうことができない。'],
358
+ [36..40, '我が痛みを分かとう:【頑健力】ボーナスとアーマー・ポイント〔AP〕による修正を無視して、1+「原罪点」の「耐久値」を失う。加えて、「普通」(+20)の〈肉体抵抗〉テストを行なうこと。失敗すると、「朦朧状態」1つを得る。'],
359
+ [41..45, '汝の大義に価値はない:君の目標(たち)は「伏せ状態」になる。次の1d10+「原罪点」の日数にわたって、前述の目標に対して行なわれる君の仕える神による「祝福」や「奇跡」は、ことごとく自動失敗となる。'],
360
+ [46..50, '戯言はもうやめよ:次の2d10+「原罪点」のラウンドにわたって、君はいかなる〈祈念〉テストも行なうことができない。'],
361
+ [51..55, '我が怒りを感じよ:1d10+「原罪点」に等しい「耐久値」を失う。加えて、「手強い」(+0)〈肉体抵抗〉テストを行なうこと。失敗すると、「朦朧状態」1つを得る。'],
362
+ [56..60, '汝を助けてはやらぬ:次の1d10+「原罪点」の日数にわたって、君は仕える神に関連するすべての技能(GMが決定する)に-10 のペナルティを被る。'],
363
+ [61..65, '神の手傷:1+「原罪点」に等しい数の「出血状態」を得る。'],
364
+ [66..70, '目が見えない:「伏せ状態」になることに加えて、1+「原罪点」に等しい数の「目がくらんだ状態」を得る。そのうち後者は、「手強い」(+0)〈祈念〉テストに成功することによってのみ取り除くことができる。このテストに成功することで、1+成功レベル(SL)に等しい数の「目がくらんだ状態」を取り除く。'],
365
+ [71..75, '何を犠牲にするのか?:【頑健力】ボーナスとアーマー・ポイント〔AP〕による修正値を無視して、1d10+「原罪点」に等しい「耐久値」を失う。加えて、「難しい」(-10)〈肉体抵抗〉テストを行なうこと。失敗すると、「朦朧状態」1つを得る。'],
366
+ [76..80, '我に逆らうとは何事ぞ:君の神は非常に苛立っている。懺悔として、次の1d10+「原罪点」に等しいラウンド数にわたって、君は〈祈念〉テストを自分の「アクション」として行ない続けなければならない。'],
367
+ [81..87, '肉体を清めよ:【頑健力】ボーナスとアーマー・ポイント〔AP〕による修正を無視して、2d10+「原罪点」に等しい「耐久値」を失う。加えて、「多難」(-20)な〈肉体抵抗〉テストを行なうこと。失敗すると、「朦朧状態」1つを得る。成功レベル(SL)-4以下で失敗した場合、最短でも1d10ラウンドに渡って継続し、その間は取り除くことができない「気絶状態」となる。'],
368
+ [88, '悪魔の干渉:君の守護神に代わり、暗黒の神々が君の懇願に応じる。君のいる場所から2d10ヤード以内に1d10体のレッサー・ディーモンが現れ、最も近い目標(群)を攻撃する。'],
369
+ [89..95, '我が怒りに慄け:1+「原罪点」に等しい数の「戦意喪失状態」を得る。'],
370
+ [96..100, '懺悔せよ:君は「贖罪」に向かわなければならない。'],
371
+ [101..105, '折檻:「耐久値」を0点まで減じ、(君が既にその場にいなくとも)、「気絶状態」になる。この「状態」は、君の「耐久値」が少なくとも1点に回復するまで、取り除くことができない。'],
372
+ [106..110, 'みだりに我が名を使うでない:次の1d10+「原罪点」の日数にわたって、君は《祝福》異能と《奇跡》異能を失う。'],
373
+ [111..115, 'うぬぼれるな:すべての「所持品」が取り除かれ、君は丸裸になる。君が何らかの魔法アイテムを所持していた場合には、「贖罪」を1つ完遂するごとに、魔法のアイテム1つが君の元へと戻ってくる。'],
374
+ [116..120, '我が慈悲を悪用した:次の2d10+「原罪点」の日数にわたって、君は《祝福》異能と《奇跡》異能を失う。'],
375
+ [121..125, '汝の邪悪を見よ:君はあらゆるしくじりに関する耐え難い幻視に苦しむ。それは永遠とも思われるが、一瞬に過ぎないものだ。忘れられない経験に対応したあつらえの「心理特徴」(P.190)をGMと相談して作り、君のキャラクターに適用すること。'],
376
+ [126..130, '神の雷:君の神が咎める。「耐久値」を0点まで減じ、(君が既にその場にいなくとも)、「炎上状態」1つを得る。'],
377
+ [131..135, '我が苦しみをいざ分かたん:「贖罪」を完遂するまでの毎朝、君は1+「原罪点」に等しい数の「出血状態」を得る。'],
378
+ [136..140, '破門宣告:2つの「贖罪」を完遂するまで、君は《祝福》異能と《奇跡》異能を失う。最初の贖罪で《祝福》異能が戻り、次の贖罪で《奇跡》異能が戻る。君の神の信徒は全員、君の置かれた状況をひとりでに知る。信徒と交流するすべてのテストは自動的に「超多難」(-30)の難易度となり、プラスの修正値を適用することはできない。'],
379
+ [141..145, '汝の価値を示せ:君の神の従者1人が1d100ヤード以内に現れ、怒れる神の性質に従って攻撃や介入、叱責、およびそれらに準ずる行動を取る。'],
380
+ [146..150, '追放:君は神に見捨てられた。《祝福》異能と《奇跡》異能を永続的に失い、さらに、〈祈念〉技能でのすべての成長を失う。それに加えて、君の神の信徒は全員、君の置かれた状況をひとりでに知る。信徒と交流するすべてのテストは自動的に「超多難」(-30)の難易度となり、プラスの修正値を適用することはできない。'],
381
+ [151..200, '汝の責任を果たせ:最後の審判と向き合うよう、君は神の元へと召喚される。「運命点」が残っていない限り、君は二度と戻ることができない。「運命点」1点を消費することでGMが選択した地点へと戻るが、その上で、146〜150の「追放」の効果を受けねばならない。'],
382
+ ]
383
+ )
384
+
316
385
  TABLES = {
317
386
  "WHLT" => HIT_PARTS_TABLE,
318
387
  "WHFT" => DiceTable::RangeTable.new(
@@ -327,7 +396,59 @@ module BCDice
327
396
  [81..90, '君は筋を違えるか、足首をひねってしまう。「筋断裂(軽度)」の負傷を得る。「致命的負傷」としてカウントされる。'],
328
397
  [91..100, '君は射程内のランダムな味方を攻撃してしまう。命中判定の出目の1の位をSLとして用いること。攻撃可能な味方が居ない場合は、自己を攻撃してしまい「朦朧状態」1つを得る。'],
329
398
  ]
330
- )
399
+ ),
400
+ "WHMIT" => DiceTable::RangeTable.new(
401
+ "小誤発動表",
402
+ "1D100",
403
+ [
404
+ [1..5, '魔女の印:1マイル以内で次に新たに生まれたクリーチャー1体が混沌変異する。'],
405
+ [6..10, '酸っぱいミルク:1d100ヤード以内のすべてのミルクが即座に酸っぱくなる。'],
406
+ [11..15, '立ち枯れ:君の【意志力】ボーナス×1 マイル以内の農場が立ち枯れの病にかかり、すべての穀物が一夜のうちに腐れてしまう。'],
407
+ [16..20, '耳垢閉塞:君の耳が即座に分厚い耳垢で詰まってしまう。「耳鳴り状態」1つを得る。誰かが君に耳掃除してくれない限りこれを取り除くことはできない(〈治療〉技能を用いてテストに成功しなければならない)。'],
408
+ [21..25, '魔女の光:君は自分の「魔法体系」に関連した気味の悪い光を放ち、大きな焚き火ほどの明るさで発光する。これは1d10ラウンドにわたって持続する。'],
409
+ [26..30, '地獄の囁き:「普通」(+20)の【意志力】テストを行わねばならず、失敗したなら「堕落ポイント」1点を得る。'],
410
+ [31..35, '破裂:君の鼻、目、耳からおびただしく出血する。1d10個の「出血状態」を得る。'],
411
+ [36..40, '魂が震える:「伏せ状態」になる。'],
412
+ [41..45, '結び目ほどき:君の「所持品」のあらゆる留め金が外れ、あらゆる紐の結び目がほどけてしまう。ベルトはずり落ち、ポーチは開き、バッグは落ち、鎧も外れてしまうのだ。'],
413
+ [46..50, '気まぐれな装い:君の衣服が自分の意志を持っているかのように振る舞う。「組み付かれた状態」1つを得る。これに抵抗するための【筋力】は1d10×5となる。'],
414
+ [51..55, '節制の呪い:1d100ヤード以内のすべての酒が苦くて臭いひどい味になる。'],
415
+ [56..60, '魂の消耗:「疲労状態」1 つを得る。これは1d10時間にわたって持続する。'],
416
+ [61..65, '困惑する:戦闘に参加しているなら、「不意を討たれた状態」になる。それ以外の場合、君は完全にびくついてしまい、心はあたふたとし、ほんの片時も集中することができなくなる。'],
417
+ [66..70, '不浄なる幻視:穢らわしく不浄な行為の幻視が浮かび上がり君を悩ませる。「目がくらんだ状態」1つを得る。「手強い」(+0)〈冷静さ〉テストを行ない、失敗したなら、さらに1つの同「状態」を得る。'],
418
+ [71..75, '鼻につく言葉:1d10ラウンドにわたって、すべての〈言語〉テスト(発動テストも含む)に-10のペナルティを被る。'],
419
+ [76..80, '恐怖!:「多難」(-20)な〈冷静さ〉テストを行ない、失敗したなら「戦意喪失状態」1つを得る。'],
420
+ [81..85, '堕落の呪い:「堕落ポイント」1点を得る。'],
421
+ [86..90, '二重の災難:君が発動した呪文の効果は1d10マイル以内の他の場所で発生する。そこでどのような結果が起こるかはGMの裁定による。'],
422
+ [91..95, '倍増する不幸:この表を2回ロールする。91〜100が出た場合には再ロールをすること。'],
423
+ [96..100, 'ほとばしる混沌:『大誤発動表』でもう一度ロールすること。'],
424
+ ]
425
+ ),
426
+ "WHMAT" => DiceTable::RangeTable.new(
427
+ "大誤発動表",
428
+ "1D100",
429
+ [
430
+ [1..5, '亡霊の声:【意志力】×1ヤード以内のすべての者が“混沌の領域”から現れた暗く誘惑的な囁き声を耳にする。知性のあるクリーチャーは皆、「普通」(+20)の〈冷静さ〉テストを行ない、失敗したなら、「堕落ポイント」1点を得る。'],
431
+ [6..10, '魔女の目:君の目が1d10時間にわたって、自分の「魔法体系」に関連した不自然な色に変わる。目の色が変わっている間、君はいかなる手段でも取り除くことができない「目がくらんだ状態」1つを得る。'],
432
+ [11..15, 'エーテルの衝撃:君は、【頑健力】ボーナスとアーマー・ポイント〔AP〕による修正値を無視して、1d10点の「耐久値」を失う。さらに、「普通」(+20)の〈肉体抵抗〉テストを行ない、失敗したなら、「朦朧状態」1つも得る。'],
433
+ [16..20, '死の歩み:君の足跡はその行く手に死を残していく。次の1d10時間にわたって、君の周囲のあらゆる植物は枯れ死に果てる。'],
434
+ [21..25, '腸内大暴動:君はお腹の不調を抑えきれず、粗相してしまう。「疲労状態」1つを得るが、これは君が衣服を取り替え、身体を綺麗にするまで取り除くことができない。'],
435
+ [26..30, '魂の火:君は自分の「魔法体系」に関連した色の不浄な炎に取り巻かれ、「炎上状態」1つを得る。'],
436
+ [31..35, '抑えの効かぬ舌:君は1d10ラウンドにわたって、わけのわからないことを喋りまくる。この間、君は言葉による意思疏通ができず、あらゆる発動テストを行なうこともできないが、それ以外は通常通り行動してもよい。'],
437
+ [36..40, '群れの襲撃:君はエーテル体のラット、ジャイアント・スパイダー、スネーク、その他(GM の任意)の群れに囲まれる。関連するクリーチャー種別の通常プロフィールに「群れ」の「クリーチャー特徴」を加えて用いること。1d10ラウンドの終了後に、まだ倒されていなければその群れは撤退する。'],
438
+ [41..45, '布人形:君はランダムな方向に1d10ヤード空中に投げ飛ばされ、地面に落ちて1d10点の「耐久値」を失い(アーマー・ポイント〔AP〕は無視する)、さらに「伏せ状態」になる。'],
439
+ [46..50, '凍りつく四肢:四肢のひとつ(ランダムに決定する)が1d10ラウンドにわたって動かなくなる。この四肢はまるで「身体欠損」(P.180を参照)になったかのように使い物にならない。'],
440
+ [51..55, '闇の目:君は1d10時間にわたって、《第二の視覚》の異能の利益を失う。この時間中、君は〈魔風交信〉テストにも-20のペナルティを被る。'],
441
+ [56..60, '混沌の先見:1d10点ぶんの「幸運ポイント」の余剰プールを得る(これは通常の上限を超えても構わない)。君が「幸運ポイント」を1点消費するたびに、「堕落ポイント」を1点獲得する。なお、セッションの終了時に残存している追加で得たポイントはすべて失われる。'],
442
+ [61..65, '浮遊:君は“魔力の風”に乗り、1d10分にわたって地上から1d10ヤードの高さに浮かび上がる。他のキャラクターたちが君を無理やり動かすこともできるし、君も呪文や翼などを使って移動することもできるが、そのままにしておくと君が浮かんだ位置に常に戻ってくる。「浮遊」が終了した後に何が起こるかについては、「落下」(P.166)を参照のこと。'],
443
+ [66..70, '吐き気:君は吐き気が抑えきれなくなり、君の体内にあった量以上の、悪臭を放つ汚物を吐きちらす。「朦朧状態」1つを得る。これは1d10ラウンドにわたって持続する。'],
444
+ [71..75, '混沌の地震:1d100ヤード以内にいるすべてのクリーチャーは「普通」(+20)の〈運動〉テストを行ない、失敗したなら、「伏せ状態」になる。'],
445
+ [76..80, '裏切り:暗黒の神々が恐るべき背信を行なうよう君を誘惑する。君が味方の1人に対する攻撃か、その他何らかの裏切り行為に全力を尽くしたなら、「幸運ポイント」をすべて回復できる。君が他のキャラクターに「運命点」1点を失わせたなら、君がその1点の「運命点」を得る。'],
446
+ [81..85, '穢らわしい弱体化:1点の「堕落ポイント」に加えて、「疲労状態」1つを獲得し、さらに「伏せ状態」にもなる。'],
447
+ [86..90, '凄まじき悪臭:いまや君は鼻が曲がりそうなまでに臭い!君は「攪乱」の「クリーチャー特徴」(P.338)を獲得し、おそらく嗅覚を持つ誰彼すべてからの敵意にさらされる。この効果は1d10時間持続する。'],
448
+ [91..95, '力の流出:君は1d10分にわたって、呪文を発動するために使う異能を使用することができない(通常は《秘術魔術》だが、《混沌魔術》や同種の異能ということもありえる)。'],
449
+ [96..100, 'エーテルの逆流:君の【意志力】ボーナス×1ヤード以内にいるすべての者は──敵も味方も同様に──(【頑健力】ボーナスとアーマー・ポイント〔AP〕を無視して)1d10点の「耐久値」を失い、さらに「伏せ状態」になる。射程内に目標が存在しなければ、魔法は行き場を失い、君の頭は爆発し、君は即死する。'],
450
+ ]
451
+ ),
331
452
  }.freeze
332
453
  end
333
454
  end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Yotabana < Base
6
+ # ゲームシステムの識別子
7
+ ID = "Yotabana"
8
+
9
+ # ゲームシステム名
10
+ NAME = "ヨタバナ"
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = "よたはな"
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ▪️ 各種表
18
+ COT 収束表
19
+ EVT イベント表
20
+ INFO_MESSAGE_TEXT
21
+
22
+ def eval_game_system_specific_command(command)
23
+ roll_tables(command, TABLES)
24
+ end
25
+
26
+ TABLES = {
27
+ "COT" => DiceTable::Table.new(
28
+ "収束表",
29
+ "1D6",
30
+ [
31
+ "サプライズ忍者/唐突に忍者が乱入し、場面にいるキャラクターを倒して去っていく",
32
+ "仙人/唐突に仙人が乱入し、不思議な力で事態を収束させて帰っていく",
33
+ "洗脳薬/不思議な薬が散布され、キャラクターを洗脳し、事態を収束させる",
34
+ "作者の手/キャラクターたちの言動が唐突に変わり、事態が収束する。作者の大いなる手だ……",
35
+ "神の奇跡/神が奇跡を起こし事態を収束させる。または神の信徒になり、信仰の前に争いは無意味であると悟る",
36
+ "和解/話し合えば分かり合えた。この世は対話で通じ合える",
37
+ ]
38
+ ),
39
+ "EVT" => DiceTable::Table.new(
40
+ "イベント表",
41
+ "1D12",
42
+ [
43
+ "道端に刺さっていた聖剣を拾う",
44
+ "ゾンビの群れと遭遇する",
45
+ "落ちていたコインを拾う。ちょっとラッキーな気分になる",
46
+ "あらゆるところで爆発が!?",
47
+ "唐突に冬が訪れ、猛吹雪が襲う",
48
+ "無人のトラックが突っ込んでくる",
49
+ "ネコちゃんに懐かれる",
50
+ "料金滞納で水道を止められる",
51
+ "ゴキゲンな音楽が鳴り響く",
52
+ "水着になる",
53
+ "オークションにかけられる",
54
+ "殺人アンドロイドが襲いかかってくる",
55
+ ]
56
+ ),
57
+ }.freeze
58
+
59
+ register_prefix(TABLES.keys)
60
+ end
61
+ end
62
+ end