bcdice 3.15.0 → 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 (158) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +140 -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/DoubleCross/ja_jp.yml +2 -2
  15. data/i18n/Dracurouge/ko_kr.yml +1284 -205
  16. data/i18n/Emoklore/ja_jp.yml +1 -0
  17. data/i18n/Emoklore/ko_kr.yml +8 -0
  18. data/i18n/FutariSousa/ja_jp.yml +70 -0
  19. data/i18n/FutariSousa/ko_kr.yml +157 -0
  20. data/i18n/HatsuneMiku/ja_jp.yml +579 -0
  21. data/i18n/HatsuneMiku/ko_kr.yml +579 -0
  22. data/i18n/Irisbane/ja_jp.yml +27 -0
  23. data/i18n/Irisbane/ko_kr.yml +27 -0
  24. data/i18n/JuinKansen/ja_jp.yml +168 -0
  25. data/i18n/JuinKansen/ko_kr.yml +168 -0
  26. data/i18n/KemonoNoMori/ja_jp.yml +229 -0
  27. data/i18n/KemonoNoMori/ko_kr.yml +229 -0
  28. data/i18n/KizunaBullet/ko_kr.yml +653 -0
  29. data/i18n/MagicPunk/ja_jp.yml +5 -0
  30. data/i18n/MagicPunk/ko_kr.yml +5 -0
  31. data/i18n/MorkBorg/ja_jp.yml +34 -0
  32. data/i18n/MorkBorg/ko_kr.yml +34 -0
  33. data/i18n/Nechronica/ko_kr.yml +43 -0
  34. data/i18n/NegikureNegimaki/ja_jp.yml +6 -0
  35. data/i18n/NegikureNegimaki/ko_kr.yml +6 -0
  36. data/i18n/Nuekagami/ja_jp.yml +219 -0
  37. data/i18n/Nuekagami/ko_kr.yml +219 -0
  38. data/i18n/Revulture/ja_jp.yml +8 -0
  39. data/i18n/Revulture/ko_kr.yml +8 -0
  40. data/i18n/SRS/ja_jp.yml +4 -0
  41. data/i18n/SRS/ko_kr.yml +4 -0
  42. data/i18n/ShinobiGami/ja_jp.yml +879 -0
  43. data/i18n/ShinobiGami/ko_kr.yml +876 -0
  44. data/i18n/SkynautsBouken/ja_jp.yml +28 -28
  45. data/i18n/StarryDolls/ja_jp.yml +456 -0
  46. data/i18n/StarryDolls/ko_kr.yml +456 -0
  47. data/i18n/StratoShout/ja_jp.yml +8 -8
  48. data/i18n/SwordWorld2_5/ja_jp.yml +48 -0
  49. data/i18n/Ventangle/ja_jp.yml +4 -0
  50. data/i18n/Ventangle/ko_kr.yml +4 -0
  51. data/i18n/YearZeroEngine/ja_jp.yml +12 -0
  52. data/i18n/YearZeroEngine/ko_kr.yml +12 -0
  53. data/i18n/ZombiLine/ja_jp.yml +27 -0
  54. data/i18n/ZombiLine/ko_kr.yml +27 -0
  55. data/i18n/ko_kr.yml +2 -0
  56. data/i18n/zh_hant.yml +2 -2
  57. data/lib/bcdice/dice_table/d66_left_range_table.rb +21 -0
  58. data/lib/bcdice/game_system/Aionia.rb +68 -19
  59. data/lib/bcdice/game_system/Airgetlamh.rb +64 -41
  60. data/lib/bcdice/game_system/Airgetlamh_Korean.rb +53 -0
  61. data/lib/bcdice/game_system/Alsetto.rb +63 -50
  62. data/lib/bcdice/game_system/Alsetto_Korean.rb +51 -0
  63. data/lib/bcdice/game_system/AnimaAnimus.rb +15 -32
  64. data/lib/bcdice/game_system/AnimaAnimus_Korean.rb +39 -0
  65. data/lib/bcdice/game_system/BlackJacket.rb +57 -113
  66. data/lib/bcdice/game_system/BlackJacket_Korean.rb +8 -206
  67. data/lib/bcdice/game_system/Bloodorium.rb +1 -1
  68. data/lib/bcdice/game_system/Bloodorium_Korean.rb +34 -0
  69. data/lib/bcdice/game_system/ChroniclesOfDarkness2e.rb +163 -0
  70. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +471 -300
  71. data/lib/bcdice/game_system/DeadlineHeroes_Korean.rb +273 -0
  72. data/lib/bcdice/game_system/Dracurouge_Korean.rb +25 -19
  73. data/lib/bcdice/game_system/DungeonsAndDragons5.rb +106 -73
  74. data/lib/bcdice/game_system/DungeonsAndDragons5_Korean.rb +53 -0
  75. data/lib/bcdice/game_system/DungeonsAndDragons_Korean.rb +61 -0
  76. data/lib/bcdice/game_system/EdgeFlippers.rb +315 -0
  77. data/lib/bcdice/game_system/Emoklore.rb +34 -9
  78. data/lib/bcdice/game_system/Emoklore_Korean.rb +50 -0
  79. data/lib/bcdice/game_system/FateCoreSystem.rb +10 -6
  80. data/lib/bcdice/game_system/FullMetalPanic_Korean.rb +28 -0
  81. data/lib/bcdice/game_system/FutariSousa.rb +37 -12
  82. data/lib/bcdice/game_system/FutariSousa_Korean.rb +25 -8
  83. data/lib/bcdice/game_system/GaiaCare.rb +40 -0
  84. data/lib/bcdice/game_system/Garactier.rb +1 -1
  85. data/lib/bcdice/game_system/GardenOrder.rb +2 -2
  86. data/lib/bcdice/game_system/GardenOrderReEdit.rb +849 -0
  87. data/lib/bcdice/game_system/GardenOrder_Korean.rb +839 -0
  88. data/lib/bcdice/game_system/HatsuneMiku.rb +51 -605
  89. data/lib/bcdice/game_system/HatsuneMiku_Korean.rb +56 -0
  90. data/lib/bcdice/game_system/HunterTheReckoning5th.rb +15 -11
  91. data/lib/bcdice/game_system/Irisbane.rb +17 -30
  92. data/lib/bcdice/game_system/Irisbane_Korean.rb +52 -0
  93. data/lib/bcdice/game_system/JuinKansen.rb +41 -208
  94. data/lib/bcdice/game_system/JuinKansen_Korean.rb +46 -0
  95. data/lib/bcdice/game_system/KemonoNoMori.rb +67 -276
  96. data/lib/bcdice/game_system/KemonoNoMori_Korean.rb +62 -0
  97. data/lib/bcdice/game_system/KinAriel.rb +117 -0
  98. data/lib/bcdice/game_system/KizunaBullet_Korean.rb +109 -0
  99. data/lib/bcdice/game_system/KutuluRevised.rb +94 -0
  100. data/lib/bcdice/game_system/LiverLabyrinth.rb +321 -0
  101. data/lib/bcdice/game_system/Lost.rb +89 -0
  102. data/lib/bcdice/game_system/MagicPunk.rb +85 -0
  103. data/lib/bcdice/game_system/MagicPunk_Korean.rb +39 -0
  104. data/lib/bcdice/game_system/MarvelHeroicRoleplaying.rb +144 -0
  105. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +122 -2
  106. data/lib/bcdice/game_system/MetallicGuardian_Korean.rb +28 -0
  107. data/lib/bcdice/game_system/MorkBorg.rb +170 -0
  108. data/lib/bcdice/game_system/MorkBorg_Korean.rb +49 -0
  109. data/lib/bcdice/game_system/NanimonaiMura.rb +112 -0
  110. data/lib/bcdice/game_system/Nechronica_Korean.rb +6 -6
  111. data/lib/bcdice/game_system/NegikureNegimaki.rb +140 -0
  112. data/lib/bcdice/game_system/NegikureNegimaki_Korean.rb +48 -0
  113. data/lib/bcdice/game_system/NeonUnderRealm.rb +122 -0
  114. data/lib/bcdice/game_system/NinjaSlayer2.rb +170 -49
  115. data/lib/bcdice/game_system/Nuekagami.rb +19 -261
  116. data/lib/bcdice/game_system/Nuekagami_Korean.rb +43 -0
  117. data/lib/bcdice/game_system/ParanoiaPerfect.rb +74 -0
  118. data/lib/bcdice/game_system/PastFutureParadox.rb +2245 -55
  119. data/lib/bcdice/game_system/PreciousDays.rb +170 -0
  120. data/lib/bcdice/game_system/Revulture.rb +8 -5
  121. data/lib/bcdice/game_system/Revulture_Korean.rb +51 -0
  122. data/lib/bcdice/game_system/Ryutama.rb +46 -46
  123. data/lib/bcdice/game_system/SRS.rb +4 -4
  124. data/lib/bcdice/game_system/SRS_Korean.rb +67 -0
  125. data/lib/bcdice/game_system/ShinobiGami.rb +154 -1047
  126. data/lib/bcdice/game_system/ShinobiGami_Korean.rb +102 -0
  127. data/lib/bcdice/game_system/StarryDolls.rb +70 -508
  128. data/lib/bcdice/game_system/StarryDolls_Korean.rb +80 -0
  129. data/lib/bcdice/game_system/StratoShout.rb +1 -1
  130. data/lib/bcdice/game_system/SwordWorld.rb +28 -2
  131. data/lib/bcdice/game_system/SwordWorld2_0.rb +1 -1
  132. data/lib/bcdice/game_system/SwordWorld2_5.rb +67 -3
  133. data/lib/bcdice/game_system/TacticalExorcist.rb +222 -0
  134. data/lib/bcdice/game_system/TenkaRyouran_Korean.rb +30 -0
  135. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +38 -33
  136. data/lib/bcdice/game_system/Ventangle.rb +8 -7
  137. data/lib/bcdice/game_system/Ventangle_Korean.rb +41 -0
  138. data/lib/bcdice/game_system/Warhammer4.rb +202 -6
  139. data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +20 -15
  140. data/lib/bcdice/game_system/WorldEndScrapyard.rb +333 -0
  141. data/lib/bcdice/game_system/WorldsEndFrontline_Korean.rb +26 -0
  142. data/lib/bcdice/game_system/YearZeroEngine.rb +7 -7
  143. data/lib/bcdice/game_system/YearZeroEngine_Korean.rb +46 -0
  144. data/lib/bcdice/game_system/ZombiLine.rb +29 -36
  145. data/lib/bcdice/game_system/ZombiLine_Korean.rb +37 -0
  146. data/lib/bcdice/game_system/cthulhu7th_Korean/full_auto.rb +294 -0
  147. data/lib/bcdice/game_system/cthulhu7th_Korean/rollable.rb +43 -0
  148. data/lib/bcdice/game_system/meikyu_kingdom_basic/atoz_table.rb +1184 -0
  149. data/lib/bcdice/game_system/meikyu_kingdom_basic/randr236_table.rb +254 -0
  150. data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +54 -0
  151. data/lib/bcdice/game_system/meikyu_kingdom_basic/tk_table.rb +755 -0
  152. data/lib/bcdice/game_system/sword_world/rating_options.rb +9 -0
  153. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +19 -0
  154. data/lib/bcdice/game_system/sword_world/rating_parser.rb +229 -149
  155. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -0
  156. data/lib/bcdice/game_system.rb +47 -0
  157. data/lib/bcdice/version.rb +1 -1
  158. metadata +96 -2
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class MarvelHeroicRoleplaying < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'MarvelHeroicRoleplaying'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'MarvelヒロイックRPG'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'まあへるひろいつくRPG'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
17
+ ■判定 MHRnDx[+nDx] n: ダイス数 x:ダイスの面数
18
+
19
+ 例)MHR3D10+2D8+1D6: 10面ダイスを3個・8面ダイスを2個・6面ダイスを1個振って、その結果を表示(合計値,効果ダイス,チャンス)
20
+ 合計値を優先した場合と効果ダイスを優先した場合で結果が変わるケースでは双方を表示。
21
+
22
+ INFO_MESSAGETEXT
23
+
24
+ register_prefix('MHR')
25
+
26
+ def initialize(command)
27
+ super(command)
28
+
29
+ @sort_barabara_dice = true # バラバラロール(Bコマンド)でソート有
30
+ end
31
+
32
+ def eval_game_system_specific_command(command)
33
+ resolute_action(command)
34
+ end
35
+
36
+ private
37
+
38
+ DiceBlock = Struct.new(:counts, :sides)
39
+ DiceStats = Struct.new(:value, :sides, :used)
40
+
41
+ # 判定
42
+ # @param [String] command
43
+ # @return [Result]
44
+ def resolute_action(command)
45
+ m = /MHR((\d+D\d+)(\+\d+D\d+)*)/.match(command)
46
+ return nil unless m
47
+
48
+ dice_str = m[1]
49
+ dice_cmd_arr = dice_str.split("+")
50
+ dice_block_arr = []
51
+
52
+ dice_cmd_arr.each do |d|
53
+ n = /(\d+)D(\d+)/.match(d)
54
+ dice_block_arr.push(DiceBlock.new(n[1].to_i, n[2].to_i))
55
+ end
56
+ dice_block_arr = dice_block_arr.group_by(&:sides)
57
+ .map { |sides, group| DiceBlock.new(group.sum(&:counts), sides) }
58
+ .sort_by { |item| -item.sides }
59
+
60
+ output = ""
61
+ result_dice_stats_arr = []
62
+ dice_block_arr.each do |db|
63
+ dices = @randomizer.roll_barabara(db.counts, db.sides).sort.reverse
64
+ dices.each do |n|
65
+ result_dice_stats_arr.push(DiceStats.new(n, db.sides, false))
66
+ end
67
+ dice_text = dices.join(",")
68
+ output += ",D#{db.sides}[#{dice_text}]"
69
+ end
70
+ output = output.delete_prefix(",")
71
+ result_dice_stats_arr = result_dice_stats_arr.sort_by { |item| [-item.value, item.sides] }
72
+
73
+ chance = result_dice_stats_arr.count { |item| item.value == 1 }
74
+ result_dice_stats_arr.each { |item| item.used = true if item.value == 1 }
75
+
76
+ add_dice, effect_die = result_prioritize_the_sum(result_dice_stats_arr)
77
+ return nil if add_dice <= 0
78
+
79
+ output_prioritize_the_sum = "合計値#{add_dice},効果ダイスD#{effect_die}"
80
+ add_dice, effect_die = result_prioritize_effect_dice(result_dice_stats_arr)
81
+ output_prioritize_effect_dice = "合計値#{add_dice},効果ダイスD#{effect_die}"
82
+ if add_dice == 0 || output_prioritize_the_sum == output_prioritize_effect_dice
83
+ output += " > #{output_prioritize_the_sum}"
84
+ else
85
+ output += " > #{output_prioritize_the_sum} or #{output_prioritize_effect_dice}"
86
+ end
87
+
88
+ if chance > 0
89
+ output += " > チャンス#{chance}"
90
+ return Result.failure(output)
91
+ else
92
+ return Result.success(output)
93
+ end
94
+ end
95
+
96
+ # 合計値優先
97
+ def result_prioritize_the_sum(dice_stats_arr)
98
+ result_dice_stats_arr = dice_stats_arr.map { |item| DiceStats.new(*item.to_h.values) }
99
+
100
+ if result_dice_stats_arr.length >= 2
101
+ add_dice = result_dice_stats_arr[0].value + result_dice_stats_arr[1].value
102
+ result_dice_stats_arr[0].used = true
103
+ result_dice_stats_arr[1].used = true
104
+ else
105
+ return 0, 4
106
+ end
107
+
108
+ max_item = result_dice_stats_arr.reject(&:used)
109
+ .max_by(&:sides)
110
+ if max_item
111
+ effect_die = max_item.sides
112
+ else
113
+ effect_die = 4
114
+ end
115
+ return add_dice, effect_die
116
+ end
117
+
118
+ # 効果ダイス優先
119
+ def result_prioritize_effect_dice(dice_stats_arr)
120
+ result_dice_stats_arr = dice_stats_arr.map { |item| DiceStats.new(*item.to_h.values) }
121
+
122
+ max_item = result_dice_stats_arr.reject(&:used)
123
+ .min_by { |item| [-item.sides, item.value] }
124
+ if max_item
125
+ max_item.used = true
126
+ effect_die = max_item.sides
127
+ else
128
+ effect_die = 4
129
+ end
130
+
131
+ result_dice_stats_arr2 = result_dice_stats_arr.reject(&:used)
132
+ if result_dice_stats_arr2.length >= 2
133
+ result_dice_stats_arr = result_dice_stats_arr2.sort_by { |item| [-item.value, item.sides] }
134
+ add_dice = result_dice_stats_arr[0].value + result_dice_stats_arr[1].value
135
+ else
136
+ effect_die = 4
137
+ add_dice = 0
138
+ end
139
+
140
+ return add_dice, effect_die
141
+ end
142
+ end
143
+ end
144
+ end
@@ -23,6 +23,7 @@ module BCDice
23
23
  ・各種表
