bcdice 3.12.0 → 3.14.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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +72 -0
  3. data/i18n/Arianrhod/ko_kr.yml +3 -0
  4. data/i18n/Cthulhu/en_us.yml +11 -0
  5. data/i18n/CyberpunkRed/ja_jp.yml +389 -0
  6. data/i18n/FinalFantasyXIV/en_us.yml +4 -0
  7. data/i18n/FinalFantasyXIV/ja_jp.yml +4 -0
  8. data/i18n/FutariSousa/ja_jp.yml +158 -1
  9. data/i18n/KizunaBullet/ja_jp.yml +653 -0
  10. data/i18n/MonotoneMuseum/ja_jp.yml +246 -14
  11. data/i18n/SkynautsBouken/ja_jp.yml +114 -0
  12. data/i18n/TensaiGunshiNiNaro/ja_jp.yml +126 -0
  13. data/i18n/UnsungDuet/ja_jp.yml +62 -0
  14. data/i18n/UnsungDuet/ko_kr.yml +62 -0
  15. data/i18n/en_us.yml +5 -0
  16. data/lib/bcdice/arithmetic/parser.rb +4 -2
  17. data/lib/bcdice/base.rb +1 -1
  18. data/lib/bcdice/command/parser.rb +4 -2
  19. data/lib/bcdice/common_command/add_dice/parser.rb +4 -2
  20. data/lib/bcdice/common_command/barabara_dice/parser.rb +4 -2
  21. data/lib/bcdice/common_command/calc/parser.rb +4 -2
  22. data/lib/bcdice/common_command/reroll_dice/parser.rb +4 -2
  23. data/lib/bcdice/common_command/tally_dice/parser.rb +4 -2
  24. data/lib/bcdice/common_command/upper_dice/parser.rb +4 -2
  25. data/lib/bcdice/dice_table/range_table.rb +24 -0
  26. data/lib/bcdice/game_system/Agnostos.rb +248 -0
  27. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  28. data/lib/bcdice/game_system/Alsetto.rb +2 -2
  29. data/lib/bcdice/game_system/AniMalus.rb +261 -0
  30. data/lib/bcdice/game_system/Arianrhod_Korean.rb +30 -0
  31. data/lib/bcdice/game_system/ArknightsFan.rb +182 -0
  32. data/lib/bcdice/game_system/Avandner.rb +1 -1
  33. data/lib/bcdice/game_system/BBN.rb +1 -1
  34. data/lib/bcdice/game_system/BadLife.rb +3 -3
  35. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  36. data/lib/bcdice/game_system/BlackJacket.rb +244 -0
  37. data/lib/bcdice/game_system/Chill3.rb +6 -6
  38. data/lib/bcdice/game_system/ConvictorDrive.rb +5 -4
  39. data/lib/bcdice/game_system/Cthulhu_English.rb +59 -0
  40. data/lib/bcdice/game_system/CyberpunkRed.rb +14 -4
  41. data/lib/bcdice/game_system/DarkSouls.rb +1 -1
  42. data/lib/bcdice/game_system/DivineCharger.rb +841 -0
  43. data/lib/bcdice/game_system/Elric.rb +1 -1
  44. data/lib/bcdice/game_system/FinalFantasyXIV.rb +115 -0
  45. data/lib/bcdice/game_system/FinalFantasyXIV_English.rb +39 -0
  46. data/lib/bcdice/game_system/FullFace.rb +121 -0
  47. data/lib/bcdice/game_system/FutariSousa.rb +88 -8
  48. data/lib/bcdice/game_system/InfiniteFantasia.rb +4 -1
  49. data/lib/bcdice/game_system/Insane_Korean.rb +1 -1
  50. data/lib/bcdice/game_system/InvisibleLiar.rb +79 -0
  51. data/lib/bcdice/game_system/Irisbane.rb +1 -1
  52. data/lib/bcdice/game_system/KillDeathBusiness.rb +1 -1
  53. data/lib/bcdice/game_system/KizunaBullet.rb +240 -0
  54. data/lib/bcdice/game_system/KyokoShinshoku.rb +201 -0
  55. data/lib/bcdice/game_system/Liminal.rb +136 -0
  56. data/lib/bcdice/game_system/MetalHead.rb +1 -1
  57. data/lib/bcdice/game_system/MetalHeadExtream.rb +1 -1
  58. data/lib/bcdice/game_system/MonotoneMuseum.rb +14 -1
  59. data/lib/bcdice/game_system/NRR.rb +122 -0
  60. data/lib/bcdice/game_system/NSSQ.rb +1 -1
  61. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  62. data/lib/bcdice/game_system/NightWizard3rd.rb +15 -2
  63. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  64. data/lib/bcdice/game_system/PastFutureParadox.rb +1238 -0
  65. data/lib/bcdice/game_system/Postman.rb +3 -3
  66. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  67. data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +1 -1
  68. data/lib/bcdice/game_system/Ryutama.rb +4 -4
  69. data/lib/bcdice/game_system/ShuumatsuBargainWars.rb +203 -0
  70. data/lib/bcdice/game_system/Siren.rb +97 -0
  71. data/lib/bcdice/game_system/Skynauts.rb +1 -1
  72. data/lib/bcdice/game_system/SkynautsBouken.rb +45 -130
  73. data/lib/bcdice/game_system/Strave.rb +1 -1
  74. data/lib/bcdice/game_system/SwordWorld.rb +1 -1
  75. data/lib/bcdice/game_system/TensaiGunshiNiNaro.rb +228 -0
  76. data/lib/bcdice/game_system/TheOneRing2nd.rb +406 -0
  77. data/lib/bcdice/game_system/TheUnofficialHollowKnightRPG.rb +185 -0
  78. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  79. data/lib/bcdice/game_system/TrailOfCthulhu.rb +139 -0
  80. data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
  81. data/lib/bcdice/game_system/UnsungDuet.rb +17 -75
  82. data/lib/bcdice/game_system/UnsungDuet_Korean.rb +41 -0
  83. data/lib/bcdice/game_system/Utakaze.rb +55 -2
  84. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +12 -6
  85. data/lib/bcdice/game_system/Warhammer4.rb +124 -3
  86. data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +12 -6
  87. data/lib/bcdice/game_system/Yotabana.rb +62 -0
  88. data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +1 -1
  89. data/lib/bcdice/game_system/cyberpunk_red/tables.rb +111 -473
  90. data/lib/bcdice/game_system/kizuna_bullet/tables.rb +171 -0
  91. data/lib/bcdice/game_system/sword_world/rating_parser.rb +4 -2
  92. data/lib/bcdice/game_system.rb +24 -0
  93. data/lib/bcdice/loader.rb +1 -1
  94. data/lib/bcdice/version.rb +1 -1
  95. metadata +55 -5
