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,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/dice_table/chain_table"
4
+ require "bcdice/dice_table/sai_fic_skill_table"
5
+ require "bcdice/dice_table/table"
6
+ require "bcdice/format"
7
+ require "bcdice/game_system/StarryDolls"
8
+
9
+ module BCDice
10
+ module GameSystem
11
+ class StarryDolls_Korean < StarryDolls
12
+ # ゲームシステムの識別子
13
+ ID = "StarryDolls:Korean"
14
+
15
+ # ゲームシステム名
16
+ NAME = "스타리돌"
17
+
18
+ # ゲームシステム名の読みがな
19
+ SORT_KEY = "国際化:Korean:스타리돌"
20
+
21
+ # ダイスボットの使い方
22
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
23
+ ・행위판정 nD6±m@s>=t
24
+  nD6의 행위판정을 실행합니다. 스페셜/펌블/성공/실패를 판정합니다.
25
+   n: 주사위 수
26
+   m: 수정치 (생략 가능)
27
+   s: 스페셜값 (생략 시 12)
28
+   t: 목표치 (?지정 가능)
29
+ ・각종 표
30
+  ・랜덤 특기 결정표 RTTn (n:분야 번호, 생략 가능)
31
+    1소원 2원소 3별다루기 4동작 5소환 6인간성
32
+  ・랜덤 분야표 RCT
33
+  ・랜덤 별자리표 HOR
34
+    랜덤 별자리표A HORA/랜덤 별자리표B HORB
35
+  ・주인 관계표 MRT/관계 속성표 RAT
36
+  ・종자 관계표 SRT
37
+  ・기적표 MIR
38
+  ・전과표 BRT
39
+  ・사건표 TRO
40
+  ・숲 사건표 TROF
41
+  ・정원 사건표 TROG
42
+  ・성내 사건표 TROC
43
+  ・도시 사건표 TROT
44
+  ・도서관 사건표 TROL
45
+  ・역 사건표 TROS
46
+  ・종자 트러블표 TRS
47
+  ・리액션표 - 충성 RAL
48
+  ・리액션표 - 냉정 RAC
49
+  ・리액션표 - 모성 RAM
50
+  ・리액션표 - 연장자 RAO
51
+  ・리액션표 - 천진난만 RAI
52
+  ・리액션표 - 장로 RAE
53
+  ・조우표 ENC
54
+  ・치명상 표 FWT
55
+  ・카타스트로피 표 CAT
56
+  ・회상표
57
+    〈마술사의 정원〉 회상표 JDSRT/〈세븐스 헤븐〉 회상표 SHRT
58
+    /〈축복의 종〉 회상표 BCRT/〈오메가 탐정사〉 회상표 ODRT
59
+  ・출장표
60
+    〈마술사의 정원〉 출장표 JDSBT/〈세븐스 헤븐〉 출장표 SHBT
61
+    /〈축복의 종〉 출장표 BCBT/〈오메가 탐정사〉 출장표 ODBT
62
+    /〈은하수 상점가〉 출장표 ASBT/〈폴라리스 성학원〉 출장표 PABT
63
+    /〈인형 기사단〉 출장표 SCBT/〈인형 기사단〉으로의 출장표 TOSCBT
64
+ ・D66 다이스 있음
65
+ INFO_MESSAGE_TEXT
66
+
67
+ register_prefix_from_super_class()
68
+
69
+ def initialize(command)
70
+ super(command)
71
+
72
+ @d66_sort_type = D66SortType::ASC
73
+ @locale = :ko_kr
74
+ end
75
+
76
+ TABLES = translate_tables(:ko_kr).freeze
77
+ RTT = translate_rtt(:ko_kr)
78
+ end
79
+ end
80
+ end
@@ -17,7 +17,7 @@ module BCDice
17
17
 
18
18
  VOT, GUT, BAT, KEYT, DRT: (ボーカル、ギター、ベース、キーボード、ドラム)トラブル表
19
19
  EMO: 感情表
