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,153 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Utakaze < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'Utakaze'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'ウタカゼ'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'うたかせ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ・行為判定ロール(nUK)
18
+ n個のサイコロで行為判定ロール。ゾロ目の最大個数を成功レベルとして表示。nを省略すると2UK扱い。
19
+ 例)3UK :サイコロ3個で行為判定
20
+ 例)UK :サイコロ2個で行為判定
21
+ 不等号用いた成否判定は現時点では実装してません。
22
+ ・クリティカルコール付き行為判定ロール(nUK@c or nUKc)
23
+  cに「龍のダイス目」を指定した行為判定ロール。
24
+ ゾロ目ではなく、cと同じ値の出目数x2が成功レベルとなります。
25
+ 例)3UK@5 :龍のダイス「月」でクリティカルコール宣言したサイコロ3個の行為判定
26
+ MESSAGETEXT
27
+
28
+ register_prefix(['\d*UK[@\d]*.*'])
29
+
30
+ def initialize(command)
31
+ super(command)
32
+ @arrayDragonDiceName = ['', '風', '雨', '雲', '影', '月', '歌']
33
+ @enabled_upcase_input = false
34
+ end
35
+
36
+ def eval_game_system_specific_command(command)
37
+ debug('eval_game_system_specific_command command', command)
38
+
39
+ result = ''
40
+
41
+ case command
42
+ when /(\d+)?UK(\@?(\d))?(>=(\d+))?/i
43
+ base = (Regexp.last_match(1) || 2).to_i
44
+ crit = Regexp.last_match(3).to_i
45
+ diff = Regexp.last_match(5).to_i
46
+ result = checkRoll(base, crit, diff)
47
+ end
48
+
49
+ return nil if result.empty?
50
+
51
+ return "#{command} > #{result}"
52
+ end
53
+
54
+ def checkRoll(base, crit, diff = 0)
55
+ result = ""
56
+
57
+ base = getValue(base)
58
+ crit = getValue(crit)
59
+
60
+ return result if base < 1
61
+
62
+ crit = 6 if crit > 6
63
+
64
+ result += "(#{base}d6)"
65
+
66
+ diceList = @randomizer.roll_barabara(base, 6).sort
67
+
68
+ result += " > [#{diceList.join(',')}] > "
69
+ result += getRollResultString(diceList, crit, diff)
70
+
71
+ return result
72
+ end
73
+
74
+ def getRollResultString(diceList, crit, diff)
75
+ success, maxnum, setCount = getSuccessInfo(diceList, crit, diff)
76
+
77
+ result = ""
78
+
79
+ if isDragonDice(crit)
80
+ result += "龍のダイス「#{@arrayDragonDiceName[crit]}」(#{crit})を使用 > "
81
+ end
82
+
83
+ if success
84
+ result += "成功レベル:#{maxnum} (#{setCount}セット)"
85
+ if diff != 0
86
+ diffSuccess = (maxnum >= diff)
87
+ if diffSuccess
88
+ result += " > 成功"
89
+ else
90
+ result += " > 失敗"
91
+ end
92
+ end
93
+
94
+ else
95
+ result += "失敗"
96
+ end
97
+
98
+ return result
99
+ end
100
+
101
+ def getSuccessInfo(diceList, crit, _diff)
102
+ debug("checkSuccess diceList, crit", diceList, crit)
103
+
104
+ diceCountHash = getDiceCountHash(diceList, crit)
105
+ debug("diceCountHash", diceCountHash)
106
+
107
+ maxnum = 0
108
+ successDiceList = []
109
+ countThreshold = (isDragonDice(crit) ? 1 : 2)
110
+
111
+ diceCountHash.each do |dice, count|
112
+ maxnum = count if count > maxnum
113
+ successDiceList << dice if count >= countThreshold
114
+ end
115
+
116
+ debug("successDiceList", successDiceList)
117
+
118
+ if successDiceList.size <= 0
119
+ # 失敗:ゾロ目無し(全部違う)
120
+ return false, 0, 0
121
+ end
122
+
123
+ # 竜のダイスの場合
124
+ maxnum *= 2 if isDragonDice(crit)
125
+
126
+ # 成功:ゾロ目あり
127
+ return true, maxnum, successDiceList.size
128
+ end
129
+
130
+ # 各ダイスの個数を数えてHashにする
131
+ def getDiceCountHash(dice_list, critical)
132
+ dice_list
133
+ .select { |dice| isNomalDice(critical) || dice == critical }
134
+ .group_by(&:itself)
135
+ .transform_values(&:size)
136
+ end
137
+
138
+ def isNomalDice(crit)
139
+ !isDragonDice(crit)
140
+ end
141
+
142
+ def isDragonDice(crit)
143
+ (crit != 0)
144
+ end
145
+
146
+ def getValue(number)
147
+ return 0 if number > 100
148
+
149
+ return number
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class VampireTheMasquerade5th < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'VampireTheMasquerade5th'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'Vampire: The Masquerade 5th Edition'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'うあんはいあさますかれえと5'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ・判定コマンド(nVMFx+x)
18
+ 注意:難易度は必要成功数を表す
19
+
20
+ 難易度指定:判定成功と失敗、Critical判定、
21
+ (Hungerダイスがある場合)Messy CriticalとBestial Failureチェックを行う
22
+ 例) (難易度)VMF(ダイスプール)+(Hungerダイス)
23
+ (難易度)VMF(ダイスプール)
24
+
25
+ 難易度省略:判定失敗、Critical、(Hungerダイスがある場合)Bestial Failureチェックを行う
26
+ 判定成功、Messy Criticalのチェックを行わない
27
+ 例) VMF(ダイスプール)+(Hungerダイス)
28
+ VMF(ダイスプール)
29
+
30
+ 難易度0指定:全てのチェックを行わない
31
+ 例) 0VMF(ダイスプール)+(Hungerダイス)
32
+ 0VMF(ダイスプール)
33
+
34
+ MESSAGETEXT
35
+
36
+ DIFFICULTY_INDEX = 1
37
+ DICE_POOL_INDEX = 3
38
+ HUNGER_DICE_INDEX = 5
39
+
40
+ # 難易度に指定可能な特殊値
41
+ NOT_CHECK_SUCCESS = -1 # 判定成功にかかわるチェックを行わない(判定失敗に関わるチェックは行う)
42
+
43
+ # ダイスボットで使用するコマンドを配列で列挙する
44
+ register_prefix(['\d*VMF.*'])
45
+
46
+ def eval_game_system_specific_command(command)
47
+ m = /\A(\d+)?(VMF)(\d+)(\+(\d+))?/.match(command)
48
+ unless m
49
+ return ''
50
+ end
51
+
52
+ dice_pool = m[DICE_POOL_INDEX].to_i
53
+ dice_text, success_dice, ten_dice, = make_dice_roll(dice_pool)
54
+ result_text = "(#{dice_pool}D10"
55
+
56
+ hunger_dice_pool = m[HUNGER_DICE_INDEX]&.to_i
57
+ if hunger_dice_pool
58
+ hunger_dice_text, hunger_success_dice, hunger_ten_dice, hunger_botch_dice = make_dice_roll(hunger_dice_pool)
59
+
60
+ ten_dice += hunger_ten_dice
61
+ success_dice += hunger_success_dice
62
+
63
+ result_text = "#{result_text}+#{hunger_dice_pool}D10) > [#{dice_text}]+[#{hunger_dice_text}] "
64
+ else
65
+ hunger_ten_dice = 0
66
+ hunger_botch_dice = 0
67
+ result_text = "#{result_text}) > [#{dice_text}] "
68
+ end
69
+
70
+ success_dice += get_critical_success(ten_dice)
71
+
72
+ difficulty = m[DIFFICULTY_INDEX] ? m[DIFFICULTY_INDEX].to_i : NOT_CHECK_SUCCESS
73
+
74
+ result_text = "#{result_text} 成功数=#{success_dice}"
75
+
76
+ if difficulty > 0
77
+ if success_dice >= difficulty
78
+ judgment_result = get_success_result(ten_dice >= 2, hunger_ten_dice)
79
+ else
80
+ judgment_result = get_fail_result(hunger_botch_dice)
81
+ end
82
+ result_text = "#{result_text} 難易度=#{difficulty}#{judgment_result}"
83
+ elsif difficulty < 0
84
+ if success_dice == 0
85
+ judgment_result = get_fail_result(hunger_botch_dice)
86
+ else
87
+ judgment_result = ""
88
+ end
89
+ result_text = "#{result_text}#{judgment_result}"
90
+ end
91
+
92
+ return result_text
93
+ end
94
+
95
+ def get_critical_success(ten_dice)
96
+ # 10の目が2個毎に追加2成功
97
+ return ((ten_dice / 2) * 2)
98
+ end
99
+
100
+ def make_dice_roll(dice_pool)
101
+ dice_list = @randomizer.roll_barabara(dice_pool, 10)
102
+
103
+ dice_text = dice_list.join(',')
104
+ success_dice = dice_list.count { |x| x >= 6 }
105
+ ten_dice = dice_list.count(10)
106
+ botch_dice = dice_list.count(1)
107
+
108
+ return dice_text, success_dice, ten_dice, botch_dice
109
+ end
110
+
111
+ def get_success_result(is_critical, hunger_ten_dice)
112
+ judgment_result = ":判定成功!"
113
+ if hunger_ten_dice > 0 && is_critical
114
+ return "#{judgment_result} [Messy Critical]"
115
+ elsif is_critical
116
+ return "#{judgment_result} [Critical Win]"
117
+ end
118
+
119
+ return judgment_result
120
+ end
121
+
122
+ def get_fail_result(hunger_botch_dice)
123
+ judgment_result = ":判定失敗!"
124
+ if hunger_botch_dice > 0
125
+ return "#{judgment_result} [Bestial Failure]"
126
+ end
127
+
128
+ return judgment_result
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,555 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Villaciel < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'Villaciel'
8
+
9
+ # ゲームシステム名
10
+ NAME = '蒼天のヴィラシエル'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'そうてんのういらしえる'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ・判定        nVBS[>=d]
18
+  []内省略時は達成数の計算のみ。トライアンフあり。
19
+  n: ダイス数、d: 難易度
20
+ ・フロンティア判定  nVF
21
+  n: ダイス数
22
+  nVBSを行い、うでまえ表を参照した結果を表示します。
23
+ ・採掘スキル判定   nVM
24
+  n: ダイス数
25
+  判定に成功した場合、自動的に獲得できるアイテム数も表示されます。
26
+ ・宝石加工スキル判定 nVG
27
+  n: ダイス数
28
+ ・前職表       PJ[x] x=V,A
29
+  []内は省略可能。
30
+  PJ, PJV: 「蒼天のヴィラシエル」掲載の前職表 PJA: 「白雲のアルメサール」掲載の前職表
31
+ ・ぷちクエスト表   PQ[x] x=V,A
32
+  []内は省略可能。
33
+  PQ, PQV: 「蒼天のヴィラシエル」掲載のぷちクエスト表 PQA: 「白雲のアルメサール」掲載のぷちクエスト表
34
+ ・アクシデント表   AC
35
+ ・もふもふ表     MMx x=I,A,V,VV,VA,D
36
+ MMI: 昆虫 MMA: 動物 MMV, MMVV: ヴィラシエル種(「蒼天のヴィラシエル」掲載) MMVA: ヴィラシエル種(「白雲のアルメサール」掲載) MMD: 鋼龍種
37
+ ・釣り表       Fx x=L,R,W,G,B,C,S
38
+  FL: 湖 FR: 河 FW: 白雲 FG: 灰雲 FB: 黒雲 FC: 共通 FS: 塩湖
39
+ ・不食植物表     IP[x] x=V,A
40
+  IP, IPV: 「蒼天のヴィラシエル」掲載の不食植物表 IPA: 「白雲のアルメサール」掲載の不食植物表
41
+ ・可食植物表     EP[x][n] x=V,A
42
+  []内は省略可能。
43
+  n: 可食植物表番号
44
+  EP[n], EPV[n]: 「蒼天のヴィラシエル」掲載の可食植物表。[]内省略時はnを1D6で決定し、EPVnを実行。ただし、1D6の出目が6ならば、「好きな表を選んでおっけー!」と表示。
45
+  EPA[n]: 「白雲のアルメサール」掲載の可食植物表。[]内省略時は1D6を振り、出目が偶数ならばEPA1、奇数ならばEPA2を実行。
46
+ ・変異植物表     MP
47
+ ・改良種表      IS
48
+ MESSAGETEXT
49
+
50
+ register_prefix(['\\d+VBS(>=\\d+)?', '\\d+VF', '\\d+VM', '\\d+VG', 'PJ[VA]?', 'PQ[VA]?', 'AC', 'MM([IAD]|V[VA]?)', 'F[LRWGBCS]', 'IP[VA]?', 'EP[VA]?\\d?', 'MP', 'IS'])
51
+
52
+ def initialize(command)
53
+ super(command)
54
+
55
+ @enabled_d66 = true
56
+ @d66_sort_type = D66SortType::NO_SORT # D66あり。ただし、現行ルールにある6x6の表については別のコマンドを用意
57
+ @round_type = RoundType::CEIL # 端数は切り上げ
58
+ end
59
+
60
+ def eval_game_system_specific_command(command)
61
+ case command
62
+ when /\d+VBS/
63
+ resolute_action(command)
64
+ when /\d+VF/
65
+ resolute_frontier_action(command)
66
+ when /\d+VM/
67
+ resolute_mining_action(command)
68
+ when /\d+VG/
69
+ resolute_cutting_gem_action(command)
70
+ when /PJ[VA]?/
71
+ use_previous_job_chart(command)
72
+ when /PQ[VA]?/
73
+ use_petit_quest_chart(command)
74
+ when 'AC'
75
+ use_accident_chart(command)
76
+ when /MM([IAD]|V[VA]?)/
77
+ use_mohumohu_chart(command)
78
+ when /F[LRWGBCS]/
79
+ use_fishing_chart(command)
80
+ when /IP[VA]?/
81
+ use_inedible_plant_chart(command)
82
+ when /EP[VA]?\d?/
83
+ use_edible_plant_chart(command)
84
+ when 'MP'
85
+ use_mutant_plant_chart(command)
86
+ when 'IS'
87
+ use_improved_species_chart(command)
88
+ end
89
+ end
90
+
91
+ private
92
+
93
+ D6 = 6
94
+ LEAST_SUCCESS_ROLL = 4
95
+ SUCCESS_STR = ' > 成功'
96
+ FAILURE_STR = ' > 失敗'
97
+
98
+ def derive_achievement(num_dices, command)
99
+ # 達成数計算の際にはトライアンフ「出目が6だったダイスは達成数2としてカウントする」を考慮する必要があるが、要は「達成数=成功数+出目が最大値だったダイスの数」になる
100
+ dice_list = @randomizer.roll_barabara(num_dices, D6)
101
+ dice_str = dice_list.join(",")
102
+ num_triumph_dices = dice_list.count(6)
103
+ num_successes = dice_list.count { |dice| dice >= LEAST_SUCCESS_ROLL }
104
+ achievement = num_successes + num_triumph_dices
105
+
106
+ output = "(#{command}) > [#{dice_str}] > 達成数: #{achievement}"
107
+ return achievement, output
108
+ end
109
+
110
+ def resolute_action(command)
111
+ match_data = command.match(/(\d+)VBS(>=(\d+))?/)
112
+
113
+ num_dices = match_data[1].to_i
114
+ achievement, output = derive_achievement(num_dices, command)
115
+ return output unless match_data[2]
116
+
117
+ difficulty = match_data[3].to_i
118
+ output += achievement >= difficulty ? SUCCESS_STR : FAILURE_STR
119
+
120
+ return output
121
+ end
122
+
123
+ SKILL_CHART = ['左に3マス、上に3マス動かす', '左に2マス、上に2マス動かす', '右か下に1マス動かしてもよい', '右に1マス、下に1マス動かす', '好きな方向に最大で3マス動かしてもよい(1マスでも良い)', '好きな方向に最大で5マス動かしてもよい(1〜3マスでもよい)'].freeze
124
+
125
+ def resolute_frontier_action(command)
126
+ num_dices = command.match(/(\d+)VF/)[1].to_i
127
+ achievement, output = derive_achievement(num_dices, command)
128
+
129
+ chart_index =
130
+ case achievement
131
+ when 0..2
132
+ achievement
133
+ when 3, 4
134
+ 3
135
+ when 5..8
136
+ 4
137
+ else
138
+ 5
139
+ end
140
+
141
+ skill = SKILL_CHART[chart_index]
142
+ return "#{output} > #{skill}"
143
+ end
144
+
145
+ def resolute_difficult_action(num_dices, least_success_roll, command)
146
+ # 1個でもleast_success_roll以上の出目が出たら成功となる判定
147
+
148
+ # 出目の最大値がnならば「1個でもn以上の出目が出た」ことになる
149
+ dice_list = @randomizer.roll_barabara(num_dices, D6)
150
+ dice_str = dice_list.join(',')
151
+ largest_roll = dice_list.max()
152
+ is_successful = largest_roll >= least_success_roll
153
+
154
+ output = "(#{command}) > [#{dice_str}]"
155
+ output += is_successful ? SUCCESS_STR : FAILURE_STR
156
+
157
+ return output, is_successful
158
+ end
159
+
160
+ LEAST_MINING_SUCCESS_ROLL = 5
161
+ LEAST_GEM_SUCCESS_ROLL = 6
162
+
163
+ def resolute_mining_action(command)
164
+ num_dices = command.match(/(\d+)VM/)[1].to_i
165
+ output, is_successful = resolute_difficult_action(num_dices, LEAST_MINING_SUCCESS_ROLL, command)
166
+ return output unless is_successful
167
+
168
+ roll_result = @randomizer.roll_once(D6)
169
+ "#{output} > (1D6) > [#{roll_result}] > アイテムを#{roll_result}個獲得"
170
+ end
171
+
172
+ def resolute_cutting_gem_action(command)
173
+ num_dices = command.match(/(\d+)VG/)[1].to_i
174
+ resolute_difficult_action(num_dices, LEAST_GEM_SUCCESS_ROLL, command)[0]
175
+ end
176
+
177
+ VILLACIEL_PREVIOUS_JOB_CHART = [['農家: 知力+1 器用さ+1 開拓/1Lv',
178
+ '漁師: 知力+1 ひらめき+1 釣り/1Lv',
179
+ '狩人: 武力+1 ひらめき+1 穴掘り/1Lv',
180
+ '鍛冶職人: 武力+1 器用さ+1 採掘/1Lv',
181
+ '牧場主: 仲良し+2 開拓/1Lv',
182
+ '採掘師: 器用さ+1 ひらめき+1 採掘/1Lv'].freeze,
183
+ ['家事手伝い: 器用さ+1 仲良し+1 調理/1Lv',
184
+ '調理師: 知力+1 ひらめき+1 調理/1Lv',
185
+ '細工師: 器用さ+2 採掘/1Lv',
186
+ '大工: 武力+1 器用さ+1 木こり/1Lv',
187
+ '荒くれ者: 武力+2 穴掘り/1Lv',
188
+ '王国騎士: 武力+1 知力+1 木こり/1Lv'].freeze].freeze
189
+ ARMESEAR_PREVIOUS_JOB_CHART = [['農家: 知力+1 器用さ+1 開拓/1Lv',
190
+ '漁師: 知力+1 ひらめき+1 釣り/1Lv',
191
+ '狩人: 武力+1 ひらめき+1 穴掘り/1Lv',
192
+ '鍛冶職人: 武力+1 器用さ+1 採掘/1Lv',
193
+ '牧場主: 仲良し+2 開拓/1Lv',
194
+ '採掘師: 器用さ+1 ひらめき+1 採掘/1Lv'].freeze,
195
+ ['羊飼い: 仲良し+2 もふもふ/1Lv',
196
+ '芽拾い: 知力+1 武力+1 採集/1Lv',
197
+ '服屋見習い: 器用さ+2 裁縫/1Lv',
198
+ '革細工見習い: 知力+2 裁縫/1Lv',
199
+ '商人: 知力+1 仲良し+1 基礎になるスキル/1Lv',
200
+ '旅人: 武力+1 知力+1 基礎になるスキル/1Lv'].freeze,
201
+ ['家事手伝い: 器用さ+1 仲良し+1 調理/1Lv',
202
+ '調理師: 知力+1 ひらめき+1 調理/1Lv',
203
+ '細工師: 器用さ+2 採掘/1Lv or 調合・細工/1Lv',
204
+ '大工: 武力+1 器用さ+1 木こり/1Lv',
205
+ '荒くれ者: 武力+2 穴掘り/1Lv',
206
+ '王国騎士: 武力+1 知力+1 木こり/1Lv'].freeze].freeze
207
+
208
+ def use_previous_job_chart(command)
209
+ match_data = command.match(/PJ([VA]?)/)
210
+ chart_symbol = match_data[1] == '' ? 'V' : match_data[1]
211
+
212
+ roll_result1 = @randomizer.roll_once(D6)
213
+ chart_text, roll_result2 = case chart_symbol
214
+ when 'V' then get_table_by_1d6(VILLACIEL_PREVIOUS_JOB_CHART[(roll_result1 - 1) / 3])
215
+ when 'A' then get_table_by_1d6(ARMESEAR_PREVIOUS_JOB_CHART[(roll_result1 - 1) / 2])
216
+ end
217
+
218
+ chart_title = case chart_symbol
219
+ when 'V' then '前職表(ヴィラシエル)'
220
+ when 'A' then '前職表(アルメサール)'
221
+ end
222
+ "#{chart_title} > [#{roll_result1},#{roll_result2}] > #{chart_text}"
223
+ end
224
+
225
+ VILLACIEL_PETIT_QUEST_CHART = [['家の補強のために: 【目的:木を1個納品】【報酬:各自2プサイ】見えを張っていい木材で家を作ったら木材が枯渇しちまった。頼む、原木を分けてくれないか?',
226
+ '孫のために: 【目的:花を1個納品】【報酬:各自2プサイ】綺麗な花があればいい色に染められるだろうと思うてな。孫のために必要なの。',
227
+ '人間界の草: 【目的:草を2個納品】【報酬:各自3プサイ】魔界にはない草が生えていると噂で聞いたことがある。その草がほしい。',
228
+ '種の生存のために: 【目的:可食植物(改良種を除く)を1個納品】【報酬:各自1プサイ】育ちが悪い同種の植物と掛け合わせてみたいのでサンプルがほしい。',
229
+ 'にんげんのたべもの!: 【目的:可食植物(改良種を除く)を1個納品】【報酬:各自2プサイ】ひゅーいあはなにをたべるの! たべたい!',
230
+ 'まかいのたべものって?: 【目的:可食植物の改良種を2個納品】【報酬:各自3プサイ】まぞくさんはなにたべるですか! おしえてください。'].freeze,
231
+ ['おうちなおしたいの!: 【目的:石材を1個納品】【報酬:各自1プサイ】おうちがぼろぼろだから、ママのかわりになおしたいの。',
232
+ '娘の結婚式に必要なんだ!: 【目的:宝石を2個納品】【報酬:各自3プサイ】ちょっとさきなんですが、娘が結婚するので結婚式用の宝石を集めています。',
233
+ '金属がたりない!: 【目的:金属を1個納品】【報酬:各自2プサイ】いい武器にはいい金属を。今回必要なのは……。',
234
+ '村の聖堂を直したいんだ!: 【目的:石材を1個納品】【報酬:各自2プサイ】聖堂を直していたが石材がたりない!',
235
+ '弟の甲冑に使うんだ!: 【目的:金属を2個納品】【報酬:各自3プサイ】最近、近くの鉱山から「ある金属」が姿を消した。',
236
+ 'おねえちゃんのたんじょうびに: 【目的:宝石を1個納品】【報酬:各自2プサイ】たんじょうびぷれぜんとにほうせきあげたらおねえちゃんよろこぶかな?'].freeze,
237
+ ['パパのために: 【目的:木材の家具を1個納品】【報酬:各自2プサイ】はたらいてばっかりのパパにプレゼントしたいの。おねがいします!',
238
+ '癒やされたい……: 【目的:石材の家具を1個納品】【報酬:各自2プサイ】仕事時間は短いとはいえ、激務。めちゃつらい。癒しになる家具がほしい。',
239
+ 'いい家具に囲まれてみたい: 【目的:金属の家具を1個納品】【報酬:各自2プサイ】開拓も最高だけど、他の島の人とも交流したい。人を呼べるような家を作るためには最高の家具が必要!',
240
+ '家具の在庫不足: 【目的:木材の装飾品を1個納品】【報酬:各自3プサイ】困ったことに職人に逃げられた! このままじゃ、お店開けない!!',
241
+ 'と、ともだちにあげるの!: 【目的:石材の装飾品を1個納品】【報酬:各自3プサイ】えっと、お、おきにいりのともだちがいるんだ。そ、そのこのたんじょうびだから、プレゼントしたくって。',
242
+ '親の木に飾りを: 【目的:金属の装飾品を1個納品】【報酬:各自3プサイ】元気のない親の木を心配してペッコ達が大騒ぎしているんだ。君はいつまでも美しいよと伝えたくてね。一つ助力をお願いするよ。'].freeze,
243
+ ['そちらの河魚を食してみたい: 【目的:河魚を2個納品】【報酬:各自3プサイ】おいしい河魚がいるときいたことがあるのです。さぁ、はやく、釣ってきてくださいまし。',
244
+ '研究に使用したい: 【目的:湖魚を1個納品】【報酬:各自1プサイ】そちらの世界にある同名の魚が本当にこちらの世界にいるものと一緒か確かめたいのです。',
245
+ 'しろいくもにすむおさかながみたい!: 【目的:白雲の雲魚を1個納品】【報酬:各自2プサイ】こっちにはしろいくもってなかなかないの! しろいくものおさかな、たべてみたいな。',
246
+ '釣り師がいないのでお魚がほしい: 【目的:灰雲の雲魚を2個納品】【報酬:各自3プサイ】野菜や肉もいいが魚も食べたい……。頼む、魚を釣ってきてくれないか?',
247
+ 'まっくろなくもにすむおさかな!: 【目的:黒雲の雲魚を1個納品】【報酬:各自2プサイ】まっくろなくもにはどんなさかながすんでるの? みせて、みせて!',
248
+ '人間界では見られない魚が見たい!: 【目的:共通の雲魚を1個納品】【報酬:各自2プサイ】他の魚の雲を利用して泳ぎ回る魚がいると聞いたよ。ぜひ見せてほしいな。'].freeze].freeze
249
+ ARMESEAR_PETIT_QUEST_CHART = [['お祭り用の布が足りないの!: 【目的:布を2個納品】【報酬:各自4プサイ】お祭り前なのに、布職人が腰を痛めちゃったの!',
250
+ 'お洋服がぼろぼろになっちゃったの: 【目的:布を1個納品】【報酬:各自2プサイ】おばあちゃんに作ってもらった服がボロボロになっちゃったから、なおしたいの。',
251
+ 'ぎっくり腰からのヘルプ: 【目的:薪を3個納品】【報酬:各自3プサイ】仕事してたらぎっくり腰になっちゃったのだ。頼むのだ。',
252
+ '不調には栄養たっぷりのミルクを: 【目的:ミルクを1個納品】【報酬:各自3プサイ】体調を崩しちゃったの。栄養満点のミルクを頂戴。',
253
+ '材料がたりない!: 【目的:???の粗皮を1個納品】【報酬:各自3プサイ】革細工師を目指してるんだけど、皮が足りないんだ。種類は問わないから、早めに頼むよ。',
254
+ '愛しのガードナーのために: 【目的:???の肉を1個納品】【報酬:各自3プサイ】ガードナーの調子が悪いから、栄養をつけさせたいんだ。肉はなんだっていい、とびっきりのを頼むよ。'].freeze,
255
+ ['灯火をひとつ: 【目的:キャンドルを1個納品】【報酬:各自3プサイ】家の裏に知らない建物があるんだ。まっくらだから明かりが必要で……。',
256
+ '布の色を頂戴: 【目的:染料を1個納品】【報酬:各自2プサイ】んー、コンテストのために布を織ったのだけど、色が決められないんだ。お願いするよ。',
257
+ 'きれいなのお花を: 【目的:花を1個納品】【報酬:各自2プサイ】パパの誕生日プレゼントを妹と作りたいんだ。お願いできる?',
258
+ '旅立ちのために: 【目的:衣類を1個納品】【報酬:各自15プサイ】旅立つ弟に服をプレゼントしたいんだ。',
259
+ '納品物が足りない!: 【目的:革を1個納品】【報酬:各自4プサイ】どうしても納品する皮がたりない……頼む、なんとか用意できないか?',
260
+ '求)照明: 【目的:照明を1個納品】【報酬:各自10プサイ】引っ越しする最中に照明を壊してしまった! 明日から明かりがないのはつらい……。作ってくれないか?'].freeze,
261
+ ['装備の修復のため: 【目的:革を2個納品】【報酬:各自5プサイ】大事な装備が壊れちゃったんだ! 直すのに必要なんだけど、革を持っているかい?',
262
+ '主に祝いの品を: 【目的:敷物を1個納品】【報酬:各自15プサイ】誕生日を迎える主にささやかなながらわたしからも祝いの品を送りたいのです。',
263
+ '手料理を求めて: 【目的:出来栄え5の料理を1個納品】【報酬:各自5プサイ】たまには誰かの料理が食べたいんだ。',
264
+ '釣り竿が折れちゃって……: 【目的:塩魚を2個納品】【報酬:各自3プサイ】釣り竿が折れちゃったから釣りができないんだ。一匹頼める?',
265
+ '蝋がほしいの: 【目的:蝋を1個納品】【報酬:各自2プサイ】お兄ちゃんとパパの誕生日プレゼントを作るの。見つからないからお願いできる?',
266
+ '美しさを求めて: 【目的:アルメサール産の花を1個納品】【報酬:各自3プサイ】美しいお花を摘んで来てくださらない? 美のために必要でしてよ。'].freeze].freeze
267
+
268
+ def use_petit_quest_chart(command)
269
+ match_data = command.match(/PQ([VA]?)/)
270
+ chart_symbol = match_data[1] == '' ? 'V' : match_data[1]
271
+
272
+ roll_result1 = @randomizer.roll_once(D6)
273
+ chart_text, roll_result2 = case chart_symbol
274
+ when 'V'
275
+ chart_index = case roll_result1
276
+ when 1, 2 then 0
277
+ when 3, 4 then 1
278
+ when 5 then 2
279
+ when 6 then 3
280
+ end
281
+ get_table_by_1d6(VILLACIEL_PETIT_QUEST_CHART[chart_index])
282
+ when 'A' then get_table_by_1d6(ARMESEAR_PETIT_QUEST_CHART[(roll_result1 - 1) / 2])
283
+ end
284
+
285
+ chart_title = case chart_symbol
286
+ when 'V' then 'ぷちクエスト表(ヴィラシエル)'
287
+ when 'A' then 'ぷちクエスト表(アルメサール)'
288
+ end
289
+ "#{chart_title} > [#{roll_result1},#{roll_result2}] > #{chart_text}"
290
+ end
291
+
292
+ ACCIDENT_CHART = ['飛び猪襲来!: 空飛ぶ猪が浮遊島めがけて突撃してきた! 建物が粉砕される前に迎撃だ!(「蒼天のヴィラシエル」P.46)',
293
+ '嵐がくるぞ!: 嵐が来るらしいぞ! どれだけ対策できるかが鍵だ!(「蒼天のヴィラシエル」P.47)',
294
+ '雨が降らないぞ!: おかしいなぁ、雨が降らないぞぉ……? こうなったら雨乞いの踊りだ!(「蒼天のヴィラシエル」P.48)',
295
+ 'トビウオ流星群: きらきら光る流れ星……いや待て! あれはトビウオの群れだー!?(「蒼天のヴィラシエル」P.49)',
296
+ 'すごい雷雨: すごい。ごろごろばりばり聞こえてくる。これは早々に対策しないと直撃するぞ!(「蒼天のヴィラシエル」P.50)',
297
+ '野菜泥棒出現!: 畑の野菜が盗まれているぞ……? これは犯人を捕まえないと!(「蒼天のヴィラシエル」P.51)'].freeze
298
+
299
+ def use_accident_chart(_command)
300
+ chart_text, roll_result = get_table_by_1d6(ACCIDENT_CHART)
301
+ "アクシデント表 > [#{roll_result}] > #{chart_text}"
302
+ end
303
+
304
+ def use_6x6_chart(chart, chart_name)
305
+ # 6x6の表からランダムに参照する
306
+ # chartは文字列の配列の配列であることを仮定
307
+ # D66ロールによる表参照と近いが、D66の方は13, 42などの数値に対応した表なのに対し、こちらは「下3マス、右2マス」という風にセルを参照する
308
+ y_roll = @randomizer.roll_once(D6)
309
+ cell_text, x_roll = get_table_by_1d6(chart[y_roll - 1])
310
+ "#{chart_name} > [#{y_roll},#{x_roll}] > 下#{y_roll}マス、右#{x_roll}マス > #{cell_text}"
311
+ end
312
+
313
+ MOHUMOHU_INSECT_CHART = [['小さな虫', '小さな虫', 'カマキリ', 'カマキリ', 'バッタ', 'クワガタ'].freeze,
314
+ ['小さな虫', 'カラスアゲハ', 'カマキリ', 'バッタ', 'オオスカシバ', 'カイコ'].freeze,
315
+ ['ハンミョウ', 'カラスアゲハ', 'カマキリ', 'バッタ', 'カイコ', 'トンボ'].freeze,
316
+ ['ハンミョウ', 'カラスアゲハ', 'カラスアゲハ', 'チッチハチ', 'トンボ', 'トンボ'].freeze,
317
+ ['クワガタ', 'カラスアゲハ', 'チッチハチ', 'チッチハチ', 'アリ', 'アリ'].freeze,
318
+ ['クワガタ', 'チッチハチ', 'チッチハチ', 'チッチハチ', 'アリ', 'アリ'].freeze].freeze
319
+
320
+ MOHUMOHU_ANIMAL_CHART = [['トリサン', 'トリサン', 'ブタ', 'ヒツジ', 'タヌキ', 'タヌキ'].freeze,
321
+ ['トリサン', 'ブタ', 'ヒツジ', 'ウッシ', 'キツネ', 'タヌキ'].freeze,
322
+ ['ブタ', 'オグマ', 'ヒツジ', 'キツネ', 'キツネ', 'アタウサギ'].freeze,
323
+ ['ブタ', 'ヒツジ', 'ヒツジ', 'リス', 'シシ', 'ヴィラシエル種(MMV)'].freeze,
324
+ ['ウッシ', 'ウサギ', 'ウサギ', 'シシ', 'アタウサギ', 'オオカミ'].freeze,
325
+ ['ウッシ', 'オグマ', 'クーマ', 'シシ', 'オオカミ', 'ヴィラシエル種(MMV)'].freeze].freeze
326
+
327
+ MOHUMOHU_VILLACIEL_CHART = [['ウドン', 'ウドン', 'オボン', 'オボン', 'オボン', 'オワン'].freeze,
328
+ ['ウドン', 'ウドン', 'オボン', 'オワン', 'オワン', 'オワン'].freeze].freeze
329
+
330
+ MOHUMOHU_VILLACIEL2_CHART = [['すねーくあし', 'すねーくあし', 'すねーくあし', 'ウタヒ', 'オオトリサン', 'オオトリサン'].freeze,
331
+ ['すねーくあし', 'すねーくあし', 'ホネホネ', 'オオトリサン', 'アマアマガニ', 'ホワホワ'].freeze,
332
+ ['すねーくあし', 'ホネホネ', 'オオトリサン', 'ウタヒ', 'アマアマガニ', 'ペロリ'].freeze,
333
+ ['オオトリサン', 'オオトリサン', 'ホネホネ', 'ホネホネ', 'ホワホワ', 'アマアマガニ'].freeze,
334
+ ['ホネホネ', 'ウタヒ', 'アマアマガニ', 'ペロリ', 'ペロリ', 'ペロリ'].freeze,
335
+ ['オオトリサン', 'ホワホワ', 'ホワホワ', 'アマアマガニ', 'ペロリ', 'ペロリ'].freeze].freeze
336
+
337
+ MOHUMOHU_DRAGON_CHART = [['モドモドリス', 'テロメ', 'モドモドリス', 'オジサン', 'オジサン', 'グロッチ'].freeze,
338
+ ['テロメ', 'モドモドリス', 'オジサン', 'テロメ', 'ニホンツノ', 'グロッチ'].freeze,
339
+ ['テロメ', 'グロッチ', 'グロッチ', 'グロッチ', 'オジサン', 'コディ'].freeze,
340
+ ['モドモドリス', 'グロッチ', 'ニホンツノ', 'テロメ', 'テーリー', 'ケラプス'].freeze,
341
+ ['オジサン', 'テロメ', 'テロメ', 'コディ', 'コディ', 'ケラプス'].freeze,
342
+ ['コディ', 'テーリー', 'テーリー', 'コディ', 'ケラプス', 'アサール・ゴッツ'].freeze].freeze
343
+
344
+ def use_mohumohu_chart(command)
345
+ case command
346
+ when 'MMI' then use_6x6_chart(MOHUMOHU_INSECT_CHART, 'もふもふ表・昆虫')
347
+ when 'MMA' then use_6x6_chart(MOHUMOHU_ANIMAL_CHART, 'もふもふ表・動物')
348
+ when /MMV[VA]?/
349
+ match_data = command.match(/MMV([VA]?)/)
350
+ chart_symbol = match_data[1] == '' ? 'V' : match_data[1]
351
+
352
+ case chart_symbol
353
+ when 'V'
354
+ y_roll = @randomizer.roll_once(D6)
355
+ cell_text, x_roll = get_table_by_1d6(MOHUMOHU_VILLACIEL_CHART[1 - y_roll % 2])
356
+ "もふもふ表・ヴィラシエル種(ヴィラシエル) > [#{y_roll},#{x_roll}] > 下#{y_roll.even? ? '偶数' : '奇数'}、右#{x_roll}マス > #{cell_text}"
357
+ when 'A' then use_6x6_chart(MOHUMOHU_VILLACIEL2_CHART, 'もふもふ表・ヴィラシエル種(アルメサール)')
358
+ end
359
+ when 'MMD' then use_6x6_chart(MOHUMOHU_DRAGON_CHART, 'もふもふ表・鋼龍種')
360
+ end
361
+ end
362
+
363
+ FISHING_LAKE_CHART = [['ヤマアイズリ', 'ヤマアイズリ', 'ヤマアイズリ', 'シコウチャ', 'シコウチャ', 'ハナロクショウ'].freeze,
364
+ ['ヤマアイズリ', 'ヤマアイズリ', 'ヤマアイズリ', 'シコウチャ', 'ハナロクショウ', 'ハナロクショウ'].freeze,
365
+ ['ヤマアイズリ', 'ヤマアイズリ', 'シコウチャ', 'シコウチャ', 'ハナモエギ', 'トノチャ'].freeze,
366
+ ['ヤマアイズリ', 'カラスアゲハ', 'シコウチャ', 'ハナロクショウ', 'トノチャ', 'ハナモエギ'].freeze,
367
+ ['シコウチャ', 'シコウチャ', 'ハナロクショウ', 'ハナロクショウ', 'トノチャ', 'ハナモエギ'].freeze,
368
+ ['シコウチャ', 'ハナロクショウ', 'トノチャ', 'トノチャ', 'ハナモエギ', 'シンペキ'].freeze].freeze
369
+
370
+ FISHING_RIVER_CHART = [['ケイカンセキ', 'ケイカンセキ', 'ケイカンセキ', 'ケイカンセキ', 'カナリア', 'イワヌ'].freeze,
371
+ ['ケイカンセキ', 'ケイカンセキ', 'カナリア', 'カナリア', 'カナリア', 'イワヌ'].freeze,
372
+ ['ケイカンセキ', 'ケイカンセキ', 'カナリア', 'イワヌ', 'イワヌ', 'ヤマブキ'].freeze,
373
+ ['ケイカンセキ', 'カナリア', 'イワヌ', 'アメイロ', 'アメイロ', 'ヤマブキ'].freeze,
374
+ ['カナリア', 'カナリア', 'イワヌ', 'アメイロ', 'ヤマブキ', 'ヤマブキ'].freeze,
375
+ ['カナリア', 'イワヌ', 'アメイロ', 'アメイロ', 'ヤマブキ', 'コハク'].freeze].freeze
376
+
377
+ FISHING_WHITE_CHART = [['ウメガサネ', 'ウメガサネ', 'ウメガサネ', 'ウメガサネ', 'ハネズ', 'ユルシ'].freeze,
378
+ ['ウメガサネ', 'ウメガサネ', 'ウメガサネ', 'ハネズ', 'ソホ', 'シンク'].freeze,
379
+ ['ウメガサネ', 'ウメガサネ', 'ハネズ', 'ソホ', 'ユルシ', 'ユルシ'].freeze,
380
+ ['ウメガサネ', 'ハネズ', 'ソホ', 'ユルシ', 'シンク', 'シンク'].freeze,
381
+ ['ハネズ', 'ソホ', 'ソホ', 'ユルシ', 'シンク', '共通(FC)'].freeze,
382
+ ['ハネズ', 'ソホ', 'ユルシ', 'シンク', '共通(FC)', 'シュアン'].freeze].freeze
383
+
384
+ FISHING_GRAY_CHART = [['ウメガサネ', 'ウメガサネ', 'セイラン', 'セイラン', 'ミハナダ', 'ミハナダ'].freeze,
385
+ ['ウメガサネ', 'セイラン', 'セイラン', 'ミハナダ', 'ミハナダ', 'ミハナダ'].freeze,
386
+ ['ウメガサネ', 'ユルシ', 'ミハナダ', 'ミハナダ', 'ミハナダ', 'リンドウ'].freeze,
387
+ ['ユルシ', 'ユルシ', 'セイラン', 'リンドウ', 'リンドウ', 'スミレ'].freeze,
388
+ ['ユルシ', 'ユルシ', 'リンドウ', 'スミレ', 'スミレ', '共通(FC)'].freeze,
389
+ ['ユルシ', 'リンドウ', 'スミレ', 'スミレ', '共通(FC)', 'シゴク'].freeze].freeze
390
+
391
+ FISHING_BLACK_CHART = [['セイラン', 'セイラン', 'テツコン', 'テツコン', 'ウスハナ', 'ウスハナ'].freeze,
392
+ ['セイラン', 'セイラン', 'テツコン', 'ウスハナ', 'ウスハナ', 'フカガワネズミ'].freeze,
393
+ ['セイラン', 'テツコン', 'ウスハナ', 'ウスハナ', 'ミハナダ', 'フカガワネズミ'].freeze,
394
+ ['セイラン', 'テツコン', 'ミハナダ', 'ウスハナ', 'フカガワネズミ', 'フカガワネズミ'].freeze,
395
+ ['セイラン', 'ウスハナ', 'ミハナダ', 'ミハナダ', 'ミハナダ', '共通(FC)'].freeze,
396
+ ['テツコン', 'ウスハナ', 'ミハナダ', 'フカガワネズミ', '共通(FC)', 'ルリ'].freeze].freeze
397
+
398
+ FISHING_COMMON_CHART = [['トビウオ', 'トビウオ', 'トビウオ', 'オオガメ', 'ロブスター', 'オオサンショウウオ'].freeze,
399
+ ['トビウオ', 'トビウオ', 'エイ', 'オオガメ', 'クジラ', 'ロブスター'].freeze,
400
+ ['トビウオ', 'エイ', 'マグロ', 'マグロ', 'カジキ', 'イタチザメ'].freeze,
401
+ ['トビウオ', 'ミズダコ', 'クラゲ', 'マグロ', 'オオクラゲ', 'ハンマーヘッド・シャーク'].freeze,
402
+ ['トビウオ', 'エイ', 'オオガメ', 'オオガメ', 'イタチザメ', 'ミズダコ'].freeze,
403
+ ['トビウオ', 'クラゲ', 'ロブスター', 'ハンマーヘッド・シャーク', 'ミズダコ', 'ダイオウイカ'].freeze].freeze
404
+
405
+ FISHING_SALT_LAKE_CHART = [['シラユリ', 'シラユリ', 'シラユリ', 'ゲッパク', 'ゲッパク', 'ゲッパク'].freeze,
406
+ ['シラユリ', 'シラユリ', 'シラユリ', 'ゲッパク', 'スズ', 'ナマリ'].freeze,
407
+ ['シラユリ', 'ゲッパク', 'ゲッパク', 'スズ', 'ナマリ', 'ナマリ'].freeze,
408
+ ['シラユリ', 'シラユリ', 'ナマリ', 'ナマリ', 'ナマリ', 'ナマリ'].freeze,
409
+ ['ゲッパク', 'ゲッパク', 'スズ', 'スズ', 'ロイロ', 'ロイロ'].freeze,
410
+ ['ナマリ', 'スズ', 'スズ', 'スズ', 'ロイロ', 'クロツルバミ'].freeze].freeze
411
+
412
+ def use_fishing_chart(command)
413
+ case command
414
+ when 'FL' then use_6x6_chart(FISHING_LAKE_CHART, '釣り・湖表')
415
+ when 'FR' then use_6x6_chart(FISHING_RIVER_CHART, '釣り・河表')
416
+ when 'FW' then use_6x6_chart(FISHING_WHITE_CHART, '釣り・白雲表')
417
+ when 'FG' then use_6x6_chart(FISHING_GRAY_CHART, '釣り・灰雲表')
418
+ when 'FB' then use_6x6_chart(FISHING_BLACK_CHART, '釣り・黒雲表')
419
+ when 'FC' then use_6x6_chart(FISHING_COMMON_CHART, '釣り・共通表')
420
+ when 'FS' then use_6x6_chart(FISHING_SALT_LAKE_CHART, '釣り・塩湖表')
421
+ end
422
+ end
423
+
424
+ INEDIBLE_PLANT_CHART = [['シュイの花', 'ダデオの花', 'ロキの花', 'シェラの花', 'トトイト', 'ポロネイマ'].freeze,
425
+ ['シュイの花', 'ロキの花', 'アウディの花', 'イディウの花', 'トトイト', 'ポロネイマ'].freeze,
426
+ ['ダデオの花', 'アウディの花', 'イディウの花', 'マトイト', 'ポポトマ', 'ルタタ'].freeze,
427
+ ['シュイの花', 'ミカギの花', 'ロトイト', 'ロトイト', 'ツルイド', 'ルタタ'].freeze,
428
+ ['ミカギの花', 'ロトイト', 'ロトイト', 'ツルイド', 'ルタタ', '変異植物(MP)'].freeze,
429
+ ['トトイト', 'マトイト', 'ポポトマ', 'ツルイド', '変異植物(MP)', 'サボサボ'].freeze].freeze
430
+
431
+ INEDIBLE_PLANT2_CHART = [['マトラの花', 'マトラの花', '蜜蝋', 'ポルラの花', 'ウェスドの花', 'ポルラの花'].freeze,
432
+ ['マトラの花', 'ホイの花', 'マトラの花', 'ウェスドの花', '蜜蝋', 'ロロの花'].freeze,
433
+ ['ホイの花', 'ポルラの花', 'ウェスドの花', 'ホイの花', 'ポルラの花', 'ポルラの花'].freeze,
434
+ ['ポルラの花', 'ホイの花', 'ロロの花', 'ウェスドの花', 'ポルラの花', 'ドダの実'].freeze,
435
+ ['ポルラの花', 'ウェスドの花', 'ロロの花', 'ロロの花', 'ロロの花', 'ロロの花'].freeze,
436
+ ['ウェスドの花', 'ロロの花', 'ポルラの花', 'ロロの花', 'ドダの実', 'ロロの花'].freeze].freeze
437
+
438
+ def use_inedible_plant_chart(command)
439
+ match_data = command.match(/IP([VA]?)/)
440
+ chart_symbol = match_data[1] == '' ? 'V' : match_data[1]
441
+
442
+ case chart_symbol
443
+ when 'V' then use_6x6_chart(INEDIBLE_PLANT_CHART, '不食植物表(ヴィラシエル)')
444
+ when 'A' then use_6x6_chart(INEDIBLE_PLANT2_CHART, '不食植物表(アルメサール)')
445
+ end
446
+ end
447
+
448
+ EDIBLE_PLANT_CHARTS = [[['小麦', '小麦', 'さつまいも', 'ねぎ', '白菜', 'きゅうり'].freeze,
449
+ ['小麦', 'さつまいも', 'さといも', '白菜', '白菜', 'とうもろこし'].freeze,
450
+ ['さといも', 'さといも', 'ねぎ', '白菜', 'とうもろこし', '枝豆'].freeze,
451
+ ['シソ', 'ひらたけ', 'エリンギ', '枝豆', '枝豆', 'ラズベリー'].freeze,
452
+ ['シソ', 'ひらたけ', 'ひらたけ', 'エリンギ', 'ラズベリー', 'さといも'].freeze,
453
+ ['ナシ', 'ナシ', 'ナシ', 'ラズベリー', 'ラズベリー', 'さといも'].freeze].freeze,
454
+ [['米', '米', 'にんじん', 'じゃがいも', 'ふき', 'まいたけ'].freeze,
455
+ ['米', 'じゃがいも', 'じゃがいも', 'にら', 'ふき', 'きくらげ'].freeze,
456
+ ['冬瓜', 'しょうが', '冬瓜', 'ふき', 'ふき', 'きくらげ'].freeze,
457
+ ['しょうが', '冬瓜', 'ビワ', 'にら', 'まいたけ', 'まいたけ'].freeze,
458
+ ['ビワ', 'ビワ', 'もも', 'かぼちゃ', 'グリーンピース', 'まいたけ'].freeze,
459
+ ['ビワ', 'もも', 'もも', 'かぼちゃ', 'かぼちゃ', 'かぼちゃ'].freeze].freeze,
460
+ [['もち米', 'トマト', 'オクラ', 'とうがらし', '大根', 'グミ'].freeze,
461
+ ['もち米', 'オクラ', 'オクラ', '大根', '大根', 'とうがらし'].freeze,
462
+ ['しいたけ', 'マッシュルーム', 'オクラ', 'グミ', '玉ねぎ', '小松菜'].freeze,
463
+ ['ブロッコリー', 'しいたけ', 'トマト', '玉ねぎ', 'さやえんどう', '玉ねぎ'].freeze,
464
+ ['しいたけ', 'マッシュルーム', 'ブロッコリー', '小松菜', 'さやえんどう', '改良種(IS)'].freeze,
465
+ ['マッシュルーム', 'ブロッコリー', 'マッシュルーム', '小松菜', '改良種(IS)', 'グミ'].freeze].freeze,
466
+ [['大豆', '大豆', 'にんにく', 'そらまめ', 'しめじ', 'みかん'].freeze,
467
+ ['かぶ', '大豆', 'かぶ', 'キャベツ', 'そらまめ', 'みかん'].freeze,
468
+ ['にんにく', 'かぶ', 'にんにく', 'しめじ', 'クランベリー', 'ピーマン'].freeze,
469
+ ['キャベツ', 'キャベツ', 'ほうれん草', 'しめじ', 'レタス', 'ピーマン'].freeze,
470
+ ['ほうれん草', 'ほうれん草', 'クランベリー', 'レタス', 'ピーマン', '改良種(IS)'].freeze,
471
+ ['松茸', 'ほうれん草', '松茸', 'レタス', 'クランベリー', '改良種(IS)'].freeze].freeze,
472
+ [['小豆', 'れんこん', 'みつば', 'やまのいも', 'デコポン', 'イチゴ'].freeze,
473
+ ['れんこん', 'れんこん', '小豆', 'なめこ', 'かいわれ大根', 'なめこ'].freeze,
474
+ ['やまのいも', 'アスパラガス', 'なす', 'なめこ', 'やまのいも', 'デコポン'].freeze,
475
+ ['なす', 'やまのいも', 'みつば', 'えのきたけ', 'かいわれ大根', 'デコポン'].freeze,
476
+ ['アスパラガス', 'アスパラガス', 'やまのいも', 'みつば', 'なめこ', '改良種(IS)'].freeze,
477
+ ['なす', 'もやし', 'えのきたけ', 'えのきたけ', '改良種(IS)', 'イチゴ'].freeze].freeze].freeze
478
+
479
+ EDIBLE_PLANT2_CHARTS = [[['テンサイ', 'バノ', 'テンサイ', 'サトウモロ', 'サトウモロ', 'パンノミ'].freeze,
480
+ ['テンサイ', 'バノ', 'サトウモロ', 'バノ', 'ミソレグア', 'パンノミ'].freeze,
481
+ ['テンサイ', 'サトウモロ', 'バノ', 'ニクニク', 'パンノミ', 'メーズム'].freeze,
482
+ ['バノ', 'バノ', 'バノ', 'パンノミ', 'ミソレグア', 'メーズム'].freeze,
483
+ ['テンサイ', 'パンノミ', 'ニクニク', 'ニクニク', 'メーズム', 'ミソレグア'].freeze,
484
+ ['サトウモロ', 'ニクニク', 'メーズム', 'ミソレグア', 'メーズム', 'メーズム'].freeze].freeze,
485
+ [['アロアベリー', 'パンノミ', 'ミソレグア', 'サイングア', 'パンノミ', 'アロアベリー'].freeze,
486
+ ['パンノミ', 'サイングア', 'パンノミ', 'ミソレグア', 'アロアベリー', 'ミソレグア'].freeze,
487
+ ['パンノミ', 'アロアベリー', 'サイングア', 'パンノミ', 'パンノミ', 'トロアベリア'].freeze,
488
+ ['パンノミ', 'アロアベリー', 'パンノミ', 'ミソレグア', 'ミソレグア', 'トロアベリア'].freeze,
489
+ ['サイングア', 'パンノミ', 'トロアベリア', 'ミソレグア', 'アロアベリー', 'サイングア'].freeze,
490
+ ['ミソレグア', 'トロアベリア', 'サイングア', 'アロアベリー', 'トロアベリア', 'トロアベリア'].freeze].freeze].freeze
491
+
492
+ def use_villaciel_edible_plant_chart(chart_id, output)
493
+ output + use_6x6_chart(EDIBLE_PLANT_CHARTS[chart_id - 1], "可食植物表#{chart_id}(ヴィラシエル)")
494
+ end
495
+
496
+ def use_armesear_edible_plant_chart(chart_id, output)
497
+ output + use_6x6_chart(EDIBLE_PLANT2_CHARTS[chart_id - 1], "可食植物表#{chart_id}(アルメサール)")
498
+ end
499
+
500
+ def use_edible_plant_chart(command)
501
+ match_data = command.match(/EP([VA]?)(\d?)/)
502
+ chart_symbol = match_data[1] == '' ? 'V' : match_data[1]
503
+
504
+ case chart_symbol
505
+ when 'V'
506
+ case match_data[2]
507
+ when ''
508
+ roll_result = @randomizer.roll_once(D6)
509
+ return '(1D6) > [6] > 好きな表を選んでおっけー!' if roll_result == D6
510
+
511
+ use_villaciel_edible_plant_chart(roll_result, "(1D6) > [#{roll_result}] > ")
512
+ else
513
+ chart_id = match_data[2].to_i
514
+ return '' unless chart_id >= 1 && chart_id <= 5
515
+
516
+ use_villaciel_edible_plant_chart(chart_id, '')
517
+ end
518
+ when 'A'
519
+ case match_data[2]
520
+ when ''
521
+ roll_result = @randomizer.roll_once(D6)
522
+ use_armesear_edible_plant_chart(roll_result.even? ? 1 : 2, "(1D6) > [#{roll_result}] > ")
523
+ else
524
+ chart_id = match_data[2].to_i
525
+ return '' unless [1, 2].include?(chart_id)
526
+
527
+ use_armesear_edible_plant_chart(chart_id, '')
528
+ end
529
+ end
530
+ end
531
+
532
+ MUTANT_PLANT_CHART = [['ガドゴン', 'ガドゴン', 'レディダン', 'ボディア', 'ブタマル', 'ブタマル'].freeze,
533
+ ['レディダン', 'レディダン', 'ボディア', 'トロコッコ', 'ブタマル', 'ツァイド'].freeze,
534
+ ['ボディア', 'ボディア', 'マメノキ', 'ナッキュ', 'ツァイド', 'ボディア'].freeze,
535
+ ['ナッキュ', 'マメノキ', 'ナッキュ', 'ガドゴン', 'レディダン', 'レディダン'].freeze,
536
+ ['ポメラマ', 'ポメラマ', 'ナッキュ', 'ツァイド', 'ガドゴン', 'ボディア'].freeze,
537
+ ['ナッキュ', 'ツァイド', 'ツァイド', 'ツァイド', 'ボディア', 'グラディエゴ'].freeze].freeze
538
+
539
+ def use_mutant_plant_chart(_command)
540
+ use_6x6_chart(MUTANT_PLANT_CHART, '変異植物表')
541
+ end
542
+
543
+ IMPROVED_SPECIES_CHART = [['ワワ', 'ワワ', 'ブラックカロット', 'ビーズ', 'レモン', 'ブラッドオレンジ'].freeze,
544
+ ['ポポ', 'ポポ', 'グランツェ', 'オオカサゲ', 'ブラッドオレンジ', 'レモン'].freeze,
545
+ ['ヒットト', 'グランツェ', 'ブラックベリー', 'ピマット', 'ブラッドオレンジ', 'レモン'].freeze,
546
+ ['ブルーベリー', 'ヒットト', 'グランツェ', 'ブラッドオレンジ', 'ユズ', 'ブラックベリー'].freeze,
547
+ ['ビーズ', 'ピマット', 'オオカサゲ', 'ライム', 'ブルーベリー', 'ユズ'].freeze,
548
+ ['ビーズ', 'レッドキャベツ', 'ライム', 'オオカサゲ', 'ライム', 'リンゴ'].freeze].freeze
549
+
550
+ def use_improved_species_chart(_command)
551
+ use_6x6_chart(IMPROVED_SPECIES_CHART, '改良種表')
552
+ end
553
+ end
554
+ end
555
+ end