Class: BCDice::GameSystem::TorgEternity

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

Constant Summary collapse

ID =

ゲームシステムの識別子

'TorgEternity'
NAME =

ゲームシステム名

'トーグ エタニティ'
SORT_KEY =

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

'とおくえたにてい'
HELP_MESSAGE =

ダイスボットの使い方

<<~INFO_MESSAGE_TEXT
  ・判定
   ・TG
    "TG[m]"で1d20をロールします。[]内は省略可能。
    mは技能基本値を入れて下さい。Rコマンドに読替されます。
    振り足しを自動で行い、20の出目が出たときには技能無し値も並記します。
    (TORGダイスボットと同じ挙動をするコマンドです。ロールボーナスの読み替えのみ、Eternity版となります)
   ・TE
    "TE"で1d20をロールします。
    振り足しを自動で行い、20の出目が出たときには技能無し値も並記します。
    出目1の時には「Mishap! 自動失敗!」と出力されます。
   ・UP
    "UP"で高揚状態のロール(通常の1d20に加え、1d20を追加で振り足し)を行います。
    各ロールでの振り足しを自動で行い、20の出目が出たときには技能無し値も並記します。
    一投目で出目1の時には「Mishap! 自動失敗!」と出力され、二投目は行われません。
   ・POS
    "POSm"で、ポシビリティ使用による1d20のロールを行います。
    mはポシビリティを使用する前のロール結果を入れて下さい。
    出目が10未満の場合は、10への読み替えが行われます。
    また、振り足しを自動で行い、20の出目が出たときには技能無し値も並記します。
  ・ボーナスダメージロール
   "xBD[+y]"でロールします。[]内は省略可能。
   xはダメージダイス数。yはダメージ基本値 or 式を入れて下さい。
   xは1以上が必要です。0だとエラーが出力されます。マイナス値はコマンドとして認識されません。
   振り足し処理は自動で行われます。(振り足し発生時の目は、「5∞」と出力されます)
  ・各種表
   "(表コマンド)(数値)"で振ります。
   ・成功レベル表「RTx or RESULTx」
   ・ダメージ結果表「DTx or DAMAGEx」
   ・ロールボーナス表「BTx+y or BONUSx+y or TOTALx+y」 xは数値, yは技能基本値
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, #initialize, prefixes_pattern, register_prefix, register_prefix_from_super_class, #sort_add_dice?, #sort_barabara_dice?

Methods included from Translate

#translate

Constructor Details

This class inherits a constructor from BCDice::Base

Instance Method Details

#eval_game_system_specific_command(command) ⇒ Object



46
47
48
49
50
51
52
53
54
55
# File 'lib/bcdice/game_system/TorgEternity.rb', line 46

def eval_game_system_specific_command(command)
  torg_check(command) ||
    getRolld20DiceCommandResult(command) ||
    getUpRollDiceCommandResult(command) ||
    getPossibilityRollDiceCommandResult(command) ||
    getBonusDamageDiceCommandResult(command) ||
    getSuccessLevelDiceCommandResult(command) ||
    getDamageResultDiceCommandResult(command) ||
    getRollBonusDiceCommandResult(command)
end

#get_torg_eternity_bonus(value) ⇒ Object



385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
# File 'lib/bcdice/game_system/TorgEternity.rb', line 385

def get_torg_eternity_bonus(value)
  bonus_table = [
    [1, -10],
    [2, -8],
    [3, -6],
    [5, -4],
    [7, -2],
    [9, -1],
    [11, 0],
    [13, 1],
    [15, 2],
    [16, 3],
    [17, 4],
    [18, 5],
    [19, 6],
    [20, 7]
  ]
  bonus = get_torg_eternity_table_result(value, bonus_table)
  if value > 20
    over_value_bonus = ((value - 21) / 5).to_i + 1
    bonus += over_value_bonus
  end
  return bonus
end

#get_torg_eternity_damage_bonus_dice(number) ⇒ Object

ボーナスダイスロールサブルーチン



323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
# File 'lib/bcdice/game_system/TorgEternity.rb', line 323

