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,27 @@
1
+ ja_jp:
2
+ ZombiLine:
3
+ success_critical: "成功(クリティカル)"
4
+ success_fumble: "成功(ファンブル)"
5
+ success: "成功"
6
+ failure_fumble: "失敗(ファンブル)"
7
+ failure: "失敗"
8
+ SST:
9
+ name: "ストレス症状表"
10
+ type: "1D10"
11
+ items:
12
+ - '憤怒:一番近い敵を攻撃(成功率+20%)しにいきます。近くに敵がいない場合、誰かのストレスを+1させます。 頭に血が上り、誰かに怒りをぶつけます。'
13
+ - '逃避:落下してでも敵から逃げるように移動します。周囲に敵が居ない場合、現実逃避します。 耐えられなくなり、逃げ出します。'
14
+ - '幻覚:戦闘中は、「行動放棄(全AP)」します。戦闘以外なら、幻覚を見て笑います。 自分が望む幻覚が見えます。'
15
+ - '絶叫:戦闘中は、「注目を集める(2AP)」をします。戦闘以外なら、無意味に叫びます。 思わず叫んでしまいます。'
16
+ - '自傷:自ら【怪我】を負います。戦闘中は「自傷行為(1AP)」をして自分が【怪我】します。 思わず自分を傷つけます。'
17
+ - '不安:誰かのストレスを1上げます。近くに誰も居ない場合、泣き出します。 不安にかられて余計なことを言います。'
18
+ - '忌避:その場から一番近い対象に「石(1AP)」を投げます。それができない場合、【転倒】してうずくまります。 嫌悪感から全てを拒みます。'
19
+ - '暴走:一番近い敵を攻撃しにいきます。近くに敵がいない場合、周りの意見も聞かずに安直な行動をします。 冷静でいられなくなり、直情的になります。'
20
+ - '混乱:近くにいるランダムな対象に格闘で攻撃しにいきます。それができない場合、「行動放棄(全 AP)」します。 世界全てが敵に見えて攻撃します。'
21
+ - '開眼:ストレスは0まで下がります。あなたは教祖となって教義をひとつつくって「布教」できます。次の症状が出るまで効果は続きます。 ゾンビだらけの世界の真理を見つけます。'
22
+ IT:
23
+ name: "食材表"
24
+ items:
25
+ raw: '生モノ食材'
26
+ suspicious: '怪しい食材'
27
+ dangerous: '危ない食材'
@@ -0,0 +1,27 @@
1
+ ko_kr:
2
+ ZombiLine:
3
+ success_critical: "성공(크리티컬)"
4
+ success_fumble: "성공(펌블)"
5
+ success: "성공"
6
+ failure_fumble: "실패(펌블)"
7
+ failure: "실패"
8
+ SST:
9
+ name: "스트레스 증상표"
10
+ type: "1D10"
11
+ items:
12
+ - '[분노] 가장 가까이 있는 적을 공격(성공률 +20%)합니다. 가까이 적이 없는 경우, 누군가의 스트레스를 +1시킵니다. / 설명: 머리에 피가 몰려 누군가에게 화를 터트립니다.'
13
+ - '[도피] 낙하하더라도 적에게서 도망치려 이동합니다. 주변에 적이 없는 경우, 현실도피를 하려 합니다. / 설명: 견딜 수 없게 되어 도망칩니다.'
14
+ - '[환상] 전투 중에는 「행동방치(전AP)」를 합니다. 전투 이외의 경우, 환상을 보며 웃음을 흘립니다. / 설명: 자신이 꿈꾸는 환상을 봅니다.'
15
+ - '[절규] 전투 중에는 비명을 지르며 「주목을 모은다(2AP)」를 합니다. 전투 이외의 경우, 무의미한 소리를 지릅니다. / 설명: 생각없이 비명을 지릅니다.'
16
+ - '[자해] 스스로 【상처】를 입습니다. 전투 중에는 「자해행위(1AP)」로 스스로에게 【상처】를 입힙니다. / 설명: 생각없이 자신에게 상처를 입힙니다.'
17
+ - '[불안] 누군가의 스트레스를 1 올립니다. 근처에 아무도 없는 경우, 울음을 터트립니다. / 설명: 불안해져 쓸데없는 말을 지껄입니다.'
18
+ - '[기피] 그 자리에서 가장 가까이 있는 대상에게 「돌(1AP)」을 던집니다. 그게 불가능한 경우, 【넘어짐】상태가 됩니다. / 설명: 혐오감으로 모든 것을 거부합니다.'
19
+ - '[폭주] 가장 가까이 있는 적에게 공격을 가합니다. 가까이 적이 없는 경우 주변의 의견을 듣지 않고 제멋대로 행동을 합니다. / 설명: 냉정을 찾지 못하고 제멋대로 행동합니다.'
20
+ - '[혼란] 가까이 있는 무작위 대상에게 격투로 공격을 가합니다. 그게 불가능한 경우 「행동방치(전AP)」를 합니다. / 설명: 세상 모든 것이 적으로 보여 공격합니다.'
21
+ - '[개안] 스트레스가 0까지 떨어집니다. 당신은 교조가 되어 교의를 한가지 정해 「포교」할 수 있습니다. 다음 증상이 나올 때까지 효과가 지속됩니다. / 설명: 좀비투성이 세상의 진리를 보았습니다.'
22
+ IT:
23
+ name: "식재료 표"
24
+ items:
25
+ raw: '신선 식재료'
26
+ suspicious: '수상한 식재료'
27
+ dangerous: '위험한 식재료'
data/i18n/ko_kr.yml CHANGED
@@ -1,7 +1,9 @@
1
1
  ko_kr:
