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

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "bcdice/game_system/DetatokoSaga"
4
+
3
5
  module BCDice
4
6
  module GameSystem
5
- class DetatokoSaga_Korean < Base
7
+ class DetatokoSaga_Korean < DetatokoSaga
6
8
  # ゲームシステムの識別子
7
9
  ID = 'DetatokoSaga:Korean'
8
10
 
@@ -26,285 +28,15 @@ module BCDice
26
28
  ・기력 배드엔딩표 WBET (WillBadEndTable)
27
29
  INFO_MESSAGE_TEXT
28
30
 
29
- register_prefix([
30
- '\d+DS.*', '\d+JD.*',
31
- 'SST', 'StrengthStigmaTable',
32
- 'WST', 'WillStigmaTable',
33
- 'SBET', 'StrengthBadEndTable',
34
- 'WBET', 'WillBadEndTable'
35
- ])
31
+ register_prefix_from_super_class()
36
32
 
37
33
  def initialize(command)
38
34
  super(command)
39
35
 
40
- @sort_add_dice = true
41
- @enabled_d66 = true
42
- @d66_sort_type = D66SortType::ASC
43
- end
44
-
45
- def eval_game_system_specific_command(command)
46
- debug("eval_game_system_specific_command begin string", command)
47
-
48
- result = checkRoll(command)
49
- return result unless result.empty?
50
-
51
- result = checkJudgeValue(command)
52
- return result unless result.empty?
53
-
54
- debug("각종표로서 처리")
55
- return rollTableCommand(command)
56
- end
57
-
58
- # 통상판정 xDS or xDSy or xDS>=z or xDSy>=z
59
- def checkRoll(string)
60
- debug("checkRoll begin string", string)
61
-
62
- return '' unless /^(\d+)DS(\d+)?((>=)(\d+))?$/i =~ string
63
-
64
- target = 8
65
-
66
- skill = Regexp.last_match(1).to_i
67
- flag = Regexp.last_match(2).to_i
68
- target = Regexp.last_match(5).to_i unless Regexp.last_match(5).nil?
69
-
70
- result = "판정! 스킬레벨:#{skill} 플래그:#{flag} 목표치:#{target}"
71
-
72
- total, rollText = getRollResult(skill)
73
- result += " > #{total}[#{rollText}] > 판정치:#{total}"
74
-
75
- success = getSuccess(total, target)
76
- result += " > #{success}"
77
-
78
- result += getCheckFlagResult(total, flag)
79
-
80
- return result
81
- end
82
-
83
- def getRollResult(skill)
84
- diceCount = skill + 1
85
- diceCount = 3 if skill == 0
86
-
87
- dice = @randomizer.roll_barabara(diceCount, 6)
88
- diceText = dice.join(',')
89
-
90
- dice = dice.sort
91
- dice = dice.reverse if skill != 0
92
-
93
- total = dice[0] + dice[1]
94
-
95
- return total, diceText
96
- end
97
-
98
- def getSuccess(check, target)
99
- if check >= target
100
- return "목표치 이상!【성공】"
101
- end
102
-
103
- return "목표치 미달… 【실패】"
104
- end
105
-
106
- def getCheckFlagResult(total, flag)
107
- if total > flag
108
- return ""
109
- end
110
-
111
- willText = getDownWill(flag)
112
- result = ", 플래그 이하! 【기력#{willText}점 감소】"
113
- result += " 【판정치 변경 불가】"
114
-
115
- return result
36
+ @locale = :ko_kr
116
37
  end
117
38
 