20
- ATn, RTTn: 特技表(n=分野。空:ランダム 1:主義 2:身体 3:モチーフ 4:エモーション 5:行動 6:逆境)
20
+ ATn, RTTn: 特技表(n=分野。空:ランダム 1:主義 2:身体 3:モチーフ 4:情緒 5:行動 6:逆境)
21
21
  RCT: 分野ランダム表
22
22
  SCENE, MACHI, GAKKO, BAND: (汎用、街角、学校、バンド)シーン表 接近シーンで使用
23
23
  TENKAI: シーン展開表 奔走シーン 練習シーンで使用
@@ -119,7 +119,12 @@ module BCDice
119
119
 
120
120
  currentKey = (command.rate + round * command.rateup).clamp(0, keyMax)
121
121
  debug("currentKey", currentKey)
122
- rateValue = newRates[dice][currentKey]
122
+ rateValue =
123
+ if dice > command.set_zero_val
124
+ newRates[dice][currentKey]
125
+ else
126
+ 0
127
+ end
123
128
  debug("rateValue", rateValue)
124
129
 
125
130
  totalValue += rateValue
@@ -321,6 +326,8 @@ module BCDice
321
326
  def getResultText(rating_total, command, diceResults, diceResultTotals,
322
327
  rateResults, dice_total, round)
323
328
  sequence = []
329
+ critical_count = [round - 1, 0].max
330
+ additional_damage = command.add_damage * critical_count
324
331
 
325
332
  sequence.push("2D:[#{diceResults.join(' ')}]=#{diceResultTotals.join(',')}")
326
333
 
@@ -333,6 +340,9 @@ module BCDice
333
340
  # rate回数が1回で、修正値がない時には途中式と最終結果が一致するので、途中式を省略する
334
341
  if rateResults.size > 1 || command.modifier != 0
335
342
  text = rateResults.join(',') + Format.modifier(command.modifier)
343
+ if additional_damage != 0
344
+ text += "+#{command.add_damage}*#{critical_count}"
345
+ end
336
346
  if command.half
337
347
  text = "(#{text})/2"
338
348
  if command.modifier_after_half != 0
@@ -343,6 +353,11 @@ module BCDice
343
353
  if command.modifier_after_one_and_a_half != 0
344
354
  text += Format.modifier(command.modifier_after_one_and_a_half)
345
355
  end
356
+ elsif command.double
357
+ text = "(#{text})*2"
358
+ if command.modifier_after_double != 0
359
+ text += Format.modifier(command.modifier_after_double)
360
+ end
346
361
  end
347
362
  sequence.push(text)
348
363
  elsif command.half
@@ -357,6 +372,12 @@ module BCDice
357
372
  text += Format.modifier(command.modifier_after_one_and_a_half)
358
373
  end
359
374
  sequence.push(text)
375
+ elsif command.double
376
+ text = "#{rateResults.first}*2"
377
+ if command.modifier_after_double != 0
378
+ text += Format.modifier(command.modifier_after_double)
379
+ end
380
+ sequence.push(text)
360
381
  end
361
382
 
362
383
  if round > 1
@@ -364,7 +385,7 @@ module BCDice
364
385
  sequence.push(round_text)
365
386
  end
366
387
 
367
- total = rating_total + command.modifier
388
+ total = rating_total + command.modifier + additional_damage
368
389
  if command.half
369
390
  total = (total / 2.0).ceil
370
391
  if command.modifier_after_half != 0
@@ -375,6 +396,11 @@ module BCDice
375
396
  if command.modifier_after_one_and_a_half != 0
376
397
  total += command.modifier_after_one_and_a_half
377
398
  end
399
+ elsif command.double
400
+ total = (total * 2).ceil
401
+ if command.modifier_after_double != 0
402
+ total += command.modifier_after_double
403
+ end
378
404
  end
379
405
 
380
406
  total_text = total.to_s
@@ -83,7 +83,7 @@ module BCDice
83
83
 
