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,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