118
- def getDownWill(flag)
119
- if flag >= 10
120
- return "6"
121
- end
122
-
123
- dice = @randomizer.roll_once(6)
124
- return "1D6->#{dice}"
125
- end
126
-
127
- # 스킬판정치 xJD or xJDy or xJDy+z or xJDy-z or xJDy/z
128
- def checkJudgeValue(string)
129
- debug("checkJudgeValue begin string", string)
130
-
131
- return '' unless %r{^(\d+)JD(\d+)?(([+]|[-]|[/])(\d+))?$}i =~ string
132
-
133
- skill = Regexp.last_match(1).to_i
134
- flag = Regexp.last_match(2).to_i
135
- operator = Regexp.last_match(4)
136
- value = Regexp.last_match(5).to_i
137
-
138
- result = "판정! 스킬레벨:#{skill} 플래그:#{flag}"
139
-
140
- modifyText = getModifyText(operator, value)
141
- result += " 수정치:#{modifyText}" unless modifyText.empty?
142
-
143
- total, rollText = getRollResult(skill)
144
- result += " > #{total}[#{rollText}]#{modifyText}"
145
-
146
- totalResult = getTotalResultValue(total, value, operator)
147
- result += " > #{totalResult}"
148
-
149
- result += getCheckFlagResult(total, flag)
150
-
151
- return result
152
- end
153
-
154
- def getModifyText(operator, value)
155
- return '' if value == 0
156
-
157
- operatorText =
158
- case operator
159
- when "+"
160
- "+"
161
- when "-"
162
- "-"
163
- when "/"
164
- "÷"
165
- else
166
- return ""
167
- end
168
-
169
- return "#{operatorText}#{value}"
170
- end
171
-
172
- def getTotalResultValue(total, value, operator)
173
- case operator
174
- when "+"
175
- return "#{total}+#{value} > 판정치:#{total + value}"
176
- when "-"
177
- return "#{total}-#{value} > 판정치:#{total - value}"
178
- when "/"
179
- return getTotalResultValueWhenSlash(total, value)
180
- else
181
- return "판정치:#{total}"
182
- end
183
- end
184
-
185
- def getTotalResultValueWhenSlash(total, value)
186
- return "0으로는 나누어지지 않습니다" if value == 0
187
-
188
- quotient = ((1.0 * total) / value).ceil
189
-
190
- result = "#{total}÷#{value} > 판정치:#{quotient}"
191
- return result
192
- end
193
-
194
- ####################
195
- # 각종표
196
-
197
- def rollTableCommand(command)
198
- command = command.upcase
199
-
200
- debug("eval_game_system_specific_command command", command)
201
-
202
- name = ''
203
- text = ''
204
- total = 0
205
-
206
- case command.upcase
207
- when "SST", "StrengthStigmaTable".upcase
208
- name, text, total = choiceStrengthStigmaTable()
209
- when "WST", "WillStigmaTable".upcase
210
- name, text, total = choiceWillStigmaTable()
211
- when "SBET", "StrengthBadEndTable".upcase
212
- name, text, total = choiceStrengthBadEndTable()
213
- when "WBET", "WillBadEndTable".upcase
214
- name, text, total = choiceWillBadEndTable()
215
- else
216
- return
217
- end
218
-
219
- result = "#{name}(#{total}) > #{text}"
220
-
221
- return result
222
- end
223
-
224
- # ##표 목록
225
-
226
- def choiceStrengthStigmaTable()
227
- name = "체력 낙인표"
228
- table = [
229
- "당신은 【낙인】을 2개 받는다. 이 표를 다시 2번 굴려 받을 【낙인】을 정한다(그 경우, 다시 이 눈이 나와도 【낙인】은 늘어나지 않는다).",
230
- "【상처】 심한 상처를 입었다. 어떻게든 싸울 수는 있지만…….",
231
- "【출혈】 피가 흘러넘쳐, 눈이 흐릿하다…….",
232
- "【쇠약】 몸이 약해져, 그 마음마저도 시들어버릴 거 같다.",
233
- "【고통】 아픔과 괴로움, 한심함. 눈에서 눈물이 새어 나온다.",
234
- "【충격】 날려져서, 벽이나 나무에 부딪힌다. 빨리 일어서지 않으면.",
235
- "【피로】 당신의 얼굴에 피로의 색이 강해진다……이 싸움이 힘겨워졌다.",
236
- "【노호】 성가신 공격에 분노의 함성을 지른다. 분노가 싸움을 어렵게 할까?",
237
- "【부상】 상처를 입었다…….",
238
- "【경상】 당신의 피부에 상처가 남았다. 이것만이라면 아무렇지도 않다.",
239
- "기적적으로 당신은 【낙인】을 받지 않았다.",
240
- ]
241
-
242
- text, total = get_table_by_2d6(table)
243
- return name, text, total
244
- end
245
-
246
- def choiceWillStigmaTable()
247
- name = "기력 낙인표"
248
-
249
- table = [
250
- "당신은 【낙인】을 2개 받는다. 이 표를 다시 2번 굴려 받을 【낙인】을 정한다(그 경우, 다시 이 눈이 나와도 【낙인】은 늘어나지 않는다).",
251
- "【절망】 어떻게 하지 못하는 상황. 희망은 사라지고……무릎을 꿇을 수밖에 없다.",
252
- "【통곡】 너무도 부조리함에, 어린아이처럼 울음을 터트릴 수밖에 없다.",
253
- "【후회】 이럴 생각은 아니었는데. 하지만 현실은 비정했다.",
254
- "【공포】 공포에 사로잡혔다! 적이, 자신의 손이, 무서워서 참을 수 없다!",
255
- "【갈등】 정말로 이걸로 괜찮은 걸까? 몇 번이고 자신에게 의문이 일어난다…….",
256
- "【증오】 분노와 증오에 사로잡힌 당신은, 본래의 힘을 발휘할 수 있을까?",
257
- "【망연】 이것은 현실인가? 몽롱한 정신으로 당신은 생각한다.",
258
- "【주저】 망설임을 가졌다. 그것은 싸울 의지를 둔하게 할 것인가?",
259
- "【악몽】 이제부터 때때로, 당신은 이 순간을 악몽으로 볼 것이다.",
260
- "기적적으로 당신은 【낙인】을 받지 않았다.",
261
- ]
262
-
263
- text, total = get_table_by_2d6(table)
264
- return name, text, total
265
- end
266
-
267
- def choiceStrengthBadEndTable()
268
- name = "체력 배드엔딩표"
269
-
270
- table = [
271
- "【사망】 당신은 죽었다. 다음 세션에 참가하기 위해서는, 클래스 1개를 『몬스터』나 『암흑』으로 클래스 체인지해야만 한다.",
272
- "【목숨 구걸】 당신은 공포를 느껴, 목숨을 구걸했다! 다음 세션 개시 시에, 클래스 1개가 『자코』로 변경된다!",
273
- "【망각】 당신은 기억을 잃고, 우두커니 섰다. 다음 세션에 참가하기 위해서는, 클래스 1개를 변경해야만 한다.",
274
- "【비극】 당신의 공격은 적이 아니라 아군을 맞췄다! 모든 것이 끝날 때까지 당신은 우두커니 서 있게 된다. 임의의 아군의 【체력】을 1D6점 감소시킨다.",
275
- "【폭주】 당신은 이성을 잃고, 충동에 따라 폭주한다! 같은 씬에 있는 전원의 【체력】을 1D6점 감소시킨다.",
276
- "【전락】 당신은 단애절벽에서 떨어진다.",
277
- "【포로】 당신은 적에게 사로잡혔다.",
278
- "【도주】 당신은 겁에 질려, 동료를 버리고 도망쳤다.",
279
- "【중상】 당신은 어찌할 수 없는 상처를 입고, 쓰러졌다.",
280
- "【기절】 당신은 의식을 잃었다. 그리고 정신이 들면 모든 것이 끝나있었다.",
281
- "그래도 아직 일어선다! 당신은 배드엔드를 맞이하지 않았다. 체력의 【낙인】을 1개 지워도 좋다.",
282
- ]
283
-
284
- text, total = get_table_by_2d6(table)
285
- return name, text, total
286
- end
287
-
288
- def choiceWillBadEndTable()
289
- name = "기력 배드엔딩표"
290
-
291
- table = [
292
- "【자해】 당신은 스스로 죽음을 골랐다. 다음 세션에 참가하기 위해서는 클래스 1개를 『암흑』으로 클래스 체인지해야만 한다.",
293
- "【타락】 당신은 마음속의 어둠에 먹혔다. 다음 세션 개시 시에, 클래스 1개가 『암흑』이나 『몬스터』로 변경된다!",
294
- "【예속】 당신은 적의 말에 거스를 수 없다. 다음 세션에 당신의 스탠스는 『종속』이 된다.",
295
- "【배반】 배반의 충동. 임의의 아군의 【체력】을 1D6점 감소시키고, 그 자리에서 도망친다.",
296
- "【폭주】 당신은 이성을 잃고, 충동에 따라 폭주한다! 같은 씬에 있는 전원의 【체력】을 1D6점 감소시킨다.",
297
- "【저주】 마음의 어둠이 현재화한 것인가. 적의 원한인가. 저주에 삼켜진 당신은, 그저 고통에 몸부림칠 수밖에 없다.",
298
- "【포로】 당신은 적에게 사로잡혀, 그 자리에서 끌려갔다.",
299
- "【도주】 당신은 겁에 질려, 동료를 버리고 도망쳤다.",
300
- "【방심】 당신은 그저 멍하니 서 있을 수밖에 없다. 정신을 차렸을 때, 모든 것은 끝나있었다.",
301
- "【기절】 당신은 의식을 잃었다. 그리고 정신이 들면 모든 것이 끝나있었다.",
302
- "그래도 아직 포기하지 않아! 당신은 배드엔드를 맞이하지 않았다. 기력의 【낙인】을 1개 지워도 좋다.",
303
- ]
304
-
305
- text, total = get_table_by_2d6(table)
306
- return name, text, total
307
- end
39
+ TABLES = translate_tables(:ko_kr)
308
40
  end