@@ -22,7 +22,7 @@ module BCDice
22
22
  if total <= 1
23
23
  Result.critical("貫通") # 1は常に貫通
24
24
  elsif total >= 100
25
- Result.fumble("致命的失敗") # 100は常に致命的失敗
25
+ Result.fumble("致命的失敗") # 100は常に致命的失敗
26
26
  elsif target == '?'
27
27
  Result.nothing
28
28
  elsif total <= (target / 5.0).ceil
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class FinalFantasyXIV < Base
6
+ # ゲームシステムの識別子
7
+ ID = "FinalFantasyXIV"
8
+
9
+ # ゲームシステム名
10
+ NAME = "FINAL FANTSY XIV TTRPG"
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = "ふあいなるふあんたしい14TTRPG"
14
+
15
+ HELP_MESSAGE = <<~TEXT
16
+ ・アビリティ判定 nAB+m>=x
17
+ d20のアビリティ判定を行う。ダイス数が指定された場合、大きい出目1個を採用する。
18
+ n: ダイス数(省略時 1)
19
+ m: 修正値(省略可)
20
+ x: 目標値(省略可)
21
+ 基本効果のみ、ダイレクトヒット、クリティカルを自動判定。
22
+ 例)AB, AB+5, AB+5>=14, 2AB+5>=14
23
+ ・行為判定 nDC+m>=x
24
+ アビリティ判定と同様。
25
+ 失敗、成功を自動判定。
26
+ TEXT
27
+
28
+ register_prefix('\d*AB', '\d*DC')
29
+
30
+ def eval_game_system_specific_command(command)
31
+ return abirity_roll(command) || action_roll(command)
32
+ end
33
+
34
+ private
35
+
36
+ def abirity_roll(command)
37
+ parser = Command::Parser.new("AB", round_type: round_type)
38
+ .enable_prefix_number()
39
+ .restrict_cmp_op_to(:>=, nil)
40
+ cmd = parser.parse(command)
41
+ return nil unless cmd
42
+
43
+ times = cmd.prefix_number || 1
44
+
45
+ dice_list_full = @randomizer.roll_barabara(times, 20).sort
46
+ dice_list_full_str = "[#{dice_list_full.join(',')}]" if times > 1
47
+
48
+ dice_list = dice_list_full[-1, 1]
49
+ dice_result = dice_list[0]
50
+
51
+ total = dice_result + cmd.modify_number
52
+
53
+ result =
54
+ if dice_result == 20
55
+ Result.critical(translate("critical"))
56
+ elsif cmd.cmp_op.nil?
57
+ Result.new
58
+ elsif total >= cmd.target_number
59
+ Result.success(translate("FinalFantasyXIV.directhit"))
60
+ else
61
+ Result.failure(translate("FinalFantasyXIV.normalhit"))
62
+ end
63
+
64
+ sequence = [
65
+ "(#{cmd.to_s(:after_modify_number)})",
66
+ dice_list_full_str,
67
+ "#{dice_result}[#{dice_list.join(',')}]#{Format.modifier(cmd.modify_number)}",
68
+ total,
69
+ result.text
70
+ ].compact
71
+
72
+ result.text = sequence.join(" > ")
73
+ result
74
+ end
75
+
76
+ def action_roll(command)
77
+ parser = Command::Parser.new("DC", round_type: round_type)
78
+ .enable_prefix_number()
79
+ .restrict_cmp_op_to(:>=, nil)
80
+ cmd = parser.parse(command)
81
+ return nil unless cmd
82
+
83
+ times = cmd.prefix_number || 1
84
+
85
+ dice_list_full = @randomizer.roll_barabara(times, 20).sort
86
+ dice_list_full_str = "[#{dice_list_full.join(',')}]" if times > 1
87
+
88
+ dice_list = dice_list_full[-1, 1]
89
+ dice_result = dice_list[0]
90
+
91
+ total = dice_result + cmd.modify_number
92
+
93
+ result =
94
+ if cmd.cmp_op.nil?
95
+ Result.new
96
+ elsif total >= cmd.target_number
97
+ Result.success(translate("success"))
98
+ else
99
+ Result.failure(translate("failure"))
100
+ end
101
+
102
+ sequence = [
103
+ "(#{cmd.to_s(:after_modify_number)})",
104
+ dice_list_full_str,
105
+ "#{dice_result}[#{dice_list.join(',')}]#{Format.modifier(cmd.modify_number)}",
106
+ total,
107
+ result.text
108
+ ].compact
109
+
110
+ result.text = sequence.join(" > ")
111
+ result
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/game_system/FinalFantasyXIV"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class FinalFantasyXIV_English < FinalFantasyXIV
8
+ # ゲームシステムの識別子
9
+ ID = "FinalFantasyXIV:English"
10
+
11
+ # ゲームシステム名
12
+ NAME = "FINAL FANTSY XIV TTRPG(English)"
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = "国際化:English:FINAL FANTASY XIV TTRPG"
16
+
17
+ HELP_MESSAGE = <<~TEXT
18
+ Ability Checks nAB+m>=CR
19
+ Perform a d20 ability check. If a die count is specified, the highest roll is adopted.
20
+ n: die count(optional)
21
+ m: modifiy number(optional)
22
+ CR: Challenge Ratting(optional)
23
+ Base Effect only, Direct hit and Critical are automatically evaluated.
24
+ Example: AB, AB+5, AB+5>=14, 2AB+5>=14
25
+ Making checks nDC+m>=CR
26
+ Same as ability check.
27
+ Success and Failure ar automatically evaluated.
28
+ TEXT
29
+
30
+ register_prefix_from_super_class()
31
+
32
+ def initialize(command)
33
+ super(command)
34
+
35
+ @locale = :en_us
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class FullFace < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'FullFace'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'フルフェイス'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'ふるふえいす'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
17
+ ■判定 x+bFF<=a[,t][&d] x:ヒート(省略時は3) b:判定修正 a:能力値 t:難易度(省略可) d:基本ダメージ(省略可)
18
+
19
+ 例)FF<=2: 能力値2で判定し、その結果(成功数,1の目の数,6の目の数,バースト)を表示。
20
+ 6FF<=3: ヒート6,能力値3で戦闘判定し、その結果( 〃 )を表示。
21
+ 8+2FF<=3: ヒート8,判定修正+2,能力値3で戦闘判定し、その結果( 〃 )を表示。
22
+ FF<=2,1: 能力値2,難易度1で判定し、その結果(成功数,1の目の数,6の目の数,成功・失敗,バースト)を表示。
23
+ 6FF<=3,2&1:ヒート6,能力値3,難易度2,基本ダメージ1で戦闘判定し、その結果(成功数,1の目の数,6の目の数,ダメージ,バースト)を表示。
24
+
25
+ INFO_MESSAGETEXT
26
+
27
+ register_prefix('([+\d]+)*FF')
28
+
29
+ def initialize(command)
30
+ super(command)
31
+
32
+ @sort_barabara_dice = true # バラバラロール(Bコマンド)でソート有
33
+ end
34
+
35
+ def eval_game_system_specific_command(command)
36
+ resolute_action(command)
37
+ end
38
+
39
+ private
40
+
41
+ # 戦闘判定
42
+ # @param [String] command
43
+ # @return [Result]
44
+ def resolute_action(command)
45
+ m = /^(\d*)([+\d]+)*FF<=(\d)(,(\d))?(&(\d))?$/.match(command)
46
+ return nil unless m
47
+
48
+ heat_level = m[1].to_i
49
+ heat_level = 3 if heat_level == 0
50
+ modify = Arithmetic.eval("0#{m[2]}", @round_type)
51
+ status_no = m[3].to_i
52
+ target_no = m[5].to_i
53
+ damage_no = m[7].to_i
54
+
55
+ dice_array = []
56
+
57
+ dice = @randomizer.roll_barabara(heat_level, 6).sort
58
+ ones = dice.count(1)
59
+ sixs = dice.count(6)
60
+ success_num = dice.count { |val| val <= status_no }
61
+ dice_array.push(dice.join(","))
62
+
63
+ if modify > 0
64
+ dice = @randomizer.roll_barabara(modify, 6).sort
65
+ ones += dice.count(1)
66
+ success_num += dice.count { |val| val <= status_no }
67
+ dice_array.push(dice.join(","))
68
+ end
69
+ ones_total = ones
70
+
71
+ while ones > 0
72
+ dice = @randomizer.roll_barabara(ones, 6).sort
73
+ ones = dice.count(1)
74
+ ones_total += ones
75
+ success_num += dice.count { |val| val <= status_no }
76
+ dice_array.push(dice.join(","))
77
+ end
78
+
79
+ return Result.new.tap do |result|
80
+ command_out = "(#{heat_level}#{Format.modifier(modify)}FF<=#{status_no}"
81
+ if sixs >= 2
82
+ result.fumble = true
83
+ result.condition = false
84
+ else
85
+ result.condition = (success_num > 0)
86
+ result.critical = (ones_total > 0)
87
+ end
88
+ result_txt = []
89
+ result_txt.push("成功度(#{success_num})")
90
+ result_txt.push("1の目(#{ones_total})") if ones_total > 0
91
+ result_txt.push("6の目(#{sixs})") if sixs > 0
92
+ if target_no > 0
93
+ command_out += ",#{target_no}"
94
+ if success_num >= target_no
95
+ result_txt.push("成功")
96
+ result.condition = true
97
+ else
98
+ result_txt.push("失敗")
99
+ result.condition = false
100
+ end
101
+ end
102
+ if damage_no > 0
103
+ command_out += "&#{damage_no}"
104
+ damage = damage_no + ones_total
105
+ result_txt.push("ダメージ(#{damage})")
106
+ end
107
+ result_txt.push("バースト") if result.fumble?
108
+ command_out += ")"
109
+
110
+ sequence = [
111
+ command_out,
112
+ dice_array.join('+').to_s,
113
+ result_txt.join(',').to_s,
114
+ ].compact
115
+
116
+ result.text = sequence.join(" > ")
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -21,15 +21,17 @@ module BCDice
21
21
  【セッション時】
