bcdice 3.3.0 → 3.6.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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +158 -74
  3. data/README.md +2 -1
  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/FutariSousa/ja_jp.yml +705 -9
  8. data/i18n/KillDeathBusiness/ja_jp.yml +2 -2
  9. data/i18n/MagicaLogia/ja_jp.yml +1 -1
  10. data/i18n/MonotoneMuseum/ko_kr.yml +526 -53
  11. data/i18n/SwordWorld/ja_jp.yml +6 -0
  12. data/i18n/SwordWorld2_0/ja_jp.yml +37 -0
  13. data/i18n/SwordWorld2_5/ja_jp.yml +57 -0
  14. data/lib/bcdice/common_command/add_dice/node.rb +28 -4
  15. data/lib/bcdice/common_command/add_dice/parser.rb +149 -85
  16. data/lib/bcdice/common_command/choice.rb +82 -7
  17. data/lib/bcdice/common_command/tally_dice/node.rb +135 -0
  18. data/lib/bcdice/common_command/tally_dice/parser.rb +302 -0
  19. data/lib/bcdice/common_command/tally_dice.rb +19 -0
  20. data/lib/bcdice/common_command.rb +2 -0
  21. data/lib/bcdice/dice_table/d66_left_range_table.rb +29 -0
  22. data/lib/bcdice/dice_table/d66_parity_table.rb +8 -0
  23. data/lib/bcdice/dice_table/d66_table.rb +5 -1
  24. data/lib/bcdice/dice_table.rb +1 -0
  25. data/lib/bcdice/game_system/AngelGear.rb +9 -4
  26. data/lib/bcdice/game_system/Aoharubaan.rb +91 -0
  27. data/lib/bcdice/game_system/AssaultEngine.rb +91 -0
  28. data/lib/bcdice/game_system/Avandner.rb +1 -2
  29. data/lib/bcdice/game_system/Ayabito.rb +229 -0
  30. data/lib/bcdice/game_system/BadLife.rb +264 -289
  31. data/lib/bcdice/game_system/Bakenokawa.rb +244 -0
  32. data/lib/bcdice/game_system/BattleTech.rb +1 -1
  33. data/lib/bcdice/game_system/BeginningIdol.rb +116 -2390
  34. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +10 -2312
  35. data/lib/bcdice/game_system/CastleInGray.rb +133 -0
  36. data/lib/bcdice/game_system/Cthulhu.rb +2 -2
  37. data/lib/bcdice/game_system/Cthulhu7th.rb +10 -10
  38. data/lib/bcdice/game_system/Cthulhu_SimplifiedChinese.rb +60 -0
  39. data/lib/bcdice/game_system/CyberpunkRed.rb +135 -0
  40. data/lib/bcdice/game_system/DarkDaysDrive.rb +76 -41
  41. data/lib/bcdice/game_system/DoubleCross.rb +5 -0
  42. data/lib/bcdice/game_system/Dracurouge.rb +2 -1
  43. data/lib/bcdice/game_system/Elysion.rb +36 -20
  44. data/lib/bcdice/game_system/Emoklore.rb +1 -1
  45. data/lib/bcdice/game_system/FateCoreSystem.rb +117 -0
  46. data/lib/bcdice/game_system/FutariSousa.rb +48 -4
  47. data/lib/bcdice/game_system/GranCrest.rb +171 -406
  48. data/lib/bcdice/game_system/Irisbane.rb +154 -0
  49. data/lib/bcdice/game_system/Karukami.rb +84 -0
  50. data/lib/bcdice/game_system/KemonoNoMori.rb +17 -17
  51. data/lib/bcdice/game_system/KurayamiCrying.rb +1 -1
  52. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
  53. data/lib/bcdice/game_system/NeverCloud.rb +19 -8
  54. data/lib/bcdice/game_system/PersonaO.rb +86 -0
  55. data/lib/bcdice/game_system/Revulture.rb +2 -2
  56. data/lib/bcdice/game_system/Shiranui.rb +145 -0
  57. data/lib/bcdice/game_system/ShuumatsuKikou.rb +298 -0
  58. data/lib/bcdice/game_system/StarryDolls.rb +318 -0
  59. data/lib/bcdice/game_system/SteamPunkers.rb +14 -1
  60. data/lib/bcdice/game_system/StellarKnights.rb +1 -1
  61. data/lib/bcdice/game_system/{SterileLife.rb → StellarLife.rb} +162 -226
  62. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +18 -5
  63. data/lib/bcdice/game_system/SwordWorld.rb +11 -7
  64. data/lib/bcdice/game_system/SwordWorld2_0.rb +30 -38
  65. data/lib/bcdice/game_system/SwordWorld2_5.rb +9 -63
  66. data/lib/bcdice/game_system/TalesFromTheLoop.rb +83 -0
  67. data/lib/bcdice/game_system/TorgEternity.rb +2 -2
  68. data/lib/bcdice/game_system/ToshiakiHolyGrailWar.rb +92 -0
  69. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +29 -28
  70. data/lib/bcdice/game_system/YearZeroEngine.rb +40 -19
  71. data/lib/bcdice/game_system/beginning_idol/accessories_table.rb +31 -0
  72. data/lib/bcdice/game_system/beginning_idol/bad_status_table.rb +43 -0
  73. data/lib/bcdice/game_system/beginning_idol/chain_d66_table.rb +29 -0
  74. data/lib/bcdice/game_system/beginning_idol/chain_table.rb +37 -0
  75. data/lib/bcdice/game_system/beginning_idol/costume_table.rb +37 -0
  76. data/lib/bcdice/game_system/beginning_idol/d6_twice_table.rb +36 -0
  77. data/lib/bcdice/game_system/beginning_idol/item_table.rb +51 -0
  78. data/lib/bcdice/game_system/beginning_idol/my_skill_name_table.rb +44 -0
  79. data/lib/bcdice/game_system/beginning_idol/random_event_table.rb +31 -0
  80. data/lib/bcdice/game_system/beginning_idol/skill_table.rb +63 -0
  81. data/lib/bcdice/game_system/beginning_idol/table.rb +193 -0
  82. data/lib/bcdice/game_system/beginning_idol/with_abnormality.rb +74 -0
  83. data/lib/bcdice/game_system/beginning_idol/work_table.rb +57 -0
  84. data/lib/bcdice/game_system/cyberpunk_red/tables.rb +530 -0
  85. data/lib/bcdice/game_system/meikyu_kingdom/tables.rb +1 -1
  86. data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +1 -1
  87. data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +4 -4
  88. data/lib/bcdice/game_system/satasupe/tables.rb +1 -1
  89. data/lib/bcdice/game_system/sword_world/rating_options.rb +47 -0
  90. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +40 -45
  91. data/lib/bcdice/game_system/sword_world/rating_parser.rb +172 -141
  92. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +14 -10
  93. data/lib/bcdice/game_system.rb +16 -1
  94. data/lib/bcdice/randomizer.rb +1 -1
  95. data/lib/bcdice/version.rb +1 -1
  96. metadata +45 -5
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class AssaultEngine < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'AssaultEngine'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'アサルトエンジン'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'あさるとえんしん'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ・判定 AEt (t目標値)
18
+ 例: AE45 (目標値45)
19
+ ・リロール nAEt (nロール前の値、t目標値)
20
+ 例: 76AE45 (目標値45で、76を振り直す)
21
+
22
+ ・スワップ(t目標値) エネミーブックP11
23
+ 例: AES45 (目標値45、スワップ表示あり)
24
+ MESSAGETEXT
25
+
26
+ register_prefix('\d*AE')
27
+
28
+ def initialize(command)
29
+ super(command)
30
+ @round_type = RoundType::FLOOR # 端数切り捨て
31
+ end
32
+
33
+ def eval_game_system_specific_command(command)
34
+ cmd = Command::Parser.new(/AES?/, round_type: round_type).enable_prefix_number
35
+ .has_suffix_number.parse(command)
36
+ return nil unless cmd
37
+
38
+ target = cmd.suffix_number
39
+ target = 99 if target >= 100
40
+
41
+ if cmd.command.include?("AES") # SWAP初回
42
+ total = @randomizer.roll_once(100) % 100 # 0-99
43
+ swap = (total % 10) * 10 + (total / 10)
44
+ r1 = judge(target, total)
45
+ r2 = judge(target, swap)
46
+ text = "(AES#{format00(target)}) > #{r1.text} / スワップ#{r2.text}"
47
+ check_result(r1, r2, text)
48
+ elsif cmd.prefix_number.nil? # 初回ロール
49
+ total = @randomizer.roll_once(100) % 100 # 0-99
50
+ judge(target, total).tap do |r|
51
+ r.text = "(AE#{format00(target)}) > #{r.text}"
52
+ end
53
+ else # リロール
54
+ now = cmd.prefix_number
55
+ die = @randomizer.roll_once(10) % 10 # 0-9
56
+ new1 = judge(target, (now / 10 * 10) + die) # 1の位を振り直す
57
+ new2 = judge(target, now % 10 + die * 10) # 10の位を振り直す
58
+
59
+ text = "(#{format00(now)}AE#{format00(target)}) > #{die} > #{new1.text} / #{new2.text}"
60
+ check_result(new1, new2, text)
61
+ end
62
+ end
63
+
64
+ def format00(dice)
65
+ format("%02d", dice)
66
+ end
67
+
68
+ def check_result(result1, result2, text)
69
+ if result1.critical? || result2.critical?
70
+ Result.critical(text)
71
+ elsif result1.success? || result2.success?
72
+ Result.success(text)
73
+ elsif result1.fumble? && result2.fumble?
74
+ Result.fumble(text)
75
+ else
76
+ Result.failure(text)
77
+ end
78
+ end
79
+
80
+ def judge(target, total)
81
+ double = (total / 10) == (total % 10)
82
+ total_text = format00(total)
83
+ if total <= target
84
+ double ? Result.critical("(#{total_text})クリティカル") : Result.success("(#{total_text})成功")
85
+ else
86
+ double ? Result.fumble("(#{total_text})ファンブル") : Result.failure("(#{total_text})失敗")
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -48,8 +48,7 @@ module BCDice
48
48
  target = Regexp.last_match(2).to_i