309
41
  end
310
42
  end
@@ -21,13 +21,12 @@ module BCDice
21
21
  (上記二つは最初からシークレットダイスで行われます)
22
22
  INFO_MESSAGE_TEXT
23
23
 
24
- register_prefix(['(ZMB|BIO).*'])
24
+ register_prefix('(ZMB|BIO).*')
25
25
 
26
26
  def initialize(command)
27
27
  super(command)
28
28
 
29
29
  @sort_add_dice = true
30
- @enabled_d66 = true
31
30
  @d66_sort_type = D66SortType::ASC
32
31
  end
33
32
 
@@ -35,14 +34,18 @@ module BCDice
35
34
  case command
36
35
  when /^BIO(\d+)?$/
37
36
  roll_times = (Regexp.last_match(1) || 1).to_i
38
- @is_secret = true
39
37
 
40
- return checkInfection(roll_times)
38
+ Result.new.tap do |r|
39
+ r.secret = true
40
+ r.text = checkInfection(roll_times)
41
+ end
41
42
  when /^ZMB(\+(\d+))?$/
42
43
  value = Regexp.last_match(2).to_i
43
- @is_secret = true
44
44
 
45
- return rollZombie(value)
45
+ Result.new.tap do |r|
46
+ r.secret = true
47
+ r.text = rollZombie(value)
48
+ end
46
49
  end
