bcdice 3.15.0 → 3.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +140 -0
- data/i18n/Airgetlamh/ja_jp.yml +5 -0
- data/i18n/Airgetlamh/ko_kr.yml +5 -0
- data/i18n/Alsetto/ja_jp.yml +5 -0
- data/i18n/Alsetto/ko_kr.yml +5 -0
- data/i18n/AnimaAnimus/ja_jp.yml +28 -0
- data/i18n/AnimaAnimus/ko_kr.yml +28 -0
- data/i18n/BlackJacket/ja_jp.yml +79 -0
- data/i18n/BlackJacket/ko_kr.yml +79 -0
- data/i18n/Bloodorium/ja_jp.yml +3 -0
- data/i18n/Bloodorium/ko_kr.yml +3 -0
- data/i18n/Cthulhu/ko_kr.yml +1 -1
- data/i18n/DoubleCross/ja_jp.yml +2 -2
- data/i18n/Dracurouge/ko_kr.yml +1284 -205
- data/i18n/Emoklore/ja_jp.yml +1 -0
- data/i18n/Emoklore/ko_kr.yml +8 -0
- data/i18n/FutariSousa/ja_jp.yml +70 -0
- data/i18n/FutariSousa/ko_kr.yml +157 -0
- data/i18n/HatsuneMiku/ja_jp.yml +579 -0
- data/i18n/HatsuneMiku/ko_kr.yml +579 -0
- data/i18n/Irisbane/ja_jp.yml +27 -0
- data/i18n/Irisbane/ko_kr.yml +27 -0
- data/i18n/JuinKansen/ja_jp.yml +168 -0
- data/i18n/JuinKansen/ko_kr.yml +168 -0
- data/i18n/KemonoNoMori/ja_jp.yml +229 -0
- data/i18n/KemonoNoMori/ko_kr.yml +229 -0
- data/i18n/KizunaBullet/ko_kr.yml +653 -0
- data/i18n/MagicPunk/ja_jp.yml +5 -0
- data/i18n/MagicPunk/ko_kr.yml +5 -0
- data/i18n/MorkBorg/ja_jp.yml +34 -0
- data/i18n/MorkBorg/ko_kr.yml +34 -0
- data/i18n/Nechronica/ko_kr.yml +43 -0
- data/i18n/NegikureNegimaki/ja_jp.yml +6 -0
- data/i18n/NegikureNegimaki/ko_kr.yml +6 -0
- data/i18n/Nuekagami/ja_jp.yml +219 -0
- data/i18n/Nuekagami/ko_kr.yml +219 -0
- data/i18n/Revulture/ja_jp.yml +8 -0
- data/i18n/Revulture/ko_kr.yml +8 -0
- data/i18n/SRS/ja_jp.yml +4 -0
- data/i18n/SRS/ko_kr.yml +4 -0
- data/i18n/ShinobiGami/ja_jp.yml +879 -0
- data/i18n/ShinobiGami/ko_kr.yml +876 -0
- data/i18n/SkynautsBouken/ja_jp.yml +28 -28
- data/i18n/StarryDolls/ja_jp.yml +456 -0
- data/i18n/StarryDolls/ko_kr.yml +456 -0
- data/i18n/StratoShout/ja_jp.yml +8 -8
- data/i18n/SwordWorld2_5/ja_jp.yml +48 -0
- data/i18n/Ventangle/ja_jp.yml +4 -0
- data/i18n/Ventangle/ko_kr.yml +4 -0
- data/i18n/YearZeroEngine/ja_jp.yml +12 -0
- data/i18n/YearZeroEngine/ko_kr.yml +12 -0
- data/i18n/ZombiLine/ja_jp.yml +27 -0
- data/i18n/ZombiLine/ko_kr.yml +27 -0
- data/i18n/ko_kr.yml +2 -0
- data/i18n/zh_hant.yml +2 -2
- data/lib/bcdice/dice_table/d66_left_range_table.rb +21 -0
- data/lib/bcdice/game_system/Aionia.rb +68 -19
- data/lib/bcdice/game_system/Airgetlamh.rb +64 -41
- data/lib/bcdice/game_system/Airgetlamh_Korean.rb +53 -0
- data/lib/bcdice/game_system/Alsetto.rb +63 -50
- data/lib/bcdice/game_system/Alsetto_Korean.rb +51 -0
- data/lib/bcdice/game_system/AnimaAnimus.rb +15 -32
- data/lib/bcdice/game_system/AnimaAnimus_Korean.rb +39 -0
- data/lib/bcdice/game_system/BlackJacket.rb +57 -113
- data/lib/bcdice/game_system/BlackJacket_Korean.rb +8 -206
- data/lib/bcdice/game_system/Bloodorium.rb +1 -1
- data/lib/bcdice/game_system/Bloodorium_Korean.rb +34 -0
- data/lib/bcdice/game_system/ChroniclesOfDarkness2e.rb +163 -0
- data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +471 -300
- data/lib/bcdice/game_system/DeadlineHeroes_Korean.rb +273 -0
- data/lib/bcdice/game_system/Dracurouge_Korean.rb +25 -19
- data/lib/bcdice/game_system/DungeonsAndDragons5.rb +106 -73
- data/lib/bcdice/game_system/DungeonsAndDragons5_Korean.rb +53 -0
- data/lib/bcdice/game_system/DungeonsAndDragons_Korean.rb +61 -0
- data/lib/bcdice/game_system/EdgeFlippers.rb +315 -0
- data/lib/bcdice/game_system/Emoklore.rb +34 -9
- data/lib/bcdice/game_system/Emoklore_Korean.rb +50 -0
- data/lib/bcdice/game_system/FateCoreSystem.rb +10 -6
- data/lib/bcdice/game_system/FullMetalPanic_Korean.rb +28 -0
- data/lib/bcdice/game_system/FutariSousa.rb +37 -12
- data/lib/bcdice/game_system/FutariSousa_Korean.rb +25 -8
- data/lib/bcdice/game_system/GaiaCare.rb +40 -0
- data/lib/bcdice/game_system/Garactier.rb +1 -1
- data/lib/bcdice/game_system/GardenOrder.rb +2 -2
- data/lib/bcdice/game_system/GardenOrderReEdit.rb +849 -0
- data/lib/bcdice/game_system/GardenOrder_Korean.rb +839 -0
- data/lib/bcdice/game_system/HatsuneMiku.rb +51 -605
- data/lib/bcdice/game_system/HatsuneMiku_Korean.rb +56 -0
- data/lib/bcdice/game_system/HunterTheReckoning5th.rb +15 -11
- data/lib/bcdice/game_system/Irisbane.rb +17 -30
- data/lib/bcdice/game_system/Irisbane_Korean.rb +52 -0
- data/lib/bcdice/game_system/JuinKansen.rb +41 -208
- data/lib/bcdice/game_system/JuinKansen_Korean.rb +46 -0
- data/lib/bcdice/game_system/KemonoNoMori.rb +67 -276
- data/lib/bcdice/game_system/KemonoNoMori_Korean.rb +62 -0
- data/lib/bcdice/game_system/KinAriel.rb +117 -0
- data/lib/bcdice/game_system/KizunaBullet_Korean.rb +109 -0
- data/lib/bcdice/game_system/KutuluRevised.rb +94 -0
- data/lib/bcdice/game_system/LiverLabyrinth.rb +321 -0
- data/lib/bcdice/game_system/Lost.rb +89 -0
- data/lib/bcdice/game_system/MagicPunk.rb +85 -0
- data/lib/bcdice/game_system/MagicPunk_Korean.rb +39 -0
- data/lib/bcdice/game_system/MarvelHeroicRoleplaying.rb +144 -0
- data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +122 -2
- data/lib/bcdice/game_system/MetallicGuardian_Korean.rb +28 -0
- data/lib/bcdice/game_system/MorkBorg.rb +170 -0
- data/lib/bcdice/game_system/MorkBorg_Korean.rb +49 -0
- data/lib/bcdice/game_system/NanimonaiMura.rb +112 -0
- data/lib/bcdice/game_system/Nechronica_Korean.rb +6 -6
- data/lib/bcdice/game_system/NegikureNegimaki.rb +140 -0
- data/lib/bcdice/game_system/NegikureNegimaki_Korean.rb +48 -0
- data/lib/bcdice/game_system/NeonUnderRealm.rb +122 -0
- data/lib/bcdice/game_system/NinjaSlayer2.rb +170 -49
- data/lib/bcdice/game_system/Nuekagami.rb +19 -261
- data/lib/bcdice/game_system/Nuekagami_Korean.rb +43 -0
- data/lib/bcdice/game_system/ParanoiaPerfect.rb +74 -0
- data/lib/bcdice/game_system/PastFutureParadox.rb +2245 -55
- data/lib/bcdice/game_system/PreciousDays.rb +170 -0
- data/lib/bcdice/game_system/Revulture.rb +8 -5
- data/lib/bcdice/game_system/Revulture_Korean.rb +51 -0
- data/lib/bcdice/game_system/Ryutama.rb +46 -46
- data/lib/bcdice/game_system/SRS.rb +4 -4
- data/lib/bcdice/game_system/SRS_Korean.rb +67 -0
- data/lib/bcdice/game_system/ShinobiGami.rb +154 -1047
- data/lib/bcdice/game_system/ShinobiGami_Korean.rb +102 -0
- data/lib/bcdice/game_system/StarryDolls.rb +70 -508
- data/lib/bcdice/game_system/StarryDolls_Korean.rb +80 -0
- data/lib/bcdice/game_system/StratoShout.rb +1 -1
- data/lib/bcdice/game_system/SwordWorld.rb +28 -2
- data/lib/bcdice/game_system/SwordWorld2_0.rb +1 -1
- data/lib/bcdice/game_system/SwordWorld2_5.rb +67 -3
- data/lib/bcdice/game_system/TacticalExorcist.rb +222 -0
- data/lib/bcdice/game_system/TenkaRyouran_Korean.rb +30 -0
- data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +38 -33
- data/lib/bcdice/game_system/Ventangle.rb +8 -7
- data/lib/bcdice/game_system/Ventangle_Korean.rb +41 -0
- data/lib/bcdice/game_system/Warhammer4.rb +202 -6
- data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +20 -15
- data/lib/bcdice/game_system/WorldEndScrapyard.rb +333 -0
- data/lib/bcdice/game_system/WorldsEndFrontline_Korean.rb +26 -0
- data/lib/bcdice/game_system/YearZeroEngine.rb +7 -7
- data/lib/bcdice/game_system/YearZeroEngine_Korean.rb +46 -0
- data/lib/bcdice/game_system/ZombiLine.rb +29 -36
- data/lib/bcdice/game_system/ZombiLine_Korean.rb +37 -0
- data/lib/bcdice/game_system/cthulhu7th_Korean/full_auto.rb +294 -0
- data/lib/bcdice/game_system/cthulhu7th_Korean/rollable.rb +43 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/atoz_table.rb +1184 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/randr236_table.rb +254 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +54 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/tk_table.rb +755 -0
- data/lib/bcdice/game_system/sword_world/rating_options.rb +9 -0
- data/lib/bcdice/game_system/sword_world/rating_parsed.rb +19 -0
- data/lib/bcdice/game_system/sword_world/rating_parser.rb +229 -149
- data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -0
- data/lib/bcdice/game_system.rb +47 -0
- data/lib/bcdice/version.rb +1 -1
- metadata +96 -2
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BCDice
|
|
4
|
+
module GameSystem
|
|
5
|
+
class MarvelHeroicRoleplaying < Base
|
|
6
|
+
# ゲームシステムの識別子
|
|
7
|
+
ID = 'MarvelHeroicRoleplaying'
|
|
8
|
+
|
|
9
|
+
# ゲームシステム名
|
|
10
|
+
NAME = 'MarvelヒロイックRPG'
|
|
11
|
+
|
|
12
|
+
# ゲームシステム名の読みがな
|
|
13
|
+
SORT_KEY = 'まあへるひろいつくRPG'
|
|
14
|
+
|
|
15
|
+
# ダイスボットの使い方
|
|
16
|
+
HELP_MESSAGE = <<~INFO_MESSAGETEXT
|
|
17
|
+
■判定 MHRnDx[+nDx] n: ダイス数 x:ダイスの面数
|
|
18
|
+
|
|
19
|
+
例)MHR3D10+2D8+1D6: 10面ダイスを3個・8面ダイスを2個・6面ダイスを1個振って、その結果を表示(合計値,効果ダイス,チャンス)
|
|
20
|
+
合計値を優先した場合と効果ダイスを優先した場合で結果が変わるケースでは双方を表示。
|
|
21
|
+
|
|
22
|
+
INFO_MESSAGETEXT
|
|
23
|
+
|
|
24
|
+
register_prefix('MHR')
|
|
25
|
+
|
|
26
|
+
def initialize(command)
|
|
27
|
+
super(command)
|
|
28
|
+
|
|
29
|
+
@sort_barabara_dice = true # バラバラロール(Bコマンド)でソート有
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def eval_game_system_specific_command(command)
|
|
33
|
+
resolute_action(command)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
DiceBlock = Struct.new(:counts, :sides)
|
|
39
|
+
DiceStats = Struct.new(:value, :sides, :used)
|
|
40
|
+
|
|
41
|
+
# 判定
|
|
42
|
+
# @param [String] command
|
|
43
|
+
# @return [Result]
|
|
44
|
+
def resolute_action(command)
|
|
45
|
+
m = /MHR((\d+D\d+)(\+\d+D\d+)*)/.match(command)
|
|
46
|
+
return nil unless m
|
|
47
|
+
|
|
48
|
+
dice_str = m[1]
|
|
49
|
+
dice_cmd_arr = dice_str.split("+")
|
|
50
|
+
dice_block_arr = []
|
|
51
|
+
|
|
52
|
+
dice_cmd_arr.each do |d|
|
|
53
|
+
n = /(\d+)D(\d+)/.match(d)
|
|
54
|
+
dice_block_arr.push(DiceBlock.new(n[1].to_i, n[2].to_i))
|
|
55
|
+
end
|
|
56
|
+
dice_block_arr = dice_block_arr.group_by(&:sides)
|
|
57
|
+
.map { |sides, group| DiceBlock.new(group.sum(&:counts), sides) }
|
|
58
|
+
.sort_by { |item| -item.sides }
|
|
59
|
+
|
|
60
|
+
output = ""
|
|
61
|
+
result_dice_stats_arr = []
|
|
62
|
+
dice_block_arr.each do |db|
|
|
63
|
+
dices = @randomizer.roll_barabara(db.counts, db.sides).sort.reverse
|
|
64
|
+
dices.each do |n|
|
|
65
|
+
result_dice_stats_arr.push(DiceStats.new(n, db.sides, false))
|
|
66
|
+
end
|
|
67
|
+
dice_text = dices.join(",")
|
|
68
|
+
output += ",D#{db.sides}[#{dice_text}]"
|
|
69
|
+
end
|
|
70
|
+
output = output.delete_prefix(",")
|
|
71
|
+
result_dice_stats_arr = result_dice_stats_arr.sort_by { |item| [-item.value, item.sides] }
|
|
72
|
+
|
|
73
|
+
chance = result_dice_stats_arr.count { |item| item.value == 1 }
|
|
74
|
+
result_dice_stats_arr.each { |item| item.used = true if item.value == 1 }
|
|
75
|
+
|
|
76
|
+
add_dice, effect_die = result_prioritize_the_sum(result_dice_stats_arr)
|
|
77
|
+
return nil if add_dice <= 0
|
|
78
|
+
|
|
79
|
+
output_prioritize_the_sum = "合計値#{add_dice},効果ダイスD#{effect_die}"
|
|
80
|
+
add_dice, effect_die = result_prioritize_effect_dice(result_dice_stats_arr)
|
|
81
|
+
output_prioritize_effect_dice = "合計値#{add_dice},効果ダイスD#{effect_die}"
|
|
82
|
+
if add_dice == 0 || output_prioritize_the_sum == output_prioritize_effect_dice
|
|
83
|
+
output += " > #{output_prioritize_the_sum}"
|
|
84
|
+
else
|
|
85
|
+
output += " > #{output_prioritize_the_sum} or #{output_prioritize_effect_dice}"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
if chance > 0
|
|
89
|
+
output += " > チャンス#{chance}"
|
|
90
|
+
return Result.failure(output)
|
|
91
|
+
else
|
|
92
|
+
return Result.success(output)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# 合計値優先
|
|
97
|
+
def result_prioritize_the_sum(dice_stats_arr)
|
|
98
|
+
result_dice_stats_arr = dice_stats_arr.map { |item| DiceStats.new(*item.to_h.values) }
|
|
99
|
+
|
|
100
|
+
if result_dice_stats_arr.length >= 2
|
|
101
|
+
add_dice = result_dice_stats_arr[0].value + result_dice_stats_arr[1].value
|
|
102
|
+
result_dice_stats_arr[0].used = true
|
|
103
|
+
result_dice_stats_arr[1].used = true
|
|
104
|
+
else
|
|
105
|
+
return 0, 4
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
max_item = result_dice_stats_arr.reject(&:used)
|
|
109
|
+
.max_by(&:sides)
|
|
110
|
+
if max_item
|
|
111
|
+
effect_die = max_item.sides
|
|
112
|
+
else
|
|
113
|
+
effect_die = 4
|
|
114
|
+
end
|
|
115
|
+
return add_dice, effect_die
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# 効果ダイス優先
|
|
119
|
+
def result_prioritize_effect_dice(dice_stats_arr)
|
|
120
|
+
result_dice_stats_arr = dice_stats_arr.map { |item| DiceStats.new(*item.to_h.values) }
|
|
121
|
+
|
|
122
|
+
max_item = result_dice_stats_arr.reject(&:used)
|
|
123
|
+
.min_by { |item| [-item.sides, item.value] }
|
|
124
|
+
if max_item
|
|
125
|
+
max_item.used = true
|
|
126
|
+
effect_die = max_item.sides
|
|
127
|
+
else
|
|
128
|
+
effect_die = 4
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
result_dice_stats_arr2 = result_dice_stats_arr.reject(&:used)
|
|
132
|
+
if result_dice_stats_arr2.length >= 2
|
|
133
|
+
result_dice_stats_arr = result_dice_stats_arr2.sort_by { |item| [-item.value, item.sides] }
|
|
134
|
+
add_dice = result_dice_stats_arr[0].value + result_dice_stats_arr[1].value
|
|
135
|
+
else
|
|
136
|
+
effect_die = 4
|
|
137
|
+
add_dice = 0
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
return add_dice, effect_die
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
@@ -23,6 +23,7 @@ module BCDice
|
|
|
23
23
|
・各種表
|
|
24
24
|
・休憩表:才覚 TBT/魅力 CBT/探索 SBT/武勇 VBT
|
|
25
25
|
お祭り FBT/空振り EBT/全体 WBT/カップル LBT
|
|
26
|
+
お食事 FDBT
|
|
26
27
|
・ハプニング表:才覚 THT/魅力 CHT/探索 SHT/武勇 VHT
|
|
27
28
|
・視察表 RT/情報収集表 IG/ランダムマップ選択表 RMS
|
|
28
29
|
・痛打表 CAT/致命傷表 FWT/戦闘ファンブル表 CFT
|
|
@@ -31,9 +32,11 @@ module BCDice
|
|
|
31
32
|
・お宝表1/2/3/4/5 T1T/T2T/T3T/T4T/T5T
|
|
32
33
|
・特殊遭遇表 SE
|
|
33
34
|
上級:人工 ARN/水域 WEN/自然 NEN/洞窟 CEN/天空 SEN/異界 OEN
|
|
35
|
+
・他国との関係表 ORT
|
|
34
36
|
・潜在能力:スキル決定表 SDT
|
|
35
37
|
基本:肉弾 BUS/射撃 SHS/星術 ASS/召喚 SUS/科学 SCS
|
|
36
38
|
迷宮 LAS/交渉 NES/便利 COS/芸能 ENS/道具 TOS
|
|
39
|
+
一般 GES
|
|
37
40
|
上級:肉弾 ABUS/射撃 ASHS/星術 AASS/召喚 ASUS/科学 ASCS
|
|
38
41
|
迷宮 ALAS/交渉 ANES/便利 ACOS/芸能 AENS/道具 ATOS
|
|
39
42
|
・アイテム関連(上級不使用の場合、カッコ書きのものを使用して下さい)
|
|
@@ -53,6 +56,60 @@ module BCDice
|
|
|
53
56
|
・生まれ決定表 BDT/生まれ表:才覚 TBO/魅力 CBO/探索 SBO/武勇 VBO
|
|
54
57
|
・初期装備表 IEQ
|
|
55
58
|
・地名決定表 PNTx (xは個数)/迷宮風景表 MLTx (xは個数)
|
|
59
|
+
・百万世界AtoZ関連
|
|
60
|
+
・ご祝儀表 GIFT
|
|
61
|
+
・ニュース表 NWST
|
|
62
|
+
・王国ハプニング表 KDHT
|
|
63
|
+
・王国試練表 KDTT
|
|
64
|
+
・騎士道表 CHVT
|
|
65
|
+
・儀式表 RITT
|
|
66
|
+
・限定表 LIMT
|
|
67
|
+
・固有の文化表 UNCT
|
|
68
|
+
・後世の評価表 POET
|
|
69
|
+
・高レベル特殊遭遇表 KSET
|
|
70
|
+
・死霊の日々表 DODT
|
|
71
|
+
・事件名表1/2 INT1/INT2
|
|
72
|
+
・守護星座表 GUCT
|
|
73
|
+
・需要表 DEMTx (x:名物レベル)
|
|
74
|
+
・小鬼と一緒表 WLDT
|
|
75
|
+
・侵略ハプニング表 INHT
|
|
76
|
+
・新・情報収集表 NIGT
|
|
77
|
+
・人種特徴表/人種名文字表 RACT/RNCTx (x:文字数)
|
|
78
|
+
・迷宮化現象表/人体迷宮化表 HBLT/LAPT
|
|
79
|
+
・勢力表 POWT
|
|
80
|
+
・中立特殊遭遇表 NSET
|
|
81
|
+
・超協調行動表 ECBT
|
|
82
|
+
・通貨外見表/通貨材質表/通貨名称表 CUAT/CUMT/CUNT
|
|
83
|
+
・天候表 WEAT
|
|
84
|
+
・毒の追加効果表 PAET
|
|
85
|
+
・媒体表 MEDT
|
|
86
|
+
・反応表/民の反応表 REAT/PRET
|
|
87
|
+
・遍歴表 HIST
|
|
88
|
+
・由来表 ORIT
|
|
89
|
+
・誘致表 ATRT
|
|
90
|
+
・妖精の悪戯表 FAMT
|
|
91
|
+
・R&R236関連
|
|
92
|
+
・四字熟語系二つ名表/代入命名表/組み合わせ系二つ名表/名文句系二つ名表 FCNT/ASNT/CMNT/FPNT
|
|
93
|
+
・形容表/用語表/行動表/呼び名表/称号表 DEST/TRMT/BEHT/NAMT/TTLT
|
|
94
|
+
・旅する王国と無名階域関連
|
|
95
|
+
・サブキャラクター反応表 CSRT
|
|
96
|
+
・スキルグループ表 KSGT
|
|
97
|
+
・ダイナマイト帝国:休憩表/特殊遭遇表/二つ名表/名前表 DRET/DSET/DNNT/DNAT
|
|
98
|
+
・ハグルマ資本主義神聖共和国:休憩表/特殊遭遇表/二つ名表/名前表 HRET/HSET/HNNT/HNAT
|
|
99
|
+
・メトロ汗国:休憩表/特殊遭遇表/二つ名表/名前表 MRET/MSET/MNNT/MNAT
|
|
100
|
+
・千年王朝:休憩表/特殊遭遇表/二つ名表/名前表 TRET/TSET/TNNT/TNAT
|
|
101
|
+
・遠征王国変動表/遠征道中表 EKCT/EXITx (x:修正)
|
|
102
|
+
・候補生背景表/職長背景表 CABT/FOBT
|
|
103
|
+
・上級ジョブ表・甲/乙 AJTA/AJTB
|
|
104
|
+
・深階休憩表/特殊遭遇表 KART/KAET
|
|
105
|
+
・天階休憩表/特殊遭遇表 TERT/TEET
|
|
106
|
+
・星の階休憩表 HKRT
|
|
107
|
+
・装備決定表 EQDT
|
|
108
|
+
・大冒険時代表 GART
|
|
109
|
+
・燃料表 FUET
|
|
110
|
+
・反乱表 RBLT
|
|
111
|
+
・旅する王国環境表/王国名決定表1/王国名決定表2/王国名決定表3 TKET/TKNT1/TKNT2/TKNT3
|
|
112
|
+
・列強経歴表 GPHT
|
|
56
113
|
・D66ダイスあり
|
|
57
114
|
INFO_MESSAGE_TEXT
|
|
58
115
|
|
|
@@ -73,7 +130,17 @@ module BCDice
|
|
|
73
130
|
'ABUS', 'ASHS', 'AASS', 'ASUS', 'ASCS', 'ALAS', 'ANES', 'ACOS', 'AENS', 'ATOS',
|
|
74
131
|
'SE', 'ARN', 'WEN', 'NEN', 'CEN', 'SEN', 'OEN',
|
|
75
132
|
'DFT',
|
|
76
|
-
'PNT', 'MLT'
|
|
133
|
+
'PNT', 'MLT',
|
|
134
|
+
'FDBT', 'GIFT', 'NWST', 'EKCT', 'KDHT', 'KDTT', 'CHVT', 'RITT', 'LIMT', 'UNCT', 'POET',
|
|
135
|
+
'KSET', 'DODT', 'INT1', 'INT2', 'GUCT', 'DEMT', 'WLDT', 'INHT', 'NIGT', 'RACT', 'RNCT',
|
|
136
|
+
'HBLT', 'POWT', 'NSET', 'ECBT', 'CUAT', 'CUMT', 'CUNT', 'WEAT', 'PAET', 'MEDT', 'REAT',
|
|
137
|
+
'HIST', 'PRET', 'LAPT', 'ORIT', 'ATRT', 'FAMT',
|
|
138
|
+
'FCNT', 'ASNT', 'TRMT', 'BEHT', 'DEST', 'NAMT', 'TTLT',
|
|
139
|
+
'CMNT', 'FPNT', 'CSRT', 'KSGT', 'DRET', 'DSET', 'DNNT', 'DNAT', 'HRET', 'HSET', 'HNNT',
|
|
140
|
+
'HNAT', 'MRET', 'MSET', 'MNNT', 'MNAT', 'EXIT', 'TRET', 'TSET', 'TNNT', 'TNAT', 'CABT',
|
|
141
|
+
'AJTA', 'AJTB', 'FOBT', 'KAET', 'KART', 'TEET', 'TERT', 'HKRT', 'EQDT', 'GART', 'FUET',
|
|
142
|
+
'RBLT', 'TKET', 'GPHT',
|
|
143
|
+
'TKNT1', 'TKNT2', 'TKNT3', 'GES', 'ORT'
|
|
77
144
|
)
|
|
78
145
|
|
|
79
146
|
def initialize(command)
|
|
@@ -81,6 +148,7 @@ module BCDice
|
|
|
81
148
|
|
|
82
149
|
@sort_add_dice = true
|
|
83
150
|
@d66_sort_type = D66SortType::ASC
|
|
151
|
+
@round_type = RoundType::CEIL
|
|
84
152
|
end
|
|
85
153
|
|
|
86
154
|
def kiryoku_result(_total_n, dice_list, _diff)
|
|
@@ -100,6 +168,12 @@ module BCDice
|
|
|
100
168
|
|
|
101
169
|
if (output = roll_tables(command, TABLES))
|
|
102
170
|
return output
|
|
171
|
+
elsif (output = roll_tables(command, A2Z_TABLES))
|
|
172
|
+
return output
|
|
173
|
+
elsif (output = roll_tables(command, RR236_TABLES))
|
|
174
|
+
return output
|
|
175
|
+
elsif (output = roll_tables(command, TK_TABLES))
|
|
176
|
+
return output
|
|
103
177
|
else
|
|
104
178
|
|
|
105
179
|
case command
|
|
@@ -248,6 +322,50 @@ module BCDice
|
|
|
248
322
|
when /^ATOS/i
|
|
249
323
|
type = '上級道具スキル'
|
|
250
324
|
output, total_n = mk_advanced_tool_skill_table
|
|
325
|
+
when /^GUCT/i
|
|
326
|
+
type = '守護星座'
|
|
327
|
+
total_n = @randomizer.roll_once(6) * 100 + @randomizer.roll_once(6) * 10 + @randomizer.roll_once(6)
|
|
328
|
+
output = mk_guardian_constellation_table(total_n)
|
|
329
|
+
when /^DEMT(\d+)/i
|
|
330
|
+
type = '需要'
|
|
331
|
+
count = getCount(Regexp.last_match(1))
|
|
332
|
+
output, total_n = get_demand_table(count)
|
|
333
|
+
when /^RNCT(\d*)/i
|
|
334
|
+
type = '人種名文字'
|
|
335
|
+
count = getCount(Regexp.last_match(1))
|
|
336
|
+
output, total_n = get_race_name_character_table(count)
|
|
337
|
+
when /^CUMT/i
|
|
338
|
+
type = '通貨材質'
|
|
339
|
+
@total = [@randomizer.roll_barabara(2, 6).sum(), @randomizer.roll_once(6)]
|
|
340
|
+
total_n = @total.join(',')
|
|
341
|
+
output = get_currency_material_table(*@total)
|
|
342
|
+
when /^CMNT/i
|
|
343
|
+
type = '組み合わせ系二つ名'
|
|
344
|
+
output, total_n = mk_combination_nickname_table
|
|
345
|
+
when /^DEST/i
|
|
346
|
+
type = '形容'
|
|
347
|
+
total_n = @randomizer.roll_d66(D66SortType::ASC)
|
|
348
|
+
output = mk_descriptive_table(total_n)
|
|
349
|
+
when /^TRMT/i
|
|
350
|
+
type = '用語'
|
|
351
|
+
total_n = @randomizer.roll_d66(D66SortType::ASC)
|
|
352
|
+
output = mk_terminology_table(total_n)
|
|
353
|
+
when /^BEHT/i
|
|
354
|
+
type = '行動'
|
|
355
|
+
total_n = @randomizer.roll_d66(D66SortType::ASC)
|
|
356
|
+
output = mk_behavior_table(total_n)
|
|
357
|
+
when /^NAMT/i
|
|
358
|
+
type = '呼び名'
|
|
359
|
+
total_n = @randomizer.roll_d66(D66SortType::ASC)
|
|
360
|
+
output = mk_rr236_name_table(total_n)
|
|
361
|
+
when /^TTLT/i
|
|
362
|
+
type = '称号'
|
|
363
|
+
total_n = @randomizer.roll_d66(D66SortType::ASC)
|
|
364
|
+
output = mk_title_table(total_n)
|
|
365
|
+
when /^EXIT([-+]?\d*)/i
|
|
366
|
+
type = '遠征道中'
|
|
367
|
+
modify = get_modify(Regexp.last_match(1))
|
|
368
|
+
output, total_n = get_expedition_itinerary_table(modify)
|
|
251
369
|
end
|
|
252
370
|
|
|
253
371
|
if !output.nil?
|
|
@@ -261,9 +379,11 @@ module BCDice
|
|
|
261
379
|
end
|
|
262
380
|
end
|
|
263
381
|
end
|
|
264
|
-
|
|
265
382
|
require "bcdice/game_system/meikyu_kingdom_basic/item_table"
|
|
266
383
|
require "bcdice/game_system/meikyu_kingdom_basic/kingdom_table"
|
|
267
384
|
require "bcdice/game_system/meikyu_kingdom_basic/name_table"
|
|
268
385
|
require "bcdice/game_system/meikyu_kingdom_basic/word_table"
|
|
269
386
|
require "bcdice/game_system/meikyu_kingdom_basic/table"
|
|
387
|
+
require "bcdice/game_system/meikyu_kingdom_basic/atoz_table"
|
|
388
|
+
require "bcdice/game_system/meikyu_kingdom_basic/randr236_table"
|
|
389
|
+
require "bcdice/game_system/meikyu_kingdom_basic/tk_table"
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bcdice/game_system/MetallicGuardian'
|
|
4
|
+
|
|
5
|
+
module BCDice
|
|
6
|
+
module GameSystem
|
|
7
|
+
class MetallicGuardian_Korean < MetallicGuardian
|
|
8
|
+
# ゲームシステムの識別子
|
|
9
|
+
ID = 'MetallicGuardian:Korean'
|
|
10
|
+
|
|
11
|
+
# ゲームシステム名
|
|
12
|
+
NAME = '메탈릭 가디언 RPG'
|
|
13
|
+
|
|
14
|
+
# ゲームシステム名の読みがな
|
|
15
|
+
SORT_KEY = '国際化:Korean:메탈릭 가디언 RPG'
|
|
16
|
+
|
|
17
|
+
set_aliases_for_srs_roll('MG')
|
|
18
|
+
|
|
19
|
+
register_prefix_from_super_class()
|
|
20
|
+
|
|
21
|
+
def initialize(command)
|
|
22
|
+
super(command)
|
|
23
|
+
|
|
24
|
+
@locale = :ko_kr
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bcdice/dice_table/table'
|
|
4
|
+
|
|
5
|
+
module BCDice
|
|
6
|
+
module GameSystem
|
|
7
|
+
class MorkBorg < Base
|
|
8
|
+
# ゲームシステムの識別子
|
|
9
|
+
ID = 'MorkBorg'
|
|
10
|
+
|
|
11
|
+
# ゲームシステム名
|
|
12
|
+
NAME = 'MÖRK BORG'
|
|
13
|
+
|
|
14
|
+
# ゲームシステム名の読みがな
|
|
15
|
+
SORT_KEY = 'むるくほりい'
|
|
16
|
+
|
|
17
|
+
# ダイスボットの使い方
|
|
18
|
+
HELP_MESSAGE = <<~INFO_MESSAGETEXT
|
|
19
|
+
■判定 sDRt s: 能力値(省略時:0) t:目標値
|
|
20
|
+
|
|
21
|
+
例)+3DR12: 能力値+3、DR12で1d20を振って、その結果を表示(クリティカル・ファンブルも表示)
|
|
22
|
+
|
|
23
|
+
■イニシアティヴ sINS s: 能力値(省略時:0. 個別のイニシアティブを使う場合)
|
|
24
|
+
|
|
25
|
+
例)INS: 1d6を振って、イニシアティヴの結果を表示(PC先行を成功として表示)
|
|
26
|
+
|
|
27
|
+
■モラル sMORt s: 能力値(省略時:0) t:相手クリーチャーのモラル値
|
|
28
|
+
|
|
29
|
+
例)MOR8: 2d6を振って、モラル判定の結果を表示(モラル崩壊を成功として表示)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
■各種表
|
|
33
|
+
|
|
34
|
+
・遭遇反応表 Reaction (ERT)
|
|
35
|
+
・破損 Broken (BRO)
|
|
36
|
+
|
|
37
|
+
INFO_MESSAGETEXT
|
|
38
|
+
|
|
39
|
+
def initialize(command)
|
|
40
|
+
super(command)
|
|
41
|
+
|
|
42
|
+
@sort_add_dice = true
|
|
43
|
+
@d66_sort_type = D66SortType::NO_SORT
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def eval_game_system_specific_command(command)
|
|
47
|
+
resolute_action(command) || resolute_initiative(command) || resolute_morale(command) || roll_tables(command, self.class::TABLES)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def result_dr(total, dice_total, target)
|
|
53
|
+
if dice_total <= 1
|
|
54
|
+
Result.fumble(translate('MorkBorg.fumble'))
|
|
55
|
+
elsif dice_total >= 20
|
|
56
|
+
Result.critical(translate('MorkBorg.critical'))
|
|
57
|
+
elsif total >= target
|
|
58
|
+
Result.success(translate('MorkBorg.success'))
|
|
59
|
+
else
|
|
60
|
+
Result.failure(translate('MorkBorg.failure'))
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# DR判定
|
|
65
|
+
# @param [String] command
|
|
66
|
+
# @return [Result]
|
|
67
|
+
def resolute_action(command)
|
|
68
|
+
m = /^([+-]?\d+)?DR(\d+)$/.match(command)
|
|
69
|
+
return nil unless m
|
|
70
|
+
|
|
71
|
+
num_status = m[1].to_i
|
|
72
|
+
num_target = m[2].to_i
|
|
73
|
+
|
|
74
|
+
total = @randomizer.roll_once(20)
|
|
75
|
+
total_status = total.to_s + with_symbol(num_status)
|
|
76
|
+
result = result_dr(total + num_status, total, num_target)
|
|
77
|
+
|
|
78
|
+
sequence = [
|
|
79
|
+
"(#{command})",
|
|
80
|
+
total_status,
|
|
81
|
+
total + num_status,
|
|
82
|
+
result.text,
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
result.text = sequence.join(" > ")
|
|
86
|
+
return result
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def with_symbol(number)
|
|
90
|
+
if number == 0
|
|
91
|
+
return "+0"
|
|
92
|
+
elsif number > 0
|
|
93
|
+
return "+#{number}"
|
|
94
|
+
else
|
|
95
|
+
return number.to_s
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# イニシアティヴ判定
|
|
100
|
+
# @param [String] command
|
|
101
|
+
# @return [Result]
|
|
102
|
+
def resolute_initiative(command)
|
|
103
|
+
m = /^([+-]?\d+)?INS$/.match(command)
|
|
104
|
+
return nil unless m
|
|
105
|
+
|
|
106
|
+
num_status = m[1].to_i
|
|
107
|
+
|
|
108
|
+
die = @randomizer.roll_once(6)
|
|
109
|
+
total = die + num_status
|
|
110
|
+
result =
|
|
111
|
+
if total >= 4
|
|
112
|
+
Result.success(translate('MorkBorg.pcs_go_first'))
|
|
113
|
+
else
|
|
114
|
+
Result.failure(translate('MorkBorg.enemies_go_first'))
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
result.text = "(#{command}) > #{die}#{with_symbol(num_status)} > #{total} > #{result.text}"
|
|
118
|
+
return result
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# モラル判定
|
|
122
|
+
# @param [String] command
|
|
123
|
+
# @return [Result]
|
|
124
|
+
def resolute_morale(command)
|
|
125
|
+
m = /^([+-]?\d+)?MOR(\d+)$/.match(command)
|
|
126
|
+
return nil unless m
|
|
127
|
+
|
|
128
|
+
num_status = m[1].to_i
|
|
129
|
+
num_target = m[2].to_i
|
|
130
|
+
|
|
131
|
+
dice_list = @randomizer.roll_barabara(2, 6)
|
|
132
|
+
dice_total = dice_list.sum()
|
|
133
|
+
total = dice_total + num_status
|
|
134
|
+
|
|
135
|
+
die = ""
|
|
136
|
+
result =
|
|
137
|
+
if total <= num_target
|
|
138
|
+
Result.failure(translate('MorkBorg.maintain'))
|
|
139
|
+
else
|
|
140
|
+
die = @randomizer.roll_once(6)
|
|
141
|
+
if die >= 4
|
|
142
|
+
Result.success(translate('MorkBorg.surrender'))
|
|
143
|
+
else
|
|
144
|
+
Result.success(translate('MorkBorg.flee'))
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
result.text = "(#{command}) > #{dice_total}#{with_symbol(num_status)} > #{total} > #{die}#{result.text}"
|
|
148
|
+
|
|
149
|
+
return result
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# 各種表
|
|
153
|
+
|
|
154
|
+
class << self
|
|
155
|
+
private
|
|
156
|
+
|
|
157
|
+
def translate_tables(locale)
|
|
158
|
+
{
|
|
159
|
+
'ERT' => DiceTable::Table.from_i18n('MorkBorg.ERT', locale),
|
|
160
|
+
'BRO' => DiceTable::Table.from_i18n('MorkBorg.BRO', locale),
|
|
161
|
+
}
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
TABLES = translate_tables(:ja_jp).freeze
|
|
166
|
+
|
|
167
|
+
register_prefix('([+-]?\d+)?DR[\d]+', '([+-]?\d+)?INS', '([+-]?\d+)?MOR', TABLES.keys)
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bcdice/game_system/MorkBorg'
|
|
4
|
+
|
|
5
|
+
module BCDice
|
|
6
|
+
module GameSystem
|
|
7
|
+
class MorkBorg_Korean < MorkBorg
|
|
8
|
+
# ゲームシステムの識別子
|
|
9
|
+
ID = 'MorkBorg:Korean'
|
|
10
|
+
|
|
11
|
+
# ゲームシステム名
|
|
12
|
+
NAME = '모크 보그(MÖRK BORG)'
|
|
13
|
+
|
|
14
|
+
# ゲームシステム名の読みがな
|
|
15
|
+
SORT_KEY = '国際化:Korean:모크 보그(MÖRK BORG)'
|
|
16
|
+
|
|
17
|
+
# ダイスボットの使い方
|
|
18
|
+
HELP_MESSAGE = <<~INFO_MESSAGETEXT
|
|
19
|
+
■판정 sDRt s: 능력치(생략 시:0) t:목표값
|
|
20
|
+
|
|
21
|
+
예)+3DR12: 능력치+3, DR12로 1d20을 굴려서 결과 표시(크리티컬·펌블도 표시)
|
|
22
|
+
|
|
23
|
+
■이니셔티브 sINS s: 능력치(생략 시:0. 개별 이니셔티브를 사용하는 경우)
|
|
24
|
+
|
|
25
|
+
예)INS: 1d6을 굴려서 이니셔티브 결과 표시(PC 선공을 성공으로 표시)
|
|
26
|
+
|
|
27
|
+
■모럴 sMORt s: 능력치(생략 시:0) t:상대 크리처의 모럴 값
|
|
28
|
+
|
|
29
|
+
예)MOR8: 2d6을 굴려서 모럴 판정 결과 표시(모럴 붕괴를 성공으로 표시)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
■각종 표
|
|
33
|
+
|
|
34
|
+
・조우 반응표 Reaction (ERT)
|
|
35
|
+
・파손(빈사표) Broken (BRO)
|
|
36
|
+
|
|
37
|
+
INFO_MESSAGETEXT
|
|
38
|
+
|
|
39
|
+
def initialize(command)
|
|
40
|
+
super(command)
|
|
41
|
+
@locale = :ko_kr
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
TABLES = translate_tables(:ko_kr).freeze
|
|
45
|
+
|
|
46
|
+
register_prefix_from_super_class()
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BCDice
|
|
4
|
+
module GameSystem
|
|
5
|
+
class NanimonaiMura < Base
|
|
6
|
+
# ゲームシステムの識別子
|
|
7
|
+
ID = "NanimonaiMura"
|
|
8
|
+
|
|
9
|
+
# ゲームシステム名
|
|
10
|
+
NAME = "なにもない村"
|
|
11
|
+
|
|
12
|
+
# ゲームシステム名の読みがな
|
|
13
|
+
SORT_KEY = "なにもないむら"
|
|
14
|
+
|
|
15
|
+
# ダイスボットの使い方
|
|
16
|
+
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
|
17
|
+
・行為判定 xNMy
|
|
18
|
+
x個のD10を振り、2つの出目から達成値を作成して判定します。
|
|
19
|
+
達成値は成功度が最も高くなる組み合わせを自動選択し、同値なら低い値を優先します。
|
|
20
|
+
x: ダイス数(1以上)
|
|
21
|
+
y: 判定値(0以上)
|
|
22
|
+
例)4NM55 6NM199 2NM35
|
|
23
|
+
INFO_MESSAGE_TEXT
|
|
24
|
+
|
|
25
|
+
register_prefix('\d+NM\d+')
|
|
26
|
+
|
|
27
|
+
ResultData = Struct.new(:score, :success, :critical, :result_text, :success_level)
|
|
28
|
+
|
|
29
|
+
STAGE_NAMES = ['ノーマル', 'エピック', 'レジェンダリ', 'ミシック'].freeze
|
|
30
|
+
BASE_SUCCESS_LEVELS = [1, 11, 21, 31].freeze
|
|
31
|
+
|
|
32
|
+
def eval_game_system_specific_command(command)
|
|
33
|
+
roll_action(command)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def roll_action(command)
|
|
39
|
+
m = /\A(\d+)NM(\d+)\z/.match(command)
|
|
40
|
+
return nil unless m
|
|
41
|
+
|
|
42
|
+
dice_count = m[1].to_i
|
|
43
|
+
target = m[2].to_i
|
|
44
|
+
return nil if dice_count < 1
|
|
45
|
+
|
|
46
|
+
dice_list = @randomizer.roll_barabara(dice_count, 10).map { |value| normalize_d10(value) }
|
|
47
|
+
result = select_best_result(dice_list, target)
|
|
48
|
+
|
|
49
|
+
Result.new.tap do |r|
|
|
50
|
+
r.text = "#{command} (#{dice_count}D10) > [#{dice_list.join(',')}] > #{result.score} > #{result.result_text} > 成功度#{result.success_level}"
|
|
51
|
+
r.condition = result.success
|
|
52
|
+
r.critical = result.critical
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def normalize_d10(value)
|
|
57
|
+
value == 10 ? 0 : value
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def select_best_result(dice_list, target)
|
|
61
|
+
candidates =
|
|
62
|
+
if dice_list.size == 1
|
|
63
|
+
[build_result(dice_list.first * 10, target)]
|
|
64
|
+
else
|
|
65
|
+
[].tap do |results|
|
|
66
|
+
dice_list.each_index do |i|
|
|
67
|
+
dice_list.each_index do |j|
|
|
68
|
+
next if i == j
|
|
69
|
+
|
|
70
|
+
results << build_result(dice_list[i] * 10 + dice_list[j], target)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
best_result = candidates.first
|
|
77
|
+
|
|
78
|
+
candidates.drop(1).each do |candidate|
|
|
79
|
+
next if candidate.success_level < best_result.success_level
|
|
80
|
+
next if candidate.success_level == best_result.success_level && candidate.score > best_result.score
|
|
81
|
+
|
|
82
|
+
best_result = candidate
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
best_result
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def build_result(score, target)
|
|
89
|
+
if score > target
|
|
90
|
+
return ResultData.new(score, false, false, "失敗", 0)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
diff = target - score
|
|
94
|
+
stage_index = [diff.div(100), STAGE_NAMES.size - 1].min
|
|
95
|
+
critical_bonus = zoro_bonus(score)
|
|
96
|
+
critical = !critical_bonus.nil?
|
|
97
|
+
success_level = BASE_SUCCESS_LEVELS[stage_index] + (critical_bonus || 0)
|
|
98
|
+
result_text = "#{STAGE_NAMES[stage_index]}#{critical ? '大成功' : '成功'}"
|
|
99
|
+
|
|
100
|
+
ResultData.new(score, true, critical, result_text, success_level)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def zoro_bonus(score)
|
|
104
|
+
tens = score.div(10)
|
|
105
|
+
ones = score % 10
|
|
106
|
+
return nil unless tens == ones
|
|
107
|
+
|
|
108
|
+
ones
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|