2
2
  success: 성공
3
3
  failure: 실패
4
+ critical: 크리티컬
4
5
  fumble: 펌블
5
6
  RTT:
6
7
  rtt_format: '랜덤 특기 결정표(%<category_dice>d,%<row_dice>d) > %<text>s'
7
8
  rttn_format: '지정특기(%<category_name>s)표(%<row_dice>d) > %<text>s'
9
+ rct_format: '랜덤 분야표(%<category_dice>d) > %<category_name>s'
data/i18n/zh_hant.yml CHANGED
@@ -4,5 +4,5 @@ zh_hant:
4
4
  fumble: 大失敗
5
5
  critical: 大成功
6
6
  RTT:
7
- rtt_format: "隨機特技表(%<category_dice>d,%<row_dice>d) > %<text>s"
8
- rttn_format: "%<category_name>s領域隨機特技表(%<row_dice>d) > %<text>s"
7
+ rtt_format: "隨機特技表(%<category_dice>d,%<row_dice>d) > %<text>s"
8
+ rttn_format: "%<category_name>s領域隨機特技表(%<row_dice>d) > %<text>s"
@@ -6,6 +6,27 @@ module BCDice
6
6
  module DiceTable
7
7
  # 左側(十の位)のみ Range を用いる D66 表
8
8
  class D66LeftRangeTable < D66Table
9
+ class << self
10
+ def from_i18n(key, locale)
11
+ table = I18n.t(key, locale: locale)
12
+ converted_items = table[:items].map do |item|
13
+ [conv_string_range(item[0]), item[1]]
14
+ end
15
+ new(table[:name], table[:d66_sort_type], converted_items)
16
+ end
17
+
18
+ def conv_string_range(x)
19
+ if x.include?("..")
20
+ return Range.new(*x.split("..", 2).map { |n| Integer(n) })
21
+ end
22
+
23
+ raise(
24
+ ArgumentError,
25
+ "invalid format"
26
+ )
27
+ end
28
+ end
29
+
9
30
  # @param name [String] 表の名前
10
31
  # @param sort_type [Symbol] 出目入れ替えの方式 BCDice::D66SortType
11
32
  # @param items [Array<(Range, Array<String>)>] 表の項目の配列
@@ -17,29 +17,43 @@ module BCDice
17
17
  AB{n}>={dif} n=10面ダイスの数、dif=難易度
18
18
  - 技能判定(クリティカル・ファンブルあり)
19
19
  ABT{n}>={dif} n=10面ダイスの数、dif=難易度
20
+ - ダメージチェック
21
+ DMG>={dif} dif=ダメージ難易度
20
22
 
