bcdice 3.1.3 → 3.5.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 +186 -76
- data/README.md +3 -2
- data/i18n/BeginningIdol/ja_jp.yml +2806 -0
- data/i18n/BeginningIdol/ko_kr.yml +1400 -0
- data/i18n/Cthulhu/zh_hans.yml +11 -0
- data/i18n/KillDeathBusiness/ja_jp.yml +1 -1
- data/i18n/MagicaLogia/ja_jp.yml +1 -1
- data/i18n/MagicaLogia/zh_hans.yml +564 -0
- data/i18n/MonotoneMuseum/ko_kr.yml +526 -53
- 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/common_command/choice.rb +82 -7
- data/lib/bcdice/common_command/tally_dice/node.rb +135 -0
- data/lib/bcdice/common_command/tally_dice/parser.rb +302 -0
- data/lib/bcdice/common_command/tally_dice.rb +19 -0
- data/lib/bcdice/common_command.rb +2 -0
- data/lib/bcdice/dice_table/d66_half_grid_table.rb +33 -0
- data/lib/bcdice/dice_table/d66_left_range_table.rb +29 -0
- data/lib/bcdice/dice_table/d66_one_third_table.rb +34 -0
- data/lib/bcdice/dice_table/d66_table.rb +5 -1
- data/lib/bcdice/dice_table.rb +3 -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 +10 -5
- data/lib/bcdice/game_system/AnimaAnimus.rb +16 -9
- data/lib/bcdice/game_system/Aoharubaan.rb +91 -0
- data/lib/bcdice/game_system/Arianrhod.rb +6 -8
- data/lib/bcdice/game_system/AssaultEngine.rb +91 -0
- data/lib/bcdice/game_system/Avandner.rb +1 -1
- data/lib/bcdice/game_system/BadLife.rb +264 -289
- data/lib/bcdice/game_system/Bakenokawa.rb +244 -0
- 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 +118 -2392
- data/lib/bcdice/game_system/BeginningIdol_Korean.rb +10 -2312
- 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/CastleInGray.rb +133 -0
- 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 +3 -3
- data/lib/bcdice/game_system/Cthulhu7th.rb +56 -18
- data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
- data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
- data/lib/bcdice/game_system/Cthulhu_SimplifiedChinese.rb +60 -0
- 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 +8 -1
- data/lib/bcdice/game_system/Dracurouge.rb +3 -2
- 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/FateCoreSystem.rb +117 -0
- data/lib/bcdice/game_system/Fiasco.rb +1 -1
- data/lib/bcdice/game_system/FilledWith.rb +4 -0
- 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 +189 -417
- 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/Irisbane.rb +154 -0
- 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/Karukami.rb +84 -0
- 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 +142 -3
- data/lib/bcdice/game_system/LiveraDoll.rb +254 -304
- data/lib/bcdice/game_system/LogHorizon.rb +10 -7
- 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 +4 -3
- 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/MonotoneMuseum_Korean.rb +4 -4
- 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 +1 -1
- 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/PersonaO.rb +86 -0
- 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 +25 -7
- 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 → StellarLife.rb} +162 -226
- 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 +22 -9
- data/lib/bcdice/game_system/SwordWorld2_0.rb +22 -7
- data/lib/bcdice/game_system/SwordWorld2_5.rb +8 -2
- data/lib/bcdice/game_system/TalesFromTheLoop.rb +83 -0
- 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/TorgEternity.rb +2 -2
- data/lib/bcdice/game_system/ToshiakiHolyGrailWar.rb +92 -0
- 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/YearZeroEngine.rb +40 -19
- data/lib/bcdice/game_system/Yggdrasill.rb +1 -1
- data/lib/bcdice/game_system/ZettaiReido.rb +20 -25
- data/lib/bcdice/game_system/beginning_idol/accessories_table.rb +31 -0
- data/lib/bcdice/game_system/beginning_idol/bad_status_table.rb +43 -0
- data/lib/bcdice/game_system/beginning_idol/chain_d66_table.rb +29 -0
- data/lib/bcdice/game_system/beginning_idol/chain_table.rb +37 -0
- data/lib/bcdice/game_system/beginning_idol/costume_table.rb +37 -0
- data/lib/bcdice/game_system/beginning_idol/d6_twice_table.rb +36 -0
- data/lib/bcdice/game_system/beginning_idol/item_table.rb +51 -0
- data/lib/bcdice/game_system/beginning_idol/my_skill_name_table.rb +44 -0
- data/lib/bcdice/game_system/beginning_idol/random_event_table.rb +31 -0
- data/lib/bcdice/game_system/beginning_idol/skill_table.rb +63 -0
- data/lib/bcdice/game_system/beginning_idol/table.rb +193 -0
- data/lib/bcdice/game_system/beginning_idol/with_abnormality.rb +74 -0
- data/lib/bcdice/game_system/beginning_idol/work_table.rb +57 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +1 -1
- data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +4 -4
- data/lib/bcdice/game_system/sword_world/rating_parsed.rb +50 -7
- data/lib/bcdice/game_system/sword_world/rating_parser.rb +148 -107
- data/lib/bcdice/game_system/sword_world/transcendent_test.rb +26 -8
- data/lib/bcdice/game_system.rb +18 -1
- data/lib/bcdice/repl.rb +1 -1
- data/lib/bcdice/result.rb +26 -0
- data/lib/bcdice/version.rb +1 -1
- metadata +48 -6
|
@@ -16,20 +16,24 @@ module BCDice
|
|
|
16
16
|
HELP_MESSAGE = "貫通、クリティカル、ファンブルの自動判定を行います。\n"
|
|
17
17
|
|
|
18
18
|
# ゲーム別成功度判定(1d100)
|
|
19
|
-
def
|
|
20
|
-
return
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
19
|
+
def result_1d100(total, _dice_total, cmp_op, target)
|
|
20
|
+
return nil unless cmp_op == :<=
|
|
21
|
+
|
|
22
|
+
if total <= 1
|
|
23
|
+
Result.critical("貫通") # 1は常に貫通
|
|
24
|
+
elsif total >= 100
|
|
25
|
+
Result.fumble("致命的失敗") # 100は常に致命的失敗
|
|
26
|
+
elsif target == '?'
|
|
27
|
+
Result.nothing
|
|
28
|
+
elsif total <= (target / 5.0).ceil
|
|
29
|
+
Result.critical("決定的成功")
|
|
30
|
+
elsif total <= target
|
|
31
|
+
Result.success("成功")
|
|
32
|
+
elsif (total >= 99) && (target < 100)
|
|
33
|
+
Result.fumble("致命的失敗")
|
|
34
|
+
else
|
|
35
|
+
Result.failure("失敗")
|
|
36
|
+
end
|
|
33
37
|
end
|
|
34
38
|
end
|
|
35
39
|
end
|
|
@@ -1205,7 +1205,7 @@ module BCDice
|
|
|
1205
1205
|
'RBT', 'SBT', 'BBT', 'CBT', 'DBT', 'IBT', 'FBT', 'LBT', 'PBT', 'NBT', 'ABT', 'VBT', 'GBT', 'HBT',
|
|
1206
1206
|
'BFT', 'FWT', 'FT',
|
|
1207
1207
|
'SRT', 'ORT', 'DRT', 'URT',
|
|
1208
|
-
'NJ
|
|
1208
|
+
'NJ', 'BS', TABLES.keys
|
|
1209
1209
|
)
|
|
1210
1210
|
end
|
|
1211
1211
|
end
|
|
@@ -24,7 +24,7 @@ module BCDice
|
|
|
24
24
|
・射撃攻撃ファンブル表 SFT
|
|
25
25
|
INFO_MESSAGE_TEXT
|
|
26
26
|
|
|
27
|
-
register_prefix('EM
|
|
27
|
+
register_prefix('EM', 'HLT', 'MFT', 'SFT', '2R10')
|
|
28
28
|
|
|
29
29
|
def initialize(command)
|
|
30
30
|
super(command)
|
|
@@ -45,18 +45,19 @@ module BCDice
|
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
# ゲーム別成功度判定(nD10)
|
|
48
|
-
def
|
|
49
|
-
return
|
|
50
|
-
return '' unless cmp_op == :>=
|
|
48
|
+
def result_nd10(total, dice_total, _dice_list, cmp_op, target)
|
|
49
|
+
return nil unless cmp_op == :>=
|
|
51
50
|
|
|
52
51
|
if dice_total <= 2
|
|
53
|
-
"
|
|
52
|
+
Result.fumble("ファンブル")
|
|
54
53
|
elsif dice_total >= 20
|
|
55
|
-
"
|
|
54
|
+
Result.critical("クリティカル")
|
|
55
|
+
elsif target == "?"
|
|
56
|
+
Result.nothing
|
|
56
57
|
elsif total >= target
|
|
57
|
-
"
|
|
58
|
+
Result.success("成功")
|
|
58
59
|
else
|
|
59
|
-
"
|
|
60
|
+
Result.failure("失敗")
|
|
60
61
|
end
|
|
61
62
|
end
|
|
62
63
|
|
|
@@ -7,13 +7,13 @@ module BCDice
|
|
|
7
7
|
ID = "Emoklore"
|
|
8
8
|
|
|
9
9
|
# ゲームシステム名
|
|
10
|
-
NAME = "エモクロア"
|
|
10
|
+
NAME = "エモクロアTRPG"
|
|
11
11
|
|
|
12
12
|
# ゲームシステム名の読みがな
|
|
13
13
|
#
|
|
14
14
|
# 「ゲームシステム名の読みがなの設定方法」(docs/dicebot_sort_key.md)を参考にして
|
|
15
15
|
# 設定してください
|
|
16
|
-
SORT_KEY = "えもくろあ"
|
|
16
|
+
SORT_KEY = "えもくろあTRPG"
|
|
17
17
|
|
|
18
18
|
# ダイスボットの使い方
|
|
19
19
|
HELP_MESSAGE = <<~MESSAGETEXT
|
|
@@ -30,7 +30,7 @@ module BCDice
|
|
|
30
30
|
MESSAGETEXT
|
|
31
31
|
|
|
32
32
|
# ダイスボットで使用するコマンドを配列で列挙する
|
|
33
|
-
register_prefix('\d*DM
|
|
33
|
+
register_prefix('\d*DM<=', '(B|\d*)DA')
|
|
34
34
|
|
|
35
35
|
CRITICAL_VALUE = 1
|
|
36
36
|
FUMBLE_VALUE = 10
|
|
@@ -53,7 +53,7 @@ module BCDice
|
|
|
53
53
|
# ダイスロールの共通処理
|
|
54
54
|
# @param [Integer] num_dice
|
|
55
55
|
# @param [Integer] success_threshold
|
|
56
|
-
# @return [
|
|
56
|
+
# @return [Result]
|
|
57
57
|
def dice_roll(num_dice, success_threshold)
|
|
58
58
|
# ダイスを振った結果を配列として取得
|
|
59
59
|
values = @randomizer.roll_barabara(num_dice, 10)
|
|
@@ -65,33 +65,35 @@ module BCDice
|
|
|
65
65
|
|
|
66
66
|
# 成功値
|
|
67
67
|
success_value = 2 * critical + success - fumble
|
|
68
|
+
result = compare_result(success_value)
|
|
68
69
|
|
|
69
|
-
"#{values} > #{success_value} >
|
|
70
|
+
result.text = "#{values} > #{success_value} > 成功数#{success_value} #{result.text}"
|
|
71
|
+
return result
|
|
70
72
|
end
|
|
71
73
|
|
|
72
74
|
# @param [Integer] success
|
|
73
|
-
# @return [
|
|
74
|
-
def
|
|
75
|
+
# @return [Result]
|
|
76
|
+
def compare_result(success)
|
|
75
77
|
if success < 0
|
|
76
|
-
"ファンブル!"
|
|
78
|
+
Result.fumble("ファンブル!")
|
|
77
79
|
elsif success == 0
|
|
78
|
-
"失敗!"
|
|
80
|
+
Result.failure("失敗!")
|
|
79
81
|
elsif success == 1
|
|
80
|
-
"成功!"
|
|
82
|
+
Result.success("成功!")
|
|
81
83
|
elsif success == 2
|
|
82
|
-
"ダブル!"
|
|
84
|
+
Result.critical("ダブル!")
|
|
83
85
|
elsif success == 3
|
|
84
|
-
"トリプル!"
|
|
86
|
+
Result.critical("トリプル!")
|
|
85
87
|
elsif success <= 9
|
|
86
|
-
"ミラクル!"
|
|
88
|
+
Result.critical("ミラクル!")
|
|
87
89
|
else
|
|
88
|
-
"カタストロフ!"
|
|
90
|
+
Result.critical("カタストロフ!")
|
|
89
91
|
end
|
|
90
92
|
end
|
|
91
93
|
|
|
92
94
|
# 技能判定
|
|
93
95
|
# @param [String] command コマンド
|
|
94
|
-
# @return [
|
|
96
|
+
# @return [Result, nil] コマンドの結果
|
|
95
97
|
def roll_dm(command)
|
|
96
98
|
m = /^(\d+)?DM<=(\d+)$/.match(command)
|
|
97
99
|
unless m
|
|
@@ -105,14 +107,15 @@ module BCDice
|
|
|
105
107
|
end
|
|
106
108
|
|
|
107
109
|
# ダイスロール本体
|
|
108
|
-
|
|
110
|
+
result = dice_roll(num_dice, success_threshold)
|
|
109
111
|
|
|
110
|
-
|
|
112
|
+
result.text = "(#{num_dice}DM<=#{success_threshold}) > #{result.text}"
|
|
113
|
+
return result
|
|
111
114
|
end
|
|
112
115
|
|
|
113
116
|
# 取得技能判定
|
|
114
117
|
# @param [String] command コマンド
|
|
115
|
-
# @return [
|
|
118
|
+
# @return [Result, nil] コマンドの結果
|
|
116
119
|
def roll_da(command)
|
|
117
120
|
m = /^(B|\d+)?DA(\d+)(\+\d+)?$/.match(command)
|
|
118
121
|
unless m
|
|
@@ -123,8 +126,10 @@ module BCDice
|
|
|
123
126
|
num_dice = (m[1] == "B" ? 1 : (m[1]&.to_i || 1)) + bonus
|
|
124
127
|
success_threshold = m[1].to_i + m[2].to_i
|
|
125
128
|
|
|
126
|
-
|
|
127
|
-
|
|
129
|
+
result = dice_roll(num_dice, success_threshold)
|
|
130
|
+
|
|
131
|
+
result.text = "(#{command}) > (#{num_dice}DM<=#{success_threshold}) > #{result.text}"
|
|
132
|
+
return result
|
|
128
133
|
end
|
|
129
134
|
end
|
|
130
135
|
end
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BCDice
|
|
4
|
+
module GameSystem
|
|
5
|
+
class FateCoreSystem < Base
|
|
6
|
+
# ゲームシステムの識別子
|
|
7
|
+
ID = 'FateCoreSystem'
|
|
8
|
+
|
|
9
|
+
# ゲームシステム名
|
|
10
|
+
NAME = 'Fate Core System'
|
|
11
|
+
|
|
12
|
+
# ゲームシステム名の読みがな
|
|
13
|
+
SORT_KEY = 'ふえいとこあしすてむ'
|
|
14
|
+
|
|
15
|
+
# ダイスボットの使い方
|
|
16
|
+
HELP_MESSAGE = <<~MESSAGETEXT
|
|
17
|
+
■ ファッジダイスによる判定 (xDF+y>=t)
|
|
18
|
+
ファッジダイスをx個ダイスロールし、結果を判定します。
|
|
19
|
+
x: ダイス数
|
|
20
|
+
y: 修正値(省略可)
|
|
21
|
+
t: 目標値値(省略可)
|
|
22
|
+
例)4DF, 4DF>=3, 4DF+1>=3
|
|
23
|
+
MESSAGETEXT
|
|
24
|
+
|
|
25
|
+
register_prefix('\d+DF')
|
|
26
|
+
|
|
27
|
+
def eval_game_system_specific_command(command)
|
|
28
|
+
roll_df(command)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def roll_df(command)
|
|
34
|
+
parser = Command::Parser.new("DF", round_type: @round_type)
|
|
35
|
+
.enable_prefix_number()
|
|
36
|
+
.restrict_cmp_op_to(:>=, nil)
|
|
37
|
+
|
|
38
|
+
parsed = parser.parse(command)
|
|
39
|
+
unless parsed
|
|
40
|
+
return nil
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
dice_list = roll_fate_dice(parsed.prefix_number)
|
|
44
|
+
total = dice_list.sum() + parsed.modify_number
|
|
45
|
+
|
|
46
|
+
fate_dice_list = dice_list.map do |i|
|
|
47
|
+
if i.zero?
|
|
48
|
+
"[ ]"
|
|
49
|
+
elsif i.positive?
|
|
50
|
+
"[+]"
|
|
51
|
+
else
|
|
52
|
+
"[-]"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
result = outcome(total, parsed.target_number)
|
|
57
|
+
sequence = [
|
|
58
|
+
"(#{parsed})",
|
|
59
|
+
"#{fate_dice_list.join()}#{Format.modifier(parsed.modify_number)}",
|
|
60
|
+
result_ladder(total),
|
|
61
|
+
result.text,
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
result.text = sequence.compact.join(" > ")
|
|
65
|
+
return result
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def roll_fate_dice(times)
|
|
69
|
+
@randomizer.roll_barabara(times, 3).map { |i| i - 2 }
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def result_ladder(total)
|
|
73
|
+
ladder =
|
|
74
|
+
case total.clamp(-2, 8)
|
|
75
|
+
when 8
|
|
76
|
+
"Legendary"
|
|
77
|
+
when 7
|
|
78
|
+
"Epic"
|
|
79
|
+
when 6
|
|
80
|
+
"Fantastic"
|
|
81
|
+
when 5
|
|
82
|
+
"Superb"
|
|
83
|
+
when 4
|
|
84
|
+
"Great"
|
|
85
|
+
when 3
|
|
86
|
+
"Good"
|
|
87
|
+
when 2
|
|
88
|
+
"Fair"
|
|
89
|
+
when 1
|
|
90
|
+
"Average"
|
|
91
|
+
when 0
|
|
92
|
+
"Mediocre"
|
|
93
|
+
when -1
|
|
94
|
+
"Poor"
|
|
95
|
+
else
|
|
96
|
+
"Terrible"
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
return "#{ladder}(#{format('%+d', total)})"
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def outcome(total, target)
|
|
103
|
+
if target.nil?
|
|
104
|
+
Result.new
|
|
105
|
+
elsif total == target
|
|
106
|
+
Result.success("Tie")
|
|
107
|
+
elsif total >= target + 3
|
|
108
|
+
Result.critical("Succeed with Style")
|
|
109
|
+
elsif total >= target
|
|
110
|
+
Result.success("Succeed")
|
|
111
|
+
else
|
|
112
|
+
Result.failure("Fail")
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
@@ -20,7 +20,7 @@ module BCDice
|
|
|
20
20
|
※ WとBは片方指定(Bx, Wx)、入替指定(WxBx,BxWx)可能
|
|
21
21
|
INFO_MESSAGE_TEXT
|
|
22
22
|
|
|
23
|
-
register_prefix('FS
|
|
23
|
+
register_prefix('FS', 'W', 'B')
|
|
24
24
|
|
|
25
25
|
def eval_game_system_specific_command(command)
|
|
26
26
|
roll_fs(command) || roll_white_black(command) || roll_white_black_single(command)
|
|
@@ -72,16 +72,17 @@ module BCDice
|
|
|
72
72
|
|
|
73
73
|
result =
|
|
74
74
|
if max <= 1
|
|
75
|
-
translate("FutariSousa.DT.fumble")
|
|
75
|
+
Result.fumble(translate("FutariSousa.DT.fumble"))
|
|
76
76
|
elsif dice_list.include?(SPECIAL_DICE)
|
|
77
|
-
translate("FutariSousa.DT.special")
|
|
77
|
+
Result.critical(translate("FutariSousa.DT.special"))
|
|
78
78
|
elsif max >= SUCCESS_THRESHOLD
|
|
79
|
-
translate("success")
|
|
79
|
+
Result.success(translate("success"))
|
|
80
80
|
else
|
|
81
|
-
translate("failure")
|
|
81
|
+
Result.failure(translate("failure"))
|
|
82
82
|
end
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
result.text = "#{command}(#{dice_list.join(',')}) > #{result.text}"
|
|
85
|
+
result
|
|
85
86
|
end
|
|
86
87
|
|
|
87
88
|
# 助手用判定コマンド AS
|
|
@@ -91,16 +92,17 @@ module BCDice
|
|
|
91
92
|
|
|
92
93
|
result =
|
|
93
94
|
if max <= 1
|
|
94
|
-
translate("FutariSousa.AS.fumble")
|
|
95
|
+
Result.fumble(translate("FutariSousa.AS.fumble"))
|
|
95
96
|
elsif dice_list.include?(SPECIAL_DICE)
|
|
96
|
-
translate("FutariSousa.AS.special")
|
|
97
|
+
Result.critical(translate("FutariSousa.AS.special"))
|
|
97
98
|
elsif max >= SUCCESS_THRESHOLD
|
|
98
|
-
translate("FutariSousa.AS.success")
|
|
99
|
+
Result.success(translate("FutariSousa.AS.success"))
|
|
99
100
|
else
|
|
100
|
-
translate("failure")
|
|
101
|
+
Result.failure(translate("failure"))
|
|
101
102
|
end
|
|
102
103
|
|
|
103
|
-
|
|
104
|
+
result.text = "#{command}(#{dice_list.join(',')}) > #{result.text}"
|
|
105
|
+
result
|
|
104
106
|
end
|
|
105
107
|
|
|
106
108
|
class << self
|
|
@@ -32,7 +32,7 @@ module BCDice
|
|
|
32
32
|
・D66ダイスあり
|
|
33
33
|
INFO_MESSAGE_TEXT
|
|
34
34
|
|
|
35
|
-
register_prefix('FEAR
|
|
35
|
+
register_prefix('FEAR', 'REACT', '[\d\+\-]+\-3D6?[\d\+\-]*')
|
|
36
36
|
|
|
37
37
|
def initialize(command)
|
|
38
38
|
super(command)
|
|
@@ -41,26 +41,23 @@ module BCDice
|
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
# ゲーム別成功度判定(nD6)
|
|
44
|
-
def
|
|
45
|
-
return
|
|
46
|
-
return
|
|
44
|
+
def result_nd6(total, dice_total, dice_list, cmp_op, target)
|
|
45
|
+
return nil if target == "?"
|
|
46
|
+
return nil unless dice_list.size == 3 && cmp_op == :<=
|
|
47
47
|
|
|
48
48
|
success = target - total # 成功度
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
" > #{result}"
|
|
50
|
+
if critical?(dice_total, target)
|
|
51
|
+
Result.critical("クリティカル(成功度:#{success})")
|
|
52
|
+
elsif fumble?(dice_total, target)
|
|
53
|
+
Result.fumble("ファンブル(失敗度:#{success})")
|
|
54
|
+
elsif dice_total >= 17
|
|
55
|
+
Result.failure("自動失敗(失敗度:#{success})")
|
|
56
|
+
elsif total <= target
|
|
57
|
+
Result.success("成功(成功度:#{success})")
|
|
58
|
+
else
|
|
59
|
+
Result.failure("失敗(失敗度:#{success})")
|
|
60
|
+
end
|
|
64
61
|
end
|
|
65
62
|
|
|
66
63
|
def eval_game_system_specific_command(command)
|
|
@@ -85,16 +82,8 @@ module BCDice
|
|
|
85
82
|
modifier = ArithmeticEvaluator.eval(m[2])
|
|
86
83
|
formated_modifier = Format.modifier(modifier)
|
|
87
84
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
dice_str = dice_list.join(",")
|
|
91
|
-
|
|
92
|
-
total = dice_total + modifier
|
|
93
|
-
|
|
94
|
-
"(3D6#{formated_modifier}<=#{target_number}) > "\
|
|
95
|
-
"#{dice_total}[#{dice_str}]#{formated_modifier} > "\
|
|
96
|
-
"#{total}"\
|
|
97
|
-
"#{check_nD6(total, dice_total, dice_list, :<=, target_number)}"
|
|
85
|
+
cmd = "3D6#{formated_modifier}<=#{target_number}"
|
|
86
|
+
return CommonCommand::AddDice.eval(cmd, self, @randomizer)
|
|
98
87
|
end
|
|
99
88
|
|
|
100
89
|
def roll_fear(command)
|
|
@@ -26,7 +26,7 @@ module BCDice
|
|
|
26
26
|
INFO_MESSAGE_TEXT
|
|
27
27
|
|
|
28
28
|
register_prefix(
|
|
29
|
-
'GO
|
|
29
|
+
'GO',
|
|
30
30
|
'DC(SL|BL|IM|BR|RF|EL).+'
|
|
31
31
|
)
|
|
32
32
|
|
|
@@ -58,6 +58,10 @@ module BCDice
|
|
|
58
58
|
|
|
59
59
|
def check_roll_repeat_attack(success_rate, repeat_count, critical_border)
|
|
60
60
|
success_rate_per_one = success_rate / repeat_count
|
|
61
|
+
# 連続攻撃は最終的な成功率が50%以上であることが必要 cf. p217
|
|
62
|
+
if repeat_count > 1 && success_rate_per_one < 50
|
|
63
|
+
return "D100<=#{success_rate_per_one}@#{critical_border} > 連続攻撃は成功率が50%以上必要です"
|
|
64
|
+
end
|
|
61
65
|
|
|
62
66
|
check_roll(success_rate_per_one, critical_border)
|
|
63
67
|
end
|
|
@@ -69,16 +73,17 @@ module BCDice
|
|
|
69
73
|
dice_value = @randomizer.roll_once(100)
|
|
70
74
|
result = get_check_result(dice_value, success_rate, critical_border, fumble_border)
|
|
71
75
|
|
|
72
|
-
text = "D100<=#{success_rate}@#{critical_border} > #{dice_value} > #{result}"
|
|
73
|
-
return
|
|
76
|
+
result.text = "D100<=#{success_rate}@#{critical_border} > #{dice_value} > #{result.text}"
|
|
77
|
+
return result
|
|
74
78
|
end
|
|
75
79
|
|
|
76
80
|
def get_check_result(dice_value, success_rate, critical_border, fumble_border)
|
|
77
|
-
|
|
78
|
-
return "ファンブル" if dice_value >= fumble_border
|
|
79
|
-
return "
|
|
81
|
+
# クリティカルとファンブルが重なった場合は、ファンブルとなる。 cf. p175
|
|
82
|
+
return Result.fumble("ファンブル") if dice_value >= fumble_border
|
|
83
|
+
return Result.critical("クリティカル") if dice_value <= critical_border
|
|
84
|
+
return Result.success("成功") if dice_value <= success_rate
|
|
80
85
|
|
|
81
|
-
return "失敗"
|
|
86
|
+
return Result.failure("失敗")
|
|
82
87
|
end
|
|
83
88
|
|
|
84
89
|
def look_up_damage_chart(type, damage_value)
|
|
@@ -28,15 +28,9 @@ module BCDice
|
|
|
28
28
|
return string
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
def
|
|
32
|
-
return '' if target == '?'
|
|
33
|
-
|
|
31
|
+
def result_2d6(_total, _dice_total, dice_list, _cmp_op, _target)
|
|
34
32
|
if dice_list == [5, 5]
|
|
35
|
-
"
|
|
36
|
-
elsif total.send(cmp_op, target)
|
|
37
|
-
" > 成功"
|
|
38
|
-
else
|
|
39
|
-
" > 失敗"
|
|
33
|
+
Result.critical("ゴリティカル(自動的成功)")
|
|
40
34
|
end
|
|
41
35
|
end
|
|
42
36
|
end
|