bcdice 3.16.1 → 3.17.0

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 (149) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +111 -0
  3. data/i18n/Airgetlamh/ja_jp.yml +5 -0
  4. data/i18n/Airgetlamh/ko_kr.yml +5 -0
  5. data/i18n/Alsetto/ja_jp.yml +5 -0
  6. data/i18n/Alsetto/ko_kr.yml +5 -0
  7. data/i18n/AnimaAnimus/ja_jp.yml +28 -0
  8. data/i18n/AnimaAnimus/ko_kr.yml +28 -0
  9. data/i18n/BlackJacket/ja_jp.yml +79 -0
  10. data/i18n/BlackJacket/ko_kr.yml +79 -0
  11. data/i18n/Bloodorium/ja_jp.yml +3 -0
  12. data/i18n/Bloodorium/ko_kr.yml +3 -0
  13. data/i18n/Cthulhu/ko_kr.yml +1 -1
  14. data/i18n/Dracurouge/ko_kr.yml +1284 -205
  15. data/i18n/Emoklore/ja_jp.yml +1 -0
  16. data/i18n/Emoklore/ko_kr.yml +1 -0
  17. data/i18n/FutariSousa/ja_jp.yml +70 -0
  18. data/i18n/FutariSousa/ko_kr.yml +157 -0
  19. data/i18n/HatsuneMiku/ja_jp.yml +579 -0
  20. data/i18n/HatsuneMiku/ko_kr.yml +579 -0
  21. data/i18n/Irisbane/ja_jp.yml +27 -0
  22. data/i18n/Irisbane/ko_kr.yml +27 -0
  23. data/i18n/JuinKansen/ja_jp.yml +168 -0
  24. data/i18n/JuinKansen/ko_kr.yml +168 -0
  25. data/i18n/KemonoNoMori/ja_jp.yml +229 -0
  26. data/i18n/KemonoNoMori/ko_kr.yml +229 -0
  27. data/i18n/KizunaBullet/ko_kr.yml +653 -0
  28. data/i18n/MagicPunk/ja_jp.yml +5 -0
  29. data/i18n/MagicPunk/ko_kr.yml +5 -0
  30. data/i18n/MorkBorg/ja_jp.yml +34 -0
  31. data/i18n/MorkBorg/ko_kr.yml +34 -0
  32. data/i18n/Nechronica/ko_kr.yml +43 -0
  33. data/i18n/NegikureNegimaki/ja_jp.yml +6 -0
  34. data/i18n/NegikureNegimaki/ko_kr.yml +6 -0
  35. data/i18n/Nuekagami/ja_jp.yml +219 -0
  36. data/i18n/Nuekagami/ko_kr.yml +219 -0
  37. data/i18n/Revulture/ja_jp.yml +8 -0
  38. data/i18n/Revulture/ko_kr.yml +8 -0
  39. data/i18n/SRS/ja_jp.yml +4 -0
  40. data/i18n/SRS/ko_kr.yml +4 -0
  41. data/i18n/ShinobiGami/ja_jp.yml +879 -0
  42. data/i18n/ShinobiGami/ko_kr.yml +876 -0
  43. data/i18n/StarryDolls/ja_jp.yml +456 -0
  44. data/i18n/StarryDolls/ko_kr.yml +456 -0
  45. data/i18n/StratoShout/ja_jp.yml +8 -8
  46. data/i18n/SwordWorld2_5/ja_jp.yml +48 -0
  47. data/i18n/Ventangle/ja_jp.yml +4 -0
  48. data/i18n/Ventangle/ko_kr.yml +4 -0
  49. data/i18n/YearZeroEngine/ja_jp.yml +12 -0
  50. data/i18n/YearZeroEngine/ko_kr.yml +12 -0
  51. data/i18n/ZombiLine/ja_jp.yml +27 -0
  52. data/i18n/ZombiLine/ko_kr.yml +27 -0
  53. data/i18n/ko_kr.yml +2 -0
  54. data/i18n/zh_hant.yml +2 -2
  55. data/lib/bcdice/dice_table/d66_left_range_table.rb +21 -0
  56. data/lib/bcdice/game_system/Aionia.rb +68 -19
  57. data/lib/bcdice/game_system/Airgetlamh.rb +64 -41
  58. data/lib/bcdice/game_system/Airgetlamh_Korean.rb +53 -0
  59. data/lib/bcdice/game_system/Alsetto.rb +63 -50
  60. data/lib/bcdice/game_system/Alsetto_Korean.rb +51 -0
  61. data/lib/bcdice/game_system/AnimaAnimus.rb +15 -32
  62. data/lib/bcdice/game_system/AnimaAnimus_Korean.rb +39 -0
  63. data/lib/bcdice/game_system/BlackJacket.rb +57 -113
  64. data/lib/bcdice/game_system/BlackJacket_Korean.rb +8 -206
  65. data/lib/bcdice/game_system/Bloodorium.rb +1 -1
  66. data/lib/bcdice/game_system/Bloodorium_Korean.rb +34 -0
  67. data/lib/bcdice/game_system/ChroniclesOfDarkness2e.rb +163 -0
  68. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +471 -300
  69. data/lib/bcdice/game_system/DeadlineHeroes_Korean.rb +273 -0
  70. data/lib/bcdice/game_system/Dracurouge_Korean.rb +25 -19
  71. data/lib/bcdice/game_system/DungeonsAndDragons5.rb +106 -73
  72. data/lib/bcdice/game_system/DungeonsAndDragons5_Korean.rb +53 -0
  73. data/lib/bcdice/game_system/DungeonsAndDragons_Korean.rb +61 -0
  74. data/lib/bcdice/game_system/Emoklore.rb +34 -9
  75. data/lib/bcdice/game_system/Emoklore_Korean.rb +10 -2
  76. data/lib/bcdice/game_system/FateCoreSystem.rb +10 -6
  77. data/lib/bcdice/game_system/FullMetalPanic_Korean.rb +28 -0
  78. data/lib/bcdice/game_system/FutariSousa.rb +37 -12
  79. data/lib/bcdice/game_system/FutariSousa_Korean.rb +25 -8
  80. data/lib/bcdice/game_system/GaiaCare.rb +40 -0
  81. data/lib/bcdice/game_system/GardenOrder.rb +2 -2
  82. data/lib/bcdice/game_system/GardenOrderReEdit.rb +849 -0
  83. data/lib/bcdice/game_system/GardenOrder_Korean.rb +839 -0
  84. data/lib/bcdice/game_system/HatsuneMiku.rb +51 -605
  85. data/lib/bcdice/game_system/HatsuneMiku_Korean.rb +56 -0
  86. data/lib/bcdice/game_system/HunterTheReckoning5th.rb +15 -11
  87. data/lib/bcdice/game_system/Irisbane.rb +17 -30
  88. data/lib/bcdice/game_system/Irisbane_Korean.rb +52 -0
  89. data/lib/bcdice/game_system/JuinKansen.rb +41 -208
  90. data/lib/bcdice/game_system/JuinKansen_Korean.rb +8 -213
  91. data/lib/bcdice/game_system/KemonoNoMori.rb +67 -276
  92. data/lib/bcdice/game_system/KemonoNoMori_Korean.rb +62 -0
  93. data/lib/bcdice/game_system/KinAriel.rb +117 -0
  94. data/lib/bcdice/game_system/KizunaBullet_Korean.rb +109 -0
  95. data/lib/bcdice/game_system/KutuluRevised.rb +94 -0
  96. data/lib/bcdice/game_system/LiverLabyrinth.rb +321 -0
  97. data/lib/bcdice/game_system/Lost.rb +89 -0
  98. data/lib/bcdice/game_system/MagicPunk.rb +85 -0
  99. data/lib/bcdice/game_system/MagicPunk_Korean.rb +39 -0
  100. data/lib/bcdice/game_system/MarvelHeroicRoleplaying.rb +144 -0
  101. data/lib/bcdice/game_system/MetallicGuardian_Korean.rb +28 -0
  102. data/lib/bcdice/game_system/MorkBorg.rb +170 -0
  103. data/lib/bcdice/game_system/MorkBorg_Korean.rb +49 -0
  104. data/lib/bcdice/game_system/NanimonaiMura.rb +112 -0
  105. data/lib/bcdice/game_system/Nechronica_Korean.rb +6 -6
  106. data/lib/bcdice/game_system/NegikureNegimaki.rb +140 -0
  107. data/lib/bcdice/game_system/NegikureNegimaki_Korean.rb +48 -0
  108. data/lib/bcdice/game_system/NeonUnderRealm.rb +122 -0
  109. data/lib/bcdice/game_system/NinjaSlayer2.rb +170 -49
  110. data/lib/bcdice/game_system/Nuekagami.rb +19 -261
  111. data/lib/bcdice/game_system/Nuekagami_Korean.rb +43 -0
  112. data/lib/bcdice/game_system/ParanoiaPerfect.rb +74 -0
  113. data/lib/bcdice/game_system/PastFutureParadox.rb +2245 -55
  114. data/lib/bcdice/game_system/PreciousDays.rb +170 -0
  115. data/lib/bcdice/game_system/Revulture.rb +8 -5
  116. data/lib/bcdice/game_system/Revulture_Korean.rb +7 -81
  117. data/lib/bcdice/game_system/Ryutama.rb +46 -46
  118. data/lib/bcdice/game_system/SRS.rb +4 -4
  119. data/lib/bcdice/game_system/SRS_Korean.rb +67 -0
  120. data/lib/bcdice/game_system/ShinobiGami.rb +154 -1047
  121. data/lib/bcdice/game_system/ShinobiGami_Korean.rb +102 -0
  122. data/lib/bcdice/game_system/StarryDolls.rb +70 -508
  123. data/lib/bcdice/game_system/StarryDolls_Korean.rb +80 -0
  124. data/lib/bcdice/game_system/StratoShout.rb +1 -1
  125. data/lib/bcdice/game_system/SwordWorld.rb +28 -2
  126. data/lib/bcdice/game_system/SwordWorld2_0.rb +1 -1
  127. data/lib/bcdice/game_system/SwordWorld2_5.rb +67 -3
  128. data/lib/bcdice/game_system/TacticalExorcist.rb +222 -0
  129. data/lib/bcdice/game_system/TenkaRyouran_Korean.rb +30 -0
  130. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +38 -33
  131. data/lib/bcdice/game_system/Ventangle.rb +8 -7
  132. data/lib/bcdice/game_system/Ventangle_Korean.rb +6 -95
  133. data/lib/bcdice/game_system/Warhammer4.rb +202 -6
  134. data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +20 -15
  135. data/lib/bcdice/game_system/WorldEndScrapyard.rb +333 -0
  136. data/lib/bcdice/game_system/WorldsEndFrontline_Korean.rb +26 -0
  137. data/lib/bcdice/game_system/YearZeroEngine.rb +7 -7
  138. data/lib/bcdice/game_system/YearZeroEngine_Korean.rb +46 -0
  139. data/lib/bcdice/game_system/ZombiLine.rb +29 -36
  140. data/lib/bcdice/game_system/ZombiLine_Korean.rb +37 -0
  141. data/lib/bcdice/game_system/cthulhu7th_Korean/full_auto.rb +294 -0
  142. data/lib/bcdice/game_system/cthulhu7th_Korean/rollable.rb +43 -0
  143. data/lib/bcdice/game_system/sword_world/rating_options.rb +9 -0
  144. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +19 -0
  145. data/lib/bcdice/game_system/sword_world/rating_parser.rb +229 -149
  146. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -0
  147. data/lib/bcdice/game_system.rb +42 -0
  148. data/lib/bcdice/version.rb +1 -1
  149. metadata +87 -2