21
- 例:AB2>=5 (一般技能を活用して難易度5の技能判定。 クリファンなし。)
22
- 例:ABT3>=15 (専門技能を活用して難易度15の技能判定。クリファンあり。)
23
- 例:AB1+2>=8 (一般技能を活用せず難易度8の技能判定。 ボーナスとして+2点の補正あり。 クリファンなし。)
24
- 例:ABT3-3>=10 (専門技能を活用して難易度10の技能判定。ペナルティとして-3点の補正あり。クリファンあり。)
25
- 例:ABT2>=4/8/12 (一般技能を活用して難易度4/8/12の段階的な技能判定。クリファンあり。)
23
+ 技能判定、ダメージチェックともにダイス結果、難易度に対して四則演算(+ - * /)を用いた複数ボーナスを含めることが可能です。計算結果の小数は切り捨てられます。
24
+
25
+ 例:AB2>=5 (一般技能を活用して難易度5の技能判定。 クリファンなし。)
26
+ 例:ABT3>=15 (専門技能を活用して難易度15の技能判定。クリファンあり。)
27
+ 例:AB1+1+2>=8 (一般技能を活用せず難易度8の技能判定。 ボーナスとして+1と+2点の補正あり。 クリファンなし。)
28
+ 例:ABT3-3>=10+2 (専門技能を活用して難易度10+2の技能判定。ペナルティとして-3点の補正あり。クリファンあり。)
29
+ 例:ABT2>=4/8/12 (一般技能を活用して難易度4/8/12の段階的な技能判定。クリファンあり。)
30
+ 例:DMG>=50 (難易度50の判定。)
31
+ 例:DMG>=20+50 (難易度20+50の判定。)
26
32
  INFO_MESSAGE_TEXT
27
33
 
28
- register_prefix('ABT?\d+([\+\-]\d+)?>=\d+(\/\d+)*')
34
+ register_prefix('ABT?', 'DMG')
29
35
 
30
36
  def eval_game_system_specific_command(command)
31
- return roll_skills(command)
37
+ return roll_skills(command) || roll_damage_check(command)
32
38
  end
33
39
 
34
40
  def roll_skills(command)
35
- m = %r{AB(T?)(\d+)([+-]\d+)?>=((\d+)((/\d+)*))}.match(command)
41
+ m = %r{^AB(T?)(\d+)((?:[-+]\d+)*)>=(\d+(?:/\d+)*)((?:[-+]\d+)*)$}.match(command)
36
42
  return nil unless m
37
43
 
38
44
  # 値の取得
39
45
  use_cf = m[1] != ''
40
46
  times = m[2].to_i
41
- bonus = m[3].to_i
42
- targets = m[4].split('/').map(&:to_i)
47
+
48
+ # 値の計算
49
+ bonus = m[3] != '' ? Arithmetic.eval(m[3], RoundType::FLOOR) : 0
50
+ return nil unless bonus
51
+
52
+ base_targets = m[4].split('/').map(&:to_i)
53
+ target_bonus = m[5] != '' ? Arithmetic.eval(m[5], RoundType::FLOOR) : 0
54
+ return nil unless target_bonus
55
+
56
+ targets = base_targets.map { |t| t + target_bonus }
43
57
  target = targets[0]
44
58
  min_target = targets.min
45
59
  max_target = targets.max
@@ -107,15 +121,8 @@ module BCDice
107
121
  end
108
122
 
109
123
  # ボーナスがある場合の処理
110
- bonus_text = ''
111
- bonus_result = ''
112
- if bonus != 0
113
- if bonus > 0
114
- bonus_text = "+"
115
- end
116
- bonus_text += bonus.to_s
117
- bonus_result = "#{total} > "
118
- end
124
+ bonus_text = m[3]
125
+ bonus_result = m[3] == '' ? '' : "#{total} > "
119
126
 
120
127
  # Resultクラスに結果を入れる
121
128
  Result.new.tap do |r|
@@ -126,6 +133,48 @@ module BCDice
126
133
  r.failure = !is_success
127
134
  end
128
135
  end
