class BCDice::GameSystem::EmbryoMachine
Constants
- HELP_MESSAGE
ダイスボットの使い方
- ID
ゲームシステムの識別子
- NAME
ゲームシステム名
- SORT_KEY
ゲームシステム名の読みがな
Public Class Methods
new(command)
click to toggle source
Calls superclass method
BCDice::Base::new
# File lib/bcdice/game_system/EmbryoMachine.rb, line 29 def initialize(command) super(command) @sort_add_dice = true end
Public Instance Methods
checkRoll(string)
click to toggle source
# File lib/bcdice/game_system/EmbryoMachine.rb, line 64 def checkRoll(string) string = replace_text(string) return nil unless /(^|\s)S?(2[rR]10([+\-\d]+)?([>=]+(\d+))(\[(\d+),(\d+)\]))(\s|$)/i =~ string string = Regexp.last_match(2) diff = 0 crit = 20 fumble = 2 mod = 0 modText = Regexp.last_match(3) diff = Regexp.last_match(5).to_i if Regexp.last_match(5) crit = Regexp.last_match(7).to_i if Regexp.last_match(7) fumble = Regexp.last_match(8).to_i if Regexp.last_match(8) mod = ArithmeticEvaluator.eval(modText) if modText dice_arr = @randomizer.roll_barabara(2, 10).sort dice_now = dice_arr.sum() dice_str = dice_arr.join(",") dice_loc = @randomizer.roll_sum(2, 10) big_dice = dice_arr[1] output = "#{dice_now}[#{dice_str}]" total_n = dice_now + mod if mod > 0 output += "+#{mod}" elsif mod < 0 output += mod.to_s end if output =~ /[^\d\[\]]+/ output = "(#{string}) > #{output} > #{total_n}" else output = "(#{string}) > #{output}" end # 成功度判定 if dice_now <= fumble output += " > ファンブル" elsif dice_now >= crit output += " > クリティカル > " + get_hit_level_table(big_dice) + "(ダメージ+10) > [#{dice_loc}]#{get_hit_location_table(dice_loc)}" elsif total_n >= diff output += " > 成功 > " + get_hit_level_table(big_dice) + " > [#{dice_loc}]#{get_hit_location_table(dice_loc)}" else output += " > 失敗" end return output end
eval_game_system_specific_command(command)
click to toggle source
# File lib/bcdice/game_system/EmbryoMachine.rb, line 113 def eval_game_system_specific_command(command) debug("eval_game_system_specific_command command", command) if (result = checkRoll(command)) return result end output = '1' type = "" number = 0 case command when /HLT/i type = '命中部位' number = @randomizer.roll_sum(2, 10) output = get_hit_location_table(number) when /SFT/i type = '射撃ファンブル' number = @randomizer.roll_sum(2, 10) output = get_shoot_fumble_table(number) when /MFT/i type = '白兵ファンブル' number = @randomizer.roll_sum(2, 10) output = get_melee_fumble_table(number) end if output != '1' output = "#{type}表(#{number}) > #{output}" end return output end
get_hit_level_table(num)
click to toggle source
# File lib/bcdice/game_system/EmbryoMachine.rb, line 217 def get_hit_level_table(num) table = [ [6, '命中レベルC'], [9, '命中レベルB'], [10, '命中レベルA'], ] return get_table_by_number(num, table) end
get_hit_location_table(num)
click to toggle source
** 命中部位表
# File lib/bcdice/game_system/EmbryoMachine.rb, line 146 def get_hit_location_table(num) table = [ [4, '頭'], [7, '左脚'], [9, '左腕'], [12, '胴'], [14, '右腕'], [17, '右脚'], [20, '頭'], ] return get_table_by_number(num, table) end
get_melee_fumble_table(num)
click to toggle source
# File lib/bcdice/game_system/EmbryoMachine.rb, line 189 def get_melee_fumble_table(num) # 白兵攻撃ファンブル表 output = '1' table = [ '大振りしすぎた。使用した白兵武器が搭載されている部位の反対の部位(右腕に搭載されているなら左側)に命中レベルAで命中する。', '激しく頭を打った。パイロットの肉体的負傷が2段階上昇する。', '過負荷で部位が爆発した。使用した白兵武器が搭載されている部位が全壊する。ダメージは発生せず、搭載されている武装も破損しない。', '大振りしすぎた。使用した白兵武器が搭載されている部位の反対の部位(右腕に搭載されているなら左側)に命中レベルBで命中する。', '武装が爆発した。使用した白兵武器が破損する。ダメージは発生しない。', '部分的に機能停止した。使用した白兵武器は戦闘終了まで使用できなくなる。', '転倒した。次のセグメントのアクションが待機に変更される。', '激しい刃こぼれを起こした。使用した白兵武器の全てのダメージが戦闘終了まで-3される。', '地面の凹凸にはまった。次の2セグメントは移動を行うことができない。', '刃こぼれを起こした。使用した白兵武器の全てのダメージが戦闘終了まで-2される。', '大振りしすぎた。使用した白兵武器が搭載されている部位の反対の部位(右腕に搭載されているなら左側)に命中レベルCで命中する。', '頭を打った。パイロットの肉体的負傷が1段階上昇する。', '駆動系が損傷した。移動力が戦闘終了まで-2される(最低1)。', '間合いを取り損ねた。隣接している機体(複数の場合は1機をランダムに決定)に激突する。', '機体ごと突っ込んだ。機体が向いている方角へ移動力をすべて消費するまで移動する。', '制御系が損傷した。回避値が戦闘終了まで-1される(最低1)。', '踏み誤った。機体が向いている方角へ移動力の半分を消費するまで移動する。', 'たたらを踏んだ。機体が向いている方角へ1の移動力で移動する。', '何も起きなかった。', ] dc = 2 output = table[num - dc] if table[num - dc] return output end
get_shoot_fumble_table(num)
click to toggle source
** ファンブル表
# File lib/bcdice/game_system/EmbryoMachine.rb, line 161 def get_shoot_fumble_table(num) # 射撃攻撃ファンブル表 output = '1' table = [ '暴発した。使用した射撃武器が搭載されている部位に命中レベルAで命中する。', 'あまりに無様な誤射をした。パイロットの精神的負傷が2段階上昇する。', '誤射をした。自機に最も近い味方機体に命中レベルAで命中する。', '誤射をした。対象に最も近い味方機体に命中レベルAで命中する。', '武装が暴発した。使用した射撃武器が破損する。ダメージは発生しない。', '転倒した。次のセグメントのアクションが待機に変更される。', '弾詰まりを起こした。使用した射撃武器は戦闘終了まで使用できなくなる。', '砲身が大きく歪んだ。使用した射撃武器による射撃攻撃の命中値が戦闘終了まで-3される。', '熱量が激しく増大した。使用した射撃武器の消費弾薬が戦闘終了まで+3される。', '暴発した。使用した射撃武器が搭載されている部位に命中レベルBで命中する。', '弾薬が劣化した。使用した射撃武器の全てのダメージが戦闘終了まで-2される。', '無様な誤射をした。パイロットの精神的負傷が1段階上昇する。', '誤射をした。対象に最も近い味方機体に命中レベルBで命中する。', '誤射をした。自機に最も近い味方機体に命中レベルBで命中する。', '砲身が歪んだ。使用した射撃武器による射撃攻撃の命中値が戦闘終了まで-2される。', '熱量が増大した。使用した射撃武器の消費弾薬が戦闘終了まで+2される。', '砲身がわずかに歪んだ。使用した射撃武器による射撃攻撃の命中値が戦闘終了まで-1される。', '熱量がやや増大した。使用した射撃武器の消費弾薬が戦闘終了まで+1される。', '何も起きなかった。', ] dc = 2 output = table[num - dc] if table[num - dc] return output end
replace_text(string)
click to toggle source
# File lib/bcdice/game_system/EmbryoMachine.rb, line 35 def replace_text(string) string .gsub(/EM(\d+)([+\-][+\-\d]+)(@(\d+))(\#(\d+))/i) { "2R10#{Regexp.last_match(2)}>=#{Regexp.last_match(1)}[#{Regexp.last_match(4)},#{Regexp.last_match(6)}]" } .gsub(/EM(\d+)([+\-][+\-\d]+)(\#(\d+))/i) { "2R10#{Regexp.last_match(2)}>=#{Regexp.last_match(1)}[20,#{Regexp.last_match(4)}]" } .gsub(/EM(\d+)([+\-][+\-\d]+)(@(\d+))/i) { "2R10#{Regexp.last_match(2)}>=#{Regexp.last_match(1)}[#{Regexp.last_match(4)},2]" } .gsub(/EM(\d+)([+\-][+\-\d]+)/i) { "2R10#{Regexp.last_match(2)}>=#{Regexp.last_match(1)}[20,2]" } .gsub(/EM(\d+)(@(\d+))(\#(\d+))/i) { "2R10>=#{Regexp.last_match(1)}[#{Regexp.last_match(3)},#{Regexp.last_match(5)}]" } .gsub(/EM(\d+)(\#(\d+))/i) { "2R10>=#{Regexp.last_match(1)}[20,#{Regexp.last_match(3)}]" } .gsub(/EM(\d+)(@(\d+))/i) { "2R10>=#{Regexp.last_match(1)}[#{Regexp.last_match(3)},2]" } .gsub(/EM(\d+)/i) { "2R10>=#{Regexp.last_match(1)}[20,2]" } end
result_nd10(total, dice_total, _dice_list, cmp_op, target)
click to toggle source
ゲーム別成功度判定(nD10)
# File lib/bcdice/game_system/EmbryoMachine.rb, line 48 def result_nd10(total, dice_total, _dice_list, cmp_op, target) return nil unless cmp_op == :>= if dice_total <= 2 Result.fumble("ファンブル") elsif dice_total >= 20 Result.critical("クリティカル") elsif target == "?" Result.nothing elsif total >= target Result.success("成功") else Result.failure("失敗") end end