bcdice 3.0.0.pre.alpha.1 → 3.0.0.pre.alpha.2

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 (255) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +1 -1
  3. data/.rubocop.yml +12 -0
  4. data/.rubocop_todo.yml +1 -0
  5. data/CHANGELOG.md +34 -0
  6. data/Gemfile +6 -3
  7. data/Rakefile +52 -18
  8. data/bcdice.gemspec +2 -0
  9. data/i18n/Amadeus/ja_jp.yml +386 -0
  10. data/i18n/Amadeus/ko_kr.yml +148 -0
  11. data/i18n/Cthulhu/ja_jp.yml +11 -0
  12. data/i18n/Cthulhu/ko_kr.yml +11 -0
  13. data/i18n/Cthulhu/zh_hant.yml +11 -0
  14. data/i18n/DetatokoSaga/ja_jp.yml +74 -0
  15. data/i18n/DetatokoSaga/ko_kr.yml +74 -0
  16. data/i18n/DoubleCross/ja_jp.yml +53 -0
  17. data/i18n/DoubleCross/ko_kr.yml +53 -0
  18. data/i18n/Dracurouge/ja_jp.yml +1374 -0
  19. data/i18n/Dracurouge/ko_kr.yml +295 -0
  20. data/i18n/Fiasco/ja_jp.yml +10 -0
  21. data/i18n/Fiasco/ko_kr.yml +10 -0
  22. data/i18n/FutariSousa/ja_jp.yml +720 -0
  23. data/i18n/FutariSousa/ko_kr.yml +746 -0
  24. data/i18n/Insane/ja_jp.yml +454 -0
  25. data/i18n/Insane/ko_kr.yml +502 -0
  26. data/i18n/Kamigakari/ja_jp.yml +276 -0
  27. data/i18n/Kamigakari/ko_kr.yml +204 -0
  28. data/i18n/KillDeathBusiness/ja_jp.yml +1092 -0
  29. data/i18n/KillDeathBusiness/ko_kr.yml +1062 -0
  30. data/i18n/LogHorizon/ja_jp.yml +3082 -0
  31. data/i18n/LogHorizon/ko_kr.yml +923 -0
  32. data/i18n/MagicaLogia/ja_jp.yml +564 -0
  33. data/i18n/MonotoneMuseum/ja_jp.yml +525 -0
  34. data/i18n/MonotoneMuseum/ko_kr.yml +89 -0
  35. data/i18n/Nechronica/ja_jp.yml +57 -0
  36. data/i18n/Nechronica/ko_kr.yml +14 -0
  37. data/i18n/StratoShout/ja_jp.yml +160 -0
  38. data/i18n/StratoShout/ko_kr.yml +160 -0
  39. data/i18n/ja_jp.yml +5 -0
  40. data/i18n/ko_kr.yml +7 -0
  41. data/i18n/zh_hant.yml +3 -0
  42. data/lib/bcdice/arithmetic/node.rb +154 -0
  43. data/lib/bcdice/base.rb +87 -101
  44. data/lib/bcdice/common_command.rb +2 -0
  45. data/lib/bcdice/common_command/add_dice.rb +5 -41
  46. data/lib/bcdice/common_command/add_dice/node.rb +92 -16
  47. data/lib/bcdice/common_command/add_dice/parser.rb +374 -274
  48. data/lib/bcdice/common_command/add_dice/parser.y +153 -0
  49. data/lib/bcdice/common_command/add_dice/randomizer.rb +25 -33
  50. data/lib/bcdice/common_command/barabara_dice.rb +6 -47
  51. data/lib/bcdice/common_command/barabara_dice/node.rb +84 -0
  52. data/lib/bcdice/common_command/barabara_dice/parser.rb +336 -0
  53. data/lib/bcdice/common_command/barabara_dice/parser.y +107 -0
  54. data/lib/bcdice/common_command/calc.rb +7 -30
  55. data/lib/bcdice/common_command/calc/node.rb +30 -0
  56. data/lib/bcdice/common_command/calc/parser.rb +271 -0
  57. data/lib/bcdice/common_command/calc/parser.y +79 -0
  58. data/lib/bcdice/common_command/choice.rb +137 -19
  59. data/lib/bcdice/common_command/d66_dice.rb +48 -34
  60. data/lib/bcdice/common_command/lexer.rb +46 -0
  61. data/lib/bcdice/common_command/repeat.rb +102 -0
  62. data/lib/bcdice/common_command/reroll_dice.rb +8 -158
  63. data/lib/bcdice/common_command/reroll_dice/node.rb +198 -0
  64. data/lib/bcdice/common_command/reroll_dice/parser.rb +421 -0
  65. data/lib/bcdice/common_command/reroll_dice/parser.y +158 -0
  66. data/lib/bcdice/common_command/upper_dice.rb +10 -129
  67. data/lib/bcdice/common_command/upper_dice/node.rb +181 -0
  68. data/lib/bcdice/common_command/upper_dice/parser.rb +412 -0
  69. data/lib/bcdice/common_command/upper_dice/parser.y +143 -0
  70. data/lib/bcdice/common_command/version.rb +9 -17
  71. data/lib/bcdice/deprecated/checker.rb +78 -0
  72. data/lib/bcdice/dice_table/d66_grid_table.rb +8 -0
  73. data/lib/bcdice/dice_table/d66_table.rb +10 -0
  74. data/lib/bcdice/dice_table/sai_fic_skill_table.rb +75 -17
  75. data/lib/bcdice/dice_table/sai_fic_skill_table/category.rb +25 -0
  76. data/lib/bcdice/dice_table/sai_fic_skill_table/skill.rb +23 -0
  77. data/lib/bcdice/dice_table/table.rb +8 -0
  78. data/lib/bcdice/game_system.rb +7 -1
  79. data/lib/bcdice/game_system/AFF2e.rb +1 -1
  80. data/lib/bcdice/game_system/AceKillerGene.rb +2 -2
  81. data/lib/bcdice/game_system/Airgetlamh.rb +3 -3
  82. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  83. data/lib/bcdice/game_system/Alshard.rb +1 -1
  84. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  85. data/lib/bcdice/game_system/Amadeus.rb +46 -507
  86. data/lib/bcdice/game_system/Amadeus_Korean.rb +12 -456
  87. data/lib/bcdice/game_system/AnimaAnimus.rb +1 -1
  88. data/lib/bcdice/game_system/Arianrhod.rb +0 -1
  89. data/lib/bcdice/game_system/ArsMagica.rb +1 -1
  90. data/lib/bcdice/game_system/Avandner.rb +1 -1
  91. data/lib/bcdice/game_system/BBN.rb +1 -1
  92. data/lib/bcdice/game_system/BadLife.rb +1 -1
  93. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  94. data/lib/bcdice/game_system/BeastBindTrinity.rb +1 -2
  95. data/lib/bcdice/game_system/BeginningIdol.rb +2 -3
  96. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +2 -3
  97. data/lib/bcdice/game_system/BladeOfArcana.rb +2 -2
  98. data/lib/bcdice/game_system/BlindMythos.rb +1 -1
  99. data/lib/bcdice/game_system/BloodCrusade.rb +0 -1
  100. data/lib/bcdice/game_system/BloodMoon.rb +0 -1
  101. data/lib/bcdice/game_system/CardRanker.rb +1 -2
  102. data/lib/bcdice/game_system/ChaosFlare.rb +1 -1
  103. data/lib/bcdice/game_system/Chill.rb +1 -1
  104. data/lib/bcdice/game_system/CodeLayerd.rb +1 -1
  105. data/lib/bcdice/game_system/ColossalHunter.rb +1 -2
  106. data/lib/bcdice/game_system/Comes.rb +50 -0
  107. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  108. data/lib/bcdice/game_system/Cthulhu.rb +94 -97
  109. data/lib/bcdice/game_system/Cthulhu7th.rb +108 -67
  110. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  111. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  112. data/lib/bcdice/game_system/CthulhuTech.rb +8 -14
  113. data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +7 -190
  114. data/lib/bcdice/game_system/Cthulhu_Korean.rb +5 -186
  115. data/lib/bcdice/game_system/DarkBlaze.rb +9 -5
  116. data/lib/bcdice/game_system/DarkDaysDrive.rb +17 -15
  117. data/lib/bcdice/game_system/DarkSouls.rb +1 -1
  118. data/lib/bcdice/game_system/DeadlineHeroes.rb +2 -2
  119. data/lib/bcdice/game_system/DemonParasite.rb +1 -2
  120. data/lib/bcdice/game_system/DetatokoSaga.rb +48 -149
  121. data/lib/bcdice/game_system/DetatokoSaga_Korean.rb +6 -274
  122. data/lib/bcdice/game_system/DiceOfTheDead.rb +9 -6
  123. data/lib/bcdice/game_system/DoubleCross.rb +102 -81
  124. data/lib/bcdice/game_system/DoubleCross_Korean.rb +13 -330
  125. data/lib/bcdice/game_system/Dracurouge.rb +376 -1678
  126. data/lib/bcdice/game_system/Dracurouge_Korean.rb +16 -271
  127. data/lib/bcdice/game_system/EarthDawn.rb +1 -1
  128. data/lib/bcdice/game_system/EarthDawn3.rb +1 -1
  129. data/lib/bcdice/game_system/EarthDawn4.rb +1 -1
  130. data/lib/bcdice/game_system/Elysion.rb +3 -4
  131. data/lib/bcdice/game_system/EmbryoMachine.rb +1 -1
  132. data/lib/bcdice/game_system/Emoklore.rb +131 -0
  133. data/lib/bcdice/game_system/EndBreaker.rb +1 -2
  134. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +1 -1
  135. data/lib/bcdice/game_system/Fiasco.rb +87 -70
  136. data/lib/bcdice/game_system/Fiasco_Korean.rb +7 -95
  137. data/lib/bcdice/game_system/FilledWith.rb +462 -566
  138. data/lib/bcdice/game_system/FullMetalPanic.rb +1 -1
  139. data/lib/bcdice/game_system/FutariSousa.rb +103 -938
  140. data/lib/bcdice/game_system/FutariSousa_Korean.rb +7 -948
  141. data/lib/bcdice/game_system/{Gurps.rb → GURPS.rb} +184 -217
  142. data/lib/bcdice/game_system/Garako.rb +131 -39
  143. data/lib/bcdice/game_system/GardenOrder.rb +2 -2
  144. data/lib/bcdice/game_system/GehennaAn.rb +1 -1
  145. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  146. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  147. data/lib/bcdice/game_system/GoldenSkyStories.rb +1 -1
  148. data/lib/bcdice/game_system/Gorilla.rb +1 -1
  149. data/lib/bcdice/game_system/GranCrest.rb +2 -3
  150. data/lib/bcdice/game_system/GundogRevised.rb +1 -1
  151. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  152. data/lib/bcdice/game_system/GurpsFW.rb +2 -3
  153. data/lib/bcdice/game_system/HarnMaster.rb +2 -2
  154. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -2
  155. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  156. data/lib/bcdice/game_system/HuntersMoon.rb +1 -2
  157. data/lib/bcdice/game_system/Illusio.rb +2 -2
  158. data/lib/bcdice/game_system/Insane.rb +90 -717
  159. data/lib/bcdice/game_system/Insane_Korean.rb +7 -719
  160. data/lib/bcdice/game_system/Kamigakari.rb +47 -242
  161. data/lib/bcdice/game_system/Kamigakari_Korean.rb +6 -394
  162. data/lib/bcdice/game_system/KanColle.rb +3 -3
  163. data/lib/bcdice/game_system/KemonoNoMori.rb +1 -1
  164. data/lib/bcdice/game_system/KillDeathBusiness.rb +162 -1144
  165. data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +6 -1459
  166. data/lib/bcdice/game_system/KurayamiCrying.rb +1 -1
  167. data/lib/bcdice/game_system/LiveraDoll.rb +2 -2
  168. data/lib/bcdice/game_system/LogHorizon.rb +350 -3379
  169. data/lib/bcdice/game_system/LogHorizon_Korean.rb +55 -1357
  170. data/lib/bcdice/game_system/LostRecord.rb +0 -1
  171. data/lib/bcdice/game_system/LostRoyal.rb +1 -2
  172. data/lib/bcdice/game_system/MagicaLogia.rb +158 -1044
  173. data/lib/bcdice/game_system/MeikyuDays.rb +1 -2
  174. data/lib/bcdice/game_system/MeikyuKingdom.rb +4 -4
  175. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +4 -5
  176. data/lib/bcdice/game_system/MetalHead.rb +1 -1
  177. data/lib/bcdice/game_system/MetalHeadExtream.rb +2 -2
  178. data/lib/bcdice/game_system/MetallicGuardian.rb +1 -1
  179. data/lib/bcdice/game_system/MonotoneMuseum.rb +38 -239
  180. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +10 -270
  181. data/lib/bcdice/game_system/NSSQ.rb +159 -0
  182. data/lib/bcdice/game_system/Nechronica.rb +34 -73
  183. data/lib/bcdice/game_system/Nechronica_Korean.rb +11 -128
  184. data/lib/bcdice/game_system/NeverCloud.rb +1 -1
  185. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  186. data/lib/bcdice/game_system/NightWizard3rd.rb +1 -1
  187. data/lib/bcdice/game_system/NinjaSlayer.rb +12 -11
  188. data/lib/bcdice/game_system/NjslyrBattle.rb +1 -1
  189. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -2
  190. data/lib/bcdice/game_system/OracleEngine.rb +1 -1
  191. data/lib/bcdice/game_system/OrgaRain.rb +2 -2
  192. data/lib/bcdice/game_system/Paradiso.rb +1 -1
  193. data/lib/bcdice/game_system/Paranoia.rb +1 -1
  194. data/lib/bcdice/game_system/ParanoiaRebooted.rb +1 -1
  195. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  196. data/lib/bcdice/game_system/Peekaboo.rb +22 -122
  197. data/lib/bcdice/game_system/Postman.rb +2 -2
  198. data/lib/bcdice/game_system/PulpCthulhu.rb +3 -3
  199. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  200. data/lib/bcdice/game_system/RecordOfLodossWar.rb +1 -1
  201. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  202. data/lib/bcdice/game_system/RokumonSekai2.rb +1 -1
  203. data/lib/bcdice/game_system/RuinBreakers.rb +296 -0
  204. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  205. data/lib/bcdice/game_system/SRS.rb +1 -2
  206. data/lib/bcdice/game_system/SamsaraBallad.rb +1 -1
  207. data/lib/bcdice/game_system/Satasupe.rb +1 -2
  208. data/lib/bcdice/game_system/ScreamHighSchool.rb +2 -2
  209. data/lib/bcdice/game_system/SevenFortressMobius.rb +1 -1
  210. data/lib/bcdice/game_system/ShadowRun5.rb +2 -2
  211. data/lib/bcdice/game_system/SharedFantasia.rb +1 -1
  212. data/lib/bcdice/game_system/ShinMegamiTenseiKakuseihen.rb +1 -1
  213. data/lib/bcdice/game_system/ShinkuuGakuen.rb +2 -2
  214. data/lib/bcdice/game_system/ShinobiGami.rb +1 -2
  215. data/lib/bcdice/game_system/ShoujoTenrankai.rb +2 -2
  216. data/lib/bcdice/game_system/Skynauts.rb +1 -1
  217. data/lib/bcdice/game_system/SteamPunkers.rb +1 -1
  218. data/lib/bcdice/game_system/StellarKnights.rb +1 -2
  219. data/lib/bcdice/game_system/SterileLife.rb +1 -1
  220. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +1 -2
  221. data/lib/bcdice/game_system/StratoShout.rb +44 -247
  222. data/lib/bcdice/game_system/StratoShout_Korean.rb +6 -282
  223. data/lib/bcdice/game_system/Strave.rb +2 -2
  224. data/lib/bcdice/game_system/SwordWorld.rb +8 -9
  225. data/lib/bcdice/game_system/SwordWorld2_0.rb +2 -3
  226. data/lib/bcdice/game_system/SwordWorld2_5.rb +2 -3
  227. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  228. data/lib/bcdice/game_system/TokumeiTenkousei.rb +1 -1
  229. data/lib/bcdice/game_system/TokyoGhostResearch.rb +2 -2
  230. data/lib/bcdice/game_system/Torg.rb +2 -2
  231. data/lib/bcdice/game_system/Torg1_5.rb +1 -1
  232. data/lib/bcdice/game_system/TorgEternity.rb +1 -1
  233. data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
  234. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  235. data/lib/bcdice/game_system/TwilightGunsmoke.rb +1 -2
  236. data/lib/bcdice/game_system/UnsungDuet.rb +139 -0
  237. data/lib/bcdice/game_system/Utakaze.rb +1 -1
  238. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +1 -1
  239. data/lib/bcdice/game_system/Villaciel.rb +1 -2
  240. data/lib/bcdice/game_system/Warhammer.rb +1 -1
  241. data/lib/bcdice/game_system/Warhammer4.rb +329 -0
  242. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  243. data/lib/bcdice/game_system/WorldOfDarkness.rb +1 -1
  244. data/lib/bcdice/game_system/YankeeYogSothoth.rb +15 -15
  245. data/lib/bcdice/game_system/YearZeroEngine.rb +1 -1
  246. data/lib/bcdice/game_system/ZettaiReido.rb +1 -1
  247. data/lib/bcdice/game_system/filled_with/cook_tables.rb +119 -0
  248. data/lib/bcdice/game_system/filled_with/lot_tables.rb +155 -0
  249. data/lib/bcdice/loader.rb +6 -8
  250. data/lib/bcdice/preprocessor.rb +15 -40
  251. data/lib/bcdice/repl.rb +1 -1
  252. data/lib/bcdice/result.rb +83 -0
  253. data/lib/bcdice/translate.rb +11 -0
  254. data/lib/bcdice/version.rb +1 -1
  255. metadata +80 -4
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class NSSQ < Base
6
+ ID = "NSSQ"
7
+ NAME = "SRSじゃない世界樹の迷宮TRPG"
8
+ SORT_KEY = "えすああるえすしやないせかいしゆのめいきゆうTRPG"
9
+
10
+ HELP_MESSAGE = <<~MESSAGETEXT
11
+ ■ 判定 (xSQ±y)
12
+ xD6の判定。3つ以上振ったとき、出目の高い2つを表示します。クリティカル、ファンブルも計算します。
13
+ ±y: yに修正値を入力。±の計算に対応。省略可能。
14
+
15
+ ■ ダメージロール (xDR(C)(+)y)
16
+ xD6のダメージロール。クリティカルの自動判定を行います。Cを付けるとクリティカルアップ状態で計算できます。+を付けるとクリティカル時のダイスが8個になります。
17
+ x: xに振るダイス数を入力。
18
+ y: yに耐性を入力。
19
+ 例) 5DR3 5DRC4 5DRC+4
20
+
21
+ ■ 回復ロール (xHRy)
22
+ xD6の回復ロール。クリティカルが発生しません。
23
+ x: xに振るダイス数を入力。
24
+ y: yに耐性を入力。省略した場合3。
25
+ 例) 2HR 10HR2
26
+
27
+ ■ 採取ロール (TC±z,SC±z,GC±z)
28
+ ちょっと(T)、そこそこ(S)、がっつり(G)採取採掘伐採を行う。
29
+ z: zに追加でロールする回数を入力。省略可能。
30
+ 例) TC SC+1 GC-1
31
+ MESSAGETEXT
32
+
33
+ register_prefix('\d+SQ[\+\-\d]*', '\d+DR(C)?(\+)?\d+', '[TSG]C', '\d+HR\d*')
34
+
35
+ def eval_game_system_specific_command(command)
36
+ roll_sq(command) || damage_roll(command) || heal_roll(command) || collecting_roll(command)
37
+ end
38
+
39
+ private
40
+
41
+ # 判定
42
+ def roll_sq(command)
43
+ m = /(\d+)SQ([\+\-\d]+)?/i.match(command)
44
+ return nil unless m
45
+
46
+ dice_count = m[1].to_i
47
+ modifier = ArithmeticEvaluator.eval(m[2])
48
+
49
+ dice_list = @randomizer.roll_barabara(dice_count, 6)
50
+ largest_two = dice_list.sort.reverse.take(2)
51
+ total = largest_two.sum + modifier
52
+
53
+ additional_result =
54
+ if largest_two == [6, 6]
55
+ " クリティカル!"
56
+ elsif largest_two == [1, 1]
57
+ " ファンブル!"
58
+ end
59
+
60
+ sequence = [
61
+ "(#{command})",
62
+ "[#{dice_list.join(',')}]#{Format.modifier(modifier)}",
63
+ "#{total}[#{largest_two.join(',')}]#{additional_result}",
64
+ ]
65
+
66
+ return sequence.join(" > ")
67
+ end
68
+
69
+ # ダメージロール
70
+ def damage_roll(command)
71
+ m = /(\d+)DR(C)?(\+)?(\d+)/i.match(command)
72
+ return nil unless m
73
+
74
+ dice_count = m[1].to_i
75
+ critical_up = !m[2].nil? # 強化効果 クリティカルアップ
76
+ increase_critical_dice = !m[3].nil?
77
+ resist = m[4].to_i
78
+
79
+ dice_list = @randomizer.roll_barabara(dice_count, 6)
80
+
81
+ result = "(#{command}) > [#{dice_list.join(',')}]#{resist} > #{damage(dice_list, resist)}ダメージ"
82
+
83
+ critical_target = critical_up ? 1 : 2
84
+
85
+ if dice_list.count(6) - dice_list.count(1) >= critical_target
86
+ result += " クリティカル!\n"
87
+ result += additional_damage_roll(increase_critical_dice, resist)
88
+ end
89
+
90
+ return result
91
+ end
92
+
93
+ def additional_damage_roll(increase_critical_dice, resist)
94
+ dice_count = increase_critical_dice ? 8 : 4
95
+
96
+ dice_list = @randomizer.roll_barabara(dice_count, 6)
97
+ "(#{dice_count}DR#{resist}) > [#{dice_list.join(',')}]#{resist} > #{damage(dice_list, resist)}ダメージ"
98
+ end
99
+
100
+ # 回復ロール
101
+ def heal_roll(command)
102
+ m = /^(\d+)HR(\d+)?$/i.match(command)
103
+ return nil unless m
104
+
105
+ dice_count = m[1].to_i
106
+ resist = m[2]&.to_i || 3
107
+
108
+ dice_list = @randomizer.roll_barabara(dice_count, 6)
109
+
110
+ return "(#{command}) > [#{dice_list.join(',')}]#{resist} > #{damage(dice_list, resist)}回復"
111
+ end
112
+
113
+ def damage(dice_list, resist)
114
+ dice_list.count { |x| x > resist }
115
+ end
116
+
117
+ # 採取ロール
118
+ def collecting_roll(command)
119
+ m = /([TSG])C([\+\-\d]+)?/i.match(command)
120
+ return nil unless m
121
+
122
+ type = m[1]
123
+ modifier = ArithmeticEvaluator.eval(m[2])
124
+
125
+ aatto_param =
126
+ case type
127
+ when "T"
128
+ 3
129
+ when "S"
130
+ 4
131
+ when "G"
132
+ 5
133
+ end
134
+
135
+ roll_times = aatto_param - 2 + modifier
136
+ return nil if roll_times <= 0
137
+
138
+ results = Array.new(roll_times) do |i|
139
+ dice_list = @randomizer.roll_barabara(2, 6)
140
+ dice = dice_list.sum()
141
+
142
+ "(#{command}) > #{dice}[#{dice_list.join(',')}]: #{result_collecting(i, dice, aatto_param)}"
143
+ end
144
+
145
+ results.join("\n")
146
+ end
147
+
148
+ def result_collecting(i, dice, aatto)
149
+ if (dice <= aatto) && (aatto - 2 > i)
150
+ "!ああっと!"
151
+ elsif aatto - 2 <= i
152
+ "成功(追加分)"
153
+ else
154
+ "成功"
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
@@ -51,7 +51,7 @@ module BCDice
51
51
  public