def get_torg_eternity_damage_bonus_dice(number)
  debug("bonus dice roll : #{number}")
  value_roll = 0
  output_roll = ""
  if number > 0
    value_roll = 0
    output_roll = ""
    while number > 0
      output_roll = "#{output_roll}," unless output_roll.empty?

      dice_value = @randomizer.roll_once(6)
      dice_text = dice_value.to_s

      if dice_value == 6
        dice_value = 5
        dice_text = "5∞"
        number += 1
      end
      value_roll += dice_value
      output_roll = "#{output_roll}#{dice_text}"
      debug(value_roll)
      debug(output_roll)
      number -= 1
    end
  else
    output_roll = "0"
  end
  debug(value_roll)
  debug(output_roll)
  return value_roll, output_roll
end

#get_torg_eternity_damage_result(value) ⇒ Object

ダメージチャート



366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
# File 'lib/bcdice/game_system/TorgEternity.rb', line 366

def get_torg_eternity_damage_result(value)
  damage_table = [
    [-50, "ノーダメージ"],
    [-5, "1ショック"],
    [0, "2ショック"],
    [5, "1レベル負傷 + 2ショック"],
    [10, "2レベル負傷 + 4ショック"],
    [15, "3レベル負傷 + 6ショック"],
    [20, "4レベル負傷 + 8ショック"],
    [25, "5レベル負傷 + 10ショック"],
    [30, "6レベル負傷 + 12ショック"],
    [35, "7レベル負傷 + 14ショック"],
    [40, "8レベル負傷 + 16ショック"],
    [45, "9レベル負傷 + 18ショック"],
    [50, "10レベル負傷 + 20ショック"]
  ]
  return get_torg_eternity_table_result(value, damage_table)
end

#get_torg_eternity_modifier(string_modifier) ⇒ Object

修正式計算サブルーチン



268
269
270
271
272
273
274
275
276
277
278
279
280
# File 'lib/bcdice/game_system/TorgEternity.rb', line 268

def get_torg_eternity_modifier(string_modifier)
  debug("modifier check : #{string_modifier}")
  if string_modifier == ''
    value_modifier = 0
    output_modifier = ""
  else
    value_modifier = ArithmeticEvaluator.eval(string_modifier)
    output_modifier = format("%+d", value_modifier)
  end
  debug(value_modifier)
  debug(output_modifier)
  return value_modifier, output_modifier
end

#get_torg_eternity_success_level(value) ⇒ Object

成功レベル表



356
357
358
359
360
361
362
363
# File 'lib/bcdice/game_system/TorgEternity.rb', line 356

def get_torg_eternity_success_level(value)
  success_table = [
    [0, "Success - Standard."],
    [5, "Success - Good!"],
    [10, "Success - Outstanding!!"]
  ]
  return get_torg_eternity_table_result(value, success_table)
end

#get_torg_eternity_table_result(value, table) ⇒ Object



254
255
256
257
258
259
260
261
262
263
264
265
# File 'lib/bcdice/game_system/TorgEternity.rb', line 254

def get_torg_eternity_table_result(value, table)
  output = nil
  table.each do |item|
    item_index = item[0]
    if item_index > value
      break
    end

    output = item[1]
  end
  return output
end

#getBonusDamageDiceCommandResult(command) ⇒ Object

ダメージボーナスコマンド



174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/bcdice/game_system/TorgEternity.rb', line 174

def getBonusDamageDiceCommandResult(command)
  debug("TorgEternity Bonus Damage Roll Command ? ", command)
  m = /(\d+)(BD)(([+\-]\d+)*)/i.match(command)
  unless m
    return nil
  end

  number_bonus_die = m[1].to_i
  value_modifier, output_modifier = get_torg_eternity_modifier(m[3])
  if number_bonus_die <= 0
    output = "エラーです。xBD (x≧1) として下さい"
  else
    value_roll, output_roll = get_torg_eternity_damage_bonus_dice(number_bonus_die)
    output_value = value_roll + value_modifier
    output = "ボーナスダメージロール(#{number_bonus_die}BD#{output_modifier}) > #{value_roll}[#{output_roll}]#{output_modifier}#{output_value}ダメージ"
  end
  return output
end

#getDamageResultDiceCommandResult(command) ⇒ Object

ダメージ結果表コマンド



214
215
216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/bcdice/game_system/TorgEternity.rb', line 214

def getDamageResultDiceCommandResult(command)
  debug("TorgEternity Damage Result Table Command ? ", command)
  m = /(DT|Damage)(-*\d+([+\-]\d+)*)/i.match(command)
  unless m
    return nil
  end

  value = ArithmeticEvaluator.eval(m[2])
  debug(value)
  output = get_torg_eternity_damage_result(value)
  output = "ダメージ結果表[#{value}] > #{output}"
  debug(output)
  return output
