bcdice 3.13.0 → 3.15.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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +104 -0
  3. data/i18n/Arianrhod/ko_kr.yml +3 -0
  4. data/i18n/Cthulhu/en_us.yml +11 -0
  5. data/i18n/Cthulhu/zh_hant.yml +1 -1
  6. data/i18n/CyberpunkRed/ja_jp.yml +389 -0
  7. data/i18n/CyberpunkRed/ko_kr.yml +389 -0
  8. data/i18n/DoubleCross/ja_jp.yml +53 -0
  9. data/i18n/DoubleCross/ko_kr.yml +52 -0
  10. data/i18n/FinalFantasyXIV/en_us.yml +4 -0
  11. data/i18n/FinalFantasyXIV/ja_jp.yml +4 -0
  12. data/i18n/FutariSousa/ja_jp.yml +284 -127
  13. data/i18n/KillDeathBusiness/ja_jp.yml +198 -0
  14. data/i18n/KizunaBullet/ja_jp.yml +653 -0
  15. data/i18n/MagicaLogia/ko_kr.yml +2 -2
  16. data/i18n/MonotoneMuseum/ja_jp.yml +246 -14
  17. data/i18n/MonotoneMuseum/ko_kr.yml +227 -0
  18. data/i18n/SkynautsBouken/ja_jp.yml +114 -0
  19. data/i18n/SkynautsBouken/ko_kr.yml +114 -0
  20. data/i18n/StratoShout/ko_kr.yml +102 -102
  21. data/i18n/TensaiGunshiNiNaro/ja_jp.yml +126 -0
  22. data/i18n/UnsungDuet/ja_jp.yml +62 -0
  23. data/i18n/UnsungDuet/ko_kr.yml +62 -0
  24. data/i18n/en_us.yml +5 -0
  25. data/i18n/zh_hant.yml +5 -0
  26. data/lib/bcdice/dice_table/range_table.rb +24 -0
  27. data/lib/bcdice/game_system/Agnostos.rb +248 -0
  28. data/lib/bcdice/game_system/Aionia.rb +131 -0
  29. data/lib/bcdice/game_system/AniMalus.rb +99 -59
  30. data/lib/bcdice/game_system/Arianrhod_Korean.rb +32 -0
  31. data/lib/bcdice/game_system/ArknightsFan.rb +245 -87
  32. data/lib/bcdice/game_system/BlackJacket.rb +244 -0
  33. data/lib/bcdice/game_system/BlackJacket_Korean.rb +244 -0
  34. data/lib/bcdice/game_system/CharonSanctions.rb +112 -0
  35. data/lib/bcdice/game_system/ConvictorDrive.rb +5 -4
  36. data/lib/bcdice/game_system/Cthulhu7th.rb +1 -1
  37. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional/full_auto.rb +293 -0
  38. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional/rollable.rb +43 -0
  39. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +470 -306
  40. data/lib/bcdice/game_system/Cthulhu_English.rb +59 -0
  41. data/lib/bcdice/game_system/CyberpunkRed.rb +15 -6
  42. data/lib/bcdice/game_system/CyberpunkRed_Korean.rb +66 -0
  43. data/lib/bcdice/game_system/DivineCharger.rb +841 -0
  44. data/lib/bcdice/game_system/DoubleCross.rb +18 -1
  45. data/lib/bcdice/game_system/DoubleCross_Korean.rb +5 -1
  46. data/lib/bcdice/game_system/FinalFantasyXIV.rb +115 -0
  47. data/lib/bcdice/game_system/FinalFantasyXIV_English.rb +39 -0
  48. data/lib/bcdice/game_system/FullFace.rb +63 -12
  49. data/lib/bcdice/game_system/FutariSousa.rb +105 -13
  50. data/lib/bcdice/game_system/Garactier.rb +479 -0
  51. data/lib/bcdice/game_system/GardenOrder.rb +390 -9
  52. data/lib/bcdice/game_system/GundogRevised.rb +8 -8
  53. data/lib/bcdice/game_system/Insane_Korean.rb +1 -1
  54. data/lib/bcdice/game_system/InvisibleLiar.rb +79 -0
  55. data/lib/bcdice/game_system/KillDeathBusiness.rb +155 -3
  56. data/lib/bcdice/game_system/KimitoYell.rb +568 -0
  57. data/lib/bcdice/game_system/KizunaBullet.rb +240 -0
  58. data/lib/bcdice/game_system/KyokoShinshoku.rb +51 -8
  59. data/lib/bcdice/game_system/Magius.rb +125 -0
  60. data/lib/bcdice/game_system/Magius_3rdNewTokyoCity.rb +62 -0
  61. data/lib/bcdice/game_system/MonotoneMuseum.rb +14 -1
  62. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
  63. data/lib/bcdice/game_system/NRR.rb +2 -2
  64. data/lib/bcdice/game_system/NSSQ.rb +17 -9
  65. data/lib/bcdice/game_system/NervWhitePaper.rb +129 -0
  66. data/lib/bcdice/game_system/RogueLikeHalf.rb +198 -0
  67. data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +16 -13
  68. data/lib/bcdice/game_system/ShinobiGami.rb +73 -43
  69. data/lib/bcdice/game_system/ShuumatsuBargainWars.rb +203 -0
  70. data/lib/bcdice/game_system/SkynautsBouken.rb +49 -134
  71. data/lib/bcdice/game_system/SkynautsBouken_Korean.rb +57 -0
  72. data/lib/bcdice/game_system/StratoShout_Korean.rb +1 -1
  73. data/lib/bcdice/game_system/SwordWorld.rb +5 -1
  74. data/lib/bcdice/game_system/SwordWorld2_5.rb +3 -2
  75. data/lib/bcdice/game_system/TensaiGunshiNiNaro.rb +262 -0
  76. data/lib/bcdice/game_system/TheIndieHack.rb +82 -0
  77. data/lib/bcdice/game_system/TheOneRing2nd.rb +406 -0
  78. data/lib/bcdice/game_system/TheUnofficialHollowKnightRPG.rb +185 -0
  79. data/lib/bcdice/game_system/TorgEternity.rb +35 -6
  80. data/lib/bcdice/game_system/TrailOfCthulhu.rb +139 -0
  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/Warhammer4.rb +124 -3
  85. data/lib/bcdice/game_system/WoW.rb +161 -0
  86. data/lib/bcdice/game_system/YankeeMustDie.rb +192 -0
  87. data/lib/bcdice/game_system/YearZeroEngine.rb +225 -28
  88. data/lib/bcdice/game_system/Yotabana.rb +62 -0
  89. data/lib/bcdice/game_system/YuMyoKishi.rb +141 -0
  90. data/lib/bcdice/game_system/cyberpunk_red/tables.rb +111 -473
  91. data/lib/bcdice/game_system/kizuna_bullet/tables.rb +171 -0
  92. data/lib/bcdice/game_system/sword_world/rating_lexer.rb +1 -0
  93. data/lib/bcdice/game_system/sword_world/rating_options.rb +4 -1
  94. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +5 -0
  95. data/lib/bcdice/game_system/sword_world/rating_parser.rb +129 -115
  96. data/lib/bcdice/game_system.rb +31 -0
  97. data/lib/bcdice/version.rb +1 -1
  98. metadata +50 -6
