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,249 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class CardRanker < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'CardRanker'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'カードランカー'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'かあとらんかあ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ランダムでモンスターカードを選ぶ (RM)
18
+ 特定のモンスターカードを選ぶ (CMxy x:色、y:番号)
19
+  白:W、青:U、緑:V、金:G、赤:R、黒:B
20
+  例)CMW1→白の2:白竜 CMG12→金の12:土精霊
21
+ 場所表 (ST)
22
+ 街中場所表 (CST)
23
+ 郊外場所表 (OST)
24
+ 学園場所表 (GST)
25
+ 運命表 (DT)
26
+ 大会運命表 (TDT)
27
+ 学園運命表 (GDT)
28
+ 崩壊運命表 (CDT)
29
+ INFO_MESSAGE_TEXT
30
+
31
+ def initialize(command)
32
+ super(command)
33
+
34
+ @sort_add_dice = true
35
+ @enabled_d66 = true
36
+ @d66_sort_type = D66SortType::ASC
37
+ end
38
+
39
+ # ゲーム別成功度判定(2D6)
40
+ def check_2D6(total, dice_total, _dice_list, cmp_op, target)
41
+ return '' if target == '?'
42
+ return '' unless cmp_op == :>=
43
+
44
+ if dice_total <= 2
45
+ return " > ファンブル"
46
+ elsif dice_total >= 12
47
+ return " > スペシャル > " + getRandumMonster()
48
+ elsif total >= target
49
+ return " > 成功"
50
+ else
51
+ return " > 失敗"
52
+ end
53
+ end
54
+
55
+ def eval_game_system_specific_command(command)
56
+ command = command.upcase
57
+
58
+ case command
59
+ when /^RM$/i
60
+ return getRandumMonster
61
+ when /^CM(\w)(\d+)$/i
62
+ color = Regexp.last_match(1).upcase
63
+ index = Regexp.last_match(2).to_i
64
+ return getMonster(color, index)
65
+ else
66
+ return roll_tables(command, TABLES)
67
+ end
68
+ end
69
+
70
+ def getRandumMonster
71
+ type = "ランダムモンスター選択"
72
+ colorTable = getColorTable
73
+ color, colorIndex = get_table_by_1d6(colorTable)
74
+
75
+ monsters = getMonsterTables(colorIndex - 1)
76
+ monsterName, monsterIndex = get_table_by_2d6(monsters)
77
+
78
+ output = "#{type}(#{colorIndex},#{monsterIndex}) > #{color}の#{monsterIndex}:#{monsterName}"
79
+ return output
80
+ end
81
+
82
+ def getColorTable
83
+ ['白', '青', '緑', '金', '赤', '黒']
84
+ end
85
+
86
+ def getMonsterTables(colorIndex)
87
+ tables = [
88
+ ['白竜', '僧侶', '格闘家', '斧使い', '剣士', '槍士', '歩兵', '弓兵', '砲兵', '天使', '軍神'],
89
+ ['水竜', '魚', '魚人', 'イカ', '蟹', '探偵', '海賊', '魔術師', '使い魔', '雲', '水精霊'],
90
+ ['緑竜', 'ワーム', '鳥人', '鳥', '獣', '獣人', 'エルフ', '妖精', '昆虫', '植物', '森精霊'],
91
+ ['金竜', '宝石', '岩石', '鋼', '錬金術師', '魔法生物', 'ドワーフ', '機械', '運命', '女神', '土精霊'],
92
+ ['火竜', '竜人', '恐竜', '戦車', '蛮族', '小鬼', '大鬼', '巨人', '雷', '炎', '火精霊'],
93
+ ['黒竜', '闇騎士', '怪物', '忍者', '妖怪', '蝙蝠', '吸血鬼', '不死者', '幽霊', '悪魔', '邪神'],
94
+ ]
95
+
96
+ return tables[colorIndex]
97
+ end
98
+
99
+ def getMonster(color, monsterIndex)
100
+ return nil if monsterIndex < 2
101
+
102
+ type = "モンスター選択"
103
+
104
+ colorWords = ['W', 'U', 'V', 'G', 'R', 'B']
105
+ colorIndex = colorWords.index(color)
106
+ debug("colorIndex")
107
+
108
+ return nil if colorIndex.nil?
109
+
110
+ colorTable = getColorTable
111
+ color = colorTable[colorIndex]
112
+
113
+ monsters = getMonsterTables(colorIndex)
114
+ debug("monsters", monsters)
115
+ debug("monsterIndex", monsterIndex)
116
+ monsterName = monsters[monsterIndex - 2]
117
+
118
+ return nil if monsterName.nil?
119
+
120
+ output = "#{type} > #{color}の#{monsterIndex}:#{monsterName}"
121
+ return output
122
+ end
123
+
124
+ TABLES = {
125
+ "BFT" => DiceTable::Table.new(
126
+ "バトルフィールド表",
127
+ "1D6",
128
+ [
129
+ "ハイ・アンティ/戦闘フェイズの終了時、勝者は通常習得できるモンスターカード一つに加えて、もう一つ敗者からモンスターカードを選んで手に入れることができる。//通常よりも多くのカードを賭けの対象にするルール。",
130
+ "バーニング/ラウンドの終了時、すべてのキャラクターは【LP】現在値を3点失う。//マグマの近くや極寒の地など体力を削られるような過酷な環境で行われるルール。",
131
+ "ノーマル/特に影響なし。//通常のルール。",
132
+ "ハード/すべてのキャラクターの判定にプラス1の修正を加える。また、ラウンド終了時にすべてのキャラクターはモンスターカードを一つ選んで破壊状態(ルールブックP187参照)にしなければならない。//風の強い場所や水中など、カードを扱いにくい環境でのルール。",
133
+ "スピード/モンスターカードのリスクが1高いものとして扱われる。また、判定に失敗した場合、速度から振り落とされて1D6のダメージを受ける。//バイクやローラーボードなどを使って行われる高速カードバトルルール。",
134
+ "デスルール/戦闘フェイズでも死亡判定が発声する。また、戦闘不能になったキャラクターは即座に死亡判定を行う。ただし、攻撃を行った側がデスルールを使用しないことを選択すれば、死亡判定は発生しない。//モンスターによって実際のダメージを与える、死の危険性があるルール。"
135
+ ]
136
+ ),
137
+ "CDT" => DiceTable::Table.new(
138
+ "崩壊運命表",
139
+ "1D6",
140
+ [
141
+ "レジェンドカードがあなたを崩壊する大地に呼び寄せた。暴虐な振る舞いをするダークランカーを倒すことをレジェンドカードは望んでいる。",
142
+ "あなたはひょんなことから人を助けた。すると、あなたはいつの間にか救世主と呼ばれる存在になっていた、救世主であるあなたに人々は懇願する。ダークランカーを倒してくれと。",
143
+ "あなたの住むところはダークランカーの力が及ばない楽園であった。しかし、楽園はダークランカー一味の襲撃にあい、あなただけが生き残ってしまった。楽園を出たあなたは戦いを決意する。",
144
+ "世の中は変わった。だが、愛する人(もしくは愛する物や家族)は健在だ。あなたは愛する人を護るためにも、ダークランカーを倒すべく動き始めた。",
145
+ "あなたはこの世界が好きだ。それはどんな理由でもよい。しかし、ダークランカーが持つダークカードはこの世界を壊す。ならば、倒してこの世界を守らねばならない。",
146
+ "崩壊していく大地。泣き叫ぶ人々の声。あなたはこの状況を作ったのが、あなたの身内であると知る。ダークカードの手から身内を救うためにも、あなたはカードを手にとった。"
147
+ ]
148
+ ),
149
+ "CST" => DiceTable::Table.new(
150
+ "街中場所表",
151
+ "1D6",
152
+ [
153
+ "カードショップ/ソウルカードを遊ぶ者たちが集まる場所。プレイスペースもあれば、カードの販売もしている。",
154
+ "ビル街/ビルが立ち並ぶ街。ビジネスマンが忙しなく動き、チェーン店が多く見られる。",
155
+ "駅前/人が集まる駅前。電車から降りてくる人は多く、今日も人と人がすれ違う。",
156
+ "食事処/レストランから大衆食堂、喫茶店やバーなど、食事は人の活力であり、カードランカーにも元気は必要だ。",
157
+ "道路/長く広い道路。車と人が通過していく場所だが、時おりトラブルを抱えたカードランカー同士が戦っている。",
158
+ "プール/都会にあるプール。都会の生活に疲れた人々が集まる場所。時おり、ソウルカードの戦いも見られる。"
159
+ ]
160
+ ),
161
+ "DT" => DiceTable::Table.new(
162
+ "運命表",
163
+ "1D6",
164
+ [
165
+ "あなたが欲しているカードはダークランカーが持っているかもしれないという情報を掴んだ。ダークランカーを倒し、アンティルールでカードを手に入れなければならない。",
166
+ "ダークランカーとなった人物とあなたはカード仲間であったが、ある日見たその人物はダークカードの力にとり憑かれて豹変していた。あなたは仲間をカードによって救うため、戦いを決意した。",
167
+ "ダークランカーはあなたの仲間や身内、大切なモノを傷つけた(壊した)。あなたの大切なものを傷つけたダークランカー、許しはしない。",
168
+ "あなたの持つレジェンドカードが、ダークランカーもしくは他のレジェンドカードが出現することを察知した。レジェンドカードに導かれるまま、キミはダークランカー(レジェンドカード)を探し始めた。",
169
+ "カードランカーの組織やソウルカードの安定を願う人からそのダークランカーを倒すように依頼を受けた、あなたはその仕事を受ける価値があると思った。そう思った理由は報酬でもいいし、あなたの流儀でもよい。",
170
+ "ダークランカーとあなたは偶然にも出会ってしまった。ダークランカーは危険な存在だ。見てしまった以上、放っておくわけにはいかない。"
171
+ ]
172
+ ),
173
+ "GDT" => DiceTable::Table.new(
174
+ "学園運命表",
175
+ "1D6",
176
+ [
177
+ "あなたが過ごしているクラスや寮、部活が潰されそうになった。その裏にはダークランカーの影響があるらしい。",
178
+ "学園の偉い人から、カードランカーであるあなたに調査依頼が入った。どうやらダークランカーが学園に干渉しているとのこと。",
179
+ "学園内のカードが奪われた。ダークランカーの影響だろう。大切にされていたカードを取り戻すために、あなたは立ち上がった。",
180
+ "学内に邪悪な影響を受けたカードが入り込んでいた。おそらく、ダークランカーの仕業に違いない。",
181
+ "ダークランカーによって被害を受けた生徒があなたに相談してきた。あなたはその生徒のためにもダークランカーの調査に乗り出した。",
182
+ "ダークランカーの影響を受け、授業や部活動はまともにできなくなってしまった。あなたは元の学校生活を再開させるためにも、調査を始めた。"
183
+ ]
184
+ ),
185
+ "OST" => DiceTable::Table.new(
186
+ "郊外場所表",
187
+ "1D6",
188
+ [
189
+ "カードショップ/ソウルカードを遊ぶ者たちが集まる場所。少し治安と客層が悪いが、賞金稼ぎも集まる。",
190
+ "荒野/動植物も少なく、ピリピリとした雰囲気のある場所。",
191
+ "遺跡/古代の遺跡。レジェンドカードやモンスターカードはこうした場所に発生したり、隠されていたりすることが多い。",
192
+ "平原/どこまでも続く平原。動物も温厚であり、生い茂る草花が柔らかな印象を与える場所だ。",
193
+ "山岳/険しい道が続く山。カードの精霊たちが生息していることもあるが、カード山賊団には気をつけねばならない。",
194
+ "海川/海や川。山と同じくカードの精霊たちが住んでいる場所だ。安らげる場所でもあり、休憩している人がソウルカードをしている。"
195
+ ]
196
+ ),
197
+ "GST" => DiceTable::Table.new(
198
+ "学園場所表",
199
+ "1D6",
200
+ [
201
+ "購買/学生にとっては学園内で唯一買い物ができる場所。パンの他に、カードパックが売っている。",
202
+ "グラウンド/体育館/運動するのに適した広い空間だが、同時にソウルカードをやるのにもうってつけの場所である。",
203
+ "屋上/校舎の屋上は一部の生徒には人気のスポットだ。今日も強い風が彼らを迎えている。",
204
+ "教室/日が昇っている間は、学生たちの声で賑やかな場所。夕暮れからは少し物哀しく、寂しい。",
205
+ "校舎裏/学校の中でも珍しく人目につかない場所。不良たちがソウルカードをやっている姿が見られる。",
206
+ "部活棟/部活をやる者のために用意された場所。しかし、サボってソウルカードをやっているところも。"
207
+ ]
208
+ ),
209
+ "ST" => DiceTable::Table.new(
210
+ "場所表",
211
+ "1D6",
212
+ [
213
+ "カード系/ショップや大会の会場など、ソウルカードに関係がある場所。カードランカーたちも集まってくる。",
214
+ "自然/公園や山など、自然の息吹が感じられる場所。耳を澄ませばカードの声も聞こえるかもしれない。",
215
+ "神秘/古代の施設や、神社・教会などの神秘的な場所。レジェンドカードが隠されているかもしれない。",
216
+ "安息/自宅など、安らげる空間。そこはあなたが安らげる場所であり、思い出の地なのかもしれない。",
217
+ "街中/人々が住む街中。何気なく落ちているカードの中には、価値があるものもあるかも。",
218
+ "水辺/プールや海岸など、水が近くに存在する場所。ひとまず、ここでひと息つけそうだ。"
219
+ ]
220
+ ),
221
+ "TDT" => DiceTable::Table.new(
222
+ "大会運命表",
223
+ "1D6",
224
+ [
225
+ "あなたは友人と共に大会に出場した。しかし、友人はダークランカーによって倒されてしまった。",
226
+ "あなたは大会の商品を狙い、大会に出場した。だが、ダークランカーもそれを狙っているらしい。",
227
+ "あなたは大会の運営者から、大会に関わっているダークランカーの撃破を依頼された。",
228
+ "あなたはカードの導くままに、大会に関わってくるダークランカーの出現を察知した。",
229
+ "あなたは大会の一選手として戦っていた。だが、謎の刺客によって襲われた。きっとダークランカーの仕業に違いない。",
230
+ "あなたは大会に出場し、優勝候補と言われているカードランカーだ。だが、そんなキミをダークランカーは襲った。"
231
+ ]
232
+ ),
233
+ "WT" => DiceTable::Table.new(
234
+ "変調表",
235
+ "1D6",
236
+ [
237
+ "猛毒/ラウンド終了時に【LP】の現在値を3点失う。また【LP】の現在値を回復できない。",
238
+ "炎上/ラウンド終了時に、モンスターカードを一つ選び破壊状態にしなければならない。既に破壊状態になっているものは選べない。",
239
+ "妨害/攻撃判定にマイナス2の修正を受ける。",
240
+ "捕縛/ブロック判定にマイナス2の修正を受ける。",
241
+ "召喚制限/「タイプ:補助」のモンスターカードを使用できない。",
242
+ "暗闇/「タイプ:支援」のモンスターカードを使用できない。"
243
+ ]
244
+ ),
245
+ }.freeze
246
+ register_prefix(['RM', 'CM.*'] + TABLES.keys)
247
+ end
248
+ end
249
+ end
@@ -0,0 +1,181 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/command_parser'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class ChaosFlare < Base
8
+ # ゲームシステムの識別子
9
+ ID = 'ChaosFlare'
10
+ # ゲームシステム名
11
+ NAME = 'カオスフレア'
12
+
13
+ # ゲームシステム名の読みがな
14
+ SORT_KEY = 'かおすふれあ'
15
+
16
+ # ダイスボットの使い方
17
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
18
+ 判定
19
+ CF
20
+ 書式: [ダイスの数]CF[修正値][@クリティカル値][#ファンブル値][>=目標値]
21
+ CF以外は全て省略可能
22
+ 例:
23
+ - CF 2D6,クリティカル値12,ファンブル値2で判定
24
+ - CF+10@10 修正値+10,クリティカル値10で判定
25
+ - CF+10#3 修正値+10,ファンブル値3で判定
26
+ - CF+10>=10 目標値を指定した場合、差分値も出力する
27
+ - 3CF+10@10#3>=10 3D6での判定
28
+ - CF@9#3+8>=10
29
+
30
+ 2D6
31
+ ファンブル値2で判定する。クリティカルの判定は行われない。
32
+ 目標値が設定された場合、差分値を出力する。
33
+ - 2D6+4>=10
34
+
35
+ 各種表
36
+ FT: 因縁表
37
+ FTx: 数値を指定すると因果表の値を出力する
38
+ - FT -> 11から66の間でランダム決定
39
+ - FT23 -> 23の項目を出力
40
+ - FT0
41
+ - FT7
42
+ INFO_MESSAGE_TEXT
43
+
44
+ register_prefix(['\d*CF.*', 'FT\d*'])
45
+
46
+ # ゲーム別成功度判定(2D6)。以前の処理をそのまま残しています。
47
+ def check_2D6(total, dice_total, _dice_list, cmp_op, target)
48
+ return '' if target == '?'
49
+
50
+ output = ''
51
+
52
+ if dice_total <= 2
53
+ total -= 20
54
+ output = " > ファンブル(-20)"
55
+ end
56
+
57
+ unless cmp_op == :>=
58
+ return output
59
+ end
60
+
61
+ if total >= target
62
+ output += " > 成功"
63
+ if total > target
64
+ output += " > 差分値#{total - target}"
65
+ end
66
+ else
67
+ output += " > 失敗 > 差分値#{total - target}"
68
+ end
69
+
70
+ return output
71
+ end
72
+
73
+ def eval_game_system_specific_command(command)
74
+ if command.start_with? "FT"
75
+ roll_fate_table(command)
76
+ else
77
+ cf_roll(command)
78
+ end
79
+ end
80
+
81
+ private
82
+
83
+ # 因縁表
84
+ def roll_fate_table(command)
85
+ m = /^FT(\d+)?/.match(command)
86
+ if m[1]
87
+ num = m[1].to_i
88
+ if [0, 7].include?(num)
89
+ return "因果表(#{num}) > #{FATE_TABLE[num][0]}"
90
+ end
91
+
92
+ dice1 = num / 10
93
+ dice2 = num % 10
94
+ if !(1..6).include?(dice1) || !(1..6).include?(dice2)
95
+ return nil
96
+ end
97
+ else
98
+ dice1 = @randomizer.roll_once(6)
99
+ dice2 = @randomizer.roll_once(6)
100
+ end
101
+
102
+ index1 = dice1
103
+ index2 = (dice2 / 2) - 1
104
+ return "因果表(#{dice1}#{dice2}) > #{FATE_TABLE[index1][index2]}"
105
+ end
106
+
107
+ # カオスフレア専用コマンド
108
+ # @param command [String]
109
+ # @return [String, nil]
110
+ def cf_roll(command)
111
+ parser = CommandParser.new(/\d*CF/)
112
+
113
+ @cmd = parser.parse(command)
114
+ unless @cmd
115
+ return nil
116
+ end
117
+
118
+ times = @cmd.command == "CF" ? 2 : @cmd.command.to_i
119
+ critical = @cmd.critical || 12
120
+ fumble = @cmd.fumble || 2
121
+ @cmd.dollar = nil
122
+
123
+ if times < 0 || ![:>=, nil].include?(@cmd.cmp_op)
124
+ return nil
125
+ end
126
+
127
+ dice_list = @randomizer.roll_barabara(times, 6)
128
+ dice_total = dice_list.sum()
129
+ dice_list_text = dice_list.join(",")
130
+
131
+ is_critical = dice_total >= critical
132
+ is_fumble = dice_total <= fumble
133
+
134
+ total =
135
+ if is_critical
136
+ 30
137
+ elsif is_fumble
138
+ -20
139
+ else
140
+ dice_total
141
+ end
142
+
143
+ total += @cmd.modify_number
144
+
145
+ sequence = [
146
+ "(#{@cmd.to_s(:after_modify_number)})",
147
+ "#{dice_total}[#{dice_list_text}]",
148
+ total.to_s,
149
+ ("0" if total < 0),
150
+ ("クリティカル" if is_critical),
151
+ ("ファンブル" if is_fumble),
152
+ ("差分値 #{difference(total)}" if @cmd.target_number),
153
+ ].compact
154
+
155
+ return sequence.join(" > ")
156
+ end
157
+
158
+ # @param total [Integer] 合計値
159
+ # @return [Integer] 差分値
160
+ def difference(total)
161
+ if total < 0
162
+ -@cmd.target_number
163
+ else
164
+ total - @cmd.target_number
165
+ end
166
+ end
167
+
168
+ # 表を振るのに使う定数的なやつ。
169
+ FATE_TABLE = [
170
+ ["腐れ縁"],
171
+ ["純愛", "親近感", "庇護"],
172
+ ["信頼", "感服", "共感"],
173
+ ["友情", "尊敬", "慕情"],
174
+ ["好敵手", "期待", "借り"],
175
+ ["興味", "憎悪", "悲しみ"],
176
+ ["恐怖", "執着", "利用"],
177
+ ["任意"]
178
+ ].freeze
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,163 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Chill < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'Chill'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'Chill'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'ちる'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・ストライク・ランク (SRx)
18
+  "SRストライク・ランク"の形で記入します。
19
+  ストライク・ランク・チャートに従って自動でダイスロールを行い、
20
+  負傷とスタミナロスを計算します。
21
+  ダイスロールと同様に、他のプレイヤーに隠れてロールすることも可能です。
22
+  例)SR7   sr13   SR(7+4)   Ssr10
23
+ INFO_MESSAGE_TEXT
24
+
25
+ register_prefix(['SR\d+.*'])
26
+
27
+ def check_1D100(total, _dice_total, cmp_op, target)
28
+ return '' if target == '?'
29
+ return '' if cmp_op != :<=
30
+
31
+ if total >= 100
32
+ " > ファンブル"
33
+ elsif total > target
34
+ " > 失敗"
35
+ elsif total >= (target * 0.9)
36
+ " > L成功"
37
+ elsif total >= (target / 2)
38
+ " > M成功"
39
+ elsif total >= (target / 10)
40
+ " > H成功"
41
+ else
42
+ " > C成功"
43
+ end
44
+ end
45
+
46
+ def eval_game_system_specific_command(command)
47
+ roll_strike_rank_result(command)
48
+ end
49
+
50
+ def roll_strike_rank_result(string)
51
+ debug('strike_rank begin string', string)
52
+
53
+ wounds = 0
54
+ sta_loss = 0
55
+ dice = ''
56
+ dice_add = ""
57
+ dice_str = ""
58
+
59
+ unless /(^|\s)[sS]?(SR|sr)(\d+)($|\s)/ =~ string
60
+ debug('invalid string', string)
61
+ return "1"
62
+ end
63
+
64
+ strikeRank = Regexp.last_match(3).to_i
65
+
66
+ if strikeRank < 14
67
+ sta_loss, dice, dice_add, dice_str = check_strike_rank(strikeRank)
68
+ wounds, dice_w, dice_wa, dice_ws = check_strike_rank(strikeRank - 3)
69
+ dice = dice + ', ' + dice_w
70
+ dice_add += ', ' + dice_wa
71
+ dice_str = dice_str + ', ' + dice_ws
72
+ else
73
+ sta_loss, _dice, dice_add, dice_str = check_strike_rank(13)
74
+
75
+ dice_list = @randomizer.roll_barabara(4, 10)
76
+ wounds = dice_list.sum()
77
+ dice_ws = dice_list.join(",")
78
+
79
+ dice = '5d10*3, 4d10+' + ((strikeRank - 13) * 2).to_s + 'd10'
80
+ dice_add += ', ' + wounds.to_s
81
+ dice_str = "#{dice_str}, #{dice_ws}"
82
+
83
+ dice_list = @randomizer.roll_barabara((strikeRank - 13) * 2, 10)
84
+ wounds_wk = dice_list.sum()
85
+ dice_ws = dice_list.join(",")
86
+
87
+ dice_str += "+#{dice_ws}"
88
+ dice_add += "+#{wounds_wk}"
89
+ wounds += wounds_wk
90
+ end
91
+
92
+ output = "#{dice_str} > #{dice_add} > スタミナ損失#{sta_loss}, 負傷#{wounds}"
93
+
94
+ string += ':' + dice
95
+
96
+ if output.empty?
97
+ return "1"
98
+ end
99
+
100
+ output = "(#{string}) > #{output}"
101
+ debug('strike_rank end output', output)
102
+
103
+ return output
104
+ end
105
+
106
+ def check_strike_rank(strikeRank)
107
+ strikeRank = strikeRank.to_i
108
+
109
+ dice = ''
110
+ dice_add = ''
111
+ dice_str = ''
112
+ damage = 0
113
+
114
+ if strikeRank < 1
115
+ damage = 0
116
+ dice_str = '-'
117
+ dice_add = '-'
118
+ dice = '-'
119
+
120
+ elsif strikeRank < 2
121
+ dice = '0or1'
122
+ damage = @randomizer.roll_once(2)
123
+ dice_str = damage.to_s
124
+
125
+ damage -= 1
126
+ dice_add = damage.to_s
127
+ elsif strikeRank < 3
128
+ dice = '1or2'
129
+ damage = @randomizer.roll_once(2)
130
+ dice_str = damage.to_s
131
+ dice_add = damage.to_s
132
+ elsif strikeRank < 4
133
+ dice = '1d5'
134
+ damage = @randomizer.roll_once(5)
135
+ dice_str = damage.to_s
136
+ dice_add = damage.to_s
137
+ elsif strikeRank < 10
138
+ dice = (strikeRank - 3).to_s + 'd10'
139
+ dice_list = @randomizer.roll_barabara(strikeRank - 3, 10)
140
+ damage = dice_list.sum()
141
+ dice_add = damage.to_s
142
+ dice_str = dice_list.join(",")
143
+ elsif strikeRank < 13
144
+ dice = (strikeRank - 6).to_s + 'd10*2'
145
+ dice_list = @randomizer.roll_barabara(strikeRank - 6, 10)
146
+ total = dice_list.sum()
147
+ dice_add = "#{total}*2"
148
+ damage = total * 2
149
+ dice_str = "(#{dice_list.join(',')})*2"
150
+ else
151
+ dice = '5d10*3'
152
+ dice_list = @randomizer.roll_barabara(5, 10)
153
+ total = dice_list.sum()
154
+ dice_add = "#{total}*3"
155
+ damage = total * 3
156
+ dice_str = "(#{dice_list.join(',')})*3"
157
+ end
158
+
159
+ return damage, dice, dice_add, dice_str
160
+ end
161
+ end
162
+ end
163
+ end