Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ゴブリンスレイヤーTRPGのダイスボット追加 #251

Merged
merged 10 commits into from
Jul 26, 2020
1 change: 1 addition & 0 deletions src/diceBot/DiceBotLoaderList.rb
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ def self.find(gameTitle)
DiceBotLoader.new('SterileLife'),
DiceBotLoader.new('Paradiso'),
DiceBotLoader.new('SamsaraBallad'),
DiceBotLoader.new('GoblinSlayer'),
DiceBotLoader.new('None', :filenames => [], :class => :DiceBot)
]
end
188 changes: 188 additions & 0 deletions src/diceBot/GoblinSlayer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
# -*- coding: utf-8 -*-
# frozen_string_literal: true

class GoblinSlayer < DiceBot
# ゲームシステムの識別子
ID = 'GoblinSlayer'

# ゲームシステム名
NAME = 'ゴブリンスレイヤーTRPG'

# ゲームシステム名の読みがな
SORT_KEY = 'こふりんすれいやあTRPG'

# ダイスボットの使い方
HELP_MESSAGE = <<MESSAGETEXT
・判定 GS(x)>=y
 2d6の判定を行い、達成値を出力します。
 xは基準値、yは目標値です。いずれも省略可能です。
 yが設定されている場合、大成功/成功/失敗/大失敗を自動判定します。
 例)GS>=12 GS>10 GS(10)>14 GS+10>=15 GS10>=15 GS(10) GS+10 GS10 GS

・祈念 MCPI(n)$m
 祈念を行います。
 nは【幸運】などによるボーナスです。この値は省略可能です。
 mは因果点の現在値です。
 因果点の現在値を使用して祈念を行い、成功/失敗を自動判定します。
 例)MCPI$3 MCPI(1)$4 MCPI+2$5 MCPI2$6

・因果点の表示 SV$n
 入力された因果点の現在値を表示します。
 nは因果点の現在値です。
 祈念のコマンドを実行した場合と同じ形式での出力を行います。
 例)SV$3 SV$8

・因果点の上昇 AV(n)$m
 因果点を上昇させた結果を表示します。
 nは上昇させる値です。この値は省略可能です。
 mは因果点の現在値です。
 nを省略した場合、因果点を3点上昇させた値を表示します。
 例)AV$3 AV(1)$6 AV1$7

・命中判定の効力値によるボーナス DB(n)
 ダメージ効力表による威力へのボーナスを自動で求めます。
 nは命中判定の効力値です。
 例)DB(15) DB12

※上記コマンドの計算内で割り算を行った場合、小数点以下は切り上げされます。
 ただしダイス出目を割り算した場合、小数点以下は切り捨てされます。
 例)入力:GS(8+3/2) 実行結果:(GS10) > 10 + 3[1,2] > 13
   入力:2d6/2  実行結果:(2D6/2) > 3[1,2]/2 > 1

※因果点が関係するコマンド(MCPI, SV, AV)では、シークレットダイスを使用できません。
MESSAGETEXT

# 因果点は共有リソースなので因果点関係のコマンドはシークレットダイスを無効化
setPrefixes(['GS\(\d+\)', 'GS.*', '^SV\$\d+$', '^AV.*\$\d+$', '^MCPI.*\$\d+$', 'DB\d+'])

def initialize
super
@fractionType = "roundUp"
end

def rollDiceCommand(command)
case command
when /^GS/i
return getCheckResult(command)
when /^SV/i
return setVolition(command)
when /^AV/i
return addVolition(command)
when /^MCPI/i
return murmurChantPrayInvoke(command)
when /^DB/i
return damageBonus(command)
else
return nil
end
end

def getCheckResult(command)
m = /^GS([-+]?[\d]+)?((>=?)(\d+))?$/i.match(command)
ysakasin marked this conversation as resolved.
Show resolved Hide resolved
unless m
return nil
end

basis = m[1].to_i # 基準値
target = m[4].to_i
without_compare = m[2].nil? || target <= 0
cmp_op = m[3]

total, diceText, = roll(2, 6)
achievement = basis + total # 達成値

fumble = diceText == "1,1"
critical = diceText == "6,6"

result = " > #{resultStr(achievement, target, cmp_op, fumble, critical)}"
if without_compare && !fumble && !critical
result = ""
end
basis_str = basis == 0 ? "" : "#{basis} + "

return "(#{command}) > #{basis_str}#{total}[#{diceText}] > #{achievement}#{result}"
end

def setVolition(command)
ysakasin marked this conversation as resolved.
Show resolved Hide resolved
m = /SV\$([\d]+)/i.match(command)
unless m
return nil
end

volition = m[1].to_i
return "因果点:#{volition}点"
end

def addVolition(command)
ysakasin marked this conversation as resolved.
Show resolved Hide resolved
m = /AV\+?([\d]+)?\$([\d]+)$/i.match(command)
unless m
return nil
end

num = m[1].nil? ? 3 : m[1].to_i
volition = m[2].to_i
return "因果点:#{volition}点 → #{volition + num}点"
end

def murmurChantPrayInvoke(command)
m = /MCPI\+?([\d]+)?\$([\d]+)$/i.match(command)
ysakasin marked this conversation as resolved.
Show resolved Hide resolved
unless m
return nil
end

luck = m[1].to_i # 幸運
volition = m[2].to_i # 因果点
if volition >= 12
return "因果点が12点以上の場合、因果点は使用できません。"
end

total, diceText = roll(2, 6)
achievement = total + luck

result = " > #{resultStr(achievement, volition, '>=', false, false)}"
luck_str = luck == 0 ? "" : "+#{luck}"

return "祈念(2d6#{luck_str}) > #{total}[#{diceText}]#{luck_str} > #{achievement}#{result}, 因果点:#{volition}点 → #{volition + 1}点"
end

def damageBonus(command)
m = /DB([\d]+)/i.match(command)
ysakasin marked this conversation as resolved.
Show resolved Hide resolved
unless m
return nil
end

num = m[1].to_i
fmt = "命中判定の効力値によるボーナス > "
if num >= 40
total, diceText, = roll(5, 6)
elsif num >= 30
total, diceText, = roll(4, 6)
elsif num >= 25
total, diceText, = roll(3, 6)
elsif num >= 20
total, diceText, = roll(2, 6)
elsif num >= 15
total, diceText, = roll(1, 6)
else
return fmt + "なし"
end
return fmt + "#{total}[#{diceText}] > #{total}"
end

# 判定結果の文字列を返す
# @param [Integer] achievement 達成値
# @param [Integer] target 目標値
# @param [String] cmp_op 達成値と目標値を比較する比較演算子
# @param [Boolean] fumble ファンブルかどうか
# @param [Boolean] critical クリティカルかどうか
# @return [String]
def resultStr(achievement, target, cmp_op, fumble, critical)
return '大失敗' if fumble
return '大成功' if critical
if cmp_op == ">="
return achievement >= target ? "成功" : "失敗"
else
return achievement > target ? "成功" : "失敗"
end
end
end
Loading