136
+
137
+ def roll_damage_check(command)
138
+ parser = Command::Parser.new("DMG", round_type: BCDice::RoundType::FLOOR).restrict_cmp_op_to(:>=)
139
+ parsed = parser.parse(command)
140
+ return nil unless parsed
141
+
142
+ # 値の計算
143
+ dif = parsed.target_number
144
+ return nil unless dif
145
+
146
+ # ダイスロール
147
+ dice_result = @randomizer.roll_once(100)
148
+
149
+ # Result用変数宣言
150
+ is_success = false
151
+
152
+ # 結果判定
153
+ if dice_result < (dif / 5)
154
+ is_success = false
155
+ second_result = @randomizer.roll_once(100)
156
+ if second_result >= dif
157
+ result_str = "失敗 > 弱点追加 > #{second_result} > 戦闘不能状態"
158
+ else
159
+ result_str = "失敗 > 弱点追加 > #{second_result} > 死亡状態"
160
+ end
161
+ elsif dice_result < (dif / 2)
162
+ result_str = "失敗 > 弱点追加 > 戦闘不能状態"
163
+ is_success = false
164
+ elsif dice_result < dif
165
+ result_str = "失敗 > 戦闘不能状態"
166
+ is_success = false
167
+ else
168
+ result_str = "成功"
169
+ is_success = true
170
+ end
171
+
172
+ Result.new.tap do |r|
173
+ r.text = "(#{command}) > #{dice_result} > #{result_str}"
174
+ r.success = is_success
175
+ r.failure = !is_success
176
+ end
177
+ end
129
178
  end
130
179
  end
131
180
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "bcdice/base"
4
+
3
5
  module BCDice
4
6
  module GameSystem
5
7
  class Airgetlamh < Base
@@ -41,9 +43,7 @@ module BCDice
41
43
  ・15AAx4c0 → 15d10で目標値6、威力4、クリティカル無しの命中判定。
42
44
  MESSAGETEXT
43
45
 
44
- register_prefix(
45
- '\d*A[AL]'
46
- )
46
+ register_prefix('\d*A[AL]')
47
47
 
48
48
  def initialize(command)
49
49
  super(command)
@@ -51,64 +51,87 @@ module BCDice
51
51
  end
52
52
 
53
53
  def eval_game_system_specific_command(command)
54
- # AA/ALコマンド:調査判定, 成功判定
55
- if command =~ /(\d+)?A(A|L)(\d+)?((x|\*)(\d+)(\+(\d+))?)?(C(\d+))?$/i
56
- diceCount = (Regexp.last_match(1) || 2).to_i
57
- target = (Regexp.last_match(3) || 6).to_i
58
- damage = (Regexp.last_match(6) || 0).to_i
59
-
60
- if Regexp.last_match(2) == 'L' # 旧Ver対応
61
- criticalTrigger = 0
62
- criticalNumber = 0
63
- else
64
- criticalTrigger = (Regexp.last_match(8) || 0).to_i
65
- criticalNumber = (Regexp.last_match(10) || 1).to_i
66
- end
67
- criticalNumber = 3 if criticalNumber > 4
68
-
69
- return checkRoll(diceCount, target, damage, criticalTrigger, criticalNumber)
54
+ check_roll(command)
55
+ end
56
+
57
+ private
58
+
59
+ def parse_check_roll(command)
60
+ m = /(\d+)?A(A|L)(\d+)?(?:[X*](\d+)(?:\+(\d+))?)?(?:C(\d+))?$/i.match(command)
61
+ unless m
62
+ return nil
70
63
  end
71
64
 
72
- return nil
65
+ dice_count = m[1]&.to_i || 2
66
+ target = m[3]&.to_i || 6
67
+ damage = m[4].to_i
68
+ critical_trigger = m[5].to_i
69
+ critical_number = m[6]&.to_i || 1
70
+
71
+ if m[2] == "L"
72
+ critical_trigger = 0
73
+ critical_number = 0
74
+ elsif critical_number > 4
75
+ critical_number = 3
76
+ end
77
+
78
+ return {
79
+ dice_count: dice_count,
80
+ target: target,
81
+ damage: damage,
82
+ critical_trigger: critical_trigger,
83
+ critical_number: critical_number,
84
+ }
73
85
  end
74
86
 
75
- def checkRoll(diceCount, target, damage, criticalTrigger, criticalNumber)
76
- totalSuccessCount = 0
77
- totalCriticalCount = 0
87
+ def check_roll(command)
88
+ parsed = parse_check_roll(command)
89
+ unless parsed
90
+ return nil
91
+ end
92
+
93
+ dice_count = parsed[:dice_count]
94
+ target = parsed[:target]
95
+ damage = parsed[:damage]
96
+ critical_trigger = parsed[:critical_trigger]
97
+ critical_number = parsed[:critical_number]
98
+
99
+ total_success_count = 0
100
+ total_critical_count = 0
78
101
  text = ""