22
22
  異常な癖決定表      SHRD/新・異常な癖決定表   SHND
23
23
  普通の?・異常な癖決定表 SHAD/ケイジ異常な癖決定表  SHKD
24
+ 超探偵向け異常な癖表   SHLD
24
25
   口から出る表    SHFM/強引な捜査表      SHBT/すっとぼけ表       SHPI
25
-  事件に夢中表    SHEG/パートナーと……表   SHWP/何かしている表      SHDS
26
+  事件に夢中表    SHEG/パートナーと……表    SHWP/何かしている表      SHDS
26
27
   奇想天外表     SHFT/急なひらめき表     SHIN/喜怒哀楽表        SHEM
27
28
   人間エミュレート表 SHHE/人間エミュレート失敗表 SHHF/パートナーへのいたずら表 SHMP
28
29
   思わせぶり表    SHSB/もどかしい表      SHFR/突然どうした表      SHIS
29
30
   わがままを言う表  SHSE/普通に見える表     SHLM/嫉妬に狂う表       SHJS
30
31
   傲慢な態度表    SHAR/比較的軽度なもの表   SHRM/ノータイム表       SHNT
31
32
   捜査のやり方表   SHIM/貴族表         SHNO/説明しない表       SHNE
32
-  刑事としての癖表  SHHD
33
+  刑事としての癖表  SHHD/名誉ある探偵表     SHGD/超すごい表        SHSA
34
+  超事件に夢中表   SHEP/超パートナーと……表   SHXP
33
35
  イベント表
