bcdice 3.1.0 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +78 -1
- data/README.md +1 -1
- data/i18n/MagicaLogia/zh_hans.yml +564 -0
- data/i18n/StellarKnights/ja_jp.yml +498 -0
- data/i18n/StellarKnights/ko_kr.yml +498 -0
- data/i18n/zh_hans.yml +7 -0
- data/lib/bcdice/command/parsed.rb +11 -3
- data/lib/bcdice/command/parser.rb +179 -100
- data/lib/bcdice/common_command/add_dice.rb +1 -1
- data/lib/bcdice/common_command/barabara_dice/node.rb +2 -2
- data/lib/bcdice/common_command/barabara_dice/result.rb +6 -0
- data/lib/bcdice/common_command/calc.rb +1 -1
- data/lib/bcdice/dice_table.rb +2 -0
- data/lib/bcdice/dice_table/d66_half_grid_table.rb +33 -0
- data/lib/bcdice/dice_table/d66_one_third_table.rb +34 -0
- data/lib/bcdice/dice_table/sai_fic_skill_table.rb +1 -1
- data/lib/bcdice/game_system.rb +6 -0
- data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
- data/lib/bcdice/game_system/Ainecadette.rb +68 -0
- data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
- data/lib/bcdice/game_system/Alsetto.rb +1 -1
- data/lib/bcdice/game_system/AlterRaise.rb +2 -2
- data/lib/bcdice/game_system/Amadeus.rb +110 -93
- data/lib/bcdice/game_system/AngelGear.rb +2 -2
- data/lib/bcdice/game_system/AnimaAnimus.rb +16 -9
- data/lib/bcdice/game_system/Arianrhod.rb +6 -8
- data/lib/bcdice/game_system/Avandner.rb +1 -1
- data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
- data/lib/bcdice/game_system/BattleTech.rb +109 -28
- data/lib/bcdice/game_system/BeastBindTrinity.rb +28 -12
- data/lib/bcdice/game_system/BeginningIdol.rb +5 -5
- data/lib/bcdice/game_system/BeginningIdol_Korean.rb +5 -5
- data/lib/bcdice/game_system/BladeOfArcana.rb +1 -1
- data/lib/bcdice/game_system/BlindMythos.rb +39 -38
- data/lib/bcdice/game_system/BloodCrusade.rb +6 -7
- data/lib/bcdice/game_system/BloodMoon.rb +9 -8
- data/lib/bcdice/game_system/CardRanker.rb +8 -7
- data/lib/bcdice/game_system/ChaosFlare.rb +21 -15
- data/lib/bcdice/game_system/Chill.rb +10 -10
- data/lib/bcdice/game_system/Chill3.rb +9 -9
- data/lib/bcdice/game_system/CodeLayerd.rb +39 -39
- data/lib/bcdice/game_system/ColossalHunter.rb +34 -47
- data/lib/bcdice/game_system/CrashWorld.rb +1 -1
- data/lib/bcdice/game_system/Cthulhu.rb +1 -1
- data/lib/bcdice/game_system/Cthulhu7th.rb +48 -10
- data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +2 -2
- data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +2 -2
- data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +1 -1
- data/lib/bcdice/game_system/Cthulhu_Korean.rb +1 -1
- data/lib/bcdice/game_system/DarkBlaze.rb +0 -11
- data/lib/bcdice/game_system/DarkDaysDrive.rb +8 -7
- data/lib/bcdice/game_system/DeadlineHeroes.rb +11 -10
- data/lib/bcdice/game_system/DemonParasite.rb +5 -13
- data/lib/bcdice/game_system/DesperateRun.rb +1 -1
- data/lib/bcdice/game_system/DoubleCross.rb +3 -1
- data/lib/bcdice/game_system/Dracurouge.rb +1 -1
- data/lib/bcdice/game_system/EclipsePhase.rb +14 -14
- data/lib/bcdice/game_system/Elric.rb +18 -14
- data/lib/bcdice/game_system/Elysion.rb +1 -1
- data/lib/bcdice/game_system/EmbryoMachine.rb +9 -8
- data/lib/bcdice/game_system/Emoklore.rb +25 -20
- data/lib/bcdice/game_system/Fiasco.rb +1 -1
- data/lib/bcdice/game_system/FilledWith.rb +205 -1272
- data/lib/bcdice/game_system/FutariSousa.rb +12 -10
- data/lib/bcdice/game_system/GURPS.rb +17 -28
- data/lib/bcdice/game_system/Garako.rb +1 -1
- data/lib/bcdice/game_system/GardenOrder.rb +12 -7
- data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
- data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
- data/lib/bcdice/game_system/Gorilla.rb +2 -8
- data/lib/bcdice/game_system/GranCrest.rb +18 -11
- data/lib/bcdice/game_system/Gundog.rb +9 -8
- data/lib/bcdice/game_system/GundogRevised.rb +10 -9
- data/lib/bcdice/game_system/GundogZero.rb +1 -1
- data/lib/bcdice/game_system/GurpsFW.rb +16 -16
- data/lib/bcdice/game_system/HarnMaster.rb +19 -26
- data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
- data/lib/bcdice/game_system/Hieizan.rb +12 -21
- data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
- data/lib/bcdice/game_system/HuntersMoon.rb +5 -10
- data/lib/bcdice/game_system/InfiniteFantasia.rb +19 -17
- data/lib/bcdice/game_system/Insane.rb +13 -20
- data/lib/bcdice/game_system/IthaWenUa.rb +8 -15
- data/lib/bcdice/game_system/JamesBond.rb +10 -10
- data/lib/bcdice/game_system/JekyllAndHyde.rb +1 -1
- data/lib/bcdice/game_system/Kamigakari.rb +1 -1
- data/lib/bcdice/game_system/KanColle.rb +4 -9
- data/lib/bcdice/game_system/KemonoNoMori.rb +26 -39
- data/lib/bcdice/game_system/KillDeathBusiness.rb +7 -15
- data/lib/bcdice/game_system/KurayamiCrying.rb +141 -2
- data/lib/bcdice/game_system/LiveraDoll.rb +254 -304
- data/lib/bcdice/game_system/LogHorizon.rb +13 -10
- data/lib/bcdice/game_system/MagicaLogia_SimplifiedChinese.rb +66 -0
- data/lib/bcdice/game_system/MeikyuDays.rb +10 -8
- data/lib/bcdice/game_system/MeikyuKingdom.rb +26 -26
- data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +5 -4
- data/lib/bcdice/game_system/MetalHead.rb +12 -22
- data/lib/bcdice/game_system/MetalHeadExtream.rb +5 -5
- data/lib/bcdice/game_system/MonotoneMuseum.rb +8 -6
- data/lib/bcdice/game_system/Nechronica.rb +63 -90
- data/lib/bcdice/game_system/NinjaSlayer.rb +6 -7
- data/lib/bcdice/game_system/NjslyrBattle.rb +8 -11
- data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
- data/lib/bcdice/game_system/Paradiso.rb +3 -3
- data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
- data/lib/bcdice/game_system/Peekaboo.rb +4 -9
- data/lib/bcdice/game_system/Pendragon.rb +7 -7
- data/lib/bcdice/game_system/PhantasmAdventure.rb +8 -8
- data/lib/bcdice/game_system/Postman.rb +1 -1
- data/lib/bcdice/game_system/PulpCthulhu.rb +1 -1
- data/lib/bcdice/game_system/Raisondetre.rb +2 -2
- data/lib/bcdice/game_system/Revulture.rb +123 -0
- data/lib/bcdice/game_system/RuneQuest.rb +8 -8
- data/lib/bcdice/game_system/Ryutama.rb +1 -1
- data/lib/bcdice/game_system/SRS.rb +17 -16
- data/lib/bcdice/game_system/SamsaraBallad.rb +38 -11
- data/lib/bcdice/game_system/Satasupe.rb +32 -32
- data/lib/bcdice/game_system/ScreamHighSchool.rb +5 -5
- data/lib/bcdice/game_system/SharedFantasia.rb +19 -23
- data/lib/bcdice/game_system/ShinobiGami.rb +14 -6
- data/lib/bcdice/game_system/Skynauts.rb +103 -142
- data/lib/bcdice/game_system/SkynautsBouken.rb +228 -0
- data/lib/bcdice/game_system/StarryDolls.rb +318 -0
- data/lib/bcdice/game_system/SteamPunkers.rb +11 -6
- data/lib/bcdice/game_system/StellarKnights.rb +85 -706
- data/lib/bcdice/game_system/StellarKnights_Korean.rb +79 -0
- data/lib/bcdice/game_system/SterileLife.rb +2 -3
- data/lib/bcdice/game_system/StrangerOfSwordCity.rb +1 -1
- data/lib/bcdice/game_system/StratoShout.rb +8 -16
- data/lib/bcdice/game_system/Strave.rb +1 -1
- data/lib/bcdice/game_system/SwordWorld.rb +16 -7
- data/lib/bcdice/game_system/SwordWorld2_0.rb +2 -2
- data/lib/bcdice/game_system/SwordWorld2_5.rb +2 -2
- data/lib/bcdice/game_system/TherapieSein.rb +1 -1
- data/lib/bcdice/game_system/TokumeiTenkousei.rb +4 -3
- data/lib/bcdice/game_system/TokyoGhostResearch.rb +1 -1
- data/lib/bcdice/game_system/TrinitySeven.rb +279 -280
- data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
- data/lib/bcdice/game_system/Utakaze.rb +53 -48
- data/lib/bcdice/game_system/Villaciel.rb +1 -1
- data/lib/bcdice/game_system/WARPS.rb +11 -9
- data/lib/bcdice/game_system/WaresBlade.rb +4 -9
- data/lib/bcdice/game_system/Warhammer.rb +15 -6
- data/lib/bcdice/game_system/Warhammer4.rb +15 -11
- data/lib/bcdice/game_system/WitchQuest.rb +1 -1
- data/lib/bcdice/game_system/YankeeYogSothoth.rb +4 -9
- data/lib/bcdice/game_system/Yggdrasill.rb +1 -1
- data/lib/bcdice/game_system/ZettaiReido.rb +20 -25
- data/lib/bcdice/game_system/filled_with/enemy_data_tables.rb +322 -0
- data/lib/bcdice/game_system/filled_with/event_tables.rb +392 -0
- data/lib/bcdice/game_system/filled_with/tresure_tables.rb +179 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +1 -1
- data/lib/bcdice/game_system/sword_world/rating_parsed.rb +4 -4
- data/lib/bcdice/game_system/sword_world/rating_parser.rb +1 -1
- data/lib/bcdice/game_system/sword_world/transcendent_test.rb +26 -8
- data/lib/bcdice/repl.rb +1 -1
- data/lib/bcdice/result.rb +26 -0
- data/lib/bcdice/version.rb +1 -1
- metadata +18 -4
@@ -0,0 +1,228 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class SkynautsBouken < Base
|
6
|
+
# ゲームシステムの識別子
|
7
|
+
ID = 'SkynautsBouken'
|
8
|
+
|
9
|
+
# ゲームシステム名
|
10
|
+
NAME = '歯車の塔の探空士(冒険企画局)'
|
11
|
+
|
12
|
+
# ゲームシステム名の読みがな
|
13
|
+
SORT_KEY = 'はくるまのとうのすかいのおつ2'
|
14
|
+
|
15
|
+
# ダイスボットの使い方
|
16
|
+
HELP_MESSAGE = <<~MESSAGETEXT
|
17
|
+
・行為判定(nSNt#f) n:ダイス数(省略時2)、t:目標値(省略時7)、f:ファンブル値(省略時1)
|
18
|
+
例)SN6#2 3SN
|
19
|
+
・ダメージチェック (Dx/y@m) x:ダメージ範囲、y:攻撃回数
|
20
|
+
m:《弾道学》(省略可)上:8、下:2、左:4、右:6
|
21
|
+
例) D/4 D19/2 D/3@8 D[大揺れ]/2
|
22
|
+
・回避(AVO@mダメージ)
|
23
|
+
m:回避方向(上:8、下:2、左:4、右:6)、ダメージ:ダメージチェック結果
|
24
|
+
例)AVO@8[1,4],[2,6],[3,8] AVO@2[6,4],[2,6]
|
25
|
+
・FT ファンブル表(p76)
|
26
|
+
・NV 航行表
|
27
|
+
|
28
|
+
■ 判定セット
|
29
|
+
・《回避運動》判定+回避(nSNt#f/AVO@ダメージ)
|
30
|
+
nSNt#f → 成功なら AVO@m
|
31
|
+
例)SN/AVO@8[1,4],[2,6],[3,8] 3SN#2/AVO@2[6,4],[2,6]
|
32
|
+
・砲撃判定+ダメージチェック (nSNt#f/Dx/y@m)
|
33
|
+
行為判定の出目変更タイミングを逃すので要GMの許可
|
34
|
+
nSNt#f → 成功なら Dx/y@m
|
35
|
+
例)SN/D/4 3SN#2/D[大揺れ]/2
|
36
|
+
MESSAGETEXT
|
37
|
+
|
38
|
+
TABLES = {
|
39
|
+
'FT' => DiceTable::Table.new(
|
40
|
+
'ファンブル表',
|
41
|
+
'1D6', [
|
42
|
+
"なんとか大事にはいたらなかった。通常の失敗と同様の処理を行うこと。",
|
43
|
+
"転んでしまった。キミは[転倒](p107)する。",
|
44
|
+
"失敗にイライラしてしまった。キミは獲得している【キズナ】1つの「支援チェック」にチェックを入れる。",
|
45
|
+
"自身のいるマスを[破損](p104)させる。この[破損]によって、キミの【生命点】は減少しない。",
|
46
|
+
"頭をぶつけてしまった。キミの【生命点】を「1d6点」減少する。",
|
47
|
+
"奇跡的な結果。 この行為判定は成功となる。",
|
48
|
+
]
|
49
|
+
),
|
50
|
+
'NV' => DiceTable::Table.new(
|
51
|
+
'航海表',
|
52
|
+
'1d6',
|
53
|
+
[
|
54
|
+
'スポット1つ分進む',
|
55
|
+
'スポット1つ分進む',
|
56
|
+
'スポット1つ分進む',
|
57
|
+
'スポット2つ分進む',
|
58
|
+
'スポット2つ分進む',
|
59
|
+
'スポット3つ分進む',
|
60
|
+
]
|
61
|
+
)
|
62
|
+
}.freeze
|
63
|
+
|
64
|
+
register_prefix('D', '\d?SN', 'NV', 'FT', 'AVO')
|
65
|
+
|
66
|
+
def initialize(command)
|
67
|
+
super(command)
|
68
|
+
@round_type = RoundType::FLOOR # 端数切り捨て
|
69
|
+
end
|
70
|
+
|
71
|
+
def eval_game_system_specific_command(command)
|
72
|
+
command_sn(command) || command_d(command) || command_avo(command) || command_snavo(command) ||
|
73
|
+
command_snd(command) || roll_tables(command, TABLES)
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
DIRECTION_INFOS = {
|
79
|
+
0 => {name: "", position_diff: [0, 0]},
|
80
|
+
1 => {name: "左下", position_diff: [-1, +1]},
|
81
|
+
2 => {name: "下", position_diff: [0, +1]},
|
82
|
+
3 => {name: "右下", position_diff: [+1, +1]},
|
83
|
+
4 => {name: "左", position_diff: [-1, 0]},
|
84
|
+
5 => {name: "", position_diff: [0, 0]},
|
85
|
+
6 => {name: "右", position_diff: [+1, 0]},
|
86
|
+
7 => {name: "左上", position_diff: [-1, -1]},
|
87
|
+
8 => {name: "上", position_diff: [0, -1]},
|
88
|
+
9 => {name: "右上", position_diff: [+1, -1]},
|
89
|
+
}.freeze
|
90
|
+
|
91
|
+
D_REGEXP = %r{^D([1-46-9]{0,8})(\[.+\]|S|F|SF|FS)?/(\d{1,2})(@([2468]))?$}.freeze
|
92
|
+
|
93
|
+
def command_sn(command)
|
94
|
+
debug("SN", command)
|
95
|
+
cmd = Command::Parser.new(/[1-9]?SN(\d{0,2})/, round_type: round_type)
|
96
|
+
.restrict_cmp_op_to(nil)
|
97
|
+
.enable_fumble.parse(command)
|
98
|
+
return nil unless cmd
|
99
|
+
|
100
|
+
# [dice_count]SN[target]
|
101
|
+
dice_count, target = cmd.command.split("SN", 2).map(&:to_i)
|
102
|
+
dice_count = 2 if dice_count == 0
|
103
|
+
target = 7 if target == 0
|
104
|
+
fumble = cmd.fumble.nil? ? 1 : cmd.fumble
|
105
|
+
|
106
|
+
debug("SN Parsed", dice_count, target, fumble)
|
107
|
+
|
108
|
+
dice_list = @randomizer.roll_barabara(dice_count, 6)
|
109
|
+
dice_top_two = dice_list.sort[-2..-1]
|
110
|
+
res = if dice_top_two == [6, 6]
|
111
|
+
Result.critical("スペシャル(【生命点】1d6回復)")
|
112
|
+
elsif dice_list.max <= fumble
|
113
|
+
Result.fumble("ファンブル(ファンブル表FT)")
|
114
|
+
elsif dice_top_two.sum >= target
|
115
|
+
Result.success("成功")
|
116
|
+
else
|
117
|
+
Result.failure("失敗")
|
118
|
+
end
|
119
|
+
|
120
|
+
if dice_count == 2
|
121
|
+
res.text = ["(#{dice_count}SN#{target}##{fumble})", "#{dice_top_two.sum}[#{dice_list.join(',')}]", res.text]
|
122
|
+
.compact.join(" > ")
|
123
|
+
else
|
124
|
+
res.text = ["(#{dice_count}SN#{target}##{fumble})", "[" + dice_list.join(",") + "]", "#{dice_top_two.sum}[#{dice_top_two.join(',')}]", res.text]
|
125
|
+
.compact.join(" > ")
|
126
|
+
end
|
127
|
+
res
|
128
|
+
end
|
129
|
+
|
130
|
+
def command_d(command)
|
131
|
+
m = D_REGEXP.match(command)
|
132
|
+
return nil unless m
|
133
|
+
|
134
|
+
fire_count = m[3].to_i # 砲撃回数
|
135
|
+
fire_range = m[1].to_s # 砲撃範囲
|
136
|
+
ballistics = m[5].to_i # 《弾道学》
|
137
|
+
|
138
|
+
points = get_fire_points(fire_count, fire_range)
|
139
|
+
command = command.sub("SF/", "[大揺れ,火災]/").sub("FS/", "[火災,大揺れ]/").sub("F/", "[火災]/").sub("S/", "[大揺れ]/")
|
140
|
+
result = ["(#{command})", get_points_text(points, 0, 0)]
|
141
|
+
if ballistics != 0
|
142
|
+
dir = DIRECTION_INFOS[ballistics]
|
143
|
+
diff_x, diff_y = dir[:position_diff]
|
144
|
+
result[-1] += "\n"
|
145
|
+
result << "《弾道学》#{dir[:name]}"
|
146
|
+
result << get_points_text(points, diff_x, diff_y)
|
147
|
+
end
|
148
|
+
|
149
|
+
result.compact.join(" > ")
|
150
|
+
end
|
151
|
+
|
152
|
+
def command_avo(command)
|
153
|
+
debug("AVO", command)
|
154
|
+
dmg = command.match(/^AVO@([2468])(.*?)$/)
|
155
|
+
return nil unless dmg
|
156
|
+
|
157
|
+
dir = DIRECTION_INFOS[dmg[1].to_i]
|
158
|
+
diff_x, diff_y = dir[:position_diff]
|
159
|
+
"《回避運動》#{dir[:name]} > " + dmg[2].gsub(/\(?\[(\d),(\d{1,2})\]\)?/) do
|
160
|
+
y = Regexp.last_match(1).to_i + diff_y
|
161
|
+
x = Regexp.last_match(2).to_i + diff_x
|
162
|
+
get_xy_text(x, y)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def command_snavo(command)
|
167
|
+
sn, avo = command.split(%r{/?AVO}, 2)
|
168
|
+
debug("SNAVO", sn, avo)
|
169
|
+
am = /^@([2468])(.*?)$/.match(avo)
|
170
|
+
return nil unless am
|
171
|
+
|
172
|
+
res = command_sn(sn)
|
173
|
+
return nil unless res
|
174
|
+
|
175
|
+
if res.success?
|
176
|
+
res.text += "\n > " + command_avo("AVO" + avo)
|
177
|
+
end
|
178
|
+
res
|
179
|
+
end
|
180
|
+
|
181
|
+
def command_snd(command)
|
182
|
+
sn, d = command.split(%r{/?D}, 2)
|
183
|
+
debug("SND", sn, d)
|
184
|
+
m = D_REGEXP.match("D#{d}")
|
185
|
+
return nil unless m
|
186
|
+
|
187
|
+
res = command_sn(sn)
|
188
|
+
return nil unless res
|
189
|
+
|
190
|
+
if res.success?
|
191
|
+
res.text += "\n > #{command_d('D' + d)}"
|
192
|
+
end
|
193
|
+
res
|
194
|
+
end
|
195
|
+
|
196
|
+
def get_points_text(points, diff_x, diff_y)
|
197
|
+
"[縦,横]=" + points.map do |list|
|
198
|
+
list.map do |x, y|
|
199
|
+
get_xy_text(x + diff_x, y + diff_y)
|
200
|
+
end.join()
|
201
|
+
end.join(",")
|
202
|
+
end
|
203
|
+
|
204
|
+
# 範囲内なら[y,x]、範囲外なら([y,x])と表示
|
205
|
+
def get_xy_text(x, y)
|
206
|
+
if (2..12).include?(x) && (1..6).include?(y)
|
207
|
+
"[#{y},#{x}]"
|
208
|
+
else
|
209
|
+
"([#{y},#{x}])"
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
# 命中場所と範囲から、ダメージ位置を割り出す
|
214
|
+
def get_fire_points(fire_count, fire_range)
|
215
|
+
range = fire_range.chars.map(&:to_i)
|
216
|
+
fire_count.times.map do
|
217
|
+
y = @randomizer.roll_once(6) # 縦
|
218
|
+
x = @randomizer.roll_sum(2, 6) # 横
|
219
|
+
|
220
|
+
[[x, y]] + range.map do |r|
|
221
|
+
xdiff, ydiff = DIRECTION_INFOS[r][:position_diff]
|
222
|
+
[x + xdiff, y + ydiff]
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
@@ -0,0 +1,318 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bcdice/dice_table/chain_table"
|
4
|
+
require "bcdice/dice_table/sai_fic_skill_table"
|
5
|
+
require "bcdice/dice_table/table"
|
6
|
+
require "bcdice/format"
|
7
|
+
|
8
|
+
module BCDice
|
9
|
+
module GameSystem
|
10
|
+
class StarryDolls < Base
|
11
|
+
# ゲームシステムの識別子
|
12
|
+
ID = "StarryDolls"
|
13
|
+
|
14
|
+
# ゲームシステム名
|
15
|
+
NAME = "スタリィドール"
|
16
|
+
|
17
|
+
# ゲームシステム名の読みがな
|
18
|
+
SORT_KEY = "すたりいとおる"
|
19
|
+
|
20
|
+
# ダイスボットの使い方
|
21
|
+
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
22
|
+
・行為判定 nD6±m@s>=t
|
23
|
+
nD6の行為判定を行う。スペシャル/ファンブル/成功/失敗を判定。
|
24
|
+
n: ダイス数
|
25
|
+
m: 修正(省略可)
|
26
|
+
s: スペシャル値(省略時 12)
|
27
|
+
t: 目標値(?指定可)
|
28
|
+
・各種表
|
29
|
+
・ランダム特技決定表 RTTn (n:分野番号、省略可能)
|
30
|
+
1願望 2元素 3星使い 4動作 5召喚 6人間性
|
31
|
+
・ランダム分野表 RCT
|
32
|
+
・ランダム星座表 HOR
|
33
|
+
ランダム星座表A HORA/ランダム星座表B HORB
|
34
|
+
・主人関係表 MRT/関係属性表 RAT
|
35
|
+
・奇跡表 MIR
|
36
|
+
・戦果表 BRT
|
37
|
+
・事件表 TRO
|
38
|
+
・遭遇表 ENC
|
39
|
+
・致命傷表 FWT
|
40
|
+
・カタストロフ表 CAT
|
41
|
+
・回想表
|
42
|
+
〈魔術師の庭〉回想表 JDSRT/〈セブンス・ヘブン〉回想表 SHRT
|
43
|
+
/〈祝福の鐘〉回想表 BCRT/〈オメガ探偵社〉回想表 ODRT
|
44
|
+
・D66ダイスあり
|
45
|
+
INFO_MESSAGE_TEXT
|
46
|
+
|
47
|
+
def initialize(command)
|
48
|
+
super(command)
|
49
|
+
|
50
|
+
@d66_sort_type = D66SortType::ASC
|
51
|
+
end
|
52
|
+
|
53
|
+
def eval_game_system_specific_command(command)
|
54
|
+
action_roll(command) ||
|
55
|
+
roll_tables(command, TABLES) ||
|
56
|
+
RTT.roll_command(@randomizer, command)
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
SPECIAL = "スペシャル(【星命力】を1D6点回復)"
|
62
|
+
FUMBLE = "ファンブル(ランダムなサインが【蝕】状態へ変化)"
|
63
|
+
|
64
|
+
RTT = DiceTable::SaiFicSkillTable.new(
|
65
|
+
[
|
66
|
+
["願望", ["創造", "研究", "守護", "絆", "*かに座", "夢", "*しし座", "自由", "恋愛", "脚光", "世界"]],
|
67
|
+
["元素", ["光", "雷", "*ふたご座", "水", "火", "風", "木", "氷", "*おとめ座", "土", "闇"]],
|
68
|
+
["星使い", ["*おうし座", "幸運", "幻影", "テレパシー", "予知夢", "星読み", "治癒", "天候", "変身", "時間停止", "*てんびん座"]],
|
69
|
+
["動作", ["*おひつじ座", "精密", "高速", "怪力", "隠密", "飛行", "言霊", "模倣", "軽業", "歌舞", "*さそり座"]],
|
70
|
+
["召喚", ["リボン", "照明具", "*うお座", "料理", "獣", "花", "乗り物", "書物", "*いて座", "武器", "財宝"]],
|
71
|
+
["人間性", ["勇気", "知恵", "熱意", "調和", "*みずがめ座", "愛情", "*やぎ座", "センス", "根気", "礼節", "理性"]],
|
72
|
+
]
|
73
|
+
)
|
74
|
+
|
75
|
+
def action_roll(command)
|
76
|
+
parser = Command::Parser.new("D6", round_type: round_type)
|
77
|
+
.has_prefix_number
|
78
|
+
.restrict_cmp_op_to(:>=)
|
79
|
+
.enable_critical
|
80
|
+
.enable_question_target
|
81
|
+
cmd = parser.parse(command)
|
82
|
+
return nil unless cmd
|
83
|
+
|
84
|
+
times = cmd.prefix_number
|
85
|
+
return nil if times < 1
|
86
|
+
|
87
|
+
fumble = 2
|
88
|
+
special = cmd.critical || 12
|
89
|
+
|
90
|
+
if special <= fumble
|
91
|
+
special = fumble + 1 # p.180
|
92
|
+
cmd.critical = special
|
93
|
+
end
|
94
|
+
|
95
|
+
dice_list = @randomizer.roll_barabara(times, 6)
|
96
|
+
dice_total = dice_list.sum()
|
97
|
+
total = dice_total + cmd.modify_number
|
98
|
+
|
99
|
+
result =
|
100
|
+
if dice_total <= fumble
|
101
|
+
Result.fumble(FUMBLE)
|
102
|
+
elsif dice_total >= special
|
103
|
+
Result.critical(SPECIAL)
|
104
|
+
elsif cmd.question_target?
|
105
|
+
Result.new
|
106
|
+
elsif total >= cmd.target_number
|
107
|
+
Result.success("成功")
|
108
|
+
else
|
109
|
+
Result.failure("失敗")
|
110
|
+
end
|
111
|
+
|
112
|
+
sequence = [
|
113
|
+
"(#{cmd.to_s(:after_modify_number)})",
|
114
|
+
"#{dice_total}[#{dice_list.join(',')}]#{Format.modifier(cmd.modify_number)}",
|
115
|
+
total,
|
116
|
+
result.text
|
117
|
+
].compact
|
118
|
+
|
119
|
+
result.text = sequence.join(" > ")
|
120
|
+
result
|
121
|
+
end
|
122
|
+
|
123
|
+
HOR_TABLE_A = DiceTable::Table.new(
|
124
|
+
"ランダム星座表A", # p.177
|
125
|
+
"1D6",
|
126
|
+
[
|
127
|
+
"おひつじ座",
|
128
|
+
"おうし座",
|
129
|
+
"ふたご座",
|
130
|
+
"かに座",
|
131
|
+
"しし座",
|
132
|
+
"おとめ座",
|
133
|
+
]
|
134
|
+
)
|
135
|
+
|
136
|
+
HOR_TABLE_B = DiceTable::Table.new(
|
137
|
+
"ランダム星座表B", # p.177
|
138
|
+
"1D6",
|
139
|
+
[
|
140
|
+
"てんびん座",
|
141
|
+
"さそり座",
|
142
|
+
"いて座",
|
143
|
+
"やぎ座",
|
144
|
+
"みずがめ座",
|
145
|
+
"うお座",
|
146
|
+
]
|
147
|
+
)
|
148
|
+
|
149
|
+
TABLES = {
|
150
|
+
"HORA" => HOR_TABLE_A,
|
151
|
+
"HORB" => HOR_TABLE_B,
|
152
|
+
"HOR" => DiceTable::ChainTable.new(
|
153
|
+
"ランダム星座表", # p.177
|
154
|
+
"1D6",
|
155
|
+
[
|
156
|
+
HOR_TABLE_A,
|
157
|
+
HOR_TABLE_A,
|
158
|
+
HOR_TABLE_A,
|
159
|
+
HOR_TABLE_B,
|
160
|
+
HOR_TABLE_B,
|
161
|
+
HOR_TABLE_B,
|
162
|
+
]
|
163
|
+
),
|
164
|
+
"MRT" => DiceTable::Table.new(
|
165
|
+
"主人関係表", # p.186
|
166
|
+
"1D6",
|
167
|
+
[
|
168
|
+
"親",
|
169
|
+
"友人",
|
170
|
+
"恩師",
|
171
|
+
"相棒",
|
172
|
+
"上司",
|
173
|
+
"恋人",
|
174
|
+
]
|
175
|
+
),
|
176
|
+
"RAT" => DiceTable::Table.new(
|
177
|
+
"関係属性表", # p.186
|
178
|
+
"1D6",
|
179
|
+
[
|
180
|
+
"尊敬/優越感",
|
181
|
+
"理解/反抗",
|
182
|
+
"愉快/恐怖",
|
183
|
+
"友情/競争",
|
184
|
+
"恋心/不気味",
|
185
|
+
"庇護/劣等感",
|
186
|
+
]
|
187
|
+
),
|
188
|
+
"MIR" => DiceTable::Table.new(
|
189
|
+
"奇跡表", # p.177
|
190
|
+
"1D6",
|
191
|
+
[
|
192
|
+
"空から降る一筋の光が星人形の体を包み込み、不思議な力を与えてくれる。",
|
193
|
+
"守護星座に関連する人や動物が現れ、星人形に力を貸してくれる。",
|
194
|
+
"運命が不自然なまでに星人形の味方をし、すべてが上手く進んでいく。",
|
195
|
+
"星人形の必要とするものが空中から次々と現れる。",
|
196
|
+
"少しの間だけ〈劇場〉の住人が正気に戻り、一致団結して星人形に協力してくれる。",
|
197
|
+
"体中に星命力が溢れ出し、限界を超えた大規模な星術を扱えるようになる。",
|
198
|
+
]
|
199
|
+
),
|
200
|
+
"BRT" => DiceTable::Table.new(
|
201
|
+
"戦果表", # p.191
|
202
|
+
"1D6",
|
203
|
+
[
|
204
|
+
"所持しているアイテムから一つを選び、同じものをもう一つ獲得する。所持していない場合はもう一度戦果表を使用する。",
|
205
|
+
"時計を獲得する。",
|
206
|
+
"ロザリオを獲得する。",
|
207
|
+
"コンパスを獲得する。",
|
208
|
+
"星の欠片を獲得する。",
|
209
|
+
"自由なアイテムを一つ獲得する。",
|
210
|
+
]
|
211
|
+
),
|
212
|
+
"TRO" => DiceTable::Table.new(
|
213
|
+
"事件表", # p.193
|
214
|
+
"2D6",
|
215
|
+
[
|
216
|
+
"〈変晶体〉を手にした途端、人形兵の軍勢に見つかり追われることに……! なんとかして振り切ろう!",
|
217
|
+
"〈変晶体〉を乗せた物体が空を飛んでいる。接触する方法はないだろうか。",
|
218
|
+
"不気味な商人が現れた。価値あるものを差し出せば、〈変晶体〉と交換してくれるという。上手く交渉しよう。",
|
219
|
+
"〈変晶体〉の影響で理性を失った人々が大喧嘩をしている。これでは浄化するのも困難だ……仲間と協力して仲裁しよう。",
|
220
|
+
"〈変晶体〉は建物の中にあるようだが、警備が厳重だ。どうやって侵入しようか……。",
|
221
|
+
"罪のない人たちが〈変晶体〉を持つ敵に捕らわれているようだ。仲間と共に人々を助け出し、〈変晶体〉を浄化しよう。",
|
222
|
+
"〈変晶体〉に操られた人々がこちらへ敵意の目を向けている。危害は加えたくないが、一体どうすれば……!",
|
223
|
+
"〈変晶体〉に取り憑かれた動物が、仲間に襲いかかった! 早く助け出さなければ!",
|
224
|
+
"仲間が敵にさらわれてしまった! 敵は〈変晶体〉も持っているようだ。追跡して仲間を助けなければ!",
|
225
|
+
"入り組んだ場所に迷い込んでしまった。〈変晶体〉の気配は近いはずだが、どこにあるのだろう?",
|
226
|
+
"〈変晶体〉は深い水の底に沈んでいるようだ。浄化する方法はないだろうか……。",
|
227
|
+
]
|
228
|
+
),
|
229
|
+
"ENC" => DiceTable::Table.new(
|
230
|
+
"遭遇表", # p.193
|
231
|
+
"1D6",
|
232
|
+
[
|
233
|
+
"『弁士』コオロギのパルランテ\n指定特技: 《調和/人間性5》\n効果: プラネタリカードルール非採用時、このセッション中【運命力】を1点上昇させる。\nプラネタリカードルール採用時、ベネフィックを1枚獲得する。",
|
234
|
+
"『航空士』鳩のコロンボ\n指定特技: 《熱意/人間性4》\n効果: コンパスを1つ獲得する。",
|
235
|
+
"『医者』カラスのコルヴォ\n指定特技: 《礼節/人間性11》\n効果: 星の欠片を1つ獲得する。",
|
236
|
+
"『御者』むく犬のメドーラ\n指定特技: 《知恵/人間性3》\n効果: 時計を1つ獲得する。",
|
237
|
+
"『道化』ピエロのアルレッキーノ\n指定特技: 《センス/人間性9》\n効果: 【関係】の使用チェックをすべてはずす。使用チェックがなければ、アルレッキーノに【関係】を獲得する。",
|
238
|
+
"『少女』ヤギのカプレッティーナ\n指定特技: 《愛情/人間性7》\n効果: ロザリオを1つ獲得する。",
|
239
|
+
]
|
240
|
+
),
|
241
|
+
"FWT" => DiceTable::Table.new(
|
242
|
+
"致命傷表", # p.184
|
243
|
+
"1D6",
|
244
|
+
[
|
245
|
+
"敵の攻撃は星人形の瞳を直撃し、宝石は鮮血のごとく砕け散った。PCは形骸化する。",
|
246
|
+
"なんとか致命傷は免れたが、もう戦闘は難しそうだ……。PCは戦闘から脱落する。",
|
247
|
+
"最後の力をふり絞り、星人形は持っていたものを仲間へ投げ渡した。PCは所持しているアイテムを誰かに譲渡したのち戦闘から脱落する。",
|
248
|
+
"星人形は自分の気持ちを誰かに託しながら、地面に倒れ込んだ。仲間のうち誰か一人がPCに対する【関係】を獲得したのち、PCは戦闘から脱落する。",
|
249
|
+
"ただでやられるわけにはいかない……! 星人形は捨て身の攻撃を放つ。PCはエネミー1体に霧装の【耐久値】と同じダメージを与えたのち、戦闘から脱落する。",
|
250
|
+
"こんなところで倒れるわけにはいかない。星人形は【星命力】1点で戦闘に復帰する。再度【星命力】が0になった場合、PCは致命傷表を使用せず戦闘から脱落する。",
|
251
|
+
]
|
252
|
+
),
|
253
|
+
"CAT" => DiceTable::Table.new(
|
254
|
+
"カタストロフ表", # p.198
|
255
|
+
"1D6",
|
256
|
+
[
|
257
|
+
"〈劇場〉全体が大きく揺れ、空間に裂け目が生じる。現実は塗り替えられ……〈変容区〉と化した。最も恐れていた事態に、星人形たちは呆然と立ち尽くすほかなかった。",
|
258
|
+
"激しい地鳴りと共に人形兵たちの増援が押し寄せ、形成が逆転してしまう。星人形たちはやむを得ず〈劇場〉を後にした。",
|
259
|
+
"「時間切れです」戦場に〈悪魔派〉がやってきた。星座の加護は遮られ、星人形の体から力が抜けていく。「いずれまた」という声を最後に星人形の意識は途絶え……現実世界で目を覚ました。",
|
260
|
+
"突如〈型堕ち〉が苦しみ始め、体に残っていた〈悪夢の霧〉を爆発させた。意識を失った星人形たちが目覚めたのは現実世界だった。……まだ再挑戦する時間はあるはずだ。",
|
261
|
+
"〈型堕ち〉は自分を制御できなくなり、〈悪夢の霧〉に呑まれて姿を消してしまった。主を失った〈劇場〉は成長も衰退もしないまま、鏡の中に残り続けることになるだろう。",
|
262
|
+
"〈型堕ち〉の体は膨張する〈悪夢の霧〉の圧力に耐えきれず、宝石を内側から破壊してしまった。〈型堕ち〉に残された命はあとわずかだ。星人形は〈型堕ち〉の最期を看取ることになる。",
|
263
|
+
]
|
264
|
+
),
|
265
|
+
"JDSRT" => DiceTable::Table.new(
|
266
|
+
"〈魔術師の庭〉回想表", # p.187
|
267
|
+
"1D6",
|
268
|
+
[
|
269
|
+
"仕事に必要な道具が不足し、急遽買い出しへ。荷物が重くなりそうだからと、キーNPCも手伝ってくれることになった。",
|
270
|
+
"キーNPCはあなたの仕事に感謝し、プレゼントを贈ってくれた。箱の中身はキーNPCのお気に入りの一品らしい。",
|
271
|
+
"主人はお客さんと話し込んでいる。あなたが部屋の片隅で退屈そうにしていると、キーNPCと目が合った。",
|
272
|
+
"整備作業がひと区切りついたところで、キーNPCがお茶とお菓子を持ってきてくれた。少し休憩しよう。",
|
273
|
+
"整備中、星人形の体に傷が見つかった。どこで付けたのだろう? あなたはキーNPCに聞いてみることにした。",
|
274
|
+
"部屋を移動中、あるものが目に留まる。それはキーNPCにとって思い出深いものであるようだ。",
|
275
|
+
]
|
276
|
+
),
|
277
|
+
"SHRT" => DiceTable::Table.new(
|
278
|
+
"〈セブンス・ヘブン〉回想表", # p.187
|
279
|
+
"1D6",
|
280
|
+
[
|
281
|
+
"掃除をしていたら、お家のものを引っ掛けて壊してしまった! そこへキーNPCがやってきて……。",
|
282
|
+
"キーNPCはちょっとお疲れの様子。あなたはお茶とお菓子を持って労ってあげることにした。",
|
283
|
+
"料理の材料を取りたいのに、棚に手が届かない……。あなたはキーNPCに助けを求めた。",
|
284
|
+
"キーNPCの仕事をお手伝い。こんな体験は初めてだ! あなたはワクワクしながら挑戦する。",
|
285
|
+
"お客さんの星人形に制服を貸し出して、一緒に写真撮影をすることに。照れてるだろうか? それともノリノリ?",
|
286
|
+
"今日はセブンス・ヘブンのファン感謝イベント。会場には、差し入れを持ったキーNPCの姿もあった。",
|
287
|
+
]
|
288
|
+
),
|
289
|
+
"BCRT" => DiceTable::Table.new(
|
290
|
+
"〈祝福の鐘〉回想表", # p.187
|
291
|
+
"1D6",
|
292
|
+
[
|
293
|
+
"終演後のエントランスで挨拶をしていると、キーNPCが誰かと話し込んでいる。ちょっと様子を見に行こう。",
|
294
|
+
"次の公演に向けて衣装合わせ。どんな役をやる? 衣装のフィット具合はどう? 確認していると、キーNPCが様子を見にやってきた。",
|
295
|
+
"基礎練習。地道なルーチンワークの間、スパイスとなるのはキーNPCとのおしゃべりだ。",
|
296
|
+
"学校での公演。終わったあと、子どもたちに囲まれてもみくちゃになる。キーNPCは、子どもが好きだったっけ?",
|
297
|
+
"地方巡業。一緒に移動するキーNPCと、あれこれ話し込んでいると、意外な話題に移っていって……。",
|
298
|
+
"撤収作業も終わりに近づくステージの上。誰もいない客席に向けて、キーNPCが遠い目をしている。",
|
299
|
+
]
|
300
|
+
),
|
301
|
+
"ODRT" => DiceTable::Table.new(
|
302
|
+
"〈オメガ探偵社〉回想表", # p.187
|
303
|
+
"1D6",
|
304
|
+
[
|
305
|
+
"事件調査のため、キーNPCに聞き込み。何か有益な情報は出るだろうか。世間話になってしまうかも?",
|
306
|
+
"依頼もなく平和な探偵事務所へ、キーNPCがやってきた。これが事件の序章に……なるんだろうか?",
|
307
|
+
"みんなで、近所の家のペット探し。キーNPCの見知ったペットらしく、ちょっと心配そうな顔をしている。",
|
308
|
+
"警察の事件調査を手伝うことに。キーNPCは、事件の重要参考人として呼び出されているようだ。",
|
309
|
+
"地道な張り込み調査をしているところへ、キーNPCがやってきた。あなたに差し入れもあるようだ。",
|
310
|
+
"華麗なる事件解決! 主人の推理をたくさん手伝うことができた。キーNPCも、あなたに一目置いてくれそう。",
|
311
|
+
]
|
312
|
+
),
|
313
|
+
}.freeze
|
314
|
+
|
315
|
+
register_prefix('\d+D6', RTT.prefixes, TABLES.keys)
|
316
|
+
end
|
317
|
+
end
|
318
|
+
end
|