47
50
  end
48
51
 
@@ -30,10 +30,12 @@ module BCDice
30
30
  ・D66ダイスあり
31
31
  INFO_MESSAGE_TEXT
32
32
 
33
- register_prefix(['\d+DX.*', 'ET'])
33
+ register_prefix('\d+DX.*', 'ET')
34
34
 
35
35
  # 成功判定コマンドのノード
36
36
  class DX
37
+ include Translate
38
+
37
39
  # ノードを初期化する
38
40
  # @param [Integer] num ダイス数
39
41
  # @param [Integer] critical_value クリティカル値
@@ -47,6 +49,8 @@ module BCDice
47
49
 
48
50
  @modifier_str = Format.modifier(@modifier)
49
51
  @expression = node_expression()
52
+
53
+ @locale = :ja_jp
50
54
  end
51
55
 
52
56
  # 成功判定を行う
@@ -54,11 +58,11 @@ module BCDice
54
58
  # @return [String] 判定結果
55
59
  def execute(randomizer)
56
60
  if @critical_value < 2
57
- return "(#{@expression}) > クリティカル値が低すぎます。2以上を指定してください。"
61
+ return "(#{@expression}) > #{translate('DoubleCross.DX.invalid_critical')}"
58
62
  end
59
63
 
60
64
  if @num < 1
61
- return "(#{@expression}) > 自動失敗"
65
+ return "(#{@expression}) > #{translate('DoubleCross.DX.auto_failure')}"
62
66
  end
63
67
 
64
68
  # 出目のグループの配列
@@ -99,8 +103,7 @@ module BCDice
99
103
  # @return [String]
100
104
  def result_str(value_groups)
101
105
  fumble = value_groups[0].values.all? { |value| value == 1 }
102
- # TODO: Ruby 2.4以降では Array#sum が使える
103
- sum = value_groups.map(&:max).reduce(0, &:+)
106
+ sum = value_groups.map(&:max).sum
104
107
  achieved_value = fumble ? 0 : (sum + @modifier)
105
108
 