24
24
   ・休憩表:才覚 TBT/魅力 CBT/探索 SBT/武勇 VBT
25
25
  お祭り FBT/空振り EBT/全体 WBT/カップル LBT
26
+ お食事 FDBT
26
27
   ・ハプニング表:才覚 THT/魅力 CHT/探索 SHT/武勇 VHT
27
28
   ・視察表 RT/情報収集表 IG/ランダムマップ選択表 RMS
28
29
   ・痛打表 CAT/致命傷表 FWT/戦闘ファンブル表 CFT
@@ -31,9 +32,11 @@ module BCDice
31
32
   ・お宝表1/2/3/4/5 T1T/T2T/T3T/T4T/T5T
32
33
   ・特殊遭遇表 SE
33
34
     上級:人工 ARN/水域 WEN/自然 NEN/洞窟 CEN/天空 SEN/異界 OEN
35
+  ・他国との関係表 ORT
34
36
  ・潜在能力:スキル決定表 SDT
35
37
    基本:肉弾 BUS/射撃 SHS/星術 ASS/召喚 SUS/科学 SCS
36
38
       迷宮 LAS/交渉 NES/便利 COS/芸能 ENS/道具 TOS
39
+      一般 GES
37
40
    上級:肉弾 ABUS/射撃 ASHS/星術 AASS/召喚 ASUS/科学 ASCS