@@ -0,0 +1,273 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class DeadlineHeroes_Korean < Base
6
+ ID = "DeadlineHeroes:Korean"
7
+ NAME = "데드라인 히어로즈 RPG"
8
+ SORT_KEY = "国際化:Korean:데드라인 히어로즈 RPG"
9
+
10
+ HELP_MESSAGE = <<~TEXT
11
+ ・행위판정(DLHx)
12
+ x:성공률 (%)
13
+ 예) DLH80
14
+ 크리티컬, 펌블을 자동으로 판정합니다.
15
+ 「DLH50+20-30」처럼 가산, 감산 기재도 가능.
16
+ 성공률은 상한 100%, 하한 0%
17
+
18
+ ・데스차트(DCxY)
19
+ x:L=육체 / S=정신 / C=환경
20
+ Y:수치
21
+ 예)
22
+ DCL-5 → 라이프 -5로 판정
23
+ DCS-3 → 새니티 -3으로 판정
24
+ DCC0 → 크레딧 0으로 판정
25
+
26
+ ・히어로 네임 차트(HNC)
27
+
28
+ ・리얼 네임 차트:일본(RNCJ) / 해외(RNCO)
29
+
30
+ TEXT
31
+
32
+ register_prefix('DLH', 'DCL', 'DCS', 'DCC', 'HNC', 'RNCO', 'RNCJ')
33
+
34
+ def eval_game_system_specific_command(command)
35
+ roll_check(command) ||
36
+ death_chart(command) ||
37
+ hero_name_chart(command) ||
38
+ real_name_chart_overseas(command) ||
39
+ real_name_chart_jp(command)
40
+ end
41
+
42
+ def roll_check(command)
43
+ # 1. /i 를 추가해 대소문자 무시
44
+ m = /^DLH([0-9+-]+)$/i.match(command)
45
+ return nil unless m
46
+
47
+ expr = m[1]
48
+ parts = expr.scan(/[+-]?\d+/)
49
+ target = parts.map(&:to_i).sum
50
+ target = [[target, 0].max, 100].min
51
+
52
+ roll = @randomizer.roll_once(100)
53
+ roll_str = format("%02d", roll)
54
+ is_double = roll_str[0] == roll_str[1]
55
+
56
+ # 2. 문자열을 먼저 조합
57
+ text = "성공률#{target}% > #{roll_str}"
58
+
59
+ # 3. 문자열이 아닌 Result 객체를 반환
60
+ if is_double && roll <= target
61
+ return Result.critical("#{text} > 크리티컬")
62
+ elsif is_double && roll > target
63
+ return Result.fumble("#{text} > 펌블")
64
+ elsif roll <= target
65
+ return Result.success("#{text} > 성공")
66
+ else
67
+ return Result.failure("#{text} > 실패")
68
+ end
69
+ end
70
+
71
+ def death_chart(command)
72
+ m = /^DC([LSC])([+-]?\d+)$/i.match(command)
73
+ return nil unless m
74
+
75
+ type = m[1]
76
+ base_value = m[2].to_i
77
+ base_value = -base_value
78
+ roll = @randomizer.roll_once(10)
79
+ total = base_value + roll
80
+ total = [total, 20].min # 21 이상은 20으로 보정
81
+
82
+ table =
83
+ case type
84
+ when "L"
85
+ [
86
+ "",
87
+ "",
88
+ "아무 일도 일어나지 않는다. 당신은 기적적으로 목숨을 부지했다. 싸움은 계속된다.", # 2
89
+ "아무 일도 일어나지 않는다. 당신은 기적적으로 목숨을 부지했다. 싸움은 계속된다.", # 3
90
+ "아무 일도 일어나지 않는다. 당신은 기적적으로 목숨을 부지했다. 싸움은 계속된다.", # 4
91
+ "아무 일도 일어나지 않는다. 당신은 기적적으로 목숨을 부지했다. 싸움은 계속된다.", # 5
92
+ "아무 일도 일어나지 않는다. 당신은 기적적으로 목숨을 부지했다. 싸움은 계속된다.", # 6
93
+ "아무 일도 일어나지 않는다. 당신은 기적적으로 목숨을 부지했다. 싸움은 계속된다.", # 7
94
+ "아무 일도 일어나지 않는다. 당신은 기적적으로 목숨을 부지했다. 싸움은 계속된다.", # 8
95
+ "아무 일도 일어나지 않는다. 당신은 기적적으로 목숨을 부지했다. 싸움은 계속된다.", # 9
96
+ "아무 일도 일어나지 않는다. 당신은 기적적으로 목숨을 부지했다. 싸움은 계속된다.", # 10
97
+ "격통이 인다. 이후 이벤트 종료 시까지 모든 판정 성공률 -10%.", # 11
98
+ "당신은 [경직] 포인트 2점을 얻는다. [경직] 포인트를 소지하는 동안, 당신은 모든 파워를 사용할 수 없으며 자신의 턴도 얻을 수 없다. 각 라운드 종료 시, 당신이 소지한 [경직] 포인트를 1점 줄여도 좋다.", # 12
99
+ "혼신의 일격!! 당신은 <생존> 판정을 한다. 실패한 경우 [사망] 한다.", # 13
100
+ "당신은 [기절] 포인트를 2점 얻는다. [기절] 포인트를 소지하는 동안, 당신은 모든 파워를 사용할 수 없으며 자신의 턴도 얻을 수 없다. 각 라운드 종료 시, 당신이 소지한 [기절] 포인트를 1점 줄여도 좋다.", # 14
101
+ "이후 이벤트 종료 시까지 모든 판정의 성공률 -20%.", # 15
102
+ "기록적 일격!! 당신은 <생존>-20% 판정을 한다. 실패한 경우 [사망] 한다.", # 16
103
+ "당신은 [빈사] 포인트 2점을 얻는다. [빈사] 포인트를 소지하는 동안, 당신은 모든 파워를 사용할 수 없으며 자신의 턴도 얻을 수 없다. 각 라운드 종료 시, 당신이 소지한 [빈사] 포인트를 1점 잃는다. 모든 [빈사] 포인트를 잃기 전에 전투가 끝나지 않았을 경우, 당신은 [사망] 한다.", # 17
104
+ "서사시적 일격!! 당신은 <생존>-30% 판정을 한다. 실패한 경우 [사망] 한다.", # 18
105
+ "이후 이벤트 종료 시까지 모든 판정의 성공률 -30%.", # 19
106
+ "신화적 일격!! 당신은 하늘을 날아 3회전 정도 한 뒤, 지면에 내리꽂힌다. 눈뜨고 볼 수 없는 무참한 모습. 육체는 원형을 유지하지 못하고, 당신은 [사망] 했다." # 20
107
+ ]
108
+ when "S"
109
+ ["", "",
110
+ "아무 일도 일어나지 않는다. 당신은 이를 악물고 스트레스를 버텼다.", # 2
111
+ "아무 일도 일어나지 않는다. 당신은 이를 악물고 스트레스를 버텼다.", # 3
112
+ "아무 일도 일어나지 않는다. 당신은 이를 악물고 스트레스를 버텼다.", # 4
113
+ "아무 일도 일어나지 않는다. 당신은 이를 악물고 스트레스를 버텼다.", # 5
114
+ "아무 일도 일어나지 않는다. 당신은 이를 악물고 스트레스를 버텼다.", # 6
115
+ "아무 일도 일어나지 않는다. 당신은 이를 악물고 스트레스를 버텼다.", # 7
116
+ "아무 일도 일어나지 않는다. 당신은 이를 악물고 스트레스를 버텼다.", # 8
117
+ "아무 일도 일어나지 않는다. 당신은 이를 악물고 스트레스를 버텼다.", # 9
118
+ "아무 일도 일어나지 않는다. 당신은 이를 악물고 스트레스를 버텼다.", # 10
119
+ "이후 이벤트 종료 시까지 모든 판정 성공률 -10%.", # 11
120
+ "당신은 [공포] 포인트 2점을 얻는다. [공포] 포인트를 소지하는 동안, 당신은 [속성:공격]인 파워를 사용할 수 없다. 각 라운드 종료 시, 당신이 소지한 [공포] 포인트를 1점 줄여도 좋다.", # 12
121
+ "매우 상처입었다. 당신은 <의지> 판정을 한다. 실패한 경우 [절망]해 NPC가 된다.", # 13
122
+ "당신은 [기절] 포인트를 2점 얻는다. [기절] 포인트를 소지하는 동안, 당신은 모든 파워를 사용할 수 없으며 자신의 턴도 얻을 수 없다. 각 라운드 종료 시, 당신이 소지한 [기절] 포인트를 1점 줄여도 좋다.", # 14
123
+ "이후 이벤트 종료 시까지 모든 판정의 성공률 -20%.", # 15
124
+ "믿고 있던 사람에게 배신당한 듯한 아픔. 당신은 <의지>-20% 판정을 한다. 실패한 경우 [절망]해 NPC가 된다.", # 16
125
+ "당신은 [혼란] 포인트 2점을 얻는다. [혼란] 포인트를 소지하는 동안, 당신은 원래 동료였던 캐릭터에게, 가능한 한 최대의 피해를 입히도록 행동을 계속한다. 각 라운드 종료 시, 당신이 소지한 [혼란] 포인트를 1점 줄여도 좋다.", # 17
126
+ "너무나도 잔혹한 현실. 당신은 <의지>-30% 판정을 한다. 실패한 경우 [절망]해 NPC가 된다.", # 18
127
+ "이후 이벤트 종료 시까지 모든 판정의 성공률 -30%.", # 19
128
+ "우주의 섭리를 마주하나, 그것은 인류의 인식 한계를 뛰어넘는 무언가였다. 당신은 [절망]해 이후 NPC가 된다."] # 20
129
+ when "C"
130
+ ["", "",
131
+ "아무 일도 일어나지 않는다. 당신은 수상한 소문을 불식시켰다.", # 2
132
+ "아무 일도 일어나지 않는다. 당신은 수상한 소문을 불식시켰다.", # 3
133
+ "아무 일도 일어나지 않는다. 당신은 수상한 소문을 불식시켰다.", # 4
134
+ "아무 일도 일어나지 않는다. 당신은 수상한 소문을 불식시켰다.", # 5
135
+ "아무 일도 일어나지 않는다. 당신은 수상한 소문을 불식시켰다.", # 6
136
+ "아무 일도 일어나지 않는다. 당신은 수상한 소문을 불식시켰다.", # 7
137
+ "아무 일도 일어나지 않는다. 당신은 수상한 소문을 불식시켰다.", # 8
138
+ "아무 일도 일어나지 않는다. 당신은 수상한 소문을 불식시켰다.", # 9
139
+ "아무 일도 일어나지 않는다. 당신은 수상한 소문을 불식시켰다.", # 10
140
+ "이후 이벤트 종료 시까지 모든 판정 성공률 -10%.", # 11
141
+ "핀치! 이후 이벤트 종료 시까지 당신은 《지원》을 사용할 수 없다.", # 12
142
+ "배신!! 당신은 <경제> 판정을 한다. 실패한 경우 당신은 히어로로서의 명성을 잃고 [오명]을 뒤집어쓴다.", # 13
143
+ "이후 시나리오 종료 시까지 대가로 크레딧을 소비하는 파워를 사용할 수 없다.", # 14
144
+ "당신의 악평이 상당한 모양이다. 이후 시나리오 종료 시까지 모든 판정의 성공률 -20%.", # 15
145
+ "신뢰의 실추!! 당신은 <경제>-20% 판정을 한다. 실패한 경우 당신은 히어로로서의 명성을 잃고 [오명]을 뒤집어쓴다.", # 16
146
+ "이후 시나리오 종료 시까지 【환경】계열 기능의 레벨이 모두 0이 된다.", # 17
147
+ "날조 보도!! 저지른 적 없는 범죄에 대한 가담이 특종으로 보도된다. 당신은 <경제>-30% 판정을 한다. 실패한 경우 당신은 히어로로서의 명성을 잃고 [오명]을 뒤집어쓴다.", # 18
148
+ "이후 이벤트 종료 시까지 모든 판정의 성공률 -30%.", # 19
149
+ "당신의 이름은 사상 최악의 오점으로 영원히 역사에 기록된다. 더이상 당신을 믿는 동료는 없으며, 당신을 도와줄 사회도 없다. 당신은 [오명]을 뒤집어쓴다."] # 20
150
+ end
151
+ result_text = table[total] || "(결과 없음)"
152
+
153
+ "(#{type} 데스차트 > #{result_text}"
154
+ end
155
+
156
+ def hero_name_chart(command)
157
+ return nil unless command == "HNC"
158
+
159
+ combo_roll = @randomizer.roll_once(9)
160
+ combo_pattern = [
161
+ "베이스A+베이스B", "베이스B", "베이스B×2회", "베이스B+베이스C",
162
+ "베이스A+베이스B+베이스C", "베이스A+베이스B×2회",
163
+ "베이스B×2회+베이스C", "베이스B·오브·베이스B", "베이스B·더·베이스B"
164
+ ][combo_roll - 1]
165
+ base_a = get_from_table(:A)
166
+ base_b1 = get_from_table(:B)
167
+ base_b2 = get_from_table(:B)
168
+ base_c = get_from_table(:C)
169
+ result_name = case combo_roll
170
+ when 1 then "#{base_a}#{base_b1}"
171
+ when 2 then base_b1
172
+ when 3 then "#{base_b1}#{base_b2}"
173
+ when 4 then "#{base_b1}#{base_c}"
174
+ when 5 then "#{base_a}#{base_b1}#{base_c}"
175
+ when 6 then "#{base_a}#{base_b1}#{base_b2}"
176
+ when 7 then "#{base_b1}#{base_b2}#{base_c}"
177
+ when 8 then "#{base_b1}·오브·#{base_b2}"
178
+ when 9 then "#{base_b1}·더·#{base_b2}"
179
+ end
180
+ "히어로 네임 차트 > 조합식: #{combo_pattern} > 결과: #{result_name}"
181
+ end
182
+
183
+ # ========== [베이스 및 세부표] ==========
184
+ def get_from_table(type)
185
+ case type
186
+ when :A
187
+ roll = @randomizer.roll_once(10)
188
+ case roll
189
+ when 1 then "더·"
190
+ when 2 then "캡틴·"
191
+ when 3 then sample(["미스터·", "미스·", "미세스·"])
192
+ when 4 then sample(["닥터·", "프로페서·"])
193
+ when 5 then sample(["로드·", "바론·", "제네럴·"])
194
+ when 6 then "맨·오브·"
195
+ when 7 then get_from_table(:STR)
196
+ when 8 then get_from_table(:COLOR)
197
+ when 9 then sample(["마담·", "미들·"])
198
+ when 10 then @randomizer.roll_once(10).to_s
199
+ end
200
+
201
+ when :B
202
+ roll = @randomizer.roll_once(10)
203
+ case roll
204
+ when 1 then get_from_table(:MYTH)
205
+ when 2 then get_from_table(:WEAPON)
206
+ when 3 then get_from_table(:ANIMAL)
207
+ when 4 then get_from_table(:BIRD)
208
+ when 5 then get_from_table(:BUG)
209
+ when 6 then get_from_table(:BODY)
210
+ when 7 then get_from_table(:LIGHT)
211
+ when 8 then get_from_table(:ATTACK)
212
+ when 9 then get_from_table(:ETC)
213
+ when 10 then @randomizer.roll_once(10).to_s
214
+ end
215
+
216
+ when :C
217
+ roll = @randomizer.roll_once(10)
218
+ case roll
219
+ when 1 then sample(["맨", "우먼"])
220
+ when 2 then sample(["보이", "걸"])
221
+ when 3 then sample(["마스크", "후드"])
222
+ when 4 then "라이더"
223
+ when 5 then "마스터"
224
+ when 6 then sample(["파이터", "솔저"])
225
+ when 7 then sample(["킹", "퀸"])
226
+ when 8 then get_from_table(:COLOR)
227
+ when 9 then sample(["히어로", "스페셜"])
228
+ when 10 then @randomizer.roll_once(10).to_s
229
+ end
230
+
231
+ when :COLOR then sample(['블랙', '그린', '블루', '옐로', '레드', '바이올렛', '실버', '골드', '화이트', '클리어'])
232
+ when :WEAPON then sample(['나이브스', '소드', '해머', '건', '스틸', '터스크', '뉴', '애로', '소', '레이저'])
233
+ when :BODY then sample(['하트', '페이스', '암', '숄더', '헤드', '아이', '피스트', '핸드', '클로', '본'])
234
+ when :ATTACK then sample(['스트로크', '크래시', '블로', '히트', '펀치', '킥', '슬래시', '베네트레이트', '샷', '킬'])
235
+ when :MYTH then sample(['아포칼립스', '워', '이터널', '엔젤', '데블', '이모탈', '데스', '드림', '고스트', '데드'])
236
+ when :ANIMAL then sample(['버니', '타이거', '샤크', '캣', '콩', '도그', '폭스', '팬서', '애스', '배트'])
237
+ when :LIGHT then sample(['라이트', '섀도우', '파이어', '다크', '나이트', '팬텀', '토치', '플래시', '랜턴', '선'])
238
+ when :BIRD then sample(['호크', '팔콘', '캐너리', '로빈', '이글', '아울', '레이븐', '덕', '펭귄', '피닉스'])
239
+ when :ETC then sample(['휴먼', '에이전트', '부스터', '아이언', '선더', '워처', '풀', '머신', '콜드', '사이드'])
240
+ when :STR then sample(['슈퍼', '원더', '얼티밋', '판타스틱', '마이티', '인크레더블', '어메이징', '와일드', '그레이티스트', '마벨러스'])
241
+ when :BUG then sample(['비틀', '버터플라이', '스네이크', '엘리게이터', '로커스트', '리자드', '터틀', '스파이더', '앤트', '맨티스'])
242
+ end
243
+ end
244
+
245
+ def sample(array)
246
+ index = @randomizer.roll_once(array.size) - 1
247
+ array[index]
248
+ end
249
+
250
+ def real_name_chart_overseas(command)
251
+ return nil unless command == "RNCO"
252
+ return "무명(모종의 이유로 이름이 없다. 혹은 잃었다)" if @randomizer.roll_once(10) == 1
253
+
254
+ first_male = sample(['알버스', '크리스', '사뮤엘', '시드니', '스파이크', '데미안', '딕', '덴젤', '돈', '니콜라스', '네빌', '발리', '빌리', '브루스', '마브', '라이언'])
255
+ first_female = sample(['아이리스', '올리브', '카라', '킬스틴', '그웬', '사만사', '저스티나', '타바사', '나딘', '노엘', '할린', '마르셀라', '라나', '린디', '로잘리', '원더'])
256
+ last_name = sample(['알렌', '워큰', '울프먼', '오르센', '카터', '캐러딘', '지겔', '존스', '파커', '프리먼', '머피', '밀러', '무어', '리브', '레이놀즈', '워드'])
257
+
258
+ "이름(남):#{first_male}\n이름(여):#{first_female}\n성:#{last_name}"
259
+ end
260
+
261
+ def real_name_chart_jp(command)
262
+ return nil unless command == "RNCJ"
263
+ return "무명(모종의 이유로 이름이 없다. 혹은 잃었다)" if @randomizer.roll_once(10) == 1
264
+
265
+ last_name = sample(['아이카와', '아마미야', '이부키', '오가미', '카이', '사카키', '시시도', '타치바나', '츠부라야', '하야카와', '하라다', '후지카와', '호시', '미조구치', '야시다', '유우키'])
266
+ first_male = sample(['아키라', '에이지', '카즈키', '긴가', '켄이치로', '고우', '지로', '타케시', '츠바사', '테츠', '히데오', '마사무네', '야마토', '류세이', '레츠', '렌'])
267
+ first_female = sample(['안', '이노리', '에마', '카논', '사라', '시즈쿠', '치즈루', '나오미', '하루', '히카루', '베니', '마치', '미아', '유리코', '루이', '레나'])
268
+
269
+ "성:#{last_name}\n이름(남):#{first_male}\n이름(여):#{first_female}"
270
+ end
271
+ end
272
+ end
273
+ end
@@ -16,32 +16,36 @@ module BCDice
16
16
 
