Class: BCDice::GameSystem::MetalHead
- Defined in:
- lib/bcdice/game_system/MetalHead.rb
Constant Summary collapse
- ID =
ゲームシステムの識別子
'MetalHead'
- NAME =
ゲームシステム名
'メタルヘッド'
- SORT_KEY =
ゲームシステム名の読みがな
'めたるへつと'
- HELP_MESSAGE =
ダイスボットの使い方
<<~MESSAGETEXT ・アビリティロール AR>=目標値 ・スキルロール SR<=目標値(%) ・命中判定ロール HR<=目標値(%) 例)AR>=5 例)SR<=(40+25) 例)HR<=(50-10) これらのロールで成否、絶対成功/絶対失敗、クリティカル/アクシデントを自動判定します。 ・クリティカルチャート CC ・アクシデントチャート 射撃・投擲用:ACL 格闘用:ACS ・戦闘結果チャート CRCsn s=耐久レベル(SUV) n=数値 例)CRCA61 SUV=Aを対象とした数値61(62に変換される)の戦闘結果を参照する。 例)CRCM98 対物で数値98の戦闘結果を参照する。 MESSAGETEXT
- TABLE_ROLL_RESULT_FORMATTER =
表を振った結果の整形処理
lambda do |table, result| [table.name, result.sum, result.content].join(' > ') end
- TABLES =
表の集合
{ 'CC' => DiceTable::RangeTable.new( 'クリティカルチャート', '1D10', [ [1, '相手は知覚系に多大なダメージを受けた。PERを1にして頭部にHWのダメージ、および心理チェック。'], [2, '相手の運動神経を断ち切った。DEXを1にして腕部にHWのダメージ、および心理チェック。さらに腕に持っていた武器などは落としてしまう。'], [3, '相手の移動手段は完全に奪われた。REFを1にして脚部にHWダメージと心理チェック。また、次回からのこちらの攻撃は必ず命中する。'], [4..5, '相手の急所に命中。激痛のため気絶した上、胴にHWダメージ。'], [6, '効果的な一撃。胴にHWダメージ。心理チェック。'], [7, '効果的な一撃。胴にMOダメージ。心理チェック。'], [8..10, '君の一撃は相手の中枢を完全に破壊した。即死である。'], ], &TABLE_ROLL_RESULT_FORMATTER ), 'ACL' => DiceTable::RangeTable.new( 'アクシデントチャート(射撃・投擲)', '1D10', [ [1..7, 'ささいなミス。特にペナルティーはない。'], [8, '不発、またはジャム。弾を取り出さねばならない物は次のターンは射撃できない。'], [9, 'ささいな故障。可能なら次のターンから個別武器のスキルロールで修理を行える。'], [10, '武器の暴発、または爆発。頭部HWの心理効果ロール。さらに、その武器は破壊されPERとDEXのどちらか、または両方に計2ポイントのマイナスを与える。(遠隔操作の場合、射手への被害は無し)'], ], &TABLE_ROLL_RESULT_FORMATTER ), 'ACS' => DiceTable::RangeTable.new( 'アクシデントチャート(格闘)', '1D10', [ [1..3, '足を滑らせて転倒し、起き上がるまで相手に+20の命中修正を与える。'], [4..6, '手を滑らせて、武器を落とす。素手の時は関係ない。'], [7..9, '使用武器の破壊。素手戦闘のときはMWのダメージを受ける。'], [10, '手を滑らせ、不幸にも武器は飛んでいき、5m以内に人がいれば誰かに刺さるか、または打撃を与えるかもしれない。ランダムに決定し、普通どおり判定を続ける。素手のときは関係ない。'], ], &TABLE_ROLL_RESULT_FORMATTER ), }.freeze
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
- #change_text(string) ⇒ Object
- #eval_game_system_specific_command(command) ⇒ Object
- #getHitResult(total_n, _dice_n, diff) ⇒ Object
-
#mh_crc_table(suv, num) ⇒ String
戦闘結果チャートを振る.
- #result_1d100(_total, dice_total, cmp_op, _target) ⇒ Object
- #result_2d6(_total, dice_total, _dice_list, cmp_op, _target) ⇒ Object
- #rollHit(target) ⇒ Object
Methods inherited from Base
#check_result, command_pattern, #enable_debug, #enabled_d9?, eval, #eval, #grich_text, #initialize, prefixes_pattern, register_prefix, register_prefix_from_super_class, #sort_add_dice?, #sort_barabara_dice?
Methods included from Translate
Constructor Details
This class inherits a constructor from BCDice::Base
Instance Method Details
#change_text(string) ⇒ Object
59 60 61 62 63 |
# File 'lib/bcdice/game_system/MetalHead.rb', line 59 def change_text(string) string = string.gsub(/^(S)?AR/i) { "#{Regexp.last_match(1)}2D6" } string = string.gsub(/^(S)?SR/i) { "#{Regexp.last_match(1)}1D100" } return string end |
#eval_game_system_specific_command(command) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/bcdice/game_system/MetalHead.rb', line 40 def eval_game_system_specific_command(command) result = roll_tables(command, TABLES) return result if result case command when /\ACRC(\w)(\d+)\z/ suv = Regexp.last_match(1) num = Regexp.last_match(2) return mh_crc_table(suv, num) when /\AHR<=(.+)/ target = ArithmeticEvaluator.eval( Regexp.last_match(1), round_type: @round_type ) return rollHit(target) end return nil end |
#getHitResult(total_n, _dice_n, diff) ⇒ Object
94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/bcdice/game_system/MetalHead.rb', line 94 def getHitResult(total_n, _dice_n, diff) diceValue = total_n % 100 dice1 = diceValue % 10 # 1の位を代入 debug("total_n", total_n) return ' > 失敗' if total_n > diff return ' > 成功(クリティカル)' if dice1 == 1 return ' > 失敗(アクシデント)' if dice1 == 0 return ' > 成功' end |
#mh_crc_table(suv, num) ⇒ String
戦闘結果チャートを振る
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 |
# File 'lib/bcdice/game_system/MetalHead.rb', line 112 def mh_crc_table(suv, num) header_parts = ['戦闘結果チャート', num] separator = ' > ' suv = suv.to_s.upcase numbuf = num.to_i if numbuf < 1 return (header_parts + ['数値が不正です']).join(separator) end num_d1 = numbuf % 10 debug("num_d1[#{num_d1}]") if num_d1 == 1 numbuf += 1 end if num_d1 == 0 numbuf -= 1 end num_d1 = numbuf % 10 debug("num_d1[#{num_d1}]") table_point = [ nil, # 0 nil, # 1 "腕部", # 2 "腕部", # 3 "脚部", # 4 "脚部", # 5 "胴部", # 6 "胴部", # 7 "胴部", # 8 "頭部", # 9 ] table_damage = { 'S' => [{'N' => 2}, {'LW' => 16}, {'MD' => 46}, {'MW' => 56}, {'HD' => 76}, {'HW' => 96}, {'MO' => 106}, {'K' => 116}], 'A' => [{'LW' => 2}, {'MW' => 46}, {'HW' => 76}, {'MO' => 96}, {'K' => 116}], 'B' => [{'LW' => 2}, {'MW' => 36}, {'HW' => 66}, {'MO' => 96}, {'K' => 106}], 'C' => [{'LW' => 2}, {'MW' => 26}, {'HW' => 66}, {'MO' => 86}, {'K' => 106}], 'D' => [{'LW' => 2}, {'MW' => 26}, {'HW' => 46}, {'MO' => 76}, {'K' => 96}], 'E' => [{'LW' => 2}, {'MW' => 26}, {'HW' => 39}, {'MO' => 54}, {'K' => 76}], 'F' => [{'LW' => 2}, {'MW' => 16}, {'HW' => 39}, {'MO' => 54}, {'K' => 66}], 'G' => [{'LW' => 2}, {'MW' => 6}, {'HW' => 16}, {'MO' => 26}, {'K' => 39}], 'M' => [{'0' => 2}, {'1' => 22}, {'2' => 42}, {'3' => 62}, {'4' => 82}, {'5' => 92}, {'6' => 102}, {'8' => 112}], } if table_damage[suv].nil? return (header_parts + [ "耐久レベル(SUV)[#{suv}]", "耐久レベル(SUV)の値が不正です", ]).join(separator) end damage_level = '' table_damage[suv].each do |v| v.each do |d, n| debug("suv[#{suv}] #{v} #{d} #{n}") if n <= numbuf damage_level = d end end end result_parts = [] if numbuf != num.to_i result_parts.push(numbuf.to_s) end if suv == 'M' result_parts.push('耐物', "HP[#{damage_level}]") else result_parts.push( "耐久レベル(SUV)[#{suv}]", "部位[#{table_point[num_d1]}] : 損傷種別[#{damage_level}]" ) end return (header_parts + result_parts).join(separator) end |
#result_1d100(_total, dice_total, cmp_op, _target) ⇒ Object
84 85 86 87 88 89 90 91 92 |
# File 'lib/bcdice/game_system/MetalHead.rb', line 84 def result_1d100(_total, dice_total, cmp_op, _target) return nil unless cmp_op == :<= if dice_total <= 5 Result.critical("絶対成功") elsif dice_total >= 96 Result.fumble("絶対失敗") end end |
#result_2d6(_total, dice_total, _dice_list, cmp_op, _target) ⇒ Object
65 66 67 68 69 70 71 72 73 |
# File 'lib/bcdice/game_system/MetalHead.rb', line 65 def result_2d6(_total, dice_total, _dice_list, cmp_op, _target) return nil if cmp_op != :>= if dice_total >= 12 Result.critical("絶対成功") elsif dice_total <= 2 Result.fumble("絶対失敗") end end |
#rollHit(target) ⇒ Object
75 76 77 78 79 80 81 82 |
# File 'lib/bcdice/game_system/MetalHead.rb', line 75 def rollHit(target) total = @randomizer.roll_once(100) resultText = getHitResult(total, total, target) text = "(1D100<=#{target}) > #{total}#{resultText}" return text end |