52
52
 
53
53
  def eval_game_system_specific_command(command)
54
- return roll_tables(command, TABLES) || nechronica_check(command)
54
+ return roll_tables(command, self.class::TABLES) || nechronica_check(command)
55
55
  end
56
56
 
57
57
  private
@@ -60,17 +60,22 @@ module BCDice
60
60
  return '' if target == '?'
61
61
  return '' unless cmp_op == :>=
62
62
 
63
- if total >= 11
64
- " 大成功"
65
- elsif total >= target
66
- " 成功"
67
- elsif dice_list.count { |i| i <= 1 } == 0
68
- " 失敗"
69
- elsif dice_list.size > 1
70
- " 大失敗 > 使用パーツ全損"
71
- else
72
- " 大失敗"
73
- end
63
+ result =
64
+ if total >= 11
65
+ translate("Nechronica.critical")
66
+ elsif total >= target
67
+ translate("success")
68
+ elsif dice_list.count { |i| i <= 1 } == 0
69
+ translate("failure")
70
+ elsif dice_list.size > 1
71
+ fumble = translate("Nechronica.fumble")
72
+ break_all_parts = translate("Nechronica.break_all_parts")
73
+ "#{fumble} > #{break_all_parts}"
74
+ else
75
+ translate("Nechronica.fumble")
76
+ end
77
+
78
+ return " > #{result}"
74
79
  end