17
17
  # ダイスボットの使い方
18
18
  HELP_MESSAGE = <<~MESSAGETEXT
19
- ・행동판정(DRx+y)
19
+ ・행동 판정(DRx+y)
20
20
   x:굴리는 주사위의 수(생략시4), y:갈증수정(생략시0)
21
21
   예) DR DR6 DR+1 DR5+2
22
- ・저항판정(DRRx)
23
-  x:굴리는 주사위의
22
+
23
+ ・저항 판정(DRRx)
24
+  x:굴리는 주사위의 수
24
25
   예) DRR3
25
- ・原風景表(ST), 叙勲表(CO), 叙勲後表(CA), 遥か過去表(EP)
26
-  原罪表(OS), 受難表(PN), 近況表(RS), 平和な過去表(PP
26
+
27
+ ・원풍경 표(ST), 서훈 표(CO), 서훈 후 표(CA), 까마득한 과거 표(EP
28
+  원죄 표(OS), 수난 표(PN), 근황 표(RS), 평화로운 과거 표(PP)
27
29
  ・타락표(CTx) x:갈증(예) CT3
28
- ・타락의 전조표(CS), 拡張・堕落の兆し表(ECS)
29
- ・인연 내용 결정표(BT)
30
+ ・타락의 조짐표(CS), 확장·타락의 조짐표(ECS)
31
+ ・유대 내용 결정표(BT)
32
+
30
33
  ・반응표(RTxy)x:혈통, y:길 xy생략으로 일괄표시
31
-   혈통 D:드라크, R:로젠부르크, H:헬스가르드, M:더스트하임,
34
+   혈통 D:드라크, R:로젠부르크, H:헬즈가르드, M:더스트하임
32
35
       A:아발롬 N:노스페라스
33
-   길  F:영주, G:근위, R:방랑, W:현자, J:사냥꾼, N:야수
36
+   길  F:영주, G:근위, R:편력, W:현자, J:엽사, N:야수
37
+      E:장군, B:승정, H:공구(환기수), K:선장, L:총동(미동), V:중립, U:기사(공예사), D:박사
38
+      S:성독(별읽기), G2:후견
34
39
   예)RT(일괄표시), RTDF(드라크 영주), RTAN(아발롬 야수)
35
- ・異端の反応表(HRTxy)x:血統, y:道 xy省略で一括表示
36
-  血統 L:異端卿, V:ヴルコラク, N:ナハツェーラ, K:カルンシュタイン
37
-     G:グリマルキン, S:ストリガ, M:メリュジーヌ, F:フォーン
38
-     H:ホムンクルス, E:エナメルム, S2:サングィナリエ, A:アールヴ
39
-     V2:ヴィーヴル, L2:ルーガルー, A2:アルラウネ, F2:フリッガ
40
-  道 W:野伏, N:流浪, S:密使, H:魔女, F:剣士, X:検体
41
- ・D66 다이스 있음
42
- MESSAGETEXT
43
40
 
44
- register_prefix_from_super_class()
41
+ ・이단의 반응 표(HRTxy)x:혈통, y:길 xy생략으로 일괄표시
42
+  혈통 L:이단경, V:바르콜락, N:나흐체러, K:카른슈타인
43
+     G:그리말킨, S:스트리가, M:멜뤼진, F:폰
44
+     H:호문클루스, E:에나멜룸, S2:생귀나리에, A:알브
45
+     V2:뷔블, L2:루갈루, A2:알라우네, F2:프리가
46
+  길 W:야생, N:유랑, S:밀사, H:마녀, F:검사, X:검체(실험체)
47
+ ・D66 주사위 있음
48
+ MESSAGETEXT
45
49
 
46
50
  def initialize(command)
47
51
  super(command)
@@ -49,7 +53,9 @@ module BCDice
49
53
  @locale = :ko_kr
50
54
  end
51
55
 
52
- TABLES = translate_tables(:ko_kr)
56
+ TABLES = translate_tables(:ko_kr).freeze
57
+
58
+ register_prefix_from_super_class()
53
59
  end
54
60
  end
55
61
  end
@@ -14,17 +14,20 @@ module BCDice
14
14
 
15
15
  # ダイスボットの使い方
16
16
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
- ・攻撃ロール AT[x][@c][>=t][y]
17
+ ・攻撃ロール AT[x][@c][>=t][y][B]
18
18
   x:+-修正。省略可。
19
19
   c:クリティカル値。省略可。
20
20
   t:敵のアーマークラス。>=を含めて省略可。
21
21
   y:有利(A), 不利(D)。省略可。
22
+  B:ブレスやガイダンス等によるボーナス。省略可。
23
+   Bだけを書くと+1d4、B[1D4+1D8]などと書くと[]内のロールをボーナスとしてロールします。
22
24
   ファンブル/失敗/成功/クリティカル を自動判定。
23
25
   例)AT AT>=10 AT+5>=18 AT-3>=16 ATA AT>=10A AT+3>=18A AT-3>=16 ATD AT>=10D AT+5>=18D AT-5>=16D
