bcdice 3.1.2 → 3.4.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 +154 -75
- data/README.md +3 -2
- data/i18n/Cthulhu/zh_hans.yml +11 -0
- 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/common_command/choice.rb +78 -7
- data/lib/bcdice/dice_table.rb +3 -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/game_system.rb +10 -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/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 +50 -12
- 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 +3 -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/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/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 +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/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/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 +2 -3
- 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/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/Yggdrasill.rb +1 -1
- data/lib/bcdice/game_system/ZettaiReido.rb +20 -25
- 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 +22 -5
|
@@ -24,14 +24,15 @@ module BCDice
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
# ゲーム別成功度判定(1d100)
|
|
27
|
-
def
|
|
28
|
-
return
|
|
29
|
-
return '' unless cmp_op == :<=
|
|
27
|
+
def result_1d100(total, _dice_total, cmp_op, target)
|
|
28
|
+
return nil unless cmp_op == :<=
|
|
30
29
|
|
|
31
30
|
if total >= 100
|
|
32
|
-
"
|
|
31
|
+
Result.fumble("ファンブル")
|
|
33
32
|
elsif total <= 1
|
|
34
|
-
"
|
|
33
|
+
Result.critical("絶対成功(達成値1+SL)")
|
|
34
|
+
elsif target == "?"
|
|
35
|
+
Result.nothing
|
|
35
36
|
elsif total <= target
|
|
36
37
|
dig10 = total / 10
|
|
37
38
|
dig1 = total - dig10 * 10
|
|
@@ -39,12 +40,12 @@ module BCDice
|
|
|
39
40
|
dig1 = 0 if dig1 >= 10 # 条件的にはあり得ない(笑
|
|
40
41
|
|
|
41
42
|
if dig1 <= 0
|
|
42
|
-
"
|
|
43
|
+
Result.critical("クリティカル(達成値20+SL)")
|
|
43
44
|
else
|
|
44
|
-
"
|
|
45
|
+
Result.success("成功(達成値#{dig10 + dig1}+SL)")
|
|
45
46
|
end
|
|
46
47
|
else
|
|
47
|
-
"
|
|
48
|
+
Result.failure("失敗")
|
|
48
49
|
end
|
|
49
50
|
end
|
|
50
51
|
end
|
|
@@ -26,7 +26,7 @@ module BCDice
|
|
|
26
26
|
修正を後ろに書くことも出来ます。
|
|
27
27
|
INFO_MESSAGE_TEXT
|
|
28
28
|
|
|
29
|
-
register_prefix('
|
|
29
|
+
register_prefix('.DPT', '.FT')
|
|
30
30
|
|
|
31
31
|
def initialize(command)
|
|
32
32
|
super(command)
|
|
@@ -35,14 +35,15 @@ module BCDice
|
|
|
35
35
|
|
|
36
36
|
# ---- 以降、Gundog.rbよりほぼコピペ(絶対成功→ベアリーに用語変更対応の為、継承だと不都合)
|
|
37
37
|
# ゲーム別成功度判定(1d100)
|
|
38
|
-
def
|
|
39
|
-
return
|
|
40
|
-
return '' unless cmp_op == :<=
|
|
38
|
+
def result_1d100(total, _dice_total, cmp_op, target)
|
|
39
|
+
return nil unless cmp_op == :<=
|
|
41
40
|
|
|
42
41
|
if total >= 100
|
|
43
|
-
"
|
|
42
|
+
Result.fumble("ファンブル")
|
|
44
43
|
elsif total <= 1
|
|
45
|
-
"
|
|
44
|
+
Result.critical("ベアリー(達成値1+SL)")
|
|
45
|
+
elsif target == "?"
|
|
46
|
+
Result.nothing
|
|
46
47
|
elsif total <= target
|
|
47
48
|
dig10 = total / 10
|
|
48
49
|
dig1 = total - dig10 * 10
|
|
@@ -50,12 +51,12 @@ module BCDice
|
|
|
50
51
|
dig1 = 0 if dig1 >= 10 # 条件的にはあり得ない(笑
|
|
51
52
|
|
|
52
53
|
if dig1 <= 0
|
|
53
|
-
"
|
|
54
|
+
Result.critical("クリティカル(達成値20+SL)")
|
|
54
55
|
else
|
|
55
|
-
"
|
|
56
|
+
Result.success("成功(達成値#{dig10 + dig1}+SL)")
|
|
56
57
|
end
|
|
57
58
|
else
|
|
58
|
-
"
|
|
59
|
+
Result.failure("失敗")
|
|
59
60
|
end
|
|
60
61
|
end
|
|
61
62
|
|
|
@@ -55,18 +55,18 @@ module BCDice
|
|
|
55
55
|
'FMB',
|
|
56
56
|
'MFMB',
|
|
57
57
|
'HIT',
|
|
58
|
-
'FEAR
|
|
59
|
-
'REACT
|
|
60
|
-
'TRAP
|
|
61
|
-
'TRS
|
|
62
|
-
'RAND
|
|
63
|
-
'RENC
|
|
58
|
+
'FEAR',
|
|
59
|
+
'REACT',
|
|
60
|
+
'TRAP[ENHL]',
|
|
61
|
+
'TRS[ENHL]',
|
|
62
|
+
'RAND[ENHL]',
|
|
63
|
+
'RENC[ENHL]',
|
|
64
64
|
'AREA',
|
|
65
|
-
'
|
|
65
|
+
'DROPN?',
|
|
66
66
|
'HST',
|
|
67
67
|
'KHST',
|
|
68
68
|
'RANDOP',
|
|
69
|
-
'LOT
|
|
69
|
+
'LOT[NP]'
|
|
70
70
|
)
|
|
71
71
|
|
|
72
72
|
def initialize(command)
|
|
@@ -75,14 +75,14 @@ module BCDice
|
|
|
75
75
|
@d66_sort_type = D66SortType::NO_SORT
|
|
76
76
|
end
|
|
77
77
|
|
|
78
|
-
def
|
|
79
|
-
return
|
|
80
|
-
return
|
|
78
|
+
def result_nd6(total, dice_total, dice_list, cmp_op, target)
|
|
79
|
+
return Result.nothing if target == '?'
|
|
80
|
+
return nil unless dice_list.size == 3 && cmp_op == :<=
|
|
81
81
|
|
|
82
82
|
success = target - total # 成功度
|
|
83
|
-
crt_string = "
|
|
84
|
-
fmb_string = "
|
|
85
|
-
fail_string = "
|
|
83
|
+
crt_string = Result.critical("クリティカル(成功度:#{success})")
|
|
84
|
+
fmb_string = Result.fumble("ファンブル(失敗度:#{success})")
|
|
85
|
+
fail_string = Result.failure("自動失敗(失敗度:#{success})")
|
|
86
86
|
|
|
87
87
|
# クリティカル
|
|
88
88
|
if (dice_total <= 6) && (target >= 16)
|
|
@@ -105,9 +105,9 @@ module BCDice
|
|
|
105
105
|
end
|
|
106
106
|
|
|
107
107
|
if total <= target
|
|
108
|
-
return "
|
|
108
|
+
return Result.success("成功(成功度:#{success})")
|
|
109
109
|
else
|
|
110
|
-
return "
|
|
110
|
+
return Result.failure("失敗(失敗度:#{success})")
|
|
111
111
|
end
|
|
112
112
|
end
|
|
113
113
|
|
|
@@ -21,32 +21,25 @@ module BCDice
|
|
|
21
21
|
・人型用 中段命中部位表 (SLH)/上段命中部位 (SLHU)/上段命中部位 (SLHD)
|
|
22
22
|
MESSAGETEXT
|
|
23
23
|
|
|
24
|
-
register_prefix('SHK
|
|
25
|
-
|
|
26
|
-
def
|
|
27
|
-
return
|
|
28
|
-
return
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return "失敗"
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def getSuccessResult(total)
|
|
47
|
-
return "決定的成功" if (total % 5) == 0
|
|
48
|
-
|
|
49
|
-
return "成功"
|
|
24
|
+
register_prefix('SHK', 'SLH', 'SLHU', 'SLHD')
|
|
25
|
+
|
|
26
|
+
def result_1d100(total, _dice_total, cmp_op, target)
|
|
27
|
+
return Result.nothing if target == '?'
|
|
28
|
+
return nil unless cmp_op == :<=
|
|
29
|
+
|
|
30
|
+
if total <= target
|
|
31
|
+
if total % 5 == 0
|
|
32
|
+
Result.critical("決定的成功")
|
|
33
|
+
else
|
|
34
|
+
Result.success("成功")
|
|
35
|
+
end
|
|
36
|
+
else
|
|
37
|
+
if total % 5 == 0
|
|
38
|
+
Result.fumble("致命的失敗")
|
|
39
|
+
else
|
|
40
|
+
Result.failure("失敗")
|
|
41
|
+
end
|
|
42
|
+
end
|
|
50
43
|
end
|
|
51
44
|
|
|
52
45
|
def eval_game_system_specific_command(command)
|
|
@@ -16,31 +16,22 @@ module BCDice
|
|
|
16
16
|
HELP_MESSAGE = "大成功、自動成功、失敗、自動失敗、大失敗の自動判定を行います。\n"
|
|
17
17
|
|
|
18
18
|
# ゲーム別成功度判定(1d100)
|
|
19
|
-
def
|
|
20
|
-
return
|
|
19
|
+
def result_1d100(total, _dice_total, cmp_op, target)
|
|
20
|
+
return Result.nothing if target == '?'
|
|
21
|
+
return nil unless cmp_op == :<=
|
|
21
22
|
|
|
22
|
-
if total
|
|
23
|
-
|
|
24
|
-
if total <= (target / 5)
|
|
25
|
-
" > 大成功"
|
|
26
|
-
else
|
|
27
|
-
" > 自動成功"
|
|
28
|
-
end
|
|
29
|
-
elsif total >= 100
|
|
30
|
-
# 00は大失敗(大失敗は自動失敗でもある)
|
|
31
|
-
" > 大失敗"
|
|
23
|
+
if total >= 100
|
|
24
|
+
Result.fumble("大失敗")
|
|
32
25
|
elsif total >= 96
|
|
33
|
-
|
|
34
|
-
|
|
26
|
+
Result.failure("自動失敗")
|
|
27
|
+
elsif total <= (target / 5)
|
|
28
|
+
Result.critical("大成功")
|
|
29
|
+
elsif total <= 1
|
|
30
|
+
Result.success("自動成功")
|
|
35
31
|
elsif total <= target
|
|
36
|
-
|
|
37
|
-
# 目標値の1/5以下は大成功
|
|
38
|
-
" > 大成功"
|
|
39
|
-
else
|
|
40
|
-
" > 成功"
|
|
41
|
-
end
|
|
32
|
+
Result.success("成功")
|
|
42
33
|
else
|
|
43
|
-
"
|
|
34
|
+
Result.failure("失敗")
|
|
44
35
|
end
|
|
45
36
|
end
|
|
46
37
|
end
|
|
@@ -47,18 +47,13 @@ module BCDice
|
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
# ゲーム別成功度判定(2D6)
|
|
50
|
-
def
|
|
51
|
-
return
|
|
52
|
-
return '' unless cmp_op == :>=
|
|
50
|
+
def result_2d6(_total, dice_total, _dice_list, cmp_op, _target)
|
|
51
|
+
return nil unless cmp_op == :>=
|
|
53
52
|
|
|
54
53
|
if dice_total <= 2
|
|
55
|
-
"
|
|
54
|
+
Result.fumble("ファンブル(モノビースト追加行動+1)")
|
|
56
55
|
elsif dice_total >= 12
|
|
57
|
-
"
|
|
58
|
-
elsif total >= target
|
|
59
|
-
" > 成功"
|
|
60
|
-
else
|
|
61
|
-
" > 失敗"
|
|
56
|
+
Result.critical("スペシャル(変調1つ回復orダメージ+1D6)")
|
|
62
57
|
end
|
|
63
58
|
end
|
|
64
59
|
|
|
@@ -403,7 +398,7 @@ module BCDice
|
|
|
403
398
|
),
|
|
404
399
|
}.freeze
|
|
405
400
|
|
|
406
|
-
register_prefix(RTT.prefixes, '
|
|
401
|
+
register_prefix(RTT.prefixes, 'SA', TABLES.keys)
|
|
407
402
|
end
|
|
408
403
|
end
|
|
409
404
|
end
|
|
@@ -13,38 +13,40 @@ module BCDice
|
|
|
13
13
|
SORT_KEY = 'むけんのふあんたしあ'
|
|
14
14
|
|
|
15
15
|
# ダイスボットの使い方
|
|
16
|
-
HELP_MESSAGE = "
|
|
16
|
+
HELP_MESSAGE = "失敗、成功レベルの自動判定を行います。"
|
|
17
17
|
|
|
18
18
|
# ゲーム別成功度判定(1d20)
|
|
19
|
-
def
|
|
20
|
-
return
|
|
19
|
+
def result_1d20(total, _dice_total, cmp_op, target)
|
|
20
|
+
return Result.nothing if target == '?'
|
|
21
|
+
return nil unless cmp_op == :<=
|
|
21
22
|
|
|
22
|
-
if
|
|
23
|
-
return
|
|
24
|
-
elsif total > target
|
|
25
|
-
return " > 失敗"
|
|
23
|
+
if total > target
|
|
24
|
+
return Result.failure("失敗")
|
|
26
25
|
end
|
|
27
26
|
|
|
28
27
|
output =
|
|
29
28
|
if total <= (target / 32)
|
|
30
|
-
"
|
|
29
|
+
"32レベル成功(32Lv+)"
|
|
31
30
|
elsif total <= (target / 16)
|
|
32
|
-
"
|
|
31
|
+
"16レベル成功(16Lv+)"
|
|
33
32
|
elsif total <= (target / 8)
|
|
34
|
-
"
|
|
33
|
+
"8レベル成功"
|
|
35
34
|
elsif total <= (target / 4)
|
|
36
|
-
"
|
|
35
|
+
"4レベル成功"
|
|
37
36
|
elsif total <= (target / 2)
|
|
38
|
-
"
|
|
37
|
+
"2レベル成功"
|
|
39
38
|
else
|
|
40
|
-
"
|
|
39
|
+
"1レベル成功"
|
|
41
40
|
end
|
|
42
41
|
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
Result.new.tap do |r|
|
|
43
|
+
r.text = output
|
|
44
|
+
r.success = true
|
|
45
|
+
if total <= 1
|
|
46
|
+
r.critical = true
|
|
47
|
+
r.text += "/クリティカル"
|
|
48
|
+
end
|
|
45
49
|
end
|
|
46
|
-
|
|
47
|
-
output
|
|
48
50
|
end
|
|
49
51
|
end
|
|
50
52
|
end
|
|
@@ -46,27 +46,20 @@ module BCDice
|
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
# ゲーム別成功度判定(2D6)
|
|
49
|
-
def
|
|
50
|
-
return
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
translate("failure")
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
if result.empty?
|
|
66
|
-
return ""
|
|
49
|
+
def result_2d6(total, dice_total, _dice_list, cmp_op, target)
|
|
50
|
+
return nil unless cmp_op == :>=
|
|
51
|
+
|
|
52
|
+
if dice_total <= 2
|
|
53
|
+
Result.fumble(translate("Insane.fumble"))
|
|
54
|
+
elsif dice_total >= 12
|
|
55
|
+
Result.critical(translate("Insane.special"))
|
|
56
|
+
elsif target == "?"
|
|
57
|
+
Result.nothing
|
|
58
|
+
elsif total >= target
|
|
59
|
+
Result.success(translate("success"))
|
|
60
|
+
else
|
|
61
|
+
Result.failure(translate("failure"))
|
|
67
62
|
end
|
|
68
|
-
|
|
69
|
-
return " > #{result}"
|
|
70
63
|
end
|
|
71
64
|
|
|
72
65
|
def eval_game_system_specific_command(command)
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BCDice
|
|
4
|
+
module GameSystem
|
|
5
|
+
class Irisbane < Base
|
|
6
|
+
# ゲームシステムの識別子
|
|
7
|
+
ID = 'Irisbane'
|
|
8
|
+
|
|
9
|
+
# ゲームシステム名
|
|
10
|
+
NAME = '瞳逸らさぬイリスベイン'
|
|
11
|
+
|
|
12
|
+
# ゲームシステム名の読みがな
|
|
13
|
+
SORT_KEY = 'ひとみそらさぬいりすへいん'
|
|
14
|
+
|
|
15
|
+
# ダイスボットの使い方
|
|
16
|
+
HELP_MESSAGE = <<~HELP
|
|
17
|
+
■攻撃判定( ATTACKx@y<=z )
|
|
18
|
+
x: 攻撃力
|
|
19
|
+
y: 判定数
|
|
20
|
+
z: 目標値
|
|
21
|
+
(※ ATTACK は ATK または AT と簡略化可能)
|
|
22
|
+
例) ATTACK2@3<=5
|
|
23
|
+
例) ATK10@2<=4
|
|
24
|
+
例) AT8@3<=2
|
|
25
|
+
|
|
26
|
+
上記 x y z にはそれぞれ四則演算を指定可能。
|
|
27
|
+
例) ATTACK2+7@3*2<=5-1
|
|
28
|
+
|
|
29
|
+
□攻撃判定のダメージ増減( ATTACKx@y<=z[+a] ATTACKx@y<=z[-a])
|
|
30
|
+
末尾に [+a] または [-a] と指定すると、最終的なダメージを増減できる。
|
|
31
|
+
a: 増減量
|
|
32
|
+
例) ATTACK2@3<=5[+10]
|
|
33
|
+
例) ATK10@2<=4[-8]
|
|
34
|
+
例) AT8@3<=2[-8+5]
|
|
35
|
+
|
|
36
|
+
■シチュエーション(p115)
|
|
37
|
+
SceneSituation, SSi
|
|
38
|
+
HELP
|
|
39
|
+
|
|
40
|
+
ATTACK_ROLL_REG = %r{^AT(TACK|K)?([+\-*/()\d]+)@([+\-*/()\d]+)<=([+\-*/()\d]+)(\[([+\-])([+\-*/()\d]+)\])?}i.freeze
|
|
41
|
+
register_prefix('AT(TACK|K)?')
|
|
42
|
+
|
|
43
|
+
def initialize(command)
|
|
44
|
+
super(command)
|
|
45
|
+
|
|
46
|
+
@sort_barabara_dice = true
|
|
47
|
+
@round_type = RoundType::CEIL
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def eval_game_system_specific_command(command)
|
|
51
|
+
command = ALIAS[command] || command
|
|
52
|
+
|
|
53
|
+
if (m = ATTACK_ROLL_REG.match(command))
|
|
54
|
+
roll_attack(m[2], m[3], m[4], m[6], m[7])
|
|
55
|
+
else
|
|
56
|
+
roll_tables(command, TABLES)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
private
|
|
61
|
+
|
|
62
|
+
def roll_attack(power_expression, dice_count_expression, border_expression, modification_operator, modification_expression)
|
|
63
|
+
power = Arithmetic.eval(power_expression, RoundType::CEIL)
|
|
64
|
+
dice_count = Arithmetic.eval(dice_count_expression, RoundType::CEIL)
|
|
65
|
+
border = Arithmetic.eval(border_expression, RoundType::CEIL)
|
|
66
|
+
modification_value = modification_expression.nil? ? nil : Arithmetic.eval(modification_expression, RoundType::CEIL)
|
|
67
|
+
return if power.nil? || dice_count.nil? || border.nil?
|
|
68
|
+
return if modification_operator && modification_value.nil?
|
|
69
|
+
|
|
70
|
+
power = 0 if power < 0
|
|
71
|
+
border = border.clamp(1, 6)
|
|
72
|
+
|
|
73
|
+
command = make_command_text(power, dice_count, border, modification_operator, modification_value)
|
|
74
|
+
|
|
75
|
+
if dice_count <= 0
|
|
76
|
+
return "#{command} > 判定数が 0 です"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
dices = @randomizer.roll_barabara(dice_count, 6).sort
|
|
80
|
+
|
|
81
|
+
success_dice_count = dices.count { |dice| dice <= border }
|
|
82
|
+
damage = success_dice_count * power
|
|
83
|
+
|
|
84
|
+
message_elements = []
|
|
85
|
+
message_elements << command
|
|
86
|
+
message_elements << dices.join(',')
|
|
87
|
+
message_elements << "成功ダイス数 #{success_dice_count}"
|
|
88
|
+
message_elements << "× 攻撃力 #{power}" if success_dice_count > 0
|
|
89
|
+
|
|
90
|
+
if success_dice_count > 0
|
|
91
|
+
if modification_operator && modification_value
|
|
92
|
+
message_elements << "ダメージ #{damage}#{modification_operator}#{modification_value}"
|
|
93
|
+
damage = parse_operator(modification_operator).call(damage, modification_value)
|
|
94
|
+
damage = 0 if damage < 0
|
|
95
|
+
message_elements << damage.to_s
|
|
96
|
+
else
|
|
97
|
+
message_elements << "ダメージ #{damage}"
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
Result.new(message_elements.join(' > ')).tap do |r|
|
|
102
|
+
r.condition = success_dice_count > 0
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def make_command_text(power, dice_count, border, modification_operator, modification_value)
|
|
107
|
+
text = "(ATTACK#{power}@#{dice_count}<=#{border}"
|
|
108
|
+
text += "[#{modification_operator}#{modification_value}]" if modification_operator
|
|
109
|
+
text += ")"
|
|
110
|
+
text
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def parse_operator(operator)
|
|
114
|
+
case operator
|
|
115
|
+
when '+'
|
|
116
|
+
lambda { |x, y| x + y }
|
|
117
|
+
when '-'
|
|
118
|
+
lambda { |x, y| x - y }
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
TABLES = {
|
|
123
|
+
"SceneSituation" => DiceTable::D66LeftRangeTable.new(
|
|
124
|
+
"シチュエーション",
|
|
125
|
+
BCDice::D66SortType::NO_SORT,
|
|
126
|
+
[
|
|
127
|
+
[1..3, [
|
|
128
|
+
"【日常】何一つ変わることの無い日々の一幕。移ろい易い世界では、それはとても大切である。",
|
|
129
|
+
"【準備】何かを為すための用意をする一幕。情報収集、買物遠征、やるべきことは一杯だ。",
|
|
130
|
+
"【趣味】自分の時間を、有効活用している一幕。必要に追われていない分、心は軽く晴れやかだ。",
|
|
131
|
+
"【喫茶】一息入れ、嗜好品を嗜む時の一幕。穏やかな空気は、だが、往々にして変わりやすい。",
|
|
132
|
+
"【鍛錬】体を鍛え、心を養う修練の一幕。己さえ良ければ、その方法も何だって良い。",
|
|
133
|
+
"【職務】役割の元、仕事に精を出す時の一幕。目的が何であれ、為すべきことに変わりはない。",
|
|
134
|
+
]],
|
|
135
|
+
[4..6, [
|
|
136
|
+
"【移動】何処かから何処かへと向かう一幕。進んでいるなら、手段も目的地も関係あるまい。",
|
|
137
|
+
"【墓前】故人が眠る場所へと赴く一幕。共に眠ることだけは無いように。",
|
|
138
|
+
"【操作】何かを操り、望みを果たしている一幕。運転にせよ何にせよ、脇見には注意が必要だ。",
|
|
139
|
+
"【食事】何かを糧とし、己の力を蓄える一幕。行動すれば消耗する。腹が減っては何とやらだ。",
|
|
140
|
+
"【休息】日々の合間の、憩いの一幕。“何もしない”というのも、立派な行いである。",
|
|
141
|
+
"【夢幻】現実に存在しない何かへと耽る一幕。時間帯に関わらず、何時かは必ず覚めるだろう。",
|
|
142
|
+
]],
|
|
143
|
+
]
|
|
144
|
+
),
|
|
145
|
+
}.transform_keys(&:upcase).freeze
|
|
146
|
+
|
|
147
|
+
ALIAS = {
|
|
148
|
+
"SSi" => "SceneSituation",
|
|
149
|
+
}.transform_keys(&:upcase).transform_values(&:upcase).freeze
|
|
150
|
+
|
|
151
|
+
register_prefix(TABLES.keys, ALIAS.keys)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|