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,227 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class EmbryoMachine < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'EmbryoMachine'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'エムブリオマシンRPG'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'えむふりおましんRPG'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・判定ロール(EMt+m@c#f)
18
+  目標値t、修正値m、クリティカル値c(省略時は20)、ファンブル値f(省略時は2)で攻撃判定を行います。
19
+  命中した場合は命中レベルと命中部位も自動出力します。
20
+  Rコマンドに読み替えされます。
21
+ ・各種表
22
+  ・命中部位表 HLT
23
+  ・白兵攻撃ファンブル表 MFT
24
+  ・射撃攻撃ファンブル表 SFT
25
+ INFO_MESSAGE_TEXT
26
+
27
+ register_prefix(['EM\d+.*', 'HLT', 'MFT', 'SFT', '2R10.*'])
28
+
29
+ def initialize(command)
30
+ super(command)
31
+
32
+ @sort_add_dice = true
33
+ end
34
+
35
+ def replace_text(string)
36
+ string
37
+ .gsub(/EM(\d+)([\+\-][\+\-\d]+)(@(\d+))(\#(\d+))/i) { "2R10#{Regexp.last_match(2)}>=#{Regexp.last_match(1)}[#{Regexp.last_match(4)},#{Regexp.last_match(6)}]" }
38
+ .gsub(/EM(\d+)([\+\-][\+\-\d]+)(\#(\d+))/i) { "2R10#{Regexp.last_match(2)}>=#{Regexp.last_match(1)}[20,#{Regexp.last_match(4)}]" }
39
+ .gsub(/EM(\d+)([\+\-][\+\-\d]+)(@(\d+))/i) { "2R10#{Regexp.last_match(2)}>=#{Regexp.last_match(1)}[#{Regexp.last_match(4)},2]" }
40
+ .gsub(/EM(\d+)([\+\-][\+\-\d]+)/i) { "2R10#{Regexp.last_match(2)}>=#{Regexp.last_match(1)}[20,2]" }
41
+ .gsub(/EM(\d+)(@(\d+))(\#(\d+))/i) { "2R10>=#{Regexp.last_match(1)}[#{Regexp.last_match(3)},#{Regexp.last_match(5)}]" }
42
+ .gsub(/EM(\d+)(\#(\d+))/i) { "2R10>=#{Regexp.last_match(1)}[20,#{Regexp.last_match(3)}]" }
43
+ .gsub(/EM(\d+)(@(\d+))/i) { "2R10>=#{Regexp.last_match(1)}[#{Regexp.last_match(3)},2]" }
44
+ .gsub(/EM(\d+)/i) { "2R10>=#{Regexp.last_match(1)}[20,2]" }
45
+ end
46
+
47
+ # ゲーム別成功度判定(nD10)
48
+ def check_nD10(total, dice_total, _dice_list, cmp_op, target)
49
+ return '' if target == '?'
50
+ return '' unless cmp_op == :>=
51
+
52
+ if dice_total <= 2
53
+ " > ファンブル"
54
+ elsif dice_total >= 20
55
+ " > クリティカル"
56
+ elsif total >= target
57
+ " > 成功"
58
+ else
59
+ " > 失敗"
60
+ end
61
+ end
62
+
63
+ def checkRoll(string)
64
+ string = replace_text(string)
65
+
66
+ return nil unless /(^|\s)S?(2[rR]10([\+\-\d]+)?([>=]+(\d+))(\[(\d+),(\d+)\]))(\s|$)/i =~ string
67
+
68
+ string = Regexp.last_match(2)
69
+ diff = 0
70
+ crit = 20
71
+ fumble = 2
72
+ mod = 0
73
+ modText = Regexp.last_match(3)
74
+
75
+ diff = Regexp.last_match(5).to_i if Regexp.last_match(5)
76
+ crit = Regexp.last_match(7).to_i if Regexp.last_match(7)
77
+ fumble = Regexp.last_match(8).to_i if Regexp.last_match(8)
78
+ mod = ArithmeticEvaluator.eval(modText) if modText
79
+
80
+ dice_arr = @randomizer.roll_barabara(2, 10).sort
81
+ dice_now = dice_arr.sum()
82
+ dice_str = dice_arr.join(",")
83
+
84
+ dice_loc = @randomizer.roll_sum(2, 10)
85
+ big_dice = dice_arr[1]
86
+ output = "#{dice_now}[#{dice_str}]"
87
+ total_n = dice_now + mod
88
+ if mod > 0
89
+ output += "+#{mod}"
90
+ elsif mod < 0
91
+ output += mod.to_s
92
+ end
93
+ if output =~ /[^\d\[\]]+/
94
+ output = "(#{string}) > #{output} > #{total_n}"
95
+ else
96
+ output = "(#{string}) > #{output}"
97
+ end
98
+ # 成功度判定
99
+ if dice_now <= fumble
100
+ output += " > ファンブル"
101
+ elsif dice_now >= crit
102
+ output += " > クリティカル > " + get_hit_level_table(big_dice) + "(ダメージ+10) > [#{dice_loc}]#{get_hit_location_table(dice_loc)}"
103
+ elsif total_n >= diff
104
+ output += " > 成功 > " + get_hit_level_table(big_dice) + " > [#{dice_loc}]#{get_hit_location_table(dice_loc)}"
105
+ else
106
+ output += " > 失敗"
107
+ end
108
+
109
+ return output
110
+ end
111
+
112
+ def eval_game_system_specific_command(command)
113
+ debug("eval_game_system_specific_command command", command)
114
+
115
+ if (result = checkRoll(command))
116
+ return result
117
+ end
118
+
119
+ output = '1'
120
+ type = ""
121
+ number = 0
122
+
123
+ case command
124
+ when /HLT/i
125
+ type = '命中部位'
126
+ number = @randomizer.roll_sum(2, 10)
127
+ output = get_hit_location_table(number)
128
+ when /SFT/i
129
+ type = '射撃ファンブル'
130
+ number = @randomizer.roll_sum(2, 10)
131
+ output = get_shoot_fumble_table(number)
132
+ when /MFT/i
133
+ type = '白兵ファンブル'
134
+ number = @randomizer.roll_sum(2, 10)
135
+ output = get_melee_fumble_table(number)
136
+ end
137
+
138
+ if output != '1'
139
+ output = "#{type}表(#{number}) > #{output}"
140
+ end
141
+ return output
142
+ end
143
+
144
+ # ** 命中部位表
145
+ def get_hit_location_table(num)
146
+ table = [
147
+ [4, '頭'],
148
+ [7, '左脚'],
149
+ [9, '左腕'],
150
+ [12, '胴'],
151
+ [14, '右腕'],
152
+ [17, '右脚'],
153
+ [20, '頭'],
154
+ ]
155
+
156
+ return get_table_by_number(num, table)
157
+ end
158
+
159
+ # ** ファンブル表
160
+ def get_shoot_fumble_table(num) # 射撃攻撃ファンブル表
161
+ output = '1'
162
+ table = [
163
+ '暴発した。使用した射撃武器が搭載されている部位に命中レベルAで命中する。',
164
+ 'あまりに無様な誤射をした。パイロットの精神的負傷が2段階上昇する。',
165
+ '誤射をした。自機に最も近い味方機体に命中レベルAで命中する。',
166
+ '誤射をした。対象に最も近い味方機体に命中レベルAで命中する。',
167
+ '武装が暴発した。使用した射撃武器が破損する。ダメージは発生しない。',
168
+ '転倒した。次のセグメントのアクションが待機に変更される。',
169
+ '弾詰まりを起こした。使用した射撃武器は戦闘終了まで使用できなくなる。',
170
+ '砲身が大きく歪んだ。使用した射撃武器による射撃攻撃の命中値が戦闘終了まで-3される。',
171
+ '熱量が激しく増大した。使用した射撃武器の消費弾薬が戦闘終了まで+3される。',
172
+ '暴発した。使用した射撃武器が搭載されている部位に命中レベルBで命中する。',
173
+ '弾薬が劣化した。使用した射撃武器の全てのダメージが戦闘終了まで-2される。',
174
+ '無様な誤射をした。パイロットの精神的負傷が1段階上昇する。',
175
+ '誤射をした。対象に最も近い味方機体に命中レベルBで命中する。',
176
+ '誤射をした。自機に最も近い味方機体に命中レベルBで命中する。',
177
+ '砲身が歪んだ。使用した射撃武器による射撃攻撃の命中値が戦闘終了まで-2される。',
178
+ '熱量が増大した。使用した射撃武器の消費弾薬が戦闘終了まで+2される。',
179
+ '砲身がわずかに歪んだ。使用した射撃武器による射撃攻撃の命中値が戦闘終了まで-1される。',
180
+ '熱量がやや増大した。使用した射撃武器の消費弾薬が戦闘終了まで+1される。',
181
+ '何も起きなかった。',
182
+ ]
183
+ dc = 2
184
+ output = table[num - dc] if table[num - dc]
185
+ return output
186
+ end
187
+
188
+ def get_melee_fumble_table(num) # 白兵攻撃ファンブル表
189
+ output = '1'
190
+ table = [
191
+ '大振りしすぎた。使用した白兵武器が搭載されている部位の反対の部位(右腕に搭載されているなら左側)に命中レベルAで命中する。',
192
+ '激しく頭を打った。パイロットの肉体的負傷が2段階上昇する。',
193
+ '過負荷で部位が爆発した。使用した白兵武器が搭載されている部位が全壊する。ダメージは発生せず、搭載されている武装も破損しない。',
194
+ '大振りしすぎた。使用した白兵武器が搭載されている部位の反対の部位(右腕に搭載されているなら左側)に命中レベルBで命中する。',
195
+ '武装が爆発した。使用した白兵武器が破損する。ダメージは発生しない。',
196
+ '部分的に機能停止した。使用した白兵武器は戦闘終了まで使用できなくなる。',
197
+ '転倒した。次のセグメントのアクションが待機に変更される。',
198
+ '激しい刃こぼれを起こした。使用した白兵武器の全てのダメージが戦闘終了まで-3される。',
199
+ '地面の凹凸にはまった。次の2セグメントは移動を行うことができない。',
200
+ '刃こぼれを起こした。使用した白兵武器の全てのダメージが戦闘終了まで-2される。',
201
+ '大振りしすぎた。使用した白兵武器が搭載されている部位の反対の部位(右腕に搭載されているなら左側)に命中レベルCで命中する。',
202
+ '頭を打った。パイロットの肉体的負傷が1段階上昇する。',
203
+ '駆動系が損傷した。移動力が戦闘終了まで-2される(最低1)。',
204
+ '間合いを取り損ねた。隣接している機体(複数の場合は1機をランダムに決定)に激突する。',
205
+ '機体ごと突っ込んだ。機体が向いている方角へ移動力をすべて消費するまで移動する。',
206
+ '制御系が損傷した。回避値が戦闘終了まで-1される(最低1)。',
207
+ '踏み誤った。機体が向いている方角へ移動力の半分を消費するまで移動する。',
208
+ 'たたらを踏んだ。機体が向いている方角へ1の移動力で移動する。',
209
+ '何も起きなかった。',
210
+ ]
211
+ dc = 2
212
+ output = table[num - dc] if table[num - dc]
213
+ return output
214
+ end
215
+
216
+ def get_hit_level_table(num)
217
+ table = [
218
+ [6, '命中レベルC'],
219
+ [9, '命中レベルB'],
220
+ [10, '命中レベルA'],
221
+ ]
222
+
223
+ return get_table_by_number(num, table)
224
+ end
225
+ end
226
+ end
227
+ end
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class EndBreaker < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'EndBreaker'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'エンドブレイカー!'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'えんとふれいかあ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ・判定 (nEB)
18
+ n個のD6を振る判定。ダブルトリガー発動で自動振り足し。
19
+ ・各種表
20
+ ・生死不明表 (LDUT)
21
+ MESSAGETEXT
22
+
23
+ register_prefix(['\d+EB', 'LDUT'])
24
+
25
+ def initialize(command)
26
+ super(command)
27
+
28
+ @enabled_d66 = true
29
+ @d66_sort_type = D66SortType::NO_SORT
30
+ end
31
+
32
+ def eval_game_system_specific_command(command)
33
+ if command =~ /(\d+)EB/i
34
+ diceCount = Regexp.last_match(1).to_i
35
+ return checkRoll(diceCount)
36
+ end
37
+
38
+ tableName = ""
39
+ text = ""
40
+ number = 0
41
+
42
+ case command
43
+ when "LDUT"
44
+ tableName = "生死不明表"
45
+ text, number = getLifeAndDeathUnknownResult()
46
+ else
47
+ return nil
48
+ end
49
+
50
+ result = "#{tableName}(#{number}):#{text}"
51
+
52
+ return result
53
+ end
54
+
55
+ def checkRoll(diceCount)
56
+ debug("EndBreaker diceCount", diceCount)
57
+
58
+ rollCount = diceCount # ダブルトリガー
59
+
60
+ result = ""
61
+ diceFullList = []
62
+
63
+ while rollCount != 0
64
+ diceList = @randomizer.roll_barabara(rollCount, 6).sort
65
+ diceFullList.concat(diceList)
66
+
67
+ # 1の出目ごとにダブルトリガーで2個ダイス追加
68
+ rollCount = diceList.select { |i| i == 1 }.size * 2
69
+
70
+ result += "[#{diceList.join}]"
71
+ result += " ダブルトリガー! " if rollCount > 0
72
+ end
73
+
74
+ # ダイスの出目の個数を集計
75
+ result += " >"
76
+ (2..6).each do |num|
77
+ count = diceFullList.select { |i| i == num }.size
78
+ result += " [#{num}:#{count}個]" unless count == 0
79
+ end
80
+
81
+ return result
82
+ end
83
+
84
+ def getLifeAndDeathUnknownResult()
85
+ table = [
86
+ ' 1日:生還!',
87
+ ' 1日:生還!',
88
+ ' 1日:生還!',
89
+ ' 1日:生還!',
90
+ ' 1日:生還!',
91
+ ' 1日:生還!',
92
+
93
+ ' 1日:生還!',
94
+ ' 5日:敵に捕らわれ、ひどい暴行と拷問を受けた。',
95
+ ' 2日:謎の人物に命を救われた。',
96
+ '10日:奴隷として売り飛ばされた。',
97
+ ' 8日:おぞましい儀式の生贄として連れ去られた。',
98
+ ' 9日:幽閉・投獄された。',
99
+
100
+ ' 1日:生還!',
101
+ ' 7日:モンスター蠢く地下迷宮に滑落した。',
102
+ '12日強力なマスカレイドにとらわれ、実験台にされた。',
103
+ ' 8日:放浪中に遭遇した事件を、颯爽と解決していた。',
104
+ ' 5日:飢餓状態に追い込まれた。',
105
+ '15日:記憶を失い放浪した。',
106
+
107
+ ' 1日:生還!',
108
+ '10日:異性に命を救われて、手厚い看病を受けた。',
109
+ ' 3日:負傷からくる熱病で、生死の境を彷徨った。',
110
+ '11日:闘奴にされたが、戦いと友情の末に自由を獲得した。',
111
+ ' 6日:負傷したまま川に落ち、遥か下流まで流された。',
112
+ ' 9日:敵に連れ去られ、執拗な拷問を受け続けた。',
113
+
114
+ ' 1日:生還!',
115
+ ' 4日:繰り返す「死の悪夢」に苛まれた。',
116
+ ' 3日:巨獣の巣に連れ去られた。',
117
+ '10日:謎の集団に救われて、手厚い看病を受けた。',
118
+ ' 3日:チッタニアンの集落に迷い込み、もてなしを受けた。',
119
+ ' 7日:ピュアリィの群れにとらわれ、弄ばれた。',
120
+
121
+ ' 1日:生還!',
122
+ ' 6日:楽園のような場所を発見し、しばらく逗留した。',
123
+ ' 9日:盗賊団に救われ、恩返しとして少し用心棒をした。',
124
+ '10日:熱病の見せる官能的な幻影にとらわれ、彷徨った。',
125
+ ' 5日:謎の賞金首に狙われ、傷めつけられていた。',
126
+ ' - :「五分五分」の一般判定。失敗すると死亡。',
127
+ ]
128
+ return get_table_by_d66(table)
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/game_system/SRS'
4
+
5
+ # 世界樹の迷宮SRSのダイスボット
6
+ module BCDice
7
+ module GameSystem
8
+ class EtrianOdysseySRS < SRS
9
+ # ゲームシステムの識別子
10
+ ID = 'EtrianOdysseySRS'
11
+
12
+ # ゲームシステム名
13
+ NAME = '世界樹の迷宮SRS'
14
+
15
+ # ゲームシステム名の読みがな
16
+ SORT_KEY = 'せかいしゆのめいきゆうSRS'
17
+
18
+ # 固有のコマンドの接頭辞を設定する
19
+ register_prefix(['2D6.*', 'EO.*', 'SQ.*'])
20
+
21
+ # 成功判定のエイリアスコマンドを設定する
22
+ set_aliases_for_srs_roll('EO', 'SQ')
23
+
24
+ HELP_MESSAGE = help_message()
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Fiasco < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'Fiasco'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'フィアスコ'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'ふいあすこ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<INFO_MESSAGE_TEXT
17
+ ・判定コマンド(FSx, WxBx)
18
+ 相関図・転落要素用(FSx):相関図や転落要素のためにx個ダイスを振り、出目ごとに分類する
19
+ 黒白差分判定用(WxBx) :転落、残響のために白ダイス(W指定)と黒ダイス(B指定)で差分を求める
20
+ ※ WとBは片方指定(Bx, Wx)、入替指定(WxBx,BxWx)可能
21
+
22
+ INFO_MESSAGE_TEXT
23
+
24
+ COMMAND_TYPE_INDEX = 1
25
+
26
+ START_DICE_INDEX = 2
27
+
28
+ BW_FIRST_DICE_INDEX = 2
29
+ BW_SECOND_DICE_INDEX = 5
30
+ BW_SECOND_DICE_TAG_INDEX = 4
31
+
32
+ START_COMMAND_TAG = "FS"
33
+ W_DICEROLL_COMMAND_TAG = "W"
34
+ B_DICEROLL_COMMAND_TAG = "B"
35
+
36
+ register_prefix(['(FS|[WB])(\d+).*'])
37
+
38
+ def eval_game_system_specific_command(command)
39
+ m = /\A(FS|[WB])(\d+)(([WB])(\d+))?/.match(command)
40
+ unless m
41
+ return ''
42
+ end
43
+
44
+ type = m[COMMAND_TYPE_INDEX]
45
+ if type == START_COMMAND_TAG
46
+ return makeStartDiceRoll(m)
47
+ else
48
+ return makeWhiteBlackDiceRoll(type, m)
49
+ end
50
+ end
51
+
52
+ def makeStartDiceRoll(m)
53
+ dice = m[START_DICE_INDEX].to_i
54
+
55
+ dice_list = @randomizer.roll_barabara(dice, 6)
56
+
57
+ diceList = [0, 0, 0, 0, 0, 0]
58
+ dice_list.each do |takeDice|
59
+ diceList[takeDice - 1] += 1
60
+ end
61
+
62
+ return "1 => #{diceList[0]}個 2 => #{diceList[1]}個 3 => #{diceList[2]}個 4 => #{diceList[3]}個 5 => #{diceList[4]}個 6 => #{diceList[5]}個"
63
+ end
64
+
65
+ def makeWhiteBlackDiceRoll(type, m)
66
+ if type == W_DICEROLL_COMMAND_TAG
67
+ whiteTotal, whiteDiceText, blackTotal, blackDiceText = makeArgsDiceRoll(m[BW_FIRST_DICE_INDEX], m[BW_SECOND_DICE_INDEX])
68
+ result = "白#{whiteTotal}[#{whiteDiceText}]"
69
+ if blackDiceText
70
+ if m[BW_SECOND_DICE_TAG_INDEX] == W_DICEROLL_COMMAND_TAG
71
+ return "#{m}:白指定(#{W_DICEROLL_COMMAND_TAG})は重複できません。"
72
+ end
73
+
74
+ result += " 黒#{blackTotal}[#{blackDiceText}]"
75
+ end
76
+ elsif type == B_DICEROLL_COMMAND_TAG
77
+ blackTotal, blackDiceText, whiteTotal, whiteDiceText = makeArgsDiceRoll(m[BW_FIRST_DICE_INDEX], m[BW_SECOND_DICE_INDEX])
78
+ result = "黒#{blackTotal}[#{blackDiceText}]"
79
+ if whiteDiceText
80
+ if m[BW_SECOND_DICE_TAG_INDEX] == B_DICEROLL_COMMAND_TAG
81
+ return "#{m}:黒指定(#{B_DICEROLL_COMMAND_TAG})は重複できません。"
82
+ end
83
+
84
+ result += " 白#{whiteTotal}[#{whiteDiceText}]"
85
+ end
86
+ else
87
+ return ''
88
+ end
89
+
90
+ if blackTotal > whiteTotal
91
+ return "#{result} > 黒#{blackTotal - whiteTotal}"
92
+ elsif blackTotal < whiteTotal
93
+ return "#{result} > 白#{whiteTotal - blackTotal}"
94
+ end
95
+
96
+ return "#{result} > 0"
97
+ end
98
+
99
+ def makeArgsDiceRoll(firstDice, secondDice)
100
+ firstDice = firstDice.to_i
101
+ secondDice = secondDice&.to_i
102
+
103
+ secondTotal = 0
104
+
105
+ dice_list = @randomizer.roll_barabara(firstDice, 6)
106
+ firstTotal = dice_list.sum()
107
+ firstDiceText = dice_list.join(",")
108
+
109
+ if secondDice
110
+ if secondDice > 0
111
+ dice_list = @randomizer.roll_barabara(secondDice, 6)
112
+ secondTotal = dice_list.sum()
113
+ secondDiceText = dice_list.join(",")
114
+ else
115
+ secondDiceText = "0"
116
+ end
117
+ end
118
+
119
+ return firstTotal, firstDiceText, secondTotal, secondDiceText
120
+ end
121
+ end
122
+ end
123
+ end