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.
Files changed (258) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +21 -0
  3. data/.github/.codecov.yaml +10 -0
  4. data/.github/workflows/coverage.yaml +21 -0
  5. data/.github/workflows/lint.yaml +13 -0
  6. data/.github/workflows/test.yml +20 -0
  7. data/.gitignore +14 -0
  8. data/.rubocop.yml +96 -0
  9. data/.rubocop_todo.yml +113 -0
  10. data/CHANGELOG.md +868 -0
  11. data/Gemfile +11 -0
  12. data/LICENSE +29 -0
  13. data/README.md +38 -0
  14. data/ROADMAP.md +30 -0
  15. data/Rakefile +118 -0
  16. data/bcdice.gemspec +27 -0
  17. data/bin/repl.rb +21 -0
  18. data/docs/README.txt +2028 -0
  19. data/docs/dicebot_sort_key.md +72 -0
  20. data/docs/how_to_make_dicebot.md +453 -0
  21. data/lib/bcdice.rb +8 -0
  22. data/lib/bcdice/arithmetic_evaluator.rb +167 -0
  23. data/lib/bcdice/base.rb +423 -0
  24. data/lib/bcdice/command_parser.rb +242 -0
  25. data/lib/bcdice/common_command.rb +23 -0
  26. data/lib/bcdice/common_command/add_dice.rb +54 -0
  27. data/lib/bcdice/common_command/add_dice/node.rb +488 -0
  28. data/lib/bcdice/common_command/add_dice/parser.rb +282 -0
  29. data/lib/bcdice/common_command/add_dice/randomizer.rb +48 -0
  30. data/lib/bcdice/common_command/barabara_dice.rb +57 -0
  31. data/lib/bcdice/common_command/calc.rb +39 -0
  32. data/lib/bcdice/common_command/choice.rb +35 -0
  33. data/lib/bcdice/common_command/d66_dice.rb +63 -0
  34. data/lib/bcdice/common_command/reroll_dice.rb +190 -0
  35. data/lib/bcdice/common_command/upper_dice.rb +165 -0
  36. data/lib/bcdice/common_command/version.rb +26 -0
  37. data/lib/bcdice/dice_table.rb +8 -0
  38. data/lib/bcdice/dice_table/chain_table.rb +33 -0
  39. data/lib/bcdice/dice_table/d66_grid_table.rb +26 -0
  40. data/lib/bcdice/dice_table/d66_range_table.rb +26 -0
  41. data/lib/bcdice/dice_table/d66_table.rb +34 -0
  42. data/lib/bcdice/dice_table/range_table.rb +267 -0
  43. data/lib/bcdice/dice_table/roll_result.rb +43 -0
  44. data/lib/bcdice/dice_table/sai_fic_skill_table.rb +32 -0
  45. data/lib/bcdice/dice_table/table.rb +35 -0
  46. data/lib/bcdice/enum.rb +15 -0
  47. data/lib/bcdice/format.rb +36 -0
  48. data/lib/bcdice/game_system.rb +187 -0
  49. data/lib/bcdice/game_system/AFF2e.rb +141 -0
  50. data/lib/bcdice/game_system/AceKillerGene.rb +55 -0
  51. data/lib/bcdice/game_system/Airgetlamh.rb +117 -0
  52. data/lib/bcdice/game_system/Alsetto.rb +124 -0
  53. data/lib/bcdice/game_system/Alshard.rb +27 -0
  54. data/lib/bcdice/game_system/AlterRaise.rb +282 -0
  55. data/lib/bcdice/game_system/Amadeus.rb +622 -0
  56. data/lib/bcdice/game_system/Amadeus_Korean.rb +501 -0
  57. data/lib/bcdice/game_system/AnimaAnimus.rb +96 -0
  58. data/lib/bcdice/game_system/Arianrhod.rb +50 -0
  59. data/lib/bcdice/game_system/ArsMagica.rb +149 -0
  60. data/lib/bcdice/game_system/Avandner.rb +101 -0
  61. data/lib/bcdice/game_system/BBN.rb +143 -0
  62. data/lib/bcdice/game_system/BadLife.rb +435 -0
  63. data/lib/bcdice/game_system/BarnaKronika.rb +188 -0
  64. data/lib/bcdice/game_system/BattleTech.rb +530 -0
  65. data/lib/bcdice/game_system/BeastBindTrinity.rb +348 -0
  66. data/lib/bcdice/game_system/BeginningIdol.rb +2527 -0
  67. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +2378 -0
  68. data/lib/bcdice/game_system/BladeOfArcana.rb +252 -0
  69. data/lib/bcdice/game_system/BlindMythos.rb +460 -0
  70. data/lib/bcdice/game_system/BloodCrusade.rb +423 -0
  71. data/lib/bcdice/game_system/BloodMoon.rb +213 -0
  72. data/lib/bcdice/game_system/CardRanker.rb +249 -0
  73. data/lib/bcdice/game_system/ChaosFlare.rb +181 -0
  74. data/lib/bcdice/game_system/Chill.rb +163 -0
  75. data/lib/bcdice/game_system/Chill3.rb +52 -0
  76. data/lib/bcdice/game_system/CodeLayerd.rb +132 -0
  77. data/lib/bcdice/game_system/ColossalHunter.rb +569 -0
  78. data/lib/bcdice/game_system/CrashWorld.rb +81 -0
  79. data/lib/bcdice/game_system/Cthulhu.rb +252 -0
  80. data/lib/bcdice/game_system/Cthulhu7th.rb +767 -0
  81. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +386 -0
  82. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +383 -0
  83. data/lib/bcdice/game_system/CthulhuTech.rb +263 -0
  84. data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +243 -0
  85. data/lib/bcdice/game_system/Cthulhu_Korean.rb +240 -0
  86. data/lib/bcdice/game_system/DarkBlaze.rb +207 -0
  87. data/lib/bcdice/game_system/DarkDaysDrive.rb +425 -0
  88. data/lib/bcdice/game_system/DarkSouls.rb +91 -0
  89. data/lib/bcdice/game_system/DeadlineHeroes.rb +583 -0
  90. data/lib/bcdice/game_system/DemonParasite.rb +524 -0
  91. data/lib/bcdice/game_system/DetatokoSaga.rb +310 -0
  92. data/lib/bcdice/game_system/DetatokoSaga_Korean.rb +310 -0
  93. data/lib/bcdice/game_system/DiceBot.rb +17 -0
  94. data/lib/bcdice/game_system/DiceOfTheDead.rb +111 -0
  95. data/lib/bcdice/game_system/DoubleCross.rb +373 -0
  96. data/lib/bcdice/game_system/DoubleCross_Korean.rb +371 -0
  97. data/lib/bcdice/game_system/Dracurouge.rb +1856 -0
  98. data/lib/bcdice/game_system/Dracurouge_Korean.rb +310 -0
  99. data/lib/bcdice/game_system/DungeonsAndDragons.rb +19 -0
  100. data/lib/bcdice/game_system/EarthDawn.rb +225 -0
  101. data/lib/bcdice/game_system/EarthDawn3.rb +275 -0
  102. data/lib/bcdice/game_system/EarthDawn4.rb +272 -0
  103. data/lib/bcdice/game_system/EclipsePhase.rb +51 -0
  104. data/lib/bcdice/game_system/Elric.rb +36 -0
  105. data/lib/bcdice/game_system/Elysion.rb +1213 -0
  106. data/lib/bcdice/game_system/EmbryoMachine.rb +227 -0
  107. data/lib/bcdice/game_system/EndBreaker.rb +132 -0
  108. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +27 -0
  109. data/lib/bcdice/game_system/Fiasco.rb +123 -0
  110. data/lib/bcdice/game_system/Fiasco_Korean.rb +122 -0
  111. data/lib/bcdice/game_system/FilledWith.rb +1543 -0
  112. data/lib/bcdice/game_system/FullMetalPanic.rb +27 -0
  113. data/lib/bcdice/game_system/FutariSousa.rb +994 -0
  114. data/lib/bcdice/game_system/FutariSousa_Korean.rb +994 -0
  115. data/lib/bcdice/game_system/Garako.rb +559 -0
  116. data/lib/bcdice/game_system/GardenOrder.rb +451 -0
  117. data/lib/bcdice/game_system/GehennaAn.rb +136 -0
  118. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +120 -0
  119. data/lib/bcdice/game_system/GoblinSlayer.rb +168 -0
  120. data/lib/bcdice/game_system/GoldenSkyStories.rb +77 -0
  121. data/lib/bcdice/game_system/Gorilla.rb +44 -0
  122. data/lib/bcdice/game_system/GranCrest.rb +518 -0
  123. data/lib/bcdice/game_system/Gundog.rb +52 -0
  124. data/lib/bcdice/game_system/GundogRevised.rb +294 -0
  125. data/lib/bcdice/game_system/GundogZero.rb +261 -0
  126. data/lib/bcdice/game_system/Gurps.rb +403 -0
  127. data/lib/bcdice/game_system/GurpsFW.rb +2330 -0
  128. data/lib/bcdice/game_system/HarnMaster.rb +208 -0
  129. data/lib/bcdice/game_system/HatsuneMiku.rb +706 -0
  130. data/lib/bcdice/game_system/Hieizan.rb +48 -0
  131. data/lib/bcdice/game_system/HouraiGakuen.rb +270 -0
  132. data/lib/bcdice/game_system/HuntersMoon.rb +503 -0
  133. data/lib/bcdice/game_system/Illusio.rb +89 -0
  134. data/lib/bcdice/game_system/InfiniteFantasia.rb +51 -0
  135. data/lib/bcdice/game_system/Insane.rb +822 -0
  136. data/lib/bcdice/game_system/Insane_Korean.rb +773 -0
  137. data/lib/bcdice/game_system/IthaWenUa.rb +38 -0
  138. data/lib/bcdice/game_system/JamesBond.rb +45 -0
  139. data/lib/bcdice/game_system/Kamigakari.rb +394 -0
  140. data/lib/bcdice/game_system/Kamigakari_Korean.rb +428 -0
  141. data/lib/bcdice/game_system/KanColle.rb +938 -0
  142. data/lib/bcdice/game_system/KemonoNoMori.rb +258 -0
  143. data/lib/bcdice/game_system/KillDeathBusiness.rb +1420 -0
  144. data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +1510 -0
  145. data/lib/bcdice/game_system/KurayamiCrying.rb +49 -0
  146. data/lib/bcdice/game_system/LiveraDoll.rb +375 -0
  147. data/lib/bcdice/game_system/LogHorizon.rb +3567 -0
  148. data/lib/bcdice/game_system/LogHorizon_Korean.rb +1407 -0
  149. data/lib/bcdice/game_system/LostRecord.rb +30 -0
  150. data/lib/bcdice/game_system/LostRoyal.rb +242 -0
  151. data/lib/bcdice/game_system/MagicaLogia.rb +1148 -0
  152. data/lib/bcdice/game_system/MeikyuDays.rb +415 -0
  153. data/lib/bcdice/game_system/MeikyuKingdom.rb +466 -0
  154. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +269 -0
  155. data/lib/bcdice/game_system/MetalHead.rb +249 -0
  156. data/lib/bcdice/game_system/MetalHeadExtream.rb +917 -0
  157. data/lib/bcdice/game_system/MetallicGuardian.rb +31 -0
  158. data/lib/bcdice/game_system/MonotoneMuseum.rb +354 -0
  159. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +304 -0
  160. data/lib/bcdice/game_system/Nechronica.rb +211 -0
  161. data/lib/bcdice/game_system/Nechronica_Korean.rb +160 -0
  162. data/lib/bcdice/game_system/NeverCloud.rb +74 -0
  163. data/lib/bcdice/game_system/NightWizard.rb +231 -0
  164. data/lib/bcdice/game_system/NightWizard3rd.rb +24 -0
  165. data/lib/bcdice/game_system/NightmareHunterDeep.rb +117 -0
  166. data/lib/bcdice/game_system/NinjaSlayer.rb +274 -0
  167. data/lib/bcdice/game_system/NjslyrBattle.rb +54 -0
  168. data/lib/bcdice/game_system/Nuekagami.rb +293 -0
  169. data/lib/bcdice/game_system/OneWayHeroics.rb +134 -0
  170. data/lib/bcdice/game_system/OracleEngine.rb +265 -0
  171. data/lib/bcdice/game_system/OrgaRain.rb +77 -0
  172. data/lib/bcdice/game_system/Oukahoushin3rd.rb +162 -0
  173. data/lib/bcdice/game_system/Paradiso.rb +323 -0
  174. data/lib/bcdice/game_system/Paranoia.rb +64 -0
  175. data/lib/bcdice/game_system/ParanoiaRebooted.rb +109 -0
  176. data/lib/bcdice/game_system/ParasiteBlood.rb +231 -0
  177. data/lib/bcdice/game_system/Pathfinder.rb +21 -0
  178. data/lib/bcdice/game_system/Peekaboo.rb +324 -0
  179. data/lib/bcdice/game_system/Pendragon.rb +39 -0
  180. data/lib/bcdice/game_system/PhantasmAdventure.rb +73 -0
  181. data/lib/bcdice/game_system/Postman.rb +185 -0
  182. data/lib/bcdice/game_system/PulpCthulhu.rb +184 -0
  183. data/lib/bcdice/game_system/Raisondetre.rb +171 -0
  184. data/lib/bcdice/game_system/RecordOfLodossWar.rb +58 -0
  185. data/lib/bcdice/game_system/RecordOfSteam.rb +149 -0
  186. data/lib/bcdice/game_system/RokumonSekai2.rb +110 -0
  187. data/lib/bcdice/game_system/RoleMaster.rb +24 -0
  188. data/lib/bcdice/game_system/RuneQuest.rb +47 -0
  189. data/lib/bcdice/game_system/RyuTuber.rb +266 -0
  190. data/lib/bcdice/game_system/Ryutama.rb +199 -0
  191. data/lib/bcdice/game_system/SRS.rb +348 -0
  192. data/lib/bcdice/game_system/SamsaraBallad.rb +111 -0
  193. data/lib/bcdice/game_system/Satasupe.rb +1173 -0
  194. data/lib/bcdice/game_system/ScreamHighSchool.rb +128 -0
  195. data/lib/bcdice/game_system/SevenFortressMobius.rb +34 -0
  196. data/lib/bcdice/game_system/ShadowRun.rb +26 -0
  197. data/lib/bcdice/game_system/ShadowRun4.rb +49 -0
  198. data/lib/bcdice/game_system/ShadowRun5.rb +80 -0
  199. data/lib/bcdice/game_system/SharedFantasia.rb +69 -0
  200. data/lib/bcdice/game_system/ShinMegamiTenseiKakuseihen.rb +85 -0
  201. data/lib/bcdice/game_system/ShinkuuGakuen.rb +506 -0
  202. data/lib/bcdice/game_system/ShinobiGami.rb +680 -0
  203. data/lib/bcdice/game_system/ShoujoTenrankai.rb +677 -0
  204. data/lib/bcdice/game_system/Skynauts.rb +324 -0
  205. data/lib/bcdice/game_system/SteamPunkers.rb +485 -0
  206. data/lib/bcdice/game_system/StellarKnights.rb +856 -0
  207. data/lib/bcdice/game_system/SterileLife.rb +452 -0
  208. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +103 -0
  209. data/lib/bcdice/game_system/StratoShout.rb +316 -0
  210. data/lib/bcdice/game_system/StratoShout_Korean.rb +314 -0
  211. data/lib/bcdice/game_system/Strave.rb +223 -0
  212. data/lib/bcdice/game_system/SwordWorld.rb +491 -0
  213. data/lib/bcdice/game_system/SwordWorld2_0.rb +295 -0
  214. data/lib/bcdice/game_system/SwordWorld2_5.rb +121 -0
  215. data/lib/bcdice/game_system/TherapieSein.rb +93 -0
  216. data/lib/bcdice/game_system/TokumeiTenkousei.rb +96 -0
  217. data/lib/bcdice/game_system/TokyoGhostResearch.rb +122 -0
  218. data/lib/bcdice/game_system/TokyoNova.rb +19 -0
  219. data/lib/bcdice/game_system/Torg.rb +364 -0
  220. data/lib/bcdice/game_system/Torg1_5.rb +139 -0
  221. data/lib/bcdice/game_system/TorgEternity.rb +414 -0
  222. data/lib/bcdice/game_system/TrinitySeven.rb +364 -0
  223. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +287 -0
  224. data/lib/bcdice/game_system/TwilightGunsmoke.rb +527 -0
  225. data/lib/bcdice/game_system/Utakaze.rb +153 -0
  226. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +132 -0
  227. data/lib/bcdice/game_system/Villaciel.rb +555 -0
  228. data/lib/bcdice/game_system/WARPS.rb +33 -0
  229. data/lib/bcdice/game_system/WaresBlade.rb +34 -0
  230. data/lib/bcdice/game_system/Warhammer.rb +336 -0
  231. data/lib/bcdice/game_system/WitchQuest.rb +275 -0
  232. data/lib/bcdice/game_system/WorldOfDarkness.rb +135 -0
  233. data/lib/bcdice/game_system/YankeeYogSothoth.rb +440 -0
  234. data/lib/bcdice/game_system/YearZeroEngine.rb +134 -0
  235. data/lib/bcdice/game_system/ZettaiReido.rb +142 -0
  236. data/lib/bcdice/game_system/meikyu_kingdom/item_table.rb +383 -0
  237. data/lib/bcdice/game_system/meikyu_kingdom/kingdom_name_table.rb +89 -0
  238. data/lib/bcdice/game_system/meikyu_kingdom/landscape_table.rb +196 -0
  239. data/lib/bcdice/game_system/meikyu_kingdom/name_tables.rb +223 -0
  240. data/lib/bcdice/game_system/meikyu_kingdom/placename_table.rb +214 -0
  241. data/lib/bcdice/game_system/meikyu_kingdom/tables.rb +610 -0
  242. data/lib/bcdice/game_system/meikyu_kingdom/word_table.rb +117 -0
  243. data/lib/bcdice/game_system/meikyu_kingdom_basic/item_table.rb +380 -0
  244. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +184 -0
  245. data/lib/bcdice/game_system/meikyu_kingdom_basic/name_table.rb +417 -0
  246. data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +912 -0
  247. data/lib/bcdice/game_system/meikyu_kingdom_basic/word_table.rb +121 -0
  248. data/lib/bcdice/game_system/one_way_heroics/dungeon_table.rb +67 -0
  249. data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +166 -0
  250. data/lib/bcdice/game_system/one_way_heroics/tables.rb +668 -0
  251. data/lib/bcdice/loader.rb +37 -0
  252. data/lib/bcdice/normalize.rb +38 -0
  253. data/lib/bcdice/preprocessor.rb +87 -0
  254. data/lib/bcdice/randomizer.rb +137 -0
  255. data/lib/bcdice/repl.rb +155 -0
  256. data/lib/bcdice/user_defined_dice_table.rb +153 -0
  257. data/lib/bcdice/version.rb +3 -0
  258. metadata +304 -0