end

#getPossibilityRollDiceCommandResult(command) ⇒ Object

ロールコマンド (ポシビリティロール)



151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/bcdice/game_system/TorgEternity.rb', line 151

def getPossibilityRollDiceCommandResult(command)
  debug("Torg Eternity Possibility Roll Command ? ", command)
  m = /(^|\s)(S)?(POS)((\d+)(\+\d+)?)/i.match(command)
  unless m
    return nil
  end

  output_modifier = ArithmeticEvaluator.eval(m[4])
  skilled, unskilled, dice_str, = torg_eternity_dice(true, false)
  subtotal_skilled = skilled + output_modifier
  subtotal_unskilled = unskilled + output_modifier
  value_skilled = format("%+d", get_torg_eternity_bonus(subtotal_skilled))
  if subtotal_skilled != subtotal_unskilled
    value_unskilled = format("%+d", get_torg_eternity_bonus(subtotal_unskilled))
    output = "d20ロール(ポシビリティ) > #{output_modifier}+1d20[#{dice_str}] > #{value_skilled}[#{subtotal_skilled}](技能有) / #{value_unskilled}[#{subtotal_unskilled}](技能無)"
  else
    output = "d20ロール(ポシビリティ) > #{output_modifier}+1d20[#{dice_str}] > #{value_skilled}[#{subtotal_skilled}]"
  end

  return output
end

#getRollBonusDiceCommandResult(command) ⇒ Object

ロールボーナス表コマンド



230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
# File 'lib/bcdice/game_system/TorgEternity.rb', line 230

def getRollBonusDiceCommandResult(command)
  debug("TorgEternity Roll Bonus Table Command ? ", command)
  m = /(BT|Bonus|Total)(\d+)(([+\-]\d+)*)/i.match(command)
  unless m
    return nil
  end

  value_roll = m[2].to_i
  output_bonus = get_torg_eternity_bonus(value_roll)
  debug(output_bonus)
  value_modifier, output_modifier = get_torg_eternity_modifier(m[3])
  if value_roll <= 1
    output = "ロールボーナス表[#{value_roll}] > Mishap!!"
  elsif output_modifier.empty?
    output = "ロールボーナス表[#{value_roll}] > #{output_bonus}"
  else
    value_result = output_bonus.to_i + value_modifier
    debug(value_result)
    output = "ロールボーナス表[#{value_roll}]#{output_modifier}#{output_bonus}[#{value_roll}]#{output_modifier}#{value_result}"
  end
  debug(output)
  return output
end

#getRolld20DiceCommandResult(command) ⇒ Object

TORG Eternity ######################## ロールコマンド (通常ロール)



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/bcdice/game_system/TorgEternity.rb', line 100

def getRolld20DiceCommandResult(command)
  debug("Torg Eternity Dice Roll Command ? ", command)
  m = /(^|\s)(S)?(TE)$/i.match(command)
  unless m
    return nil
  end

  skilled, unskilled, dice_str, mishap = torg_eternity_dice(false, true)
  if mishap == 1
    output = "d20ロール(通常) > 1d20[#{dice_str}] > Mishap! 絶対失敗!"
  else
    value_skilled = format("%+d", get_torg_eternity_bonus(skilled))
    if skilled != unskilled
      value_unskilled = format("%+d", get_torg_eternity_bonus(unskilled))
      output = "d20ロール(通常) > 1d20[#{dice_str}] > #{value_skilled}[#{skilled}](技能有) / #{value_unskilled}[#{unskilled}](技能無)"
    else
      output = "d20ロール(通常) > 1d20[#{dice_str}] > #{value_skilled}[#{skilled}]"
    end
  end

  return output
end

#getSuccessLevelDiceCommandResult(command) ⇒ Object

成功レベル表コマンド



194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
# File 'lib/bcdice/game_system/TorgEternity.rb', line 194

def getSuccessLevelDiceCommandResult(command)
  debug("TorgEternity Success Level Table Command ? ", command)
  m = /(RT|Result)(-*\d+([+\-]\d+)*)/i.match(command)
  unless m
    return nil
  end

  value = ArithmeticEvaluator.eval(m[2])
  debug(value)
  if value < 0
    output = "Failure."
  else
    output = get_torg_eternity_success_level(value)
  end
  output = "成功レベル表[#{value}] > #{output}"
  debug(output)
  return output
