bcdice 3.1.0 → 3.3.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 +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
|