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
|
@@ -25,7 +25,7 @@ module BCDice
|
|
|
25
25
|
例)DC4:【攻撃力】4でダメージチェック DC5[20]:【攻撃力】5でダメージチェック、うち1つは20mm機銃 DC5[20,30]:【攻撃力】5でダメージチェック、うち1つは20mm機銃、うち1つは30mmガンポッド
|
|
26
26
|
MESSAGETEXT
|
|
27
27
|
|
|
28
|
-
register_prefix('\d*D20<=', '\d*CP', 'RMT', 'TOT', 'EXT', 'SUT', 'DC
|
|
28
|
+
register_prefix('\d*D20<=', '\d*CP', 'RMT', 'TOT', 'EXT', 'SUT', 'DC')
|
|
29
29
|
|
|
30
30
|
def eval_game_system_specific_command(command) # ダイスロールコマンド
|
|
31
31
|
# 通常判定部分をgetJudgeResultコマンドに切り分け
|
|
@@ -45,18 +45,13 @@ module BCDice
|
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
# ゲーム別成功度判定(2D6)
|
|
48
|
-
def
|
|
49
|
-
return
|
|
50
|
-
return '' unless cmp_op == :>=
|
|
48
|
+
def result_2d6(_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("ファンブル(【眠気】が1d6点上昇)")
|
|
54
53
|
elsif dice_total >= 12
|
|
55
|
-
|
|
56
|
-
elsif total >= target
|
|
57
|
-
return " > 成功"
|
|
58
|
-
else
|
|
59
|
-
return " > 失敗"
|
|
54
|
+
Result.critical("スペシャル(【魔力】あるいは【眠気】が1d6点回復)")
|
|
60
55
|
end
|
|
61
56
|
end
|
|
62
57
|
|
|
@@ -18,20 +18,20 @@ module BCDice
|
|
|
18
18
|
INFO_MESSAGE_TEXT
|
|
19
19
|
|
|
20
20
|
# ゲーム別成功度判定(1d20)
|
|
21
|
-
def
|
|
22
|
-
return
|
|
23
|
-
return
|
|
21
|
+
def result_1d20(total, _dice_total, cmp_op, target)
|
|
22
|
+
return Result.nothing if target == '?'
|
|
23
|
+
return nil unless cmp_op == :<=
|
|
24
24
|
|
|
25
25
|
if total <= target
|
|
26
26
|
if (total >= (40 - target)) || (total == target)
|
|
27
|
-
"
|
|
27
|
+
Result.critical("クリティカル")
|
|
28
28
|
else
|
|
29
|
-
"
|
|
29
|
+
Result.success("成功")
|
|
30
30
|
end
|
|
31
31
|
elsif total == 20
|
|
32
|
-
"
|
|
32
|
+
Result.fumble("ファンブル")
|
|
33
33
|
else
|
|
34
|
-
"
|
|
34
|
+
Result.failure("失敗")
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
37
|
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BCDice
|
|
4
|
+
module GameSystem
|
|
5
|
+
class PersonaO < Base
|
|
6
|
+
# ゲームシステムのの識別子
|
|
7
|
+
ID = 'PersonaO'
|
|
8
|
+
|
|
9
|
+
# ゲームシステム名
|
|
10
|
+
NAME = 'ペルソナTRPG-O'
|
|
11
|
+
|
|
12
|
+
# ゲームシステム名の読みがな
|
|
13
|
+
SORT_KEY = 'へるそなTRPGO'
|
|
14
|
+
|
|
15
|
+
# ダイスボットの使い方
|
|
16
|
+
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
|
17
|
+
・基本判定
|
|
18
|
+
PTx@y x:目標値、y:クリティカル値(省略時は5)
|
|
19
|
+
例)PT60 PT90@10
|
|
20
|
+
|
|
21
|
+
・ダメージ計算
|
|
22
|
+
nPD+(x+y*2)%(z-a)-b n:ダイス個数、x:スキル固定値、y:ボーナス、z:バフ倍率、a:耐性、b:敵防御力
|
|
23
|
+
nPD+(x+y*2)までがスキルによる素のダメージ、zおよびaは計算式を入れてよい。
|
|
24
|
+
|
|
25
|
+
例)ソニックパンチ、力B2点、
|
|
26
|
+
タルカジャがかかっており、打撃耐性あり、
|
|
27
|
+
目標の物理防御力は2点
|
|
28
|
+
|
|
29
|
+
2PD+(20+2*2)%(100+50-50)-2
|
|
30
|
+
INFO_MESSAGE_TEXT
|
|
31
|
+
|
|
32
|
+
register_prefix(
|
|
33
|
+
'PT',
|
|
34
|
+
'\d+PD'
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
def eval_game_system_specific_command(command)
|
|
38
|
+
roll_attack(command) || roll_damage(command)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def roll_attack(command)
|
|
44
|
+
m = /^PT(-?\d+)?(@(-?\d+))?$/i.match(command)
|
|
45
|
+
unless m
|
|
46
|
+
return nil
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
success_rate = m[1].to_i
|
|
50
|
+
critical_border = m[3]&.to_i || 5
|
|
51
|
+
|
|
52
|
+
dice_value = @randomizer.roll_once(100)
|
|
53
|
+
result =
|
|
54
|
+
if dice_value <= critical_border
|
|
55
|
+
Result.critical("クリティカル")
|
|
56
|
+
elsif dice_value <= success_rate
|
|
57
|
+
Result.success("成功")
|
|
58
|
+
else
|
|
59
|
+
Result.failure("失敗")
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
result.text = "D100<=#{success_rate}@#{critical_border} > #{dice_value} > #{result.text}"
|
|
63
|
+
return result
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def roll_damage(command)
|
|
67
|
+
m = /^(\d+)PD\+(-?\d+)%(-?\d+)-(\d+)$/i.match(command)
|
|
68
|
+
unless m
|
|
69
|
+
return nil
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
dice = m[1].to_i
|
|
73
|
+
kotei = m[2].to_i
|
|
74
|
+
hosei = m[3].to_i
|
|
75
|
+
bougyo = m[4].to_i
|
|
76
|
+
|
|
77
|
+
dice_list = @randomizer.roll_barabara(dice, 10)
|
|
78
|
+
dice_sum = dice_list.sum
|
|
79
|
+
|
|
80
|
+
dmg = dice_sum + (hosei * kotei / 100.0).to_i - bougyo
|
|
81
|
+
|
|
82
|
+
return "#{dice}D10+#{kotei}*#{hosei}%-#{bougyo} > [#{dice_list.join(',')}]+#{kotei}*#{hosei}%-#{bougyo} > #{dmg} ダメージ!"
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -18,9 +18,9 @@ module BCDice
|
|
|
18
18
|
INFO_MESSAGE_TEXT
|
|
19
19
|
|
|
20
20
|
# ゲーム別成功度判定(1d20)
|
|
21
|
-
def
|
|
22
|
-
return
|
|
23
|
-
return
|
|
21
|
+
def result_1d20(total, _dice_total, cmp_op, diff)
|
|
22
|
+
return Result.nothing if diff == '?'
|
|
23
|
+
return nil unless cmp_op == :<=
|
|
24
24
|
|
|
25
25
|
# 技能値の修正を計算する
|
|
26
26
|
skill_mod = 0
|
|
@@ -46,7 +46,7 @@ module BCDice
|
|
|
46
46
|
else
|
|
47
47
|
fum_str += "-#{skill_mod}=#{fum_num}"
|
|
48
48
|
end
|
|
49
|
-
return "
|
|
49
|
+
return Result.fumble("致命的失敗(#{fum_str})")
|
|
50
50
|
|
|
51
51
|
elsif (total <= critical) || (total <= 1)
|
|
52
52
|
crit_num = dice_now + skill_mod
|
|
@@ -54,14 +54,14 @@ module BCDice
|
|
|
54
54
|
crit_num = 1 if crit_num < 1
|
|
55
55
|
|
|
56
56
|
if skill_mod < 0
|
|
57
|
-
return "
|
|
57
|
+
return Result.success("成功")
|
|
58
58
|
end
|
|
59
59
|
|
|
60
|
-
return "
|
|
60
|
+
return Result.critical("決定的成功(#{dice_now}+#{skill_mod}=#{crit_num})")
|
|
61
61
|
elsif total <= diff
|
|
62
|
-
return "
|
|
62
|
+
return Result.success("成功")
|
|
63
63
|
else
|
|
64
|
-
return "
|
|
64
|
+
return Result.failure("失敗")
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
end
|
|
@@ -47,7 +47,7 @@ module BCDice
|
|
|
47
47
|
・プッシュ時のキャスティング・ロールの失敗(Failed Casting Effects)表 FCE
|
|
48
48
|
INFO_MESSAGE_TEXT
|
|
49
49
|
|
|
50
|
-
register_prefix('CC
|
|
50
|
+
register_prefix('CC', 'CBR', 'FAR', 'BMR', 'BMS', 'FCE', 'PH', 'MA', 'IT')
|
|
51
51
|
|
|
52
52
|
def eval_game_system_specific_command(command)
|
|
53
53
|
case command
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BCDice
|
|
4
|
+
module GameSystem
|
|
5
|
+
class Revulture < Base
|
|
6
|
+
# ゲームシステムの識別子
|
|
7
|
+
ID = 'Revulture'
|
|
8
|
+
|
|
9
|
+
# ゲームシステム名
|
|
10
|
+
NAME = '光砕のリヴァルチャー'
|
|
11
|
+
|
|
12
|
+
# ゲームシステム名の読みがな
|
|
13
|
+
SORT_KEY = 'こうさいのりうあるちやあ'
|
|
14
|
+
|
|
15
|
+
# ダイスボットの使い方
|
|
16
|
+
HELP_MESSAGE = <<~HELP
|
|
17
|
+
■アタック判定( xAT, xATK, xATTACK )
|
|
18
|
+
x: ダイス数(加算 + と除算 / を使用可能)
|
|
19
|
+
例) 3AT, 4ATK, 5+6ATTACK, 15/2AT
|
|
20
|
+
|
|
21
|
+
□アタック判定 目標値つき( xAT<=y, xATK<=y, xATTACK<=y )
|
|
22
|
+
x: ダイス数(加算 + と除算 / を使用可能)
|
|
23
|
+
y: 目標値( 1 以上 6 以下。加算 + を使用可能)
|
|
24
|
+
例) 3AT<=4, 3AT<=2+1
|
|
25
|
+
|
|
26
|
+
□アタック判定 目標値&追加ダメージつき( xAT<=y[>=a:+b], xATK<=y[>=a:+b], xATTACK<=y[z] )
|
|
27
|
+
x: ダイス数(加算 + と除算 / を使用可能)
|
|
28
|
+
y: 目標値( 1 以上 6 以下。加算 + を使用可能)
|
|
29
|
+
z: 追加ダメージの規則(詳細は後述)(※複数同時に指定可能)
|
|
30
|
+
|
|
31
|
+
▽追加ダメージの規則 [a:+b]
|
|
32
|
+
a: ヒット数が a なら
|
|
33
|
+
=a (ヒット数が a に等しい)
|
|
34
|
+
>=a (ヒット数が a 以上)
|
|
35
|
+
b: ダメージを b 点追加
|
|
36
|
+
|
|
37
|
+
例) 3AT<=4[>=2:+3] #ルールブックp056「グレングラントAR」
|
|
38
|
+
例) 2AT<=4[=1:+5][>=2:+8] #ルールブックp067「ファーボル・ドラゴンブレス」
|
|
39
|
+
HELP
|
|
40
|
+
|
|
41
|
+
ATTACK_ROLL_REG = %r{^(\d+([+/]\d+)*)?AT(TACK|K)?(<=([1-6](\+\d)*))?((\[>?=\d+:\+\d+\])+)?}i.freeze
|
|
42
|
+
register_prefix('\d+([+\/]\d+)*AT')
|
|
43
|
+
|
|
44
|
+
def eval_game_system_specific_command(command)
|
|
45
|
+
if (m = ATTACK_ROLL_REG.match(command))
|
|
46
|
+
roll_attack(m[1], m[5], m[7])
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def roll_attack(dice_count_expression, border_expression, additional_damage_rules)
|
|
53
|
+
dice_count = Arithmetic.eval(dice_count_expression, RoundType::FLOOR)
|
|
54
|
+
border = Arithmetic.eval(border_expression, RoundType::FLOOR).clamp(1, 6) if border_expression
|
|
55
|
+
|
|
56
|
+
command = make_command_text(dice_count, border, additional_damage_rules)
|
|
57
|
+
|
|
58
|
+
if dice_count <= 0
|
|
59
|
+
return "#{command} > ダイス数が 0 です"
|
|
60
|
+
elsif border.nil? && additional_damage_rules
|
|
61
|
+
return "#{command} > 目標値が指定されていないため、追加ダメージを算出できません"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
dices = @randomizer.roll_barabara(dice_count, 6).sort
|
|
65
|
+
|
|
66
|
+
critical_hit_count = dices.count(1)
|
|
67
|
+
hit_count = dices.count { |dice| dice <= border } + critical_hit_count if border
|
|
68
|
+
damage = calc_damage(hit_count, additional_damage_rules)
|
|
69
|
+
|
|
70
|
+
message_elements = []
|
|
71
|
+
message_elements << command
|
|
72
|
+
message_elements << dices.join(',')
|
|
73
|
+
message_elements << "クリティカル #{critical_hit_count}" if critical_hit_count > 0
|
|
74
|
+
message_elements << "ヒット数 #{hit_count}" if hit_count
|
|
75
|
+
message_elements << "ダメージ #{damage}" if damage
|
|
76
|
+
|
|
77
|
+
Result.new(message_elements.join(' > ')).tap do |r|
|
|
78
|
+
r.condition = hit_count > 0 if hit_count
|
|
79
|
+
r.critical = critical_hit_count > 0
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def make_command_text(dice_count, border, additional_damage_rules)
|
|
84
|
+
command = "#{dice_count}attack"
|
|
85
|
+
command += "<=#{border}" if border
|
|
86
|
+
command += additional_damage_rules if additional_damage_rules
|
|
87
|
+
|
|
88
|
+
"(#{command})"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def calc_damage(hit_count, additional_damage_rules)
|
|
92
|
+
return nil unless additional_damage_rules
|
|
93
|
+
|
|
94
|
+
damage = hit_count
|
|
95
|
+
parse_additional_damage_rules(additional_damage_rules).each do |rule|
|
|
96
|
+
if rule[:condition].call(hit_count)
|
|
97
|
+
damage += rule[:additinal_damage]
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
damage
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def parse_additional_damage_rules(source)
|
|
105
|
+
source.scan(/\[(>?=)(\d+):\+(\d+)\]/).map do |matched|
|
|
106
|
+
{
|
|
107
|
+
condition: make_additional_damage_condition(matched[0], matched[1].to_i),
|
|
108
|
+
additinal_damage: matched[2].to_i,
|
|
109
|
+
}
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def make_additional_damage_condition(comparer, comparing_target)
|
|
114
|
+
case comparer
|
|
115
|
+
when '='
|
|
116
|
+
lambda { |hit_count| hit_count == comparing_target }
|
|
117
|
+
when '>='
|
|
118
|
+
lambda { |hit_count| hit_count >= comparing_target }
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
@@ -18,8 +18,8 @@ module BCDice
|
|
|
18
18
|
INFO_MESSAGE_TEXT
|
|
19
19
|
|
|
20
20
|
# ゲーム別成功度判定(1d100)
|
|
21
|
-
def
|
|
22
|
-
return
|
|
21
|
+
def result_1d100(total, _dice_total, cmp_op, target)
|
|
22
|
+
return Result.nothing if target == '?'
|
|
23
23
|
return nil unless cmp_op == :<=
|
|
24
24
|
|
|
25
25
|
# RuneQuest QUICK-START RULESを元に修正
|
|
@@ -28,18 +28,18 @@ module BCDice
|
|
|
28
28
|
|
|
29
29
|
if (total <= 1) || (total <= critical_value)
|
|
30
30
|
# 1は常に決定的成功
|
|
31
|
-
"
|
|
31
|
+
Result.critical("決定的成功")
|
|
32
32
|
elsif total >= 100
|
|
33
33
|
# 100は常に致命的失敗
|
|
34
|
-
"
|
|
34
|
+
Result.fumble("致命的失敗")
|
|
35
35
|
elsif total <= (target.to_f / 5).round
|
|
36
|
-
"
|
|
36
|
+
Result.success("効果的成功")
|
|
37
37
|
elsif total <= target
|
|
38
|
-
"
|
|
38
|
+
Result.success("成功")
|
|
39
39
|
elsif total >= 95 + critical_value
|
|
40
|
-
"
|
|
40
|
+
Result.fumble("致命的失敗")
|
|
41
41
|
else
|
|
42
|
-
"
|
|
42
|
+
Result.failure("失敗")
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
end
|
|
@@ -219,7 +219,7 @@ module BCDice
|
|
|
219
219
|
|
|
220
220
|
# 固有のダイスロールコマンドを実行する
|
|
221
221
|
# @param [String] command 入力されたコマンド
|
|
222
|
-
# @return [
|
|
222
|
+
# @return [Result, nil] ダイスロールコマンドの実行結果
|
|
223
223
|
def eval_game_system_specific_command(command)
|
|
224
224
|
alias_replaced_with_2d6 = replace_alias_for_srs_roll_with_2d6(command)
|
|
225
225
|
|
|
@@ -297,7 +297,7 @@ module BCDice
|
|
|
297
297
|
|
|
298
298
|
# 成功判定を実行する
|
|
299
299
|
# @param [SRSRollNode] srs_roll 成功判定ノード
|
|
300
|
-
# @return [
|
|
300
|
+
# @return [Result] 成功判定結果
|
|
301
301
|
def execute_srs_roll(srs_roll)
|
|
302
302
|
dice_list = @randomizer.roll_barabara(2, 6)
|
|
303
303
|
dice_list.sort! if @sort_add_dice
|
|
@@ -307,35 +307,36 @@ module BCDice
|
|
|
307
307
|
|
|
308
308
|
modified_sum = sum + srs_roll.modifier
|
|
309
309
|
|
|
310
|
+
result = compare_result(srs_roll, sum, modified_sum)
|
|
311
|
+
|
|
310
312
|
parts = [
|
|
311
313
|
"(#{srs_roll})",
|
|
312
314
|
"#{sum}[#{dice_str}]#{Format.modifier(srs_roll.modifier)}",
|
|
313
315
|
modified_sum,
|
|
314
|
-
|
|
316
|
+
result.text
|
|
315
317
|
]
|
|
316
318
|
|
|
317
|
-
|
|
319
|
+
result.text = parts.compact.join(' > ')
|
|
320
|
+
result
|
|
318
321
|
end
|
|
319
322
|
|
|
320
323
|
# ダイスロール結果を目標値、クリティカル値、ファンブル値と比較する
|
|
321
324
|
# @param [SRSRollNode] srs_roll 成功判定ノード
|
|
322
325
|
# @param [Integer] sum 出目の合計
|
|
323
326
|
# @param [Integer] modified_sum 修正後の値
|
|
324
|
-
# @return [
|
|
327
|
+
# @return [Result] 比較結果
|
|
325
328
|
def compare_result(srs_roll, sum, modified_sum)
|
|
326
329
|
if sum >= srs_roll.critical_value
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
330
|
+
Result.critical("自動成功")
|
|
331
|
+
elsif sum <= srs_roll.fumble_value
|
|
332
|
+
Result.fumble("自動失敗")
|
|
333
|
+
elsif srs_roll.target_value.nil?
|
|
334
|
+
Result.new
|
|
335
|
+
elsif modified_sum >= srs_roll.target_value
|
|
336
|
+
Result.success("成功")
|
|
337
|
+
else
|
|
338
|
+
Result.failure("失敗")
|
|
336
339
|
end
|
|
337
|
-
|
|
338
|
-
return nil
|
|
339
340
|
end
|
|
340
341
|
end
|
|
341
342
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'bcdice/base'
|
|
4
|
+
|
|
3
5
|
module BCDice
|
|
4
6
|
module GameSystem
|
|
5
7
|
class SamsaraBallad < Base
|
|
@@ -59,38 +61,63 @@ module BCDice
|
|
|
59
61
|
total = 100 if total == 0
|
|
60
62
|
end
|
|
61
63
|
|
|
62
|
-
|
|
64
|
+
result = compare(total, cmd)
|
|
65
|
+
|
|
66
|
+
result_str =
|
|
67
|
+
if result.failure?
|
|
68
|
+
"失敗"
|
|
69
|
+
elsif result.success?
|
|
70
|
+
"成功"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
additional_str =
|
|
74
|
+
if result.fumble?
|
|
75
|
+
"ファンブル"
|
|
76
|
+
elsif result.critical?
|
|
77
|
+
"クリティカル"
|
|
78
|
+
end
|
|
63
79
|
|
|
64
80
|
sequence = [
|
|
65
81
|
"(D100#{cmd.cmp_op}#{cmd.target_number})",
|
|
66
82
|
places_text,
|
|
67
83
|
total.to_s,
|
|
68
|
-
|
|
84
|
+
result_str,
|
|
85
|
+
additional_str,
|
|
69
86
|
].compact
|
|
70
87
|
|
|
71
|
-
|
|
88
|
+
result.text = sequence.join(" > ")
|
|
89
|
+
|
|
90
|
+
return result
|
|
72
91
|
end
|
|
73
92
|
|
|
74
93
|
private
|
|
75
94
|
|
|
76
|
-
# @return [
|
|
77
|
-
# @return [nil]
|
|
95
|
+
# @return [Result]
|
|
78
96
|
def compare(total, cmd)
|
|
79
97
|
if [:<=, :<].include?(cmd.cmp_op)
|
|
80
98
|
if !total.send(cmd.cmp_op, cmd.target_number)
|
|
81
|
-
|
|
99
|
+
Result.failure(nil)
|
|
82
100
|
elsif fumble_?(total, cmd.fumble)
|
|
83
|
-
|
|
101
|
+
Result.new.tap do |r|
|
|
102
|
+
r.success = true
|
|
103
|
+
r.fumble = true
|
|
104
|
+
end
|
|
84
105
|
elsif critical_?(total, cmd.critical)
|
|
85
|
-
|
|
106
|
+
Result.critical(nil)
|
|
86
107
|
else
|
|
87
|
-
|
|
108
|
+
Result.success(nil)
|
|
88
109
|
end
|
|
89
110
|
elsif fumble_?(total, cmd.fumble)
|
|
90
111
|
# ファンブル優先
|
|
91
|
-
|
|
112
|
+
Result.new.tap do |r|
|
|
113
|
+
r.fumble = true
|
|
114
|
+
end
|
|
92
115
|
elsif critical_?(total, cmd.critical)
|
|
93
|
-
|
|
116
|
+
Result.new.tap do |r|
|
|
117
|
+
r.critical = true
|
|
118
|
+
end
|
|
119
|
+
else
|
|
120
|
+
Result.new
|
|
94
121
|
end
|
|
95
122
|
end
|
|
96
123
|
|