79
102
 
80
- rollCount = diceCount
103
+ roll_count = dice_count
81
104
 
82
- while rollCount > 0
83
- diceArray = @randomizer.roll_barabara(rollCount, 10).sort
84
- diceText = diceArray.join(",")
105
+ while roll_count > 0
106
+ dice_array = @randomizer.roll_barabara(roll_count, 10).sort
107
+ dice_text = dice_array.join(",")
85
108
 
86
- successCount = diceArray.count { |i| i <= target }
87
- criticalCount = diceArray.count { |i| i <= criticalNumber }
109
+ success_count = dice_array.count { |i| i <= target }
110
+ critical_count = dice_array.count { |i| i <= critical_number }
88
111
 
89
- totalSuccessCount += successCount
90
- totalCriticalCount += criticalCount
112
+ total_success_count += success_count
113
+ total_critical_count += critical_count
91
114
 
92
115
  text += "+" unless text.empty?
93
- text += "#{successCount}[#{diceText}]"
116
+ text += "#{success_count}[#{dice_text}]"
94
117
 
95
- rollCount = criticalCount
118
+ roll_count = critical_count
96
119
  end
97
120
 
98
121
  result = ""
99
- isDamage = (damage != 0)
122
+ is_damage = (damage != 0)
100
123
 
101
- if isDamage
102
- totalDamage = totalSuccessCount * damage + totalCriticalCount * criticalTrigger
124
+ if is_damage
125
+ total_damage = total_success_count * damage + total_critical_count * critical_trigger
103
126
 
104
- result += "(#{diceCount}D10\<\=#{target}) > #{text} > Hits:#{totalSuccessCount}*#{damage}"
105
- result += " + Trigger:#{totalCriticalCount}*#{criticalTrigger}" if criticalTrigger > 0
106
- result += " > #{totalDamage}ダメージ"
127
+ result += "(#{dice_count}D10\<\=#{target}) > #{text} > Hits:#{total_success_count}*#{damage}"
128
+ result += " + Trigger:#{total_critical_count}*#{critical_trigger}" if critical_trigger > 0
129
+ result += " > #{translate('Airgetlamh.damage', count: total_damage)}"
107
130
  else
108
- result += "(#{diceCount}D10\<\=#{target}) > #{text} > 成功数:#{totalSuccessCount}"
131
+ result += "(#{dice_count}D10\<\=#{target}) > #{text} > #{translate('Airgetlamh.success_count', count: total_success_count)}"
109
132
  end
110
133
 
111
- result += " / #{totalCriticalCount}クリティカル" if totalCriticalCount > 0
134
+ result += " / #{translate('Airgetlamh.critical', count: total_critical_count)}" if total_critical_count > 0
112
135
 
113
136
  return result
114
137
  end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/game_system/Airgetlamh"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class Airgetlamh_Korean < Airgetlamh
8
+ # ゲームシステムの識別子
9
+ ID = 'Airgetlamh:Korean'
10
+
11
+ # ゲームシステム名
12
+ NAME = '붉은 고탑의 에어게트람'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Korean:붉은 고탑의 에어게트람'
16
+
17
+ HELP_MESSAGE = <<~MESSAGETEXT
18
+ 【Reg2.0『THE ANSWERER』~】
19
+ ・조사 판정(성공 수 표시):[n]AA[m]
20
+ ・명중 판정(대미지 표시):[n]AA[m]*p[+t][Cx]
21
+ 【~Reg1.1『승화(昇華)』】
22
+ ・조사 판정(성공 수 표시):[n]AL[m]
23
+ ・명중 판정(대미지 표시):[n]AL[m]*p
24
+ ----------------------------------------
25
+ []안의 커맨드는 생략 가능.
26
+
27
+ 「n」으로 주사위 수(공격 횟수)지정. 생략 시「2」.
28
+ 「m」으로 목표값 지정. 생략 시「6」.
29
+ 「p」으로 위력 지정.「*」는「x」로 대체 가능.
30
+ 「+t」으로 크리티컬 트리거 지정. 생략 가능.
31
+ 「Cx」으로 크리티컬 값 지정. 생략 시「1」, 최대값「3」,「0」은 크리티컬 없음.
32
+
33
+ 공격력 지정으로 명중 판정이 되며, 성공 수가 아닌 대미지를 결과로 표시합니다.
34
+ 크리티컬 히트 수만큼 자동으로 추가 굴림 처리를 합니다.
35
+ (AL 커맨드에서는 크리티컬 처리를 하지 않습니다)
36
+
37
+ 【사용 예시】
38
+ ・AL → 2d10으로 목표값 6의 조사 판정.
39
+ ・5AA7*12 → 5d10으로 목표값 7, 위력 12의 명중 판정.
40
+ ・AA7x28+5 → 2d10으로 목표값 7, 위력 28, 크리티컬 트리거 5의 명중 판정.
41
+ ・9aa5*10C2 → 9d10으로 목표값 5, 위력 10, 크리티컬 값 2의 명중 판정.
42
+ ・15AAx4c0 → 15d10으로 목표값 6, 위력 4, 크리티컬 없음의 명중 판정.
43
+ MESSAGETEXT
44
+
45
+ register_prefix_from_super_class()
46
+
47
+ def initialize(command)
48
+ super(command)
49
+ @locale = :ko_kr
50
+ end
51
+ end
52
+ end
53
+ end
@@ -45,76 +45,89 @@ module BCDice
45
45
  end
