Class: BCDice::GameSystem::EmbryoMachine

Inherits:
Base
  • Object
show all
Defined in:
lib/bcdice/game_system/EmbryoMachine.rb

Constant Summary collapse

ID =

ゲームシステムの識別子

'EmbryoMachine'
NAME =

ゲームシステム名

'エムブリオマシンRPG'
SORT_KEY =

ゲームシステム名の読みがな

'えむふりおましんRPG'
HELP_MESSAGE =

ダイスボットの使い方

<<~INFO_MESSAGE_TEXT
  ・判定ロール(EMt+m@c#f)
   目標値t、修正値m、クリティカル値c(省略時は20)、ファンブル値f(省略時は2)で攻撃判定を行います。
   命中した場合は命中レベルと命中部位も自動出力します。
   Rコマンドに読み替えされます。
  ・各種表
   ・命中部位表 HLT
   ・白兵攻撃ファンブル表 MFT
   ・射撃攻撃ファンブル表 SFT
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

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

#translate

Constructor Details

#initialize(command) ⇒ EmbryoMachine

Returns a new instance of EmbryoMachine.



29
30
31
32
33
# File 'lib/bcdice/game_system/EmbryoMachine.rb', line 29

def initialize(command)
  super(command)

  @sort_add_dice = true
end

Instance Method Details

#checkRoll(string) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
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
# 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) ⇒ Object



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
# 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) ⇒ Object



217
218
219
220
221
222
223
224
225
# 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) ⇒ Object

** 命中部位表



146
147
148
149
150
151
152
153
154
155
156
157
158
# 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) ⇒ Object

白兵攻撃ファンブル表



189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# 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) ⇒ Object

** ファンブル表



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
# 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) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
# 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) ⇒ Object

ゲーム別成功度判定(nD10)



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 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