end

#getUpRollDiceCommandResult(command) ⇒ Object

ロールコマンド (高揚ロール)



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
# File 'lib/bcdice/game_system/TorgEternity.rb', line 124

def getUpRollDiceCommandResult(command)
  debug("Torg Eternity Dice Roll ( UP ) Command ? ", command)
  m = /(^|\s)(S)?(UP)$/i.match(command)
  unless m
    return nil
  end

  skilled1, unskilled1, dice_str1, mishap = torg_eternity_dice(false, true)
  if mishap == 1
    output = "d20ロール(高揚) > 1d20[#{dice_str1}] > Mishap! 絶対失敗!"
  else
    skilled2, unskilled2, dice_str2, = torg_eternity_dice(false, false)
    subtotal_skilled = skilled1 + skilled2
    subtotal_unskilled = unskilled1 + unskilled2
    value_skilled = format("%+d", get_torg_eternity_bonus(subtotal_skilled))
    if subtotal_skilled != subtotal_unskilled
      value_unskilled = format("%+d", get_torg_eternity_bonus(subtotal_unskilled))
      output = "d20ロール(高揚) > 1d20[#{dice_str1}] + 1d20[#{dice_str2}] > #{value_skilled}[#{subtotal_skilled}](技能有) / #{value_unskilled}[#{subtotal_unskilled}](技能無)"
    else
      output = "d20ロール(高揚) > 1d20[#{dice_str1}] + 1d20[#{dice_str2}] > #{value_skilled}[#{subtotal_skilled}]"
    end
  end

  return output
end

#replace_text(string) ⇒ Object

TORG 1.x ########################



58
59
60
61
62
# File 'lib/bcdice/game_system/TorgEternity.rb', line 58

def replace_text(string)
  string = string.gsub(/TG(\d+)/i) { "1R20+#{Regexp.last_match(1)}" }
  string = string.gsub(/TG/i, '1R20')
  return string
end

#torg_check(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
# File 'lib/bcdice/game_system/TorgEternity.rb', line 64

def torg_check(string)
  string = replace_text(string)

  m = /(^|\s)S?(1R20(([+-]\d+)*))(\s|$)/i.match(string)
  unless m
    return nil
  end

  string = m[2]
  mod = m[3]

  debug(mod)
  mod = ArithmeticEvaluator.eval(mod) if mod
  debug(mod)
  mod = mod.to_i
  skilled, unskilled, dice_str, = torg_eternity_dice(false, false)
  sk_bonus = get_torg_eternity_bonus(skilled)
  if mod
    if mod > 0
      output = "#{sk_bonus}[#{dice_str}]+#{mod}"
    else
      output = "#{sk_bonus}[#{dice_str}]#{mod}"
    end
  else
    output = "#{sk_bonus}[#{dice_str}]"
  end
  output += "" + (sk_bonus + mod).to_s
  if skilled != unskilled
    output += "(技能無" + (get_torg_eternity_bonus(unskilled) + mod).to_s + ")"
  end
  output = "(#{string}) > #{output}"
  return output
end

#torg_eternity_dice(check_pos, check_mishap) ⇒ Object

d20ロールサブルーチン



283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
# File 'lib/bcdice/game_system/TorgEternity.rb', line 283

def torg_eternity_dice(check_pos, check_mishap)
  isSkilledCritical = true
  isCritical = true
  skilled = 0
  unskilled = 0
  mishap = 0
  dice_str = ""
  while isSkilledCritical
    dice_str += "," unless dice_str.empty?
    dice_n = @randomizer.roll_once(20)
    if check_pos
      if dice_n < 10
        dice_str_now = "#{dice_n}→10"
        dice_n = 10
        isSkilledCritical = false
      else
        dice_str_now = dice_n.to_s
      end
      dice_str += dice_str_now
    else
      dice_str += dice_n.to_s
    end
    skilled += dice_n
    unskilled += dice_n if isCritical
    if dice_n == 20
      isCritical = false
    elsif dice_n != 10
      isSkilledCritical = false
      isCritical = false
      if check_mishap & (dice_n == 1)
        mishap = 1
      end
    end
    check_pos = false
    check_mishap = false
  end
  return skilled, unskilled, dice_str, mishap
end