84
84
  def eval_game_system_specific_command(command)
85
85
  case command
86
- when /^Gr(\d+)?/i
86
+ when /^Gr(\d+)?$/i
87
87
  if command =~ /^Gr(\d+)/i
88
88
  growth(Regexp.last_match(1).to_i)
89
89
  else
@@ -34,18 +34,25 @@ module BCDice
34
34
 
35
35
  ・レーティング表の半減 (HKx, KxH+N)
36
36
   レーティング表の先頭または末尾に"H"をつけると、レーティング表を振って最終結果を半減させます。
37
-  末尾につけた場合、直後に修正ををつけることで、半減後の加減算を行うことができます。
37
+  末尾につけた場合、直後に修正をつけることで、半減後の加減算を行うことができます。
38
38
   この際、複数の項による修正にはカッコで囲うことが必要です(カッコがないとパースに失敗します)
39
39
   クリティカル値を指定しない場合、クリティカルなしと扱われます。
40
40
   例)HK20  K20h  HK10-5@9  K10-5@9H  K20gfH  K20+8H+2  K20+8H+(1+1)
41
41
 
42
42
  ・レーティング表の1.5倍 (OHKx, KxOH+N)
43
43
   レーティング表の先頭または末尾に"OH"をつけると、レーティング表を振って最終結果を1.5倍します。
44
-  末尾につけた場合、直後に修正ををつけることで、1.5倍後の加減算を行うことができます。
44
+  末尾につけた場合、直後に修正をつけることで、1.5倍後の加減算を行うことができます。
45
45
   この際、複数の項による修正にはカッコで囲うことが必要です(カッコがないとパースに失敗します)
46
46
   クリティカル値を指定しない場合、クリティカルなしと扱われます。
47
47
   例)OHK20  K20oh  OHK10-5@9  K20+8OH+2  K20+8OH+(1+1)
48
48
 
49
+ ・レーティング表の2倍 (DBKx, KxDB+N)
50
+  レーティング表の先頭または末尾に"DB"をつけると、レーティング表を振って最終結果を2倍します。
51
+  末尾につけた場合、直後に修正をつけることで、2倍後の加減算を行うことができます。
52
+  この際、複数の項による修正にはカッコで囲うことが必要です(カッコがないとパースに失敗します)
53
+  クリティカル値を指定しない場合、クリティカル値10と扱われます。
54
+  例)DBK20  K20db  DBK10-5@9  K20+8DB+2  K20+8DB+(1+1)
55
+
49
56
  ・ダイス目の修正(運命変転やクリティカルレイ、魔女の火用)
50
57
   末尾に「$修正値」でダイス目に修正がかかります。
51
58
   $+1と修正表記ならダイス目に+修正、$9のように固定値ならダイス目をその出目に差し替え。
@@ -61,6 +68,9 @@ module BCDice
61
68
  ・首切り刀用レーティング上昇 r5
62
69
   例)K20r5 K30+24@8R5 K40+24@8$12r5
63
70
 
71
+ ・肉喰む顎用クリティカルごと追加ダメージ ad2
72
+  例)K20ad2 K30+24@8D2 K40+24@8$12ad2
73
+
64
74
  ・グレイテストフォーチュンは末尾に gf
65
75
   例)K20gf K30+24@8GF K40+24@8$12r5gf
66
76
 
@@ -70,6 +80,9 @@ module BCDice
70
80
  ・威力表を1d+tfで参照 クリティカル後は2dで参照 tf3
71
81
   例)k10tf3 k0+5tf4@13 k70+26tf3@9
72
82
 
83
+ ・アビスカース「難しい」用に KxSZy 表記でy以下の出目の威力表を0に書き換え。
84
+  例) k10SZ4 k0+5@13sz6 k40+26@9sz3
85
+
73
86
  ・超越判定用に2d6ロールに 2D6@10 書式でクリティカル値付与が可能に。
74
87
   例)2D6@10 2D6@10+11>=30
75
88
 