@@ -0,0 +1,310 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class DetatokoSaga < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'DetatokoSaga'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'でたとこサーガ'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'てたとこさあか'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・通常判定 xDS or xDSy or xDS>=z or xDSy>=z
18
+  (x=スキルレベル、y=現在フラグ値(省略時0)、z=目標値(省略時8))
19
+  例)3DS 2DS5 0DS 3DS>=10 3DS7>=12
20
+ ・判定値 xJD or xJDy or xJDy+z or xJDy-z or xJDy/z
21
+  (x=スキルレベル、y=現在フラグ値(省略時0)、z=修正値(省略時0))
22
+  例)3JD 2JD5 3JD7+1 4JD/3
23
+ ・体力烙印表 SST (StrengthStigmaTable)
24
+ ・気力烙印表 WST (WillStigmaTable)
25
+ ・体力バッドエンド表 SBET (StrengthBadEndTable)
26
+ ・気力バッドエンド表 WBET (WillBadEndTable)
27
+ INFO_MESSAGE_TEXT
28
+
29
+ register_prefix([
30
+ '\d+DS.*', '\d+JD.*',
31
+ 'SST', 'StrengthStigmaTable',
32
+ 'WST', 'WillStigmaTable',
33
+ 'SBET', 'StrengthBadEndTable',
34
+ 'WBET', 'WillBadEndTable'
35
+ ])
36
+
37
+ def initialize(command)
38
+ super(command)
39
+
40
+ @sort_add_dice = true
41
+ @enabled_d66 = true
42
+ @d66_sort_type = D66SortType::ASC
43
+ end
44
+
45
+ def eval_game_system_specific_command(command)
46
+ debug("eval_game_system_specific_command begin string", command)
47
+
48
+ result = checkRoll(command)
49
+ return result unless result.empty?
50
+
51
+ result = checkJudgeValue(command)
52
+ return result unless result.empty?
53
+
54
+ debug("各種表として処理")
55
+ return rollTableCommand(command)
56
+ end
57
+
58
+ # 通常判定 xDS or xDSy or xDS>=z or xDSy>=z
59
+ def checkRoll(string)
60
+ debug("checkRoll begin string", string)
61
+
62
+ return '' unless /^(\d+)DS(\d+)?((>=)(\d+))?$/i =~ string
63
+
64
+ target = 8
65
+
66
+ skill = Regexp.last_match(1).to_i
67
+ flag = Regexp.last_match(2).to_i
68
+ target = Regexp.last_match(5).to_i unless Regexp.last_match(5).nil?
69
+
70
+ result = "判定! スキルレベル:#{skill} フラグ:#{flag} 目標値:#{target}"
71
+
72
+ total, rollText = getRollResult(skill)
73
+ result += " > #{total}[#{rollText}] > 判定値:#{total}"
74
+
75
+ success = getSuccess(total, target)
76
+ result += " > #{success}"
77
+
78
+ result += getCheckFlagResult(total, flag)
79
+
80
+ return result
81
+ end
82
+
83
+ def getRollResult(skill)
84
+ diceCount = skill + 1
85
+ diceCount = 3 if skill == 0
86
+
87
+ dice = @randomizer.roll_barabara(diceCount, 6)
88
+ diceText = dice.join(',')
89
+
90
+ dice = dice.sort
91
+ dice = dice.reverse if skill != 0
92
+
93
+ total = dice[0] + dice[1]
94
+
95
+ return total, diceText
96
+ end
97
+
98
+ def getSuccess(check, target)
99
+ if check >= target
100
+ return "目標値以上!【成功】"
101
+ end
102
+
103
+ return "目標値未満…【失敗】"
104
+ end
105
+
106
+ def getCheckFlagResult(total, flag)
107
+ if total > flag
108
+ return ""
109
+ end
110
+
111
+ willText = getDownWill(flag)
112
+ result = "、フラグ以下!【気力#{willText}点減少】"
113
+ result += "【判定値変更不可】"
114
+
115
+ return result
116
+ end
117
+
118
+ def getDownWill(flag)
119
+ if flag >= 10
120
+ return "6"
121
+ end
122
+
123
+ dice = @randomizer.roll_once(6)
124
+ return "1D6->#{dice}"
125
+ end
126
+
127
+ # スキル判定値 xJD or xJDy or xJDy+z or xJDy-z or xJDy/z
128
+ def checkJudgeValue(string)
129
+ debug("checkJudgeValue begin string", string)
130
+
131
+ return '' unless %r{^(\d+)JD(\d+)?(([+]|[-]|[/])(\d+))?$}i =~ string
132
+
133
+ skill = Regexp.last_match(1).to_i
134
+ flag = Regexp.last_match(2).to_i
135
+ operator = Regexp.last_match(4)
136
+ value = Regexp.last_match(5).to_i
137
+
138
+ result = "判定! スキルレベル:#{skill} フラグ:#{flag}"
139
+
140
+ modifyText = getModifyText(operator, value)
141
+ result += " 修正値:#{modifyText}" unless modifyText.empty?
142
+
143
+ total, rollText = getRollResult(skill)
144
+ result += " > #{total}[#{rollText}]#{modifyText}"
145
+
146
+ totalResult = getTotalResultValue(total, value, operator)
147
+ result += " > #{totalResult}"
148
+
149
+ result += getCheckFlagResult(total, flag)
150
+
151
+ return result
152
+ end
153
+
154
+ def getModifyText(operator, value)
155
+ return '' if value == 0
156
+
157
+ operatorText =
158
+ case operator
159
+ when "+"
160
+ "+"
161
+ when "-"
162
+ "-"
163
+ when "/"
164
+ "÷"
165
+ else
166
+ return ""
167
+ end
168
+
169
+ return "#{operatorText}#{value}"
170
+ end
171
+
172
+ def getTotalResultValue(total, value, operator)
173
+ case operator
174
+ when "+"
175
+ return "#{total}+#{value} > 判定値:#{total + value}"
176
+ when "-"
177
+ return "#{total}-#{value} > 判定値:#{total - value}"
178
+ when "/"
179
+ return getTotalResultValueWhenSlash(total, value)
180
+ else
181
+ return "判定値:#{total}"
182
+ end
183
+ end
184
+
185
+ def getTotalResultValueWhenSlash(total, value)
186
+ return "0では割れません" if value == 0
187
+
188
+ quotient = ((1.0 * total) / value).ceil
189
+
190
+ result = "#{total}÷#{value} > 判定値:#{quotient}"
191
+ return result
192
+ end
193
+
194
+ ####################
195
+ # 各種表
196
+
197
+ def rollTableCommand(command)
198
+ command = command.upcase
199
+
200
+ debug("eval_game_system_specific_command command", command)
201
+
202
+ name = ''
203
+ text = ''
204
+ total = 0
205
+
206
+ case command.upcase
207
+ when "SST", "StrengthStigmaTable".upcase
208
+ name, text, total = choiceStrengthStigmaTable()
209
+ when "WST", "WillStigmaTable".upcase
210
+ name, text, total = choiceWillStigmaTable()
211
+ when "SBET", "StrengthBadEndTable".upcase
212
+ name, text, total = choiceStrengthBadEndTable()
213
+ when "WBET", "WillBadEndTable".upcase
214
+ name, text, total = choiceWillBadEndTable()
215
+ else
216
+ return
217
+ end
218
+
219
+ result = "#{name}(#{total}) > #{text}"
220
+
221
+ return result
222
+ end
223
+
224
+ # ##表一覧
225
+
226
+ def choiceStrengthStigmaTable()
227
+ name = "体力烙印表"
228
+ table = [
229
+ 'あなたは【烙印】を2つ受ける。この表をさらに2回振って受ける【烙印】を決める(その結果、再びこの出目が出ても【烙印】は増えない)。',
230
+ '【痛手】手負い傷を負った。何とか戦えているが……。',
231
+ '【流血】血があふれ出し、目がかすむ……。',
232
+ '【衰弱】体が弱り、その心さえも萎えてしまいそうだ……。',
233
+ '【苦悶】痛みと苦しみ、情けなさ。目に涙がにじむ。',
234
+ '【衝撃】吹き飛ばされ、壁や樹木にめりこむ。早く起き上がらねば。',
235
+ '【疲労】あなたの顔に疲労の色が強まる……この戦いがつらくなってきた。',
236
+ '【怒号】うっとうしい攻撃に怒りの叫びを放つ。怒りが戦いを迷わせるか?',
237
+ '【負傷】手傷を負わされた……。',
238
+ '【軽症】あなたの肌に傷が残った。これだけなら何ということもない。',
239
+ '奇跡的にあなたは【烙印】を受けなかった。'
240
+ ]
241
+
242
+ text, total = get_table_by_2d6(table)
243
+ return name, text, total
244
+ end
245
+
246
+ def choiceWillStigmaTable()
247
+ name = "気力烙印表"
248
+
249
+ table = [
250
+ 'あなたは【烙印】を2つ受ける。この表をさらに2回振って受ける【烙印】を決める(その結果、再びこの出目が出ても【烙印】は増えない)。',
251
+ '【絶望】どうしようもない状況。希望は失われ……膝を付くことしかできない。',
252
+ '【号泣】あまりの理不尽に、子供のように泣き叫ぶことしかできない。',
253
+ '【後悔】こんなはずじゃなかったのに。しかし現実は非情だった。',
254
+ '【恐怖】恐怖に囚われてしまった!敵が、己の手が、恐ろしくてならない!',
255
+ '【葛藤】本当にこれでいいのか?何度も自身への問いかけが起こる……。',
256
+ '【憎悪】怒りと憎しみに囚われたあなたは、本来の力を発揮できるだろうか?',
257
+ '【呆然】これは現実なのか?ぼんやりとしながらあなたは考える。',
258
+ '【迷い】迷いを抱いてしまった。それは戦う意志を鈍らせるだろうか?',
259
+ '【悪夢】これから時折、あなたはこの時を悪夢に見ることだろう。',
260
+ '奇跡的にあなたは【烙印】を受けなかった。'
261
+ ]
262
+
263
+ text, total = get_table_by_2d6(table)
264
+ return name, text, total
265
+ end
266
+
267
+ def choiceStrengthBadEndTable()
268
+ name = "体力バッドエンド表"
269
+
270
+ table = [
271
+ '【死亡】あなたは死んだ。次のセッションに参加するには、クラス1つを『モンスター』か『暗黒』にクラスチェンジしなくてはいけない。',
272
+ '【命乞】あなたは恐怖に駆られ、命乞いをしてしまった!次のセッション開始時に、クラス1つが『ザコ』に変更される!',
273
+ '【忘却】あなたは記憶を失い、ぼんやりと立ち尽くす。次のセッションに参加するには、クラス1つを変更しなくてはならない。',
274
+ '【悲劇】あなたの攻撃は敵ではなく味方を撃った!全てが終わるまであなたは立ち尽くしていた。任意の味方の【体力】を1D6点減少させる。',
275
+ '【暴走】あなたは正気を失い、衝動のまま暴走する!同じシーンにいる全員の【体力】を1D6点減少させる。',
276
+ '【転落】あなたは断崖絶壁から転落した。',
277
+ '【虜囚】あなたは敵に囚われた。',
278
+ '【逃走】あなたは恐れをなし、仲間を見捨てて逃げ出した。',
279
+ '【重症】あなたはどうしようもない痛手を負い、倒れた。',
280
+ '【気絶】あなたは気を失った。そして目覚めれば全てが終わっていた。',
281
+ 'それでもまだ立ち上がる!あなたはバッドエンドを迎えなかった。体力の【烙印】を1つ打ち消してよい。'
282
+ ]
283
+
284
+ text, total = get_table_by_2d6(table)
285
+ return name, text, total
286
+ end
287
+
288
+ def choiceWillBadEndTable()
289
+ name = "気力バッドエンド表"
290
+
291
+ table = [
292
+ '【自害】あなたは自ら死を選んだ。次のセッションに参加するには、クラス1つを『暗黒』にクラスチェンジしなくてはいけない。',
293
+ '【堕落】あなたは心の中の闇に飲まれた。次のセッション開始時に、クラス1つが『暗黒』か『モンスター』に変更される!',
294
+ '【隷属】あなたは敵の言うことに逆らえない。次のセッションであなたのスタンスは『従属』になる。',
295
+ '【裏切】裏切りの衝動。任意の味方の【体力】を1D6点減少させ、その場から逃げ出す。',
296
+ '【暴走】あなたは正気を失い、衝動のまま暴走する!同じシーンにいる全員の【体力】を1D6点減少させる。',
297
+ '【呪い】心の闇が顕在化したのか。敵の怨嗟か。呪いに蝕まれたあなたは、のたうちまわることしかできない。',
298
+ '【虜囚】あなたは敵に囚われ、その場から連れ去られる。',
299
+ '【逃走】あなたは恐れをなし、仲間を見捨てて逃げ出した。',
300
+ '【放心】あなたはただぼんやりと立ち尽くすしかなかった。我に返った時、全ては終わっていた。',
301
+ '【気絶】あなたは気を失った。そして目覚めれば全てが終わっていた。',
302
+ 'それでもまだ諦めない!あなたはバッドエンドを迎えなかった。あなたは気力の【烙印】を1つ打ち消してよい。'
303
+ ]
304
+
305
+ text, total = get_table_by_2d6(table)
306
+ return name, text, total
307
+ end
308
+ end
309
+ end
310
+ end
@@ -0,0 +1,310 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class DetatokoSaga_Korean < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'DetatokoSaga:Korean'
8
+
9
+ # ゲームシステム名
10
+ NAME = '데타토코 사가'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = '国際化:Korean:데타토코 사가'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・통상판정 xDS or xDSy or xDS>=z or xDSy>=z
18
+  (x=스킬레벨, y=현재 플래그(생략=0), z=목표치(생략=8))
19
+  예)3DS 2DS5 0DS 3DS>=10 3DS7>=12
20
+ ・판정치 xJD or xJDy or xJDy+z or xJDy-z or xJDy/z
21
+  (x=스킬레벨, y=현재 플래그(생략=0), z=수정치(생략=0))
22
+  예)3JD 2JD5 3JD7+1 4JD/3
23
+ ・체력 낙인표 SST (StrengthStigmaTable)
24
+ ・기력 낙인표 WST (WillStigmaTable)
25
+ ・체력 배드엔딩표 SBET (StrengthBadEndTable)
26
+ ・기력 배드엔딩표 WBET (WillBadEndTable)
27
+ INFO_MESSAGE_TEXT
28
+
29
+ register_prefix([
30
+ '\d+DS.*', '\d+JD.*',
31
+ 'SST', 'StrengthStigmaTable',
32
+ 'WST', 'WillStigmaTable',
33
+ 'SBET', 'StrengthBadEndTable',
34
+ 'WBET', 'WillBadEndTable'
35
+ ])
36
+
37
+ def initialize(command)
38
+ super(command)
39
+
40
+ @sort_add_dice = true
41
+ @enabled_d66 = true
42
+ @d66_sort_type = D66SortType::ASC
43
+ end
44
+
45
+ def eval_game_system_specific_command(command)
46
+ debug("eval_game_system_specific_command begin string", command)
47
+
48
+ result = checkRoll(command)
49
+ return result unless result.empty?
50
+
51
+ result = checkJudgeValue(command)
52
+ return result unless result.empty?
53
+
54
+ debug("각종표로서 처리")
55
+ return rollTableCommand(command)
56
+ end
57
+
58
+ # 통상판정 xDS or xDSy or xDS>=z or xDSy>=z
59
+ def checkRoll(string)
60
+ debug("checkRoll begin string", string)
61
+
62
+ return '' unless /^(\d+)DS(\d+)?((>=)(\d+))?$/i =~ string
63
+
64
+ target = 8
65
+
66
+ skill = Regexp.last_match(1).to_i
67
+ flag = Regexp.last_match(2).to_i
68
+ target = Regexp.last_match(5).to_i unless Regexp.last_match(5).nil?
69
+
70
+ result = "판정! 스킬레벨:#{skill} 플래그:#{flag} 목표치:#{target}"
71
+
72
+ total, rollText = getRollResult(skill)
73
+ result += " > #{total}[#{rollText}] > 판정치:#{total}"
74
+
75
+ success = getSuccess(total, target)
76
+ result += " > #{success}"
77
+
78
+ result += getCheckFlagResult(total, flag)
79
+
80
+ return result
81
+ end
82
+
83
+ def getRollResult(skill)
84
+ diceCount = skill + 1
85
+ diceCount = 3 if skill == 0
86
+
87
+ dice = @randomizer.roll_barabara(diceCount, 6)
88
+ diceText = dice.join(',')
89
+
90
+ dice = dice.sort
91
+ dice = dice.reverse if skill != 0
92
+
93
+ total = dice[0] + dice[1]
94
+
95
+ return total, diceText
96
+ end
97
+
98
+ def getSuccess(check, target)
99
+ if check >= target
100
+ return "목표치 이상!【성공】"
101
+ end
102
+
103
+ return "목표치 미달… 【실패】"
104
+ end
105
+
106
+ def getCheckFlagResult(total, flag)
107
+ if total > flag
108
+ return ""
109
+ end
110
+
111
+ willText = getDownWill(flag)
112
+ result = ", 플래그 이하! 【기력#{willText}점 감소】"
113
+ result += " 【판정치 변경 불가】"
114
+
115
+ return result
116
+ end
117
+
118
+ def getDownWill(flag)
119
+ if flag >= 10
120
+ return "6"
121
+ end
122
+
123
+ dice = @randomizer.roll_once(6)
124
+ return "1D6->#{dice}"
125
+ end
126
+
127
+ # 스킬판정치 xJD or xJDy or xJDy+z or xJDy-z or xJDy/z
128
+ def checkJudgeValue(string)
129
+ debug("checkJudgeValue begin string", string)
130
+
131
+ return '' unless %r{^(\d+)JD(\d+)?(([+]|[-]|[/])(\d+))?$}i =~ string
132
+
133
+ skill = Regexp.last_match(1).to_i
134
+ flag = Regexp.last_match(2).to_i
135
+ operator = Regexp.last_match(4)
136
+ value = Regexp.last_match(5).to_i
137
+
138
+ result = "판정! 스킬레벨:#{skill} 플래그:#{flag}"
139
+
140
+ modifyText = getModifyText(operator, value)
141
+ result += " 수정치:#{modifyText}" unless modifyText.empty?
142
+
143
+ total, rollText = getRollResult(skill)
144
+ result += " > #{total}[#{rollText}]#{modifyText}"
145
+
146
+ totalResult = getTotalResultValue(total, value, operator)
147
+ result += " > #{totalResult}"
148
+
149
+ result += getCheckFlagResult(total, flag)
150
+
151
+ return result
152
+ end
153
+
154
+ def getModifyText(operator, value)
155
+ return '' if value == 0
156
+
157
+ operatorText =
158
+ case operator
159
+ when "+"
160
+ "+"
161
+ when "-"
162
+ "-"
163
+ when "/"
164
+ "÷"
165
+ else
166
+ return ""
167
+ end
168
+
169
+ return "#{operatorText}#{value}"
170
+ end
171
+
172
+ def getTotalResultValue(total, value, operator)
173
+ case operator
174
+ when "+"
175
+ return "#{total}+#{value} > 판정치:#{total + value}"
176
+ when "-"
177
+ return "#{total}-#{value} > 판정치:#{total - value}"
178
+ when "/"
179
+ return getTotalResultValueWhenSlash(total, value)
180
+ else
181
+ return "판정치:#{total}"
182
+ end
183
+ end
184
+
185
+ def getTotalResultValueWhenSlash(total, value)
186
+ return "0으로는 나누어지지 않습니다" if value == 0
187
+
188
+ quotient = ((1.0 * total) / value).ceil
189
+
190
+ result = "#{total}÷#{value} > 판정치:#{quotient}"
191
+ return result
192
+ end
193
+
194
+ ####################
195
+ # 각종표
196
+
197
+ def rollTableCommand(command)
198
+ command = command.upcase
199
+
200
+ debug("eval_game_system_specific_command command", command)
201
+
202
+ name = ''
203
+ text = ''
204
+ total = 0
205
+
206
+ case command.upcase
207
+ when "SST", "StrengthStigmaTable".upcase
208
+ name, text, total = choiceStrengthStigmaTable()
209
+ when "WST", "WillStigmaTable".upcase
210
+ name, text, total = choiceWillStigmaTable()
211
+ when "SBET", "StrengthBadEndTable".upcase
212
+ name, text, total = choiceStrengthBadEndTable()
213
+ when "WBET", "WillBadEndTable".upcase
214
+ name, text, total = choiceWillBadEndTable()
215
+ else
216
+ return
217
+ end
218
+
219
+ result = "#{name}(#{total}) > #{text}"
220
+
221
+ return result
222
+ end
223
+
224
+ # ##표 목록
225
+
226
+ def choiceStrengthStigmaTable()
227
+ name = "체력 낙인표"
228
+ table = [
229
+ "당신은 【낙인】을 2개 받는다. 이 표를 다시 2번 굴려 받을 【낙인】을 정한다(그 경우, 다시 이 눈이 나와도 【낙인】은 늘어나지 않는다).",
230
+ "【상처】 심한 상처를 입었다. 어떻게든 싸울 수는 있지만…….",
231
+ "【출혈】 피가 흘러넘쳐, 눈이 흐릿하다…….",
232
+ "【쇠약】 몸이 약해져, 그 마음마저도 시들어버릴 거 같다.",
233
+ "【고통】 아픔과 괴로움, 한심함. 눈에서 눈물이 새어 나온다.",
234
+ "【충격】 날려져서, 벽이나 나무에 부딪힌다. 빨리 일어서지 않으면.",
235
+ "【피로】 당신의 얼굴에 피로의 색이 강해진다……이 싸움이 힘겨워졌다.",
236
+ "【노호】 성가신 공격에 분노의 함성을 지른다. 분노가 싸움을 어렵게 할까?",
237
+ "【부상】 상처를 입었다…….",
238
+ "【경상】 당신의 피부에 상처가 남았다. 이것만이라면 아무렇지도 않다.",
239
+ "기적적으로 당신은 【낙인】을 받지 않았다.",
240
+ ]
241
+
242
+ text, total = get_table_by_2d6(table)
243
+ return name, text, total
244
+ end
245
+
246
+ def choiceWillStigmaTable()
247
+ name = "기력 낙인표"
248
+
249
+ table = [
250
+ "당신은 【낙인】을 2개 받는다. 이 표를 다시 2번 굴려 받을 【낙인】을 정한다(그 경우, 다시 이 눈이 나와도 【낙인】은 늘어나지 않는다).",
251
+ "【절망】 어떻게 하지 못하는 상황. 희망은 사라지고……무릎을 꿇을 수밖에 없다.",
252
+ "【통곡】 너무도 부조리함에, 어린아이처럼 울음을 터트릴 수밖에 없다.",
253
+ "【후회】 이럴 생각은 아니었는데. 하지만 현실은 비정했다.",
254
+ "【공포】 공포에 사로잡혔다! 적이, 자신의 손이, 무서워서 참을 수 없다!",
255
+ "【갈등】 정말로 이걸로 괜찮은 걸까? 몇 번이고 자신에게 의문이 일어난다…….",
256
+ "【증오】 분노와 증오에 사로잡힌 당신은, 본래의 힘을 발휘할 수 있을까?",
257
+ "【망연】 이것은 현실인가? 몽롱한 정신으로 당신은 생각한다.",
258
+ "【주저】 망설임을 가졌다. 그것은 싸울 의지를 둔하게 할 것인가?",
259
+ "【악몽】 이제부터 때때로, 당신은 이 순간을 악몽으로 볼 것이다.",
260
+ "기적적으로 당신은 【낙인】을 받지 않았다.",
261
+ ]
262
+
263
+ text, total = get_table_by_2d6(table)
264
+ return name, text, total
265
+ end
266
+
267
+ def choiceStrengthBadEndTable()
268
+ name = "체력 배드엔딩표"
269
+
270
+ table = [
271
+ "【사망】 당신은 죽었다. 다음 세션에 참가하기 위해서는, 클래스 1개를 『몬스터』나 『암흑』으로 클래스 체인지해야만 한다.",
272
+ "【목숨 구걸】 당신은 공포를 느껴, 목숨을 구걸했다! 다음 세션 개시 시에, 클래스 1개가 『자코』로 변경된다!",
273
+ "【망각】 당신은 기억을 잃고, 우두커니 섰다. 다음 세션에 참가하기 위해서는, 클래스 1개를 변경해야만 한다.",
274
+ "【비극】 당신의 공격은 적이 아니라 아군을 맞췄다! 모든 것이 끝날 때까지 당신은 우두커니 서 있게 된다. 임의의 아군의 【체력】을 1D6점 감소시킨다.",
275
+ "【폭주】 당신은 이성을 잃고, 충동에 따라 폭주한다! 같은 씬에 있는 전원의 【체력】을 1D6점 감소시킨다.",
276
+ "【전락】 당신은 단애절벽에서 떨어진다.",
277
+ "【포로】 당신은 적에게 사로잡혔다.",
278
+ "【도주】 당신은 겁에 질려, 동료를 버리고 도망쳤다.",
279
+ "【중상】 당신은 어찌할 수 없는 상처를 입고, 쓰러졌다.",
280
+ "【기절】 당신은 의식을 잃었다. 그리고 정신이 들면 모든 것이 끝나있었다.",
281
+ "그래도 아직 일어선다! 당신은 배드엔드를 맞이하지 않았다. 체력의 【낙인】을 1개 지워도 좋다.",
282
+ ]
283
+
284
+ text, total = get_table_by_2d6(table)
285
+ return name, text, total
286
+ end
287
+
288
+ def choiceWillBadEndTable()
289
+ name = "기력 배드엔딩표"
290
+
291
+ table = [
292
+ "【자해】 당신은 스스로 죽음을 골랐다. 다음 세션에 참가하기 위해서는 클래스 1개를 『암흑』으로 클래스 체인지해야만 한다.",
293
+ "【타락】 당신은 마음속의 어둠에 먹혔다. 다음 세션 개시 시에, 클래스 1개가 『암흑』이나 『몬스터』로 변경된다!",
294
+ "【예속】 당신은 적의 말에 거스를 수 없다. 다음 세션에 당신의 스탠스는 『종속』이 된다.",
295
+ "【배반】 배반의 충동. 임의의 아군의 【체력】을 1D6점 감소시키고, 그 자리에서 도망친다.",
296
+ "【폭주】 당신은 이성을 잃고, 충동에 따라 폭주한다! 같은 씬에 있는 전원의 【체력】을 1D6점 감소시킨다.",
297
+ "【저주】 마음의 어둠이 현재화한 것인가. 적의 원한인가. 저주에 삼켜진 당신은, 그저 고통에 몸부림칠 수밖에 없다.",
298
+ "【포로】 당신은 적에게 사로잡혀, 그 자리에서 끌려갔다.",
299
+ "【도주】 당신은 겁에 질려, 동료를 버리고 도망쳤다.",
300
+ "【방심】 당신은 그저 멍하니 서 있을 수밖에 없다. 정신을 차렸을 때, 모든 것은 끝나있었다.",
301
+ "【기절】 당신은 의식을 잃었다. 그리고 정신이 들면 모든 것이 끝나있었다.",
302
+ "그래도 아직 포기하지 않아! 당신은 배드엔드를 맞이하지 않았다. 기력의 【낙인】을 1개 지워도 좋다.",
303
+ ]
304
+
305
+ text, total = get_table_by_2d6(table)
306
+ return name, text, total
307
+ end
308
+ end
309
+ end
310
+ end