Class: BCDice::GameSystem::Ventangle

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

Constant Summary collapse

ID =

ゲームシステムの識別子

'Ventangle'
NAME =

ゲームシステム名

'Ventangle'
SORT_KEY =

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

「ゲームシステム名の読みがなの設定方法」(docs/dicebot_sort_key.md)を参考にして設定してください

'うえんたんくる'
HELP_MESSAGE =

ダイスボットの使い方

<<~MESSAGETEXT
  基本書式 VTn@s#f$g>=T n=ダイス数(省略時2) s=スペシャル値(省略時12) f=ファンブル値(省略時2) g=レベルギャップ判定値(省略可) T=目標値(省略可)

  例:
  VT        デフォルトのスペシャル値・ファンブル値の判定を行う
  VT@10#3   スペシャル値10、ファンブル値3の判定を行う
  VT3@10#3  スペシャル値10、ファンブル値3の判定を、アドバンテージを1点消費してダイス3つで行う

  VT>=5         デフォルトのスペシャル値・ファンブル値で目標値5の判定を行う
  VT@10#3>=5    スペシャル値10、ファンブル値3で目標値5の判定を行う
  VT@10#3$5>=5  スペシャル値10、ファンブル値3で目標値5の判定を行う。この際達成値が目標値より5以上大きい場合、ギャップボーナスを表示する
  VT3@10#3>=5   スペシャル値10、ファンブル値3で目標値5の判定を、アドバンテージを1点消費してダイス3つで行う
  VT3@10#3$4>=5 スペシャル値10、ファンブル値3で目標値5の判定を、アドバンテージを1点消費してダイス3つで行う。この際達成値が目標値より4以上大きい場合、ギャップボーナスを表示する
MESSAGETEXT
DEFAULT_SPECIAL_VALUE =

既定のスペシャル値

12
DEFAULT_FUMBLE_VALUE =

既定のファンブル値

2
DEFAULT_DICE_NUM =

規定のダイス個数

2

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

#compare(dice_total, total, cmd) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/bcdice/game_system/Ventangle.rb', line 111

def compare(dice_total, total, cmd)
  special = cmd.critical || DEFAULT_SPECIAL_VALUE
  fumble = cmd.fumble || DEFAULT_FUMBLE_VALUE

  if dice_total <= fumble
    return Result.fumble('ファンブル')
  elsif dice_total >= special
    return Result.critical('スペシャル')
  end

  if cmd.target_number
    if total.send(cmd.cmp_op, cmd.target_number)
      return Result.success('成功')
    else
      return Result.failure('失敗')
    end
  else
    return Result.new(nil)
  end
end

#eval_game_system_specific_command(command) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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
# File 'lib/bcdice/game_system/Ventangle.rb', line 46

def eval_game_system_specific_command(command)
  debug("eval_game_system_specific_command Begin")

  parser = Command::Parser.new('VT', round_type: round_type)
                          .enable_critical
                          .enable_fumble
                          .enable_dollar
                          .enable_suffix_number
                          .restrict_cmp_op_to(nil, :>=)
  cmd = parser.parse(command)

  unless cmd
    return nil
  end

  dice_num = cmd.suffix_number || DEFAULT_DICE_NUM
  if dice_num < DEFAULT_DICE_NUM
    return nil
  end

  dice_list = @randomizer.roll_barabara(dice_num, 6)
  if dice_num > 2
    # 出目の順序を保存して上位2つの出目を取得
    j = 0 # 安定ソートのために利用 cf. https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/sort_by.html
    using_list = dice_list.map.with_index { |x, i| {index: i, value: x} }
                          .sort_by { |x| [x[:value], j += 1] }.reverse.take(2)
                          .sort_by { |x| x[:index] }.map { |x| x[:value] }
  else
    using_list = dice_list
  end
  dice_total = using_list.sum
  total = dice_total + cmd.modify_number

  result = compare(dice_total, total, cmd)

  advantage_str =
    if dice_num > 2
      using_list.to_s
    end

  modifier_str =
    if cmd.modify_number > 0
      "#{dice_total}#{Format.modifier(cmd.modify_number)}"
    end

  level_gap_str =
    if cmd.target_number && cmd.dollar && result.success? && (gap = total - cmd.target_number) >= cmd.dollar
      "ギャップボーナス(#{gap})"
    end

  sequence = [
    cmd.to_s,
    dice_list.to_s,
    advantage_str,
    modifier_str,
    total.to_s,
    result.text,
    level_gap_str,
  ].compact

  result.text = sequence.join("")

  return result
end