@@ -86,11 +99,17 @@ module BCDice
86
99
  ・ドルイドの物理魔法用表 (Dru[2-6の値,7-9の値,10-12の値])
87
100
   例)Dru[0,3,6]+10-3
88
101
 
102
+ ・ビブリオマンサーの応急行使判定用 (Bib[特殊失敗値])
103
+  例)Bib[6]+8 Bib[9]+10-1>=17
104
+
89
105
  ・アビスカース表 (ABT)
90
106
   アビスカース表を出すことができます。
107
+
108
+ ・追加アビスカース表(AABT)
109
+  追加アビスカース表を出すことができます。
91
110
  INFO_MESSAGE_TEXT
92
111
 
93
- register_prefix('H?K', 'OHK', 'Gr', '2D6?@\d+', 'FT', 'TT', 'Dru', 'ABT')
112
+ register_prefix('H?K', 'OHK', 'DBK', 'Gr', '2D6?@\d+', 'FT', 'TT', 'Dru', 'Bib', 'ABT', 'AABT')
94
113
 
95
114
  def eval_game_system_specific_command(command)
96
115
  case command
@@ -104,8 +123,24 @@ module BCDice
104
123
  end
105
124
 
106
125
  druid_dice(cmd, power_list)
126
+
127
+ when /^bib\[(\d+)\]/i
128
+ failure_num = Regexp.last_match(1).to_i
129
+ biblio_parser = Command::Parser.new(/^bib\[\d+\]/i, round_type: BCDice::RoundType::CEIL)
130
+ cmd = biblio_parser.parse(command)
131
+
132
+ if !cmd || !failure_num
133
+ return nil
134
+ end
135
+
136
+ biblio_emergency_dice(cmd, failure_num)
137
+
107
138
  when 'ABT'
108
139
  get_abyss_curse_table
140
+
141
+ when 'AABT'
142
+ get_additional_abyss_curse_table
143
+
109
144
  else
110
145
  super(command)
111
146
  end
@@ -139,6 +174,31 @@ module BCDice
139
174
  return sequence.join(" > ")
140
175
  end
141
176
 
177
+ def biblio_emergency_dice(command, failure_num)
178
+ dice_list = @randomizer.roll_barabara(2, 6)
179
+ dice_total = dice_list.sum()
180
+ total = dice_total + command.modify_number
181
+
182
+ result =
183
+ if dice_total == failure_num
184
+ Result.fumble(translate('SwordWorld2_5.special_failure'))
185
+ else
186
+ result_2d6(total, dice_total, dice_list, command.cmp_op, command.target_number)
187
+ end
188
+
189
+ result ||= Result.new
190
+
191
+ sequence = [
192
+ "(#{command.command.capitalize}#{Format.modifier(command.modify_number)}#{command.cmp_op}#{command.target_number})",
193
+ "#{dice_total}[#{dice_list.join(',')}]#{Format.modifier(command.modify_number)}",
194
+ total,
195
+ result.text
196
+ ]
197
+
198
+ result.text = sequence.compact.join(" > ")
199
+ return result
200
+ end
201
+
142
202
  def get_abyss_curse_table
143
203
  table_result = DiceTable::D66GridTable.from_i18n('SwordWorld2_5.AbyssCurseTable', @locale).roll(@randomizer)
144
204
  additional =
@@ -155,6 +215,10 @@ module BCDice
155
215
 
156
216
  return final_result.join("\n")
157
217
  end
218
+
219
+ def get_additional_abyss_curse_table
220
+ return DiceTable::D66GridTable.from_i18n('SwordWorld2_5.AdditionalAbyssCurseTable', @locale).roll(@randomizer).to_s
221
+ end
158
222
  end
159
223
  end
160
224
  end