24
-   AT@19 AT+5@18 AT-2@19>=15
25
- ・能力値判定 AR[x][>=t][y]
26
+   AT@19 AT+5@18 AT-2@19>=15 AT+3>=18AB AT+3>=18DB[1D6]
27
+ ・能力値判定 AR[x][>=t][y][b]
26
28
   攻撃ロールと同様。失敗/成功を自動判定。
27
29
   例)AR AR>=10 AR+5>=18 AR-3>=16 ARA AR>=10A AR+3>=18A AR-3>=16 ARD AR>=10D AR+5>=18D AR-5>=16D
30
+   AR+3>=18AB AR+3>=18DB[1D6]
28
31
  ・両手持ちのダメージ 2HnDx[m]
29
32
   n:ダイスの個数
30
33
   x:ダイスの面数
@@ -33,7 +36,7 @@ module BCDice
33
36
   例)2H3D6 2H1D10+3 2H2D8-1
34
37
  INFO_MESSAGE_TEXT
35
38
 
36
- register_prefix('AT([+-]\d+)?(@\d+)?(>=\d+)?[AD]?', 'AR([+-]\d+)?(>=\d+)?[AD]?', '2H(\d+)D(\d+)([+-]\d+)?')
39
+ register_prefix('AT', 'AR', '2H')
37
40
 
