bcdice 3.0.0.pre.alpha.1
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 +7 -0
- data/.editorconfig +21 -0
- data/.github/.codecov.yaml +10 -0
- data/.github/workflows/coverage.yaml +21 -0
- data/.github/workflows/lint.yaml +13 -0
- data/.github/workflows/test.yml +20 -0
- data/.gitignore +14 -0
- data/.rubocop.yml +96 -0
- data/.rubocop_todo.yml +113 -0
- data/CHANGELOG.md +868 -0
- data/Gemfile +11 -0
- data/LICENSE +29 -0
- data/README.md +38 -0
- data/ROADMAP.md +30 -0
- data/Rakefile +118 -0
- data/bcdice.gemspec +27 -0
- data/bin/repl.rb +21 -0
- data/docs/README.txt +2028 -0
- data/docs/dicebot_sort_key.md +72 -0
- data/docs/how_to_make_dicebot.md +453 -0
- data/lib/bcdice.rb +8 -0
- data/lib/bcdice/arithmetic_evaluator.rb +167 -0
- data/lib/bcdice/base.rb +423 -0
- data/lib/bcdice/command_parser.rb +242 -0
- data/lib/bcdice/common_command.rb +23 -0
- data/lib/bcdice/common_command/add_dice.rb +54 -0
- data/lib/bcdice/common_command/add_dice/node.rb +488 -0
- data/lib/bcdice/common_command/add_dice/parser.rb +282 -0
- data/lib/bcdice/common_command/add_dice/randomizer.rb +48 -0
- data/lib/bcdice/common_command/barabara_dice.rb +57 -0
- data/lib/bcdice/common_command/calc.rb +39 -0
- data/lib/bcdice/common_command/choice.rb +35 -0
- data/lib/bcdice/common_command/d66_dice.rb +63 -0
- data/lib/bcdice/common_command/reroll_dice.rb +190 -0
- data/lib/bcdice/common_command/upper_dice.rb +165 -0
- data/lib/bcdice/common_command/version.rb +26 -0
- data/lib/bcdice/dice_table.rb +8 -0
- data/lib/bcdice/dice_table/chain_table.rb +33 -0
- data/lib/bcdice/dice_table/d66_grid_table.rb +26 -0
- data/lib/bcdice/dice_table/d66_range_table.rb +26 -0
- data/lib/bcdice/dice_table/d66_table.rb +34 -0
- data/lib/bcdice/dice_table/range_table.rb +267 -0
- data/lib/bcdice/dice_table/roll_result.rb +43 -0
- data/lib/bcdice/dice_table/sai_fic_skill_table.rb +32 -0
- data/lib/bcdice/dice_table/table.rb +35 -0
- data/lib/bcdice/enum.rb +15 -0
- data/lib/bcdice/format.rb +36 -0
- data/lib/bcdice/game_system.rb +187 -0
- data/lib/bcdice/game_system/AFF2e.rb +141 -0
- data/lib/bcdice/game_system/AceKillerGene.rb +55 -0
- data/lib/bcdice/game_system/Airgetlamh.rb +117 -0
- data/lib/bcdice/game_system/Alsetto.rb +124 -0
- data/lib/bcdice/game_system/Alshard.rb +27 -0
- data/lib/bcdice/game_system/AlterRaise.rb +282 -0
- data/lib/bcdice/game_system/Amadeus.rb +622 -0
- data/lib/bcdice/game_system/Amadeus_Korean.rb +501 -0
- data/lib/bcdice/game_system/AnimaAnimus.rb +96 -0
- data/lib/bcdice/game_system/Arianrhod.rb +50 -0
- data/lib/bcdice/game_system/ArsMagica.rb +149 -0
- data/lib/bcdice/game_system/Avandner.rb +101 -0
- data/lib/bcdice/game_system/BBN.rb +143 -0
- data/lib/bcdice/game_system/BadLife.rb +435 -0
- data/lib/bcdice/game_system/BarnaKronika.rb +188 -0
- data/lib/bcdice/game_system/BattleTech.rb +530 -0
- data/lib/bcdice/game_system/BeastBindTrinity.rb +348 -0
- data/lib/bcdice/game_system/BeginningIdol.rb +2527 -0
- data/lib/bcdice/game_system/BeginningIdol_Korean.rb +2378 -0
- data/lib/bcdice/game_system/BladeOfArcana.rb +252 -0
- data/lib/bcdice/game_system/BlindMythos.rb +460 -0
- data/lib/bcdice/game_system/BloodCrusade.rb +423 -0
- data/lib/bcdice/game_system/BloodMoon.rb +213 -0
- data/lib/bcdice/game_system/CardRanker.rb +249 -0
- data/lib/bcdice/game_system/ChaosFlare.rb +181 -0
- data/lib/bcdice/game_system/Chill.rb +163 -0
- data/lib/bcdice/game_system/Chill3.rb +52 -0
- data/lib/bcdice/game_system/CodeLayerd.rb +132 -0
- data/lib/bcdice/game_system/ColossalHunter.rb +569 -0
- data/lib/bcdice/game_system/CrashWorld.rb +81 -0
- data/lib/bcdice/game_system/Cthulhu.rb +252 -0
- data/lib/bcdice/game_system/Cthulhu7th.rb +767 -0
- data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +386 -0
- data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +383 -0
- data/lib/bcdice/game_system/CthulhuTech.rb +263 -0
- data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +243 -0
- data/lib/bcdice/game_system/Cthulhu_Korean.rb +240 -0
- data/lib/bcdice/game_system/DarkBlaze.rb +207 -0
- data/lib/bcdice/game_system/DarkDaysDrive.rb +425 -0
- data/lib/bcdice/game_system/DarkSouls.rb +91 -0
- data/lib/bcdice/game_system/DeadlineHeroes.rb +583 -0
- data/lib/bcdice/game_system/DemonParasite.rb +524 -0
- data/lib/bcdice/game_system/DetatokoSaga.rb +310 -0
- data/lib/bcdice/game_system/DetatokoSaga_Korean.rb +310 -0
- data/lib/bcdice/game_system/DiceBot.rb +17 -0
- data/lib/bcdice/game_system/DiceOfTheDead.rb +111 -0
- data/lib/bcdice/game_system/DoubleCross.rb +373 -0
- data/lib/bcdice/game_system/DoubleCross_Korean.rb +371 -0
- data/lib/bcdice/game_system/Dracurouge.rb +1856 -0
- data/lib/bcdice/game_system/Dracurouge_Korean.rb +310 -0
- data/lib/bcdice/game_system/DungeonsAndDragons.rb +19 -0
- data/lib/bcdice/game_system/EarthDawn.rb +225 -0
- data/lib/bcdice/game_system/EarthDawn3.rb +275 -0
- data/lib/bcdice/game_system/EarthDawn4.rb +272 -0
- data/lib/bcdice/game_system/EclipsePhase.rb +51 -0
- data/lib/bcdice/game_system/Elric.rb +36 -0
- data/lib/bcdice/game_system/Elysion.rb +1213 -0
- data/lib/bcdice/game_system/EmbryoMachine.rb +227 -0
- data/lib/bcdice/game_system/EndBreaker.rb +132 -0
- data/lib/bcdice/game_system/EtrianOdysseySRS.rb +27 -0
- data/lib/bcdice/game_system/Fiasco.rb +123 -0
- data/lib/bcdice/game_system/Fiasco_Korean.rb +122 -0
- data/lib/bcdice/game_system/FilledWith.rb +1543 -0
- data/lib/bcdice/game_system/FullMetalPanic.rb +27 -0
- data/lib/bcdice/game_system/FutariSousa.rb +994 -0
- data/lib/bcdice/game_system/FutariSousa_Korean.rb +994 -0
- data/lib/bcdice/game_system/Garako.rb +559 -0
- data/lib/bcdice/game_system/GardenOrder.rb +451 -0
- data/lib/bcdice/game_system/GehennaAn.rb +136 -0
- data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +120 -0
- data/lib/bcdice/game_system/GoblinSlayer.rb +168 -0
- data/lib/bcdice/game_system/GoldenSkyStories.rb +77 -0
- data/lib/bcdice/game_system/Gorilla.rb +44 -0
- data/lib/bcdice/game_system/GranCrest.rb +518 -0
- data/lib/bcdice/game_system/Gundog.rb +52 -0
- data/lib/bcdice/game_system/GundogRevised.rb +294 -0
- data/lib/bcdice/game_system/GundogZero.rb +261 -0
- data/lib/bcdice/game_system/Gurps.rb +403 -0
- data/lib/bcdice/game_system/GurpsFW.rb +2330 -0
- data/lib/bcdice/game_system/HarnMaster.rb +208 -0
- data/lib/bcdice/game_system/HatsuneMiku.rb +706 -0
- data/lib/bcdice/game_system/Hieizan.rb +48 -0
- data/lib/bcdice/game_system/HouraiGakuen.rb +270 -0
- data/lib/bcdice/game_system/HuntersMoon.rb +503 -0
- data/lib/bcdice/game_system/Illusio.rb +89 -0
- data/lib/bcdice/game_system/InfiniteFantasia.rb +51 -0
- data/lib/bcdice/game_system/Insane.rb +822 -0
- data/lib/bcdice/game_system/Insane_Korean.rb +773 -0
- data/lib/bcdice/game_system/IthaWenUa.rb +38 -0
- data/lib/bcdice/game_system/JamesBond.rb +45 -0
- data/lib/bcdice/game_system/Kamigakari.rb +394 -0
- data/lib/bcdice/game_system/Kamigakari_Korean.rb +428 -0
- data/lib/bcdice/game_system/KanColle.rb +938 -0
- data/lib/bcdice/game_system/KemonoNoMori.rb +258 -0
- data/lib/bcdice/game_system/KillDeathBusiness.rb +1420 -0
- data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +1510 -0
- data/lib/bcdice/game_system/KurayamiCrying.rb +49 -0
- data/lib/bcdice/game_system/LiveraDoll.rb +375 -0
- data/lib/bcdice/game_system/LogHorizon.rb +3567 -0
- data/lib/bcdice/game_system/LogHorizon_Korean.rb +1407 -0
- data/lib/bcdice/game_system/LostRecord.rb +30 -0
- data/lib/bcdice/game_system/LostRoyal.rb +242 -0
- data/lib/bcdice/game_system/MagicaLogia.rb +1148 -0
- data/lib/bcdice/game_system/MeikyuDays.rb +415 -0
- data/lib/bcdice/game_system/MeikyuKingdom.rb +466 -0
- data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +269 -0
- data/lib/bcdice/game_system/MetalHead.rb +249 -0
- data/lib/bcdice/game_system/MetalHeadExtream.rb +917 -0
- data/lib/bcdice/game_system/MetallicGuardian.rb +31 -0
- data/lib/bcdice/game_system/MonotoneMuseum.rb +354 -0
- data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +304 -0
- data/lib/bcdice/game_system/Nechronica.rb +211 -0
- data/lib/bcdice/game_system/Nechronica_Korean.rb +160 -0
- data/lib/bcdice/game_system/NeverCloud.rb +74 -0
- data/lib/bcdice/game_system/NightWizard.rb +231 -0
- data/lib/bcdice/game_system/NightWizard3rd.rb +24 -0
- data/lib/bcdice/game_system/NightmareHunterDeep.rb +117 -0
- data/lib/bcdice/game_system/NinjaSlayer.rb +274 -0
- data/lib/bcdice/game_system/NjslyrBattle.rb +54 -0
- data/lib/bcdice/game_system/Nuekagami.rb +293 -0
- data/lib/bcdice/game_system/OneWayHeroics.rb +134 -0
- data/lib/bcdice/game_system/OracleEngine.rb +265 -0
- data/lib/bcdice/game_system/OrgaRain.rb +77 -0
- data/lib/bcdice/game_system/Oukahoushin3rd.rb +162 -0
- data/lib/bcdice/game_system/Paradiso.rb +323 -0
- data/lib/bcdice/game_system/Paranoia.rb +64 -0
- data/lib/bcdice/game_system/ParanoiaRebooted.rb +109 -0
- data/lib/bcdice/game_system/ParasiteBlood.rb +231 -0
- data/lib/bcdice/game_system/Pathfinder.rb +21 -0
- data/lib/bcdice/game_system/Peekaboo.rb +324 -0
- data/lib/bcdice/game_system/Pendragon.rb +39 -0
- data/lib/bcdice/game_system/PhantasmAdventure.rb +73 -0
- data/lib/bcdice/game_system/Postman.rb +185 -0
- data/lib/bcdice/game_system/PulpCthulhu.rb +184 -0
- data/lib/bcdice/game_system/Raisondetre.rb +171 -0
- data/lib/bcdice/game_system/RecordOfLodossWar.rb +58 -0
- data/lib/bcdice/game_system/RecordOfSteam.rb +149 -0
- data/lib/bcdice/game_system/RokumonSekai2.rb +110 -0
- data/lib/bcdice/game_system/RoleMaster.rb +24 -0
- data/lib/bcdice/game_system/RuneQuest.rb +47 -0
- data/lib/bcdice/game_system/RyuTuber.rb +266 -0
- data/lib/bcdice/game_system/Ryutama.rb +199 -0
- data/lib/bcdice/game_system/SRS.rb +348 -0
- data/lib/bcdice/game_system/SamsaraBallad.rb +111 -0
- data/lib/bcdice/game_system/Satasupe.rb +1173 -0
- data/lib/bcdice/game_system/ScreamHighSchool.rb +128 -0
- data/lib/bcdice/game_system/SevenFortressMobius.rb +34 -0
- data/lib/bcdice/game_system/ShadowRun.rb +26 -0
- data/lib/bcdice/game_system/ShadowRun4.rb +49 -0
- data/lib/bcdice/game_system/ShadowRun5.rb +80 -0
- data/lib/bcdice/game_system/SharedFantasia.rb +69 -0
- data/lib/bcdice/game_system/ShinMegamiTenseiKakuseihen.rb +85 -0
- data/lib/bcdice/game_system/ShinkuuGakuen.rb +506 -0
- data/lib/bcdice/game_system/ShinobiGami.rb +680 -0
- data/lib/bcdice/game_system/ShoujoTenrankai.rb +677 -0
- data/lib/bcdice/game_system/Skynauts.rb +324 -0
- data/lib/bcdice/game_system/SteamPunkers.rb +485 -0
- data/lib/bcdice/game_system/StellarKnights.rb +856 -0
- data/lib/bcdice/game_system/SterileLife.rb +452 -0
- data/lib/bcdice/game_system/StrangerOfSwordCity.rb +103 -0
- data/lib/bcdice/game_system/StratoShout.rb +316 -0
- data/lib/bcdice/game_system/StratoShout_Korean.rb +314 -0
- data/lib/bcdice/game_system/Strave.rb +223 -0
- data/lib/bcdice/game_system/SwordWorld.rb +491 -0
- data/lib/bcdice/game_system/SwordWorld2_0.rb +295 -0
- data/lib/bcdice/game_system/SwordWorld2_5.rb +121 -0
- data/lib/bcdice/game_system/TherapieSein.rb +93 -0
- data/lib/bcdice/game_system/TokumeiTenkousei.rb +96 -0
- data/lib/bcdice/game_system/TokyoGhostResearch.rb +122 -0
- data/lib/bcdice/game_system/TokyoNova.rb +19 -0
- data/lib/bcdice/game_system/Torg.rb +364 -0
- data/lib/bcdice/game_system/Torg1_5.rb +139 -0
- data/lib/bcdice/game_system/TorgEternity.rb +414 -0
- data/lib/bcdice/game_system/TrinitySeven.rb +364 -0
- data/lib/bcdice/game_system/TunnelsAndTrolls.rb +287 -0
- data/lib/bcdice/game_system/TwilightGunsmoke.rb +527 -0
- data/lib/bcdice/game_system/Utakaze.rb +153 -0
- data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +132 -0
- data/lib/bcdice/game_system/Villaciel.rb +555 -0
- data/lib/bcdice/game_system/WARPS.rb +33 -0
- data/lib/bcdice/game_system/WaresBlade.rb +34 -0
- data/lib/bcdice/game_system/Warhammer.rb +336 -0
- data/lib/bcdice/game_system/WitchQuest.rb +275 -0
- data/lib/bcdice/game_system/WorldOfDarkness.rb +135 -0
- data/lib/bcdice/game_system/YankeeYogSothoth.rb +440 -0
- data/lib/bcdice/game_system/YearZeroEngine.rb +134 -0
- data/lib/bcdice/game_system/ZettaiReido.rb +142 -0
- data/lib/bcdice/game_system/meikyu_kingdom/item_table.rb +383 -0
- data/lib/bcdice/game_system/meikyu_kingdom/kingdom_name_table.rb +89 -0
- data/lib/bcdice/game_system/meikyu_kingdom/landscape_table.rb +196 -0
- data/lib/bcdice/game_system/meikyu_kingdom/name_tables.rb +223 -0
- data/lib/bcdice/game_system/meikyu_kingdom/placename_table.rb +214 -0
- data/lib/bcdice/game_system/meikyu_kingdom/tables.rb +610 -0
- data/lib/bcdice/game_system/meikyu_kingdom/word_table.rb +117 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/item_table.rb +380 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +184 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/name_table.rb +417 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +912 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/word_table.rb +121 -0
- data/lib/bcdice/game_system/one_way_heroics/dungeon_table.rb +67 -0
- data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +166 -0
- data/lib/bcdice/game_system/one_way_heroics/tables.rb +668 -0
- data/lib/bcdice/loader.rb +37 -0
- data/lib/bcdice/normalize.rb +38 -0
- data/lib/bcdice/preprocessor.rb +87 -0
- data/lib/bcdice/randomizer.rb +137 -0
- data/lib/bcdice/repl.rb +155 -0
- data/lib/bcdice/user_defined_dice_table.rb +153 -0
- data/lib/bcdice/version.rb +3 -0
- metadata +304 -0
@@ -0,0 +1,295 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bcdice/arithmetic_evaluator'
|
4
|
+
|
5
|
+
require 'bcdice/game_system/SwordWorld'
|
6
|
+
|
7
|
+
module BCDice
|
8
|
+
module GameSystem
|
9
|
+
class SwordWorld2_0 < SwordWorld
|
10
|
+
# ゲームシステムの識別子
|
11
|
+
ID = 'SwordWorld2.0'
|
12
|
+
|
13
|
+
# ゲームシステム名
|
14
|
+
NAME = 'ソードワールド2.0'
|
15
|
+
|
16
|
+
# ゲームシステム名の読みがな
|
17
|
+
SORT_KEY = 'そおとわあると2.0'
|
18
|
+
|
19
|
+
# ダイスボットの使い方
|
20
|
+
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
21
|
+
自動的成功、成功、失敗、自動的失敗の自動判定を行います。
|
22
|
+
|
23
|
+
・レーティング表 (Kx)
|
24
|
+
"Kキーナンバー+ボーナス"の形で記入します。
|
25
|
+
ボーナスの部分に「K20+K30」のようにレーティングを取ることは出来ません。
|
26
|
+
また、ボーナスは複数取ることが出来ます。
|
27
|
+
レーティング表もダイスロールと同様に、他のプレイヤーに隠れてロールすることも可能です。
|
28
|
+
例)K20 K10+5 k30 k10+10 Sk10-1 k10+5+2
|
29
|
+
|
30
|
+
・クリティカル値の設定
|
31
|
+
クリティカル値は"[クリティカル値]"で指定します。
|
32
|
+
指定しない場合はクリティカル値10とします。
|
33
|
+
クリティカル処理が必要ないときは13などとしてください。(防御時などの対応)
|
34
|
+
またタイプの軽減化のために末尾に「@クリティカル値」でも処理するようにしました。
|
35
|
+
例)K20[10] K10+5[9] k30[10] k10[9]+10 k10-5@9
|
36
|
+
|
37
|
+
・レーティング表の半減 (HKx)
|
38
|
+
レーティング表の先頭または末尾に"H"をつけると、レーティング表を振って最終結果を半減させます。
|
39
|
+
クリティカル値を指定しない場合、クリティカルなしと扱われます。
|
40
|
+
例)HK20 K20h HK10-5@9 K10-5@9H K20gfH
|
41
|
+
|
42
|
+
・ダイス目の修正(運命変転やクリティカルレイ用)
|
43
|
+
末尾に「$修正値」でダイス目に修正がかかります。
|
44
|
+
$+1と修正表記ならダイス目に+修正、$9のように固定値ならダイス目をその出目に差し替え。
|
45
|
+
クリティカルした場合でも固定値や修正値の適用は最初の一回だけです。
|
46
|
+
例)K20$+1 K10+5$9 k10-5@9$+2 k10[9]+10$9
|
47
|
+
|
48
|
+
・首切り刀用レーティング上昇 r10
|
49
|
+
例)K20r10 K30+24@8R10 K40+24@8$12r10
|
50
|
+
|
51
|
+
・グレイテストフォーチュンは末尾に gf
|
52
|
+
例)K20gf K30+24@8GF K40+24@8$12r10gf
|
53
|
+
|
54
|
+
・超越判定用に2d6ロールに 2D6@10 書式でクリティカル値付与が可能に。
|
55
|
+
例)2D6@10 2D6@10+11>=30
|
56
|
+
|
57
|
+
・成長 (Gr)
|
58
|
+
末尾に数字を付加することで、複数回の成長をまとめて行えます。
|
59
|
+
例)Gr3
|
60
|
+
|
61
|
+
・防御ファンブル表 (FT)
|
62
|
+
防御ファンブル表を出すことができます。
|
63
|
+
|
64
|
+
・絡み効果表 (TT)
|
65
|
+
絡み効果表を出すことができます。
|
66
|
+
INFO_MESSAGE_TEXT
|
67
|
+
|
68
|
+
register_prefix(['H?K\d+.*', 'Gr(\d+)?', '2D6?@\d+.*', 'FT', 'TT'])
|
69
|
+
|
70
|
+
# 超越判定のノード
|
71
|
+
class TranscendentTest
|
72
|
+
# @param [Integer] critical_value クリティカル値
|
73
|
+
# @param [Integer] modifier 修正値
|
74
|
+
# @param [String, nil] cmp_op 比較演算子(> または >=)
|
75
|
+
# @param [Integer, nil] target 目標値
|
76
|
+
def initialize(critical_value, modifier, cmp_op, target)
|
77
|
+
@critical_value = critical_value
|
78
|
+
@modifier = modifier
|
79
|
+
@cmp_op = cmp_op
|
80
|
+
@target = target
|
81
|
+
|
82
|
+
@modifier_str = Format.modifier(@modifier)
|
83
|
+
@expression = node_expression()
|
84
|
+
end
|
85
|
+
|
86
|
+
# 超越判定を行う
|
87
|
+
# @param randomizer [Randomizer]
|
88
|
+
# @return [String]
|
89
|
+
def execute(randomizer)
|
90
|
+
if @critical_value < 3
|
91
|
+
return "(#{@expression}) > クリティカル値が小さすぎます。3以上を指定してください。"
|
92
|
+
end
|
93
|
+
|
94
|
+
first_value_group = randomizer.roll_barabara(2, 6)
|
95
|
+
value_groups = [first_value_group]
|
96
|
+
|
97
|
+
fumble = first_value_group == [1, 1]
|
98
|
+
critical = first_value_group == [6, 6]
|
99
|
+
|
100
|
+
if !fumble && !critical
|
101
|
+
while sum_of_dice(value_groups.last) >= @critical_value
|
102
|
+
value_groups.push(randomizer.roll_barabara(2, 6))
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
sum = sum_of_dice(value_groups)
|
107
|
+
total_sum = sum + @modifier
|
108
|
+
|
109
|
+
parts = [
|
110
|
+
"(#{@expression})",
|
111
|
+
"#{dice_str(value_groups, sum)}#{@modifier_str}",
|
112
|
+
total_sum,
|
113
|
+
@target && result_str(total_sum, value_groups.length, fumble, critical)
|
114
|
+
].compact
|
115
|
+
|
116
|
+
return parts.join(' > ')
|
117
|
+
end
|
118
|
+
|
119
|
+
private
|
120
|
+
|
121
|
+
# 数式表記を返す
|
122
|
+
# @return [String]
|
123
|
+
def node_expression
|
124
|
+
lhs = "2D6@#{@critical_value}#{@modifier_str}"
|
125
|
+
|
126
|
+
return @target ? "#{lhs}#{@cmp_op}#{@target}" : lhs
|
127
|
+
end
|
128
|
+
|
129
|
+
# 出目の合計を返す
|
130
|
+
# @param [(Integer, Integer), Array<(Integer, Integer)>] value_groups
|
131
|
+
# 出目のグループまたはその配列
|
132
|
+
# @return [Integer]
|
133
|
+
def sum_of_dice(value_groups)
|
134
|
+
# TODO: Ruby 2.4以降では Array#sum が使える
|
135
|
+
value_groups.flatten.reduce(0, &:+)
|
136
|
+
end
|
137
|
+
|
138
|
+
# ダイス部分の文字列を返す
|
139
|
+
# @param [Array<(Integer, Integer)>] value_groups 出目のグループの配列
|
140
|
+
# @param [Integer] sum 出目の合計
|
141
|
+
# @return [String]
|
142
|
+
def dice_str(value_groups, sum)
|
143
|
+
value_groups_str =
|
144
|
+
value_groups
|
145
|
+
.map { |values| "[#{values.join(',')}]" }
|
146
|
+
.join
|
147
|
+
|
148
|
+
return "#{sum}#{value_groups_str}"
|
149
|
+
end
|
150
|
+
|
151
|
+
# 判定結果の文字列を返す
|
152
|
+
# @param [Integer] total_sum 合計値
|
153
|
+
# @param [Integer] n_value_groups 出目のグループの数
|
154
|
+
# @param [Boolean] fumble ファンブルかどうか
|
155
|
+
# @param [Boolean] critical クリティカルかどうか
|
156
|
+
# @return [String]
|
157
|
+
def result_str(total_sum, n_value_groups, fumble, critical)
|
158
|
+
return '自動的失敗' if fumble
|
159
|
+
return '自動的成功' if critical
|
160
|
+
|
161
|
+
if total_sum.send(@cmp_op, @target)
|
162
|
+
# 振り足しが行われ、合計値が41以上ならば「超成功」
|
163
|
+
n_value_groups >= 2 && total_sum >= 41 ? '超成功' : '成功'
|
164
|
+
else
|
165
|
+
'失敗'
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def initialize(command)
|
171
|
+
super(command)
|
172
|
+
@rating_table = 2
|
173
|
+
end
|
174
|
+
|
175
|
+
# 超越判定のパターン
|
176
|
+
TRANSCENDENT_TEST_RE = /\A2D6?@(\d+)([-+\d]+)?(?:(>=?)(\d+))?/.freeze
|
177
|
+
|
178
|
+
def eval_game_system_specific_command(command)
|
179
|
+
case command
|
180
|
+
when /^Gr(\d+)?/i
|
181
|
+
if command =~ /^Gr(\d+)/i
|
182
|
+
growth(Regexp.last_match(1).to_i)
|
183
|
+
else
|
184
|
+
growth
|
185
|
+
end
|
186
|
+
when TRANSCENDENT_TEST_RE
|
187
|
+
m = Regexp.last_match
|
188
|
+
|
189
|
+
critical_value = m[1].to_i
|
190
|
+
modifier = m[2] ? ArithmeticEvaluator.eval(m[2]) : 0
|
191
|
+
cmp_op = m[3]
|
192
|
+
target = m[3] && m[4].to_i
|
193
|
+
|
194
|
+
node = TranscendentTest.new(critical_value, modifier, cmp_op, target)
|
195
|
+
node.execute(@randomizer)
|
196
|
+
when 'FT'
|
197
|
+
get_fumble_table
|
198
|
+
when 'TT'
|
199
|
+
get_tangle_table
|
200
|
+
else
|
201
|
+
super(command)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def getRateUpFromString(string)
|
206
|
+
rateUp = 0
|
207
|
+
|
208
|
+
regexp = /r\[(\d+)\]/i
|
209
|
+
if (m = regexp.match(string))
|
210
|
+
rateUp = m[1].to_i
|
211
|
+
string = string.gsub(regexp, '')
|
212
|
+
end
|
213
|
+
|
214
|
+
return rateUp, string
|
215
|
+
end
|
216
|
+
|
217
|
+
def getAdditionalString(string, output)
|
218
|
+
output, values = super(string, output)
|
219
|
+
|
220
|
+
isGratestFortune, = getGratestFortuneFromString(string)
|
221
|
+
|
222
|
+
values['isGratestFortune'] = isGratestFortune
|
223
|
+
output += "gf" if isGratestFortune
|
224
|
+
|
225
|
+
return output, values
|
226
|
+
end
|
227
|
+
|
228
|
+
def rollDice(values)
|
229
|
+
unless values['isGratestFortune']
|
230
|
+
return super(values)
|
231
|
+
end
|
232
|
+
|
233
|
+
dice = @randomizer.roll_once(6)
|
234
|
+
|
235
|
+
return dice * 2, "#{dice},#{dice}"
|
236
|
+
end
|
237
|
+
|
238
|
+
def getGratestFortuneFromString(string)
|
239
|
+
isGratestFortune = false
|
240
|
+
|
241
|
+
regexp = /gf/i
|
242
|
+
if regexp.match?(string)
|
243
|
+
isGratestFortune = true
|
244
|
+
string = string.gsub(regexp, '')
|
245
|
+
end
|
246
|
+
|
247
|
+
return isGratestFortune, string
|
248
|
+
end
|
249
|
+
|
250
|
+
def growth(count = 1)
|
251
|
+
((1..count).map { growth_step }).join " | "
|
252
|
+
end
|
253
|
+
|
254
|
+
def growth_step
|
255
|
+
d1 = @randomizer.roll_once(6)
|
256
|
+
d2 = @randomizer.roll_once(6)
|
257
|
+
|
258
|
+
a1 = get_ability_by_dice(d1)
|
259
|
+
a2 = get_ability_by_dice(d2)
|
260
|
+
|
261
|
+
return a1 != a2 ? "[#{d1},#{d2}]->(#{a1} or #{a2})" : "[#{d1},#{d2}]->(#{a1})"
|
262
|
+
end
|
263
|
+
|
264
|
+
def get_ability_by_dice(dice)
|
265
|
+
['器用度', '敏捷度', '筋力', '生命力', '知力', '精神力'][dice - 1]
|
266
|
+
end
|
267
|
+
|
268
|
+
def get_fumble_table()
|
269
|
+
table = [
|
270
|
+
'この表を2回振り、その両方を適用する。(同じ出目による影響は累積しない)。この自動失敗により得られる経験点は、+50点される',
|
271
|
+
'ダメージに、攻撃者を強化している「剣のかけら」の数が追加される',
|
272
|
+
'ダメージに、攻撃者の「レベル」が追加される',
|
273
|
+
'ダメージ決定を2回行い、より高い方を採用する',
|
274
|
+
'合算ダメージを2倍する',
|
275
|
+
'防護点無効'
|
276
|
+
]
|
277
|
+
text, num = get_table_by_1d6(table)
|
278
|
+
return "防御ファンブル表(#{num}) → #{text}"
|
279
|
+
end
|
280
|
+
|
281
|
+
def get_tangle_table()
|
282
|
+
table = [
|
283
|
+
'頭や顔:牙や噛みつきなどにおける命中力判定及び、魔法の行使やブレスに-2のペナルティ修正を受ける',
|
284
|
+
'武器や盾:武器の使用不可、又は盾の回避力修正及び防護点を無効化する',
|
285
|
+
'腕や手:武器や爪などにおける命中力判定に-2のペナルティ修正、盾を持つ腕方の腕ならその盾の回避力修正及び防護点を無効化する',
|
286
|
+
'脚や足:移動不可、更に回避力判定に-2のペナルティ修正を受ける ※両足に絡んでも累積しない',
|
287
|
+
'胴体:生命・精神抵抗力を基準値に用いる判定を除き、あらゆる行為判定に-1のペナルティ修正を受ける',
|
288
|
+
'特殊:尻尾や翼などに命中。絡められた部位を使用する判定において-2のペナルティ修正、またはそこが使えていたことによるボーナス修正を失う ※存在しない場合は決め直し'
|
289
|
+
]
|
290
|
+
text, num = get_table_by_1d6(table)
|
291
|
+
return "絡み効果表(#{num}) → #{text}"
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bcdice/game_system/SwordWorld2_0'
|
4
|
+
|
5
|
+
module BCDice
|
6
|
+
module GameSystem
|
7
|
+
class SwordWorld2_5 < SwordWorld2_0
|
8
|
+
# ゲームシステムの識別子
|
9
|
+
ID = 'SwordWorld2.5'
|
10
|
+
|
11
|
+
# ゲームシステム名
|
12
|
+
NAME = 'ソードワールド2.5'
|
13
|
+
|
14
|
+
# ゲームシステム名の読みがな
|
15
|
+
SORT_KEY = 'そおとわあると2.5'
|
16
|
+
|
17
|
+
# ダイスボットの使い方
|
18
|
+
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
19
|
+
自動的成功、成功、失敗、自動的失敗の自動判定を行います。
|
20
|
+
|
21
|
+
・レーティング表 (Kx)
|
22
|
+
"Kキーナンバー+ボーナス"の形で記入します。
|
23
|
+
ボーナスの部分に「K20+K30」のようにレーティングを取ることは出来ません。
|
24
|
+
また、ボーナスは複数取ることが出来ます。
|
25
|
+
レーティング表もダイスロールと同様に、他のプレイヤーに隠れてロールすることも可能です。
|
26
|
+
例)K20 K10+5 k30 k10+10 Sk10-1 k10+5+2
|
27
|
+
|
28
|
+
・クリティカル値の設定
|
29
|
+
クリティカル値は"[クリティカル値]"で指定します。
|
30
|
+
指定しない場合はクリティカル値10とします。
|
31
|
+
クリティカル処理が必要ないときは13などとしてください。(防御時などの対応)
|
32
|
+
またタイプの軽減化のために末尾に「@クリティカル値」でも処理するようにしました。
|
33
|
+
例)K20[10] K10+5[9] k30[10] k10[9]+10 k10-5@9
|
34
|
+
|
35
|
+
・レーティング表の半減 (HKx)
|
36
|
+
レーティング表の先頭または末尾に"H"をつけると、レーティング表を振って最終結果を半減させます。
|
37
|
+
クリティカル値を指定しない場合、クリティカルなしと扱われます。
|
38
|
+
例)HK20 K20h HK10-5@9 K10-5@9H K20gfH
|
39
|
+
|
40
|
+
・ダイス目の修正(運命変転やクリティカルレイ用)
|
41
|
+
末尾に「$修正値」でダイス目に修正がかかります。
|
42
|
+
$+1と修正表記ならダイス目に+修正、$9のように固定値ならダイス目をその出目に差し替え。
|
43
|
+
クリティカルした場合でも固定値や修正値の適用は最初の一回だけです。
|
44
|
+
例)K20$+1 K10+5$9 k10-5@9$+2 k10[9]+10$9
|
45
|
+
|
46
|
+
・ダイス目の修正(必殺攻撃用)
|
47
|
+
「#修正値」でダイス目に修正がかかります。
|
48
|
+
クリティカルした場合でも修正値の適用は継続されます。
|
49
|
+
例)K20#1 k10-5@9#2
|
50
|
+
|
51
|
+
・首切り刀用レーティング上昇 r5
|
52
|
+
例)K20r5 K30+24@8R5 K40+24@8$12r5
|
53
|
+
|
54
|
+
・グレイテストフォーチュンは末尾に gf
|
55
|
+
例)K20gf K30+24@8GF K40+24@8$12r5gf
|
56
|
+
|
57
|
+
・超越判定用に2d6ロールに 2D6@10 書式でクリティカル値付与が可能に。
|
58
|
+
例)2D6@10 2D6@10+11>=30
|
59
|
+
|
60
|
+
・成長 (Gr)
|
61
|
+
末尾に数字を付加することで、複数回の成長をまとめて行えます。
|
62
|
+
例)Gr3
|
63
|
+
|
64
|
+
・防御ファンブル表 (FT)
|
65
|
+
防御ファンブル表を出すことができます。
|
66
|
+
|
67
|
+
・絡み効果表 (TT)
|
68
|
+
絡み効果表を出すことができます。
|
69
|
+
INFO_MESSAGE_TEXT
|
70
|
+
|
71
|
+
register_prefix(['H?K\d+.*', 'Gr(\d+)?', '2D6?@\d+.*', 'FT', 'TT'])
|
72
|
+
|
73
|
+
# コマンド実行前にメッセージを置換する
|
74
|
+
# @param [String] string 受信したメッセージ
|
75
|
+
# @return [String]
|
76
|
+
def replace_text(string)
|
77
|
+
# TODO: Ruby 2.4以降では Regexp#match? を使うこと
|
78
|
+
return string unless RATING_TABLE_RE_FOR_CHANGE_TEXT.match(string)
|
79
|
+
|
80
|
+
super(string).gsub(/#([-+]?\d+)/) do
|
81
|
+
modifier = Regexp.last_match(1).to_i
|
82
|
+
"a[#{Format.modifier(modifier)}]"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def getRatingCommandStrings
|
87
|
+
super + "aA"
|
88
|
+
end
|
89
|
+
|
90
|
+
def getAdditionalString(string, output)
|
91
|
+
output, values = super(string, output)
|
92
|
+
|
93
|
+
keptDiceChangeModify, = getKeptDiceChangesFromString(string)
|
94
|
+
|
95
|
+
values['keptDiceChangeModify'] = keptDiceChangeModify
|
96
|
+
output += "a[#{keptDiceChangeModify}]" if keptDiceChangeModify != 0
|
97
|
+
|
98
|
+
return output, values
|
99
|
+
end
|
100
|
+
|
101
|
+
def getAdditionalDiceValue(dice, values)
|
102
|
+
keptDiceChangeModify = values['keptDiceChangeModify'].to_i
|
103
|
+
|
104
|
+
value = 0
|
105
|
+
value += keptDiceChangeModify.to_i if (keptDiceChangeModify != 0) && (dice != 2)
|
106
|
+
|
107
|
+
return value
|
108
|
+
end
|
109
|
+
|
110
|
+
def getKeptDiceChangesFromString(string)
|
111
|
+
keptDiceChangeModify = 0
|
112
|
+
regexp = /a\[([\+\-]\d+)\]/i
|
113
|
+
if regexp =~ string
|
114
|
+
keptDiceChangeModify = Regexp.last_match(1)
|
115
|
+
string = string.gsub(regexp, '')
|
116
|
+
end
|
117
|
+
return keptDiceChangeModify, string
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class TherapieSein < Base
|
6
|
+
# ゲームシステムの識別子
|
7
|
+
ID = 'TherapieSein'
|
8
|
+
|
9
|
+
# ゲームシステム名
|
10
|
+
NAME = 'セラフィザイン'
|
11
|
+
|
12
|
+
# ゲームシステム名の読みがな
|
13
|
+
SORT_KEY = 'せらふいさいん'
|
14
|
+
|
15
|
+
# ダイスボットの使い方
|
16
|
+
HELP_MESSAGE = <<~MESSAGETEXT
|
17
|
+
・一般判定:TS[n][±m][@t] []内のコマンドは省略可能。クリティカル無。
|
18
|
+
・戦闘判定:OP[n][±m][@t] []内のコマンドは省略可能。クリティカル有。
|
19
|
+
|
20
|
+
「n」で能力値修正などを指定。
|
21
|
+
「±m」で達成値への修正値を追加指定。+5+1-3のように、複数指定も可能です。
|
22
|
+
「@t」で目標値を指定。省略時は達成値のみ表示、指定時は判定の正否を追加表示。
|
23
|
+
|
24
|
+
【書式例】
|
25
|
+
・TS → ダイスの合計値を達成値として表示。
|
26
|
+
・TS4 → ダイス合計+4を達成値表示。
|
27
|
+
・TS4-1 → ダイス合計+4-1(計+3)を達成値表示。
|
28
|
+
・TS2+1@10 → ダイス合計+2+1(計+3)の達成値と、判定の成否を表示。
|
29
|
+
・OP4+3+1 → ダイス合計+4+3+1(計+8)を達成値&クリティカル表示。
|
30
|
+
・OP3@12 → ダイス合計+3の達成値&クリティカル、判定の成否を表示。
|
31
|
+
MESSAGETEXT
|
32
|
+
|
33
|
+
register_prefix(['(TS|OP)(\d+)?([\+\-]\d)*(\@\d+)?'])
|
34
|
+
|
35
|
+
def eval_game_system_specific_command(command)
|
36
|
+
output =
|
37
|
+
case command.upcase
|
38
|
+
|
39
|
+
when /(TS|OP)(\d+)?(([\+\-]\d+)*)(\@(\d+))?$/i
|
40
|
+
hasCritical = (Regexp.last_match(1) == "OP")
|
41
|
+
target = (Regexp.last_match(6) || 0).to_i
|
42
|
+
modify = (Regexp.last_match(2) || 0).to_i
|
43
|
+
modifyAddString = Regexp.last_match(3)
|
44
|
+
|
45
|
+
modify_list = modifyAddString.scan(/[\+\-]\d+/) # 修正値を分割して配列へ
|
46
|
+
modify_list.each { |i| modify += i.to_i }
|
47
|
+
|
48
|
+
checkRoll(hasCritical, modify, target)
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
return output
|
53
|
+
end
|
54
|
+
|
55
|
+
def checkRoll(hasCritical, modify, target)
|
56
|
+
dice_list = @randomizer.roll_barabara(2, 6)
|
57
|
+
dice = dice_list.sum()
|
58
|
+
diceText = dice_list.join(",")
|
59
|
+
successValue = dice + modify
|
60
|
+
|
61
|
+
modifyText = getValueText(modify)
|
62
|
+
targetText = (target == 0 ? '' : ">=#{target}")
|
63
|
+
|
64
|
+
result = "(2D6#{modifyText}#{targetText})"
|
65
|
+
result += " > #{dice}(#{diceText})#{modifyText}"
|
66
|
+
|
67
|
+
if hasCritical && (dice == 12)
|
68
|
+
result += " > クリティカル!"
|
69
|
+
return result
|
70
|
+
end
|
71
|
+
|
72
|
+
result += " > #{successValue}#{targetText}"
|
73
|
+
|
74
|
+
return result if target == 0
|
75
|
+
|
76
|
+
if successValue >= target
|
77
|
+
result += " > 【成功】"
|
78
|
+
else
|
79
|
+
result += " > 【失敗】"
|
80
|
+
end
|
81
|
+
|
82
|
+
return result
|
83
|
+
end
|
84
|
+
|
85
|
+
def getValueText(value)
|
86
|
+
return "" if value == 0
|
87
|
+
return value.to_s if value < 0
|
88
|
+
|
89
|
+
return "\+#{value}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|