Class: BCDice::GameSystem::Warhammer
- Defined in:
- lib/bcdice/game_system/Warhammer.rb
Constant Summary collapse
- ID =
ゲームシステムの識別子
'Warhammer'
- NAME =
ゲームシステム名
'ウォーハンマー'
- SORT_KEY =
ゲームシステム名の読みがな
'うおおはんまあ'
- HELP_MESSAGE =
ダイスボットの使い方
<<~INFO_MESSAGE_TEXT ・クリティカル表(whHxx/whAxx/whBxx/whLxx) "WH部位 クリティカル値"の形で指定します。部位は「H(頭部)」「A(腕)」「B(胴体)」「L(足)」の4カ所です。 例)whH10 whA5 WHL4 ・命中判定(WHx@t) "WH(命中値)@(種別)"の形で指定します。 種別は脚の数を数字、翼が付いているものは「W」、手が付いているものは「H」で書きます。 「2H(二足)」「2W(有翼二足)」「4(四足)」「4H(半人四足)」「4W(有翼四足)」「W(鳥類)」となります。 命中判定を行って、当たれば部位も表示します。 なお、種別指定を省略すると「二足」、「@」だけにすると全種別の命中部位を表示します。(コマンドを忘れた時の対応です) 例)wh60 wh43@4W WH65@ INFO_MESSAGE_TEXT
Instance Attribute Summary
Attributes inherited from Base
#d66_sort_type, #default_cmp_op, #default_target_number, #randomizer, #reroll_dice_reroll_threshold, #round_type, #sides_implicit_d, #upper_dice_reroll_threshold
Instance Method Summary collapse
- #eval_game_system_specific_command(command) ⇒ Object
- #get_wh_atpos_message(pos_i, pos_num) ⇒ Object
- #getAttackResult(string) ⇒ Object
-
#getCriticalResult(string) ⇒ Object
WHFRP関連 ########################.
-
#initialize(command) ⇒ Warhammer
constructor
A new instance of Warhammer.
- #result_1d100(total, _dice_total, cmp_op, target) ⇒ Object
- #result_1d100_text(total, dice_total, cmp_op, target) ⇒ Object
-
#wh_atpos(pos_num, pos_type) ⇒ Object
WHFRP2命中部位表.
Methods inherited from Base
#change_text, #check_result, command_pattern, #enable_debug, #enabled_d9?, eval, #eval, #grich_text, prefixes_pattern, register_prefix, register_prefix_from_super_class, #sort_add_dice?, #sort_barabara_dice?
Methods included from Translate
Constructor Details
Instance Method Details
#eval_game_system_specific_command(command) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/bcdice/game_system/Warhammer.rb', line 37 def eval_game_system_specific_command(command) output_msg = nil case command.upcase when /^(WH\d+(@[\dWH]*)?)/i attackCommand = Regexp.last_match(1) output_msg = getAttackResult(attackCommand) when /^(WH[HABTLW]\d+)/i criticalCommand = Regexp.last_match(1) output_msg = getCriticalResult(criticalCommand) end return output_msg end |
#get_wh_atpos_message(pos_i, pos_num) ⇒ Object
299 300 301 302 303 304 305 306 307 308 309 310 311 312 |
# File 'lib/bcdice/game_system/Warhammer.rb', line 299 def (pos_i, pos_num) output = "" output += ' ' + pos_i[0] + ":" 1.step(pos_i.length + 1, 2) do |i| if pos_num <= pos_i[i] output += pos_i[i + 1] break end end return output end |
#getAttackResult(string) ⇒ Object
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 |
# File 'lib/bcdice/game_system/Warhammer.rb', line 314 def getAttackResult(string) debug("getAttackResult begin string", string) pos_type = "" if /(.+)(@.*)/ =~ string string = Regexp.last_match(1) pos_type = Regexp.last_match(2) debug("pos_type", pos_type) end unless /WH(\d+)/i =~ string return '1' end diff = Regexp.last_match(1).to_i total_n = @randomizer.roll_once(100) output = "(#{string}) > #{total_n}" output += result_1d100_text(total_n, total_n, :<=, diff) pos_num = (total_n % 10) * 10 + (total_n / 10).to_i pos_num = 100 if total_n >= 100 output += wh_atpos(pos_num, pos_type) if total_n <= diff return output end |
#getCriticalResult(string) ⇒ Object
WHFRP関連 ########################
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/bcdice/game_system/Warhammer.rb', line 75 def getCriticalResult(string) # クリティカル効果データ whh = [ '01:打撃で状況が把握出来なくなる。次ターンは1回の半アクションしか行なえない。', '02:耳を強打された為、耳鳴りが酷く目眩がする。1Rに渡って一切のアクションを行なえない。', '03:打撃が頭皮を酷く傷つけた。【武器技術度】に-10%。治療を受けるまで継続。', '04:鎧が損傷し当該部位のAP-1。修理するには(職能:鎧鍛冶)テスト。鎧を着けていないなら1Rの間アクションを行なえない。', '05:転んで倒れ、頭がくらくらする。1Rに渡ってあらゆるテストに-30で、立ち上がるには起立アクションが必要。', '06:1d10R気絶。', '07:1d10分気絶。以後CTはサドンデス。', '08:顔がずたずたになって倒れ、以後無防備状態。治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。以後CTはサドンデスを適用。【頑強】テストに失敗すると片方の視力を失う。', '09:凄まじい打撃により頭蓋骨が粉砕される。死は瞬時に訪れる。', '10:死亡する。いかに盛大に出血し、どのような死に様を見せたのかを説明してもよい。', ] wha = [ '01:手に握っていたものを落とす。盾はくくりつけられている為、影響なし。', '02:打撃で腕が痺れ、1Rの間使えなくなる。', '03:手の機能が失われ、治療を受けるまで回復できない。手で握っていたもの(盾を除く)は落ちる。', '04:鎧が損傷する。当該部位のAP-1。修理するには(職能:鎧鍛冶)テスト。鎧を着けていないなら腕が痺れ、1Rの間使えなくなる。', '05:腕の機能が失われ、治療を受けるまで回復できない。手で握っていたもの(盾を除く)は落ちる。', '06:腕が砕かれる。手で握っていたもの(盾を除く)は落ちる。出血がひどく、治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。以後CTはサドンデスを適用。', '07:手首から先が血まみれの残骸と化す。手で握っていたもの(盾を除く)は落ちる。出血がひどく、治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。以後CTはサドンデスを適用。【頑健】テストに失敗すると手の機能を失う。', '08:腕は血まみれの肉塊がぶら下がっている状態になる。手で握っていたもの(盾を除く)は落ちる。治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。以後CTはサドンデスを適用。【頑健】テストに失敗すると肘から先の機能を失う。', '09:大動脈に傷が及んだ。コンマ数秒の内に損傷した肩から血を噴出して倒れる。ショックと失血により、ほぼ即死する。', '10:死亡する。いかに盛大に出血し、どのような死に様を見せたのかを説明してもよい。', ] whb = [ '01:打撃で息が詰まる。1Rの間、キャラクターの全てのテストや攻撃に-20%。', '02:股間への一撃。苦痛のあまり、1Rに渡って一切のアクションを行なえない。', '03:打撃で肋骨がぐちゃぐちゃになる。以後治療を受けるまでの間、【武器技術度】に-10%。', '04:鎧が損傷する。当該部位のAP-1。修理するには(職能:鎧鍛冶)テスト。鎧を着けていないなら股間への一撃、1Rに渡って一切のアクションを行なえない。', '05:転んで倒れ、息が詰まって悶絶する。1Rに渡ってあらゆるテストに-30の修正、立ち上がるには起立アクションが必要。', '06:1d10R気絶。', '07:ひどい内出血が起こり、無防備状態。出血がひどく、治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。', '08:脊髄が粉砕されて倒れ、以後治療を受けるまで無防備状態。以後CTはサドンデスを適用。【頑強】テストに失敗すると腰から下が不随になる。', '09:凄まじい打撃により複数の臓器が破裂し、死は数秒のうちに訪れる。', '10:死亡する。いかに盛大に出血し、どのような死に様を見せたのかを説明してもよい。', ] whl = [ '01:よろめく。次のターン、1回の半アクションしか行なえない。', '02:脚が痺れる。1Rに渡って【移動】は半減し、脚に関連する【敏捷】テストに-20%。回避が出来なくなる。', '03:脚の機能が失われ、治療を受けるまで回復しない。【移動】は半減し、脚に関連する【敏捷】テストに-20%。回避が出来なくなる。', '04:鎧が損傷する。当該部位のAP-1。修理するには(職能:鎧鍛冶)テスト。鎧を着けていないなら脚が痺れる、1Rに渡って【移動】は半減し、脚に関連する【敏捷】テストに-20%、回避不可になる。', '05:転んで倒れ、頭がくらくらする。1Rに渡ってあらゆるテストに-30の修正、立ち上がるには起立アクションが必要。', '06:脚が砕かれ、無防備状態。出血がひどく、治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。以後CTはサドンデスを適用。', '07:脚は血まみれの残骸と化し、無防備状態になる。治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。以後CTはサドンデスを適用。【頑強】テストに失敗すると足首から先を失う。', '08:脚は血まみれの肉塊がぶらさがっている状態。以後無防備状態。治療を受けるまで毎Rの被害者のターン開始時に20%で死亡。以後CTはサドンデスを適用。【頑強】テストに失敗すると膝から下を失う。', '09:大動脈に傷が及ぶ。コンマ数秒の内に脚の残骸から血を噴出して倒れ、ショックと出血で死は瞬時に訪れる。', '10:死亡する。いかに盛大に出血し、どのような死に様を見せたのかを説明してもよい。', ] whw = [ '01:軽打。1ラウンドに渡って、あらゆるテストに-10%。', '02:かすり傷。+10%の【敏捷】テストを行い、失敗なら直ちに高度を1段階失う。地上にいるクリーチャーは、次のターンには飛び立てない。', '03:損傷する。【飛行移動力】が2点低下する。-10%の【敏捷】テストを行い、失敗なら直ちに高度を1段階失う。地上にいるクリーチャーは、次のターンには飛び立てない。', '04:酷く損傷する。【飛行移動力】が4点低下する。-30%の【敏捷】テストを行い、失敗なら直ちに高度を1段階失う。地上にいるクリーチャーは、1d10ターンが経過するまで飛び立てない。', '05:翼が使えなくなる。【飛行移動力】が0に低下する。飛行中のものは落下し、高度に応じたダメージを受ける。地上にいるクリーチャーは、怪我が癒えるまで飛び立てない。', '06:翼の付け根に傷が開く。【飛行移動力】が0に低下する。飛行中のものは落下し、高度に応じたダメージを受ける。地上にいるクリーチャーは、怪我が癒えるまで飛び立てない。治療を受けるまで毎R被害者のターン開始時に20%の確率で死亡。以後CTはサドンデスを適用。', '07:翼は血まみれの残骸と化し、無防備状態になる。【飛行移動力】が0に低下する。飛行中のものは落下し、高度に応じたダメージを受ける。地上にいるクリーチャーは、怪我が癒えるまで飛び立てない。治療を受けるまで毎R被害者のターン開始時に20%の確率で死亡。以後CTはサドンデスを適用。【頑強】テストに失敗すると飛行能力を失う。', '08:翼が千切れてバラバラになり、無防備状態になる。【飛行移動力】が0に低下する。飛行中のものは落下し、高度に応じたダメージを受ける。地上にいるクリーチャーは、怪我が癒えるまで飛び立てない。治療を受けるまで毎R被害者のターン開始時に20%の確率で死亡。以後CTはサドンデスを適用。飛行能力を失う。', '09:大動脈が切断された。コンマ数秒の内に血を噴き上げてくずおれる、ショックと出血で死は瞬時に訪れる。', '10:死亡する。いかに盛大に出血し、どのような死に様を見せたのかを説明してもよい。', ] criticalTable = [ 5, 7, 9, 10, 10, 10, 10, 10, 10, 10, # 01-10 5, 6, 8, 9, 10, 10, 10, 10, 10, 10, # 11-20 4, 6, 8, 9, 9, 10, 10, 10, 10, 10, # 21-30 4, 5, 7, 8, 9, 9, 10, 10, 10, 10, # 31-40 3, 5, 7, 8, 8, 9, 9, 10, 10, 10, # 41-50 3, 4, 6, 7, 8, 8, 9, 9, 10, 10, # 51-60 2, 4, 6, 7, 7, 8, 8, 9, 9, 10, # 61-70 2, 3, 5, 6, 7, 7, 8, 8, 9, 9, # 71-80 1, 3, 5, 6, 6, 7, 7, 8, 8, 9, # 81-90 1, 2, 4, 5, 6, 6, 7, 7, 8, 8, # 91-00 ] unless /WH([HABTLW])(\d+)/ =~ string return '1' end partsWord = Regexp.last_match(1) # 部位 criticalValue = Regexp.last_match(2).to_i # クリティカル値 criticalValue = 10 if criticalValue > 10 criticalValue = 1 if criticalValue < 1 whpp = '' whppp = '' case partsWord when /H/i whpp = '頭部' whppp = whh when /A/i whpp = '腕部' whppp = wha when /[TB]/i whpp = '胴体' whppp = whb when /L/i whpp = '脚部' whppp = whl when /W/i whpp = '翼部' whppp = whw end dice_now = @randomizer.roll_once(100) crit_no = ((dice_now - 1) / 10).to_i * 10 crit_num = criticalTable[crit_no + criticalValue - 1] resultText = whppp[crit_num - 1] if crit_num >= 5 resultText += 'サドンデス×' else resultText += 'サドンデス○' end output = "#{whpp}CT表(#{dice_now}+#{criticalValue}) > #{resultText}" return output end |
#result_1d100(total, _dice_total, cmp_op, target) ⇒ Object
54 55 56 57 58 59 60 61 62 63 |
# File 'lib/bcdice/game_system/Warhammer.rb', line 54 def result_1d100(total, _dice_total, cmp_op, target) return Result.nothing if target == '?' return nil unless cmp_op == :<= if total <= target Result.success("成功(成功度#{(target - total) / 10})") else Result.failure("失敗(失敗度#{(total - target) / 10})") end end |
#result_1d100_text(total, dice_total, cmp_op, target) ⇒ Object
65 66 67 68 69 70 71 72 |
# File 'lib/bcdice/game_system/Warhammer.rb', line 65 def result_1d100_text(total, dice_total, cmp_op, target) result = result_1d100(total, dice_total, cmp_op, target)&.text if result.nil? "" else " > #{result}" end end |
#wh_atpos(pos_num, pos_type) ⇒ Object
WHFRP2命中部位表
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 |
# File 'lib/bcdice/game_system/Warhammer.rb', line 198 def wh_atpos(pos_num, pos_type) # WHFRP2命中部位表 debug("wh_atpos begin pos_type", pos_type) pos_2l = [ '二足', 15, '頭部', 35, '右腕', 55, '左腕', 80, '胴体', 90, '右脚', 100, '左脚', ] pos_2lw = [ '有翼二足', 15, '頭部', 25, '右腕', 35, '左腕', 45, '右翼', 55, '左翼', 80, '胴体', 90, '右脚', 100, '左脚', ] pos_4l = [ '四足', 15, '頭部', 60, '胴体', 70, '右前脚', 80, '左前脚', 90, '右後脚', 100, '左後脚', ] pos_4la = [ '半人四足', 10, '頭部', 20, '右腕', 30, '左腕', 60, '胴体', 70, '右前脚', 80, '左前脚', 90, '右後脚', 100, '左後脚', ] pos_4lw = [ '有翼四足', 10, '頭部', 20, '右翼', 30, '左翼', 60, '胴体', 70, '右前脚', 80, '左前脚', 90, '右後脚', 100, '左後脚', ] pos_b = [ '鳥', 15, '頭部', 35, '右翼', 55, '左翼', 80, '胴体', 90, '右脚', 100, '左脚', ] wh_pos = [pos_2l, pos_2lw, pos_4l, pos_4la, pos_4lw, pos_b] pos_t = 0 debug("pos_type", pos_type) if pos_type != "" case pos_type when /@(2W|W2)/i pos_t = 1 when /@(4W|W4)/i pos_t = 4 when /@(4H|H4)/i pos_t = 3 when /@4/i pos_t = 2 when /@W/i pos_t = 5 else unless /@(2H|H2|2)/i =~ pos_type pos_t = -1 end end end output = "" debug("pos_t", pos_t) if pos_t < 0 wh_pos.each do |pos_i| output += (pos_i, pos_num) end else pos_i = wh_pos[pos_t] output += (pos_i, pos_num) end return output end |