38
41
  def initialize(command)
39
42
  super(command)
@@ -55,32 +58,47 @@ module BCDice
55
58
  end
56
59
  end
57
60
 
58
- # 攻撃ロール
59
- def attack_roll(command)
60
- m = /^AT([-+]\d+)?(@(\d+))?(>=(\d+))?([AD]?)/.match(command)
61
+ # ロール処理
62
+ def exec_roll(command)
63
+ m = /^(AT|AR)([-+\d]+)?(@(\d+))?(>=(\d+))?([AD]?)6?(B(\[(\d+D\d+([-+]\d+D\d+)*)\])?)?/.match(command)
61
64
  unless m
62
65
  return nil
63
66
  end
64
67
 
65
- modify = m[1].to_i
66
- critical_no = m[3].to_i
67
- difficulty = m[5].to_i
68
- advantage = m[6]
68
+ modify = 0
69
+ mod_str = ""
70
+ unless m[2].nil?
71
+ if Arithmetic.eval(m[2], @round_type).nil?
72
+ return nil
73
+ else
74
+ modify = Arithmetic.eval(m[2], @round_type)
75
+ mod_str = number_with_sign_from_int(modify).to_s
76
+ end
77
+ end
78
+ critical_no = m[4].to_i
79
+ difficulty = m[6].to_i
80
+ advantage = m[7].to_s
81
+ bonus = m[8].to_s
82
+ bonus_dice = m[10].to_s
69
83
 