34
36
   現場にて  EVS/なぜ?  EVW/協力者と共に EVN
35
37
   向こうから EVC/VS容疑者 EVV
@@ -38,7 +40,8 @@ module BCDice
38
40
   思わぬヒント EVH/実験をしてみよう EVX/ゲスト捜査 EVG
39
41
   ケイジ聞き込み捜査    EVQ/ケイジ大規模捜査      EVM/こっそり情報の受け渡し EVP
40
42
   同僚たちと一緒に捜査する EVO/頻染みの店シチュエーション EVF/ハードBデカアクション EVB
41
-  探偵を大人しくさせる捜査 EVL/伝統的捜査 EVZ/原始的捜査 EVR
43
+  探偵を大人しくさせる捜査 EVL/伝統的捜査         EVZ/原始的捜査       EVR
44
+  超探偵調査       EV6S/神速捜査         EV6F
42
45
  感情表
43
46
   感情表A/B   FLT66・FLT10
44
47
   気に入っているところ  FLTL66 /気に入らないところ  FLTD66
@@ -131,10 +134,70 @@ module BCDice
131
134
 
132
135
  def translate_tables(locale)
133
136
  {
134
- "SHRD" => DiceTable::Table.from_i18n("FutariSousa.table.SHRD", locale),
135
- "SHND" => DiceTable::Table.from_i18n("FutariSousa.table.SHND", locale),
136
- "SHAD" => DiceTable::Table.from_i18n("FutariSousa.table.SHAD", locale),
137
- "SHKD" => DiceTable::Table.from_i18n("FutariSousa.table.SHKD", locale),
137
+ "SHRD" => DiceTable::ChainTable.new(
138
+ I18n.translate("FutariSousa.table.SHRD.name", locale: locale),
139
+ "1D10",
140
+ [
141
+ DiceTable::Table.from_i18n("FutariSousa.table.SHFM", locale),
142
+ DiceTable::Table.from_i18n("FutariSousa.table.SHBT", locale),
143
+ DiceTable::Table.from_i18n("FutariSousa.table.SHPI", locale),
144
+ DiceTable::Table.from_i18n("FutariSousa.table.SHEG", locale),
145
+ DiceTable::Table.from_i18n("FutariSousa.table.SHWP", locale),
146
+ DiceTable::Table.from_i18n("FutariSousa.table.SHDS", locale),
147
+ DiceTable::Table.from_i18n("FutariSousa.table.SHIN", locale),
148
+ DiceTable::Table.from_i18n("FutariSousa.table.SHEM", locale),
149
+ DiceTable::Table.from_i18n("FutariSousa.table.SHFT", locale),
150
+ I18n.translate("FutariSousa.table.SHRD.items", locale: locale)[9],
151
+ ]
152
+ ),
153
+ "SHND" => DiceTable::ChainTable.new(
154
+ I18n.translate("FutariSousa.table.SHND.name", locale: locale),
155
+ "1D6",
156
+ [
157
+ DiceTable::Table.from_i18n("FutariSousa.table.SHHE", locale),
158
+ DiceTable::Table.from_i18n("FutariSousa.table.SHHF", locale),
159
+ DiceTable::Table.from_i18n("FutariSousa.table.SHMP", locale),
160
+ DiceTable::Table.from_i18n("FutariSousa.table.SHSB", locale),
161
+ DiceTable::Table.from_i18n("FutariSousa.table.SHFR", locale),
162
+ DiceTable::Table.from_i18n("FutariSousa.table.SHIS", locale),
163
+ ]
164
+ ),
165
+ "SHAD" => DiceTable::ChainTable.new(
166
+ I18n.translate("FutariSousa.table.SHAD.name", locale: locale),
167
+ "1D6",
168
+ [
169
+ DiceTable::Table.from_i18n("FutariSousa.table.SHSE", locale),
170
+ DiceTable::Table.from_i18n("FutariSousa.table.SHLM", locale),
171
+ DiceTable::Table.from_i18n("FutariSousa.table.SHJS", locale),
172
+ DiceTable::Table.from_i18n("FutariSousa.table.SHAR", locale),
173
+ DiceTable::Table.from_i18n("FutariSousa.table.SHRM", locale),
174
+ DiceTable::Table.from_i18n("FutariSousa.table.SHNT", locale),
175
+ ]
176
+ ),
177
+ "SHKD" => DiceTable::ChainTable.new(
178
+ I18n.translate("FutariSousa.table.SHKD.name", locale: locale),
179
+ "1D6",
180
+ [
181
+ DiceTable::Table.from_i18n("FutariSousa.table.SHIM", locale),
182
+ DiceTable::Table.from_i18n("FutariSousa.table.SHNO", locale),
183
+ DiceTable::Table.from_i18n("FutariSousa.table.SHNE", locale),
184
+ DiceTable::Table.from_i18n("FutariSousa.table.SHHD", locale),
185
+ I18n.translate("FutariSousa.table.SHKD.items", locale: locale)[4],
186
+ I18n.translate("FutariSousa.table.SHKD.items", locale: locale)[5],
187
+ ]
188
+ ),
189
+ "SHLD" => DiceTable::ChainTable.new(
190
+ I18n.translate("FutariSousa.table.SHLD.name", locale: locale),
191
+ "1D6",
192
+ [
193
+ DiceTable::Table.from_i18n("FutariSousa.table.SHGD", locale),
194
+ DiceTable::Table.from_i18n("FutariSousa.table.SHSA", locale),
195
+ DiceTable::Table.from_i18n("FutariSousa.table.SHEP", locale),
196
+ DiceTable::Table.from_i18n("FutariSousa.table.SHXP", locale),
197
+ I18n.translate("FutariSousa.table.SHLD.items", locale: locale)[4],
198
+ I18n.translate("FutariSousa.table.SHLD.items", locale: locale)[5],
199
+ ]
200
+ ),
138
201
  "SHFM" => DiceTable::Table.from_i18n("FutariSousa.table.SHFM", locale),
139
202
  "SHBT" => DiceTable::Table.from_i18n("FutariSousa.table.SHBT", locale),
140
203
  "SHPI" => DiceTable::Table.from_i18n("FutariSousa.table.SHPI", locale),
@@ -160,6 +223,10 @@ module BCDice
160
223
  "SHNO" => DiceTable::Table.from_i18n("FutariSousa.table.SHNO", locale),
161
224
  "SHNE" => DiceTable::Table.from_i18n("FutariSousa.table.SHNE", locale),
162
225
  "SHHD" => DiceTable::Table.from_i18n("FutariSousa.table.SHHD", locale),
226
+ "SHGD" => DiceTable::Table.from_i18n("FutariSousa.table.SHGD", locale),
227
+ "SHSA" => DiceTable::Table.from_i18n("FutariSousa.table.SHSA", locale),
228
+ "SHEP" => DiceTable::Table.from_i18n("FutariSousa.table.SHEP", locale),
229
+ "SHXP" => DiceTable::Table.from_i18n("FutariSousa.table.SHXP", locale),
163
230
  "EVS" => DiceTable::Table.from_i18n("FutariSousa.table.EVS", locale),
164
231
  "EVW" => DiceTable::Table.from_i18n("FutariSousa.table.EVW", locale),
165
232
  "EVN" => DiceTable::Table.from_i18n("FutariSousa.table.EVN", locale),
@@ -181,6 +248,8 @@ module BCDice
181
248
  "EVL" => DiceTable::Table.from_i18n("FutariSousa.table.EVL", locale),
182
249
  "EVZ" => DiceTable::Table.from_i18n("FutariSousa.table.EVZ", locale),
183
250
  "EVR" => DiceTable::Table.from_i18n("FutariSousa.table.EVR", locale),
251
+ "EV6S" => DiceTable::Table.from_i18n("FutariSousa.table.EV6S", locale),
252
+ "EV6F" => DiceTable::Table.from_i18n("FutariSousa.table.EV6F", locale),
184
253
  "OBT" => DiceTable::D66Table.from_i18n("FutariSousa.table.OBT", locale),
185
254
  "ACT" => DiceTable::Table.from_i18n("FutariSousa.table.ACT", locale),
186
255
  "EWT" => DiceTable::Table.from_i18n("FutariSousa.table.EWT", locale),
@@ -206,7 +275,18 @@ module BCDice
206
275
  "FLT10" => DiceTable::Table.from_i18n("FutariSousa.table.FLT10", locale),
207
276
  "FLTL66" => DiceTable::D66Table.from_i18n("FutariSousa.table.FLTL66", locale),
208
277
  "FLTD66" => DiceTable::D66Table.from_i18n("FutariSousa.table.FLTD66", locale),
209
- "FLTRA" => DiceTable::Table.from_i18n("FutariSousa.table.FLTRA", locale),
278
+ "FLTRA" => DiceTable::ChainTable.new(
279
+ I18n.translate("FutariSousa.table.FLTRA.name", locale: locale),
280
+ "1D6",
281
+ [
282
+ DiceTable::D66Table.from_i18n("FutariSousa.table.FLTF66", locale),
283
+ DiceTable::D66Table.from_i18n("FutariSousa.table.FLTB66", locale),
284
+ DiceTable::D66Table.from_i18n("FutariSousa.table.FLTH66", locale),
285
+ DiceTable::D66Table.from_i18n("FutariSousa.table.FLTS66", locale),
286
+ DiceTable::D66Table.from_i18n("FutariSousa.table.FLTA66", locale),
287
+ DiceTable::D66Table.from_i18n("FutariSousa.table.FLTW66", locale),
288
+ ]
289
+ ),
210
290
  "FLTF66" => DiceTable::D66Table.from_i18n("FutariSousa.table.FLTF66", locale),
211
291
  "FLTB66" => DiceTable::D66Table.from_i18n("FutariSousa.table.FLTB66", locale),
212
292
  "FLTH66" => DiceTable::D66Table.from_i18n("FutariSousa.table.FLTH66", locale),
@@ -13,7 +13,10 @@ module BCDice
13
13
  SORT_KEY = 'むけんのふあんたしあ'
14
14
 
15
15
  # ダイスボットの使い方
16
- HELP_MESSAGE = "失敗、成功レベルの自動判定を行います。"
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ 1D20に目標値を設定した場合に、成功レベルの自動判定を行います。
18
+ 例: 1D20<=16
19
+ INFO_MESSAGE_TEXT
17
20
 
18
21
  # ゲーム別成功度判定(1d20)
19
22
  def result_1d20(total, _dice_total, cmp_op, target)
@@ -19,7 +19,7 @@ module BCDice
19
19
  ・판정
20
20
  스페셜/펌블/성공/실패를 판정
21
21
  ・각종표
22
- 씬표   ST
22
+ 장면표   ST
23
23
   사실은 무서운 현대 일본 장면표 HJST/광란의 20년대 장면표 MTST
24
24
   빅토리아의 어둠 장면표 DVST
25
25
  형용표    DT
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class InvisibleLiar < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'InvisibleLiar'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'インビジブルライアー'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'いんひしふるらいああ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~HELP
17
+ ■ 採取表
18
+ WOODSn 森
19
+ PRAIRIEn 草原
20
+ LAKEn 湖
21
+ RIVERn 川辺
22
+ SWAMPn 沼地
23
+ CAVEn 洞窟
24
+ ROCKYn 岩場
25
+ MOUNTAINn 山岳
26
+ n: 採取時間(1〜5)
27
+ HELP
28
+
29
+ def eval_game_system_specific_command(command)
30
+ roll_tables(command, TABLES)
31
+ end
32
+
33
+ TABLES = {
34
+ "WOODS1" => DiceTable::Table.new("森 1時間", "1D6", ["麗し草", "麗し草", "麗し草", "神秘のキノコ", "妖精の羽", "成果なし"]),
35
+ "WOODS2" => DiceTable::Table.new("森 2時間", "1D6", ["麗し草", "麗し草", "神秘のキノコ", "神秘のキノコ", "妖精の羽", "成果なし"]),
36
+ "WOODS3" => DiceTable::Table.new("森 3時間", "1D6", ["麗し草", "神秘のキノコ", "神秘のキノコ", "神秘のキノコ", "妖精の羽", "成果なし"]),
37
+ "WOODS4" => DiceTable::Table.new("森 4時間", "1D6", ["麗し草", "神秘のキノコ", "神秘のキノコ", "妖精の羽", "妖精の羽", "成果なし"]),
38
+ "WOODS5" => DiceTable::Table.new("森 5時間", "1D6", ["麗し草", "神秘のキノコ", "妖精の羽", "妖精の羽", "妖精の羽", "成果なし"]),
39
+ "PRAIRIE1" => DiceTable::Table.new("草原 1時間", "1D6", ["太陽の花", "太陽の花", "太陽の花", "生命の虫", "妖精の羽", "成果なし"]),
40
+ "PRAIRIE2" => DiceTable::Table.new("草原 2時間", "1D6", ["太陽の花", "太陽の花", "生命の虫", "生命の虫", "妖精の羽", "成果なし"]),
41
+ "PRAIRIE3" => DiceTable::Table.new("草原 3時間", "1D6", ["太陽の花", "生命の虫", "生命の虫", "生命の虫", "妖精の羽", "成果なし"]),
42
+ "PRAIRIE4" => DiceTable::Table.new("草原 4時間", "1D6", ["太陽の花", "生命の虫", "生命の虫", "妖精の羽", "妖精の羽", "成果なし"]),
43
+ "PRAIRIE5" => DiceTable::Table.new("草原 5時間", "1D6", ["太陽の花", "生命の虫", "妖精の羽", "妖精の羽", "妖精の羽", "成果なし"]),
44
+ "LAKE1" => DiceTable::Table.new("湖 1時間", "1D6", ["竜の鱗", "竜の鱗", "竜の鱗", "マンドレイク", "幻獣の涙", "成果なし"]),
45
+ "LAKE2" => DiceTable::Table.new("湖 2時間", "1D6", ["竜の鱗", "竜の鱗", "マンドレイク", "マンドレイク", "幻獣の涙", "成果なし"]),
46
+ "LAKE3" => DiceTable::Table.new("湖 3時間", "1D6", ["竜の鱗", "マンドレイク", "マンドレイク", "マンドレイク", "幻獣の涙", "成果なし"]),
47
+ "LAKE4" => DiceTable::Table.new("湖 4時間", "1D6", ["竜の鱗", "マンドレイク", "マンドレイク", "幻獣の涙", "幻獣の涙", "成果なし"]),
48
+ "LAKE5" => DiceTable::Table.new("湖 5時間", "1D6", ["竜の鱗", "マンドレイク", "幻獣の涙", "幻獣の涙", "幻獣の涙", "成果なし"]),
49
+ "RIVER1" => DiceTable::Table.new("川辺 1時間", "1D6", ["魔魚", "魔魚", "魔魚", "麗し草", "幻獣の涙", "成果なし"]),
50
+ "RIVER2" => DiceTable::Table.new("川辺 2時間", "1D6", ["魔魚", "魔魚", "麗し草", "麗し草", "幻獣の涙", "成果なし"]),
51
+ "RIVER3" => DiceTable::Table.new("川辺 3時間", "1D6", ["魔魚", "麗し草", "麗し草", "麗し草", "幻獣の涙", "成果なし"]),
52
+ "RIVER4" => DiceTable::Table.new("川辺 4時間", "1D6", ["魔魚", "麗し草", "麗し草", "幻獣の涙", "幻獣の涙", "成果なし"]),
53
+ "RIVER5" => DiceTable::Table.new("川辺 5時間", "1D6", ["魔魚", "麗し草", "幻獣の涙", "幻獣の涙", "幻獣の涙", "成果なし"]),
54
+ "SWAMP1" => DiceTable::Table.new("沼地 1時間", "1D6", ["マンドレイク", "マンドレイク", "マンドレイク", "魔魚", "畏怖の化石", "成果なし"]),
55
+ "SWAMP2" => DiceTable::Table.new("沼地 2時間", "1D6", ["マンドレイク", "マンドレイク", "魔魚", "魔魚", "畏怖の化石", "成果なし"]),
56
+ "SWAMP3" => DiceTable::Table.new("沼地 3時間", "1D6", ["マンドレイク", "魔魚", "魔魚", "魔魚", "畏怖の化石", "成果なし"]),
57
+ "SWAMP4" => DiceTable::Table.new("沼地 4時間", "1D6", ["マンドレイク", "魔魚", "魔魚", "畏怖の化石", "畏怖の化石", "成果なし"]),
58
+ "SWAMP5" => DiceTable::Table.new("沼地 5時間", "1D6", ["マンドレイク", "魔魚", "畏怖の化石", "畏怖の化石", "畏怖の化石", "成果なし"]),
59
+ "CAVE1" => DiceTable::Table.new("洞窟 1時間", "1D6", ["神秘のキノコ", "神秘のキノコ", "神秘のキノコ", "魔素の結晶", "畏怖の化石", "成果なし"]),
60
+ "CAVE2" => DiceTable::Table.new("洞窟 2時間", "1D6", ["神秘のキノコ", "神秘のキノコ", "魔素の結晶", "魔素の結晶", "畏怖の化石", "成果なし"]),
61
+ "CAVE3" => DiceTable::Table.new("洞窟 3時間", "1D6", ["神秘のキノコ", "魔素の結晶", "魔素の結晶", "魔素の結晶", "畏怖の化石", "成果なし"]),
62
+ "CAVE4" => DiceTable::Table.new("洞窟 4時間", "1D6", ["神秘のキノコ", "魔素の結晶", "魔素の結晶", "畏怖の化石", "畏怖の化石", "成果なし"]),
63
+ "CAVE5" => DiceTable::Table.new("洞窟 5時間", "1D6", ["神秘のキノコ", "魔素の結晶", "畏怖の化石", "畏怖の化石", "畏怖の化石", "成果なし"]),
64
+ "ROCKY1" => DiceTable::Table.new("岩場 1時間", "1D6", ["生命の虫", "生命の虫", "生命の虫", "竜の鱗", "星の欠片", "成果なし"]),
65
+ "ROCKY2" => DiceTable::Table.new("岩場 2時間", "1D6", ["生命の虫", "生命の虫", "竜の鱗", "竜の鱗", "星の欠片", "成果なし"]),
66
+ "ROCKY3" => DiceTable::Table.new("岩場 3時間", "1D6", ["生命の虫", "竜の鱗", "竜の鱗", "竜の鱗", "星の欠片", "成果なし"]),
67
+ "ROCKY4" => DiceTable::Table.new("岩場 4時間", "1D6", ["生命の虫", "竜の鱗", "竜の鱗", "星の欠片", "星の欠片", "成果なし"]),
68
+ "ROCKY5" => DiceTable::Table.new("岩場 5時間", "1D6", ["生命の虫", "竜の鱗", "星の欠片", "星の欠片", "星の欠片", "成果なし"]),
69
+ "MOUNTAIN1" => DiceTable::Table.new("山岳 1時間", "1D6", ["魔素の結晶", "魔素の結晶", "魔素の結晶", "太陽の花", "星の欠片", "成果なし"]),
70
+ "MOUNTAIN2" => DiceTable::Table.new("山岳 2時間", "1D6", ["魔素の結晶", "魔素の結晶", "太陽の花", "太陽の花", "星の欠片", "成果なし"]),
71
+ "MOUNTAIN3" => DiceTable::Table.new("山岳 3時間", "1D6", ["魔素の結晶", "太陽の花", "太陽の花", "太陽の花", "星の欠片", "成果なし"]),
72
+ "MOUNTAIN4" => DiceTable::Table.new("山岳 4時間", "1D6", ["魔素の結晶", "太陽の花", "太陽の花", "星の欠片", "星の欠片", "成果なし"]),
73
+ "MOUNTAIN5" => DiceTable::Table.new("山岳 5時間", "1D6", ["魔素の結晶", "太陽の花", "星の欠片", "星の欠片", "星の欠片", "成果なし"]),
74
+ }.freeze
75
+
76
+ register_prefix(TABLES.keys)
77
+ end
78
+ end
79
+ end
@@ -37,7 +37,7 @@ module BCDice
37
37
  SceneSituation, SSi
38
38
  HELP
39
39
 
40
- ATTACK_ROLL_REG = %r{^AT(TACK|K)?([+\-*/()\d]+)@([+\-*/()\d]+)<=([+\-*/()\d]+)(\[([+\-])([+\-*/()\d]+)\])?}i.freeze
40
+ ATTACK_ROLL_REG = %r{^AT(TACK|K)?([+\-*/()\d]+)@([+\-*/()\d]+)<=([+\-*/()\d]+)(\[([+-])([+\-*/()\d]+)\])?}i.freeze
41
41
  register_prefix('AT(TACK|K)?')
42
42
 
43
43
  def initialize(command)
@@ -101,7 +101,7 @@ module BCDice
101
101
  target = 5
102
102
  end
103
103
 
104
- if fumble < 2
104
+ if fumble < 2
105
105
  fumble = 2
106
106
  elsif fumble > 11
107
107
  result += "【#{command}】 > #{translate('KillDeathBusiness.JD.warning.over_fumble')}\n"