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

nRR を追加 #675

Merged
merged 1 commit into from
Feb 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/bcdice/game_system.rb
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@
require "bcdice/game_system/NinjaSlayer2"
require "bcdice/game_system/NjslyrBattle"
require "bcdice/game_system/NobunagasBlackCastle"
require "bcdice/game_system/NRR"
require "bcdice/game_system/NSSQ"
require "bcdice/game_system/Nuekagami"
require "bcdice/game_system/OneWayHeroics"
Expand Down
122 changes: 122 additions & 0 deletions lib/bcdice/game_system/NRR.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
# frozen_string_literal: true

module BCDice
module GameSystem
class NRR < Base
# ゲームシステムの識別子
ID = 'NRR'

# ゲームシステム名
NAME = 'nRR'

# ゲームシステム名の読みがな
SORT_KEY = 'えぬああるあある'

# ダイスボットの使い方
HELP_MESSAGE = <<~INFO_MESSAGETEXT
▪️判定
・ノーマルダイス NR8
・有利ダイス NR10
・不利ダイス NR6
・Exダイス NR12

ダイスの個数を指定しての判定ができます。
例:有利ダイス2個で判定 2NR10

▪️判定結果とシンボル
⭕:成功
❌:失敗
✨:クリティカル(大成功)
💀:ファンブル(大失敗)
🌈:ミラクル(奇跡)
INFO_MESSAGETEXT

register_prefix('\d*NR(6|8|10|12)')

def initialize(command)
super(command)

@sort_barabara_dice = true # バラバラロール(Bコマンド)でソート有
end

def eval_game_system_specific_command(command)
roll_nr(command)
end

private

def roll_nr(command)
m = /^(\d+)?NR(6|8|10|12)$/.match(command)
return nil unless m

times = m[1]&.to_i || 1
table = case m[2]
when "6"
DISADVANTAGE
when "8"
NORMAL
when "10"
ADVANTAGE
else
EXTRA
end

values = @randomizer.roll_barabara(times, table.size)
result = Result.new
text =
if times == 1
level = table[values[0] - 1]
result.condition = SUCCESSES.include?(level)
result.fumble = level == :fumble
result.critical = CRITICALS.include?(level)

"#{ICON[level]} #{RESULT_LABEL[level]}"
else
levels = values.map { |v| table[v - 1] }
values_count = levels
.group_by(&:itself)
.transform_values(&:length)

values_count_strs = LEVELS.map do |l|
count = values_count.fetch(l, 0)
next nil if count == 0

"#{ICON[l]} #{count}"
end

values_count_strs.compact.join(", ")
end

times_str = times == 1 ? nil : times
result.text = "(#{times_str}NR#{m[2]}) > #{values.join(',')} > #{text}"

result
end

LEVELS = [:fumble, :failure, :success, :critical, :miracle].freeze
SUCCESSES = [:success, :critical, :miracle].freeze
CRITICALS = [:critical, :miracle].freeze

DISADVANTAGE = [:fumble, :fumble, :failure, :failure, :success, :success].freeze
NORMAL = [:fumble, :failure, :failure, :failure, :success, :success, :success, :critical].freeze
ADVANTAGE = [:fumble, :failure, :failure, :success, :success, :success, :success, :success, :critical, :critical].freeze
EXTRA = [:fumble, :fumble, :fumble, :failure, :success, :success, :critical, :critical, :critical, :critical, :miracle, :miracle].freeze

ICON = {
fumble: "💀",
failure: "❌",
success: "⭕️",
critical: "✨",
miracle: "🌈",
}.freeze

RESULT_LABEL = {
fumble: "ファンブル(大失敗)",
failure: "失敗",
success: "成功",
critical: "クリティカル(大成功)",
miracle: "ミラクル(奇跡)",
}.freeze
end
end
end
119 changes: 119 additions & 0 deletions test/data/NRR.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
[[ test ]]
game_system = "NRR"
input = "NR6"
output = "(NR6) > 1 > 💀 ファンブル(大失敗)"
fumble = true
failure = true
rands = [
{ sides = 6, value = 1 },
]

[[ test ]]
game_system = "NRR"
input = "NR6"
output = "(NR6) > 6 > ⭕️ 成功"
success = true
rands = [
{ sides = 6, value = 6 },
]

[[ test ]]
game_system = "NRR"
input = "NR8"
output = "(NR8) > 1 > 💀 ファンブル(大失敗)"
fumble = true
failure = true
rands = [
{ sides = 8, value = 1 },
]

[[ test ]]
game_system = "NRR"
input = "NR8"
output = "(NR8) > 8 > ✨ クリティカル(大成功)"
critical = true
success = true
rands = [
{ sides = 8, value = 8 },
]

[[ test ]]
game_system = "NRR"
input = "NR10"
output = "(NR10) > 1 > 💀 ファンブル(大失敗)"
fumble = true
failure = true
rands = [
{ sides = 10, value = 1 },
]

[[ test ]]
game_system = "NRR"
input = "NR10"
output = "(NR10) > 10 > ✨ クリティカル(大成功)"
critical = true
success = true
rands = [
{ sides = 10, value = 10 },
]

[[ test ]]
game_system = "NRR"
input = "NR12"
output = "(NR12) > 1 > 💀 ファンブル(大失敗)"
fumble = true
failure = true
rands = [
{ sides = 12, value = 1 },
]

[[ test ]]
game_system = "NRR"
input = "NR12"
output = "(NR12) > 4 > ❌ 失敗"
failure = true
rands = [
{ sides = 12, value = 4 },
]

[[ test ]]
game_system = "NRR"
input = "NR12"
output = "(NR12) > 6 > ⭕️ 成功"
success = true
rands = [
{ sides = 12, value = 6 },
]

[[ test ]]
game_system = "NRR"
input = "NR12"
output = "(NR12) > 10 > ✨ クリティカル(大成功)"
critical = true
success = true
rands = [
{ sides = 12, value = 10 },
]

[[ test ]]
game_system = "NRR"
input = "NR12"
output = "(NR12) > 12 > 🌈 ミラクル(奇跡)"
critical = true
success = true
rands = [
{ sides = 12, value = 12 },
]

[[ test ]]
game_system = "NRR"
input = "6NR12"
output = "(6NR12) > 3,4,5,7,11,12 > 💀 1, ❌ 1, ⭕️ 1, ✨ 1, 🌈 2"
rands = [
{ sides = 12, value = 3 },
{ sides = 12, value = 4 },
{ sides = 12, value = 5 },
{ sides = 12, value = 7 },
{ sides = 12, value = 11 },
{ sides = 12, value = 12 },
]
Loading