70
84
  usedie = 0
85
+ bonus_mod = 0
86
+ bonus_str = ""
87
+ bonus_mod_arr = []
71
88
  roll_die = ""
72
89
 
73
- dice_command = "AT#{number_with_sign_from_int(modify)}"
74
- if critical_no > 0
90
+ dice_command = "#{m[1]}#{number_with_sign_from_int(modify)}"
91
+ unless critical_no < 1
75
92
  dice_command += "@#{critical_no}"
76
- else
77
- critical_no = 20
78
93
  end
79
94
  if difficulty > 0
80
95
  dice_command += ">=#{difficulty}"
81
96
  end
82
97
  unless advantage.empty?
83
- dice_command += advantage.to_s
98
+ dice_command += advantage
99
+ end
100
+ unless bonus.empty?
101
+ dice_command += bonus
84
102
  end
85
103
 
86
104
  output = ["(#{dice_command})"]
@@ -96,32 +114,72 @@ module BCDice
96
114
  else
97
115
  usedie = dice.min
98
116
  end
117
+ roll_die = "#{usedie}#{roll_die}"
99
118
  end
100
119
 
101
- if modify != 0
102
- output.push("#{roll_die}#{number_with_sign_from_int(modify)}")
103
- output.push((usedie + modify).to_s)
104
- else
105
- unless advantage.empty?
106
- output.push(roll_die)
120
+ unless bonus.empty?
121
+ if bonus == "B"
122
+ bonus_mod = @randomizer.roll_once(4).to_i
123
+ bonus_str = number_with_sign_from_int(bonus_mod).to_s
124
+ else
125
+ unless bonus_dice.empty?
126
+ bonus_dice_arr = bonus_dice.gsub(/([+-])/, ",\\1").split(',')
127
+ bonus_dice_arr.each do |i|
128
+ now_bonus_dice = i.split("D")
129
+ now_dice_count = now_bonus_dice[0].to_i
130
+ now_dice_number = now_bonus_dice[1].to_i
131
+ dice = @randomizer.roll_barabara(now_dice_count.abs, now_dice_number)
132
+ if now_dice_count.positive?
133
+ bonus_mod_arr.push(dice.sum())
134
+ else
135
+ bonus_mod_arr.push(-dice.sum())
136
+ end
137
+ end
138
+ bonus_mod = bonus_mod_arr.sum()
139
+ bonus_str = "#{number_with_sign_from_int(bonus_mod)}[#{bonus_mod_arr.join(',')}]"
140
+ end
107
141
  end
