bcdice 3.11.0 → 3.13.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +58 -0
- data/i18n/FutariSousa/ko_kr.yml +1625 -529
- data/i18n/Insane/ko_kr.yml +393 -258
- data/i18n/NinjaSlayer2/ja_jp.yml +34 -0
- data/lib/bcdice/arithmetic/parser.rb +4 -2
- data/lib/bcdice/base.rb +1 -1
- data/lib/bcdice/command/parser.rb +4 -2
- data/lib/bcdice/common_command/add_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/barabara_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/calc/parser.rb +4 -2
- data/lib/bcdice/common_command/reroll_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/tally_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/upper_dice/parser.rb +4 -2
- data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
- data/lib/bcdice/game_system/Alsetto.rb +2 -2
- data/lib/bcdice/game_system/AniMalus.rb +221 -0
- data/lib/bcdice/game_system/ArknightsFan.rb +182 -0
- data/lib/bcdice/game_system/Avandner.rb +1 -1
- data/lib/bcdice/game_system/BBN.rb +1 -1
- data/lib/bcdice/game_system/BadLife.rb +3 -3
- data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
- data/lib/bcdice/game_system/Chill3.rb +6 -6
- data/lib/bcdice/game_system/DarkSouls.rb +1 -1
- data/lib/bcdice/game_system/Elric.rb +1 -1
- data/lib/bcdice/game_system/Emoklore.rb +4 -6
- data/lib/bcdice/game_system/FullFace.rb +92 -0
- data/lib/bcdice/game_system/FutariSousa_Korean.rb +44 -19
- data/lib/bcdice/game_system/HunterTheReckoning5th.rb +10 -3
- data/lib/bcdice/game_system/InfiniteFantasia.rb +4 -1
- data/lib/bcdice/game_system/Insane_Korean.rb +11 -11
- data/lib/bcdice/game_system/Irisbane.rb +1 -1
- data/lib/bcdice/game_system/KamitsubakiCityUnderConstructionNarrative.rb +251 -0
- data/lib/bcdice/game_system/KillDeathBusiness.rb +1 -1
- data/lib/bcdice/game_system/KyokoShinshoku.rb +158 -0
- data/lib/bcdice/game_system/Liminal.rb +136 -0
- data/lib/bcdice/game_system/MetalHead.rb +1 -1
- data/lib/bcdice/game_system/MetalHeadExtream.rb +1 -1
- data/lib/bcdice/game_system/NRR.rb +122 -0
- data/lib/bcdice/game_system/NSSQ.rb +1 -1
- data/lib/bcdice/game_system/NightWizard.rb +1 -1
- data/lib/bcdice/game_system/NightWizard3rd.rb +15 -2
- data/lib/bcdice/game_system/NinjaSlayer.rb +3 -1
- data/lib/bcdice/game_system/NinjaSlayer2.rb +299 -0
- data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
- data/lib/bcdice/game_system/PastFutureParadox.rb +1238 -0
- data/lib/bcdice/game_system/Postman.rb +3 -3
- data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
- data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +10 -7
- data/lib/bcdice/game_system/Ryutama.rb +4 -4
- data/lib/bcdice/game_system/SajinsenkiAGuS.rb +5 -1
- data/lib/bcdice/game_system/SajinsenkiAGuS2E.rb +285 -0
- data/lib/bcdice/game_system/Siren.rb +97 -0
- data/lib/bcdice/game_system/Skynauts.rb +1 -1
- data/lib/bcdice/game_system/SkynautsBouken.rb +1 -1
- data/lib/bcdice/game_system/Strave.rb +1 -1
- data/lib/bcdice/game_system/SwordWorld.rb +16 -0
- data/lib/bcdice/game_system/SwordWorld2_5.rb +8 -1
- data/lib/bcdice/game_system/TherapieSein.rb +1 -1
- data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
- data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +21 -9
- data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +179 -0
- data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +1 -1
- data/lib/bcdice/game_system/sword_world/rating_options.rb +3 -0
- data/lib/bcdice/game_system/sword_world/rating_parsed.rb +9 -0
- data/lib/bcdice/game_system/sword_world/rating_parser.rb +177 -130
- data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -1
- data/lib/bcdice/game_system.rb +12 -0
- data/lib/bcdice/loader.rb +1 -1
- data/lib/bcdice/version.rb +1 -1
- metadata +32 -5
|
@@ -22,14 +22,14 @@ module BCDice
|
|
|
22
22
|
2VMF6+3
|
|
23
23
|
2VMI9H3
|
|
24
24
|
|
|
25
|
-
難易度指定:成功数のカウント、判定成功と失敗、Critical処理、Critical Winのチェックを行う
|
|
25
|
+
難易度指定:成功数のカウント、判定成功と失敗、Critical処理、Critical Win、Total Failureのチェックを行う
|
|
26
26
|
(Hungerダイスがある場合)Messy CriticalとBestial Failureチェックを行う
|
|
27
27
|
例) (難易度)VMF(通常ダイス)+(Hungerダイス)
|
|
28
28
|
(難易度)VMF(通常ダイス)
|
|
29
29
|
(難易度)VMI(通常ダイス)H(Hungerダイス)
|
|
30
30
|
(難易度)VMI(通常ダイス)
|
|
31
31
|
|
|
32
|
-
難易度省略:成功数のカウント、判定失敗、Critical
|
|
32
|
+
難易度省略:成功数のカウント、判定失敗、Critical処理、Total Failure、(Hungerダイスがある場合)Bestial Failureチェックを行う
|
|
33
33
|
判定成功、Messy Criticalのチェックを行わない
|
|
34
34
|
Critical Win、(Hungerダイスがある場合)Bestial Failure、Messy Criticalのヒントを出力
|
|
35
35
|
例) VMF(通常ダイス)+(Hungerダイス)
|
|
@@ -58,20 +58,23 @@ module BCDice
|
|
|
58
58
|
register_prefix('\d*(VMF|(VMI\d*(H\d?)?))')
|
|
59
59
|
|
|
60
60
|
def eval_game_system_specific_command(command)
|
|
61
|
-
m = /\A(\d+)?(((VMF)(\d)(\+(\d+))?)|((VMI)(\d)(H(\d+))?))$/.match(command)
|
|
61
|
+
m = /\A(\d+)?(((VMF)(\d+)(\+(\d+))?)|((VMI)(\d+)(H(\d+))?))$/.match(command)
|
|
62
62
|
unless m
|
|
63
63
|
return ''
|
|
64
64
|
end
|
|
65
65
|
|
|
66
66
|
dice_pool, hunger_dice_pool = get_dice_pools(m)
|
|
67
67
|
if dice_pool < 0
|
|
68
|
-
return "
|
|
68
|
+
return "ダイスプール0のときにHungerダイスは指定できません。"
|
|
69
|
+
end
|
|
70
|
+
if hunger_dice_pool > 5
|
|
71
|
+
return "Hungerダイス指定は5ダイスが最大です。"
|
|
69
72
|
end
|
|
70
73
|
|
|
71
74
|
dice_text, success_dice, ten_dice, = make_dice_roll(dice_pool)
|
|
72
75
|
result_text = "(#{dice_pool}D10"
|
|
73
76
|
|
|
74
|
-
if hunger_dice_pool
|
|
77
|
+
if hunger_dice_pool >= 0
|
|
75
78
|
hunger_dice_text, hunger_success_dice, hunger_ten_dice, hunger_botch_dice = make_dice_roll(hunger_dice_pool)
|
|
76
79
|
|
|
77
80
|
ten_dice += hunger_ten_dice
|
|
@@ -97,11 +100,17 @@ module BCDice
|
|
|
97
100
|
hunger_dice_included_command = m[COMMAND_HUNGER_DICE_INCLUDED_INDEX]
|
|
98
101
|
if hunger_dice_included_command && hunger_dice_included_command == "VMI"
|
|
99
102
|
# Hunger Diceを内数処理するの場合
|
|
100
|
-
hunger_dice_pool = m[HUNGER_DICE_INCLUDED_INDEX]
|
|
101
|
-
|
|
103
|
+
hunger_dice_pool = m[HUNGER_DICE_INCLUDED_INDEX].nil? ? -1 : m[HUNGER_DICE_INCLUDED_INDEX].to_i
|
|
104
|
+
dice_pool_value = m[DICE_POOL_HUNGER_DICE_INCLUDED_INDEX].to_i
|
|
105
|
+
dice_pool = dice_pool_value - (hunger_dice_pool < 0 ? 0 : hunger_dice_pool)
|
|
106
|
+
if dice_pool_value > 0 && hunger_dice_pool >= dice_pool_value
|
|
107
|
+
# 1 以上のダイスプール、かつ、Hungerダイスがダイスプール以上のとき、ダイスプールが全てHungerダイスになる。
|
|
108
|
+
dice_pool = 0
|
|
109
|
+
hunger_dice_pool = dice_pool_value
|
|
110
|
+
end
|
|
102
111
|
else
|
|
103
112
|
# Hunger DiceがPLによる内数指定の場合
|
|
104
|
-
hunger_dice_pool = m[HUNGER_DICE_NO_INCLUDED_INDEX]
|
|
113
|
+
hunger_dice_pool = m[HUNGER_DICE_NO_INCLUDED_INDEX].nil? ? -1 : m[HUNGER_DICE_NO_INCLUDED_INDEX].to_i
|
|
105
114
|
dice_pool = m[DICE_POOL_HUNGER_DICE_NO_INCLUDED_INDEX].to_i
|
|
106
115
|
end
|
|
107
116
|
return dice_pool, hunger_dice_pool
|
|
@@ -128,6 +137,9 @@ module BCDice
|
|
|
128
137
|
if hunger_botch_dice > 0
|
|
129
138
|
return Result.fumble("#{result_text}:判定失敗! [Bestial Failure]")
|
|
130
139
|
end
|
|
140
|
+
if success_dice == 0
|
|
141
|
+
return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
|
|
142
|
+
end
|
|
131
143
|
|
|
132
144
|
return Result.failure("#{result_text}:判定失敗!")
|
|
133
145
|
end
|
|
@@ -137,7 +149,7 @@ module BCDice
|
|
|
137
149
|
return Result.fumble("#{result_text}:判定失敗! [Bestial Failure]")
|
|
138
150
|
end
|
|
139
151
|
|
|
140
|
-
return Result.
|
|
152
|
+
return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
|
|
141
153
|
else
|
|
142
154
|
if hunger_botch_dice > 0
|
|
143
155
|
result_text = "#{result_text}\n 判定失敗なら [Bestial Failure]"
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BCDice
|
|
4
|
+
module GameSystem
|
|
5
|
+
class WerewolfTheApocalypse5th < Base
|
|
6
|
+
# ゲームシステムの識別子
|
|
7
|
+
ID = 'WerewolfTheApocalypse5th'
|
|
8
|
+
|
|
9
|
+
# ゲームシステム名
|
|
10
|
+
NAME = 'Werewolf: The Apocalypse 5th Edition'
|
|
11
|
+
|
|
12
|
+
# ゲームシステム名の読みがな
|
|
13
|
+
SORT_KEY = 'わあうふるしあほかりふす5'
|
|
14
|
+
|
|
15
|
+
# ダイスボットの使い方
|
|
16
|
+
HELP_MESSAGE = <<~MESSAGETEXT
|
|
17
|
+
・判定コマンド(nWAFx+x または nWAIxRx)
|
|
18
|
+
WAFコマンドはRageダイスとダイスプールを個別に指定する。
|
|
19
|
+
WAIコマンドはRageダイスをダイスプールの内数として指定する。
|
|
20
|
+
|
|
21
|
+
例:難易度2、9ダイスプールでRageダイス3個の場合、それぞれ以下のようなコマンドとなる。
|
|
22
|
+
2WAF6+3
|
|
23
|
+
2WAI9R3
|
|
24
|
+
|
|
25
|
+
難易度指定:成功数のカウント、判定成功と失敗、(Rageダイスがある場合)Brutal outcome、Critical処理、Total Failure、Critical Winのチェックを行う
|
|
26
|
+
例) (難易度)WAF(通常ダイス)+(Rageダイス)
|
|
27
|
+
(難易度)WAF(通常ダイス)
|
|
28
|
+
(難易度)WAI(通常ダイス)R(Rageダイス)
|
|
29
|
+
(難易度)WAI(通常ダイス)
|
|
30
|
+
|
|
31
|
+
難易度省略:成功数のカウント、判定失敗、(Rageダイスがある場合)Brutal outcome、Critical処理、Total Failureのチェックを行う
|
|
32
|
+
判定成功チェックを行わない
|
|
33
|
+
Critical Winのヒントを出力
|
|
34
|
+
例) WAF(通常ダイス)+(Rageダイス)
|
|
35
|
+
WAF(通常ダイス)
|
|
36
|
+
WAI(通常ダイス)R(Rageダイス)
|
|
37
|
+
WAI(通常ダイス)
|
|
38
|
+
|
|
39
|
+
難易度0指定:Critical処理と成功数のカウントを行い、全てのチェックを行わない
|
|
40
|
+
例) 0WAF(通常ダイス)+(Rageダイス)
|
|
41
|
+
0WAF(通常ダイス)
|
|
42
|
+
0WAI(通常ダイス)+(Rageダイス)
|
|
43
|
+
0WAI(通常ダイス)
|
|
44
|
+
|
|
45
|
+
MESSAGETEXT
|
|
46
|
+
|
|
47
|
+
DIFFICULTY_INDEX = 1
|
|
48
|
+
DICE_POOL_RAGE_DICE_NO_INCLUDED_INDEX = 5
|
|
49
|
+
RAGE_DICE_NO_INCLUDED_INDEX = 7
|
|
50
|
+
COMMAND_RAGE_DICE_INCLUDED_INDEX = 9
|
|
51
|
+
DICE_POOL_RAGE_DICE_INCLUDED_INDEX = 10
|
|
52
|
+
RAGE_DICE_INCLUDED_INDEX = 12
|
|
53
|
+
|
|
54
|
+
# 難易度に指定可能な特殊値
|
|
55
|
+
NOT_CHECK_SUCCESS = -1 # 判定成功にかかわるチェックを行わない(判定失敗に関わるチェックは行う)
|
|
56
|
+
|
|
57
|
+
register_prefix('\d*(WAF|(WAI\d*(R\d?)?))')
|
|
58
|
+
|
|
59
|
+
def eval_game_system_specific_command(command)
|
|
60
|
+
m = /\A(\d+)?(((WAF)(\d+)(\+(\d+))?)|((WAI)(\d+)(R(\d+))?))$/.match(command)
|
|
61
|
+
unless m
|
|
62
|
+
return ''
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
dice_pool, rage_dice_pool = get_dice_pools(m)
|
|
66
|
+
if dice_pool < 0
|
|
67
|
+
return "ダイスプール0のときにRageダイスは指定できません。"
|
|
68
|
+
end
|
|
69
|
+
if rage_dice_pool > 5
|
|
70
|
+
return "5を超えるRageダイス指定はできません。"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
dice_text, success_dice, ten_dice, = make_dice_roll(dice_pool)
|
|
74
|
+
result_text = "(#{dice_pool}D10"
|
|
75
|
+
|
|
76
|
+
if rage_dice_pool >= 0
|
|
77
|
+
rage_dice_text, rage_success_dice, rage_ten_dice, brutal_result_dice = make_dice_roll(rage_dice_pool)
|
|
78
|
+
|
|
79
|
+
brutal_outcome = brutal_result_dice / 2
|
|
80
|
+
ten_dice += rage_ten_dice
|
|
81
|
+
success_dice += rage_success_dice
|
|
82
|
+
|
|
83
|
+
result_text = "#{result_text}+#{rage_dice_pool}D10) > [#{dice_text}]+[#{rage_dice_text}] "
|
|
84
|
+
else
|
|
85
|
+
rage_ten_dice = 0
|
|
86
|
+
brutal_outcome = 0
|
|
87
|
+
result_text = "#{result_text}) > [#{dice_text}] "
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
success_dice += get_critical_success(ten_dice)
|
|
91
|
+
|
|
92
|
+
difficulty = m[DIFFICULTY_INDEX] ? m[DIFFICULTY_INDEX].to_i : NOT_CHECK_SUCCESS
|
|
93
|
+
|
|
94
|
+
return get_roll_result(result_text, success_dice, ten_dice, rage_ten_dice, brutal_outcome, difficulty)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
private
|
|
98
|
+
|
|
99
|
+
def get_dice_pools(m)
|
|
100
|
+
rage_dice_included_command = m[COMMAND_RAGE_DICE_INCLUDED_INDEX]
|
|
101
|
+
if rage_dice_included_command && rage_dice_included_command == "WAI"
|
|
102
|
+
# Rage Diceを内数処理するの場合
|
|
103
|
+
rage_dice_pool = m[RAGE_DICE_INCLUDED_INDEX].nil? ? -1 : m[RAGE_DICE_INCLUDED_INDEX].to_i
|
|
104
|
+
dice_pool_value = m[DICE_POOL_RAGE_DICE_INCLUDED_INDEX].to_i
|
|
105
|
+
dice_pool = dice_pool_value - (rage_dice_pool < 0 ? 0 : rage_dice_pool)
|
|
106
|
+
if dice_pool_value > 0 && rage_dice_pool >= dice_pool_value
|
|
107
|
+
# 1 以上のダイスプール、かつ、Rageダイスがダイスプール以上のとき、ダイスプールが全てRageダイスになる。
|
|
108
|
+
dice_pool = 0
|
|
109
|
+
rage_dice_pool = dice_pool_value
|
|
110
|
+
end
|
|
111
|
+
else
|
|
112
|
+
# Rage DiceがPLによる内数指定の場合
|
|
113
|
+
rage_dice_pool = m[RAGE_DICE_NO_INCLUDED_INDEX].nil? ? -1 : m[RAGE_DICE_NO_INCLUDED_INDEX].to_i
|
|
114
|
+
dice_pool = m[DICE_POOL_RAGE_DICE_NO_INCLUDED_INDEX].to_i
|
|
115
|
+
end
|
|
116
|
+
return dice_pool, rage_dice_pool
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def get_roll_result(result_text, success_dice, ten_dice, _rage_ten_dice, brutal_outcome, difficulty)
|
|
120
|
+
is_critical = ten_dice >= 2
|
|
121
|
+
|
|
122
|
+
if brutal_outcome > 0 && difficulty != 0
|
|
123
|
+
success_dice += 4
|
|
124
|
+
result_text = "#{result_text} [Brutal outcome] 自動失敗、または 成功数=#{success_dice}"
|
|
125
|
+
else
|
|
126
|
+
result_text = "#{result_text} 成功数=#{success_dice}"
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
if difficulty > 0
|
|
130
|
+
result_text = "#{result_text} 難易度=#{difficulty}"
|
|
131
|
+
if success_dice >= difficulty
|
|
132
|
+
result_text = "#{result_text} 差分=#{success_dice - difficulty}"
|
|
133
|
+
|
|
134
|
+
if is_critical
|
|
135
|
+
result_data = Result.critical("#{result_text}:判定成功! [Critical Win]")
|
|
136
|
+
return brutal_outcome > 0 ? result_data.text : result_data
|
|
137
|
+
end
|
|
138
|
+
result_data = Result.success("#{result_text}:判定成功!")
|
|
139
|
+
return brutal_outcome > 0 ? result_data.text : result_data
|
|
140
|
+
else
|
|
141
|
+
if success_dice == 0
|
|
142
|
+
return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
|
|
143
|
+
else
|
|
144
|
+
return Result.failure("#{result_text}:判定失敗!")
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
elsif difficulty < 0
|
|
148
|
+
if success_dice == 0
|
|
149
|
+
return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
|
|
150
|
+
else
|
|
151
|
+
if is_critical
|
|
152
|
+
result_text = "#{result_text}\n 判定成功なら [Critical Win]"
|
|
153
|
+
end
|
|
154
|
+
return result_text.to_s
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# 難易度0指定(=全ての判定チェックを行わない)
|
|
159
|
+
return result_text.to_s
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def get_critical_success(ten_dice)
|
|
163
|
+
# 10の目が2個毎に追加2成功
|
|
164
|
+
return ((ten_dice / 2) * 2)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def make_dice_roll(dice_pool)
|
|
168
|
+
dice_list = @randomizer.roll_barabara(dice_pool, 10)
|
|
169
|
+
|
|
170
|
+
dice_text = dice_list.join(',')
|
|
171
|
+
success_dice = dice_list.count { |x| x >= 6 }
|
|
172
|
+
ten_dice = dice_list.count(10)
|
|
173
|
+
brutal_result_dice = dice_list.count(1) + dice_list.count(2)
|
|
174
|
+
|
|
175
|
+
return dice_text, success_dice, ten_dice, brutal_result_dice
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
@@ -37,6 +37,9 @@ module BCDice
|
|
|
37
37
|
# @return [Integer, nil]
|
|
38
38
|
attr_accessor :modifier_after_half
|
|
39
39
|
|
|
40
|
+
# @return [Integer, nil]
|
|
41
|
+
attr_accessor :modifier_after_one_and_a_half
|
|
42
|
+
|
|
40
43
|
def initialize(rate, modifier)
|
|
41
44
|
@rate = rate
|
|
42
45
|
@modifier = modifier
|
|
@@ -49,6 +52,7 @@ module BCDice
|
|
|
49
52
|
@semi_fixed_val = 0
|
|
50
53
|
@tmp_fixed_val = 0
|
|
51
54
|
@modifier_after_half = nil
|
|
55
|
+
@modifier_after_one_and_a_half = nil
|
|
52
56
|
end
|
|
53
57
|
|
|
54
58
|
# @return [Boolean]
|
|
@@ -56,6 +60,11 @@ module BCDice
|
|
|
56
60
|
return !@modifier_after_half.nil?
|
|
57
61
|
end
|
|
58
62
|
|
|
63
|
+
# @return [Boolean]
|
|
64
|
+
def one_and_a_half
|
|
65
|
+
return !@modifier_after_one_and_a_half.nil?
|
|
66
|
+
end
|
|
67
|
+
|
|
59
68
|
# @return [Integer]
|
|
60
69
|
def min_critical
|
|
61
70
|
if @semi_fixed_val <= 1
|