@@ -0,0 +1,222 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/game_system/NinjaSlayer2'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class TacticalExorcist < NinjaSlayer2
8
+ # ゲームシステムの識別子
9
+ ID = "TacticalExorcist"
10
+
11
+ # ゲームシステム名
12
+ NAME = "タクティカル祓魔師TRPG"
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = "たくていかるふつましTRPG"
16
+
17
+ HELP_MESSAGE = <<~TEXT
18
+ --- 成功判定コマンド ---
19
+ 通常のダイスの「{ダイス個数}B6>={難易度ごとの目標出目}」を実行するための簡易入力コマンドです。
20
+
21
+ - K{x}
22
+ 難易度K([K]ids/目標値=2)の成功判定をダイス{x}個で実行します。
23
+ 先頭の文字を変えることで、難易度E([E]asy/目標値=3),N([N]ormal/目標値=4),H([H]ard/目標値=5),U([U]ltra-hard/目標値=6)もしくはUH([U]ltra-[H]ard/目標値=6)でも実行可能です。
24
+
25
+ - K{x1},N{x2},...,U{xn}
26
+ K{x}の複数ロール版。
27
+ カンマ(,)で区切って複数回入力すると、区切られたセットごとに成功判定を行います。
28
+ 2回目以降は難易度指定を省略可能で、省略した場合はひとつ前の難易度を引き継いで判定を行います。
29
+ 以下のコマンドについても同様の書式で複数ロールしての同時判定が可能です。
30
+
31
+ - K{x1},{x2},...,{xn}@{y1},{y2},...,{yn}
32
+ K{x1},{x2},...,{xn}の判定を行い、出目の中で{y1}から{yn}のいずれかの値と一致した出目を列挙して追加で出力します。(追加判定コマンドの簡易入力版です)
33
+
34
+ --- 追加判定コマンド ---
35
+ 以下のコマンド群は、成功判定コマンドの後ろに付けて実行してください。
36
+
37
+ - [>={y}]
38
+ - [>{y}]
39
+ - [<={y}]
40
+ - [<{y}]
41
+ - [={y}]
42
+ - [!={y}]
43
+ 成功判定コマンドでカンマ区切りで指定した各ロール結果に対して、[]内で指定された条件で追加判定を行います。
44
+ それぞれ、{y}以上(>=)、{y}より大きい(>)、{y}以下(<=)、{y}未満(<)、{y}のみ(=)、{y}以外(!=)を判定し、
45
+ ロール結果の中で条件を満たしたダイスの個数を「追加判定」というテキストと共に出力します。
46
+ [=5][=6]のように複数記述することで、ひとつのロールに対して複数パターンでの追加判定が可能です。
47
+ ※ 条件は一括でしか指定できないため、ロールごとに異なる条件を指定したい場合はコマンドを分けてください。以下も同様です。。
48
+
49
+ - [>={y1}{y2}...{yn}+]
50
+ 成功判定コマンドでカンマ区切りで指定した各ロール結果に対して、[>={y1}]~[>={yn}]の各条件で追加判定を行います。
51
+ 出目の中に条件を満たしたダイスが**全て**含まれていた場合、「追加判定成功!」というテキストを出力します。
52
+ 例えば[>=665+]とした場合、出目の中に6以上のダイスが2つと5以上のダイスが1つ含まれていれば成功扱いになります。
53
+ TEXT
54
+
55
+ # Base::eval_game_system_specific_commandの実装
56
+ # @param command [String]
57
+ # @return [String, nil]
58
+ def eval_game_system_specific_command(command)
59
+ # @debug = true
60
+ debug("input: #{command}")
61
+
62
+ begin
63
+ case command
64
+ when RE_JUDGE_DICEROLL_TE
65
+ # タクティカル祓魔師TRPGで追加されたコマンド
66
+ proc_result = proc_dice_command_with_at(command)
67
+
68
+ # 結果は文字列と達成値という形で受け取る
69
+ if proc_result[1] > 0
70
+ return Result.success(proc_result[0])
71
+ else
72
+ return Result.failure(proc_result[0])
73
+ end
74
+ when RE_JUDGE_DICEROLL
75
+ # ソウルワイヤードTRPGフレームワーク2版(ニンジャスレイヤーTRPG第2版)用のダイス判定
76
+ proc_result = proc_dice_2nd(Regexp.last_match)
77
+
78
+ # 結果は文字列と達成値という形で受け取る
79
+ if proc_result[1] > 0
80
+ return Result.success(proc_result[0])
81
+ else
82
+ return Result.failure(proc_result[0])
83
+ end
84
+ else
85
+ # ダイスでなければ定型文処理
86
+ return proc_text(command)
87
+ end
88
+ rescue StandardError => e
89
+ # 解析できずにエラーが出たら構文ミスと皆してnilを返す
90
+ debug("#{e.message} \n#{e.backtrace}")
91
+ return nil
92
+ end
93
+ end
94
+
95
+ private
96
+
97
+ # 難易度判定の成功数を返す。
98
+ # @param dice_array [Array<Integer>]
99
+ # @param difficultys [String]
100
+ # @param cmp_op [String]
101
+ # @return Integer
102
+ def check_difficulty_te(dice_array, difficultys, cmp_op)
103
+ success_dice = []
104
+ diff_array = difficultys.split(",")
105
+ dice_array.each do |dice_value|
106
+ diff_array.each do |diff_value|
107
+ if dice_value.send(Normalize.comparison_operator(cmp_op), diff_value.to_i)
108
+ success_dice.push(dice_value)
109
+ end
110
+ end
111
+ end
112
+
113
+ return success_dice
114
+ end
115
+
116
+ # 追加判定の処理
117
+ # @param roll_result 判定対象とするロール結果の配列
118
+ # @param ap_commanc 追加判定のコマンド
119
+ # @return String
120
+ def proc_appendix(roll_result, ap_command)
121
+ debug("----- ap_command: #{ap_command}")
122
+ output_text = ''
123
+ case ap_command
124
+ when RE_COUNT_SATZ_BATZ
125
+ diff_condition = Regexp.last_match[1]
126
+ if ap_command.end_with?("+")
127
+ # サツバツ発生チェック
128
+ sb_condition = diff_condition.sub("\+", "").split("/")[0]
129
+ nm_condition = diff_condition.sub("\+", "").split("/")[1]
130
+ debug("sb_condition: #{sb_condition}")
131
+ debug("nm_condition: #{nm_condition}")
132
+
133
+ if check_difficulty_new(roll_result.last_dice_list, nm_condition, ">=")
134
+ output_text += ", ナムアミダブツ![#{ap_command}]"
135
+ elsif check_difficulty_new(roll_result.last_dice_list, sb_condition, ">=")
136
+ output_text += ", サツバツ![#{ap_command}]"
137
+ end
138
+
139
+ else
140
+ # サツバツ数カウント
141
+ diff_result_array = check_difficulty(roll_result.last_dice_list, s_to_i(diff_condition, 6), ">=")
142
+ output_text += ", サツバツ判定[#{ap_command}]:#{diff_result_array.size}"
143
+ unless diff_result_array.empty?
144
+ output_text += "[#{diff_result_array.sort.reverse.join(',')}]"
145
+ end
146
+ end
147
+ when RE_COUNT_CRITICAL
148
+ diff_condition = Regexp.last_match[1]
149
+ if ap_command.end_with?("+")
150
+ # クリティカル発生チェック
151
+ if check_difficulty_new(roll_result.last_dice_list, diff_condition.sub("\+", ""), ">=")
152
+ output_text += ", クリティカル![#{ap_command}]"
153
+ end
154
+ else
155
+ # クリティカル数カウント
156
+ diff_result_array = check_difficulty(roll_result.last_dice_list, s_to_i(diff_condition, 6), ">=")
157
+ output_text += ", クリティカル判定[#{ap_command}]:#{diff_result_array.size}"
158
+ unless diff_result_array.empty?
159
+ output_text += "[#{diff_result_array.sort.reverse.join(',')}]"
160
+ end
161
+ end
162
+ when RE_COUNT_JUDGE_TE
163
+ diff_type = Regexp.last_match[1]
164
+ diff_condition = Regexp.last_match[2]
165
+ # 追加判定カウント
166
+ diff_result_array = check_difficulty_te(roll_result.last_dice_list, diff_condition, diff_type)
167
+ output_text += ", 追加判定[#{ap_command}]:#{diff_result_array.size}"
168
+ unless diff_result_array.empty?
169
+ output_text += "[#{diff_result_array.sort.reverse.join(',')}]"
170
+ end
171
+ when RE_COUNT_JUDGE
172
+ diff_type = Regexp.last_match[1]
173
+ diff_condition = Regexp.last_match[2]
174
+ debug("#{diff_type} / #{diff_condition}")
175
+ if ap_command.end_with?("+")
176
+ # 追加判定チェック
177
+ if check_difficulty_new(roll_result.last_dice_list, diff_condition.sub("\+", ""), diff_type)
178
+ output_text += ", 追加判定成功![#{ap_command}]"
179
+ end
180
+ else
181
+ # 追加判定カウント
182
+ diff_result_array = check_difficulty(roll_result.last_dice_list, s_to_i(diff_condition, 6), diff_type)
183
+ output_text += ", 追加判定[#{ap_command}]:#{diff_result_array.size}"
184
+ unless diff_result_array.empty?
185
+ output_text += "[#{diff_result_array.sort.reverse.join(',')}]"
186
+ end
187
+ end
188
+ end
189
+ return output_text
190
+ end
191
+
192
+ # @付き追加判定の処理
193
+ # @param at_command String 追加判定のコマンド
194
+ # @return [String, Integer]
195
+ def proc_dice_command_with_at(at_command)
196
+ # コマンドを作り直して
197
+ command = at_command.split("@")[0]
198
+ eq_param = at_command.split("@")[1]
199
+ command += "[=#{eq_param}]"
200
+
201
+ # しれっと投げる
202
+ case command
203
+ when RE_JUDGE_DICEROLL
204
+ return proc_dice_2nd(Regexp.last_match)
205
+ else
206
+ return nil
207
+ end
208
+ end
209
+
210
+ RE_COUNT_JUDGE_TE = /(=)([1-6](,[1-6])+)/.freeze
211
+
212
+ RE_JUDGE_DICEROLL_TE = /^((?:(?:UH|[KENHU])?\d+,?)+)(@[1-6](,[1-6])*)$/i.freeze
213
+ # RE_JUDGE_DICEROLL = %r{^((?:(?:UH|[KENHU])?\d+,?)+)(?:\[((?:(?:S([1-6]|[1-6]+(?:/[1-6]+)?\+)?|C([1-6]*\+?)?|(=|!=|>=|>|<=|<)([1-6]+\+?)|(=)([1-6](,[1-6])+))(?:\]\[)?)+)\])?$}i.freeze
214
+ RE_JUDGE_DICEROLL = /^((?:(?:UH|[KENHU])?\d+,?)+)(?:\[((?:(?:(=|!=|>=|>|<=|<)([1-6]+\+?)|(=)([1-6](,[1-6])+))(?:\]\[)?)+)\])?$/i.freeze
215
+
216
+ register_prefix(
217
+ "UH",
218
+ "[KENHU]"
219
+ )
220
+ end
221
+ end
222
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/game_system/TenkaRyouran'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class TenkaRyouran_Korean < TenkaRyouran
8
+ # ゲームシステムの識別子
9
+ ID = 'TenkaRyouran:Korean'
10
+
11
+ # ゲームシステム名
12
+ NAME = '천하요란'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Korean:천하요란'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = help_message()
19
+
20
+ set_aliases_for_srs_roll('TR')
21
+
22
+ register_prefix_from_super_class()
23
+
24
+ def initialize(command)
25
+ super(command)
26
+ @locale = :ko_kr
27
+ end
28
+ end
29
+ end
30
+ end