bcdice 3.3.0 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
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