75
80
 
76
81
  def nechronica_check(string)
@@ -133,20 +138,13 @@ module BCDice
133
138
  debug("getHitLocation dice", dice)
134
139
  return output if dice <= 5
135
140
 
136
- table = [
137
- '防御側任意',
138
- '脚(なければ攻撃側任意)',
139
- '胴(なければ攻撃側任意)',
140
- '腕(なければ攻撃側任意)',
141
- '頭(なければ攻撃側任意)',
142
- '攻撃側任意',
143
- ]
141
+ table = translate("Nechronica.hit_location.table")
144
142
  index = dice - 6
145
143
 
146
144
  addDamage = ""
147
145
  if dice > 10
148
146
  index = 5
149
- addDamage = "(追加ダメージ#{dice - 10})"
147
+ addDamage = translate("Nechronica.hit_location.additional_damage", damage: dice - 10)
150
148
  end
151
149
 
152
150
  output = table[index] + addDamage
@@ -154,58 +152,21 @@ module BCDice
154
152
  return output
155
153
  end
156
154
 
157
- TABLES = {
158
- 'NM' => DiceTable::Table.new(
159
- '姉妹への未練表',
160
- '1D10',
161
- [
162
- '【嫌悪】[発狂:敵対認識]敵に命中しなかった攻撃は全て、射程内にいるなら嫌悪の対象に命中する。(防御側任意)',
163
- '【独占】[発狂:独占衝動]戦闘開始時と終了時に1つずつ、対象はパーツを選んで損傷する。',
164
- '【依存】[発狂:幼児退行]最大行動値が減少する(-2)',
165
- '【執着】[発狂:追尾監視]戦闘開始時と終了時に1つずつ、対象はあなたへの未練に狂気点を得る。',
166
- '【恋心】[発狂:自傷行動]戦闘開始時と終了時に1つずつ、あなたはパーツを選んで損傷する。',
167
- '【対抗】[発狂:過剰競争]戦闘開始時と終了時に1つずつ、あなたは任意の未練に狂気点を追加で得る。',
168
- '【友情】[発狂:共鳴依存]セッション終了時、対象にあなたよりも多く損傷したパーツがある際、あなたは損傷パーツ数が対象と同じになるまで、パーツを損傷させる。',
169
- '【保護】[発狂:常時密着]あなたが対象と別エリアにいるなら「移動以外の効果を持つマニューバ」を宣言できない。「自身と対象」以外を移動マニューバの対象にできない。',
170
- '【憧憬】[発狂:贋作妄想]あなたが対象と同エリアにいるなら「移動以外の効果を持つマニューバ」を宣言できない。「自身と対象」以外を移動マニューバの対象にできない。',
171
- '【信頼】[発狂:疑心暗鬼]あなた以外の全ての姉妹の最大行動値が減少する(-1)',
172
- ]
173
- ),
174
- 'NMN' => DiceTable::Table.new(
175
- '中立者への未練表',
176
- '1D10',
177
- [
178
- '【忌避】[発狂:隔絶意識]あなたは未練の対象ないしサヴァントと同じエリアにいる間、「移動以外の効果を持つマニューバ」を宣言できない。また、「自身と未練の対象ないしサヴァント」以外を移動マニューバの対象にできない。',
179
- '【嫉妬】[発狂:不協和音]全ての姉妹は行動判定に修正-1を受ける。',
180
- '【依存】[発狂:幼児退行]最大行動値が減少する(-2)',
181
- '【憐憫】[発狂:過情移入]あなたは「サヴァント」に対する攻撃判定の出目に修正-1を受ける。',
182
- '【感謝】[発狂:病的返礼]発狂した際、あなたは任意の基本パーツ2つ(なければ最もレベルの低い強化パーツ1つ)を損傷する。',
183
- '【悔恨】[発狂:自業自棄]あなたが失敗した攻撃判定は全て、あなた自身の任意の箇所にダメージを与える。',
184
- '【期待】[発狂:希望転結]あなたは狂気点を追加して振り直しを行う際、出目に修正-1を受ける。(この効果は累積する)',
185
- '【保護】[発狂:生前回帰]あなたは「レギオン」をマニューバの対象に選べない。',
186
- '【尊敬】[発狂:神化崇拝]あなたは「他の姉妹」をマニューバの対象に選べない。',
187
- '【信頼】[発狂:疑心暗鬼]あなた以外の全ての姉妹の最大行動値が減少する(-1)',
188
- ]
189
- ),
190
- 'NME' => DiceTable::Table.new(
191
- '敵への未練表',
192
- '1D10',
193
- [
194
- '【恐怖】[発狂:認識拒否]あなたは、行動判定・狂気判定の出目に修正-1を受ける。',
195
- '【隷属】[発狂:造反有理]あなたが失敗した攻撃判定は全て、大失敗として扱う。',
196
- '【不安】[発狂:挙動不審]最大行動値が減少する(-2)',
197
- '【憐憫】[発狂:感情移入]あなたは「サヴァント」に対する攻撃判定の出目に修正-1を受ける。',
198
- '【愛憎】[発狂:凶愛心中]あなたは狂気判定・攻撃判定で大成功するごとに[判定値-10]個の自身のパーツを選び、損傷させる。',
199
- '【悔恨】[発狂:自業自棄]あなたが失敗した攻撃判定は全て、あなた自身の任意の箇所にダメージを与える。',
200
- '【軽蔑】[発狂:眼中不在]同エリアの手駒があなたに対して行う攻撃判定の出目は修正+1を受ける。',
201
- '【憤怒】[発狂:激情暴走]あなたは、攻撃判定・狂気判定の出目に修正-1を受ける。',
202
- '【怨念】[発狂:不倶戴天]あなたは逃走判定ができない。あなたが「自身と未練の対象」以外を対象にしたマニューバを使用する際、行動値1点を追加で減らさなくてはいけない。',
203
- '【憎悪】[発狂:痕跡破壊]この未練を発狂した際、あなた以外の姉妹から1人選ぶ。その姉妹は任意のパーツを2つ損傷する。',
204
- ]
205
- )
206
- }.freeze
207
-
208
- register_prefix(['\d+NC.*', '\d+NA.*', '\d+R10.*'] + TABLES.keys)
155
+ class << self
156
+ private
157
+
158
+ def translate_tables(locale)
159
+ {
160
+ "NM" => DiceTable::Table.from_i18n("Nechronica.table.NM", locale),
161
+ "NMN" => DiceTable::Table.from_i18n("Nechronica.table.NMN", locale),
162
+ "NME" => DiceTable::Table.from_i18n("Nechronica.table.NME", locale),
163
+ }
164
+ end
165
+ end
166
+
167
+ TABLES = translate_tables(:ja_jp)
168
+
169
+ register_prefix('\d+NC.*', '\d+NA.*', '\d+R10.*', TABLES.keys)
209
170
  end
