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,435 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class BadLife < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'BadLife'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'バッドライフ'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'はつとらいふ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ・判定:nBADm[±a][Cb±c][Fd±e][@X±f][!OP]  []内のコマンドは省略可。
18
+ ・BADコマンドは「BL」コマンドで代用可。
19
+ ・博徒は「GL」コマンドで〈波乱万丈〉の効果を適用。
20
+
21
+ 「n」で振るダイス数、「m」で特性値、「±a」で達成値への修正値、
22
+ 「Cb±c」でクリティカル値への修正、「Fd±e」でファンブル値への修正、
23
+ 「@X」で目標難易度を指定。
24
+ 「±a」「Cb±c」「Fd±e」[@X±f]部分は「4+1-3」などの複数回指定可。
25
+ 「!OP」部分で、一部のスキルやガジェットの追加効果を指定可。
26
+ 使用可能なコマンドは以下の通り。順不同、複数同時使用も可。
27
+ A:〈先見の明〉  H:[重撃]
28
+
29
+ 【書式例】
30
+ BAD → 1ダイスで達成値を表示。
31
+ 3BAD10+2-1 → 3ダイスで修正+11の達成値を表示。
32
+ BL8@15 → 1ダイスで修正+8、難易度15の判定。
33
+ 2BL8C-1F1@15 → 2ダイスで修正+8、C値-1、F値+1、難易度15の判定。
34
+ GL6@20 → 1ダイスで修正+6、難易度20の判定。〈波乱万丈〉の効果。
35
+ GL6@20!HA → 上記に加えて〈先見の明〉[重撃]の効果。
36
+
37
+ ・コードネーム表
38
+ 怪盗:TRN   闇医者:DRN  博徒:GRN
39
+ 殺シ屋:KRN  業師:SRN   遊ビ人:BRN
40
+
41
+ ・スキル表:SKL
42
+ MESSAGETEXT
43
+
44
+ register_prefix(['\d?(BAD|BL|GL).*', '[TDGKSB]RN', 'SKL'])
45
+
46
+ def eval_game_system_specific_command(command)
47
+ command = command.upcase
48
+
49
+ result = judgeDice(command)
50
+ return result unless result.nil?
51
+
52
+ output =
53
+ case command
54
+
55
+ when /([TDGKSB])RN/i
56
+ initials = Regexp.last_match(1)
57
+ get_name_table(initials)
58
+
59
+ when 'SKL'
60
+ get_skill_table
61
+
62
+ end
63
+
64
+ return output
65
+ end
66
+
67
+ def judgeDice(command)
68
+ unless (m = /(\d+)?(BAD|BL|GL)([-+\d]*)((C|F)([-+\d]*)?)?((C|F)([-+\d]*))?(\@([-+\d]*))?(\!(\D*))?/i.match(command))
69
+ return nil
70
+ end
71
+
72
+ diceCount = (m[1] || 1).to_i
73
+
74
+ critical = 20
75
+ fumble = 1
76
+
77
+ isStormy = (m[2] == 'GL') # 波乱万丈
78
+ if isStormy
79
+ critical -= 3
80
+ fumble += 1
81
+ end
82
+
83
+ modify = get_value(m[3])
84
+
85
+ critical, fumble = get_critival_fumble(critical, fumble, m[5], m[6])
86
+ critical, fumble = get_critival_fumble(critical, fumble, m[8], m[9])
87
+
88
+ target = get_value(m[11])
89
+ optionalText = (m[13] || '')
90
+
91
+ return checkRoll(diceCount, modify, critical, fumble, target, isStormy, optionalText)
92
+ end
93
+
94
+ def get_critival_fumble(critical, fumble, marker, text)
95
+ case marker
96
+ when 'C'
97
+ critical += get_value(text)
98
+ when 'F'
99
+ fumble += get_value(text)
100
+ end
101
+
102
+ return critical, fumble
103
+ end
104
+
105
+ def checkRoll(diceCount, modify, critical, fumble, target, isStormy, optionalText)
106
+ isAnticipation = optionalText.include?('A') # 先見の明
107
+ isHeavyAttack = optionalText.include?('H') # 重撃
108
+
109
+ dice_list = @randomizer.roll_barabara(diceCount, 20)
110
+ diceText = dice_list.join(",")
111
+ diceMax = dice_list.max
112
+
113
+ diceMax = 5 if isHeavyAttack && diceMax <= 5 # 重撃
114
+
115
+ isCritical = (diceMax >= critical)
116
+ isFumble = (diceMax <= fumble)
117
+
118
+ diceMax = 20 if isCritical # クリティカル
119
+ total = diceMax + modify
120
+ total += 5 if isAnticipation && diceMax <= 7 # 先見の明
121
+ total = 0 if isFumble # ファンブル
122
+
123
+ result = "#{diceCount}D20\(C:#{critical},F:#{fumble}\) > "
124
+ result += "#{diceMax}\[#{diceText}\]"
125
+ result += "\+" if modify > 0
126
+ result += modify.to_s if modify != 0
127
+ result += "\+5" if isAnticipation && diceMax <= 7 # 先見の明
128
+ result += " > 達成値:#{total}"
129
+
130
+ if target > 0
131
+ success = total - target
132
+ result += ">=#{target} 成功度:#{success} > "
133
+
134
+ if isCritical
135
+ result += "成功(クリティカル)"
136
+ elsif total >= target
137
+ result += "成功"
138
+ else
139
+ result += "失敗"
140
+ result += "(ファンブル)" if isFumble
141
+ end
142
+ else
143
+ result += " クリティカル" if isCritical
144
+ result += " ファンブル" if isFumble
145
+ end
146
+
147
+ skillText = ""
148
+ skillText += "〈波乱万丈〉" if isStormy
149
+ skillText += "〈先見の明〉" if isAnticipation
150
+ skillText += "[重撃]" if isHeavyAttack
151
+ result += " #{skillText}" if skillText != ""
152
+
153
+ return result
154
+ end
155
+
156
+ def get_name_table(initials)
157
+ case initials
158
+ when 'T' # Thief
159
+ name = '怪盗コードネーム表'
160
+ table = [
161
+ [1, 'フォックス'],
162
+ [2, 'フォックス'],
163
+ [3, 'ラット'],
164
+ [4, 'ラット'],
165
+ [5, 'キャット'],
166
+ [6, 'キャット'],
167
+ [7, 'タイガー'],
168
+ [8, 'タイガー'],
169
+ [9, 'シャーク'],
170
+ [10, 'シャーク'],
171
+ [11, 'コンドル'],
172
+ [12, 'コンドル'],
173
+ [13, 'スパイダー'],
174
+ [14, 'スパイダー'],
175
+ [15, 'ウルフ'],
176
+ [16, 'ウルフ'],
177
+ [17, 'コヨーテ'],
178
+ [18, 'コヨーテ'],
179
+ [19, 'ジャガー'],
180
+ [20, 'ジャガー']
181
+ ]
182
+ when 'D' # Doctor
183
+ name = '闇医者コードネーム表'
184
+ table = [
185
+ [1, 'キャンサー'],
186
+ [2, 'キャンサー'],
187
+ [3, 'ヘッドエイク'],
188
+ [4, 'ヘッドエイク'],
189
+ [5, 'ブラッド'],
190
+ [6, 'ブラッド'],
191
+ [7, 'ウーンズ'],
192
+ [8, 'ウーンズ'],
193
+ [9, 'ポイズン'],
194
+ [10, 'ポイズン'],
195
+ [11, 'ペイン'],
196
+ [12, 'ペイン'],
197
+ [13, 'スリープ'],
198
+ [14, 'スリープ'],
199
+ [15, 'キュア'],
200
+ [16, 'キュア'],
201
+ [17, 'デス'],
202
+ [18, 'デス'],
203
+ [19, 'リーンカーネイション'],
204
+ [20, 'リーンカーネイション']
205
+ ]
206
+ when 'G' # Gambler
207
+ name = '博徒コードネーム表'
208
+ table = [
209
+ [1, 'リトルダイス'],
210
+ [2, 'リトルダイス'],
211
+ [3, 'プラチナム'],
212
+ [4, 'プラチナム'],
213
+ [5, 'プレジデント'],
214
+ [6, 'プレジデント'],
215
+ [7, 'ドリーム'],
216
+ [8, 'ドリーム'],
217
+ [9, 'アクシデント'],
218
+ [10, 'アクシデント'],
219
+ [11, 'グリード'],
220
+ [12, 'グリード'],
221
+ [13, 'フォーチュン'],
222
+ [14, 'フォーチュン'],
223
+ [15, 'ミラクル'],
224
+ [16, 'ミラクル'],
225
+ [17, 'ホープ'],
226
+ [18, 'ホープ'],
227
+ [19, 'ビッグヒット'],
228
+ [20, 'ビッグヒット']
229
+ ]
230
+ when 'K' # Killer
231
+ name = '殺シ屋コードネーム表'
232
+ table = [
233
+ [1, 'ハンマー'],
234
+ [2, 'ハンマー'],
235
+ [3, 'アロー'],
236
+ [4, 'アロー'],
237
+ [5, 'ボマー'],
238
+ [6, 'ボマー'],
239
+ [7, 'キャノン'],
240
+ [8, 'キャノン'],
241
+ [9, 'ブレード'],
242
+ [10, 'ブレード'],
243
+ [11, 'スティング'],
244
+ [12, 'スティング'],
245
+ [13, 'ガロット'],
246
+ [14, 'ガロット'],
247
+ [15, 'パイルバンカー'],
248
+ [16, 'パイルバンカー'],
249
+ [17, 'レイザー'],
250
+ [18, 'レイザー'],
251
+ [19, 'カタナ'],
252
+ [20, 'カタナ']
253
+ ]
254
+ when 'S' # Schemer
255
+ name = '業師コードネーム表'
256
+ table = [
257
+ [1, 'ローズ'],
258
+ [2, 'ローズ'],
259
+ [3, 'サクラ'],
260
+ [4, 'サクラ'],
261
+ [5, 'ライラック'],
262
+ [6, 'ライラック'],
263
+ [7, 'ダンデライオン'],
264
+ [8, 'ダンデライオン'],
265
+ [9, 'フリージア'],
266
+ [10, 'フリージア'],
267
+ [11, 'カクタス'],
268
+ [12, 'カクタス'],
269
+ [13, 'ロータス'],
270
+ [14, 'ロータス'],
271
+ [15, 'リリィ'],
272
+ [16, 'リリィ'],
273
+ [17, 'ラフレシア'],
274
+ [18, 'ラフレシア'],
275
+ [19, 'ヒヤシンス'],
276
+ [20, 'ヒヤシンス']
277
+ ]
278
+ when 'B' # Bum
279
+ name = '遊ビ人コードネーム表'
280
+ table = [
281
+ [1, 'モノポリー'],
282
+ [2, 'モノポリー'],
283
+ [3, 'ブリッジ'],
284
+ [4, 'ブリッジ'],
285
+ [5, 'チェッカー'],
286
+ [6, 'チェッカー'],
287
+ [7, 'アクワイア'],
288
+ [8, 'アクワイア'],
289
+ [9, 'ジャンケン'],
290
+ [10, 'ジャンケン'],
291
+ [11, 'トランプ'],
292
+ [12, 'トランプ'],
293
+ [13, 'ケイドロ'],
294
+ [14, 'ケイドロ'],
295
+ [15, 'パンデミック'],
296
+ [16, 'パンデミック'],
297
+ [17, 'スゴロク'],
298
+ [18, 'スゴロク'],
299
+ [19, 'キャベツカンテイ'],
300
+ [20, 'キャベツカンテイ']
301
+ ]
302
+ else
303
+ return nil
304
+ end
305
+
306
+ return get_badlife_1d20_table_result(name, table)
307
+ end
308
+
309
+ def get_skill_table
310
+ name = 'スキル表'
311
+ table = [
312
+ [1, '一撃離脱'],
313
+ [2, '一撃離脱'],
314
+ [3, 'チェイサー'],
315
+ [4, 'チェイサー'],
316
+ [5, '影の外套'],
317
+ [6, '影の外套'],
318
+ [7, '二段ジャンプ'],
319
+ [8, '二段ジャンプ'],
320
+ [9, '韋駄天'],
321
+ [10, '韋駄天'],
322
+ [11, '手練'],
323
+ [12, '手練'],
324
+ [13, 'ハニーテイスト'],
325
+ [14, 'ハニーテイスト'],
326
+ [15, '先見の明'],
327
+ [16, '先見の明'],
328
+ [17, 'ベテラン'],
329
+ [18, 'ベテラン'],
330
+ [19, '応急手当'],
331
+ [20, '応急手当'],
332
+ [21, 'セラピー'],
333
+ [22, 'セラピー'],
334
+ [23, '緊急治療'],
335
+ [24, '緊急治療'],
336
+ [25, 'ゴールドディガー'],
337
+ [26, 'ゴールドディガー'],
338
+ [27, 'デイリーミッション'],
339
+ [28, 'デイリーミッション'],
340
+ [29, '見切り'],
341
+ [30, '見切り'],
342
+ [31, '鷹の目'],
343
+ [32, '鷹の目'],
344
+ [33, 'しびれ罠'],
345
+ [34, 'しびれ罠'],
346
+ [35, '大逆転'],
347
+ [36, '大逆転'],
348
+ [37, '武器習熟:○○'],
349
+ [38, '武器習熟:○○'],
350
+ [39, '百発百中'],
351
+ [40, '百発百中'],
352
+ [41, '屈強な肉体'],
353
+ [42, '屈強な肉体'],
354
+ [43, '二刀流'],
355
+ [44, '二刀流'],
356
+ [45, 'クイックリカバリー'],
357
+ [46, 'クイックリカバリー'],
358
+ [47, '体験主義'],
359
+ [48, '体験主義'],
360
+ [49, '破釜沈船'],
361
+ [50, '破釜沈船'],
362
+ [51, '想定の範囲内'],
363
+ [52, '想定の範囲内'],
364
+ [53, 'セカンドチャンス'],
365
+ [54, 'セカンドチャンス'],
366
+ [55, '優秀な子分'],
367
+ [56, '優秀な子分'],
368
+ [57, '時間管理術'],
369
+ [58, '時間管理術'],
370
+ [59, '連撃術'],
371
+ [60, '連撃術'],
372
+ [61, '罵詈雑言'],
373
+ [62, '罵詈雑言'],
374
+ [63, 'ケセラセラ'],
375
+ [64, 'ケセラセラ'],
376
+ [65, 'ダンス&ミュージック'],
377
+ [66, 'ダンス&ミュージック'],
378
+ [67, 'フェイント'],
379
+ [68, 'フェイント'],
380
+ [69, 'ヘイトコントロール'],
381
+ [70, 'ヘイトコントロール'],
382
+ [71, '惜別'],
383
+ [72, '惜別'],
384
+ [73, '戦闘マシーン'],
385
+ [74, '戦闘マシーン'],
386
+ [75, '戦闘マシーン'],
387
+ [76, '名医'],
388
+ [77, '名医'],
389
+ [78, '名医'],
390
+ [79, '忍者'],
391
+ [80, '忍者'],
392
+ [81, '忍者'],
393
+ [82, '観察眼'],
394
+ [83, '観察眼'],
395
+ [84, '観察眼'],
396
+ [85, 'クレバー'],
397
+ [86, 'クレバー'],
398
+ [87, 'クレバー'],
399
+ [88, 'フェイスマン'],
400
+ [89, 'フェイスマン'],
401
+ [90, 'フェイスマン'],
402
+ [91, 'スポーツマン'],
403
+ [92, 'スポーツマン'],
404
+ [93, 'スポーツマン'],
405
+ [94, '不屈'],
406
+ [95, '不屈'],
407
+ [96, '不屈'],
408
+ [97, '慎重'],
409
+ [98, '慎重'],
410
+ [99, '慎重'],
411
+ [100, 'この表を2回振る']
412
+ ]
413
+ dice = @randomizer.roll_once(100)
414
+ result = get_table_by_number(dice, table)
415
+
416
+ return get_badlife_table_result(name, dice, result)
417
+ end
418
+
419
+ def get_badlife_1d20_table_result(name, table)
420
+ dice = @randomizer.roll_once(20)
421
+ output = get_table_by_number(dice, table)
422
+ return get_badlife_table_result(name, dice, output)
423
+ end
424
+
425
+ def get_badlife_table_result(name, dice, output)
426
+ return "#{name}(#{dice}) > #{output}"
427
+ end
428
+
429
+ def get_value(text)
430
+ text ||= ""
431
+ return ArithmeticEvaluator.eval(text)
432
+ end
433
+ end
434
+ end
435
+ end
@@ -0,0 +1,188 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class BarnaKronika < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'BarnaKronika'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'バルナ・クロニカ'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'はるなくろにか'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・通常判定 nBK
18
+  ダイス数nで判定ロールを行います。
19
+  セット数が1以上の時はセット数も表示します。
20
+ ・攻撃判定 nBA
21
+  ダイス数nで判定ロールを行い、攻撃値と命中部位も表示します。
22
+ ・クリティカルコール nBKCt nBACt
23
+  判定コマンドの後ろに「Ct」を付けるとクリティカルコールです。
24
+  ダイス数n,コール数tで判定ロールを行います。
25
+  ダイス数nで判定ロールを行います。
26
+  セット数が1以上の時はセット数も表示し、攻撃判定の場合は命中部位も表示します。
27
+ INFO_MESSAGE_TEXT
28
+
29
+ register_prefix(['\d+BK.*', '\d+BA.*', '\d+BKC\d+.*', '\d+BAC\d+.*', '\d+R6.*'])
30
+
31
+ def initialize(command)
32
+ super(command)
33
+
34
+ @sort_add_dice = true
35
+ @sort_barabara_dice = true
36
+ end
37
+
38
+ def replace_text(string)
39
+ string = string.gsub(/(\d+)BKC(\d)/) { "#{Regexp.last_match(1)}R6[0,#{Regexp.last_match(2)}]" }
40
+ string = string.gsub(/(\d+)BAC(\d)/) { "#{Regexp.last_match(1)}R6[1,#{Regexp.last_match(2)}]" }
41
+ string = string.gsub(/(\d+)BK/) { "#{Regexp.last_match(1)}R6[0,0]" }
42
+ string = string.gsub(/(\d+)BA/) { "#{Regexp.last_match(1)}R6[1,0]" }
43
+ return string
44
+ end
45
+
46
+ def eval_game_system_specific_command(string)
47
+ string = replace_text(string)
48
+
49
+ return nil unless /(^|\s)S?((\d+)[rR]6(\[([,\d]+)\])?)(\s|$)/i =~ string
50
+
51
+ string = Regexp.last_match(2)
52
+ option = Regexp.last_match(5)
53
+ dice_n = Regexp.last_match(3)
54
+ dice_n ||= 1
55
+
56
+ @isBattleMode = false # 0=判定モード, 1=戦闘モード
57
+ criticalCallDice = 0 # 0=通常, 1〜6=クリティカルコール
58
+
59
+ if option
60
+ battleModeText, criticalCallDice = option.split(",").map(&:to_i)
61
+ @isBattleMode = (battleModeText == 1)
62
+ end
63
+
64
+ debug("@isBattleMode", @isBattleMode)
65
+
66
+ dice_str, suc, set, at_str = roll_barna_kronika(dice_n, criticalCallDice)
67
+
68
+ output = "(#{string}) > [#{dice_str}] > "
69
+
70
+ if @isBattleMode
71
+ output += at_str
72
+ else
73
+ debug("suc", suc)
74
+ if suc > 1
75
+ output += "成功数#{suc}"
76
+ else
77
+ output += "失敗"
78
+ end
79
+
80
+ debug("set", set)
81
+ output += ",セット#{set}" if set > 0
82
+ end
83
+
84
+ return output
85
+ end
86
+
87
+ def roll_barna_kronika(dice_n, criticalCallDice)
88
+ dice_n = dice_n.to_i
89
+
90
+ output = ''
91
+ suc = 0
92
+ set = 0
93
+ at_str = ''
94
+ diceCountList = [0, 0, 0, 0, 0, 0]
95
+
96
+ dice_n.times do |_i|
97
+ index = @randomizer.roll_index(6)
98
+ diceCountList[index] += 1
99
+ if diceCountList[index] > suc
100
+ suc = diceCountList[index]
101
+ end
102
+ end
103
+
104
+ 6.times do |i|
105
+ diceCount = diceCountList[i]
106
+
107
+ next if diceCount == 0
108
+
109
+ diceCount.times do |_j|
110
+ output += "#{i + 1},"
111
+ end
112
+
113
+ if isCriticalCall(i, criticalCallDice)
114
+ debug("isCriticalCall")
115
+ at_str += getAttackStringWhenCriticalCall(i, diceCount)
116
+ elsif isNomalAttack(criticalCallDice, diceCount)
117
+ debug("isNomalAttack")
118
+ at_str += getAttackStringWhenNomal(i, diceCount)
119
+ end
120
+
121
+ set += 1 if diceCount > 1
122
+ end
123
+
124
+ if criticalCallDice != 0
125
+ c_cnt = diceCountList[criticalCallDice - 1]
126
+ suc = c_cnt * 2
127
+
128
+ if c_cnt != 0
129
+ set = 1
130
+ else
131
+ set = 0
132
+ end
133
+ end
134
+
135
+ if @isBattleMode && (suc < 2)
136
+ at_str = "失敗"
137
+ end
138
+
139
+ output = output.sub(/,$/, '')
140
+ at_str = at_str.sub(/,$/, '')
141
+
142
+ return output, suc, set, at_str
143
+ end
144
+
145
+ def isCriticalCall(index, criticalCallDice)
146
+ return false unless @isBattleMode
147
+ return false if criticalCallDice == 0
148
+
149
+ return (criticalCallDice == (index + 1))
150
+ end
151
+
152
+ def isNomalAttack(criticalCallDice, diceCount)
153
+ return false unless @isBattleMode
154
+ return false if criticalCallDice != 0
155
+
156
+ return (diceCount > 1)
157
+ end
158
+
159
+ def getAttackStringWhenCriticalCall(index, diceCount)
160
+ hitLocation = getAttackHitLocation(index + 1)
161
+ attackValue = (diceCount * 2)
162
+ result = hitLocation + ":攻撃値#{attackValue},"
163
+ return result
164
+ end
165
+
166
+ def getAttackStringWhenNomal(index, diceCount)
167
+ hitLocation = getAttackHitLocation(index + 1)
168
+ attackValue = diceCount
169
+ result = hitLocation + ":攻撃値#{attackValue},"
170
+ return result
171
+ end
172
+
173
+ # 命中部位表
174
+ def getAttackHitLocation(num)
175
+ table = [
176
+ [1, '頭部'],
177
+ [2, '右腕'],
178
+ [3, '左腕'],
179
+ [4, '右脚'],
180
+ [5, '左脚'],
181
+ [6, '胴体'],
182
+ ]
183
+
184
+ return get_table_by_number(num, table)
185
+ end
186
+ end
187
+ end
188
+ end