38
41
       迷宮 ALAS/交渉 ANES/便利 ACOS/芸能 AENS/道具 ATOS
39
42
  ・アイテム関連(上級不使用の場合、カッコ書きのものを使用して下さい)
@@ -53,6 +56,60 @@ module BCDice
53
56
   ・生まれ決定表 BDT/生まれ表:才覚 TBO/魅力 CBO/探索 SBO/武勇 VBO
54
57
   ・初期装備表 IEQ
55
58
   ・地名決定表 PNTx (xは個数)/迷宮風景表 MLTx (xは個数)
59
+ ・百万世界AtoZ関連
60
+  ・ご祝儀表 GIFT
61
+  ・ニュース表 NWST
62
+  ・王国ハプニング表 KDHT
63
+  ・王国試練表 KDTT
64
+  ・騎士道表 CHVT
65
+  ・儀式表 RITT
66
+  ・限定表 LIMT
67
+  ・固有の文化表 UNCT
68
+  ・後世の評価表 POET
69
+  ・高レベル特殊遭遇表 KSET
70
+  ・死霊の日々表 DODT
71
+  ・事件名表1/2 INT1/INT2
72
+  ・守護星座表 GUCT
73
+  ・需要表 DEMTx (x:名物レベル)
74
+  ・小鬼と一緒表 WLDT
75
+  ・侵略ハプニング表 INHT
76
+  ・新・情報収集表 NIGT
77
+  ・人種特徴表/人種名文字表 RACT/RNCTx (x:文字数)
78
+  ・迷宮化現象表/人体迷宮化表 HBLT/LAPT
79
+  ・勢力表 POWT
80
+  ・中立特殊遭遇表 NSET
81
+  ・超協調行動表 ECBT
82
+  ・通貨外見表/通貨材質表/通貨名称表 CUAT/CUMT/CUNT
83
+  ・天候表 WEAT
84
+  ・毒の追加効果表 PAET
85
+  ・媒体表 MEDT
86
+  ・反応表/民の反応表 REAT/PRET
87
+  ・遍歴表 HIST
88
+  ・由来表 ORIT
89
+  ・誘致表 ATRT
90
+  ・妖精の悪戯表 FAMT
91
+ ・R&R236関連
92
+  ・四字熟語系二つ名表/代入命名表/組み合わせ系二つ名表/名文句系二つ名表 FCNT/ASNT/CMNT/FPNT
93
+  ・形容表/用語表/行動表/呼び名表/称号表 DEST/TRMT/BEHT/NAMT/TTLT
94
+ ・旅する王国と無名階域関連
95
+  ・サブキャラクター反応表 CSRT
96
+  ・スキルグループ表 KSGT
97
+  ・ダイナマイト帝国:休憩表/特殊遭遇表/二つ名表/名前表 DRET/DSET/DNNT/DNAT
98
+  ・ハグルマ資本主義神聖共和国:休憩表/特殊遭遇表/二つ名表/名前表 HRET/HSET/HNNT/HNAT
99
+  ・メトロ汗国:休憩表/特殊遭遇表/二つ名表/名前表 MRET/MSET/MNNT/MNAT
100
+  ・千年王朝:休憩表/特殊遭遇表/二つ名表/名前表 TRET/TSET/TNNT/TNAT
101
+  ・遠征王国変動表/遠征道中表 EKCT/EXITx (x:修正)
102
+  ・候補生背景表/職長背景表 CABT/FOBT
103
+  ・上級ジョブ表・甲/乙 AJTA/AJTB
104
+  ・深階休憩表/特殊遭遇表 KART/KAET
105
+  ・天階休憩表/特殊遭遇表 TERT/TEET
106
+  ・星の階休憩表 HKRT
107
+  ・装備決定表 EQDT
108
+  ・大冒険時代表 GART
109
+  ・燃料表 FUET
110
+  ・反乱表 RBLT
111
+  ・旅する王国環境表/王国名決定表1/王国名決定表2/王国名決定表3 TKET/TKNT1/TKNT2/TKNT3
112
+  ・列強経歴表 GPHT
56
113
  ・D66ダイスあり
