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,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class DarkSouls < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'DarkSouls'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'ダークソウルTRPG'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'たあくそうるTRPG'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ・行為判定:[n]DS[a±b][@t]  []内のコマンドは省略可
18
+ ・能動判定:[n]ADS[a±b][@t]  FP消費を判定
19
+  n:ダイス数。省略時は「2」
20
+  a±b:修正値。「1+2-1」のように、複数定可
21
+  @t:目標値。省略時は達成値を、指定時は判定の正否を表示
22
+ 例)DS → 2D6の達成値を表示
23
+   1DS → 1D6の達成値を表示
24
+   ADS+2-2 → 2D6+2の達成値を表示(能動判定)
25
+   DS+2@10 → 2D6+2で目標値10の判定
26
+ MESSAGETEXT
27
+
28
+ register_prefix(['(\d+)?(A)?DS([-+\d]*)(@\d+)?'])
29
+
30
+ def eval_game_system_specific_command(command)
31
+ return nil unless (m = /(\d+)?(A)?DS([-+\d]*)(@(\d+))?$/i.match(command.upcase))
32
+
33
+ diceCount = (m[1] || 2).to_i
34
+ isActive = !m[2].nil?
35
+ modify = getValue(m[3])
36
+ target = (m[5] || 0).to_i
37
+
38
+ output = checkRoll(diceCount, isActive, modify, target)
39
+
40
+ return output
41
+ end
42
+
43
+ def checkRoll(diceCount, isActive, modify, target)
44
+ dice_list = @randomizer.roll_barabara(diceCount, 6)
45
+ dice = dice_list.sum()
46
+ diceText = dice_list.join(",")
47
+
48
+ successValue = dice + modify
49
+ modifyText = getValueText(modify)
50
+ targetText = (target == 0 ? '' : ">=#{target}")
51
+
52
+ if isActive
53
+ diceArray = diceText.split(/,/).map(&:to_i)
54
+ focusDamage = diceArray.count { |i| i == 1 }
55
+
56
+ if focusDamage > 0
57
+ focusText = "■" * focusDamage
58
+ focusText = "(FP#{focusText}消費)"
59
+ end
60
+ end
61
+
62
+ result = "(#{diceCount}D6#{modifyText}#{targetText})"
63
+ result += " > #{dice}(#{diceText})#{modifyText}"
64
+ result += " > #{successValue}#{targetText}"
65
+
66
+ if target > 0
67
+ if successValue >= target
68
+ result += " > 【成功】"
69
+ else
70
+ result += " > 【失敗】"
71
+ end
72
+ end
73
+
74
+ result += focusText.to_s
75
+ return result
76
+ end
77
+
78
+ def getValue(text)
79
+ text ||= ""
80
+ return ArithmeticEvaluator.eval(text)
81
+ end
82
+
83
+ def getValueText(value)
84
+ return "" if value == 0
85
+ return value.to_s if value < 0
86
+
87
+ return "\+#{value}"
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,583 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/dice_table/range_table'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class DeadlineHeroes < Base
8
+ # ゲームシステムの識別子
9
+ ID = 'DeadlineHeroes'
10
+
11
+ # ゲームシステム名
12
+ NAME = 'デッドラインヒーローズRPG'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = 'てつとらいんひいろおすRPG'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
+ ・行為判定(DLHx)
20
+  x:成功率
21
+  例)DLH80
22
+  クリティカル、ファンブルの自動的判定を行います。
23
+  「DLH50+20-30」のように加減算記述も可能。
24
+  成功率は上限100%、下限0%
25
+ ・デスチャート(DCxY)
26
+  x:チャートの種類。肉体:DCL、精神:DCS、環境:DCC
27
+  Y=マイナス値
28
+  例)DCL5:ライフが -5 の判定
29
+    DCS3:サニティーが -3 の判定
30
+    DCC0:クレジット 0 の判定
31
+ ・ヒーローネームチャート(HNC)
32
+ ・リアルネームチャート 日本(RNCJ)、海外(RNCO)
33
+ INFO_MESSAGE_TEXT
34
+
35
+ register_prefix([
36
+ 'DLH\\d+([\\+\\-]\\d+)*',
37
+ 'DC(L|S|C)\d+',
38
+ 'RNC[JO]',
39
+ 'HNC'
40
+ ])
41
+
42
+ def eval_game_system_specific_command(command)
43
+ case command
44
+ when /^DLH/i
45
+ resolute_action(command)
46
+ when /^DC\w/i
47
+ roll_death_chart(command)
48
+ when 'HNC'
49
+ roll_hero_name_chart()
50
+ else
51
+ roll_tables(command, TABLES)
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def resolute_action(command)
58
+ m = /^DLH(\d+([\+\-]\d+)*)$/.match(command)
59
+ unless m
60
+ return nil
61
+ end
62
+
63
+ success_rate = ArithmeticEvaluator.eval(m[1])
64
+
65
+ roll_result, dice10, dice01 = roll_d100
66
+ roll_result_text = format('%02d', roll_result)
67
+
68
+ result = action_result(roll_result, dice10, dice01, success_rate)
69
+
70
+ sequence = [
71
+ "行為判定(成功率:#{success_rate}%)",
72
+ "1D100[#{dice10},#{dice01}]=#{roll_result_text}",
73
+ roll_result_text.to_s,
74
+ result
75
+ ]
76
+
77
+ return sequence.join(" > ")
78
+ end
79
+
80
+ SUCCESS_STR = "成功"
81
+ FAILURE_STR = "失敗"
82
+ CRITICAL_STR = (SUCCESS_STR + " > クリティカル! パワーの代償1/2").freeze
83
+ FUMBLE_STR = (FAILURE_STR + " > ファンブル! パワーの代償2倍&振り直し不可").freeze
84
+
85
+ def action_result(total, tens, ones, success_rate)
86
+ if total == 100 || success_rate <= 0
87
+ FUMBLE_STR
88
+ elsif total <= success_rate - 100
89
+ CRITICAL_STR
90
+ elsif tens == ones
91
+ if total <= success_rate
92
+ CRITICAL_STR
93
+ else
94
+ FUMBLE_STR
95
+ end
96
+ elsif total <= success_rate
97
+ SUCCESS_STR
98
+ else
99
+ FAILURE_STR
100
+ end
101
+ end
102
+
103
+ def roll_d100
104
+ dice10 = @randomizer.roll_once(10)
105
+ dice10 = 0 if dice10 == 10
106
+ dice01 = @randomizer.roll_once(10)
107
+ dice01 = 0 if dice01 == 10
108
+
109
+ roll_result = dice10 * 10 + dice01
110
+ roll_result = 100 if roll_result == 0
111
+
112
+ return roll_result, dice10, dice01
113
+ end
114
+
115
+ class DeathChart
116
+ def initialize(name, chart)
117
+ @name = name
118
+ @chart = chart.freeze
119
+
120
+ if @chart.size != 11
121
+ raise ArgumentError, "unexpected chart size #{name.inspect} (given #{@chart.size}, expected 11)"
122
+ end
123
+ end
124
+
125
+ # @param randomizer [Randomizer]
126
+ # @param minus_score [Integer]
127
+ # @return [String]
128
+ def roll(randomizer, minus_score)
129
+ dice = randomizer.roll_once(10)
130
+ key_number = dice + minus_score
131
+
132
+ key_text, chosen = at(key_number)
133
+
134
+ return "デスチャート(#{@name})[マイナス値:#{minus_score} + 1D10(->#{dice}) = #{key_number}] > #{key_text} : #{chosen}"
135
+ end
136
+
137
+ private
138
+
139
+ # key_numberの10から20がindexの0から10に対応する
140
+ def at(key_number)
141
+ if key_number < 10
142
+ ["10以下", @chart.first]
143
+ elsif key_number > 20
144
+ ["20以上", @chart.last]
145
+ else
146
+ [key_number.to_s, @chart[key_number - 10]]
147
+ end
148
+ end
149
+ end
150
+
151
+ def roll_death_chart(command)
152
+ m = /^DC([LSC])(\d+)$/i.match(command)
153
+ unless m
154
+ return m
155
+ end
156
+
157
+ chart = DEATH_CHARTS[m[1]]
158
+ minus_score = m[2].to_i
159
+
160
+ return chart.roll(@randomizer, minus_score)
161
+ end
162
+
163
+ DEATH_CHARTS = {
164
+ 'L' => DeathChart.new(
165
+ '肉体',
166
+ [
167
+ "何も無し。キミは奇跡的に一命を取り留めた。闘いは続く。",
168
+ "激痛が走る。以後、イベント終了時まで、全ての判定の成功率-10%。",
169
+ "キミは[硬直]ポイント2点を得る。[硬直]ポイントを所持している間、キミは「属性:妨害」のパワーを使用することができない。各ラウンド終了時、キミは所持している[硬直]ポイントを1点減らしてもよい。",
170
+ "渾身の一撃!! キミは〈生存〉判定を行なう。失敗した場合、[死亡]する。",
171
+ "キミは[気絶]ポイント2点を得る。[気絶]ポイントを所持している間、キミはあらゆるパワーを使用できず、自身のターンを得ることもできない。各ラウンド終了時、キミは所持している[気絶]ポイントを1点減らしてもよい。",
172
+ "以後、イベント終了時まで、全ての判定の成功率-20%。",
173
+ "記録的一撃!! キミは〈生存〉-20%の判定を行なう。失敗した場合、[死亡]する。",
174
+ "キミは[瀕死]ポイント2点を得る。[瀕死]ポイントを所持している間、キミはあらゆるパワーを使用できず、自身のターンを得ることもできない。各ラウンド終了時、キミは所持している[瀕死]ポイントを1点を失う。全ての[瀕死]ポイントを失う前に戦闘が終了しなかった場合、キミは[死亡]する。",
175
+ "叙事詩的一撃!! キミは〈生存〉-30%の判定を行なう。失敗した場合、[死亡]する。",
176
+ "以後、イベント終了時まで、全ての判定の成功率-30%。",
177
+ "神話的一撃!! キミは宙を舞って三回転ほどした後、地面に叩きつけられる。見るも無惨な姿。肉体は原型を留めていない(キミは[死亡]した)。",
178
+ ]
179
+ ),
180
+ 'S' => DeathChart.new(
181
+ '精神',
182
+ [
183
+ "何も無し。キミは歯を食いしばってストレスに耐えた。",
184
+ "以後、イベント終了時まで、全ての判定の成功率-10%。",
185
+ "キミは[恐怖]ポイント2点を得る。[恐怖]ポイントを所持している間、キミは「属性:攻撃」のパワーを使用できない。各ラウンド終了時、キミは所持している[恐怖]ポイントを1点減らしてもよい。",
186
+ "とても傷ついた。キミは〈意志〉判定を行なう。失敗した場合、[絶望]してNPCとなる。",
187
+ "キミは[気絶]ポイント2点を得る。[気絶]ポイントを所持している間、キミはあらゆるパワーを使用できず、自身のターンを得ることもできない。各ラウンド終了時、キミは所持している[気絶]ポイントを1点減らしてもよい。",
188
+ "以後、イベント終了時まで、全ての判定の成功率-20%。",
189
+ "信じるものに裏切られたような痛み。キミは〈意志〉-20%の判定を行なう。失敗した場合、[絶望]してNPCとなる。",
190
+ "キミは[混乱]ポイント2点を得る。[混乱]ポイントを所持している間、キミは本来味方であったキャラクターに対して、可能な限り最大の被害を与える様、行動し続ける。各ラウンド終了時、キミは所持している[混乱]ポイントを1点減らしてもよい。",
191
+ "あまりに残酷な現実。キミは〈意志〉-30%の判定を行なう。失敗した場合、[絶望]してNPCとなる。",
192
+ "以後、イベント終了時まで、全ての判定の成功率-30%。",
193
+ "宇宙開闢の理に触れるも、それは人類の認識限界を超える何かであった。キミは[絶望]し、以後NPCとなる。",
194
+ ]
195
+ ),
196
+ 'C' => DeathChart.new(
197
+ '環境',
198
+ [
199
+ "何も無し。キミは黒い噂を握りつぶした。",
200
+ "以後、イベント終了時まで、全ての判定の成功率-10%。",
201
+ "ピンチ! 以後、イベント終了時まで、キミは《支援》を使用できない。",
202
+ "裏切り!! キミは〈経済〉判定を行なう。失敗した場合、キミはヒーローとしての名声を失い、[汚名]を受ける。",
203
+ "以後、シナリオ終了時まで、代償にクレジットを消費するパワーを使用できない。",
204
+ "キミの悪評は大変なもののようだ。協力者からの支援が打ち切られる。以後、シナリオ終了時まで、全ての判定の成功率-20%。",
205
+ "信頼の失墜!! キミは〈経済〉-20%の判定を行なう。失敗した場合、キミはヒーローとしての名声を失い、[汚名]を受ける。",
206
+ "以後、シナリオ終了時まで、【環境】系の技能のレベルがすべて0となる。",
207
+ "捏造報道!! 身の覚えのない犯罪への荷担が、スクープとして報道される。キミは〈経済〉-30%の判定を行なう。失敗した場合、キミはヒーローとしての名声を失い、[汚名]を受ける。",
208
+ "以後、イベント終了時まで、全ての判定の成功率-30%。",
209
+ "キミの名は史上最悪の汚点として永遠に歴史に刻まれる。もはやキミを信じる仲間はなく、キミを助ける社会もない。キミは[汚名]を受けた。",
210
+ ]
211
+ )
212
+ }.freeze
213
+
214
+ class RealNameChart < DiceTable::RangeTable
215
+ def initialize(name, columns, chart)
216
+ items = chart.map { |l| mix_column(columns, l) }
217
+ super(name, "1D100", items)
218
+ end
219
+
220
+ private
221
+
222
+ def mix_column(columns, item)
223
+ range, names = item
224
+ if names.size == 1
225
+ return range, names[0]
226
+ end
227
+
228
+ candidate = columns.zip(names).map { |l| "\n" + l.join(": ") }.join("")
229
+ return range, candidate
230
+ end
231
+ end
232
+
233
+ TABLES = {
234
+ 'RNCJ' => RealNameChart.new(
235
+ 'リアルネームチャート(日本)',
236
+ ['姓', '名(男)', '名(女)'],
237
+ [
238
+ [1..6, ['アイカワ/相川、愛川', 'アキラ/晶、章', 'アン/杏']],
239
+ [7..12, ['アマミヤ/雨宮', 'エイジ/映司、英治', 'イノリ/祈鈴、祈']],
240
+ [13..18, ['イブキ/伊吹', 'カズキ/和希、一輝', 'エマ/英真、恵茉']],
241
+ [19..24, ['オガミ/尾上', 'ギンガ/銀河', 'カノン/花音、観音']],
242
+ [25..30, ['カイ/甲斐', 'ケンイチロウ/健一郎', 'サラ/沙羅']],
243
+ [31..36, ['サカキ/榊、阪木', 'ゴウ/豪、剛', 'シズク/雫']],
244
+ [37..42, ['シシド/宍戸', 'ジロー/次郎、治郎', 'チズル/千鶴、千尋']],
245
+ [43..48, ['タチバナ/橘、立花', 'タケシ/猛、武', 'ナオミ/直美、尚美']],
246
+ [49..54, ['ツブラヤ/円谷', 'ツバサ/翼', 'ハル/華、波留']],
247
+ [55..60, ['ハヤカワ/早川', 'テツ/鉄、哲', 'ヒカル/光']],
248
+ [61..66, ['ハラダ/原田', 'ヒデオ/英雄', 'ベニ/紅']],
249
+ [67..72, ['フジカワ/藤川', 'マサムネ/正宗、政宗', 'マチ/真知、町']],
250
+ [73..78, ['ホシ/星', 'ヤマト/大和', 'ミア/深空、美杏']],
251
+ [79..84, ['ミゾグチ/溝口', 'リュウセイ/流星', 'ユリコ/由里子']],
252
+ [85..90, ['ヤシダ/矢志田', 'レツ/烈、裂', 'ルイ/瑠衣、涙']],
253
+ [91..96, ['ユウキ/結城', 'レン/連、錬', 'レナ/玲奈']],
254
+ [97..100, ['名無し(何らかの理由で名前を持たない、もしくは失った)']],
255
+ ]
256
+ ),
257
+ 'RNCO' => RealNameChart.new(
258
+ 'リアルネームチャート(海外)',
259
+ ['名(男)', '名(女)', '姓'],
260
+ [
261
+ [1..6, ['アルバス', 'アイリス', 'アレン']],
262
+ [7..12, ['クリス', 'オリーブ', 'ウォーケン']],
263
+ [13..18, ['サミュエル', 'カーラ', 'ウルフマン']],
264
+ [19..24, ['シドニー', 'キルスティン', 'オルセン']],
265
+ [25..30, ['スパイク', 'グウェン', 'カーター']],
266
+ [31..36, ['ダミアン', 'サマンサ', 'キャラダイン']],
267
+ [37..42, ['ディック', 'ジャスティナ', 'シーゲル']],
268
+ [43..48, ['デンゼル', 'タバサ', 'ジョーンズ']],
269
+ [49..54, ['ドン', 'ナディン', 'パーカー']],
270
+ [55..60, ['ニコラス', 'ノエル', 'フリーマン']],
271
+ [61..66, ['ネビル', 'ハーリーン', 'マーフィー']],
272
+ [67..72, ['バリ', 'マルセラ', 'ミラー']],
273
+ [73..78, ['ビリー', 'ラナ', 'ムーア']],
274
+ [79..84, ['ブルース', 'リンジー', 'リーヴ']],
275
+ [85..90, ['マーヴ', 'ロザリー', 'レイノルズ']],
276
+ [91..96, ['ライアン', 'ワンダ', 'ワード']],
277
+ [97..100, ['名無し(何らかの理由で名前を持たない、もしくは失った)']],
278
+ ]
279
+ )
280
+ }.freeze
281
+
282
+ def roll_hero_name_chart()
283
+ dice = @randomizer.roll_once(10)
284
+ template = HERO_NAME_TEMPLATES[dice - 1]
285
+
286
+ template_result = "ヒーローネームチャート(#{dice}) > #{template[:text]}"
287
+ if template[:text] == "任意"
288
+ return template_result
289
+ end
290
+
291
+ results = [template_result]
292
+ elements = []
293
+ template[:elements].each do |type|
294
+ base_chart = HERO_NAME_BASE_CHARTS[type]
295
+ unless base_chart
296
+ elements.push(type)
297
+ next
298
+ end
299
+
300
+ result, element = base_chart.roll(@randomizer)
301
+ results.push(result)
302
+ elements.push(element)
303
+ end
304
+
305
+ hero_name = elements.join("").gsub(/・{2,}/, "・").sub(/・$/, "")
306
+ results.push("ヒーローネーム > #{hero_name}")
307
+
308
+ return results.join("\n")
309
+ end
310
+
311
+ HERO_NAME_TEMPLATES = [
312
+ {text: 'ベースA+ベースA', elements: ['ベースA', 'ベースB']},
313
+ {text: 'ベースB', elements: ['ベースB']},
314
+ {text: 'ベースB×2回', elements: ['ベースB', 'ベースB']},
315
+ {text: 'ベースB+ベースC', elements: ['ベースB', 'ベースC']},
316
+ {text: 'ベースA+ベースB+ベースC', elements: ['ベースA', 'ベースB', 'ベースC']},
317
+ {text: 'ベースA+ベースB×2回', elements: ['ベースA', 'ベースB', 'ベースB']},
318
+ {text: 'ベースB×2回+ベースC', elements: ['ベースB', 'ベースB', 'ベースC']},
319
+ {text: '(ベースB)・オブ・(ベースB)', elements: ['ベースB', '・オブ・', 'ベースB']},
320
+ {text: '(ベースB)・ザ・(ベースB)', elements: ['ベースB', '・ザ・', 'ベースB']},
321
+ {text: '任意', elements: ['任意']},
322
+ ].freeze
323
+
324
+ class HeroNameBaseChart
325
+ def initialize(name, items)
326
+ @name = name
327
+ @items = items
328
+ end
329
+
330
+ # @param randomizer [Randomizer]
331
+ # @return [Array<(String, String)>]
332
+ def roll(randomizer)
333
+ dice = randomizer.roll_once(10)
334
+ chosen = @items[dice - 1]
335
+
336
+ result = "#{@name}(#{dice}) > #{chosen}"
337
+ if (m = chosen.match(/^[(.+)]$/))
338
+ element_type = m[1]
339
+ element_chart = HERO_NAME_ELEMENT_CHARTS[element_type]
340
+
341
+ element_result, chosen = element_chart.roll(randomizer)
342
+ result = [result, element_result].join(" > ")
343
+ end
344
+
345
+ return result, chosen
346
+ end
347
+ end
348
+
349
+ class HeroNameElementChart
350
+ def initialize(name, items)
351
+ @name = name
352
+ @items = items
353
+ end
354
+
355
+ # @param randomizer [Randomizer]
356
+ # @return [Array<(String, String)>]
357
+ def roll(randomizer)
358
+ dice = randomizer.roll_once(10)
359
+ chosen = @items[dice - 1]
360
+
361
+ result = "#{@name}(#{dice}) > #{chosen[:element]} (意味:#{chosen[:mean]})"
362
+ return result, chosen[:element]
363
+ end
364
+ end
365
+
366
+ HERO_NAME_BASE_CHARTS = {
367
+ "ベースA" => HeroNameBaseChart.new(
368
+ "ベースA",
369
+ [
370
+ "ザ・",
371
+ "キャプテン・",
372
+ "ミスター/ミス/ミセス・",
373
+ "ドクター/プロフェッサー・",
374
+ "ロード/バロン/ジェネラル・",
375
+ "マン・オブ・",
376
+ "[強さ]",
377
+ "[色]",
378
+ "マダム/ミドル・",
379
+ "数字(1~10)・",
380
+ ]
381
+ ),
382
+ "ベースB" => HeroNameBaseChart.new(
383
+ "ベースB",
384
+ [
385
+ "[神話/夢]",
386
+ "[武器]",
387
+ "[動物]",
388
+ "[鳥]",
389
+ "[虫/爬虫類]",
390
+ "[部位]",
391
+ "[光]",
392
+ "[攻撃]",
393
+ "[その他]",
394
+ "数字(1~10)・",
395
+ ]
396
+ ),
397
+ "ベースC" => HeroNameBaseChart.new(
398
+ "ベースC",
399
+ [
400
+ "マン/ウーマン",
401
+ "ボーイ/ガール",
402
+ "マスク/フード",
403
+ "ライダー",
404
+ "マスター",
405
+ "ファイター/ソルジャー",
406
+ "キング/クイーン",
407
+ "[色]",
408
+ "ヒーロー/スペシャル",
409
+ "ヒーロー/スペシャル",
410
+ ]
411
+ ),
412
+ }.freeze
413
+
414
+ HERO_NAME_ELEMENT_CHARTS = {
415
+ "部位" => HeroNameElementChart.new(
416
+ "部位",
417
+ [
418
+ {element: "ハート", mean: "心臓"},
419
+ {element: "フェイス", mean: "顔"},
420
+ {element: "アーム", mean: "腕"},
421
+ {element: "ショルダー", mean: "肩"},
422
+ {element: "ヘッド", mean: "頭"},
423
+ {element: "アイ", mean: "眼"},
424
+ {element: "フィスト", mean: "拳"},
425
+ {element: "ハンド", mean: "手"},
426
+ {element: "クロウ", mean: "爪"},
427
+ {element: "ボーン", mean: "骨"},
428
+ ]
429
+ ),
430
+ "武器" => HeroNameElementChart.new(
431
+ "武器",
432
+ [
433
+ {element: "ナイヴス", mean: "短剣"},
434
+ {element: "ソード", mean: "剣"},
435
+ {element: "ハンマー", mean: "鎚"},
436
+ {element: "ガン", mean: "銃"},
437
+ {element: "スティール", mean: "刃"},
438
+ {element: "タスク", mean: "牙"},
439
+ {element: "ニューク", mean: "核"},
440
+ {element: "アロー", mean: "矢"},
441
+ {element: "ソウ", mean: "ノコギリ"},
442
+ {element: "レイザー", mean: "剃刀"},
443
+ ]
444
+ ),
445
+ "色" => HeroNameElementChart.new(
446
+ "色",
447
+ [
448
+ {element: "ブラック", mean: "黒"},
449
+ {element: "グリーン", mean: "緑"},
450
+ {element: "ブルー", mean: "青"},
451
+ {element: "イエロー", mean: "黃"},
452
+ {element: "レッド", mean: "赤"},
453
+ {element: "バイオレット", mean: "紫"},
454
+ {element: "シルバー", mean: "銀"},
455
+ {element: "ゴールド", mean: "金"},
456
+ {element: "ホワイト", mean: "白"},
457
+ {element: "クリア", mean: "透明"},
458
+ ]
459
+ ),
460
+ "動物" => HeroNameElementChart.new(
461
+ "動物",
462
+ [
463
+ {element: "バニー", mean: "ウサギ"},
464
+ {element: "タイガー", mean: "虎"},
465
+ {element: "シャーク", mean: "鮫"},
466
+ {element: "キャット", mean: "猫"},
467
+ {element: "コング", mean: "ゴリラ"},
468
+ {element: "ドッグ", mean: "犬"},
469
+ {element: "フォックス", mean: "狐"},
470
+ {element: "パンサー", mean: "豹"},
471
+ {element: "アス", mean: "ロバ"},
472
+ {element: "バット", mean: "蝙蝠"},
473
+ ]
474
+ ),
475
+ "神話/夢" => HeroNameElementChart.new(
476
+ "神話/夢",
477
+ [
478
+ {element: "アポカリプス", mean: "黙示録"},
479
+ {element: "ウォー", mean: "戦争"},
480
+ {element: "エターナル", mean: "永遠"},
481
+ {element: "エンジェル", mean: "天使"},
482
+ {element: "デビル", mean: "悪魔"},
483
+ {element: "イモータル", mean: "死なない"},
484
+ {element: "デス", mean: "死神"},
485
+ {element: "ドリーム", mean: "夢"},
486
+ {element: "ゴースト", mean: "幽霊"},
487
+ {element: "デッド", mean: "死んでいる"},
488
+ ]
489
+ ),
490
+ "攻撃" => HeroNameElementChart.new(
491
+ "攻撃",
492
+ [
493
+ {element: "ストローク", mean: "一撃"},
494
+ {element: "クラッシュ", mean: "壊す"},
495
+ {element: "ブロウ", mean: "吹き飛ばす"},
496
+ {element: "ヒット", mean: "打つ"},
497
+ {element: "パンチ", mean: "殴る"},
498
+ {element: "キック", mean: "蹴る"},
499
+ {element: "スラッシュ", mean: "斬る"},
500
+ {element: "ペネトレイト", mean: "貫く"},
501
+ {element: "ショット", mean: "撃つ"},
502
+ {element: "キル", mean: "殺す"},
503
+ ]
504
+ ),
505
+ "その他" => HeroNameElementChart.new(
506
+ "その他",
507
+ [
508
+ {element: "ヒューマン", mean: "人間"},
509
+ {element: "エージェント", mean: "代理人"},
510
+ {element: "ブースター", mean: "泥棒"},
511
+ {element: "アイアン", mean: "鉄"},
512
+ {element: "サンダー", mean: "雷"},
513
+ {element: "ウォッチャー", mean: "監視者"},
514
+ {element: "プール", mean: "水たまり"},
515
+ {element: "マシーン", mean: "機械"},
516
+ {element: "コールド", mean: "冷たい"},
517
+ {element: "サイド", mean: "側面"},
518
+ ]
519
+ ),
520
+ "鳥" => HeroNameElementChart.new(
521
+ "鳥",
522
+ [
523
+ {element: "ホーク", mean: "鷹"},
524
+ {element: "ファルコン", mean: "隼"},
525
+ {element: "キャナリー", mean: "カナリア"},
526
+ {element: "ロビン", mean: "コマツグミ"},
527
+ {element: "イーグル", mean: "鷲"},
528
+ {element: "オウル", mean: "フクロウ"},
529
+ {element: "レイブン", mean: "ワタリガラス"},
530
+ {element: "ダック", mean: "アヒル"},
531
+ {element: "ペンギン", mean: "ペンギン"},
532
+ {element: "フェニックス", mean: "不死鳥"},
533
+ ]
534
+ ),
535
+ "光" => HeroNameElementChart.new(
536
+ "光",
537
+ [
538
+ {element: "ライト", mean: "光"},
539
+ {element: "シャドウ", mean: "影"},
540
+ {element: "ファイアー", mean: "炎"},
541
+ {element: "ダーク", mean: "暗い"},
542
+ {element: "ナイト", mean: "夜"},
543
+ {element: "ファントム", mean: "幻影"},
544
+ {element: "トーチ", mean: "灯火"},
545
+ {element: "フラッシュ", mean: "閃光"},
546
+ {element: "ランタン", mean: "手さげランプ"},
547
+ {element: "サン", mean: "太陽"},
548
+ ]
549
+ ),
550
+ "虫/爬虫類" => HeroNameElementChart.new(
551
+ "虫/爬虫類",
552
+ [
553
+ {element: "ビートル", mean: "甲虫"},
554
+ {element: "バタフライ/モス", mean: "蝶/蛾"},
555
+ {element: "スネーク/コブラ", mean: "蛇"},
556
+ {element: "アリゲーター", mean: "ワニ"},
557
+ {element: "ローカスト", mean: "バッタ"},
558
+ {element: "リザード", mean: "トカゲ"},
559
+ {element: "タートル", mean: "亀"},
560
+ {element: "スパイダー", mean: "蜘蛛"},
561
+ {element: "アント", mean: "アリ"},
562
+ {element: "マンティス", mean: "カマキリ"},
563
+ ]
564
+ ),
565
+ "強さ" => HeroNameElementChart.new(
566
+ "強さ",
567
+ [
568
+ {element: "スーパー/ウルトラ", mean: "超"},
569
+ {element: "ワンダー", mean: "驚異的"},
570
+ {element: "アルティメット", mean: "究極の"},
571
+ {element: "ファンタスティック", mean: "途方もない"},
572
+ {element: "マイティ", mean: "強い"},
573
+ {element: "インクレディブル", mean: "凄い"},
574
+ {element: "アメージング", mean: "素晴らしい"},
575
+ {element: "ワイルド", mean: "狂乱の"},
576
+ {element: "グレイテスト", mean: "至高の"},
577
+ {element: "マーベラス", mean: "驚くべき"},
578
+ ]
579
+ ),
580
+ }.freeze
581
+ end
582
+ end
583
+ end