Skip to content
Open
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 @@ -296,3 +296,4 @@
require "bcdice/game_system/Garactier"
require "bcdice/game_system/WoW"
require "bcdice/game_system/MagicPunk"
require "bcdice/game_system/MagicPunk_Korean"
88 changes: 88 additions & 0 deletions lib/bcdice/game_system/MagicPunk_Korean.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# frozen_string_literal: true

module BCDice
module GameSystem
class MagicPunk_Korean < MagicPunk
# ゲームシステムの識別子
ID = "MagicPunk:Korean"

# ゲームシステム名
NAME = "매직펑크TRPG"

# ゲームシステム名の読みがな
SORT_KEY = "国際化:Korean:매직펑크TRPG"

HELP_MESSAGE = <<~TEXT
■ 판정 (nMPm)
nD20을 굴려, m 이하의 눈이 있으면 성공.
m과 같은 눈이 있으면 잭팟(자동 성공).
모든 눈이 1이면 배드 비트(자동 실패).

■ 챌린지 판정 (nMPmCx)
통상 판정에 더해, 챌린지 값 x 이상의 눈이 필요.

■ 다이스 수 0개 (0MPmCx)
수정치 등으로 다이스 수가 0개가 된 경우 2d20을 굴림.
두 개의 눈 중 더 나쁜 쪽의 결과를 적용.
TEXT

register_prefix('^\d*MP\d+')

def eval_game_system_specific_command(command)
return roll_mp(command)
end

private

def roll_mp(command)
m = /^(\d*)MP(\d+)(C?)(\d*)$/.match(command)
return nil unless m

# 構文解析
dices = m[1].empty? ? 1 : m[1].to_i
spec = m[2].to_i
opt1 = m[3]
arg1 = m[4].to_i

# ダイス数0モードフラグ
is_zero = dices == 0
# チャレンジ値
challenge = opt1 == "C" ? arg1 : 0

# ダイスロール
dice_list = @randomizer.roll_barabara(is_zero ? 2 : dices, 20)

# 通常は1つ成功なら成功、0ダイス時はすべて成功したとき成功
check_method = is_zero ? :all? : :any?
# 通常はすべて失敗なら失敗、0ダイス時は1つ失敗したら失敗
fail_method = is_zero ? :any? : :all?

check = dice_list.public_send(check_method) { |d| d <= spec && challenge <= d } # 通常判定
is_jp = dice_list.public_send(check_method) { |d| d == spec } # ジャックポット判定
is_bb = dice_list.public_send(fail_method) { |d| d == 1 } # バッドビート判定

result = if is_bb # 自動失敗優先
is_jp = false
check = false
"실패(BB)"
elsif is_jp
check = true
"성공(JP)"
elsif check
value_method = is_zero ? :min : :max
value = dice_list.select { |d| d <= spec }.public_send(value_method)
"성공(#{value})"
else
"실패"
end

return Result.new.tap do |r|
r.fumble = is_bb
r.critical = is_jp
r.condition = check
r.text = "(#{dices}MP#{spec}C#{challenge}) > [#{dice_list.join(',')}] > #{result}"
end
end
end
end
end
186 changes: 186 additions & 0 deletions test/data/MagicPunk_Korean.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
# 1d Test
[[test]]
game_system = "MagicPunk:Korean"
input = "1MP15"
output = "(1MP15C0) > [10] > 성공(10)"
success = true
critical = false
failure = false
fumble = false
rands = [
{ sides = 20, value = 10 },
]

[[test]]
game_system = "MagicPunk:Korean"
input = "1MP15"
output = "(1MP15C0) > [16] > 실패"
success = false
critical = false
failure = true
fumble = false
rands = [
{ sides = 20, value = 16 },
]

[[test]]
game_system = "MagicPunk:Korean"
input = "MP15"
output = "(1MP15C0) > [15] > 성공(JP)"
success = true
critical = true
failure = false
fumble = false
rands = [
{ sides = 20, value = 15 },
]

[[test]]
game_system = "MagicPunk:Korean"
input = "MP15"
output = "(1MP15C0) > [1] > 실패(BB)"
success = false
critical = false
failure = true
fumble = true
rands = [
{ sides = 20, value = 1 },
]

# Challenge Test
[[test]]
game_system = "MagicPunk:Korean"
input = "3MP15C5"
output = "(3MP15C5) > [10,4,18] > 성공(10)"
success = true
critical = false
failure = false
fumble = false
rands = [
{ sides = 20, value = 10 },
{ sides = 20, value = 4 },
{ sides = 20, value = 18 },
]
[[test]]
game_system = "MagicPunk:Korean"
input = "3MP15C10"
output = "(3MP15C10) > [9,4,18] > 실패"
success = false
critical = false
failure = true
fumble = false
rands = [
{ sides = 20, value = 9 },
{ sides = 20, value = 4 },
{ sides = 20, value = 18 },
]
[[test]]
game_system = "MagicPunk:Korean"
input = "3MP15C18"
output = "(3MP15C18) > [9,15,18] > 성공(JP)"
success = true
critical = true
failure = false
fumble = false
rands = [
{ sides = 20, value = 9 },
{ sides = 20, value = 15 },
{ sides = 20, value = 18 },
]
[[test]]
game_system = "MagicPunk:Korean"
input = "3MP15C1"
output = "(3MP15C1) > [1,1,1] > 실패(BB)"
success = false
critical = false
failure = true
fumble = true
rands = [
{ sides = 20, value = 1 },
{ sides = 20, value = 1 },
{ sides = 20, value = 1 },
]

# 0d Test
[[test]]
game_system = "MagicPunk:Korean"
input = "0MP15C5"
output = "(0MP15C5) > [10,15] > 성공(10)"
success = true
critical = false
failure = false
fumble = false
rands = [
{ sides = 20, value = 10 },
{ sides = 20, value = 15 },
]
[[test]]
game_system = "MagicPunk:Korean"
input = "0MP15C5"
output = "(0MP15C5) > [10,17] > 실패"
success = false
critical = false
failure = true
fumble = false
rands = [
{ sides = 20, value = 10 },
{ sides = 20, value = 17 },
]
[[test]]
game_system = "MagicPunk:Korean"
input = "0MP15C5"
output = "(0MP15C5) > [10,4] > 실패"
success = false
critical = false
failure = true
fumble = false
rands = [
{ sides = 20, value = 10 },
{ sides = 20, value = 4 },
]
[[test]]
game_system = "MagicPunk:Korean"
input = "0MP15C5"
output = "(0MP15C5) > [15,15] > 성공(JP)"
success = true
critical = true
failure = false
fumble = false
rands = [
{ sides = 20, value = 15 },
{ sides = 20, value = 15 },
]
[[test]]
game_system = "MagicPunk:Korean"
input = "0MP15C5"
output = "(0MP15C5) > [1,15] > 실패(BB)"
success = false
critical = false
failure = true
fumble = true
rands = [
{ sides = 20, value = 1 },
{ sides = 20, value = 15 },
]

# 10d Test
[[test]]
game_system = "MagicPunk:Korean"
input = "10MP15C5"
output = "(10MP15C5) > [10,13,10,18,4,5,8,12,17,2] > 성공(13)"
success = true
critical = false
failure = false
fumble = false
rands = [
{ sides = 20, value = 10 },
{ sides = 20, value = 13 },
{ sides = 20, value = 10 },
{ sides = 20, value = 18 },
{ sides = 20, value = 4 },
{ sides = 20, value = 5 },
{ sides = 20, value = 8 },
{ sides = 20, value = 12 },
{ sides = 20, value = 17 },
{ sides = 20, value = 2 },
]