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,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Pendragon < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'Pendragon'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'ペンドラゴン'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'へんとらこん'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ クリティカル、成功、失敗、ファンブルの自動判定を行います。
18
+ INFO_MESSAGE_TEXT
19
+
20
+ # ゲーム別成功度判定(1d20)
21
+ def check_1D20(total, _dice_total, cmp_op, target)
22
+ return '' if target == '?'
23
+ return '' unless cmp_op == :<=
24
+
25
+ if total <= target
26
+ if (total >= (40 - target)) || (total == target)
27
+ " > クリティカル"
28
+ else
29
+ " > 成功"
30
+ end
31
+ elsif total == 20
32
+ " > ファンブル"
33
+ else
34
+ " > 失敗"
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class PhantasmAdventure < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'PhantasmAdventure'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'ファンタズム・アドベンチャー'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'ふあんたすむあとへんちやあ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ 成功、失敗、決定的成功、決定的失敗の表示とクリティカル・ファンブル値計算の実装。
18
+ INFO_MESSAGE_TEXT
19
+
20
+ def initialize(command)
21
+ super(command)
22
+ end
23
+
24
+ # ゲーム別成功度判定(1d20)
25
+ def check_1D20(total, _dice_total, cmp_op, diff)
26
+ return '' if diff == '?'
27
+ return '' unless cmp_op == :<=
28
+
29
+ # 技能値の修正を計算する
30
+ skill_mod = 0
31
+ if diff < 1
32
+ skill_mod = diff - 1
33
+ elsif diff > 20
34
+ skill_mod = diff - 20
35
+ end
36
+
37
+ fumble = 20 + skill_mod
38
+ fumble = 20 if fumble > 20
39
+ critical = 1 + skill_mod
40
+ dice_now = @randomizer.roll_once(20)
41
+
42
+ if (total >= fumble) || (total >= 20)
43
+ fum_num = dice_now - skill_mod
44
+ fum_num = 20 if fum_num > 20
45
+ fum_num = 1 if fum_num < 1
46
+
47
+ fum_str = dice_now.to_s
48
+ if skill_mod < 0
49
+ fum_str += "+#{skill_mod * -1}=#{fum_num}"
50
+ else
51
+ fum_str += "-#{skill_mod}=#{fum_num}"
52
+ end
53
+ return " > 致命的失敗(#{fum_str})"
54
+
55
+ elsif (total <= critical) || (total <= 1)
56
+ crit_num = dice_now + skill_mod
57
+ crit_num = 20 if crit_num > 20
58
+ crit_num = 1 if crit_num < 1
59
+
60
+ if skill_mod < 0
61
+ return " > 成功"
62
+ end
63
+
64
+ return " > 決定的成功(#{dice_now}+#{skill_mod}=#{crit_num})"
65
+ elsif total <= diff
66
+ return " > 成功"
67
+ else
68
+ return " > 失敗"
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,185 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Postman < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'Postman'
8
+
9
+ # ゲームシステム名
10
+ NAME = '壊れた世界のポストマン'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'こわれたせかいのほすとまん'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ◆判定:[n]PO[+-a][> or >= or @X]  []内省略可。
18
+
19
+ 達成値と判定の成否、クリティカル、ファンブルを結果表示します。
20
+ 「n」でダイス数を指定。省略時は2D。
21
+ 「+-a」で達成値への修正を指定。「+2+1-4」のような複数回指定可。
22
+ 「>X」「>=X」「@X」で難易度を指定可。
23
+ 「>X」は達成値>難易度、「>=X」「@X」は達成値>=難易度で判定します。
24
+
25
+ 【書式例】
26
+ 3PO+2-1 → 3Dで達成値修正+1の判定。達成値のみ表示。
27
+ PO@5+2 → 2Dで目標値7の判定。判定の成否と達成値を表示。
28
+ 4PO-2+1>7+2 → 4Dで達成値修正-1、目標値9(同値は失敗)の判定。
29
+
30
+
31
+ ◆天候チェック:WEA[n]  []内省略可。
32
+
33
+ 天候チェック表を参照します。
34
+ 「n」を指定すると、指定した結果を表示します。(【幸運点】使用時用)
35
+
36
+
37
+ ◆自由行動シチュエーション表:FRE
38
+ MESSAGETEXT
39
+
40
+ register_prefix([
41
+ 'WEA\d*',
42
+ '(\d+)?PO.*',
43
+ 'FRE'
44
+ ])
45
+
46
+ def initialize(command)
47
+ super(command)
48
+ @sort_add_dice = true # ダイスのソート有
49
+ end
50
+
51
+ def eval_game_system_specific_command(command)
52
+ text =
53
+ case command.upcase
54
+
55
+ when /(\d+)?PO(\d+)?(([+-]\d+)*)?((>|>=|@)(\d+)(([+-]\d+)*)?)?/i
56
+ diceCount = (Regexp.last_match(1) || 2).to_i
57
+ diceCount = 2 if diceCount < 2
58
+
59
+ modify = (Regexp.last_match(2) || 0).to_i
60
+ modifyAddString = (Regexp.last_match(3) || '')
61
+
62
+ type = (Regexp.last_match(6) || '')
63
+ target = (Regexp.last_match(7) || 0).to_i
64
+ targetAddString = (Regexp.last_match(8) || '')
65
+
66
+ modify_list = modifyAddString.scan(/[+-]\d+/)
67
+ modify_list.each { |i| modify += i.to_i }
68
+
69
+ if target != 0
70
+ target_list = targetAddString.scan(/[+-]\d+/)
71
+ target_list.each { |j| target += j.to_i }
72
+ end
73
+
74
+ checkRoll(diceCount, modify, type, target)
75
+
76
+ when /WEA(\d+)?/i
77
+ roc = (Regexp.last_match(1) || 0).to_i
78
+ get_weather_table(roc)
79
+
80
+ when 'FRE'
81
+ get_free_situation_table
82
+
83
+ end
84
+
85
+ return text
86
+ end
87
+
88
+ def checkRoll(diceCount, modify, type, target)
89
+ diceArray = @randomizer.roll_barabara(diceCount, 6).sort
90
+ dice = diceArray.sum()
91
+ diceText = diceArray.join(",")
92
+
93
+ dice2 = diceArray[-2] + diceArray[-1]
94
+ diceText2 = "#{diceArray[-2]},#{diceArray[-1]}"
95
+ criticalCount = diceArray.count(6)
96
+
97
+ if modify != 0
98
+ modifyText = ''
99
+ modifyText = "+" if modify > 0
100
+ modifyText += modify.to_s
101
+ end
102
+
103
+ result = dice2 + modify
104
+
105
+ if type != ''
106
+ resultText = " 【失敗】"
107
+ operatorText = ">"
108
+ if type == '>'
109
+ resultText = " 【成功】" if result > target
110
+ else
111
+ operatorText += "="
112
+ resultText = " 【成功】" if result >= target
113
+ end
114
+ end
115
+
116
+ if criticalCount >= 2
117
+ resultText = " 【成功】(クリティカル)"
118
+ elsif dice == diceCount
119
+ resultText = " 【失敗】(ファンブル)"
120
+ end
121
+
122
+ text = "#{diceCount}D6(#{diceText})#{modifyText} > #{dice2}(#{diceText2})#{modifyText} = 達成値:#{result}"
123
+ text += "#{operatorText}#{target} " if target > 0
124
+ text += resultText.to_s
125
+
126
+ return text
127
+ end
128
+
129
+ def get_weather_table(roc)
130
+ name = "天候チェック"
131
+ table = [
132
+ [2, '大雨と強風。探索判定の難易度に+4。'],
133
+ [3, '風が強い1日になりそう。探索判定の難易度に+2。'],
134
+ [4, '晴れ。特になし。'],
135
+ [5, '夜の間の雨でぬかるむ。探索判定の難易度に+2。'],
136
+ [6, 'それなりの雨足。探索判定の難易度に+2。'],
137
+ [7, '晴れ。特になし。'],
138
+ [8, '天気は大荒れ。探索判定の難易度に+4。'],
139
+ [9, '小雨が降る。探索判定の難易度に+1。'],
140
+ [10, 'それなりの雨足。探索判定の難易度に+2。'],
141
+ [11, '晴れ。特になし。'],
142
+ [12, '風が強い1日になりそう。探索判定の難易度に+2。']
143
+ ]
144
+
145
+ if roc == 0
146
+ dice_list = @randomizer.roll_barabara(2, 6)
147
+ dice = dice_list.sum()
148
+ diceText = dice_list.join(",")
149
+ else
150
+ roc = 2 if roc < 2
151
+ roc = 12 if roc > 12
152
+ dice = roc
153
+ diceText = "Choice:#{roc}"
154
+ end
155
+
156
+ tableText = get_table_by_number(dice, table)
157
+ text = "#{name}(#{diceText}) > #{dice}:#{tableText}"
158
+ return text
159
+ end
160
+
161
+ def get_free_situation_table()
162
+ name = "自由行動シチュエーション表"
163
+ table = [
164
+ [2, '何をするでもなく、霞がかったような夜空を見上げる。ふと隣に目を向ければ、彼/彼女が居た。彼/彼女は、こうなる前の夜空を知っているのだろうか。'],
165
+ [3, '夢を見た。大戦の最中、街が、人が、世界が焼けていく悪夢を。追い立てられるようにして目を覚ますと、彼/彼女が君を見ていた。 ……もしかして、自分はよほどうなされていたのだろうか。'],
166
+ [4, '周囲で見つけたガラクタを使って、ちょっとしたビックリ玩具を作ってみた。「彼/ 彼女」にコイツをけしかけたら、どんな反応をするだろうか?'],
167
+ [5, '使えそうなものがないか探していると、カタンと物音がして何かが落ちた。拾い上げてみたそれは、かつてここで生活していた誰かの名残(写真、家具、玩具等)だった。'],
168
+ [6, 'テントの中で夜を過ごしていると、ふと彼/彼女と話したくてたまらない気持ちになった。言ってしまえば、夜の静けさに寂しさを覚えてしまったのだ。'],
169
+ [7, 'ここまでの配達の記録をつけていたら、背後から視線を感じる……! もしや、彼/彼女に覗かれている……!?'],
170
+ [8, '周囲を探索していると、君一人では手の届かないところに金属製の箱か何かがあることに気づいた。彼/彼女に手伝ってもらえば、取れるだろうか……?'],
171
+ [9, '朝まではまだしばらくあるというのに、目が覚めてしまった。二度寝しようにも寝付けずに居ると、隣でもぞもぞと動く気配がする。彼/彼女も、どうやら同じらしい。'],
172
+ [10, '他愛のない話をするうちに、君は彼/彼女に問いかけていた。「何故、ポストマンになろうと思ったのか」 ……そういえば、君自身はどうだったろうか。'],
173
+ [11, '保存食にありつこうとしたその時、君は気づいた。一匹のネズミが、彼/彼女の荷物の中に潜り込もうとしている。彼/彼女は気づいていないが、このままでは食料が危ない!'],
174
+ [12, 'テントを設営し、落ち着いた頃にふと気づく。 ……身体が熱い。少し、だるさもあるような気もする。大したことはないと思うが、彼/彼女に相談しておいた方がいいだろうか。']
175
+ ]
176
+ dice_list = @randomizer.roll_barabara(2, 6)
177
+ dice = dice_list.sum()
178
+ diceText = dice_list.join(",")
179
+ tableText = get_table_by_number(dice, table)
180
+ text = "#{name}(#{diceText}) > #{dice}:#{tableText}"
181
+ return text
182
+ end
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,184 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/game_system/Cthulhu7th"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class PulpCthulhu < Cthulhu7th
8
+ # ゲームシステムの識別子
9
+ ID = 'PulpCthulhu'
10
+
11
+ # ゲームシステム名
12
+ NAME = 'パルプ・クトゥルフ'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = 'はるふくとうるふ'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
+ ※私家翻訳のため、用語・ルールの詳細については原本を参照願います。
20
+ ※コマンドは入力内容の前方一致で検出しています。
21
+ ・判定 CC(x)<=(目標値)
22
+  x:ボーナス・ペナルティダイス (2~-2)。省略可。
23
+  目標値が無くても1D100は表示される。
24
+  ファンブル/失敗/
25
+  成功/ハード成功/イクストリーム成功/クリティカル を自動判定。
26
+ 例)CC<=30 CC(2)<=50 CC(-1)<=75 CC-1<=50 CC1<=65 CC
27
+
28
+ ・組み合わせ判定 (CBR(x,y))
29
+  目標値 x と y で%ロールを行い、成否を判定。
30
+  例)CBR(50,20)
31
+
32
+ ・自動火器の射撃判定 FAR(w,x,y,z,d)
33
+  w:弾丸の数(1~100)、x:技能値(1~100)、y:故障ナンバー、
34
+  z:ボーナス・ペナルティダイス(-2~2)。省略可。
35
+  d:指定難易度で連射を終える(レギュラー:r,ハード:h,イクストリーム:e)。省略可。
36
+  命中数と貫通数、残弾数のみ算出。ダメージ算出はありません。
37
+ 例)FAR(25,70,98) FAR(50,80,98,-1) far(30,70,99,1,R)
38
+   far(25,88,96,2,h) FaR(40,77,100,,e)
39
+
40
+ ・各種表
41
+  【狂気関連】
42
+  ・狂気の発作(リアルタイム)(Bouts of Madness Real Time) BMR
43
+  ・狂気の発作(サマリー)(Bouts of Madness Summary) BMS
44
+  ・恐怖症(Sample Phobias)表 PH/マニア(Sample Manias)表 MA
45
+  ・狂気のタレント(Insane Talents)表 IT
46
+  【魔術関連】
47
+  ・プッシュ時のキャスティング・ロールの失敗(Failed Casting Effects)表 FCE
48
+ INFO_MESSAGE_TEXT
49
+
50
+ register_prefix(['CC\(\d+\)', 'CC.*', 'CBR\(\d+,\d+\)', 'FAR.*', 'BMR', 'BMS', 'FCE', 'PH', 'MA', 'IT'])
51
+
52
+ def eval_game_system_specific_command(command)
53
+ case command
54
+ when /^CC/i
55
+ return getCheckResult(command)
56
+ when /^CBR/i
57
+ return getCombineRoll(command)
58
+ when /^FAR/i
59
+ return getFullAutoResult(command)
60
+ when /^BMR/i # 狂気の発作(リアルタイム)
61
+ return roll_bmr_table()
62
+ when /^BMS/i # 狂気の発作(サマリー)
63
+ return roll_bms_table()
64
+ when /^FCE/i # キャスティング・ロールのプッシュに失敗した場合
65
+ return roll_1d20_table("キャスティング・ロール失敗表", FAILED_CASTING_EFFECTS_TABLE)
66
+ when /^PH/i # 恐怖症表
67
+ return roll_1d100_table("恐怖症表", PHOBIAS_TABLE)
68
+ when /^MA/i # マニア表
69
+ return roll_1d100_table("マニア表", MANIAS_TABLE)
70
+ when /^IT/i # 狂気のタレント表
71
+ return roll_1d20_table("狂気のタレント表", INSANE_TALENTS_TABLE)
72
+ else
73
+ return nil
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def roll_1d20_table(table_name, table)
80
+ total_n = @randomizer.roll_once(20)
81
+ index = total_n - 1
82
+
83
+ text = table[index]
84
+
85
+ return "#{table_name}(#{total_n}) > #{text}"
86
+ end
87
+
88
+ # 表一式
89
+ # 即時の恐怖症表
90
+ def roll_bmr_table()
91
+ total_n = @randomizer.roll_once(10)
92
+ text = MADNESS_REAL_TIME_TABLE[total_n - 1]
93
+
94
+ time_n = @randomizer.roll_once(10)
95
+
96
+ return "狂気の発作(リアルタイム)(#{total_n}) > #{text}(1D10>#{time_n}ラウンド)"
97
+ end
98
+
99
+ MADNESS_REAL_TIME_TABLE = [
100
+ '健忘症:ヒーローは自分自身がヒーローである考えをやめ、1D10ラウンドの間パルプのタレントを失う。',
101
+ '狂った計画:1D10ラウンドの間ヒーローは不合理的または非効率的な計画を考えつく。その計画は敵を有利にするものかもしれないし、ヒーローの仲間に対して危険を高めるものかもしれない。',
102
+ '怒り:頭に血が上り1D10ラウンドの間、周囲の人間、味方、敵問わず暴力と破壊を振りまく。',
103
+ 'おごり高ぶる:1D10ラウンドの間ヒーローは威張り散らし、自らの計画を大声で叫ぶように強制される。「私と私の盟友達がこの巣穴に潜むグール達を一掃する!! だがしかし、その前に一言言わせてもらいたい」',
104
+ 'リラックス:ヒーローが目の前の驚異が気にするほどの物でないと思い1D10ラウンドの間その場に座り込む。彼は葉巻を吸ったり、スキットルで乾杯するのに時間を使うかもしれない。',
105
+ 'パニックになって逃亡する:1台のみの車に乗り、例え仲間を置き去りにしていくことになっても、ヒーローは手段さえあれば可能な限り遠くへ行こうとします。1D10ラウンドの間、逃げ続ける。',
106
+ '注目を集めたがる:ヒーローは1D10ラウンドの間注目を集めようとする。恐らく無謀な事を行うことだろう。',
107
+ 'アルター・エゴ(もう一人の僕!):ヒーローは完全な変化を受け、1D10ラウンドの間、完全に別の人格に入れ替わる。入れ替わった人格はヒーローの性格と真逆のものだ。そのヒーローが親切であれば、もう1人の自分は不親切だ。一方が利己的であれば、もう1人の自分は利他的となる。もし特定のヒーローが永久的な狂気に陥った場合、キーパーは原因である怪物の自我を生み出すことに使用する事もできる。',
108
+ '恐怖症:ヒーローは新しい恐怖症に陥る。恐怖症表(PHコマンド)をロールするか、キーパーが恐怖症を1つ選ぶ。恐怖症の原因は存在しなくとも、その探索者は次の1D10ラウンドの間、それがそこにあると思い込む。',
109
+ 'マニア:ヒーローは新しいマニアに陥る。マニア表(MAコマンド)をロールするか、キーパーがマニアを1つ選ぶ。その探索者は次の1D10ラウンドの間、自分の新しいマニアに没頭しようとする。',
110
+ ].freeze
111
+
112
+ # 略式の恐怖表
113
+ def roll_bms_table()
114
+ total_n = @randomizer.roll_once(10)
115
+ text = MADNESS_SUMMARY_TABLE[total_n - 1]
116
+
117
+ time_n = @randomizer.roll_once(10)
118
+
119
+ return "狂気の発作(サマリー)(#{total_n}) > #{text}(1D10>#{time_n}時間)"
120
+ end
121
+
122
+ MADNESS_SUMMARY_TABLE = [
123
+ '健忘症:ヒーローは自分が誰であるかの記憶を失い、パルプのタレントを失い、自分のいる場所に大きな違和感を覚える。彼らの記憶は時間の経過と共にゆっくりと戻る。彼らのパルプのタレントは危機的な状況でのみ戻る。この場合、危機的状況とは誰かの命が晒されているなどの場合と定義する。誰かの命が脅かされるとヒーローは〈幸運〉ロールをう。成功すればタレントは戻る。失敗すれば1D10ラウンド後にもう一度行うことができる。',
124
+ '盗難:1D10時間後にヒーローは意識を取り戻す。彼は無傷だ。彼が宝物を持っている場合それが盗まれたかどうかを知るために〈幸運〉ロールを行う。価値のあるものは全て自動的に失われる。',
125
+ '暴行:ヒーローは1D10時間後に目覚め、体中が痣や傷だらけであることに気づく。耐久力が半分になる。物は奪われていない。どの様な被害にあったかは、キーパーに委ねられる。',
126
+ '暴力:暴力と破壊衝動をヒーローは爆発させる。1D10時間後にヒーローの意識が戻るとき、彼らが行った行動を覚えているかもしれない。ヒーローが誰に対して暴力を振るったか、誰を殺したかはキーパーに委ねられる。',
127
+ 'イデオロギー/信念:ヒーローのイデオロギーと信念、背景を証明しようとする。ヒーローは極端に狂い、実証的なやり方でこれらの1つを証明しようとする。一般的にこのような結果はヒーローが人類を傷つけ、正義という名の誇大妄想を抱く事につながる。',
128
+ '重要な人々:ヒーローの背景情報を見て関係を持つ重要な人々を参照する。(1D10時間以上)ヒーローはその人物に近づき、その人の為に最善を尽くす。',
129
+ '収容:ヒーローは高セキュリティの精神病院または警察の監獄で目を覚ます。彼らはそこで自分が犯した出来事をゆっくりと思い出すかもしれない。',
130
+ 'パニック:ヒーローが目覚めると元いた場所から遠く離れた場所にいることに気づく。彼らはエンパイア・ステート・ビルの屋上、ホワイト・ハウスの中、または軍事本部の中心にいるかもしれない。それは注目を集める事になるだろう、何故彼らがその場にいるのかは彼らにもわからない。',
131
+ '恐怖症:ヒーロー新たな恐怖症を獲得する。恐怖症表(PHコマンド)をロールするか、キーパーがどれか1つ選ぶ。探索者は1D10時間後に意識を取り戻し、この新たな恐怖症の対象を避けるためにあらゆる努力をしている。',
132
+ 'マニア:ヒーローは新たなマニアを獲得する。マニア表(MAコマンド)をロールするか、キーパーがどれか1つ選ぶ。この狂気の発作の間、探索者はこの新たなマニアに完全に溺れているだろう。これがほかの人々に気づかれるかどうかは、キーパーとプレイヤーに委ねられる。',
133
+ ].freeze
134
+
135
+ # キャスティング・ロールのプッシュに失敗した場合
136
+ FAILED_CASTING_EFFECTS_TABLE = [
137
+ '叙事詩的な雷と稲光。',
138
+ '1D6ラウンドの一時的な盲目(成功難易度を変化させる/ペナルティ・ダイスを1つ加える)。',
139
+ 'どこかから強い風が吹きつける(幸運ロールに失敗すると紙や本などの軽い持ち物を失う)。',
140
+ '壁や床や窓などから輝く緑の粘体が発生する(0/1D3の正気度喪失)',
141
+ 'キーパーが選んだ奇妙な幻覚に襲われる(見たものに適した正気度喪失)',
142
+ 'その付近の小動物たちが爆発する(0/1D3の正気度喪失)。',
143
+ '呪文の使い手の髪が真っ白になる。',
144
+ '大きな姿のない悲鳴が聞こえる(0/1の正気度喪失)',
145
+ '1D4ラウンドの間、目から血を流す(成功難易度を変化させる/ペナルティ・ダイスを1つ加える)。',
146
+ '硫黄の臭いがする。',
147
+ '大地が震え、壁に亀裂が入って崩れる。',
148
+ '呪文の使い手の手がしおれて、燃え(どちらの手なのか幸運ロールで決定する)、1D2のHPを失う。(キーパーの裁量で、手が一時的に燃えるか(手を使用する必要がある技能ロールとDEXロールのすべてにペナルティ・ダイスが加わる)、または永久にしおれて黒くなる(DEXと手を使用する必要がある技能のすべてを20ポイント減少する。))',
149
+ '1D6ラウンドの間、血が空から降る。',
150
+ '呪文の使い手は異常に年をとる(+2D10歳と能力値の修正)。',
151
+ '呪文の使い手の皮膚が永久的に半透明になる(その呪文の使い手を見た者は1/1D4の正気度喪失)。',
152
+ '呪文の使い手は1D10のPOWを獲得するが、1D10の正気度も失う。',
153
+ 'クトゥルフ神話の怪物が偶然召喚される。',
154
+ 'キーパーはランダムに2つの呪文を選び、両方が発動する(呪文の使い手を中心に)。',
155
+ '呪文の使い手と近くの全員が、別の場所に吸い込まれる(キーパーがどこかは決定する)。',
156
+ 'クトゥルフ神話の神格が偶然招来される。',
157
+ ].freeze
158
+
159
+ # 狂気のタレント表
160
+ INSANE_TALENTS_TABLE = [
161
+ '狂気的筋力:「私は無尽蔵の内なる力の蓄えを引き出す!」1つのSTRロールにボーナス・ダイスを1つ得る。ロールが失敗した場合、何かがうまくいかない。キーパーは、ヒーローが負傷した(1D3+ヒーローのDBのダメージを筋断裂等により受ける)か、働きかけたものが壊れるかを選ぶ。',
162
+ '狂気的敏捷性:「私の手は目で見えるよりも素早く動く!」1つのDEXロールにボーナス・ダイスを1つ得る。ロールに失敗した場合、何かがうまくいかない。キーパーは、ヒーローが負傷した(1D4のダメージを受ける)か、彼らが働きかけていたものを壊してしまう。',
163
+ '狂気的精神力:「私を流れるパワーを感じることができる!」1つのPOWロールにボーナス・ダイスを1つ得る。ロールに失敗した倍、何かがうまくいかない。キーパーは、ヒーローが意識を失うか、達成しようとしていた効果が、意図していた以上にかなり危険になる。',
164
+ '狂気的体力:「歯軋りをしても痛みを感じない!」かなりのダメージを受けたときに、ヒーローはCONロールをすることを選ぶかもしれない。成功すれば、苦痛に耐え、ダメージを半減させる。ロールに失敗した場合は、ロールしたダメージを受け、地面へと倒れ、1D3ラウンド無能力化される。',
165
+ '狂気的外見:「くそ、私がかわい子ちゃんに!」ヒーローは、どういうわけかとても違って見える。これは純粋に表情と姿勢に現れるか、あるいは彼らの服や髪が何か根本的に時間をかけて変わる(服が魔法のように変わるのではなく、彼らが自分で変える)。APPや魅惑や言いくるめなどの彼らの外見によって影響を受けるかもしれないロールにボーナス・ダイスを1つ得る。この効果は短命だが、1つのシーンや会議などの一定の時間内の全ての交流に適応される。『改善された』外見のためにこのボーナス・ダイスを使用し、ロールに失敗した場合、彼らは社会的な不名誉や悪い結果に苦しめられることになる。',
166
+ '狂気的回想力:「私は全てを完全に覚えている!」ヒーローがこれまでに聞いた事実と記憶をすぐに手に入れられる。顔、数字、細部の情報が、情報の洪水の中で彼らの精神に押し寄せてくる。ヒーローが一度聞いたあるいは見たことのありそうな情報を思い出そうとする時の、EDUか知識か技能ロール1つにボーナス・ダイスを1つ得る。ロールに失敗した場合、情報の洪水は多すぎた!1正気度ポイントを失い、1つの狂気の発作に苦しむ。ヒーローがまだ狂気でないのであれば、彼らは今や一時的な狂人となる。',
167
+ '狂気的スピード:「私を見ろ、私は弾丸よりも早いぞ!」1つのチェイスに入った時に、ヒーローは移動率を決めるためのCONロールにボーナス・ダイスを1つ得る。ロールが成功すれば、1移動率が上がる。ロールが極限の成功をした場合には、2上がる。ロールが失敗した場合は、彼らは何かをしくじって、少なくとも1D3回の行動を失う。',
168
+ '狂気的運転手:「今や私を止められるものなど誰もいない!」あるチェイスにおけるヒーローの全ての運転ロールにボーナス・ダイスを1つ得る。運転ロールが失敗した場合、彼らはどういうわけか(キーパーの裁量で)車両のコントロールを失う。',
169
+ '狂気的言語:「いやはや、スワヒリ語の勉強をこれまでしたことはないのですが、これは難しいのでしょうかね?」ヒーローは短期間、全ての現代の言語(あるいは古風なある言語、またはあるクトゥルフ神話の言語)を一時的に理解する。この効果は魔道書を最初に読んだり、会話を行ったり、スピーチを聞けるくらいに十分な長さがある。事実上の技能としては75%だ。新たな言語の使用に技能ロールが必要な場合、その失敗は、ヒーローが1D6日間の間母国語を忘れ、その時に使用された新たな言語が代わりに母国語になるということを意味する。',
170
+ '狂気的精度:「私には当たる気しかしないよ!」ヒーローは彼らの銃が空になるまで、全ての火器ロールにボーナス・ダイスを1つ得る。彼らの射撃がターゲットの1つに当たらないか、弾薬がなくなるまで、ボーナス・ダイスを使い続けることができる。その当たらなかった弾丸は当たって欲しくないものに当たる(味方の1人かすごく価値のある何かに、極限の成功(貫通)をしたかのようにダメージを与える)。',
171
+ '狂気的脅し:「お前、俺が愉快なんだと思うかい?どこが愉快なんだ?」ヒーローは威圧ロールにボーナスを1つ得る。ロールに失敗した場合、彼らは短期間彼らの行動を制御できなくなる。キーパーが何が起こるか(彼らが暴力的に激怒する(会話している人にダメージを与える可能性がある)か、見くびられ恥を受けるか)を決める。',
172
+ '狂気的回避:「蝶のように舞う!」ヒーローは回避ロールに失敗するまで、現在の戦闘シーンにおける全ての回避ロールにボーナス・ダイスを1つ得る。この失敗は、攻撃に自ら突っ込んでいくことを示しており、その場合、攻撃が極限の成功を収めたかのようにダメージを受ける。',
173
+ '狂気的方向感覚:「ついて来て、こっちがそうだよ!」ヒーローのプレイヤーはキーパーに彼らがどこに行きたいのか、あるいは何に向かいたいのかを伝える。キーパーはこれが達成されるであろう方向を示す。ヒーローは幸運ロールをし、ロールに失敗した場合は、彼らは何かしらの種類の罠や危険な遭遇へと直進していく。',
174
+ '狂気的理解:「ああ、今それが分かった!」ヒーローのプレイヤーはプロットに関する質問をすることができる。「なぜ敵が~をしているの?」、「敵は~によって達成しようとしていることは何です?」、「我々が敵の計画を妨害することができる最良の行動は何です?」、「敵の最大の弱点は何です?」などだ。質問はかなり具体的でなければならず、キーパーは正直に答えるべきである。このタレントは一度しか使用できず、使用すれば失われる。',
175
+ '狂気的視界:「光?誰が必要なんだい?」ヒーローは1つの目星ロールにボーナス・ダイスを1つ得る。完全な暗闇の中でさえも、彼らは夕暮れのようにロールすることができる。ロールに失敗した場合、キーパーは、目が敏感になりすぎて痛みが生じる(1D10ラウンドの間事実上に盲目になる)、またはこれから1時間妄想に悩ませられることになるかを決定する。',
176
+ '狂気的聴覚:「みんな静かにして、何かカチカチ音がしない?」ヒーローは、1つの聞き耳ロールにボーナス・ダイスを1つ得る。周囲の騒音や他の音によらずに、彼らはその中で最も静かな音でさえも拾うことができる。キーパーは、何らかの突発的なノイズが1D10分間彼らを聴覚障害にするか、またはこれから1時間聴覚的な妄想にとらわれるかを決定する。',
177
+ '狂気的隠密:「私のこと見えてないんだよね?」ヒーローは1つのステルスロールにボーナス・ダイスを1つ得る。彼らは猫のような優雅さで移動し、丸見えのような場所にさえ隠れようとするかもしれない。ロールが失敗したのであれば、彼らは誤って何かを壊したり、大きな騒ぎを引き起こす。',
178
+ '狂気的獰猛さ:「お前を粉みじんに叩き切ってみせるぜ!」ヒーローは全ての近接攻撃のダメージロールを2回行い、最良の結果を得る。欠点としては、いったん命中すると彼らは止められないことだ!彼らは最後の一撃を与えるまで、攻撃し続ける。これを止めるための方法は2つしかない。彼らが意識不明になるか、誰かが困難難易度の言いくるめか、魅惑か、威圧ロールを彼らに成功させた場合がそうだ(1戦闘ラウンドで、1人の人物のみがこれらの状態のヒーローの1人に試みることができる)。',
179
+ '狂気的技能増強:「あんたは私が狂ってると思うのか?だがあんたに教えることができるぞ!」狂気の副作用として、ヒーローはクトゥルフ神話のいくつかの側面を伴う、彼らの技能の1つ(プレイヤーが選び、キーパーが許可を与えたもの)を強化することができる。これはその技能で達成できることの範囲に影響する。ハーバート・ウェストとクロフォード・ティリンギャーストの両方が、これがどのようにその人物に影響を与えるかについての事前研究の良い候補者となる。',
180
+ '狂気的技能増強:「あんたは私が狂ってると思うのか?だがあんたに教えることができるぞ!」狂気の副作用として、ヒーローはクトゥルフ神話のいくつかの側面を伴う、彼らの技能の1つ(プレイヤーが選び、キーパーが許可を与えたもの)を強化することができる。これはその技能で達成できることの範囲に影響する。ハーバート・ウェストとクロフォード・ティリンギャーストの両方が、これがどのようにその人物に影響を与えるかについての事前研究の良い候補者となる。',
181
+ ].freeze
182
+ end
183
+ end
184
+ end