bcdice 3.0.0.pre.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
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