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,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class RoleMaster < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'RoleMaster'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'ロールマスター'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'ろおるますたあ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = "上方無限ロール(xUn)の境界値を96にセットします。\n"
17
+
18
+ def initialize(command)
19
+ super(command)
20
+ @upper_dice_reroll_threshold = 96
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class RuneQuest < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'RuneQuest'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'ルーンクエスト'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'るうんくえすと'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ クリティカル、エフェクティブ(効果的成功)、ファンブルの自動判定を行います。
18
+ INFO_MESSAGE_TEXT
19
+
20
+ # ゲーム別成功度判定(1d100)
21
+ def check_1D100(total, _dice_total, cmp_op, target)
22
+ return '' if target == '?'
23
+ return nil unless cmp_op == :<=
24
+
25
+ # RuneQuest QUICK-START RULESを元に修正
26
+ # https://www.chaosium.com/content/FreePDFs/RuneQuest/CHA4027%20-%20RuneQuest%20Quickstart.pdf
27
+ critical_value = (target.to_f / 20).round
28
+
29
+ if (total <= 1) || (total <= critical_value)
30
+ # 1は常に決定的成功
31
+ " > 決定的成功"
32
+ elsif total >= 100
33
+ # 100は常に致命的失敗
34
+ " > 致命的失敗"
35
+ elsif total <= (target.to_f / 5).round
36
+ " > 効果的成功"
37
+ elsif total <= target
38
+ " > 成功"
39
+ elsif total >= 95 + critical_value
40
+ " > 致命的失敗"
41
+ else
42
+ " > 失敗"
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,266 @@
1
+ require "bcdice/dice_table/table"
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class RyuTuber < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'RyuTuber'.freeze
8
+
9
+ # ゲームシステム名
10
+ NAME = 'リューチューバーとちいさな奇跡'.freeze
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'りゆうちゆうはあとちいさなきせき'.freeze
14
+
15
+ HELP_MESSAGE = <<~MESSAGETEXT.freeze
16
+ ◆判定
17
+  ・判定 nB6<=1
18
+   ※ n:サイコロの数 例)12B6<=1 サイコロの数12個の場合
19
+  ・判定ルールを表示する RTB
20
+ ◆職業 (カッコ内は使えそうな技能)
21
+  ・職業表 JT
22
+  ・学生表 JST
23
+  ・技術・専門職表 JTPT
24
+  ・事務・サービス職表 JOST
25
+  ・エンタメ職表 JET
26
+ ◆趣味 (カッコ内は使えそうな技能)
27
+  ・趣味表 HT
28
+  ・多人数でできる趣味表 HGT
29
+  ・一人でできるインドア趣味表A HIAT
30
+  ・一人でできるインドア趣味表B HIBT
31
+  ・一人でできるアウトドア趣味表A HOAT
32
+  ・一人でできるアウトドア趣味表B HOBT
33
+ ◆奇跡の演目を表示する
34
+  ・幸運の風が吹いている MPW
35
+  ・困った時はお互い様 MPT
36
+  ・悪い予感は的中する MPF
37
+  ・ついていい嘘もある MPL
38
+  ・私には星が見えている MPS
39
+  ・心は竜と共にあり MPD
40
+  ・人は石垣、人は城 MPH
41
+ MESSAGETEXT
42
+
43
+ def eval_game_system_specific_command(command) # ダイスロールコマンド
44
+ if (ret = roll_tables(command, TABLES))
45
+ return ret
46
+ end
47
+
48
+ if (text = TEXTS[command])
49
+ return text.chomp
50
+ end
51
+
52
+ return nil
53
+ end
54
+
55
+ TEXTS = {
56
+ 'RTB' => <<~TEXT,
57
+ 判定ルール表示
58
+ ①枠主が判定内容を宣言、判定参加者が行動宣言
59
+ ②サイコロは竜の巫女なら6個、技能レベルか指定魅力の値個、奇跡の演目を1つ以上クリアで+6個、スパの消費数個
60
+ ③振ったサイコロの「1の目」の数が目標値以上なら華麗に成功、目標値未満ならちょっと残念な結果
61
+ TEXT
62
+ 'MPW' => <<~TEXT,
63
+ 幸運の風が吹いている
64
+ 奇跡 以降ゲーム終了まで、サイコロ+1
65
+ ①健気に頑張る姿を見せる。
66
+ ②報われることはなく、さらに最悪の展開に。
67
+ ③それでも健気なところを見せる。
68
+ TEXT
69
+ 'MPT' => <<~TEXT,
70
+ 困った時はお互い様
71
+ 奇跡 そのプレイヤーの判定サイコロを1回振り直しできる
72
+ ①けちな様子を見せる。
73
+ ②困っている人に施しをする姿を見られる。
74
+ ③窮地に陥る。
75
+ TEXT
76
+ 'MPF' => <<~TEXT,
77
+ 悪い予感は的中する
78
+ 奇跡 1判定だけ、サイコロ+3
79
+ ①犠牲者が悪い噂を耳にする。
80
+ ②犠牲者が悪い冗談を言う。
81
+ ③犠牲者が悪い予感に心さざめき、誰かに悪い予感を話す。
82
+ TEXT
83
+ 'MPL' => <<~TEXT,
84
+ ついていい嘘もある
85
+ 奇跡 ついた(ささやかな)嘘が本当になる 枠主判断でいつか発動する。
86
+ ①嘘を言う。
87
+ ②嘘によって窮地に立つ。
88
+ ③嘘を嘘にしないためにあがく。
89
+ TEXT
90
+ 'MPS' => <<~TEXT,
91
+ 私には星が見えている
92
+ 奇跡 指定したキャラクターの次の行動がわかる
93
+ ①少し先のことを言い当てる。
94
+ ②気味が悪いと噂になる。
95
+ ③言い当てる力を人間観察に用いる。
96
+ TEXT
97
+ 'MPD' => <<~TEXT,
98
+ 心は竜と共にあり
99
+ 奇跡 起こりうる不幸を阻止する
100
+ ①心清いひとに助けられる。
101
+ ②自分の性根悪さを悲しむ。
102
+ ③自分なりのやり方で心清い行いをする。
103
+ TEXT
104
+ 'MPH' => <<~TEXT,
105
+ 人は石垣、人は城
106
+ 奇跡 感化された周りの人が手伝うようになる
107
+ ①人々の不幸を見て、親切にしてしまう。
108
+ ②けなげに頑張る姿を見られる。
109
+ ③見ていた人々が集まってくる。
110
+ TEXT
111
+ }.freeze
112
+
113
+ TABLES = {
114
+ "JT" => DiceTable::Table.new(
115
+ "職業表",
116
+ "1D6",
117
+ [
118
+ '学生表へ',
119
+ '技術・専門職表へ',
120
+ '技術・専門職表へ',
121
+ '事務・サービス職表へ',
122
+ '事務・サービス職表へ',
123
+ 'エンタメ職表へ'
124
+ ]
125
+ ),
126
+ "JST" => DiceTable::Table.new(
127
+ "学生表",
128
+ "1D6",
129
+ [
130
+ '中学生 (ゲーム 運動する)',
131
+ '高校生(文系) (仲良くする 文章を書く)',
132
+ '高校生(理系) (仲良くする 科学の知識)',
133
+ '専門学校生 (ものづくり 設計する)',
134
+ '大学生(文系) (社会の仕組み 外国語)',
135
+ '大学生(理系) (すごい技術 科学の知識)'
136
+ ]
137
+ ),
138
+ "JTPT" => DiceTable::Table.new(
139
+ "技術・専門職表",
140
+ "2D6",
141
+ [
142
+ '勝負師・山師 (洞察力 精神力)',
143
+ '漁師/猟師 (自然の知識 料理する)',
144
+ '建築家、大工 (設計する 運転する)',
145
+ '料理人 (料理する ものづくり)',
146
+ '職人 (ものづくり 丁寧)',
147
+ '農家 (自然の知識 育てる)',
148
+ '医療・福祉関係(医師、薬剤師、介護職) (治す 科学の知識)',
149
+ '美容、スタイリスト (見た目を整える 仲良くする)',
150
+ 'プログラマー (プログラム 設計する)',
151
+ '士業(税理士、弁護士、行政書士等) (社会の仕組み 事務仕事)',
152
+ '研究者 (教える すごい技術)'
153
+ ]
154
+ ),
155
+ "JOST" => DiceTable::Table.new(
156
+ "事務・サービス職表",
157
+ "2D6",
158
+ [
159
+ '宗教関係(巫女、僧侶など) (お祈りする 地元知識)',
160
+ '観光、旅行 (外国語 地元知識)',
161
+ '教師、保育士 (教える 育てる)',
162
+ '運転手、配達員 (運転する 地元知識)',
163
+ '自宅警備員 (ゲーム 想像力)',
164
+ 'サラリーマン (事務仕事 仲良くする)',
165
+ '店員 (丁寧 商品知識)',
166
+ '公務員 (事務仕事 地元知識)',
167
+ '警察、自衛隊、消防士 (社会の仕組み 戦う)',
168
+ '投資家、金融業、不動産 (プレゼンする 事務仕事)',
169
+ '経営者 (社会の仕組み 仲良くする)'
170
+ ]
171
+ ),
172
+ "JET" => DiceTable::Table.new(
173
+ "エンタメ職表",
174
+ "2D6",
175
+ [
176
+ 'ゲーム制作 (プログラム ものづくり)',
177
+ '写真家 (自然の知識 絵を描く)',
178
+ 'デザイナー (設計する 見た目を整える)',
179
+ 'ライター (文章を書く 想像力)',
180
+ 'イラストレーター (絵を描く 見た目を整える)',
181
+ '専業配信者 (プレゼンする カリスマ)',
182
+ '声優 (声を出す 演技する)',
183
+ 'ミュージシャン (声を出す 音楽)',
184
+ 'アイドル・芸能人 (演技する カリスマ)',
185
+ 'プロゲーマー (ゲーム 戦う)',
186
+ 'プロスポーツ選手 (運動する 精神力)'
187
+ ]
188
+ ),
189
+ "HT" => DiceTable::Table.new(
190
+ "趣味表",
191
+ "1D6",
192
+ [
193
+ '多人数でできる趣味表へ',
194
+ '多人数でできる趣味表へ',
195
+ '一人でできるインドア趣味表Aへ',
196
+ '一人でできるインドア趣味表Bへ',
197
+ '一人でできるアウトドア趣味表Aへ',
198
+ '一人でできるアウトドア趣味表Bへ'
199
+ ]
200
+ ),
201
+ "HGT" => DiceTable::Table.new(
202
+ "多人数でできる趣味表",
203
+ "1D6",
204
+ [
205
+ '家族サービス (仲良くする 育てる)',
206
+ '野球・フットサル (仲良くする 運動する)',
207
+ 'ボードゲーム/TRPG/囲碁/将棋 (ゲーム 想像する)',
208
+ 'ボランティア (忍耐力 カリスマ)',
209
+ 'サバイバルゲーム (戦う 隠れる)',
210
+ 'バンド (音楽 見た目を整える)'
211
+ ]
212
+ ),
213
+ "HIAT" => DiceTable::Table.new(
214
+ "一人でできるインドア趣味表A",
215
+ "1D6",
216
+ [
217
+ '工芸 (ものづくり 想像力)',
218
+ '編み物 (丁寧 見た目を整える)',
219
+ '陶芸 (ものづくり 想像力)',
220
+ 'プラモ (ものづくり 見た目を整える)',
221
+ '同人 (絵を描く 文章を書く)',
222
+ '読書 (外国語 社会の仕組み)'
223
+ ]
224
+ ),
225
+ "HIBT" => DiceTable::Table.new(
226
+ "一人でできるインドア趣味表B",
227
+ "1D6",
228
+ [
229
+ '仕事 (事務仕事 忍耐力)',
230
+ '資格集め (社会の仕組み 商品知識)',
231
+ 'お絵かき (絵を描く 想像力)',
232
+ '料理 (料理する 設計する)',
233
+ '筋トレ (運動する 忍耐力)',
234
+ 'コンピューターゲーム (ゲーム プログラム)'
235
+ ]
236
+ ),
237
+ "HOAT" => DiceTable::Table.new(
238
+ "一人でできるアウトドア趣味表A",
239
+ "1D6",
240
+ [
241
+ 'スポーツ観戦 (忍耐力 お祈りする)',
242
+ '水泳 (運動する 泳ぐ)',
243
+ '旅行/鉄道 (移動する 外国語)',
244
+ '写真 (自然の知識 想像力)',
245
+ 'ジグソーパズル (ゲーム 忍耐力)',
246
+ 'マラソン (運動する 忍耐力)'
247
+ ]
248
+ ),
249
+ "HOBT" => DiceTable::Table.new(
250
+ "一人でできるアウトドア趣味表B",
251
+ "1D6",
252
+ [
253
+ 'スキー・スノーボード (運動する 自然の知識)',
254
+ '自転車 (移動する 運動する)',
255
+ '盆栽・生花 (丁寧 育てる)',
256
+ 'キャンプ (自然の知識 精神力)',
257
+ '映画鑑賞 (演技する 想像力)',
258
+ '恋愛 (仲良くする 見た目を整える)'
259
+ ]
260
+ )
261
+ }.freeze
262
+
263
+ register_prefix(TEXTS.keys + TABLES.keys)
264
+ end
265
+ end
266
+ end
@@ -0,0 +1,199 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Ryutama < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'Ryutama'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'りゅうたま'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'りゆうたま'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・判定
18
+  Rx,y>=t(x,y:使用する能力値、t:目標値)
19
+  1ゾロ、クリティカルも含めて判定結果を表示します
20
+  能力値1つでの判定は Rx>=t で行えます
21
+ 例)R8,6>=13
22
+ INFO_MESSAGE_TEXT
23
+
24
+ register_prefix(['R\d+.*'])
25
+
26
+ def initialize(command)
27
+ super(command)
28
+ @validDiceTypes = [20, 12, 10, 8, 6, 4, 2]
29
+ end
30
+
31
+ def eval_game_system_specific_command(command)
32
+ debug('eval_game_system_specific_command begin')
33
+
34
+ unless command =~ /^R(\d+)(,(\d+))?([\+\-\d]+)?(>=(\d+))?/
35
+ debug('unmatched!')
36
+ return ''
37
+ end
38
+ debug('matched')
39
+
40
+ dice1 = Regexp.last_match(1).to_i
41
+ dice2 = Regexp.last_match(3).to_i
42
+ modifyString = Regexp.last_match(4)
43
+ difficulty = Regexp.last_match(6)
44
+
45
+ dice1, dice2 = getDiceType(dice1, dice2)
46
+ if dice1 == 0
47
+ return ''
48
+ end
49
+
50
+ modifyString ||= ''
51
+ modify = ArithmeticEvaluator.eval(modifyString)
52
+ difficulty = getDiffculty(difficulty)
53
+
54
+ value1 = getRollValue(dice1)
55
+ value2 = getRollValue(dice2)
56
+ total = value1 + value2 + modify
57
+
58
+ result = getResultText(value1, value2, dice1, dice2, difficulty, total)
59
+ unless result.empty?
60
+ result = " > #{result}"
61
+ end
62
+
63
+ value1Text = "#{value1}(#{dice1})"
64
+ value2Text = (value2 == 0 ? "" : "+#{value2}(#{dice2})")
65
+ modifyText = getModifyString(modify)
66
+
67
+ baseText = getBaseText(dice1, dice2, modify, difficulty)
68
+ output = "(#{baseText}) > #{value1Text}#{value2Text}#{modifyText} > #{total}#{result}"
69
+ return output
70
+ end
71
+
72
+ def getDiceType(dice1, dice2)
73
+ debug('getDiceType begin')
74
+
75
+ if dice2 != 0
76
+ if isValidDiceOne(dice1)
77
+ return dice1, dice2
78
+ else
79
+ return 0, 0
80
+ end
81
+ end
82
+
83
+ if isValidDice(dice1, dice2)
84
+ return dice1, dice2
85
+ end
86
+
87
+ diceBase = dice1
88
+
89
+ dice1 = diceBase / 10
90
+ dice2 = diceBase % 10
91
+
92
+ if isValidDice(dice1, dice2)
93
+ return dice1, dice2
94
+ end
95
+
96
+ dice1 = diceBase / 100
97
+ dice2 = diceBase % 100
98
+
99
+ if isValidDice(dice1, dice2)
100
+ return dice1, dice2
101
+ end
102
+
103
+ if isValidDiceOne(diceBase)
104
+ return diceBase, 0
105
+ end
106
+
107
+ return 0, 0
108
+ end
109
+
110
+ def isValidDice(dice1, dice2)
111
+ return (isValidDiceOne(dice1) &&
112
+ isValidDiceOne(dice2))
113
+ end
114
+
115
+ def isValidDiceOne(dice)
116
+ @validDiceTypes.include?(dice)
117
+ end
118
+
119
+ def getDiffculty(difficulty)
120
+ unless difficulty.nil?
121
+ difficulty = difficulty.to_i
122
+ end
123
+
124
+ return difficulty
125
+ end
126
+
127
+ def getRollValue(dice)
128
+ return 0 if dice == 0
129
+
130
+ value = @randomizer.roll_once(dice)
131
+ return value
132
+ end
133
+
134
+ def getResultText(value1, value2, dice1, dice2, difficulty, total)
135
+ if isFamble(value1, value2)
136
+ return "1ゾロ【1ゾロポイント+1】"
137
+ end
138
+
139
+ if isCritical(value1, value2, dice1, dice2)
140
+ return "クリティカル成功"
141
+ end
142
+
143
+ if difficulty.nil?
144
+ return ''
145
+ end
146
+
147
+ if total >= difficulty
148
+ return "成功"
149
+ end
150
+
151
+ return "失敗"
152
+ end
153
+
154
+ def isFamble(value1, value2)
155
+ return ((value1 == 1) && (value2 == 1))
156
+ end
157
+
158
+ def isCritical(value1, value2, dice1, dice2)
159
+ return false if value2 == 0
160
+
161
+ if (value1 == 6) && (value2 == 6)
162
+ return true
163
+ end
164
+
165
+ if (value1 == dice1) && (value2 == dice2)
166
+ return true
167
+ end
168
+
169
+ return false
170
+ end
171
+
172
+ def getBaseText(dice1, dice2, modify, difficulty)
173
+ baseText = "R#{dice1}"
174
+
175
+ if dice2 != 0
176
+ baseText += ",#{dice2}"
177
+ end
178
+
179
+ baseText += getModifyString(modify)
180
+
181
+ unless difficulty.nil?
182
+ baseText += ">=#{difficulty}"
183
+ end
184
+
185
+ return baseText
186
+ end
187
+
188
+ def getModifyString(modify)
189
+ if modify > 0
190
+ return "+" + modify.to_s
191
+ elsif modify < 0
192
+ return modify.to_s
193
+ end
194
+
195
+ return ''
196
+ end
197
+ end
198
+ end
199
+ end