108
- output.push(usedie.to_s)
142
+ end
143
+
144
+ output.push("#{roll_die}#{mod_str}#{bonus_str}")
145
+ unless mod_str.empty? && advantage.empty? && bonus.empty?
146
+ output.push((usedie + modify + bonus_mod).to_s)
147
+ end
148
+
149
+ return usedie, (usedie + modify + bonus_mod), difficulty, output
150
+ end
151
+
152
+ # 攻撃ロール
153
+ def attack_roll(command)
154
+ m = /^AT([-+\d]+)?(@(\d+))?(>=(\d+))?([AD]?)6?(B(\[(\d+D\d+([-+]\d+D\d+)*)\])?)?/.match(command)
155
+ unless m
156
+ return nil
157
+ end
158
+
159
+ critical_no = 20
160
+ unless m[3].nil?
161
+ critical_no = m[3].to_i
162
+ end
163
+
164
+ usedie, dice_result, difficulty, output = exec_roll(command)
165
+ if usedie.nil?
166
+ return nil
109
167
  end
110
168
 
111
169
  result = Result.new
112
170
  if usedie >= critical_no
113
171
  result.critical = true
114
172
  result.success = true
115
- output.push("クリティカル")
173
+ output.push(translate('critical'))
116
174
  elsif usedie == 1
117
175
  result.fumble = true
