bcdice 3.15.0 → 3.17.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 (158) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +140 -0
  3. data/i18n/Airgetlamh/ja_jp.yml +5 -0
  4. data/i18n/Airgetlamh/ko_kr.yml +5 -0
  5. data/i18n/Alsetto/ja_jp.yml +5 -0
  6. data/i18n/Alsetto/ko_kr.yml +5 -0
  7. data/i18n/AnimaAnimus/ja_jp.yml +28 -0
  8. data/i18n/AnimaAnimus/ko_kr.yml +28 -0
  9. data/i18n/BlackJacket/ja_jp.yml +79 -0
  10. data/i18n/BlackJacket/ko_kr.yml +79 -0
  11. data/i18n/Bloodorium/ja_jp.yml +3 -0
  12. data/i18n/Bloodorium/ko_kr.yml +3 -0
  13. data/i18n/Cthulhu/ko_kr.yml +1 -1
  14. data/i18n/DoubleCross/ja_jp.yml +2 -2
  15. data/i18n/Dracurouge/ko_kr.yml +1284 -205
  16. data/i18n/Emoklore/ja_jp.yml +1 -0
  17. data/i18n/Emoklore/ko_kr.yml +8 -0
  18. data/i18n/FutariSousa/ja_jp.yml +70 -0
  19. data/i18n/FutariSousa/ko_kr.yml +157 -0
  20. data/i18n/HatsuneMiku/ja_jp.yml +579 -0
  21. data/i18n/HatsuneMiku/ko_kr.yml +579 -0
  22. data/i18n/Irisbane/ja_jp.yml +27 -0
  23. data/i18n/Irisbane/ko_kr.yml +27 -0
  24. data/i18n/JuinKansen/ja_jp.yml +168 -0
  25. data/i18n/JuinKansen/ko_kr.yml +168 -0
  26. data/i18n/KemonoNoMori/ja_jp.yml +229 -0
  27. data/i18n/KemonoNoMori/ko_kr.yml +229 -0
  28. data/i18n/KizunaBullet/ko_kr.yml +653 -0
  29. data/i18n/MagicPunk/ja_jp.yml +5 -0
  30. data/i18n/MagicPunk/ko_kr.yml +5 -0
  31. data/i18n/MorkBorg/ja_jp.yml +34 -0
  32. data/i18n/MorkBorg/ko_kr.yml +34 -0
  33. data/i18n/Nechronica/ko_kr.yml +43 -0
  34. data/i18n/NegikureNegimaki/ja_jp.yml +6 -0
  35. data/i18n/NegikureNegimaki/ko_kr.yml +6 -0
  36. data/i18n/Nuekagami/ja_jp.yml +219 -0
  37. data/i18n/Nuekagami/ko_kr.yml +219 -0
  38. data/i18n/Revulture/ja_jp.yml +8 -0
  39. data/i18n/Revulture/ko_kr.yml +8 -0
  40. data/i18n/SRS/ja_jp.yml +4 -0
  41. data/i18n/SRS/ko_kr.yml +4 -0
  42. data/i18n/ShinobiGami/ja_jp.yml +879 -0
  43. data/i18n/ShinobiGami/ko_kr.yml +876 -0
  44. data/i18n/SkynautsBouken/ja_jp.yml +28 -28
  45. data/i18n/StarryDolls/ja_jp.yml +456 -0
  46. data/i18n/StarryDolls/ko_kr.yml +456 -0
  47. data/i18n/StratoShout/ja_jp.yml +8 -8
  48. data/i18n/SwordWorld2_5/ja_jp.yml +48 -0
  49. data/i18n/Ventangle/ja_jp.yml +4 -0
  50. data/i18n/Ventangle/ko_kr.yml +4 -0
  51. data/i18n/YearZeroEngine/ja_jp.yml +12 -0
  52. data/i18n/YearZeroEngine/ko_kr.yml +12 -0
  53. data/i18n/ZombiLine/ja_jp.yml +27 -0
  54. data/i18n/ZombiLine/ko_kr.yml +27 -0
  55. data/i18n/ko_kr.yml +2 -0
  56. data/i18n/zh_hant.yml +2 -2
  57. data/lib/bcdice/dice_table/d66_left_range_table.rb +21 -0
  58. data/lib/bcdice/game_system/Aionia.rb +68 -19
  59. data/lib/bcdice/game_system/Airgetlamh.rb +64 -41
  60. data/lib/bcdice/game_system/Airgetlamh_Korean.rb +53 -0
  61. data/lib/bcdice/game_system/Alsetto.rb +63 -50
  62. data/lib/bcdice/game_system/Alsetto_Korean.rb +51 -0
  63. data/lib/bcdice/game_system/AnimaAnimus.rb +15 -32
  64. data/lib/bcdice/game_system/AnimaAnimus_Korean.rb +39 -0
  65. data/lib/bcdice/game_system/BlackJacket.rb +57 -113
  66. data/lib/bcdice/game_system/BlackJacket_Korean.rb +8 -206
  67. data/lib/bcdice/game_system/Bloodorium.rb +1 -1
  68. data/lib/bcdice/game_system/Bloodorium_Korean.rb +34 -0
  69. data/lib/bcdice/game_system/ChroniclesOfDarkness2e.rb +163 -0
  70. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +471 -300
  71. data/lib/bcdice/game_system/DeadlineHeroes_Korean.rb +273 -0
  72. data/lib/bcdice/game_system/Dracurouge_Korean.rb +25 -19
  73. data/lib/bcdice/game_system/DungeonsAndDragons5.rb +106 -73
  74. data/lib/bcdice/game_system/DungeonsAndDragons5_Korean.rb +53 -0
  75. data/lib/bcdice/game_system/DungeonsAndDragons_Korean.rb +61 -0
  76. data/lib/bcdice/game_system/EdgeFlippers.rb +315 -0
  77. data/lib/bcdice/game_system/Emoklore.rb +34 -9
  78. data/lib/bcdice/game_system/Emoklore_Korean.rb +50 -0
  79. data/lib/bcdice/game_system/FateCoreSystem.rb +10 -6
  80. data/lib/bcdice/game_system/FullMetalPanic_Korean.rb +28 -0
  81. data/lib/bcdice/game_system/FutariSousa.rb +37 -12
  82. data/lib/bcdice/game_system/FutariSousa_Korean.rb +25 -8
  83. data/lib/bcdice/game_system/GaiaCare.rb +40 -0
  84. data/lib/bcdice/game_system/Garactier.rb +1 -1
  85. data/lib/bcdice/game_system/GardenOrder.rb +2 -2
  86. data/lib/bcdice/game_system/GardenOrderReEdit.rb +849 -0
  87. data/lib/bcdice/game_system/GardenOrder_Korean.rb +839 -0
  88. data/lib/bcdice/game_system/HatsuneMiku.rb +51 -605
  89. data/lib/bcdice/game_system/HatsuneMiku_Korean.rb +56 -0
  90. data/lib/bcdice/game_system/HunterTheReckoning5th.rb +15 -11
  91. data/lib/bcdice/game_system/Irisbane.rb +17 -30
  92. data/lib/bcdice/game_system/Irisbane_Korean.rb +52 -0
  93. data/lib/bcdice/game_system/JuinKansen.rb +41 -208
  94. data/lib/bcdice/game_system/JuinKansen_Korean.rb +46 -0
  95. data/lib/bcdice/game_system/KemonoNoMori.rb +67 -276
  96. data/lib/bcdice/game_system/KemonoNoMori_Korean.rb +62 -0
  97. data/lib/bcdice/game_system/KinAriel.rb +117 -0
  98. data/lib/bcdice/game_system/KizunaBullet_Korean.rb +109 -0
  99. data/lib/bcdice/game_system/KutuluRevised.rb +94 -0
  100. data/lib/bcdice/game_system/LiverLabyrinth.rb +321 -0
  101. data/lib/bcdice/game_system/Lost.rb +89 -0
  102. data/lib/bcdice/game_system/MagicPunk.rb +85 -0
  103. data/lib/bcdice/game_system/MagicPunk_Korean.rb +39 -0
  104. data/lib/bcdice/game_system/MarvelHeroicRoleplaying.rb +144 -0
  105. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +122 -2
  106. data/lib/bcdice/game_system/MetallicGuardian_Korean.rb +28 -0
  107. data/lib/bcdice/game_system/MorkBorg.rb +170 -0
  108. data/lib/bcdice/game_system/MorkBorg_Korean.rb +49 -0
  109. data/lib/bcdice/game_system/NanimonaiMura.rb +112 -0
  110. data/lib/bcdice/game_system/Nechronica_Korean.rb +6 -6
  111. data/lib/bcdice/game_system/NegikureNegimaki.rb +140 -0
  112. data/lib/bcdice/game_system/NegikureNegimaki_Korean.rb +48 -0
  113. data/lib/bcdice/game_system/NeonUnderRealm.rb +122 -0
  114. data/lib/bcdice/game_system/NinjaSlayer2.rb +170 -49
  115. data/lib/bcdice/game_system/Nuekagami.rb +19 -261
  116. data/lib/bcdice/game_system/Nuekagami_Korean.rb +43 -0
  117. data/lib/bcdice/game_system/ParanoiaPerfect.rb +74 -0
  118. data/lib/bcdice/game_system/PastFutureParadox.rb +2245 -55
  119. data/lib/bcdice/game_system/PreciousDays.rb +170 -0
  120. data/lib/bcdice/game_system/Revulture.rb +8 -5
  121. data/lib/bcdice/game_system/Revulture_Korean.rb +51 -0
  122. data/lib/bcdice/game_system/Ryutama.rb +46 -46
  123. data/lib/bcdice/game_system/SRS.rb +4 -4
  124. data/lib/bcdice/game_system/SRS_Korean.rb +67 -0
  125. data/lib/bcdice/game_system/ShinobiGami.rb +154 -1047
  126. data/lib/bcdice/game_system/ShinobiGami_Korean.rb +102 -0
  127. data/lib/bcdice/game_system/StarryDolls.rb +70 -508
  128. data/lib/bcdice/game_system/StarryDolls_Korean.rb +80 -0
  129. data/lib/bcdice/game_system/StratoShout.rb +1 -1
  130. data/lib/bcdice/game_system/SwordWorld.rb +28 -2
  131. data/lib/bcdice/game_system/SwordWorld2_0.rb +1 -1
  132. data/lib/bcdice/game_system/SwordWorld2_5.rb +67 -3
  133. data/lib/bcdice/game_system/TacticalExorcist.rb +222 -0
  134. data/lib/bcdice/game_system/TenkaRyouran_Korean.rb +30 -0
  135. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +38 -33
  136. data/lib/bcdice/game_system/Ventangle.rb +8 -7
  137. data/lib/bcdice/game_system/Ventangle_Korean.rb +41 -0
  138. data/lib/bcdice/game_system/Warhammer4.rb +202 -6
  139. data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +20 -15
  140. data/lib/bcdice/game_system/WorldEndScrapyard.rb +333 -0
  141. data/lib/bcdice/game_system/WorldsEndFrontline_Korean.rb +26 -0
  142. data/lib/bcdice/game_system/YearZeroEngine.rb +7 -7
  143. data/lib/bcdice/game_system/YearZeroEngine_Korean.rb +46 -0
  144. data/lib/bcdice/game_system/ZombiLine.rb +29 -36
  145. data/lib/bcdice/game_system/ZombiLine_Korean.rb +37 -0
  146. data/lib/bcdice/game_system/cthulhu7th_Korean/full_auto.rb +294 -0
  147. data/lib/bcdice/game_system/cthulhu7th_Korean/rollable.rb +43 -0
  148. data/lib/bcdice/game_system/meikyu_kingdom_basic/atoz_table.rb +1184 -0
  149. data/lib/bcdice/game_system/meikyu_kingdom_basic/randr236_table.rb +254 -0
  150. data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +54 -0
  151. data/lib/bcdice/game_system/meikyu_kingdom_basic/tk_table.rb +755 -0
  152. data/lib/bcdice/game_system/sword_world/rating_options.rb +9 -0
  153. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +19 -0
  154. data/lib/bcdice/game_system/sword_world/rating_parser.rb +229 -149
  155. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -0
  156. data/lib/bcdice/game_system.rb +47 -0
  157. data/lib/bcdice/version.rb +1 -1
  158. metadata +96 -2
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class KutuluRevised < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'KutuluRevised'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'Kutulu リバイズド'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'くとうるうりはいすと'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
17
+ ■判定 nKU n: ダイス数(1~9)
18
+
19
+ 例)3KU: ダイスを3個振って、その結果を表示(ギリギリでの成功も表示)
20
+
21
+ ■対抗判定 nKR n: ダイス数(1~9)
22
+
23
+ 例)2KR: ダイスを2個振って、その結果を表示。対抗判定用の3桁の数字も出力。(大きい方が勝利)
24
+ INFO_MESSAGETEXT
25
+
26
+ register_prefix('\dK[UR]')
27
+
28
+ def initialize(command)
29
+ super(command)
30
+
31
+ @sort_barabara_dice = true # バラバラロール(Bコマンド)でソート有
32
+ end
33
+
34
+ def eval_game_system_specific_command(command)
35
+ resolute_action(command) || resolute_competition(command)
36
+ end
37
+
38
+ private
39
+
40
+ # アクティヴ能力の判定
41
+ # @param [String] command
42
+ # @return [Result]
43
+ def resolute_action(command)
44
+ m = /(\d)KU/.match(command)
45
+ return nil unless m
46
+
47
+ num_dices = m[1].to_i
48
+
49
+ dices = @randomizer.roll_barabara(num_dices, 6).sort
50
+ dice_text = dices.join(",")
51
+
52
+ output = "(#{num_dices}KU) > #{dice_text}"
53
+
54
+ success_num = dices.count { |val| val >= 4 }
55
+ if success_num > 0
56
+ output += " > 成功数#{success_num}"
57
+ if success_num == 1
58
+ output += " > *ギリギリの成功?"
59
+ end
60
+ return Result.success(output)
61
+ else
62
+ output += " > 失敗"
63
+ return Result.failure(output)
64
+ end
65
+ end
66
+
67
+ # 対抗判定用出力
68
+ # @param [String] command
69
+ # @return [Result]
70
+ def resolute_competition(command)
71
+ m = /(\d)KR/.match(command)
72
+ return nil unless m
73
+
74
+ num_dices = m[1].to_i
75
+
76
+ dices = @randomizer.roll_barabara(num_dices, 6).sort
77
+ dice_text = dices.join(",")
78
+
79
+ counts6 = dices.count(6)
80
+ counts5 = dices.count(5)
81
+ success_num = dices.count { |val| val >= 4 }
82
+ com_text = format("(%d%d%d)", success_num, counts6, counts5)
83
+
84
+ output = "(#{num_dices}KR) > #{dice_text} > #{com_text}"
85
+
86
+ if success_num > 0
87
+ return Result.success(output)
88
+ else
89
+ return Result.failure(output)
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,321 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class LiverLabyrinth < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'LiverLabyrinth'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'ライバー&ラビリンス'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'らいはああんとらひりんす'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ 同人TRPGシステム『ライバー&ラビリンス』用ダイスボット。
18
+ ・判定コマンド(xLL+y@c$d>=z)
19
+ x:能力値
20
+ +y:ダメージ判定時の攻撃力(省略可。省略時は0)
21
+ c:クリティカル値(省略可。省略時は10)
22
+ d:クリティカル時の加算値(省略可。省略時は1)
23
+ z:難易度(4以下のとき5に。11以上は10になり、サイコロの数が減る)
24
+ (例) 6LL@8>=6
25
+ 10LL>=5
26
+ 4LL+5@10$2>=10
27
+ ・各種表 :
28
+ コマンド末尾に数字を入れると複数回の一括実行が可能 例)GETCT4
29
+ コマンド末尾に"="(イコール)と数字を入れると、特定のダイス目の結果の実行が可能 例)CRITICALT=5
30
+ ・クリティカル表(CriticalT)
31
+ ・命中ファンブル表(FumbleT)
32
+ ・致命傷表(FatalT)
33
+ ・休憩表(RestT)
34
+ ・痛恨表(TerribleT)
35
+ ・お宝表(レベル1~4)(GetCT)
36
+ ・お宝表(レベル5~8)(GetRT)
37
+ ・お宝表(レベル9~14)(GetSRT)
38
+ ・お宝表(レベル15~99)(GetURT)
39
+ INFO_MESSAGE_TEXT
40
+
41
+ def initialize(command)
42
+ super(command)
43
+
44
+ @round_type = RoundType::CEIL
45
+ end
46
+
47
+ def eval_game_system_specific_command(command)
48
+ debug("eval_game_system_specific_command begin string", command)
49
+
50
+ return check_roll(command) || roll_table_command(command)
51
+ end
52
+
53
+ def check_roll(command)
54
+ parser = Command::Parser.new("LL", round_type: RoundType::CEIL).has_prefix_number.enable_critical.enable_dollar.restrict_cmp_op_to(:>=)
55
+ parsed = parser.parse(command)
56
+ return nil if parsed.nil?
57
+
58
+ dice_cnt = parsed.prefix_number
59
+ modify = parsed.modify_number || 0
60
+ critical_target = parsed.critical || 10
61
+ critical_addition = parsed.dollar || 1
62
+
63
+ target = parsed.target_number
64
+
65
+ text = ""
66
+ if target < 5
67
+ text += "【#{command}】 > あらゆる難易度は5未満にはならないため、難易度は5になる!\n"
68
+ target = 5
69
+ elsif target >= 11
70
+ text += "【#{command}】 > 難易度が11を超えたため、超過分、ダイスの数が減少!\n"
71
+ over = target - 10
72
+ target = 10
73
+ dice_cnt -= over
74
+ end
75
+
76
+ dice_cnt = 0 if dice_cnt < 0
77
+
78
+ text += "【ダイスの数#{dice_cnt}、難易度#{target}、クリティカル#{critical_target}#{critical_addition > 1 ? '(+' + critical_addition.to_s + ')' : ''}#{modify > 0 ? '、攻撃力' + modify.to_s : ''}】"
79
+
80
+ dice_arr = @randomizer.roll_barabara(dice_cnt, 10)
81
+ dice_count = dice_arr
82
+ .group_by(&:itself)
83
+ .transform_values(&:length)
84
+
85
+ success_cnt = 0
86
+ critical_cnt = 0
87
+
88
+ dice_count.each do |v, count|
89
+ next if count == 0
90
+
91
+ if v >= target
92
+ success_cnt += count
93
+ end
94
+
95
+ if v >= critical_target
96
+ success_cnt += count * critical_addition
97
+ critical_cnt += count
98
+ end
99
+ end
100
+
101
+ dice_count_strs = (1..10).map do |v|
102
+ count = dice_count.fetch(v, 0)
103
+ next nil if count == 0
104
+
105
+ "[#{v}]×#{dice_count.fetch(v, 0)}"
106
+ end
107
+
108
+ has_critical = critical_cnt >= 3
109
+ has_fumble = dice_cnt > 0 && dice_count.fetch(1, 0) >= (dice_cnt.to_f / 2).ceil
110
+
111
+ if has_fumble
112
+ # ファンブルの場合、クリティカルは無視される
113
+ has_critical = false
114
+ success_cnt = 0
115
+ end
116
+ result = success_cnt > 0
117
+
118
+ text += " > #{dice_count_strs.compact.join(',')} > 成功度#{success_cnt} > #{result ? '成功' : '失敗'}#{has_critical ? '(クリティカル)' : ''}#{has_fumble ? '(ファンブル)' : ''}"
119
+
120
+ if result && modify > 0
121
+ text += " > #{success_cnt + modify}ダメージ"
122
+ end
123
+
124
+ Result.new.tap do |r|
125
+ r.text = text
126
+ r.critical = has_critical
127
+ r.fumble = has_fumble
128
+ r.success = result
129
+ r.failure = !result
130
+ end
131
+ end
132
+
133
+ def roll_table_command(command)
134
+ # サタスペのダイスボットを参考に実装
135
+ command = command.upcase
136
+
137
+ m = /([A-Z]+)(\d+)?(=)?(\d+)?/.match(command)
138
+ return nil unless m
139
+
140
+ table_name = m[1]
141
+ table = TABLES[table_name]
142
+ return nil if table.nil?
143
+
144
+ counts = 1
145
+ counts = m[2].to_i if m[2]
146
+ operator = m[3]
147
+ value = m[4].to_i
148
+
149
+ return nil if !operator.nil? && value <= 0 || value >= 11
150
+
151
+ result_texts = []
152
+
153
+ counts.times do |_i|
154
+ if operator == "=" && !value.nil?
155
+ info = table.choice(value)
156
+ text = "#{info.table_name}(#{value}) > #{info.body}"
157
+ else
158
+ text = roll_tables(table_name, TABLES)
159
+ end
160
+ result_texts.push(text)
161
+ end
162
+
163
+ Result.new.tap do |r|
164
+ r.text = result_texts.join("\n")
165
+ end
166
+ end
167
+
168
+ ####################
169
+ # 各種表
170
+
171
+ TABLES = {
172
+ "CRITICALT" => DiceTable::Table.new(
173
+ "クリティカル表",
174
+ "1d10",
175
+ [
176
+ "視聴者が沸き立つ一撃!閲覧数を1D10点増加させる。",
177
+ "致命的な一撃!最終的に与えるダメージが2倍になる。",
178
+ "肉体を変容させる一撃!ランダムで対象にバステを付与する。",
179
+ "魔力の消費を最小限に抑えることに成功!最終的にこのアクションで消費する《EP》が0になる。",
180
+ "取れ高発生!《トレダカ》を1点増加させる。",
181
+ "相手の動きを阻害することに成功!対象の《行動値》を0にする。",
182
+ "華麗に素材をゲット!《クレジット》を1D10点獲得する。",
183
+ "狙いが的確に決まった!対象のスキル、アプリ、ツールのうちどれか一つ、この戦闘の間、使用不能にする。",
184
+ "意識の外から刈り取る一撃!このアクションに対して、対象は防御判定を行えない。また、スキル、アプリ、ツールによるダメージ減少も無視する。",
185
+ "次の動作への連携が決まる!次に行う自身のアクションのクリティカル値を2点減少させる。",
186
+ ]
187
+ ),
188
+ "FUMBLET" => DiceTable::Table.new(
189
+ "命中ファンブル表",
190
+ "1d10",
191
+ [
192
+ "急にコメントが荒れて攻撃を外してしまう。「炎上」のバステを受ける。",
193
+ "攻撃が自分に命中。1D10点のダメージを受ける(防御判定不可)",
194
+ "アクション中に盛大にすっころぶ。「ストップ」のバステを受ける。",
195
+ "アクションが大失敗。配信の空気が冷える。《トレダカ》が1点減少する。",
196
+ "魔力の消費が爆増!このアクションで消費した《EP》を再度消費する。",
197
+ "タンマツの調子が悪い。「オフライン」のバステを受ける。",
198
+ "敵のカウンターを受ける。1D10点のダメージを受ける(防御判定不可)",
199
+ "うっかり武器を落としてしまう。支援行動で武器を拾うまで、汎用アクション以外のアクションを行うことができない。",
200
+ "仲間との連携に失敗。ランダムな味方一人の《EP》を1D10点減少する。",
201
+ "攻撃は失敗だが、ネタとして大ウケ。《閲覧数》が1D10点増加する。",
202
+ ]
203
+ ),
204
+ "FATALT" => DiceTable::Table.new(
205
+ "致命傷表",
206
+ "1d10",
207
+ [
208
+ "行動不能。ダンジョンに身体を侵食される。異形トロフィーを1つ獲得する。",
209
+ "ドラマチックなやられ方で配信が盛り上がる。《閲覧数》が2D10点増加する。自身は行動不能になる。",
210
+ "お前も道連れだ!自分にダメージを与えた対象に同じダメージを与える。このダメージ減少できない。自身は行動不能になる。",
211
+ "奇跡が起きた!?〔幸運〕で難易度10の判定に成功すると受けたダメージを0にする。",
212
+ "致命傷だがまだ動ける!《EP》を1にする。「スリップ」のバステを受ける。",
213
+ "行動不能。ダンジョンに身体を侵食される。異形トロフィーを1つ獲得する。",
214
+ "行動不能。だが、タンマツにはまだエネルギーが残っている。1ラウンド後、《EP》を1にして戦線に復帰する。",
215
+ "走馬灯が過る!走馬灯に回避のアイデアが!〔反応〕で難易度10の判定に成功すると、受けたダメージを0にする。",
216
+ "死んだかと思ったが、ギリギリのところで持ちこたえる。《EP》を1にする。",
217
+ "行動不能。ダンジョンに身体を侵食される。異形トロフィーを1つ獲得する。",
218
+ ]
219
+ ),
220
+ "RESTT" => DiceTable::Table.new(
221
+ "休憩表",
222
+ "1d10",
223
+ [
224
+ "辺りを探索すると、ツールを発見する。誰かがここに残していたのだろうか?お宝表(レベル1~4)を一回振る。",
225
+ "希少な鉱床を発見。【ダンジョン資源(中級)】を一つ獲得。",
226
+ "自身の存在が大きくブレる。任意のアクションを一つ、別のアクションに変更してもよい。",
227
+ "素晴らしい戦術を思いつく。次回のバトルフェイズでの行動値判定で振ることができるダイスが1つ増える。",
228
+ "視聴者の無茶振りについつい応えてしまう。調子に乗りすぎて体力が…。 《EP》が1D10点減少する。《トレダカ》を1点獲得。",
229
+ "何気ない雑談配信。だが危うくリテラシーのない発言をしてしまい…。 〔魅力〕で難易度8の判定を行う。閲覧数が成功度分増加。判定に失敗した場合、「炎上」のバステを受ける。",
230
+ "休憩の合間にネットサーフィン。うわ!なんか変なリンク踏んだ!?〔技術〕で難易度9の判定を行う。失敗した場合、「フリーズ」のバステを受ける。成功した場合、奇跡的に冒険者用の通販サイトに繋がる。買い物を行うことができる。",
231
+ "急にタンマツのアプリのアップデートがはじまる。アップデートが重すぎて他の通信がうまくいかない!?〔幸運〕で難易度9の判定を行う。失敗した場合、「オフライン」のバステを受ける。成功した場合、タンマツのアプデが成功し、〔EP〕が全回復する。",
232
+ "バッチリ熟睡。しっかりとした休憩を取ることができた。〔EP〕が2D10点回復する。",
233
+ "やたら魔力の巡りがいい。絶好調ってやつか!?このセッションの間、すべての主能力が1点増加する。副能力の再計算を行うこと。",
234
+ ]
235
+ ),
236
+ "TERRIBLET" => DiceTable::Table.new(
237
+ "痛恨表",
238
+ "1d10",
239
+ [
240
+ "脳が揺さぶられた!「ブライン」のバステを付与する。",
241
+ "痛恨の一撃!最終的に与えるダメージが2倍になる。",
242
+ "肉体の動きを阻害する一撃!対象の《行動値》を0にする。",
243
+ "致命的な一撃!ダメージを与える代わりに、対象の《EP》を1にする。",
244
+ "追撃を決められてしまった!ダメージを2D10点追加する。",
245
+ "場外へ吹っ飛ばした!対象を戦場から取り除く。取り除かれた対象は、ラウンド終了時に最後尾に再配置する。",
246
+ "悔しいが見栄えする一撃だ!《閲覧数》が1D10点増加する。",
247
+ "衝撃が貫通する!アクションの対象になっていないキャラ1体を選択し、そのキャラにもダメージを与える。",
248
+ "意識の外から刈り取る一撃!このアクションに対して、対象は防御判定を行えない。また、スキル、アプリ、ツールによるダメージ減少も無視する。",
249
+ "魔力を奪う一撃!与えたダメージと同じ値だけ《EP》が回復する。",
250
+ ]
251
+ ),
252
+ "GETCT" => DiceTable::Table.new(
253
+ "お宝表(レベル1~4)",
254
+ "1d10",
255
+ [
256
+ "携帯食料を1つ手に入れた! ⇒54頁参照",
257
+ "エアバッグを1つ手に入れた! ⇒53頁参照",
258
+ "携帯テントを1つ手に入れた! ⇒54頁参照",
259
+ "特効薬を1つ手に入れた! ⇒52頁参照",
260
+ "ダンジョン資源(低級)を1つ手に入れた! ⇒55頁参照",
261
+ "スモークボールを1つ手に入れた! ⇒53頁参照",
262
+ "ポーションを1つ手に入れた! ⇒52頁参照",
263
+ "クイックポーションを1つ手に入れた! ⇒52頁参照",
264
+ "ダンジョン資源(低級)を1つ手に入れた! ⇒55頁参照",
265
+ "素晴らしい戦果で配信が盛り上がる!現在の閲覧数が1D10点上昇する。",
266
+ ]
267
+ ),
268
+ "GETRT" => DiceTable::Table.new(
269
+ "お宝表(レベル5~8)",
270
+ "1d10",
271
+ [
272
+ "携帯保健室を1つ手に入れた! ⇒54頁参照",
273
+ "マショウストーンを1つ手に入れた! ⇒55頁参照",
274
+ "ぬいぐるみ爆弾を1つ手に入れた! ⇒54頁参照",
275
+ "生命の粉塵を1つ手に入れた! ⇒52頁参照",
276
+ "ダンジョン資源(中級)を1つ手に入れた! ⇒55頁参照",
277
+ "パワーポーションを1つ手に入れた! ⇒52頁参照",
278
+ "クリティカッターを1つ手に入れた! ⇒53頁参照",
279
+ "ダンジョン資源(中級)を1つ手に入れた! ⇒55頁参照",
280
+ "ハイポーションを1つ手に入れた! ⇒52頁参照",
281
+ "素晴らしい戦果で配信が盛り上がる!現在の閲覧数が2D10点上昇する。",
282
+ ]
283
+ ),
284
+ "GETSRT" => DiceTable::Table.new(
285
+ "お宝表(レベル9~14)",
286
+ "1d10",
287
+ [
288
+ "携帯食料を1つ手に入れた! ⇒54頁参照",
289
+ "フウマスリケンを1つ手に入れた! ⇒55頁参照",
290
+ "ダンジョン資源(上級)を1つ手に入れた! ⇒55頁参照",
291
+ "生命の粉塵を1つ手に入れた! ⇒52頁参照",
292
+ "コンティニューコインを1つ手に入れた! ⇒52頁参照",
293
+ "ダンジョン資源(低級)を1D10個手に入れた! ⇒55頁参照",
294
+ "フィリピンバクチクを1つ手に入れた! ⇒55頁参照",
295
+ "ダンジョン資源(上級)を1つ手に入れた! ⇒55頁参照",
296
+ "携帯病院を1つ手に入れた! ⇒54頁参照",
297
+ "素晴らしい戦果で配信が盛り上がる!現在の閲覧数が4D10点上昇する。",
298
+ ]
299
+ ),
300
+ "GETURT" => DiceTable::Table.new(
301
+ "お宝表(レベル15~99)",
302
+ "1d10",
303
+ [
304
+ "ダンジョン資源(伝説)を1つ手に入れた! ⇒55頁参照",
305
+ "マショウストーンを1D10個手に入れた! ⇒55頁参照",
306
+ "エリキシルを1つ手に入れた! ⇒54頁参照",
307
+ "ダンジョン資源(伝説)を1つ手に入れた! ⇒55頁参照",
308
+ "盗賊の鍵を1つ手に入れた! ⇒53頁参照",
309
+ "コンティニューコインを1つ手に入れた! ⇒52頁参照",
310
+ "経験値を1つ手に入れた! ⇒55頁参照",
311
+ "ダイナマイトを1つ手に入れた! ⇒55頁参照",
312
+ "エリキシルを1つ手に入れた! ⇒54頁参照",
313
+ "素晴らしい戦果で配信が盛り上がる!現在の閲覧数が8D10点上昇する。",
314
+ ]
315
+ ),
316
+ }.freeze
317
+
318
+ register_prefix('\d+LL', TABLES.keys)
319
+ end
320
+ end
321
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Lost < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'Lost'
8
+
9
+ # ゲームシステム名
10
+ NAME = '10_st'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'ろすと'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
17
+ ■ exp10_deX
18
+  特殊な10面ダイスをロールして、1の出目の数をカウントします。「a11_0ut」と「s10_th」を判定します。
19
+  X: ダイス数(省略時 1)
20
+
21
+ ■ g01_denX
22
+  特殊な20面ダイスをロールして、「0_lation」かの判定をします。
23
+  X: ダイス数(省略時 1)
24
+ INFO_MESSAGETEXT
25
+
26
+ register_prefix('exp10_de', 'g01_den')
27
+
28
+ def eval_game_system_specific_command(command)
29
+ roll_explode(command) || roll_golden(command)
30
+ end
31
+
32
+ private
33
+
34
+ def roll_explode(command)
35
+ m = /^exp10_de([+\-\d]+)?$/i.match(command)
36
+ unless m
37
+ return nil
38
+ end
39
+
40
+ times = m[1] ? Arithmetic.eval(m[1], round_type: round_type) : 1
41
+ if times.nil? || times <= 0
42
+ return nil
43
+ end
44
+
45
+ values = @randomizer.roll_barabara(times, 10).map do |v|
46
+ v <= 5 ? 1 : 0
47
+ end
48
+
49
+ is_allout = values.all? { |v| v == 1 }
50
+ is_sloth = values.all? { |v| v == 0 }
51
+
52
+ times_str = times > 1 ? times.to_i : ""
53
+
54
+ if is_allout
55
+ Result.success("(exp10_de#{times_str}) > [#{values.join(',')}] > a11_0ut")
56
+ elsif is_sloth
57
+ Result.failure("(exp10_de#{times_str}) > [#{values.join(',')}] > s10_th")
58
+ else
59
+ Result.new("(exp10_de#{times_str}) > [#{values.join(',')}] > #{values.count(1)}")
60
+ end
61
+ end
62
+
63
+ def roll_golden(command)
64
+ m = /^g01_den([+\-\d]+)?$/i.match(command)
65
+ unless m
66
+ return nil
67
+ end
68
+
69
+ times = m[1] ? Arithmetic.eval(m[1], round_type: round_type) : 1
70
+ if times.nil? || times <= 0
71
+ return nil
72
+ end
73
+
74
+ values = @randomizer.roll_barabara(times, 20).map do |v|
75
+ v == 1 ? 1 : 0
76
+ end
77
+
78
+ is_olation = values.all? { |v| v == 0 }
79
+ times_str = times > 1 ? times.to_i : ""
80
+
81
+ if is_olation
82
+ Result.failure("(g01_den#{times_str}) > [#{values.join(',')}] > 0_lation")
83
+ else
84
+ Result.new("(g01_den#{times_str}) > [#{values.join(',')}]")
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/base"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class MagicPunk < Base
8
+ # ゲームシステムの識別子
9
+ ID = "MagicPunk"
10
+
11
+ # ゲームシステム名
12
+ NAME = "マジックパンクTRPG"
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = "ましつくはんくTRPG"
16
+
17
+ HELP_MESSAGE = <<~TEXT
18
+ ■ 判定 (nMPm)
19
+ nD20のダイスロールをして、m以下の目があれば成功。
20
+ mと同じ目があればジャックポット(自動成功)。
21
+ すべての目が1ならバッドビート(自動失敗)。
22
+ ■ チャレンジ判定 (nMPmCx)
23
+ 通常の判定に加えてチャレンジ値x以上の目が必要になる。
24
+ ■ ダイス数0 (0MPmCx)
25
+ 修正によりダイス数が0になった場合は2d20のダイスロールを行う。
26
+ 2つの目からより悪い結果になる方を採用する。
27
+ TEXT
28
+
29
+ register_prefix('^\d*MP\d+')
30
+
31
+ def eval_game_system_specific_command(command)
32
+ return roll_mp(command)
33
+ end
34
+
35
+ private
36
+
37
+ def roll_mp(command)
38
+ m = /^(\d*)MP(\d+)(C?)(\d*)$/.match(command)
39
+ return nil unless m
40
+
41
+ # 構文解析
42
+ dices = m[1].empty? ? 1 : m[1].to_i
43
+ spec = m[2].to_i
44
+ opt1 = m[3]
45
+ arg1 = m[4].to_i
46
+ # ダイス数0モードフラグ
47
+ is_zero = dices == 0
48
+ # チャレンジ値
49
+ challenge = opt1 == "C" ? arg1 : 0
50
+ # ダイスロール
51
+ dice_list = @randomizer.roll_barabara(is_zero ? 2 : dices, 20)
52
+ # 通常は1つ成功なら成功、0ダイス時はすべて成功したとき成功
53
+ check_method = is_zero ? :all? : :any?
54
+ # 通常はすべて失敗なら失敗、0ダイス時は1つ失敗したら失敗
55
+ fail_method = is_zero ? :any? : :all?
56
+
57
+ check = dice_list.public_send(check_method) { |d| d <= spec && challenge <= d } # 通常判定
58
+ is_jp = dice_list.public_send(check_method) { |d| d == spec } # ジャックポット判定
59
+ is_bb = dice_list.public_send(fail_method) { |d| d == 1 } # バッドビート判定
60
+
61
+ result = if is_bb # 自動失敗優先
62
+ is_jp = false
63
+ check = false
64
+ translate("MagicPunk.bad_beat")
65
+ elsif is_jp
66
+ check = true
67
+ translate("MagicPunk.jackpot")
68
+ elsif check
69
+ value_method = is_zero ? :min : :max
70
+ value = dice_list.select { |d| d <= spec }.public_send(value_method)
71
+ translate("MagicPunk.success", value: value)
72
+ else
73
+ translate("failure")
74
+ end
75
+
76
+ return Result.new.tap do |r|
77
+ r.fumble = is_bb
78
+ r.critical = is_jp
79
+ r.condition = check
80
+ r.text = "(#{dices}MP#{spec}C#{challenge}) > [#{dice_list.join(',')}] > #{result}"
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/game_system/MagicPunk"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class MagicPunk_Korean < MagicPunk
8
+ # ゲームシステムの識別子
9
+ ID = "MagicPunk:Korean"
10
+
11
+ # ゲームシステム名
12
+ NAME = "매직펑크TRPG"
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = "国際化:Korean:매직펑크TRPG"
16
+
17
+ HELP_MESSAGE = <<~TEXT
18
+ ■ 판정 (nMPm)
19
+ nD20을 굴려, m 이하의 눈이 있으면 성공.
20
+ m과 같은 눈이 있으면 잭팟(자동 성공).
21
+ 모든 눈이 1이면 배드 비트(자동 실패).
22
+
23
+ ■ 챌린지 판정 (nMPmCx)
24
+ 통상 판정에 더해, 챌린지 값 x 이상의 눈이 필요.
25
+
26
+ ■ 주사위 수 0개 (0MPmCx)
27
+ 수정치 등으로 주사위 수가 0개가 된 경우 2d20을 굴림.
28
+ 두 개의 눈 중 더 나쁜 쪽의 결과를 적용.
29
+ TEXT
30
+
31
+ register_prefix_from_super_class()
32
+
33
+ def initialize(command)
34
+ super(command)
35
+ @locale = :ko_kr
36
+ end
37
+ end
38
+ end
39
+ end