210
171
  end
211
172
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "bcdice/game_system/Nechronica"
4
+
3
5
  module BCDice
4
6
  module GameSystem
5
- class Nechronica_Korean < Base
7
+ class Nechronica_Korean < Nechronica
6
8
  # ゲームシステムの識別子
7
9
  ID = 'Nechronica:Korean'
8
10
 
@@ -20,141 +22,22 @@ module BCDice
20
22
  ・공격판정 (nNA+m)
21
23
   주사위 수n、수정치m으로 공격판정굴림을 행합니다.
22
24
   명중부위와 주사위 수가 2개 이상일 때에 파츠파손 수도 표시합니다.
25
+
26
+
27
+ ・姉妹への未練表 nm
28
+ ・中立者への未練表 nmn
29
+ ・敵への未練表 nme
23
30
  INFO_MESSAGE_TEXT
24
31
 
25
- register_prefix(['\d+NC.*', '\d+NA.*', '\d+R10.*'])
32
+ register_prefix_from_super_class()
26
33
 
27
34
  def initialize(command)
28
35
  super(command)
29
36
 
30
- @sort_add_dice = true
31
- @sort_barabara_dice = true
32
- @default_target_number = 6 # 목표치가 딱히 없을때의 난이도
33
- end
34
-
35
- def replace_text(string)
36
- string = string.gsub(/(\d+)NC(10)?([\+\-][\+\-\d]+)/i) { "#{Regexp.last_match(1)}R10#{Regexp.last_match(3)}[0]" }
37
- string = string.gsub(/(\d+)NC(10)?/i) { "#{Regexp.last_match(1)}R10[0]" }
38
- string = string.gsub(/(\d+)NA(10)?([\+\-][\+\-\d]+)/i) { "#{Regexp.last_match(1)}R10#{Regexp.last_match(3)}[1]" }
39
- string = string.gsub(/(\d+)NA(10)?/i) { "#{Regexp.last_match(1)}R10[1]" }
40
-
41
- return string
37
+ @locale = :ko_kr
42
38
  end