118
- output.push("ファンブル")
176
+ output.push(translate('fumble'))
119
177
  elsif difficulty > 0
120
- if usedie + modify >= difficulty
178
+ if dice_result >= difficulty
121
179
  result.success = true
122
- output.push("成功")
180
+ output.push(translate('success'))
123
181
  else
124
- output.push("失敗")
182
+ output.push(translate('failure'))
125
183
  end
126
184
  end
127
185
 
@@ -139,58 +197,23 @@ module BCDice
139
197
 
140
198
  # 能力値ロール
141
199
  def ability_roll(command)
142
- m = /^AR([-+]\d+)?(>=(\d+))?([AD]?)/.match(command)
200
+ m = /^AR([-+\d]+)?(>=(\d+))?([AD]?)6?(B(\[(\d+D\d+([-+]\d+D\d+)*)\])?)?/.match(command)
143
201
  unless m
144
202
  return nil
145
203
  end
146
204
 
147
- modify = m[1].to_i
148
- difficulty = m[3].to_i
149
- advantage = m[4]
150
-
151
- usedie = 0
152
- roll_die = ""
153
-
154
- dice_command = "AR#{number_with_sign_from_int(modify)}"
155
- if difficulty > 0
156
- dice_command += ">=#{difficulty}"
157
- end
158
- unless advantage.empty?
159
- dice_command += advantage.to_s
160
- end
161
-
162
- output = ["(#{dice_command})"]
163
-
164
- if advantage.empty?
165
- usedie = @randomizer.roll_once(20)
166
- roll_die = usedie
167
- else
168
- dice = @randomizer.roll_barabara(2, 20)
169
- roll_die = "[" + dice.join(",") + "]"
170
- if advantage == "A"
171
- usedie = dice.max
172
- else
173
- usedie = dice.min
174
- end
175
- end
176
-
177
- if modify != 0
178
- output.push("#{roll_die}#{number_with_sign_from_int(modify)}")
179
- output.push((usedie + modify).to_s)
180
- else
181
- unless advantage.empty?
182
- output.push(roll_die)
183
- end
184
- output.push(usedie.to_s)
205
+ usedie, dice_result, difficulty, output = exec_roll(command)
206
+ if usedie.nil?
207
+ return nil
185
208
  end
186
209
 
187
210
  result = Result.new
188
211
  if difficulty > 0
189
- if usedie + modify >= difficulty
212
+ if dice_result >= difficulty
190
213
  result.success = true
191
- output.push("成功")
214
+ output.push(translate('success'))
192
215
  else
193
- output.push("失敗")
216
+ output.push(translate('failure'))
194
217
  end
195
218
  end
196
219
 
@@ -208,15 +231,25 @@ module BCDice
208
231
 
209
232
  # 武器の両手持ちダメージ
210
233
  def twohands_damage_roll(command)
211
- m = /^2H(\d+)D(\d+)([+-]\d+)?/.match(command)
234
+ m = /^2H(\d+)D(\d+)([-+\d]+)?/.match(command)
212
235
  unless m
213
236
  return nil
214
237
  end
215
238
 
216
239
  dice_count = m[1].to_i
217
240
  dice_number = m[2].to_i
218
- modify = m[3].to_i
219
- mod_str = number_with_sign_from_int(modify)
241
+
242
+ modify = 0
243
+ mod_str = ""
244
+ unless m[3].nil?
245
+ if Arithmetic.eval(m[3], @round_type).nil?
246
+ return nil
247
+ else
248
+ modify = Arithmetic.eval(m[3], @round_type)
249
+ mod_str = number_with_sign_from_int(modify).to_s
250
+ end
251
+ end
252
+
220
253
  output = ["(2H#{dice_count}D#{dice_number}#{mod_str})"]
221
254
 
222
255
  dice = @randomizer.roll_barabara(dice_count, dice_number)
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/game_system/DungeonsAndDragons5"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class DungeonsAndDragons5_Korean < DungeonsAndDragons5
8
+ # ゲームシステムの識別子
9
+ ID = 'DungeonsAndDragons5:Korean'
10
+
11
+ # ゲームシステム名
12
+ NAME = '던전 앤 드래곤 5판'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Korean:던전 앤 드래곤 5판'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
+ ・명중 굴림 AT[x][@c][>=t][y]
20
+  x: +- 수정치 (생략 가능)
21
+  c: 크리티컬 수치 (생략 가능)
22
+  t: 목표 AC (>= 포함, 생략 가능)
23
+  y: 유리(A), 불리(D) (생략 가능)
24
+  B: 브레스나 가이던스 등의 보너스 (생략 가능)
25
+  ※보충 설명: B만 입력하면 +1d4를, B[1D4+1D8] 와 같이 입력하면 []안의 주사위를 추가로 굴립니다.
26
+
27
+
28
+  펌블/실패/성공/크리티컬을 자동으로 판정합니다.
29
+  예시)AT AT>=10 AT+5>=18 AT-3>=16 ATA AT>=10A AT+3>=18A AT-3>=16 ATD AT>=10D AT+5>=18D AT-5>=16D
30
+   AT@19 AT+5@18 AT-2@19>=15
31
+
32
+ ・능력 판정 AR[x][>=t][y]
33
+  명중 굴림과 동일. 성공/실패 결과를 자동 판정합니다.
34
+  예시)AR AR>=10 AR+5>=18 AR-3>=16 ARA AR>=10A AR+3>=18A AR-3>=16 ARD AR>=10D AR+5>=18D AR-5>=16D
35
+
36
+ ・대형 무기 전투술 대미지 계산(베이직 룰북 32p) 2HnDx[m]
37
+  n: 주사위 개수
38
+  x: 주사위 면수(1d6의 6, 1d8의 8 등)
39
+  m: +- 수정치 (생략 가능)
40
+  팔라딘과 파이터의 무기를 양손으로 사용할 경우, 대미지 주사위에서 1 또는 2가 나오면 다시 굴립니다.
41
+  예시)2H3D6 2H1D10+3 2H2D8-1
42
+ INFO_MESSAGE_TEXT
43
+
44
+ register_prefix_from_super_class()
45
+
46
+ def initialize(command)
47
+ super(command)
48
+
49
+ @locale = :ko_kr # i18n ko_kr 참조
50
+ end
51
+ end
52
+ end
53
+ end