46
46
 
47
47
  def eval_game_system_specific_command(command)
48
- # ALCコマンド:命中判定
49
- # ALCコマンド:成功判定
50
- if command =~ /(\d+)AL(C|G)?(\d+)?((x|\*)(\d+))?$/i
51
- rapid = Regexp.last_match(1).to_i
52
- isCritical = Regexp.last_match(2).nil?
53
- if isCritical
54
- criticalNumber = 1
55
- else
56
- if Regexp.last_match(2) == "G"
57
- isCritical = true
58
- criticalNumber = 2
59
- else
60
- criticalNumber = 0
61
- end
62
- end
63
- target = (Regexp.last_match(3) || 3).to_i
64
- damage = (Regexp.last_match(6) || 0).to_i
65
- return checkRoll(rapid, target, damage, isCritical, criticalNumber)
48
+ check_roll(command)
49
+ end
50
+
51
+ private
52
+
53
+ def parse_check_roll(command)
54
+ m = /(\d+)AL(C|G)?(\d+)?((x|\*)(\d+))?$/i.match(command)
55
+ unless m
56
+ return nil
66
57
  end
67
58
 
68
- return nil
59
+ rapid = m[1].to_i
60
+ enable_critical = m[2].nil? || m[2] == "G"
61
+ critical_number =
62
+ case m[2]
63
+ when "G"
64
+ 2
65
+ when "C"
66
+ 0
67
+ else
68
+ 1
69
+ end
70
+ target = m[3]&.to_i || 3
71
+ damage = m[6].to_i
72
+
73
+ return {
74
+ rapid: rapid,
75
+ enable_critical: enable_critical,
76
+ critical_number: critical_number,
77
+ target: target,
78
+ damage: damage,
79
+ }
69
80
  end
70
81
 
71
- def checkRoll(rapid, target, damage, isCritical, criticalNumber)
72
- totalSuccessCount = 0
73
- totalCriticalCount = 0
74
- text = ""
75
-
76
- rollCount = rapid
82
+ def check_roll(command)
83
+ parsed = parse_check_roll(command)
84
+ unless parsed
85
+ return nil
86
+ end
77
87
 
78
- while rollCount > 0
79
- diceArray = @randomizer.roll_barabara(rollCount, 6).sort
80
- diceText = diceArray.join(",")
88
+ rapid = parsed[:rapid]
89
+ enable_critical = parsed[:enable_critical]
90
+ critical_number = parsed[:critical_number]
91
+ target = parsed[:target]
92
+ damage = parsed[:damage]
81
93
 
82
- successCount = 0
83
- criticalCount = 0
94
+ total_success_count = 0
95
+ total_critical_count = 0
96
+ text = ""
84
97
 
85
- diceArray.each do |i|
86
- if i <= target
87
- successCount += 1
88
- end
98
+ roll_count = rapid
89
99
 
90
- if i <= criticalNumber
91
- criticalCount += 1
92
- end
93
- end
100
+ while roll_count > 0
101
+ dice_array = @randomizer.roll_barabara(roll_count, 6).sort
102
+ dice_text = dice_array.join(",")
94
103
 