57
114
  INFO_MESSAGE_TEXT
58
115
 
@@ -73,7 +130,17 @@ module BCDice
73
130
  'ABUS', 'ASHS', 'AASS', 'ASUS', 'ASCS', 'ALAS', 'ANES', 'ACOS', 'AENS', 'ATOS',
74
131
  'SE', 'ARN', 'WEN', 'NEN', 'CEN', 'SEN', 'OEN',
75
132
  'DFT',
76
- 'PNT', 'MLT'
133
+ 'PNT', 'MLT',
134
+ 'FDBT', 'GIFT', 'NWST', 'EKCT', 'KDHT', 'KDTT', 'CHVT', 'RITT', 'LIMT', 'UNCT', 'POET',
135
+ 'KSET', 'DODT', 'INT1', 'INT2', 'GUCT', 'DEMT', 'WLDT', 'INHT', 'NIGT', 'RACT', 'RNCT',
136
+ 'HBLT', 'POWT', 'NSET', 'ECBT', 'CUAT', 'CUMT', 'CUNT', 'WEAT', 'PAET', 'MEDT', 'REAT',
137
+ 'HIST', 'PRET', 'LAPT', 'ORIT', 'ATRT', 'FAMT',
138
+ 'FCNT', 'ASNT', 'TRMT', 'BEHT', 'DEST', 'NAMT', 'TTLT',
139
+ 'CMNT', 'FPNT', 'CSRT', 'KSGT', 'DRET', 'DSET', 'DNNT', 'DNAT', 'HRET', 'HSET', 'HNNT',
140
+ 'HNAT', 'MRET', 'MSET', 'MNNT', 'MNAT', 'EXIT', 'TRET', 'TSET', 'TNNT', 'TNAT', 'CABT',
141
+ 'AJTA', 'AJTB', 'FOBT', 'KAET', 'KART', 'TEET', 'TERT', 'HKRT', 'EQDT', 'GART', 'FUET',
142
+ 'RBLT', 'TKET', 'GPHT',
143
+ 'TKNT1', 'TKNT2', 'TKNT3', 'GES', 'ORT'
77
144
  )
