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,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class TokumeiTenkousei < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'TokumeiTenkousei'
8
+
9
+ # ゲームシステム名
10
+ NAME = '特命転攻生'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'とくめいてんこうせい'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~HELP
17
+ ・判定 (xD6+y>=n)
18
+  ゾロ目での自動振り足し
19
+  1の出目に応じてEPPの獲得量を表示
20
+  目標値 "?" には未対応
21
+ HELP
22
+
23
+ def initialize(command)
24
+ super(command)
25
+
26
+ @sort_add_dice = true
27
+ end
28
+
29
+ register_prefix(['\d+D6.*'])
30
+
31
+ def eval_game_system_specific_command(command)
32
+ parser = CommandParser.new(/^\d+D6$/)
33
+ cmd = parser.parse(command)
34
+ unless cmd
35
+ return nil
36
+ end
37
+
38
+ times = cmd.command.to_i
39
+
40
+ dice_list = @randomizer.roll_barabara(times, 6).sort
41
+ @dice_list = [dice_list]
42
+ while same_all_dice?(dice_list)
43
+ dice_list = @randomizer.roll_barabara(times, 6).sort
44
+ @dice_list.push(dice_list)
45
+ end
46
+
47
+ dice_list_flatten = @dice_list.flatten
48
+ dice_total = dice_list_flatten.sum()
49
+ count_one = dice_list_flatten.count(1)
50
+
51
+ total = dice_total + cmd.modify_number
52
+
53
+ result =
54
+ if cmd.cmp_op
55
+ total.send(cmd.cmp_op, cmd.target_number) ? "成功" : "失敗"
56
+ end
57
+
58
+ sequence = [
59
+ "(#{cmd})",
60
+ interim_expr(cmd, dice_total),
61
+ total.to_s,
62
+ result,
63
+ epp(count_one)
64
+ ].compact
65
+
66
+ return sequence.join(" > ")
67
+ end
68
+
69
+ # 出目が全て同じか
70
+ def same_all_dice?(dice_list)
71
+ dice_list.size > 1 && dice_list.uniq.size == 1
72
+ end
73
+
74
+ def interim_expr(cmd, dice_total)
75
+ if @dice_list.flatten.size == 1 && cmd.modify_number == 0
76
+ return nil
77
+ end
78
+
79
+ dice_list = @dice_list.map { |ds| "[#{ds.join(',')}]" }.join("")
80
+ modifier = Format.modifier(cmd.modify_number)
81
+
82
+ return [dice_total.to_s, dice_list, modifier].join("")
83
+ end
84
+
85
+ # エキストラパワーポイント獲得
86
+ #
87
+ # @param count_one [Integer]
88
+ # @return [String, nil]
89
+ def epp(count_one)
90
+ if count_one > 0
91
+ "#{count_one * 5}EPP獲得"
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class TokyoGhostResearch < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'TokyoGhostResearch'
8
+
9
+ # ゲームシステム名
10
+ NAME = '東京ゴーストリサーチ'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'とうきようこおすとりさあち'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ 判定
18
+ ・タスク処理は目標値以上の値で成功となります。
19
+ 1d10>={目標値}
20
+ 例:目標値「5」の場合、5~0で成功
21
+ 各種表
22
+ ・導入表 OP
23
+ ・一般トラブル表 TB
24
+ MESSAGETEXT
25
+
26
+ # ダイスボットで使用するコマンドを配列で列挙する
27
+ register_prefix([
28
+ 'OP', 'TB', 'TK?\(\d+\)'
29
+ ])
30
+
31
+ def eval_game_system_specific_command(command)
32
+ output =
33
+ case command.upcase
34
+
35
+ when /TK/i
36
+ return getCheckResult(command)
37
+
38
+ when 'OP'
39
+ tgr_opening_table
40
+ when 'TB'
41
+ tgr_common_trouble_table
42
+ end
43
+
44
+ return output
45
+ end
46
+
47
+ def getCheckResult(command)
48
+ output = ""
49
+ diff = 0
50
+
51
+ if /TK?<=(\d+)/i =~ command
52
+ diff = Regexp.last_match(2).to_i
53
+ end
54
+
55
+ if diff > 0
56
+ output += "(1D10<=#{diff})"
57
+
58
+ total_n = @randomizer.roll_once(10)
59
+ output += ' > ' + total_n.to_s
60
+ output += ' > ' + getCheckResultText(total_n, diff)
61
+ end
62
+ return output
63
+ end
64
+
65
+ def getCheckResultText(total_n, diff)
66
+ if total_n >= diff
67
+ result = "成功"
68
+ else
69
+ result = "失敗"
70
+ end
71
+
72
+ return result
73
+ end
74
+
75
+ # 導入表(1d10)[OP]
76
+ def tgr_opening_table
77
+ name = "導入表"
78
+ table = [
79
+ [1, "【病休中断】体調不良または怪我で療養中だったが強制召喚された。"],
80
+ [2, "【忙殺中】別の業務で忙殺中であった。"],
81
+ [3, "【出張帰り】遠方での仕事から戻ったばかり。"],
82
+ [4, "【休暇取り消し】休暇中だったが呼び戻された。"],
83
+ [5, "【平常運転】いつもどおりの仕事中だった。"],
84
+ [6, "【休暇明け】十分に休養をとったあとで、心身ともに充実している。"],
85
+ [7, "【人生の岐路】人生の岐路にまさに差し掛かったところであった。"],
86
+ [8, "【同窓会】かつての同級生に会い、差を実感したばかりだった。"],
87
+ [9, "【転職活動中】転職を考えて求人サイトを見ているところだった。"],
88
+ [10, "【サボリ中】仕事をサボっているところに呼び出しがあった。"],
89
+ ]
90
+ return get_1d10_table_result(name, table)
91
+ end
92
+
93
+ # 一般トラブル表(1d10)[TB]
94
+ def tgr_common_trouble_table
95
+ name = "一般トラブル表"
96
+ table = [
97
+ [1, "トラブルが生じたが、間一髪、危機を脱した。【ダメージなし】"],
98
+ [2, "どうにかタスクを処理したが、非常に疲労してしまった。【肉体ダメージ1点】"],
99
+ [3, "タスク処理の過程で負傷してしまった。【肉体ダメージ1点】"],
100
+ [4, "恐怖や混乱、ストレスなどで精神の均衡を崩してしまった。【精神ダメージ1点】"],
101
+ [5, "過去のトラウマなどを思い出し、気分が沈んでしまった。【精神ダメージ1点】"],
102
+ [6, "自身の信用をキズつけたり、汚名を背負ってしまった。【環境ダメージ1点】"],
103
+ [7, "会社や上司の不興を買ってしまった。【環境ダメージ1点】"],
104
+ [8, "疲労困憊で動くこともままならない。【肉体ダメージ1点+精神ダメージ1点】"],
105
+ [9, "負傷したうえ、会社に損害を与えてしまった。【肉体ダメージ1点+環境ダメージ1点】"],
106
+ [10, "上司から厳しく叱責され、まずい立場になった。【精神ダメージ1点+環境ダメージ1点】"],
107
+ ]
108
+ return get_1d10_table_result(name, table)
109
+ end
110
+
111
+ def get_1d10_table_result(name, table)
112
+ dice = @randomizer.roll_once(10)
113
+ output = get_table_by_number(dice, table)
114
+ return get_table_result(name, dice, output)
115
+ end
116
+
117
+ def get_table_result(name, dice, output)
118
+ return "#{name}(#{dice}) > #{output}"
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class TokyoNova < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'TokyoNova'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'トーキョーN◎VA'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'とおきよおのは'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = "※このダイスボットは部屋のシステム名表示用となります。\n"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,364 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Torg < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'TORG'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'トーグ'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'とおく'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・判定 (TGm)
18
+  TORG専用の判定コマンドです。
19
+  "TG(技能基本値)"でロールします。Rコマンドに読替されます。
20
+  振り足しを自動で行い、20の出目が出たときには技能無し値も並記します。
21
+ ・各種表 "(表コマンド)(数値)"で振ります。
22
+  ・一般結果表 成功度出力「RTx or RESULTx」
23
+  ・威圧/威嚇 対人行為結果表「ITx or INTIMIDATEx or TESTx」
24
+  ・挑発/トリック 対人行為結果表「TTx or TAUNTx or TRICKx or CTx」
25
+  ・間合い 対人行為結果表「MTx or MANEUVERx」
26
+  ・オーズ(一般人)ダメージ 「ODTx or ORDSx or ODAMAGEx」
27
+  ・ポシビリティー能力者ダメージ「DTx or DAMAGEx」
28
+  ・ボーナス表「BTx+y or BONUSx+y or TOTALx+y」 xは数値, yは技能基本値
29
+ INFO_MESSAGE_TEXT
30
+
31
+ register_prefix(['TG.*', '1R20.*', 'RT.*', 'Result.*', 'IT.*', 'Initimidate.*', 'TT.*', 'Taunt.*', 'Trick.*', 'CT.*', 'MT.*', 'Maneuver.*', 'ODT.*', 'ords.*', 'odamage.*', 'DT.*', 'damage.*', 'BT.*', 'bonus.*', 'total.*'])
32
+
33
+ def replace_text(string)
34
+ string = string.gsub(/Result/i, 'RT')
35
+ string = string.gsub(/(Intimidate|Test)/i, 'IT')
36
+ string = string.gsub(/(Taunt|Trick|CT)/i, 'TT')
37
+ string = string.gsub(/Maneuver/i, 'MT')
38
+ string = string.gsub(/(ords|odamage)/i, 'ODT')
39
+ string = string.gsub(/damage/i, 'DT')
40
+ string = string.gsub(/(bonus|total)/i, 'BT')
41
+ string = string.gsub(/TG(\d+)/i) { "1R20+#{Regexp.last_match(1)}" }
42
+ string = string.gsub(/TG/i, '1R20')
43
+
44
+ return string
45
+ end
46
+
47
+ #################### TORG ########################
48
+ def torg_check(string)
49
+ unless /(^|\s)S?(1R20([+-]\d+)*)(\s|$)/i =~ string
50
+ return nil
51
+ end
52
+
53
+ string = Regexp.last_match(2)
54
+ mod = Regexp.last_match(3)
55
+
56
+ debug(mod)
57
+ mod = ArithmeticEvaluator.eval(mod) if mod
58
+ debug(mod)
59
+ mod = mod.to_i
60
+
61
+ skilled, unskilled, dice_str = torg_dice
62
+ sk_bonus = get_torg_bonus(skilled)
63
+
64
+ if mod
65
+ if mod > 0
66
+ output = "#{sk_bonus}[#{dice_str}]+#{mod}"
67
+ else
68
+ output = "#{sk_bonus}[#{dice_str}]#{mod}"
69
+ end
70
+ else
71
+ output = "#{sk_bonus}[#{dice_str}]"
72
+ end
73
+
74
+ output += " > " + (sk_bonus + mod).to_s
75
+
76
+ if skilled != unskilled
77
+ output += "(技能無" + (get_torg_bonus(unskilled) + mod).to_s + ")"
78
+ end
79
+
80
+ output = "(#{string}) > #{output}"
81
+
82
+ return output
83
+ end
84
+
85
+ def torg_dice
86
+ isSkilledCritical = true
87
+ isCritical = true
88
+ skilled = 0
89
+ unskilled = 0
90
+ dice_str = ""
91
+
92
+ while isSkilledCritical
93
+ dice_n = @randomizer.roll_once(20)
94
+ skilled += dice_n
95
+ unskilled += dice_n if isCritical
96
+
97
+ dice_str += "," unless dice_str.empty?
98
+ dice_str += dice_n.to_s
99
+
100
+ if dice_n == 20
101
+ isCritical = false
102
+ elsif dice_n != 10
103
+ isSkilledCritical = false
104
+ isCritical = false
105
+ end
106
+ end
107
+
108
+ return skilled, unskilled, dice_str
109
+ end
110
+
111
+ def eval_game_system_specific_command(command)
112
+ string = command.upcase
113
+ string = replace_text(string)
114
+
115
+ if (result = torg_check(string))
116
+ return result
117
+ end
118
+
119
+ output = '1'
120
+ ttype = ""
121
+ value = 0
122
+
123
+ return nil unless /([RITMDB]T)(\d+([\+\-]\d+)*)/i =~ string
124
+
125
+ type = Regexp.last_match(1)
126
+ num = Regexp.last_match(2)
127
+
128
+ case type
129
+ when 'RT'
130
+ value = ArithmeticEvaluator.eval(num)
131
+ output = get_torg_success_level(value)
132
+ ttype = '一般結果'
133
+ when 'IT'
134
+ value = ArithmeticEvaluator.eval(num)
135
+ output = get_torg_interaction_result_intimidate_test(value)
136
+ ttype = '威圧/威嚇'
137
+ when 'TT'
138
+ value = ArithmeticEvaluator.eval(num)
139
+ output = get_torg_interaction_result_taunt_trick(value)
140
+ ttype = '挑発/トリック'
141
+ when 'MT'
142
+ value = ArithmeticEvaluator.eval(num)
143
+ output = get_torg_interaction_result_maneuver(value)
144
+ ttype = '間合い'
145
+ when 'DT'
146
+ value = ArithmeticEvaluator.eval(num)
147
+ if string =~ /ODT/i
148
+ output = get_torg_damage_ords(value)
149
+ ttype = 'オーズダメージ'
150
+ else
151
+ output = get_torg_damage_posibility(value)
152
+ ttype = 'ポシビリティ能力者ダメージ'
153
+ end
154
+ when 'BT'
155
+ output, value = get_torg_bonus_text(num)
156
+ ttype = 'ボーナス'
157
+ end
158
+
159
+ if ttype != ''
160
+ output = "#{ttype}表[#{value}] > #{output}"
161
+ end
162
+
163
+ return output
164
+ end
165
+
166
+ # 一般結果表 成功度
167
+ def get_torg_success_level(value)
168
+ success_table = [
169
+ [0, "ぎりぎり"],
170
+ [1, "ふつう"],
171
+ [3, "まあよい"],
172
+ [7, "かなりよい"],
173
+ [12, "すごい"]
174
+ ]
175
+
176
+ return get_torg_table_result(value, success_table)
177
+ end
178
+
179
+ # 対人行為結果表
180
+ # 威圧/威嚇(intimidate/Test)
181
+ def get_torg_interaction_result_intimidate_test(value)
182
+ interaction_results_table = [
183
+ [0, "技能なし"],
184
+ [5, "萎縮"],
185
+ [10, "逆転負け"],
186
+ [15, "モラル崩壊"],
187
+ [17, "プレイヤーズコール"]
188
+ ]
189
+
190
+ return get_torg_table_result(value, interaction_results_table)
191
+ end
192
+
193
+ # 挑発/トリック(Taunt/Trick)
194
+ def get_torg_interaction_result_taunt_trick(value)
195
+ interaction_results_table = [
196
+ [0, "技能なし"],
197
+ [5, "萎縮"],
198
+ [10, "逆転負け"],
199
+ [15, "高揚/逆転負け"],
200
+ [17, "プレイヤーズコール"]
201
+ ]
202
+
203
+ return get_torg_table_result(value, interaction_results_table)
204
+ end
205
+
206
+ # 間合い(maneuver)
207
+ def get_torg_interaction_result_maneuver(value)
208
+ interaction_results_table = [
209
+ [0, "技能なし"],
210
+ [5, "疲労"],
211
+ [10, "萎縮/疲労"],
212
+ [15, "逆転負け/疲労"],
213
+ [17, "プレイヤーズコール"]
214
+ ]
215
+
216
+ return get_torg_table_result(value, interaction_results_table)
217
+ end
218
+
219
+ def get_torg_table_result(value, table)
220
+ output = '1'
221
+
222
+ table.each do |item|
223
+ item_index = item[0]
224
+
225
+ if item_index > value
226
+ break
227
+ end
228
+
229
+ output = item[1]
230
+ end
231
+
232
+ return output
233
+ end
234
+
235
+ # オーズダメージチャート
236
+ def get_torg_damage_ords(value)
237
+ damage_table_ords = [
238
+ [0, "1"],
239
+ [1, "O1"],
240
+ [2, "K1"],
241
+ [3, "O2"],
242
+ [4, "O3"],
243
+ [5, "K3"],
244
+ [6, "転倒 K/O4"],
245
+ [7, "転倒 K/O5"],
246
+ [8, "1レベル負傷 K/O7"],
247
+ [9, "1レベル負傷 K/O9"],
248
+ [10, "1レベル負傷 K/O10"],
249
+ [11, "2レベル負傷 K/O11"],
250
+ [12, "2レベル負傷 KO12"],
251
+ [13, "3レベル負傷 KO13"],
252
+ [14, "3レベル負傷 KO14"],
253
+ [15, "4レベル負傷 KO15"]
254
+ ]
255
+
256
+ return get_torg_damage(value,
257
+ 4,
258
+ "レベル負傷 KO15",
259
+ damage_table_ords)
260
+ end
261
+
262
+ # ポシビリティー能力者ダメージチャート
263
+ def get_torg_damage_posibility(value)
264
+ damage_table_posibility = [
265
+ [0, "1"],
266
+ [1, "1"],
267
+ [2, "O1"],
268
+ [3, "K2"],
269
+ [4, "2"],
270
+ [5, "O2"],
271
+ [6, "転倒 O2"],
272
+ [7, "転倒 K2"],
273
+ [8, "転倒 K2"],
274
+ [9, "1レベル負傷 K3"],
275
+ [10, "1レベル負傷 K4"],
276
+ [11, "1レベル負傷 O4"],
277
+ [12, "1レベル負傷 K5"],
278
+ [13, "2レベル負傷 O4"],
279
+ [14, "2レベル負傷 KO5"],
280
+ [15, "3レベル負傷 KO5"]
281
+ ]
282
+
283
+ return get_torg_damage(value,
284
+ 3,
285
+ "レベル負傷 KO5",
286
+ damage_table_posibility)
287
+ end
288
+
289
+ def get_torg_damage(value, maxDamage, maxDamageString, damage_table)
290
+ if value < 0
291
+ return '1'
292
+ end
293
+
294
+ table_max_value = damage_table.length - 1
295
+
296
+ if value <= table_max_value
297
+ return get_torg_table_result(value, damage_table)
298
+ end
299
+
300
+ over_kill_damage = ((value - table_max_value) / 2).to_i
301
+ return "" + (over_kill_damage + maxDamage).to_s + maxDamageString
302
+ end
303
+
304
+ def get_torg_bonus_text(num)
305
+ val_arr = num.split(/\+/)
306
+ value = val_arr.shift.to_i
307
+
308
+ mod = ArithmeticEvaluator.eval(val_arr.join('+'))
309
+ resultValue = get_torg_bonus(value)
310
+
311
+ debug('TORG BT resultValue', resultValue)
312
+ debug('TORG BT mod', mod)
313
+
314
+ if mod == 0
315
+ output = resultValue.to_s
316
+ else
317
+ output = getTorgBonusOutputTextWhenModDefined(value, resultValue, mod)
318
+ value = "#{value}+#{mod}"
319
+ end
320
+
321
+ return output, value
322
+ end
323
+
324
+ def getTorgBonusOutputTextWhenModDefined(value, resultValue, mod)
325
+ debug('getTorgBonusOutputTextWhenModDefined value, mod', value, mod)
326
+ if mod > 0
327
+ return "#{resultValue}[#{value}]+#{mod} > #{resultValue + mod}"
328
+ else
329
+ debug('resultValue', resultValue)
330
+ debug('mod', mod)
331
+ return "#{resultValue}[#{value}]#{mod} > #{resultValue + mod}"
332
+ end
333
+ end
334
+
335
+ def get_torg_bonus(value)
336
+ bonus_table = [
337
+ [1, -12],
338
+ [2, -10],
339
+ [3, -8],
340
+ [5, -5],
341
+ [7, -2],
342
+ [9, -1],
343
+ [11, 0],
344
+ [13, 1],
345
+ [15, 2],
346
+ [16, 3],
347
+ [17, 4],
348
+ [18, 5],
349
+ [19, 6],
350
+ [20, 7]
351
+ ]
352
+
353
+ bonus = get_torg_table_result(value, bonus_table)
354
+
355
+ if value > 20
356
+ over_value_bonus = ((value - 21) / 5).to_i + 1
357
+ bonus += over_value_bonus
358
+ end
359
+
360
+ return bonus
361
+ end
362
+ end
363
+ end
364
+ end