49
49
  damage = (Regexp.last_match(5) || 0).to_i
50
50
  criticalTrigger = (Regexp.last_match(7) || 0).to_i
51
- criticalNumber = (Regexp.last_match(9) || 1).to_i
52
- criticalNumber = 2 if criticalNumber > 3
51
+ criticalNumber = (Regexp.last_match(9) || 1).to_i.clamp(0, 2)
53
52
  return checkRoll(diceCount, target, damage, criticalTrigger, criticalNumber)
54
53
  end
55
54
 
@@ -0,0 +1,229 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/command/parser'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class Ayabito < Base
8
+ # ゲームシステムの識別子
9
+ ID = "Ayabito"
10
+
11
+ # ゲームシステム名
12
+ NAME = "あやびと"
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = "あやひと"
16
+
17
+ HELP_MESSAGE = <<~TEXT
18
+ ・判定コマンド(xAB±y@c>=z)
19
+ x:サイコロの数(10以上の場合9個振り、それ以降を成功数2として加算する)
20
+ ±y:成功数への補正(省略可)
21
+ c:クリティカル値(@ごと省略可。省略時は6)
22
+ z:目標値(妨害値など。>=ごと省略可)
23
+ (例) 4AB
24
+ 11AB>=5
25
+ 5AB+1
26
+ 6AB@5>=3
27
+
28
+ ・各種表
29
+ 感情表 ET
30
+ 帝都東京シーン表 TST / 場面演出シーン表 BST
31
+ 交流表 CET
32
+ ファンブル表 FT
33
+ 封印期間表 LT
34
+ TEXT
35
+
36
+ def initialize(command)
37
+ super(command)
38
+ @sort_barabara_dice = true
39
+ @round_type = RoundType::CEIL
40
+ end
41
+
42
+ def eval_game_system_specific_command(command)
43
+ return check_action(command) || roll_tables(command, TABLES)
44
+ end
45
+
46
+ def check_action(command)
47
+ parser = Command::Parser.new("AB", round_type: RoundType::CEIL).has_prefix_number.enable_critical.restrict_cmp_op_to(nil, :>=)
48
+ parsed = parser.parse(command)
49
+ return nil if parsed.nil?
50
+
51
+ if parsed.prefix_number < 10
52
+ dice_cnt = parsed.prefix_number
53
+ over_modify = 0
54
+ else
55
+ dice_cnt = 9
56
+ over_modify = parsed.prefix_number - 9
57
+ end
58
+ modify = parsed.modify_number
59
+ critical_target = parsed.critical || 6
60
+ target = parsed.target_number
61
+
62
+ dice_arr = @randomizer.roll_barabara(dice_cnt, 6).sort
63
+ dice_str = dice_arr.join(",")
64
+ has_critical = dice_arr.any? { |x| x >= critical_target }
65
+ success_cnt = dice_arr.count { |x| x >= 4 } + dice_arr.count(6) + over_modify * 2
66
+ has_fumble = success_cnt == 0 && dice_arr.include?(1)
67
+ if has_fumble
68
+ success_cnt = 0
69
+ else
70
+ success_cnt += modify
71
+ end
72
+ result = target.nil? ? success_cnt >= 1 : success_cnt > target
73
+
74
+ Result.new.tap do |r|
75
+ r.text = "(#{dice_cnt}B6>=4)#{over_modify > 0 ? "+#{over_modify * 2}" : ''} > [#{dice_str}]#{over_modify > 0 ? "+#{over_modify * 2}" : ''} > 成功数#{success_cnt} > #{result ? '成功' : '失敗'}#{has_critical ? '(クリティカル)' : ''}#{has_fumble ? '(ファンブル)' : ''}"
76
+ r.critical = has_critical
77
+ r.fumble = has_fumble
78
+ r.success = result
79
+ r.failure = !result
80
+ end
81
+ end
82
+
83
+ TABLES = {
84
+ 'ET' => DiceTable::D66Table.new(
85
+ '感情表',
86
+ D66SortType::NO_SORT,
87
+ {
88
+ 11 => '信頼/不信感',
89
+ 12 => '好奇心/無関心',
90
+ 13 => '優越感/劣等感',
91
+ 14 => '好意/敵意',
92
+ 15 => '安心感/不安感',
93
+ 16 => '愛情/偏愛',
94
+ 21 => '同情/憐憫',
95
+ 22 => '親近感/疎外感',
96
+ 23 => '連帯感/隔意',
97
+ 24 => '尽力/面倒',
98
+ 25 => '貸し/借り',
99
+ 26 => '庇護欲/食傷',
100
+ 31 => '期待/反発',
101
+ 32 => '熱狂/心酔',
102
+ 33 => '幸福感/不快感',
103
+ 34 => '尊敬/軽蔑',
104
+ 35 => '憧憬/嫉妬',
105
+ 36 => '忠誠/服従',
106
+ 41 => '友情/侮蔑',
107
+ 42 => '競争心/警戒',
108
+ 43 => '感謝/後悔',
109
+ 44 => '感服/恐怖',
110
+ 45 => '興味/屈辱',
111
+ 46 => '誠意/憎悪',
112
+ 51 => '羨望/嫌悪',
113
+ 52 => '共感/懸念',
114
+ 53 => '傾倒/厭気',
115
+ 54 => '赦し/怒り',
116
+ 55 => '有為/苦手',
117
+ 56 => '恩義/不満',
118
+ 61 => '予感/困惑',
119
+ 62 => '懐旧/忘却',
120
+ 63 => '慕情/執着',
121
+ 64 => '夢中/退屈',
122
+ 65 => '贖罪/罪悪感',
123
+ 66 => '慈愛/殺意',
124
+ }
125
+ ),
126
+ 'TST' => DiceTable::D66LeftRangeTable.new(
127
+ '帝都東京シーン表',
128
+ D66SortType::NO_SORT,
129
+ [
130
+ [1..1, Array.new(6, "子~巳までの任意の十二支を選択する。")],
131
+ [2..3, [
132
+ "[子]帝国大学の赤門、学生たちが今日も勉学に励んでいる。",
133
+ "[丑]吉原の歓楽街。昼間は静かだが、夜は活気を見せてくれる。",
134
+ "[寅]上野公園。桜に新緑、紅葉など、季節の顔を見せてくれる。",
135
+ "[卯]浅草六区は今日も賑やか。浅草寺や仲見世には、多くの人々が行き交う。",
136
+ "[辰]凌雲閣。浅草十二階として親しまれる塔に昇り、周囲を一望する。",
137
+ "[巳]丸の内の東京駅。構内の喧騒とは裏腹に、霞ヶ関は静かに時が流れる。",
138
+ ]],
139
+ [4..5, [
140
+ "[午]銀座をぶらぶらと歩く。百貨店が立ち並ぶこの街では、何でも買うことができるらしい。",
141
+ "[未]日比谷の帝国劇場。演目は、話題のトップスタアによる華やかなる歌劇のようだ。",
142
+ "[申]皇居のほとり。水面にうかぶ蓮の葉が、しずかに揺れている。",
143
+ "[酉]明治神宮の境内。神聖なる雰囲気を味わうことができる。",
144
+ "[戌]新たな東京の名所である新宿。今では東西を二分する街である。",
145
+ "[亥]日本帝国軍駐屯地。妖怪人間共同実働部隊の本部も敷地内にある。",
146
+ ]],
147
+ [6..6, Array.new(6, "午~亥まで任意の十二支を選択する。")],
148
+ ]
149
+ ),
150
+ 'BST' => DiceTable::D66LeftRangeTable.new(
151
+ '場面演出シーン表',
152
+ D66SortType::NO_SORT,
153
+ [
154
+ [1..1, Array.new(6, "子~巳までの任意の十二支を選択する。")],
155
+ [2..3, [
156
+ "[子]人々が寝静まる帝都の夜。月に雲がかかるとともに、魔の香りが漂っている。",
157
+ "[丑]草木も眠る静けさの中、犬の遠吠えだけが聞こえてくる。",
158
+ "[寅]一陣の風が吹き抜ける。風に乗った匂いが、妙に鼻をくすぐってきた。",
159
+ "[卯]霧や朝もやに包まれる。向こうに見える姿は誰だろうか……",
160
+ "[辰]帝都に朝日が射す。人々は起き出し、日々の営みを始める。",
161
+ "[巳]清廉な雰囲気の風景。鳥や虫の声、風にそよぐ木々の音が聞こえてくる。",
162
+ ]],
163
+ [4..5, [
164
+ "[午]時計の針がある時間を指し示す。刻を告げるチャイムや鐘が響き渡る。",
165
+ "[未]昼間の大通り。自動車や路面電車が走り、行き交う人々の雑踏が至るところで見られる。",
166
+ "[申]夕刻、どこからともなく、定かではない声や物音が漏れてくる。",
167
+ "[酉]瓦斯灯(がすとう)が通りを鮮やかに照らす。夜が街のもうひとつの顔を出し始める。",
168
+ "[戌]星空の下、月明かりが微かに夜道を照らしている。",
169
+ "[亥]光ひとつない暗闇の中。何者かの気配が蠢いている……",
170
+ ]],
171
+ [6..6, Array.new(6, "午~亥まで任意の十二支を選択する。")],
172
+ ]
173
+ ),
174
+ 'CET' => DiceTable::D66LeftRangeTable.new(
175
+ '交流表',
176
+ D66SortType::NO_SORT,
177
+ [
178
+ [1..1, Array.new(6, "感情~性格までの任意のテーマを選択する。")],
179
+ [2..3, [
180
+ "[感情]相手に抱いている感情、伝えるべきか伝えないべきか。",
181
+ "[人間]相手に人間という存在をどう思うか、聞いてみるとしよう。",
182
+ "[友達]相手に友人や仲間について語ろう。話すことで分かる想いもあるだろう。",
183
+ "[告白]相手に話していいか分からないが、自分の秘めたる想いを語ろう。",
184
+ "[思い出]相手に、過去の思い出を話してみよう。相手から昔話をきけるかもしれない。",
185
+ "[性格]相手に自身の性格を語ろう。表向きのみ話すか、奥底まで話してしまうかは、事と次第による。",
186
+ ]],
187
+ [4..5, [
188
+ "[関係性]相手とは、いつからこうした関係だったのか。相手と関係性について話そう。",
189
+ "[妖怪]相手に妖怪という存在をどう思うか、聞いてみるとしよう。",
190
+ "[あやびと]相手に、自分があやびとである意味や意義を語ってみよう。",
191
+ "[想い]相手が今、何かしら想う人や物事について聞いてみよう。",
192
+ "[夢]相手に自分の夢を語ろう。未来の夢、かつて捨てた夢かもしれない。",
193
+ "[半生]相手に自身の半生を語ろう。半生こそが、今の自分となるきっかけなのだから……",
194
+ ]],
195
+ [6..6, Array.new(6, "関係性~半生までの任意のテーマを選択する。")],
196
+ ]
197
+ ),
198
+ 'FT' => DiceTable::Table.new(
199
+ 'ファンブル表',
200
+ '1D6',
201
+ [
202
+ 'PCの【耐久値】を-5する(最低1)。',
203
+ 'PCの【活力値】を-5する(最低1)',
204
+ 'PCは戦闘ないしフェイズが終了するまで《アビリティ》を使用できない。',
205
+ 'PCは戦闘ないしフェイズが終了するまで[絆]を使用できない。',
206
+ 'セッション終了時まで、登場するエネミーすべての【耐久値】を+3する',
207
+ 'セッション終了時まで、登場するエネミーすべてのダメージを+2する。',
208
+ ]
209
+ ),
210
+ 'LT' => DiceTable::Table.new(
211
+ '封印期間表',
212
+ '1D6',
213
+ [
214
+ # '1日',
215
+ '1週間',
216
+ '1ヶ月',
217
+ '1年',
218
+ '10年',
219
+ '50年',
220
+ '100年',
221
+ # '500年',
222
+ ]
223
+ ),
224
+ }.freeze
225
+
226
+ register_prefix('\d*AB', TABLES.keys)
227
+ end
228
+ end
229
+ end