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