95
- totalSuccessCount += successCount
96
- totalCriticalCount += 1 unless criticalCount == 0
104
+ success_count = dice_array.count { |v| v <= target }
105
+ critical_count = dice_array.count { |v| v <= critical_number }
106
+ total_success_count += success_count
107
+ total_critical_count += 1 if critical_count > 0
97
108
 
98
109
  text += "+" unless text.empty?
99
- text += "#{successCount}[#{diceText}]"
110
+ text += "#{success_count}[#{dice_text}]"
100
111
 
101
- break unless isCritical
112
+ break unless enable_critical
102
113
 
103
- rollCount = criticalCount
114
+ roll_count = critical_count
104
115
  end
105
116
 
106
- isDamage = (damage != 0)
117
+ is_damage = (damage != 0)
107
118
 
108
- if isDamage
109
- totalDamage = totalSuccessCount * damage
119
+ if is_damage
120
+ total_damage = total_success_count * damage
110
121
 
111
- result = "(#{rapid}D6\<\=#{target}) > #{text} > Hits:#{totalSuccessCount}*#{damage} #{totalDamage}ダメージ"
122
+ damage_text = translate("Alsetto.damage", total_damage: total_damage)
123
+ result = "(#{rapid}D6\<\=#{target}) > #{text} > Hits:#{total_success_count}*#{damage} > #{damage_text}"
112
124
  else
113
- result = "(#{rapid}D6\<\=#{target}) #{text} > 成功数:#{totalSuccessCount}"
125
+ success_text = translate("Alsetto.success_count", success_count: total_success_count)
126
+ result = "(#{rapid}D6\<\=#{target}) > #{text} > #{success_text}"
114
127
  end
115
128
 
116
- if isCritical
117
- result += " / #{totalCriticalCount}トライアンフ"
129
+ if enable_critical
130
+ result += translate("Alsetto.triumph", critical_count: total_critical_count)
118
131
  end
119
132
 
120
133
  return result
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/game_system/Alsetto'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class Alsetto_Korean < Alsetto
8
+ # ゲームシステムの識別子
9
+ ID = 'Alsetto:Korean'
10
+
11
+ # ゲームシステム名
12
+ NAME = '시편의 알세토'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Korean:시편의 알세토'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~MESSAGETEXT
19
+ ・성공 판정:nAL[m]    ・트라이엄프 없음:nALC[m]
20
+ ・명중 판정:nAL[m]*p   ・트라이엄프 없음:nALC[m]*p
21
+ ・명중 판정(건슬링거의 근원시):nALG[m]*p
22
+ [] 내부는 생략 가능.
23
+
24
+ AL 커맨드는 트라이엄프 수만큼, 자동으로 추가 주사위 굴림 처리를 수행합니다.
25
+ 「n」으로 주사위 수를 지정.
26
+ 「m」으로 목표치를 지정. 생략 시에는 기본값인 「3」이 사용됩니다.
27
+ 「p」로 공격력을 지정. 「*」 대신 「x」도 사용 가능.
28
+ 공격력을 지정하면 명중 판정이 되며, 성공수가 아닌 대미지를 결과로 표시합니다.
29
+
30
+ ALC 커맨드는 트라이엄프 없이 성공수, 대미지를 결과로 표시합니다.
31
+ ALG 커맨드는 「2 이하」에서 트라이엄프 처리를 수행합니다.
32
+
33
+ 【사용 예시】
34
+ ・5AL → 5d6에서 목표치 3.
35
+ ・5ALC → 5d6에서 목표치 3. 트라이엄프 없음.
36
+ ・6AL2 → 6d6에서 목표치 2.
37
+ ・4AL*5 → 4d6에서 목표치 3, 공격력 5의 명중 판정.
38
+ ・7AL2x10 → 7d6에서 목표치 2, 공격력 10의 명중 판정.
39
+ ・8ALC4x5 → 8d6에서 목표치 4, 공격력 5, 트라이엄프 없는 명중 판정.
40
+ MESSAGETEXT
41
+
42
+ register_prefix_from_super_class()
43
+
44
+ def initialize(command)
45
+ super(command)
46
+
47
+ @locale = :ko_kr
48
+ end
49
+ end
50
+ end
51
+ end