78
145
 
79
146
  def initialize(command)
@@ -81,6 +148,7 @@ module BCDice
81
148
 
82
149
  @sort_add_dice = true
83
150
  @d66_sort_type = D66SortType::ASC
151
+ @round_type = RoundType::CEIL
84
152
  end
85
153
 
86
154
  def kiryoku_result(_total_n, dice_list, _diff)
@@ -100,6 +168,12 @@ module BCDice
100
168
 
101
169
  if (output = roll_tables(command, TABLES))
102
170
  return output
171
+ elsif (output = roll_tables(command, A2Z_TABLES))
172
+ return output
173
+ elsif (output = roll_tables(command, RR236_TABLES))
174
+ return output
175
+ elsif (output = roll_tables(command, TK_TABLES))
176
+ return output
103
177
  else
104
178
 
105
179
  case command
@@ -248,6 +322,50 @@ module BCDice
248
322
  when /^ATOS/i
249
323
  type = '上級道具スキル'
250
324
  output, total_n = mk_advanced_tool_skill_table
325
+ when /^GUCT/i
326
+ type = '守護星座'
327
+ total_n = @randomizer.roll_once(6) * 100 + @randomizer.roll_once(6) * 10 + @randomizer.roll_once(6)
328
+ output = mk_guardian_constellation_table(total_n)
329
+ when /^DEMT(\d+)/i
330
+ type = '需要'
331
+ count = getCount(Regexp.last_match(1))
332
+ output, total_n = get_demand_table(count)
333
+ when /^RNCT(\d*)/i
334
+ type = '人種名文字'
335
+ count = getCount(Regexp.last_match(1))
336
+ output, total_n = get_race_name_character_table(count)
337
+ when /^CUMT/i
338
+ type = '通貨材質'
339
+ @total = [@randomizer.roll_barabara(2, 6).sum(), @randomizer.roll_once(6)]
340
+ total_n = @total.join(',')
341
+ output = get_currency_material_table(*@total)
342
+ when /^CMNT/i
343
+ type = '組み合わせ系二つ名'
344
+ output, total_n = mk_combination_nickname_table
345
+ when /^DEST/i
346
+ type = '形容'
347
+ total_n = @randomizer.roll_d66(D66SortType::ASC)
348
+ output = mk_descriptive_table(total_n)
349
+ when /^TRMT/i
350
+ type = '用語'
351
+ total_n = @randomizer.roll_d66(D66SortType::ASC)
352
+ output = mk_terminology_table(total_n)
353
+ when /^BEHT/i
354
+ type = '行動'
355
+ total_n = @randomizer.roll_d66(D66SortType::ASC)
356
+ output = mk_behavior_table(total_n)
357
+ when /^NAMT/i
358
+ type = '呼び名'
359
+ total_n = @randomizer.roll_d66(D66SortType::ASC)
360
+ output = mk_rr236_name_table(total_n)
361
+ when /^TTLT/i
362
+ type = '称号'
363
+ total_n = @randomizer.roll_d66(D66SortType::ASC)
364
+ output = mk_title_table(total_n)
365
+ when /^EXIT([-+]?\d*)/i
366
+ type = '遠征道中'
367
+ modify = get_modify(Regexp.last_match(1))
368
+ output, total_n = get_expedition_itinerary_table(modify)
251
369
  end