@@ -0,0 +1,244 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/dice_table/range_table'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class BlackJacket_Korean < BlackJacket
8
+ # ゲームシステムの識別子
9
+ ID = 'BlackJacket:Korean'
10
+
11
+ # ゲームシステム名
12
+ NAME = '블랙재킷RPG'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Korean:블랙재킷RPG'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
+ ・행위 판정(BJx)
20
+  x:성공률
21
+  예)BJ80
22
+  크리티컬,펌블 여부는 자동으로 판정합니다.
23
+  「BJ50+20-30」처럼 값을 가감하여 기재할 수 있습니다.
24
+  성공률의 상한은 100%、하한은 0% 입니다.
25
+ ・데스 차트 (DCxY)
26
+  x:차트 종류. 육체:DCL, 정신:DCS, 환경:DCC
27
+  Y=마이너스 값
28
+  예)DCL5:라이프 마이너스 값 5 + 1D10 판정
29
+    DCS3:새니티 마이너스 값 3 + 1D10 판정
30
+    DCC0:크레딧 마이너스 값 0 + 1D10 판정
31
+ ・챌린지・패널티 차트(CPC)
32
+ ・사이드 트랙 차트(STC)
33
+ INFO_MESSAGE_TEXT
34
+
35
+ def eval_game_system_specific_command(command)
36
+ resolute_action(command) || roll_death_chart(command) || roll_tables(command, TABLES)
37
+ end
38
+
39
+ private
40
+
41
+ def resolute_action(command)
42
+ m = /^BJ(\d+([+-]\d+)*)$/.match(command)
43
+ unless m
44
+ return nil
45
+ end
46
+
47
+ success_rate = ArithmeticEvaluator.eval(m[1])
48
+
49
+ roll_result, dice10, dice01 = roll_d100
50
+ roll_result_text = format('%02d', roll_result)
51
+
52
+ result = action_result(roll_result, dice10, dice01, success_rate)
53
+
54
+ sequence = [
55
+ "행위판정(성공률:#{success_rate}%)",
56
+ "1D100[#{dice10},#{dice01}]=#{roll_result_text}",
57
+ roll_result_text.to_s,
58
+ result.text
59
+ ]
60
+
61
+ result.text = sequence.join(" > ")
62
+ result
63
+ end
64
+
65
+ SUCCESS_STR = "성공"
66
+ FAILURE_STR = "실패"
67
+ CRITICAL_STR = (SUCCESS_STR + " > 크리티컬! 파워의 대가(코스트) 절반으로 감소").freeze
68
+ FUMBLE_STR = (FAILURE_STR + " > 펌블! 파워의 대가(코스트) 2배 & 재굴림 불가").freeze
69
+ MISERY_STR = (FAILURE_STR + " > 미저리! 파워의 대가(코스트) 2배 & 재굴림 불가").freeze
70
+
71
+ def action_result(total, tens, ones, success_rate)
72
+ if total == 100
73
+ Result.fumble(MISERY_STR)
74
+ elsif success_rate <= 0
75
+ Result.fumble(FUMBLE_STR)
76
+ elsif total <= success_rate - 100
77
+ Result.critical(CRITICAL_STR)
78
+ elsif tens == ones
79
+ if total <= success_rate
80
+ Result.critical(CRITICAL_STR)
81
+ else
82
+ Result.fumble(FUMBLE_STR)
83
+ end
84
+ elsif total <= success_rate
85
+ Result.success(SUCCESS_STR)
86
+ else
87
+ Result.failure(FAILURE_STR)
88
+ end
89
+ end
90
+
91
+ def roll_d100
92
+ dice10 = @randomizer.roll_once(10)
93
+ dice10 = 0 if dice10 == 10
94
+ dice01 = @randomizer.roll_once(10)
95
+ dice01 = 0 if dice01 == 10
96
+
97
+ roll_result = dice10 * 10 + dice01
98
+ roll_result = 100 if roll_result == 0
99
+
100
+ return roll_result, dice10, dice01
101
+ end
102
+
103
+ class DeathChart
104
+ def initialize(name, chart)
105
+ @name = name
106
+ @chart = chart.freeze
107
+
108
+ if @chart.size != 11
109
+ raise ArgumentError, "unexpected chart size #{name.inspect} (given #{@chart.size}, expected 11)"
110
+ end
111
+ end
112
+
113
+ # @param randomizer [Randomizer]
114
+ # @param minus_score [Integer]
115
+ # @return [String]
116
+ def roll(randomizer, minus_score)
117
+ dice = randomizer.roll_once(10)
118
+ key_number = dice + minus_score
119
+
120
+ key_text, chosen = at(key_number)
121
+
122
+ return "데스 차트(#{@name})[마이너스 값:#{minus_score} + 1D10(->#{dice}) = #{key_number}] > #{key_text} : #{chosen}"
123
+ end
124
+
125
+ private
126
+
127
+ # key_numberの10から20がindexの0から10に対応する
128
+ def at(key_number)
129
+ if key_number < 10
130
+ ["10이하", @chart.first]
131
+ elsif key_number > 20
132
+ ["20이상", @chart.last]
133
+ else
134
+ [key_number.to_s, @chart[key_number - 10]]
135
+ end
136
+ end
137
+ end
138
+
139
+ def roll_death_chart(command)
140
+ m = /^DC([LSC])(\d+)$/i.match(command)
141
+ unless m
142
+ return m
143
+ end
144
+
145
+ chart = DEATH_CHARTS[m[1]]
146
+ minus_score = m[2].to_i
147
+
148
+ return chart.roll(@randomizer, minus_score)
149
+ end
150
+
151
+ DEATH_CHARTS = {
152
+ 'L' => DeathChart.new(
153
+ '육체',
154
+ [
155
+ "효과 없음. 당신은 기적적으로 목숨을 건졌다. 싸움은 계속된다.",
156
+ "격한 통증을 느낀다. 이후 이벤트가 끝날 때까지 모든 판정의 성공률에 -10%.",
157
+ "더이상 몸이 움직이지 않는다…… 당신은 [경직 2]를 받는다.",
158
+ "혼신의 일격!! 당신은 〈생존〉 판정을 한다. 실패할 경우 [사망]한다.",
159
+ "갑자기 눈앞이 캄캄해진다. 당신은 [기절 2]를 받는다.",
160
+ "이후, 이벤트 종료까지 모든 판정의 성공률 -20%.",
161
+ "기록적인 일격!! 당신은 〈생존〉 -20% 으로 판정한다. 실패할 경우 [사망]한다.",
162
+ "사느냐 죽느냐. 당신은 [빈사 2]를 받는다.",
163
+ "역사에 한 획을 그을 일격!! 당신은 <생존> -30% 으로 판정한다. 실패할 경우 [사망]한다.",
164
+ "이후, 이벤트 종료 시까지 모든 판정의 성공률 -30%.",
165
+ "신화적 일격!! 공중에서 세 바퀴 정도 회전한 후 땅바닥에 내동댕이쳐진다. 보기에도 끔찍한 모습. 육체는 원형을 유지하지 못했다. 당신은 [사망]한다.",
166
+ ]
167
+ ),
168
+ 'S' => DeathChart.new(
169
+ '정신',
170
+ [
171
+ "효과 없음. 당신은 이를 악물고 스트레스를 견뎌냈다.",
172
+ "이후, 이벤트 종료 시까지 모든 판정의 성공률 -10%.",
173
+ "말할 수 없는 공포가 당신을 엄습한다. 당신은 [공포 2]를 받는다.",
174
+ "상처를 많이 받았다. 당신은 〈의지〉 판정을 한다. 실패할 경우 [절망] 상태가 되어서 NPC가 된다.",
175
+ "의식을 잃었다. 당신은 [기절 2]를 받는다.",
176
+ "이후, 이벤트 종료 시까지 모든 판정의 성공률 -20%.",
177
+ "신뢰했던 자에게 속은 아픔. 당신은 〈의지〉 -20% 으로 판정한다. 실패할 경우, [절망] 상태가 되어서 NPC가 된다.",
178
+ "동료에게 배신 당한 것일지도 모른다. 당신은 [혼란 2]를 받는다.",
179
+ "너무나 참혹한 현실. 당신은 〈의지〉 -30% 으로 판정한다. 실패할 경우 [절망] 상태가 되어서 NPC가 된다.",
180
+ "이후, 이벤트 종료 시까지 모든 판정의 성공률 -30%.",
181
+ "천지개벽의 이치 그 이상. 그것은 인류의 인식한계를 뛰어넘는 무언가였다. 당신은 [절망] 상태가 된 후 NPC가 된다.",
182
+ ]
183
+ ),
184
+ 'C' => DeathChart.new(
185
+ '환경',
186
+ [
187
+ "효과 없음. 당신은 뒤숭숭한 소문을 무시했다.",
188
+ "이후, 이벤트 종료 시까지 모든 판정의 성공률 -10%.",
189
+ "위험한 상태! 이후, 라운드 종료 시까지 당신은 카르마를 사용할 수 없다.",
190
+ "나쁜 소문이 돈다. 당신은 〈교섭〉 판정을 한다. 실패할 경우 당신은 동료들의 신뢰를 잃고 [무연고] 상태가 된 후 NPC가 된다.",
191
+ "이후, 시나리오 종료 시까지 대가(코스트)에 크레딧을 소비하는 파워를 사용할 수 없다.",
192
+ "당신의 악평이 세상에 널리 알려진다. 협력자로부터의 지원이 중단된다. 이후 시나리오 종료 시까지 모든 판정의 성공률 -20%.",
193
+ "배신!! 당신은 〈경제〉 -20% 으로 판정한다. 실패할 경우 당신은 주위로부터 신용을 잃고, [무연고] 상태가 되어 NPC가 된다.",
194
+ "이후, 시나리오 종료 시까지 【환경】 계열의 기능 레벨이 모두 0이 된다.",
195
+ "날조 보도? 기억나지 않는 배신 행위가 특종으로 보도된다. 당신은 〈심리〉 -30% 으로 판정한다. 실패할 경우 당신은 인간으로서의 존엄성을 잃고, [무연고]가 된다.",
196
+ "이후, 이벤트 종료 시까지 모든 판정 성공률 -30%.",
197
+ "당신의 이름은 사상 최악의 오점으로 영원히 역사에 새겨진다. 이제 당신을 믿는 동료는 없고 당신을 돕는 사회도 없다. 당신은 [무연고] 상태가 된 후 NPC가 된다.",
198
+ ]
199
+ )
200
+ }.freeze
201
+
202
+ TABLES = {
203
+ "CPC" => DiceTable::Table.new(
204
+ "챌린지・패널티 차트",
205
+ "1D10",
206
+ [
207
+ "사망\n도와야 할 NPC (히로인 등)가 사망한다.",
208
+ "검은 별\n적이 목적을 성취하고, 사건은 PC의 패배로 끝난다. 그대로 여운 페이즈로 넘어갈 것.",
209
+ "활성\n적 보스의 라이프를 2배로 한 다음 결전 페이즈를 개시한다.",
210
+ "공세\n적 보스의 대미지에 +2D6의 수정을 준 후 결전 페이즈를 개시한다.",
211
+ "대거\n적의 수(보스 제외)를 2배로 한 후 결전 페이즈를 개시한다.",
212
+ "암흑\n모든 에리어(구역)을 [어둠]으로 만든 다음 결전 페이즈를 개시한다.",
213
+ "맹화\n전투 에리어(구역) 2개를 [대미지 존 2]로 취급한 후, 결전 페이즈를 개시한다.",
214
+ "복병\n적의 절반을 에리어(구역) 1과 에리어(구역) 2로 이동시킨 후, 결전 페이즈를 개시한다.",
215
+ "만복\n보스 이외의 적의 라이프를 모두 2배로 한 다음, 결전 페이즈를 개시한다.",
216
+ "봉인\nPC는 결전 페이즈 동안 카르마를 사용할 수 없다. 결전 페이즈를 개시한다."
217
+ ]
218
+ ),
219
+ "STC" => DiceTable::Table.new(
220
+ "사이드 트랙 차트",
221
+ "1D10",
222
+ [
223
+ "해후\n우연히 NPC와 만난다. 어떤 NPC가 나타날지는 GM이 결정한다.",
224
+ "사고\교통사고를 당한다. 주변에서 패닉이 일어나고 있을지도 모른다.",
225
+ "낮잠\n지독한 졸음이 몰려온다. 설마, 신참 빌런의 능력인가?",
226
+ "고백\nNPC 한 명이 지금까지 간직하고 있던 마음을 당신에게 고백한다.",
227
+ "설정\n새로운 설정이 밝혀진다. 사실은 NPC의 아버지였다든가, 선천적으로 눈이 보이지 않는다든가.",
228
+ "자객\n누군가로부터 공격을 받는다. 제3세력인가?",
229
+ "불청객\n우연히 원수 한 명과 마주친다. 상황에 따라서 바로 전투가 발생할지도 모른다.",
230
+ "의심\n수상한 사람을 눈치챘다. 따라가야 하나? 무시해야 하나?",
231
+ "조우\n시나리오와 관계없는 빌런 조직과 조우한다.",
232
+ "평화\n별일 없었다.",
233
+ ]
234
+ ),
235
+ }.freeze
236
+
237
+ register_prefix(
238
+ 'BJ',
239
+ 'DC[LSC]',
240
+ TABLES.keys
241
+ )
242
+ end
243
+ end
244
+ end
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class CharonSanctions < Base
6
+ # ゲームシステムの識別子
7
+ ID = "CharonSanctions"
8
+
9
+ # ゲームシステム名
10
+ NAME = "カローン・サンクションズ"
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = "かろおんさんくしおんす"
14
+
15
+ HELP_MESSAGE = <<~TEXT
16
+ ■ 判定
17
+ nCSm>=t [判定]を行う。成功/不完全成功を判定。(p.111)
18
+ n: ダイス数
19
+ m: [難易度](省略時 4)
20
+ t: [必要成功数](省略時 1)
21
+
22
+ ■ 各種表
23
+ ET 感情ワード(キャラクター)表(p.120)
24
+ RT 襲撃表(p.146)
25
+ TEXT
26
+
27
+ def eval_game_system_specific_command(command)
28
+ action_roll(command) ||
29
+ roll_tables(command, TABLES)
30
+ end
31
+
32
+ private
33
+
34
+ def action_roll(command)
35
+ parser = Command::Parser.new("CS", round_type: round_type)
36
+ .has_prefix_number
37
+ .enable_suffix_number
38
+ .disable_modifier
39
+ .restrict_cmp_op_to(nil, :>=)
40
+ cmd = parser.parse(command)
41
+ return nil unless cmd
42
+
43
+ times = cmd.prefix_number
44
+ return nil if times < 1
45
+
46
+ required = (cmd.suffix_number || 4).clamp(2, 6)
47
+ target = cmd.target_number || 1
48
+
49
+ dice_list = @randomizer.roll_barabara(times, 6)
50
+ count = dice_list.count { |i| i >= required }
51
+
52
+ result =
53
+ if count >= target
54
+ Result.success("成功")
55
+ else
56
+ Result.failure("不完全成功")
57
+ end
58
+
59
+ sequence = [
60
+ "(#{cmd})",
61
+ "(#{times}B6>=#{required}[>=#{target}])",
62
+ "[#{dice_list.join(',')}]",
63
+ "成功数:#{count}",
64
+ result.text
65
+ ].compact
66
+
67
+ result.text = sequence.join(" > ")
68
+ result
69
+ end
70
+
71
+ TABLES = {
72
+ 'ET' => DiceTable::D66RangeTable.new(
73
+ '感情ワード(キャラクター)表',
74
+ {
75
+ 11..12 => '愛情/あなたは、対象のキャラクターに愛情を抱いています。',
76
+ 13..14 => '家族/あなたは、対象のキャラクターをまるで家族のように感じています。',
77
+ 15..16 => '腐れ縁/あなたは、対象のキャラクターを腐れ縁だとを感じています(または、まるで長年の腐れ縁のように気が合う相手だと感じています)。',
78
+ 21..22 => '師弟/そのキャラクターとは、師弟のような関係だと感じています。',
79
+ 23..24 => '好敵手/そのキャラクターを、好敵手だと感じています。',
80
+ 25..26 => '親近感/あなたは、対象のキャラクターに、親近感を抱いています。',
81
+ 31..32 => '友情/あなたは、対象のキャラクターに、友情を抱いています。',
82
+ 33..34 => '尊敬/あなたは、対象のキャラクターを尊敬しています。',
83
+ 35..36 => '庇護/あなたは、対象のキャラクターを守らなければと感じています。',
84
+ 41..42 => '好感/あなたは、対象のキャラクターに好感を抱いています。',
85
+ 43..44 => '興味/あなたは、対象のキャラクターに興味を抱いています。',
86
+ 45..46 => '感銘/あなたは、対象のキャラクターに感銘を抱いています。',
87
+ 51..52 => '畏怖/あなたは、対象のキャラクターに畏怖を抱いています。',
88
+ 53..54 => '信頼/あなたは、対象のキャラクターに信頼を感じています。',
89
+ 55..56 => '不信感/あなたは、対象のキャラクターに不信感を抱いています。',
90
+ 61..62 => '劣等感/あなたは、対象のキャラクターの能力や容姿、実績などに対し劣等感を抱いています。',
91
+ 63..64 => '後悔/あなたは対象のキャラクターを見ると、後悔の念を思い出します(かつて失った人に似ている、など)。',
92
+ 65..66 => '無関心/あなたは、対象のキャラクターに対して無関心を装っています。しかし本当は無視できない存在であると感じています。',
93
+ }
94
+ ),
95
+ "RT" => DiceTable::Table.new(
96
+ "襲撃表",
97
+ "1D6",
98
+ [
99
+ "概要:今回の事件の黒幕が放ったものか、それとも何かで恨みを買ったのか、裏社会の暗殺者たちが襲撃を仕掛けてくる。迎え撃つ必要がある。\n判定:2人で判定。【機敏(SR+1)】〔†射撃〕/【身体(SR+1)】〔†白兵〕\n全員が完全成功:敵の迎撃に成功した。襲撃者を放ってきた相手もしばらくは動けないだろう。【AP】+1。\n1人でも不完全成功:何とか敵を迎撃したが、手傷を負ってしまった。PC全員は【HP】を1d+[SR]点消費する。",
100
+ "概要:あまりにも目立ちすぎたせいか、自分に目を光らせている司法組織の捜査官が追ってきた。戦うわけにもいかない。誰かが囮になってうまく逃げるしかない。\n判定:1人で判定。【身体(SR+2)】〔運動〕\n全員が完全成功:うまく追手をまくことができた。しばらくは時間を稼ぐことができるだろう。【AP】+1。\n1人でも不完全成功:何とか逃げることには成功したが、体力を使い果たした。判定を行ったPCは、[調査フェイズ]終了時まで【身体】の判定で振るダイス数-1d。",
101
+ "概要:偶然、一般市民に非合法の活動をしている場面を目撃される。彼らを巻き込まないためにも、何とか誤魔化した方がいいだろう。\n判定:全員で判定。【知性(SR)】〔交渉〕\n全員が完全成功:それらしい理屈をつけて、誤魔化すことができた。機転の利いた対応に、裏社会での評価も上がる。【畏敬】+2。\n1人でも不完全成功:なんとか誤魔化せたが、相手はいまいち納得できないようだ。今後、彼らの動向にも気を配る必要があるだろう。[不完全成功]だったPCは[調査フェイズ]終了まで【知性】の判定で振るダイス数-1d。",
102
+ "概要:情報を整理しようと集まった瞬間、何者かに襲撃を受ける。出自は不明だが、裏社会の存在で間違いないだろう。迎撃の必要がある。\n判定:全員で判定。【機敏(SR)】〔†射撃〕/【身体(SR)】〔†白兵〕\n全員が完全成功:鮮やかに敵を撃退してみせた。【畏敬】+2。\n1人でも不完全成功:敵を撃退できたものの、手傷を負ってしまった。[不完全成功]だったPCは[調査フェイズ]終了まで【機敏】の判定で振るダイス数-1d。",
103
+ "概要:君の活躍に目をつけ、闇の組織が急な情報収集の仕事を依頼してきた。やむにやまれぬ事情があり、無視することもできない。急いで片付けた方がいいだろう。\n判定:2人で判定。【知性(SR+1)】〔コンピュータ〕/【機敏(SR+1)】〔操縦〕\n全員が完全成功:コンピュータやフットワークを活かし、情報を素早く手に入れた。闇社会からの評価も上がる。【畏敬】+2。\n1人でも不完全成功:仕事は成功させたものの、少し雑なものとなって相手を落胆させてしまう。【畏敬】-1。",
104
+ "概要:カローンのことを嗅ぎ回っているマスコミに、活動現場を見られてしまった。何とか言いくるめて、対処する必要がある。\n判定:1人で判定。【知性(SR+2)】〔交渉〕\n全員が完全成功:自分たちはカローンではないと言いくるめることができた。ついでに事件捜査の時間を稼ぐための偽情報をリークすることにも成功する。【AP】+1。\n1人でも不完全成功:何とか言いくるめることができたが、激しく気力を消耗してしまう。判定を行ったPCは、【EP】-1。",
105
+ ]
106
+ ),
107
+ }.freeze
108
+
109
+ register_prefix('\d+CS', TABLES.keys)
110
+ end
111
+ end
112
+ end
@@ -19,7 +19,7 @@ module BCDice
19
19
 
