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,208 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class HarnMaster < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'HarnMaster'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'ハーンマスター'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'はあんますたあ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ・判定
18
+  1D100<=XX の判定時に致命的失敗・決定的成功を判定
19
+ ・ショック判定(SHKx)
20
+  例)SHK13,3
21
+ ・人型用 中段命中部位表 (SLH)/上段命中部位 (SLHU)/上段命中部位 (SLHD)
22
+ MESSAGETEXT
23
+
24
+ register_prefix(['SHK\d+.*', 'SLH', 'SLHU', 'SLHD'])
25
+
26
+ def check_1D100(total, _dice_total, cmp_op, target)
27
+ return '' if target == '?'
28
+ return '' unless cmp_op == :<=
29
+
30
+ result = getCheckResult(total, target)
31
+ return "> #{result}"
32
+ end
33
+
34
+ def getCheckResult(total, diff)
35
+ return getFailResult(total) if total > diff
36
+
37
+ return getSuccessResult(total)
38
+ end
39
+
40
+ def getFailResult(total)
41
+ return "致命的失敗" if (total % 5) == 0
42
+
43
+ return "失敗"
44
+ end
45
+
46
+ def getSuccessResult(total)
47
+ return "決定的成功" if (total % 5) == 0
48
+
49
+ return "成功"
50
+ end
51
+
52
+ def eval_game_system_specific_command(command)
53
+ result = nil
54
+
55
+ case command
56
+ when /^SHK(\d*),(\d+)/i
57
+ toughness = Regexp.last_match(1).to_i
58
+ damage = Regexp.last_match(2).to_i
59
+ result = getCheckShockResult(damage, toughness)
60
+ when /SLH(U|D)?/i
61
+ type = Regexp.last_match(1)
62
+ result = getStrikeLocationHuman(type)
63
+ else
64
+ result = nil
65
+ end
66
+
67
+ return result
68
+ rescue StandardError => e
69
+ return e.message
70
+ end
71
+
72
+ def getCheckShockResult(damage, toughness)
73
+ dice_list = @randomizer.roll_barabara(damage, 6)
74
+ dice = dice_list.sum()
75
+ diceText = dice_list.join(",")
76
+
77
+ result = (dice <= toughness ? '成功' : '失敗')
78
+
79
+ text = "ショック判定(ダメージ:#{damage}, 耐久力:#{toughness}) > (#{dice}[#{diceText}]) > #{result}"
80
+ return text
81
+ end
82
+
83
+ def getStrikeLocationHuman(type)
84
+ typeName = ''
85
+ table = nil
86
+
87
+ case type
88
+ when 'U'
89
+ typeName = "命中部位(人型 上段)"
90
+ table = getStrikeLocationHumanUpperTable()
91
+ when 'D'
92
+ typeName = "命中部位(人型 下段)"
93
+ table = getStrikeLocationHumanDownTable()
94
+ when nil
95
+ typeName = "命中部位(人型 中段)"
96
+ table = getStrikeLocationHumanNormalTable()
97
+ else
98
+ raise "unknow atak type #{type}"
99
+ end
100
+
101
+ number = @randomizer.roll_once(100)
102
+ part = get_table_by_number(number, table)
103
+ part = getLocationSide(part, number)
104
+ part = getFaceLocation(part)
105
+
106
+ result = "#{typeName} > (#{number})#{part}"
107
+
108
+ return result
109
+ end
110
+
111
+ def getLocationSide(part, number)
112
+ unless part =~ /^\*/
113
+ debug("part has NO side", part)
114
+ return part
115
+ end
116
+
117
+ debug("part has side", part)
118
+
119
+ side = (number.odd? ? "左" : "右")
120
+
121
+ part.sub(/\*/, side)
122
+ end
123
+
124
+ def getFaceLocation(part)
125
+ debug("getFaceLocation part", part)
126
+
127
+ unless part =~ /\+$/
128
+ debug("is NOT Face")
129
+ return part
130
+ end
131
+
132
+ debug("is Face")
133
+
134
+ table = [
135
+ [15, "顎"],
136
+ [30, "*目"],
137
+ [64, "*頬"],
138
+ [80, "鼻"],
139
+ [90, "*耳"],
140
+ [100, "口"],
141
+ ]
142
+
143
+ number = @randomizer.roll_once(100)
144
+ faceLocation = get_table_by_number(number, table)
145
+ debug("faceLocation", faceLocation)
146
+ debug("number", number)
147
+ faceLocation = getLocationSide(faceLocation, number)
148
+
149
+ result = part.sub(/\+$/, " > (#{number})#{faceLocation}")
150
+ return result
151
+ end
152
+
153
+ def getStrikeLocationHumanUpperTable()
154
+ table = [
155
+ [15, "頭部"],
156
+ [30, "顔+"],
157
+ [45, "首"],
158
+ [57, "*肩"],
159
+ [69, "*上腕"],
160
+ [73, "*肘"],
161
+ [81, "*前腕"],
162
+ [85, "*手"],
163
+ [95, "胸部"],
164
+ [100, "腹部"],
165
+ ]
166
+ return table
167
+ end
168
+
169
+ def getStrikeLocationHumanNormalTable()
170
+ table = [
171
+ [5, "頭部"],
172
+ [10, "顔+"],
173
+ [15, "首"],
174
+ [27, "*肩"],
175
+ [33, "*上腕"],
176
+ [35, "*肘"],
177
+ [39, "*前腕"],
178
+ [43, "*手"],
179
+ [60, "胸部"],
180
+ [70, "腹部"],
181
+ [74, "股間"],
182
+ [80, "*臀部"],
183
+ [88, "*腿"],
184
+ [90, "*膝"],
185
+ [96, "*脛"],
186
+ [100, "*足"],
187
+ ]
188
+ return table
189
+ end
190
+
191
+ def getStrikeLocationHumanDownTable()
192
+ table = [
193
+ [6, "*前腕"],
194
+ [12, "*手"],
195
+ [19, "胸部"],
196
+ [29, "腹部"],
197
+ [35, "股間"],
198
+ [49, "*臀部"],
199
+ [70, "*腿"],
200
+ [78, "*膝"],
201
+ [92, "*脛"],
202
+ [100, "*足"],
203
+ ]
204
+ return table
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,706 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class HatsuneMiku < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'HatsuneMiku'
8
+
9
+ # ゲームシステム名
10
+ NAME = '初音ミクTRPG ココロダンジョン'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'はつねみくTRPGこころたんしよん'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・判定(Rx±y@z>=t)
18
+  能力値のダイスごとに成功・失敗の判定を行います。
19
+  x:能力ランク(S,A~D)。数字指定で直接その個数のダイスが振れます
20
+  y:修正値。A+2 あるいは A++ のように表記。混在時は A++,+1 のように記述も可能
21
+  z:スペシャル最低値(省略:6) t:目標値(省略:4)
22
+   例) RA R2 RB+1 RC++ RD+,+2 RA>=5 RS-1@5>=6
23
+  結果はネイロを取得した残りで最大値を表示
24
+ 例) RB
25
+  HatsuneMiku : (RB>=4) > [3,5] >
26
+   ネイロに3(青)を取得した場合 5:成功
27
+   ネイロに5(白)を取得した場合 3:失敗
28
+ ・各種表
29
+  ファンブル表 FT/致命傷表 CWT/休憩表 BT/目標表 TT/関係表 RT
30
+  障害表 OT/リクエスト表 RQT/情景表 ST
31
+ ・キーワード表
32
+  ダーク DKT/ホット HKT/ラブ LKT/エキセントリック EKT/メランコリー MKT
33
+ ・名前表 NT
34
+  コア別 ダーク DNT/ホット HNT/ラブ LNT/エキセントリック ENT/メランコリー MNT
35
+ ・オトダマ各種表
36
+  性格表A OPA/性格表B OPB/趣味表 OHT/外見表 OLT/一人称表 OIT/呼び名表 OYT
37
+  リアクション表 ORT/出会い表 OMT
38
+ INFO_MESSAGE_TEXT
39
+
40
+ def initialize(command)
41
+ super(command)
42
+
43
+ @enabled_d66 = true
44
+ @d66_sort_type = D66SortType::ASC
45
+ end
46
+
47
+ def eval_game_system_specific_command(command)
48
+ text = judgeRoll(command)
49
+ return text unless text.nil?
50
+
51
+ return roll_tables(command, TABLES)
52
+ end
53
+
54
+ def judgeRoll(command)
55
+ return nil unless /^(R([A-DS]|\d+)([\+\-\d,]*))(@(\d))?((>(=)?)([\+\-\d]*))?(@(\d))?$/i =~ command
56
+
57
+ skillRank = Regexp.last_match(2)
58
+ modifyText = Regexp.last_match(3)
59
+ signOfInequality = (Regexp.last_match(7).nil? ? ">=" : Regexp.last_match(7))
60
+ targetText = (Regexp.last_match(9).nil? ? "4" : Regexp.last_match(9))
61
+
62
+ specialNum = Regexp.last_match(5)
63
+ specialNum ||= Regexp.last_match(11)
64
+ specialNum ||= 6
65
+ specialNum = specialNum.to_i
66
+ specialText = (specialNum == 6 ? "" : "@#{specialNum}")
67
+
68
+ modifyText = getChangedModifyText(modifyText)
69
+
70
+ commandText = "R#{skillRank}#{modifyText}"
71
+
72
+ rankDiceList = {"S" => 4, "A" => 3, "B" => 2, "C" => 1, "D" => 2}
73
+ diceCount = rankDiceList[skillRank]
74
+ diceCount = skillRank.to_i if skillRank =~ /^\d+$/
75
+
76
+ modify = ArithmeticEvaluator.eval(modifyText)
77
+ target = ArithmeticEvaluator.eval(targetText)
78
+
79
+ diceList = @randomizer.roll_barabara(diceCount, 6).sort
80
+ diceText = diceList.join(",")
81
+
82
+ diceList = [diceList.min] if skillRank == "D"
83
+
84
+ message = "(#{commandText}#{specialText}#{signOfInequality}#{targetText}) > [#{diceText}]#{modifyText} > "
85
+
86
+ if diceList.length <= 1
87
+ dice = diceList.first
88
+ total = dice + modify
89
+ result = check_success(total, dice, signOfInequality, target, specialNum)
90
+ message += "#{total}:#{result}"
91
+ else
92
+ texts = []
93
+ diceList.each_with_index do |pickup_dice, index|
94
+ rests = diceList.clone
95
+ rests.delete_at(index)
96
+ dice = rests.max
97
+ total = dice + modify
98
+ result = check_success(total, dice, signOfInequality, target, specialNum)
99
+
100
+ colorList = ["黒", "赤", "青", "緑", "白", "任意"]
101
+ color = colorList[pickup_dice - 1]
102
+ texts << " ネイロに#{pickup_dice}(#{color})を取得した場合 #{total}:#{result}"
103
+ end
104
+ texts.uniq!
105
+ message += "\n" + texts.join("\n")
106
+ end
107
+
108
+ return message
109
+ end
110
+
111
+ def getChangedModifyText(text)
112
+ modifyText = ""
113
+ values = text.split(/,/)
114
+
115
+ values.each do |value|
116
+ case value
117
+ when "++"
118
+ modifyText += "+2"
119
+ when "+"
120
+ modifyText += "+1"
121
+ else
122
+ modifyText += value
123
+ end
124
+ end
125
+
126
+ return modifyText
127
+ end
128
+
129
+ def check_success(total_n, dice_n, signOfInequality, diff, special_n)
130
+ return "ファンブル" if dice_n == 1
131
+ return "スペシャル" if dice_n >= special_n
132
+
133
+ cmp_op = Normalize.comparison_operator(signOfInequality)
134
+ target_num = diff.to_i
135
+
136
+ if total_n.send(cmp_op, target_num)
137
+ "成功"
138
+ else
139
+ "失敗"
140
+ end
141
+ end
142
+
143
+ TABLES = {
144
+ "FT" => DiceTable::Table.new(
145
+ "ファンブル表",
146
+ "1D6",
147
+ [
148
+ "周囲から活気が失われる。黒以外のすべてのネイロを一つずつ減らす。",
149
+ "仲間に迷惑をかけてしまう。自分以外のPC全員の【生命力】が1点減少する。",
150
+ "この失敗は後に祟るかもしれない……。自分の【生命力】が1D6点減少する。",
151
+ "ココロに疲労感が満ちていく。自分がストレスを1点受ける。",
152
+ "1D6を振ること。そのPCのコアが、その出目が1ならダークに、2ならホットに、3ならラブに、4ならエキセントリックに、5ならメランコリーに変化する。6だった場合、コアは変化しない。",
153
+ "ラッキー!特に何も起こらない"
154
+ ]
155
+ ),
156
+ "CWT" => DiceTable::Table.new(
157
+ "致命傷表",
158
+ "1D6",
159
+ [
160
+ "絶望的な攻撃を受ける。そのキャラクターは強制退出になる。",
161
+ "苦痛の悲鳴をあげ、無惨にも崩れ落ちる。そのキャラクターは行動不能になる。また、黒のネイロが一つ増える。",
162
+ "オトクイの一撃で、あなたは吹き飛ばされてしまう。そのキャラクターは行動不能になる。また、分類が装備のナンバーにストレスを1点受ける。",
163
+ "強烈な一撃を受けて気絶する。そのキャラクターは行動不能になる。",
164
+ "意識はあるが、立ち上がることができない。そのキャラクターは行動不能になる。次のシーンにまだ【生命力】が0点だった場合、自動的に1点に回復する。",
165
+ "奇跡的に踏みとどまり、持ちこたえる。【生命力】が1点になる。"
166
+ ]
167
+ ),
168
+ "BT" => DiceTable::Table.new(
169
+ "休憩表",
170
+ "1D6",
171
+ [
172
+ "仲間との楽しい時間。自分の【想い人】のパトスを一つ回復する。",
173
+ "これまでの冒険を思い返す。自分の【能力値】のパトスを一つ回復する。",
174
+ "自分のオトダマと会話する。【協力者】のパトスか、ナンバーのパトスを一つ回復する。",
175
+ "体をゆっくり休める。自分の【生命力】を2D6点回復する。望むなら、回復を行う前に、自分の【活力】を決め直してもよい。",
176
+ "お、ラッキー!いいもの見つけた!自分のコインを1枚増やす。",
177
+ "ノイズストアに接続できた。各PCは、自分の【頭脳】のダイスの数と同じ個数まで、アプリを購入できる。"
178
+ ]
179
+ ),
180
+ "TT" => DiceTable::Table.new(
181
+ "目標表",
182
+ "1D6",
183
+ [
184
+ "悪意。PCの中でもっとも【生命力】の低いもの一人を目標に選ぶ。もっとも低い【生命力】の持ち主が複数いる場合、その中から、GMが自由に一人目標を選ぶ。",
185
+ "狡猾。パラグラフ1〜5の中で、もっとも高い数値のパラグラフにいるPC一人を目標に選ぶ。全員が圏外にいる場合、圏外にいるPC全員を目標に選ぶ。",
186
+ "堅実。PCの中で、その脅威の「判定欄」に書かれた能力値がもっとも低いランクのキャラクター一人を目標に選ぶ。もっとも低いランクのキャラクターが複数いる場合、その中から、もっとも低いモッドのキャラクター一人を目標に選ぶ。モッドも同じ値だった場合、GMが自由に一人目標を選ぶ。",
187
+ "豪快。PCの中でもっとも高いランクの【武勇】の持ち主一人を目標に選ぶ。もっとも高いランクの持ち主が複数いる場合、その中から、もっとも高いモッドの持ち主一人を目標に選ぶ。モッドも同じ値だった場合、GMが自由に一人目標を選ぶ。",
188
+ "単純。パラグラフ1〜5の中で、もっとも低い数値のパラグラフにいるPC一人を目標に選ぶ。全員が圏外にいる場合、圏外にいるPC全員を目標に選ぶ。",
189
+ "乱戦。その脅威のいるパラグラフの数値と数値が1離れたパラグラフにいるPC全員を目標に選ぶ。そのパラグラフにPCがいなかった場合、GMが自由に一人目標を選ぶ。"
190
+ ]
191
+ ),
192
+ "RT" => DiceTable::Table.new(
193
+ "関係表",
194
+ "1D6",
195
+ [
196
+ "恋心(プラス)/殺意(マイナス)",
197
+ "同情(プラス)/侮蔑(マイナス)",
198
+ "憧憬(プラス)/嫉妬(マイナス)",
199
+ "信頼(プラス)/疑い(マイナス)",
200
+ "共感(プラス)/不気味(マイナス)",
201
+ "大切(プラス)/面倒(マイナス)"
202
+ ]
203
+ ),
204
+ "OT" => DiceTable::Table.new(
205
+ "障害表",
206
+ "1D6",
207
+ [
208
+ "あなたのココロに大きな変化が訪れる。1D6を振ること。そのPCのコアが、その出目が1ならダークに、2ならホットに、3ならラブに、4ならエキセントリックに、5ならメランコリーに変化する。6だった場合、コアは変化しない。",
209
+ "あなたは肉体的に大きなダメージを負う。1D6点のダメージを受ける。",
210
+ "ノイズの助けを借りて問題を解決する。コインを1D6枚を支払う必要がある。コインを支払う場合、ほかのPCからコインを譲ってもらってもよい。支払いが足りなかった場合、その差額分だけ自分の【生命力】を減らす。",
211
+ "大きな疲労感を感じる。ストレスを1点受ける。",
212
+ "思わず時間をつかってしまう。【タイム】が1点減少する。",
213
+ "場にイヤな気配が満ちていく。黒のネイロが一つ増える。"
214
+ ]
215
+ ),
216
+ "RQT" => DiceTable::Table.new(
217
+ "リクエスト表",
218
+ "2D6",
219
+ [
220
+ "そのエリアの風景が、あなたの【情景】へと書き換えられていく。「お前の始まりの物語を語れ。お前はこの地で何を思った?」",
221
+ "あなたは、そのエリアの風景の中に懐かしいものを見つけ、自分の罪を思い出した。「何を見た?なにを悔いている?」",
222
+ "そのエリアの風景が、あなたのコアと同じ色に染まる。あなたは、その風景の中になりたい自分の姿を見つける。「それがお前の望みか?お前は未来に何を求める?」",
223
+ "あなたの脳裏に、人物欄に書かれた人物一人のイメージが浮かぶ。その人物は何かを囁き、あなたのココロが傷ついた。「そいつは誰だ?一体何と言ったのだ?」",
224
+ "あなたは、そのエリアの風景の中に奇妙なものを見つけ、恐怖した。「何を見た?なぜそれを恐れる?」",
225
+ "そのエリアにココロダンジョンの持ち主が現れる。その人物は、お前に質問してくる。「私をどう思ってる?なぜ、私を助ける?」",
226
+ "あなたのオトダマの姿が、あなたのよく知っている人物に変わる「その人物は誰だ?そいつをどう思っている?」",
227
+ "そのエリアに、あなたの持つナンバーが響き渡る。「これがお前のウタか?そのウタの名はなんだ?」",
228
+ "あなたのオトダマの姿が、あなたの好きな人物の姿に変わる。「それがお前が焦がれる人物か。そいつをどうしたい?」",
229
+ "そのエリアの風景にあなたの日常が浮かび上がる。「お前は何をしている?その暮らしをどう思っている?」",
230
+ "あなたの目の前に、あなたの死体が横たわっている。「お前を殺すものは何だ?お前は誰に殺される?」"
231
+ ]
232
+ ),
233
+ "ST" => DiceTable::D66Table.new(
234
+ "情景表",
235
+ D66SortType::ASC,
236
+ {
237
+ 11 => "立ち並ぶ本棚の森",
238
+ 12 => "夕日が差し込む教室",
239
+ 13 => "鳴り止まない踏切",
240
+ 14 => "ビルから見下ろした街並み",
241
+ 15 => "二人で見た星空",
242
+ 16 => "液晶画面に映る奇妙な光景",
243
+ 22 => "ガラス窓に並ぶ雨だれ",
244
+ 23 => "植物園の温室",
245
+ 24 => "屋台が並ぶ祭りの風景",
246
+ 25 => "陽炎が立ちのぼるアスファルト",
247
+ 26 => "0時を示す時計の針",
248
+ 33 => "無機質な白い天井",
249
+ 34 => "暗闇に浮かび上がるヘッドライト",
250
+ 35 => "後ろからついてくる野良猫",
251
+ 36 => "一面の花畑",
252
+ 44 => "あなたを見つめる大勢の観衆",
253
+ 45 => "降り積もる雪",
254
+ 46 => "古めかしい洋館の応接間",
255
+ 55 => "おとぎ話に出てくるような森",
256
+ 56 => "深夜のコンビニ",
257
+ 66 => "誰もいない体育館"
258
+ }
259
+ ),
260
+ "DKT" => DiceTable::D66Table.new(
261
+ "ダーク・キーワード表",
262
+ D66SortType::ASC,
263
+ {
264
+ 11 => "崩壊する楽園",
265
+ 12 => "空に堕ちる",
266
+ 13 => "優しい暴力",
267
+ 14 => "沈黙の掟",
268
+ 15 => "闇に溺れる",
269
+ 16 => "こぼれ落ちた命",
270
+ 22 => "行き止まりの絶望",
271
+ 23 => "漆黒の翼",
272
+ 24 => "眠れぬ夜",
273
+ 25 => "避けられぬ運命",
274
+ 26 => "斬り裂かれた景色",
275
+ 33 => "からっぽな自分",
276
+ 34 => "仮面の奥",
277
+ 35 => "月光中毒",
278
+ 36 => "昏い魔術",
279
+ 44 => "……オブザデッド",
280
+ 45 => "ココロを殺す",
281
+ 46 => "感染する破滅",
282
+ 55 => "愛の鎖",
283
+ 56 => "残酷な真実",
284
+ 66 => "デスゲーム"
285
+ }
286
+ ),
287
+ "DNT" => DiceTable::D66Table.new(
288
+ "ダーク・名前表",
289
+ D66SortType::ASC,
290
+ {
291
+ 11 => "ダーク/濁、搦 ネロ/音呂、寝路",
292
+ 12 => "クロト/黒斗、玄徒 ヤミ/夜美、闇",
293
+ 13 => "ネクロ/根黒、寝喰 マコ/魔子、混乎",
294
+ 14 => "カゲオ/影男、陰夫 オニコ/鬼子、隠忍呼",
295
+ 15 => "アクタ/芥、悪太 ホタル/蛍、歩足",
296
+ 16 => "マオウ/魔王、万凹 ミダラ/淫、美堕裸",
297
+ 22 => "マミヤ/魔美也、狸夜 ジャミ/邪美、蛇実",
298
+ 23 => "ドクロ/髑髏、毒炉 ヨミ/黄泉、詠",
299
+ 24 => "マクラ/枕、真暗 サツキ/殺鬼、五月",
300
+ 25 => "ゲドウ/外道、戯堂 サヤ/小夜、鞘",
301
+ 26 => "ジゴク/地獄、慈極 ウマル/埋、兎丸",
302
+ 33 => "エンド/怨人、終 ヨハネ/夜羽、世刎",
303
+ 34 => "ノロイ/呪、鈍 カバネ/屍、椛音",
304
+ 35 => "アクム/悪夢、飽夢 クサリ/腐、鎖",
305
+ 36 => "バツ/罰、× ニエ/贄、沸",
306
+ 44 => "ネガ/音我、願 リリス/璃々子、離里素",
307
+ 45 => "ウツロ/虚、洞 ネタミ/妬美、寝多実",
308
+ 46 => "ハジメ/始、創 ホロビ/滅、亡",
309
+ 55 => "ザイン/罪印、沙陰 リンボ/淋墓、辺獄",
310
+ 56 => "ハラワタ/腑、祓輪太 ユガミ/歪、由神",
311
+ 66 => "イミ/忌、逝美 ムイミ/無意味、無為巳"
312
+ }
313
+ ),
314
+ "HKT" => DiceTable::D66Table.new(
315
+ "ホット・キーワード表",
316
+ D66SortType::ASC,
317
+ {
318
+ 11 => "真夜中をぶっ壊す",
319
+ 12 => "夢を打ち上げろ",
320
+ 13 => "譲れない明日",
321
+ 14 => "あふれ出す衝動",
322
+ 15 => "獣を解き放て",
323
+ 16 => "蒸発した涙",
324
+ 22 => "高らかに叫べ",
325
+ 23 => "負けられない戦い",
326
+ 24 => "握りしめた拳",
327
+ 25 => "疾走する青春",
328
+ 26 => "ココロに従え",
329
+ 33 => "がんばれ",
330
+ 34 => "そのまま進め",
331
+ 35 => "自分の旗",
332
+ 36 => "抗い壊し突き進む",
333
+ 44 => "咲き誇る情熱の花",
334
+ 45 => "暑苦しい友情",
335
+ 46 => "オレ色に染まれ",
336
+ 55 => "世界に八つ当たり",
337
+ 56 => "消せない炎",
338
+ 66 => "オーバードライブ"
339
+ }
340
+ ),
341
+ "HNT" => DiceTable::D66Table.new(
342
+ "ホット・名前表",
343
+ D66SortType::ASC,
344
+ {
345
+ 11 => "レッド/烈怒、煉集 アカネ/赤音、茜",
346
+ 23 => "タケル/武、猛 ヒトミ/瞳、仁美",
347
+ 36 => "ジョウ/情、丈 アオリ/煽、亜織",
348
+ 12 => "アツシ/熱、純志 カンナ/神奈、柑菜",
349
+ 24 => "グレン/紅蓮、九煉 ナツコ/夏子、懐子",
350
+ 44 => "ロック/六句、麓 フォルテ/鳳流弖、彫照",
351
+ 13 => "カケル/駆、賭 ハル/晴、春",
352
+ 25 => "アラシ/嵐、荒 ヒカル/光、晃",
353
+ 45 => "ヤマト/大和、岳斗 イサミ/伊佐美、勇美",
354
+ 14 => "ガッツ/牙突、勝 アカリ/紅莉、明里",
355
+ 26 => "エンジョウ/炎上、円定 コマチ/小町、小真知",
356
+ 46 => "リュウセイ/流星、龍盛 ミライ/未来、美良依",
357
+ 15 => "ケン/剣、拳 アスカ/明日香、飛鳥",
358
+ 33 => "レツ/烈、裂 リズム/理澄、李珠夢",
359
+ 55 => "イカル/怒、鵤 ヒマワリ/向日葵、火回",
360
+ 16 => "ゴウ/豪、剛 ヒミコ/日美子、卑弥呼",
361
+ 34 => "リキ/力、陸希 キョウカ/響歌、驚花",
362
+ 56 => "ツトム/努、勉 ハナビ/花火、羽夏妃",
363
+ 22 => "ヒイロ/火色、陽彩 アキラ/晶、爽",
364
+ 35 => "ホムラ/焔、吠叢 カグヤ/輝夜、赫映",
365
+ 66 => "レオ/伶央、獅王 マツリ/祭、茉莉"
366
+ }
367
+ ),
368
+ "LKT" => DiceTable::D66Table.new(
369
+ "ラブ・キーワード表",
370
+ D66SortType::ASC,
371
+ {
372
+ 11 => "大人の恋",
373
+ 12 => "ドキドキが止まらない",
374
+ 13 => "つないだ手",
375
+ 14 => "世界を敵に回しても",
376
+ 15 => "重なる声",
377
+ 16 => "君のためなら死ねる",
378
+ 22 => "甘い口づけ",
379
+ 23 => "まぶたをとじて",
380
+ 24 => "キミとボク",
381
+ 25 => "好きとか嫌いとか",
382
+ 26 => "いつまでも",
383
+ 33 => "抱きしめたい",
384
+ 34 => "75億と1千五百万人愛してる",
385
+ 35 => "自動的な恋",
386
+ 36 => "会いたい",
387
+ 44 => "伝えたいコトバ",
388
+ 45 => "ありがとう",
389
+ 46 => "時間を止めて",
390
+ 55 => "大好き",
391
+ 56 => "素敵な贈り物",
392
+ 66 => "ビューティフルワールド"
393
+ }
394
+ ),
395
+ "LNT" => DiceTable::D66Table.new(
396
+ "ラブ・名前表",
397
+ D66SortType::ASC,
398
+ {
399
+ 11 => "シアン/詩庵、思杏 アオイ/葵、蒼生",
400
+ 12 => "ソナタ/奏名太、其方 イズミ/泉、出海",
401
+ 13 => "ツナグ/繋、継 カレン/可憐、歌恋",
402
+ 14 => "ミノル/実、稔 コイ/恋、鯉",
403
+ 15 => "ユウ/優、悠 ラブ/良舞、羅步",
404
+ 16 => "レイン/玲音、霊印 アマミ/甘味、天海",
405
+ 22 => "ソウヤ/想夜、添也 フミ/文、芙美",
406
+ 23 => "イトシ/糸糸、意俊 コイシ/恋志、小石",
407
+ 24 => "エガオ/笑顔、描生 オモイ/想、念",
408
+ 25 => "マコト/誠、真実 マナ/真菜、愛",
409
+ 26 => "ユウリ/有理、悠里 ケイ/恵、佳",
410
+ 33 => "チヒロ/千尋、茅紘 ウララ/麗、占",
411
+ 34 => "トモ/友、杜望 ヒナ/雛、比奈",
412
+ 35 => "ソラ/空、宙 ツユ/露、梅雨",
413
+ 36 => "ユウダイ/雄大、優大 ノゾミ/望、希海",
414
+ 44 => "ハグ/剥、抱 キス/喜好、口吻",
415
+ 45 => "ショウタ/翔太、祥太 アイ/愛、藍",
416
+ 46 => "ジュン/純、潤 ミサオ/美沙緒、操",
417
+ 55 => "リョウ/涼、猟 イチズ/一途、意地図",
418
+ 56 => "シグレ/時雨、紫暮 アオバ/青葉、碧羽",
419
+ 66 => "ロミオ/路美雄、露澪 ロマン/浪漫、絽萬"
420
+ }
421
+ ),
422
+ "EKT" => DiceTable::D66Table.new(
423
+ "エキセントリック・キーワード表",
424
+ D66SortType::ASC,
425
+ {
426
+ 11 => "シェフのきまぐれニルヴァーナ",
427
+ 23 => "宇宙人とデート",
428
+ 36 => "ぷるぷる",
429
+ 12 => "おかず食べ過ぎ",
430
+ 24 => "まいにち寝正月",
431
+ 44 => "夜明けのツタンカーメン",
432
+ 13 => "バイバイバイアグラ",
433
+ 25 => "猫がにゃー",
434
+ 45 => "半額の宴",
435
+ 14 => "おふとん王国の攻防",
436
+ 26 => "道草にがい",
437
+ 46 => "超気持ちいいなにか",
438
+ 15 => "ぐるぐるとクルクル",
439
+ 33 => "ブシドーロック!サムライパンク!",
440
+ 55 => "いあ!いあ!はすたあ!",
441
+ 16 => "ゴリラの千年王国",
442
+ 34 => "冷やしインド",
443
+ 56 => "小学生に貯金で負けた",
444
+ 22 => "くもん式フランケンシュタイナー",
445
+ 35 => "生きててよかった",
446
+ 66 => "秒速1ポロンクセマ"
447
+ }
448
+ ),
449
+ "ENT" => DiceTable::D66Table.new(
450
+ "エキセントリック・名前表",
451
+ D66SortType::ASC,
452
+ {
453
+ 11 => "ライム/来夢、雷鵡 ミドリ/緑、美登里",
454
+ 12 => "ランポ/乱歩、蘭舗 ビビリ/恐、美々裏",
455
+ 13 => "シラズ/不知、調頭 ヒスイ/翡翠、陽彗",
456
+ 14 => "ムウ/夢生、無 キノコ/茸、紀乃子",
457
+ 15 => "ネコヒコ/猫彦、寝子日子 イヌコ/犬子、夷猫",
458
+ 16 => "ダダ/駄々、蛇陀 キリコ/切子、霧湖",
459
+ 22 => "イケメン/活面、逝麺 ラムネ/来夢音、螺旨",
460
+ 23 => "キョウスケ/狂介、京助 ランマ/乱麻、爛漫",
461
+ 24 => "ネジ/螺子、寝児 アリス/有栖、亜梨子",
462
+ 25 => "マワル/回、環 タタミ/畳、多々実",
463
+ 26 => "キュウ/球、Q ズキン/頭巾、厨琴",
464
+ 33 => "サバン/沙蛮、裂卍 マニア/摩尼亜、間合",
465
+ 34 => "カエル/帰、蛙 エリマキ/襟巻、絵里真希",
466
+ 35 => "ナゾウ/謎宇、何造 カンノン/観音、疳暢",
467
+ 36 => "イッキュウ/一休、逸宮 ミロク/弥勒、診録",
468
+ 44 => "シュール/酒潤、終琉 カプリ/華降、噛布里",
469
+ 45 => "キジン/奇人、鬼神 フシギ/不思議、節黄",
470
+ 46 => "カブキ/歌舞伎、傾 メロン/芽論、女侖",
471
+ 55 => "ジョーカー/冗歌、浄化 ピエロ/秘絵呂、道化師",
472
+ 56 => "ウイロウ/外郎、初弄 マッチャ/抹茶、末耶",
473
+ 66 => "ビックリ/吃驚、! ハテナ/果菜、?"
474
+ }
475
+ ),
476
+ "MKT" => DiceTable::D66Table.new(
477
+ "メランコリー・キーワード表",
478
+ D66SortType::ASC,
479
+ {
480
+ 11 => "ごめんなさい",
481
+ 12 => "甘い甘い逃避",
482
+ 13 => "ひとりぼっち",
483
+ 14 => "ズルい世界",
484
+ 15 => "果たせなかった約束",
485
+ 16 => "取り返しのつかない言葉",
486
+ 22 => "いっそ死にたい",
487
+ 23 => "置いてきた夢",
488
+ 24 => "見あげた青空",
489
+ 25 => "きみの嘘",
490
+ 26 => "すれ違う言葉",
491
+ 33 => "幸せだった昨日",
492
+ 34 => "こんなはずじゃなかった",
493
+ 35 => "別れてしまった二つの道",
494
+ 36 => "また会えたらいいね",
495
+ 44 => "ここではないどこか",
496
+ 45 => "青春の終わり",
497
+ 46 => "大好きだった膝の上",
498
+ 55 => "誰かぼくをほめて",
499
+ 56 => "高潔な裏切り",
500
+ 66 => "ナルシズム"
501
+ }
502
+ ),
503
+ "MNT" => DiceTable::D66Table.new(
504
+ "メランコリー・名前表",
505
+ D66SortType::ASC,
506
+ {
507
+ 11 => "ヴァイス/灰主、唄守 マシロ/真白、万代",
508
+ 12 => "キズ/傷、疵 ダレカ/誰香、惰麗華",
509
+ 13 => "ユレル/揺、遊玲流 エモ/絵萌、恵面",
510
+ 14 => "オボロ/朧、憶露 ホノカ/仄、穂乃香",
511
+ 15 => "メロ/夢露、芽朗 シズ/静、志津",
512
+ 16 => "ヒイラギ/柊、氷刺木 カタミ/形見、片実",
513
+ 22 => "リネン/理然、離念 スノウ/素皇、珠瑙",
514
+ 23 => "セツナ/切、刹那 シノブ/偲、忍",
515
+ 24 => "ナミダ/涙、波太 カスカ/霞歌、幽",
516
+ 25 => "ムスビ/結、息日 カコ/過去、寡子",
517
+ 26 => "ウソ/嘘、宇曽 アイカ/哀歌、愛香",
518
+ 33 => "ペイン/閉音、病印 ツラミ/辛美、貫実",
519
+ 34 => "ヨリミチ/寄道、頼道 シラユキ/白雪、知由樹",
520
+ 35 => "ヒトリ/独、一人 オトナ/音鳴、乙菜",
521
+ 36 => "スバル/昴、透遙 ハルカ/遥、晴香",
522
+ 44 => "バイバイ/梅云、吠々 バニラ/香子蘭、芭韮",
523
+ 45 => "トオル/透、通 リツ/律、慄",
524
+ 46 => "タビ/旅、足袋 チギリ/契、千切",
525
+ 55 => "サイゴ/彩吾、最期 サクラ/桜、咲良",
526
+ 56 => "アワレ/憐、哀 ヒメイ/悲鳴、姫衣",
527
+ 66 => "ヘヴン/戸聞、天国 ガラス/硝子、枯州"
528
+ }
529
+ ),
530
+ "OPA" => DiceTable::D66Table.new(
531
+ "オトダマ性格表A",
532
+ D66SortType::ASC,
533
+ {
534
+ 11 => "さわやか",
535
+ 12 => "単純",
536
+ 13 => "目立ちたがり",
537
+ 14 => "笑い上戸",
538
+ 15 => "P大好き",
539
+ 16 => "がんばり屋",
540
+ 22 => "ひょうきん",
541
+ 23 => "ほれっぽい",
542
+ 24 => "勇敢",
543
+ 25 => "好奇心旺盛",
544
+ 26 => "優しい",
545
+ 33 => "八方美人",
546
+ 34 => "博愛",
547
+ 35 => "感情的",
548
+ 36 => "おしゃべり",
549
+ 44 => "無鉄砲",
550
+ 45 => "元気",
551
+ 46 => "楽観的",
552
+ 55 => "自信家",
553
+ 56 => "自由",
554
+ 66 => "好戦的"
555
+ }
556
+ ),
557
+ "OPB" => DiceTable::D66Table.new(
558
+ "オトダマ性格表B",
559
+ D66SortType::ASC,
560
+ {
561
+ 11 => "悲観的",
562
+ 12 => "大人しい",
563
+ 13 => "臆病",
564
+ 14 => "クール",
565
+ 15 => "のんき",
566
+ 16 => "マジメ",
567
+ 22 => "夢想家",
568
+ 23 => "常識人",
569
+ 24 => "サイコ",
570
+ 25 => "おおらか",
571
+ 26 => "平和主義者",
572
+ 33 => "慎重",
573
+ 34 => "合理主義者",
574
+ 35 => "無口",
575
+ 36 => "照れ屋",
576
+ 44 => "おひとよし",
577
+ 45 => "なまけもの",
578
+ 46 => "腰が低い",
579
+ 55 => "疑い深い",
580
+ 56 => "謙虚",
581
+ 66 => "嘘つき"
582
+ }
583
+ ),
584
+ "OHT" => DiceTable::D66Table.new(
585
+ "オトダマ趣味表",
586
+ D66SortType::ASC,
587
+ {
588
+ 11 => "散歩",
589
+ 23 => "温泉",
590
+ 36 => "オークション",
591
+ 12 => "うわさ話",
592
+ 24 => "ギャンブル",
593
+ 44 => "パズル",
594
+ 13 => "寝る",
595
+ 25 => "動物",
596
+ 45 => "占い",
597
+ 14 => "読書",
598
+ 26 => "アニメ",
599
+ 46 => "焼き肉",
600
+ 15 => "アイドル",
601
+ 33 => "ガーデニング",
602
+ 55 => "スポーツ観戦",
603
+ 16 => "甘味",
604
+ 34 => "漫画",
605
+ 56 => "ゲーム",
606
+ 22 => "飲み会",
607
+ 35 => "ドラマ",
608
+ 66 => "動画配信"
609
+ }
610
+ ),
611
+ "OLT" => DiceTable::D66Table.new(
612
+ "オトダマ外見表",
613
+ D66SortType::ASC,
614
+ {
615
+ 11 => "デフォルト",
616
+ 12 => "王子様/お姫様",
617
+ 13 => "和装",
618
+ 14 => "獣系",
619
+ 15 => "ゴス",
620
+ 16 => "眼鏡",
621
+ 22 => "スポーツ",
622
+ 23 => "軍服",
623
+ 24 => "天使/悪魔の羽",
624
+ 44 => "季節イベント",
625
+ 25 => "学生服",
626
+ 26 => "メガホン",
627
+ 33 => "スポーツ系",
628
+ 34 => "パンク",
629
+ 35 => "フォーマル",
630
+ 36 => "ジャージ",
631
+ 45 => "白衣",
632
+ 46 => "童話コス",
633
+ 55 => "バニー",
634
+ 56 => "水着",
635
+ 66 => "戦隊コス"
636
+ }
637
+ ),
638
+ "OIT" => DiceTable::Table.new(
639
+ "オトダマ一人称表",
640
+ "2D6",
641
+ [
642
+ "それがし",
643
+ "おいら/あたい",
644
+ "自分の名前",
645
+ "おれ/あたし",
646
+ "わたくし",
647
+ "私",
648
+ "ぼく/うち",
649
+ "自分",
650
+ "俺様/あたくし",
651
+ "余/妾",
652
+ "ミー"
653
+ ]
654
+ ),
655
+ "OYT" => DiceTable::Table.new(
656
+ "オトダマ呼び名表",
657
+ "2D6",
658
+ [
659
+ "ユー",
660
+ "(PCの名前)たん/きゅん",
661
+ "同志(PCの名前)",
662
+ "キミ",
663
+ "(PCの名前)くん/ちゃん",
664
+ "マスター",
665
+ "(PCの名前)さん",
666
+ "(PCの名前)様",
667
+ "あなた",
668
+ "(PCの名前)氏/女史",
669
+ "(PCの名前)殿"
670
+ ]
671
+ ),
672
+ "ORT" => DiceTable::Table.new(
673
+ "リアクション表",
674
+ "1D6",
675
+ [
676
+ "オトダマの表の性格を表すセリフ",
677
+ "オトダマの裏の性格を表すセリフ",
678
+ "PCを応援するセリフ",
679
+ "PCをからかうセリフ",
680
+ "趣味にまつわるセリフ",
681
+ "攻撃を行うときのセリフ"
682
+ ]
683
+ ),
684
+ "OMT" => DiceTable::Table.new(
685
+ "出会い表",
686
+ "2D6",
687
+ [
688
+ "名門オトダマ使い。あなたは、代々オトダマを操る一族に生まれました。あなたには、幼い頃から相棒となるオトダマがいます。あなたは、そのオトダマと共に育ちました。",
689
+ "傷ついたオトダマ。ある日、あなたは傷ついたオトダマを発見しました。意識を失い、今にも消えそうなオトダマに触れると、オトダマは意識を取り戻し、あなたを恩人と慕うようになりました。",
690
+ "見えないお友達。あなたは孤独な幼年期を過ごしてきました。そのとき、あなたを導いてくれたのが、あなたのオトダマです。オトダマは、あなたに他人のココロのウタを聞き、人々を助ける術を教えてくれました。",
691
+ "再生。あなたはオトクイに自分のココロのウタを食べられました。オトダマ使いに憑依したオトクイが倒されたとき、自分のココロの中から新たなオトダマが生まれました。",
692
+ "愛するココロ。あなたには、子どもの頃から大好きだったウタがありました。ある日、そのウタを口ずさんでいるとき、突然、後ろから拍手の音が聞こえました。振り向くと、そこにオトダマがいました。",
693
+ "動画。あなたは、動画を通じて歌を聞くのが好きでした。あるとき、聞いたことのないような素敵なウタが聞こえてきたかと思うと、画面の向こうからオトダマが飛び出してきました。",
694
+ "喪失。ある日、あなたは悲劇に見舞われました。そのとき、あなたはとても大切にしていた何かを失いました。その失ったものを補うかのように、あなたの側にオトダマが現れました。",
695
+ "受け継がれるウタ。あなたのオトダマは、あなたが大好きだった人の相棒だったオトダマでした。しかし、その人は悲劇に出会い、あなたの元を去りました。そのとき、あなたにオトダマを託したのです。",
696
+ "謎のメール。ある日、友人からあなたの元に一通のメールが送られてきました。そのメールを開くと、不思議な音楽が流れ出し、オトダマが現れました。その友人とは、それ以来、連絡がつきません。",
697
+ "封印。ある日、あなたは古いレコード屋で一曲の音盤に出会います。その音盤を再生してみると、オトダマが現れました。そして、オトダマは「封印を解いてくれたお礼に、しばらく付き合ってあげる」と言ってきました。",
698
+ "一目惚れ。以前、あなたは様々な楽曲を発表していました。すると、その楽曲に一目惚れしたと言って、あなたの元にオトダマが押しかけてきました。以来、そのオトダマに付きまとわれる毎日です。"
699
+ ]
700
+ ),
701
+ }.freeze
702
+
703
+ register_prefix(['R([A-DS]|\d+).*'] + TABLES.keys)
704
+ end
705
+ end
706
+ end