252
370
 
253
371
  if !output.nil?
@@ -261,9 +379,11 @@ module BCDice
261
379
  end
262
380
  end
263
381
  end
264
-
265
382
  require "bcdice/game_system/meikyu_kingdom_basic/item_table"
266
383
  require "bcdice/game_system/meikyu_kingdom_basic/kingdom_table"
267
384
  require "bcdice/game_system/meikyu_kingdom_basic/name_table"
268
385
  require "bcdice/game_system/meikyu_kingdom_basic/word_table"
269
386
  require "bcdice/game_system/meikyu_kingdom_basic/table"
387
+ require "bcdice/game_system/meikyu_kingdom_basic/atoz_table"
388
+ require "bcdice/game_system/meikyu_kingdom_basic/randr236_table"
389
+ require "bcdice/game_system/meikyu_kingdom_basic/tk_table"
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/game_system/MetallicGuardian'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class MetallicGuardian_Korean < MetallicGuardian
8
+ # ゲームシステムの識別子
9
+ ID = 'MetallicGuardian:Korean'
10
+
11
+ # ゲームシステム名
12
+ NAME = '메탈릭 가디언 RPG'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Korean:메탈릭 가디언 RPG'
16
+
17
+ set_aliases_for_srs_roll('MG')
18
+
19
+ register_prefix_from_super_class()
20
+
21
+ def initialize(command)
22
+ super(command)
23
+
24
+ @locale = :ko_kr
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,170 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/dice_table/table'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class MorkBorg < Base
8
+ # ゲームシステムの識別子
9
+ ID = 'MorkBorg'
10
+
11
+ # ゲームシステム名
12
+ NAME = 'MÖRK BORG'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = 'むるくほりい'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
19
+ ■判定 sDRt s: 能力値(省略時:0) t:目標値
20
+
21
+ 例)+3DR12: 能力値+3、DR12で1d20を振って、その結果を表示(クリティカル・ファンブルも表示)
22
+
23
+ ■イニシアティヴ sINS s: 能力値(省略時:0. 個別のイニシアティブを使う場合)
24
+
25
+ 例)INS: 1d6を振って、イニシアティヴの結果を表示(PC先行を成功として表示)
26
+
27
+ ■モラル sMORt s: 能力値(省略時:0) t:相手クリーチャーのモラル値
28
+
29
+ 例)MOR8: 2d6を振って、モラル判定の結果を表示(モラル崩壊を成功として表示)
30
+
31
+
32
+ ■各種表
33
+
34
+ ・遭遇反応表 Reaction (ERT)
35
+ ・破損 Broken (BRO)
36
+
37
+ INFO_MESSAGETEXT
38
+
39
+ def initialize(command)
40
+ super(command)
41
+
42
+ @sort_add_dice = true
43
+ @d66_sort_type = D66SortType::NO_SORT
44
+ end
45
+
46
+ def eval_game_system_specific_command(command)
47
+ resolute_action(command) || resolute_initiative(command) || resolute_morale(command) || roll_tables(command, self.class::TABLES)
48
+ end
49
+
50
+ private
51
+
52
+ def result_dr(total, dice_total, target)
53
+ if dice_total <= 1
54
+ Result.fumble(translate('MorkBorg.fumble'))
55
+ elsif dice_total >= 20
56
+ Result.critical(translate('MorkBorg.critical'))
57
+ elsif total >= target
58
+ Result.success(translate('MorkBorg.success'))
59
+ else
60
+ Result.failure(translate('MorkBorg.failure'))
61
+ end
62
+ end
63
+
64
+ # DR判定
65
+ # @param [String] command
66
+ # @return [Result]
67
+ def resolute_action(command)
68
+ m = /^([+-]?\d+)?DR(\d+)$/.match(command)
69
+ return nil unless m
70
+
71
+ num_status = m[1].to_i
72
+ num_target = m[2].to_i
73
+
74
+ total = @randomizer.roll_once(20)
75
+ total_status = total.to_s + with_symbol(num_status)
76
+ result = result_dr(total + num_status, total, num_target)
77
+
78
+ sequence = [
79
+ "(#{command})",
80
+ total_status,
81
+ total + num_status,
82
+ result.text,
83
+ ]
84
+
85
+ result.text = sequence.join(" > ")
86
+ return result
87
+ end
88
+
89
+ def with_symbol(number)
90
+ if number == 0
91
+ return "+0"
92
+ elsif number > 0
93
+ return "+#{number}"
94
+ else
95
+ return number.to_s
96
+ end
97
+ end
98
+
99
+ # イニシアティヴ判定
100
+ # @param [String] command
101
+ # @return [Result]
102
+ def resolute_initiative(command)
103
+ m = /^([+-]?\d+)?INS$/.match(command)
104
+ return nil unless m
105
+
106
+ num_status = m[1].to_i
107
+
108
+ die = @randomizer.roll_once(6)
109
+ total = die + num_status
110
+ result =
111
+ if total >= 4
112
+ Result.success(translate('MorkBorg.pcs_go_first'))
113
+ else
114
+ Result.failure(translate('MorkBorg.enemies_go_first'))
115
+ end
116
+
117
+ result.text = "(#{command}) > #{die}#{with_symbol(num_status)} > #{total} > #{result.text}"
118
+ return result
119
+ end
120
+
121
+ # モラル判定
122
+ # @param [String] command
123
+ # @return [Result]
124
+ def resolute_morale(command)
125
+ m = /^([+-]?\d+)?MOR(\d+)$/.match(command)
126
+ return nil unless m
127
+
128
+ num_status = m[1].to_i
129
+ num_target = m[2].to_i
130
+
131
+ dice_list = @randomizer.roll_barabara(2, 6)
132
+ dice_total = dice_list.sum()
133
+ total = dice_total + num_status
134
+
135
+ die = ""
136
+ result =
137
+ if total <= num_target
138
+ Result.failure(translate('MorkBorg.maintain'))
139
+ else
140
+ die = @randomizer.roll_once(6)
141
+ if die >= 4
142
+ Result.success(translate('MorkBorg.surrender'))
143
+ else
144
+ Result.success(translate('MorkBorg.flee'))
145
+ end
146
+ end
147
+ result.text = "(#{command}) > #{dice_total}#{with_symbol(num_status)} > #{total} > #{die}#{result.text}"
148
+
149
+ return result
150
+ end
151
+
152
+ # 各種表
153
+
154
+ class << self
155
+ private
156
+
157
+ def translate_tables(locale)
158
+ {
159
+ 'ERT' => DiceTable::Table.from_i18n('MorkBorg.ERT', locale),
160
+ 'BRO' => DiceTable::Table.from_i18n('MorkBorg.BRO', locale),
161
+ }
162
+ end
163
+ end
164
+
165
+ TABLES = translate_tables(:ja_jp).freeze
166
+
167
+ register_prefix('([+-]?\d+)?DR[\d]+', '([+-]?\d+)?INS', '([+-]?\d+)?MOR', TABLES.keys)
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/game_system/MorkBorg'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class MorkBorg_Korean < MorkBorg
8
+ # ゲームシステムの識別子
9
+ ID = 'MorkBorg:Korean'
10
+
11
+ # ゲームシステム名
12
+ NAME = '모크 보그(MÖRK BORG)'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Korean:모크 보그(MÖRK BORG)'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
19
+ ■판정 sDRt s: 능력치(생략 시:0) t:목표값
20
+
21
+ 예)+3DR12: 능력치+3, DR12로 1d20을 굴려서 결과 표시(크리티컬·펌블도 표시)
22
+
23
+ ■이니셔티브 sINS s: 능력치(생략 시:0. 개별 이니셔티브를 사용하는 경우)
24
+
25
+ 예)INS: 1d6을 굴려서 이니셔티브 결과 표시(PC 선공을 성공으로 표시)
26
+
27
+ ■모럴 sMORt s: 능력치(생략 시:0) t:상대 크리처의 모럴 값
28
+
29
+ 예)MOR8: 2d6을 굴려서 모럴 판정 결과 표시(모럴 붕괴를 성공으로 표시)
30
+
31
+
32
+ ■각종 표
33
+
34
+ ・조우 반응표 Reaction (ERT)
35
+ ・파손(빈사표) Broken (BRO)
36
+
37
+ INFO_MESSAGETEXT
38
+
39
+ def initialize(command)
40
+ super(command)
41
+ @locale = :ko_kr
42
+ end
43
+
44
+ TABLES = translate_tables(:ko_kr).freeze
45
+
46
+ register_prefix_from_super_class()
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class NanimonaiMura < Base
6
+ # ゲームシステムの識別子
7
+ ID = "NanimonaiMura"
8
+
9
+ # ゲームシステム名
10
+ NAME = "なにもない村"
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = "なにもないむら"
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・行為判定 xNMy
18
+  x個のD10を振り、2つの出目から達成値を作成して判定します。
19
+  達成値は成功度が最も高くなる組み合わせを自動選択し、同値なら低い値を優先します。
20
+  x: ダイス数(1以上)
21
+  y: 判定値(0以上)
22
+  例)4NM55 6NM199 2NM35
23
+ INFO_MESSAGE_TEXT
24
+
25
+ register_prefix('\d+NM\d+')
26
+
27
+ ResultData = Struct.new(:score, :success, :critical, :result_text, :success_level)
28
+
29
+ STAGE_NAMES = ['ノーマル', 'エピック', 'レジェンダリ', 'ミシック'].freeze
30
+ BASE_SUCCESS_LEVELS = [1, 11, 21, 31].freeze
31
+
32
+ def eval_game_system_specific_command(command)
33
+ roll_action(command)
34
+ end
35
+
36
+ private
37
+
38
+ def roll_action(command)
39
+ m = /\A(\d+)NM(\d+)\z/.match(command)
40
+ return nil unless m
41
+
42
+ dice_count = m[1].to_i
43
+ target = m[2].to_i
44
+ return nil if dice_count < 1
45
+
46
+ dice_list = @randomizer.roll_barabara(dice_count, 10).map { |value| normalize_d10(value) }
47
+ result = select_best_result(dice_list, target)
48
+
49
+ Result.new.tap do |r|
50
+ r.text = "#{command} (#{dice_count}D10) > [#{dice_list.join(',')}] > #{result.score} > #{result.result_text} > 成功度#{result.success_level}"
51
+ r.condition = result.success
52
+ r.critical = result.critical
53
+ end
54
+ end
55
+
56
+ def normalize_d10(value)
57
+ value == 10 ? 0 : value
58
+ end
59
+
60
+ def select_best_result(dice_list, target)
61
+ candidates =
62
+ if dice_list.size == 1
63
+ [build_result(dice_list.first * 10, target)]
64
+ else
65
+ [].tap do |results|
66
+ dice_list.each_index do |i|
67
+ dice_list.each_index do |j|
68
+ next if i == j
69
+
70
+ results << build_result(dice_list[i] * 10 + dice_list[j], target)
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ best_result = candidates.first
77
+
78
+ candidates.drop(1).each do |candidate|
79
+ next if candidate.success_level < best_result.success_level
80
+ next if candidate.success_level == best_result.success_level && candidate.score > best_result.score
81
+
82
+ best_result = candidate
83
+ end
84
+
85
+ best_result
86
+ end
87
+
88
+ def build_result(score, target)
89
+ if score > target
90
+ return ResultData.new(score, false, false, "失敗", 0)
91
+ end
92
+
93
+ diff = target - score
94
+ stage_index = [diff.div(100), STAGE_NAMES.size - 1].min
95
+ critical_bonus = zoro_bonus(score)
96
+ critical = !critical_bonus.nil?
97
+ success_level = BASE_SUCCESS_LEVELS[stage_index] + (critical_bonus || 0)
98
+ result_text = "#{STAGE_NAMES[stage_index]}#{critical ? '大成功' : '成功'}"
99
+
100
+ ResultData.new(score, true, critical, result_text, success_level)
101
+ end
102
+
103
+ def zoro_bonus(score)
104
+ tens = score.div(10)
105
+ ones = score % 10
106
+ return nil unless tens == ones
107
+
108
+ ones
109
+ end
110
+ end
111
+ end
112
+ end