106
109
  parts = [
@@ -118,7 +121,7 @@ module BCDice
118
121
  # @param [Boolean] fumble ファンブルしたか
119
122
  # @return [String]
120
123
  def achieved_value_with_if_fumble(achieved_value, fumble)
121
- fumble ? "#{achieved_value} (ファンブル)" : achieved_value.to_s
124
+ fumble ? "#{achieved_value} (#{translate('fumble')})" : achieved_value.to_s
122
125
  end
123
126
 
124
127
  # 達成値と目標値を比較した結果を返す
@@ -130,11 +133,11 @@ module BCDice
130
133
 
131
134
  # ファンブル時は自動失敗
132
135
  # [3rd ルールブック1 pp. 186-187]
133
- return '失敗' if fumble
136
+ return translate("failure") if fumble
134
137
 
135
138
  # 達成値が目標値以上ならば行為判定成功
136
139
  # [3rd ルールブック1 p. 187]
137
- return achieved_value >= @target_value ? '成功' : '失敗'
140
+ return achieved_value >= @target_value ? translate("success") : translate("failure")
138
141
  end
139
142
  end
140
143
 
@@ -173,9 +176,7 @@ module BCDice
173
176
  # クリティカルの発生数を返す
174
177
  # @return [Integer]
175
178
  def num_of_critical_occurrences
176
- @values
177
- .select { |value| critical?(value) }
178
- .length
179
+ @values.count { |value| critical?(value) }
179
180
  end
180
181
 
181
182
  private
@@ -195,13 +196,16 @@ module BCDice
195
196
  return '' if target == '?'
196
197
  return '' unless cmp_op == :>=
197
198
 
198
- if dice_list.count(1) == dice_list.size
199
- " ファンブル"
200
- elsif total >= target
201
- " 成功"
202
- else
203
- " > 失敗"
204
- end
199
+ result =
200
+ if dice_list.count(1) == dice_list.size
201
+ translate("fumble")
202
+ elsif total >= target
203
+ translate("success")
204
+ else
205
+ translate("failure")
206
+ end
207
+
208
+ return " > #{result}"
205
209
  end
206
210
 
207
211
  # ダイスボット固有コマンドの処理を行う
@@ -266,7 +270,7 @@ module BCDice
266
270
 
267
271
  target_value = m[4]&.to_i
268
272
 
269
- return DX.new(num, critical_value, modifier, target_value)
273
+ return self.class::DX.new(num, critical_value, modifier, target_value)
270
274
  end
271
275
 
272
276
  # 疾風怒濤式の成功判定コマンドの正規表現マッチ情報からノードを作る
@@ -279,7 +283,7 @@ module BCDice
279
283
 
280
284
  target_value = m[4]&.to_i
281
285
 
282
- return DX.new(num, critical_value, modifier, target_value)
286
+ return self.class::DX.new(num, critical_value, modifier, target_value)
283
287
  end
284
288
 
285
289
  # 感情表を振る
@@ -288,8 +292,8 @@ module BCDice
288
292
  #
289
293
  # @return [String]
290
294
  def roll_emotion_table
291
- pos_result = POSITIVE_EMOTION_TABLE.roll(@randomizer)
292
- neg_result = NEGATIVE_EMOTION_TABLE.roll(@randomizer)
295
+ pos_result = self.class::POSITIVE_EMOTION_TABLE.roll(@randomizer)
296
+ neg_result = self.class::NEGATIVE_EMOTION_TABLE.roll(@randomizer)
293
297
 
294
298
  positive = @randomizer.roll_once(2) == 1
295
299
  pos_neg_text =
@@ -299,75 +303,92 @@ module BCDice
299
303
  [pos_result.content, "○#{neg_result.content}"]
300
304
  end
301
305
 
306
+ name = translate("DoubleCross.ET.name")
302
307
  output_parts = [
303
- "感情表(#{pos_result.sum}-#{neg_result.sum})",
308
+ "#{name}(#{pos_result.sum}-#{neg_result.sum})",
304
309
  pos_neg_text.join(' - ')
305
310
  ]
306
311
 
307
312
  return output_parts.join(' > ')
308
313
  end
309
314
 
315
+ class << self
316
+ private
317
+
318
+ # @param locale [Symbol]
319
+ # @return [RangeTable]
320
+ def positive_emotion_table(locale)
321
+ DiceTable::RangeTable.new(
322
+ I18n.translate("DoubleCross.ET.positive.name", locale: locale),
323
+ "1D100",
324
+ [
325
+ # [0, '傾倒(けいとう)'],
326
+ [1..5, I18n.translate("DoubleCross.ET.positive.items.1_5", locale: locale)],
327
+ [6..10, I18n.translate("DoubleCross.ET.positive.items.6_10", locale: locale)],
328
+ [11..15, I18n.translate("DoubleCross.ET.positive.items.11_15", locale: locale)],
329
+ [16..20, I18n.translate("DoubleCross.ET.positive.items.16_20", locale: locale)],
330
+ [21..25, I18n.translate("DoubleCross.ET.positive.items.21_25", locale: locale)],
331
+ [26..30, I18n.translate("DoubleCross.ET.positive.items.26_30", locale: locale)],
332
+ [31..35, I18n.translate("DoubleCross.ET.positive.items.31_35", locale: locale)],
333
+ [36..40, I18n.translate("DoubleCross.ET.positive.items.36_40", locale: locale)],
334
+ [41..45, I18n.translate("DoubleCross.ET.positive.items.41_45", locale: locale)],
335
+ [46..50, I18n.translate("DoubleCross.ET.positive.items.46_50", locale: locale)],
336
+ [51..55, I18n.translate("DoubleCross.ET.positive.items.51_55", locale: locale)],
337
+ [56..60, I18n.translate("DoubleCross.ET.positive.items.56_60", locale: locale)],
338
+ [61..65, I18n.translate("DoubleCross.ET.positive.items.61_65", locale: locale)],
339
+ [66..70, I18n.translate("DoubleCross.ET.positive.items.66_70", locale: locale)],
340
+ [71..75, I18n.translate("DoubleCross.ET.positive.items.71_75", locale: locale)],
341
+ [76..80, I18n.translate("DoubleCross.ET.positive.items.76_80", locale: locale)],
342
+ [81..85, I18n.translate("DoubleCross.ET.positive.items.81_85", locale: locale)],
343
+ [86..90, I18n.translate("DoubleCross.ET.positive.items.86_90", locale: locale)],
344
+ [91..95, I18n.translate("DoubleCross.ET.positive.items.91_95", locale: locale)],
345
+ [96..100, I18n.translate("DoubleCross.ET.positive.items.96_100", locale: locale)],
346
+ # [101, '懐旧(かいきゅう)'],
347
+ # [102, '任意(にんい)'],
348
+ ]
349
+ )
350
+ end
351
+
352
+ # @param locale [Symbol]
353
+ # @return [RangeTable]
354
+ def negative_emotion_table(locale)
355
+ DiceTable::RangeTable.new(
356
+ I18n.translate("DoubleCross.ET.negative.name", locale: locale),
357
+ "1D100",
358
+ [
359
+ # [0, '侮蔑(ぶべつ)'],
360
+ [1..5, I18n.translate("DoubleCross.ET.negative.items.1_5", locale: locale)],
361
+ [6..10, I18n.translate("DoubleCross.ET.negative.items.6_10", locale: locale)],
362
+ [11..15, I18n.translate("DoubleCross.ET.negative.items.11_15", locale: locale)],
363
+ [16..20, I18n.translate("DoubleCross.ET.negative.items.16_20", locale: locale)],
364
+ [21..25, I18n.translate("DoubleCross.ET.negative.items.21_25", locale: locale)],
365
+ [26..30, I18n.translate("DoubleCross.ET.negative.items.26_30", locale: locale)],
366
+ [31..35, I18n.translate("DoubleCross.ET.negative.items.31_35", locale: locale)],
367
+ [36..40, I18n.translate("DoubleCross.ET.negative.items.36_40", locale: locale)],
368
+ [41..45, I18n.translate("DoubleCross.ET.negative.items.41_45", locale: locale)],
369
+ [46..50, I18n.translate("DoubleCross.ET.negative.items.46_50", locale: locale)],
370
+ [51..55, I18n.translate("DoubleCross.ET.negative.items.51_55", locale: locale)],
371
+ [56..60, I18n.translate("DoubleCross.ET.negative.items.56_60", locale: locale)],
372
+ [61..65, I18n.translate("DoubleCross.ET.negative.items.61_65", locale: locale)],
373
+ [66..70, I18n.translate("DoubleCross.ET.negative.items.66_70", locale: locale)],
374
+ [71..75, I18n.translate("DoubleCross.ET.negative.items.71_75", locale: locale)],
375
+ [76..80, I18n.translate("DoubleCross.ET.negative.items.76_80", locale: locale)],
376
+ [81..85, I18n.translate("DoubleCross.ET.negative.items.81_85", locale: locale)],
377
+ [86..90, I18n.translate("DoubleCross.ET.negative.items.86_90", locale: locale)],
378
+ [91..95, I18n.translate("DoubleCross.ET.negative.items.91_95", locale: locale)],
379
+ [96..100, I18n.translate("DoubleCross.ET.negative.items.96_100", locale: locale)],
380
+ # [101, '無関心(むかんしん)'],
381
+ # [102, '任意(にんい)'],
382
+ ]
383
+ ).freeze
384
+ end
385
+ end
386
+
310
387
  # 感情表(ポジティブ)
311
- POSITIVE_EMOTION_TABLE = DiceTable::RangeTable.new(
312
- '感情表(ポジティブ)',
313
- '1D100',
314
- [
315
- # [0, '傾倒(けいとう)'],
316
- [1..5, '好奇心(こうきしん)'],
317
- [6..10, '憧憬(どうけい)'],
318
- [11..15, '尊敬(そんけい)'],
319
- [16..20, '連帯感(れんたいかん)'],
320
- [21..25, '慈愛(じあい)'],
321
- [26..30, '感服(かんぷく)'],
322
- [31..35, '純愛(じゅんあい)'],
323
- [36..40, '友情(ゆうじょう)'],
324
- [41..45, '慕情(ぼじょう)'],
325
- [46..50, '同情(どうじょう)'],
326
- [51..55, '遺志(いし)'],
327
- [56..60, '庇護(ひご)'],
328
- [61..65, '幸福感(こうふくかん)'],
329
- [66..70, '信頼(しんらい)'],
330
- [71..75, '執着(しゅうちゃく)'],
331
- [76..80, '親近感(しんきんかん)'],
332
- [81..85, '誠意(せいい)'],
333
- [86..90, '好意(こうい)'],
334
- [91..95, '有為(ゆうい)'],
335
- [96..100, '尽力(じんりょく)'],
336
- # [101, '懐旧(かいきゅう)'],
337
- # [102, '任意(にんい)'],
338
- ]
339
- ).freeze
388
+ POSITIVE_EMOTION_TABLE = positive_emotion_table(:ja_jp).freeze
340
389
 
341
390
  # 感情表(ネガティブ)
342
- NEGATIVE_EMOTION_TABLE = DiceTable::RangeTable.new(
343
- '感情表(ネガティブ)',
344
- '1D100',
345
- [
346
- # [0, '侮蔑(ぶべつ)'],
347
- [1..5, '食傷(しょくしょう)'],
348
- [6..10, '脅威(きょうい)'],
349
- [11..15, '嫉妬(しっと)'],
350
- [16..20, '悔悟(かいご)'],
351
- [21..25, '恐怖(きょうふ)'],
352
- [26..30, '不安(ふあん)'],
353
- [31..35, '劣等感(れっとうかん)'],
354
- [36..40, '疎外感(そがいかん)'],
355
- [41..45, '恥辱(ちじょく)'],
356
- [46..50, '憐憫(れんびん)'],
357
- [51..55, '偏愛(へんあい)'],
358
- [56..60, '憎悪(ぞうお)'],
359
- [61..65, '隔意(かくい)'],
360
- [66..70, '嫌悪(けんお)'],
361
- [71..75, '猜疑心(さいぎしん)'],
362
- [76..80, '厭気(いやけ)'],
363
- [81..85, '不信感(ふしんかん)'],
364
- [86..90, '不快感(ふかいかん)'],
365
- [91..95, '憤懣(ふんまん)'],
366
- [96..100, '敵愾心(てきがいしん)'],
367
- # [101, '無関心(むかんしん)'],
368
- # [102, '任意(にんい)'],
369
- ]
370
- ).freeze
391
+ NEGATIVE_EMOTION_TABLE = negative_emotion_table(:ja_jp).freeze
371
392
  end
372
393
  end
373
394
  end