20
20
  # ダイスボットの使い方
21
21
  HELP_MESSAGE = <<~MESSAGETEXT
22
- xCD@z>=y: x個の10面ダイスで目標値y、クリティカルラインzの判定を行う
22
+ xCD@z>=y: x個の10面ダイスで目標値y(省略時5)、クリティカルラインz(省略時10)の判定を行う。
23
23
  SLT: 技能レベル表を振る
24
24
  DCT: 遅延イベント表を振る
25
25
  MESSAGETEXT
@@ -87,7 +87,7 @@ module BCDice
87
87
  parser = Command::Parser.new('CD', round_type: round_type)
88
88
  .has_prefix_number
89
89
  .enable_critical
90
- .restrict_cmp_op_to(:>=)
90
+ .restrict_cmp_op_to(:>=, nil)
91
91
  cmd = parser.parse(command)
92
92
 
93
93
  unless cmd
@@ -95,8 +95,9 @@ module BCDice
95
95
  end
96
96
 
97
97
  dice_list = @randomizer.roll_barabara(cmd.prefix_number, 10)
98
- critical = cmd.critical&.clamp(cmd.target_number, 10) || 10
99
- succeed_num = dice_list.count { |x| x >= cmd.target_number }
98
+ target_num = cmd.target_number || 5
99
+ critical = cmd.critical&.clamp(target_num, 10) || 10
100
+ succeed_num = dice_list.count { |x| x >= target_num }
100
101
  critical_num = dice_list.count { |x| x >= critical }
101
102
 
102
103
  text = [
@@ -203,7 +203,7 @@ module BCDice
203
203
 
204
204
  if bonus_dice == 0 && difficulty.nil?
205
205
  dice = @randomizer.roll_once(100)
206
- return "1D100 > #{dice}"
206
+ return "(1D100) > #{dice}"
207
207
  end
208
208
 
209
209
  if bonus_dice.abs > 100