43
39
 
44
- def check_nD10(total, _dice_total, dice_list, cmp_op, target)
45
- return '' if target == '?'
46
- return '' unless cmp_op == :>=
47
-
48
- if total >= 11
49
- " > 대성공"
50
- elsif total >= target
51
- " > 성공"
52
- elsif dice_list.count { |i| i <= 1 } == 0
53
- " > 실패"
54
- elsif dice_list.size > 1
55
- " > 대실패 > 사용파츠 전부 손실"
56
- else
57
- " > 대실패"
58
- end
59
- end
60
-
61
- def eval_game_system_specific_command(string)
62
- string = replace_text(string)
63
-
64
- debug("nechronica_check string", string)
65
-
66
- unless /(^|\s)S?((\d+)[rR]10([\+\-\d]+)?(\[(\d+)\])?)(\s|$)/i =~ string
67
- debug("nechronica_check unmuched")
68
- return nil
69
- end
70
-
71
- string = Regexp.last_match(2)
72
-
73
- dice_n = 1
74
- dice_n = Regexp.last_match(3).to_i if Regexp.last_match(3)
75
-
76
- battleMode = Regexp.last_match(6).to_i
77
-
78
- modText = Regexp.last_match(4)
79
- mod = ArithmeticEvaluator.eval(modText)
80
-
81
- # 0=판정모드, 1=전투모드
82
- isBattleMode = (battleMode == 1)
83
- debug("nechronica_check string", string)
84
- debug("isBattleMode", isBattleMode)
85
-
86
- diff = 6
87
-
88
- dice = @randomizer.roll_barabara(dice_n, 10).sort
89
- n_max = dice.max
90
-
91
- total_n = n_max + mod
92
-
93
- output = "(#{string}) > [#{dice.join(',')}]"
94
- if mod < 0
95
- output += mod.to_s
96
- elsif mod > 0
97
- output += "+#{mod}"
98
- end
99
-
100
- n1 = 0
101
- cnt_max = 0
102
-
103
- dice.length.times do |i|
104
- dice[i] += mod
105
- n1 += 1 if dice[i] <= 1
106
- cnt_max += 1 if dice[i] >= 10
107
- end
108
-
109
- dice_str = dice.join(",")
110
- output += " > #{total_n}[#{dice_str}]"
111
-
112
- dice_total = dice.inject(&:+)
113
- output += check_nD10(total_n, dice_total, dice, :>=, diff)
114
-
115
- debug("dice_n, n1, total_n diff", dice_n, n1, total_n, diff)
116
-
117
- # β판의 실장
118
- # if( (dice_n > 1) and (n1 >= 1) and (total_n <= diff) )
119
- # output += " > 파손#{n1}"
120
- # end
121
-
122
- if isBattleMode
123
- hit_loc = getHitLocation(total_n)
124
- if hit_loc != '1'
125
- output += " > #{hit_loc}"
126
- end
127
- end
128
-
129
- return output
130
- end
131
-
132
- def getHitLocation(dice)
133
- output = '1'
134
-
135
- debug("getHitLocation dice", dice)
136
- return output if dice <= 5
137
-
138
- table = [
139
- '방어측 임의',
140
- '다리(없으면 공격측 임의)',
141
- '몸통(없으면 공격측 임의)',
142
- '팔(없으면 공격측 임의)',
143
- '머리(없으면 공격측 임의)',
144
- '공격측 임의',
145
- ]
146
- index = dice - 6
147
-
148
- addDamage = ""
149
- if dice > 10
150
- index = 5
151
- addDamage = "(추가 데미지#{dice - 10})"
152
- end
153
-
154
- output = table[index] + addDamage
155
-
156
- return output
157
- end
40
+ TABLES = translate_tables(:ko_kr)
158
41
  end
159
42
  end
160
43
  end