bcdice 3.14.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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +59 -0
  3. data/i18n/Cthulhu/zh_hant.yml +1 -1
  4. data/i18n/CyberpunkRed/ko_kr.yml +389 -0
  5. data/i18n/DoubleCross/ja_jp.yml +53 -0
  6. data/i18n/DoubleCross/ko_kr.yml +52 -0
  7. data/i18n/FutariSousa/ja_jp.yml +138 -138
  8. data/i18n/KillDeathBusiness/ja_jp.yml +198 -0
  9. data/i18n/MagicaLogia/ko_kr.yml +2 -2
  10. data/i18n/MonotoneMuseum/ko_kr.yml +227 -0
  11. data/i18n/SkynautsBouken/ko_kr.yml +114 -0
  12. data/i18n/StratoShout/ko_kr.yml +102 -102
  13. data/i18n/zh_hant.yml +5 -0
  14. data/lib/bcdice/game_system/Aionia.rb +131 -0
  15. data/lib/bcdice/game_system/Arianrhod_Korean.rb +2 -0
  16. data/lib/bcdice/game_system/ArknightsFan.rb +245 -87
  17. data/lib/bcdice/game_system/BlackJacket_Korean.rb +244 -0
  18. data/lib/bcdice/game_system/CharonSanctions.rb +112 -0
  19. data/lib/bcdice/game_system/Cthulhu7th.rb +1 -1
  20. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional/full_auto.rb +293 -0
  21. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional/rollable.rb +43 -0
  22. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +470 -306
  23. data/lib/bcdice/game_system/CyberpunkRed.rb +1 -2
  24. data/lib/bcdice/game_system/CyberpunkRed_Korean.rb +66 -0
  25. data/lib/bcdice/game_system/DoubleCross.rb +18 -1
  26. data/lib/bcdice/game_system/DoubleCross_Korean.rb +5 -1
  27. data/lib/bcdice/game_system/FullFace.rb +25 -3
  28. data/lib/bcdice/game_system/FutariSousa.rb +17 -5
  29. data/lib/bcdice/game_system/Garactier.rb +479 -0
  30. data/lib/bcdice/game_system/GardenOrder.rb +390 -9
  31. data/lib/bcdice/game_system/GundogRevised.rb +8 -8
  32. data/lib/bcdice/game_system/KillDeathBusiness.rb +155 -3
  33. data/lib/bcdice/game_system/KimitoYell.rb +568 -0
  34. data/lib/bcdice/game_system/Magius.rb +125 -0
  35. data/lib/bcdice/game_system/Magius_3rdNewTokyoCity.rb +62 -0
  36. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
  37. data/lib/bcdice/game_system/NSSQ.rb +17 -9
  38. data/lib/bcdice/game_system/NervWhitePaper.rb +129 -0
  39. data/lib/bcdice/game_system/RogueLikeHalf.rb +198 -0
  40. data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +16 -13
  41. data/lib/bcdice/game_system/ShinobiGami.rb +73 -43
  42. data/lib/bcdice/game_system/SkynautsBouken.rb +4 -4
  43. data/lib/bcdice/game_system/SkynautsBouken_Korean.rb +57 -0
  44. data/lib/bcdice/game_system/StratoShout_Korean.rb +1 -1
  45. data/lib/bcdice/game_system/SwordWorld.rb +4 -0
  46. data/lib/bcdice/game_system/SwordWorld2_5.rb +3 -2
  47. data/lib/bcdice/game_system/TensaiGunshiNiNaro.rb +51 -17
  48. data/lib/bcdice/game_system/TheIndieHack.rb +82 -0
  49. data/lib/bcdice/game_system/TorgEternity.rb +35 -6
  50. data/lib/bcdice/game_system/WoW.rb +161 -0
  51. data/lib/bcdice/game_system/YankeeMustDie.rb +192 -0
  52. data/lib/bcdice/game_system/YearZeroEngine.rb +225 -28
  53. data/lib/bcdice/game_system/YuMyoKishi.rb +141 -0
  54. data/lib/bcdice/game_system/sword_world/rating_lexer.rb +1 -0
  55. data/lib/bcdice/game_system/sword_world/rating_options.rb +4 -1
  56. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +5 -0
  57. data/lib/bcdice/game_system/sword_world/rating_parser.rb +129 -115
  58. data/lib/bcdice/game_system.rb +15 -0
  59. data/lib/bcdice/version.rb +1 -1
  60. metadata +22 -6
@@ -15,48 +15,67 @@ module BCDice
15
15
  SORT_KEY = 'しのひかみ'
16
16
 
17
17
  # ダイスボットの使い方
18
+ # 25/01/17:書式成形(半角スペース×2に統一、同じ書籍のシーン表は改行なしで列挙)
18
19
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
20
  ・行為判定 nSG@s#f>=x
20
-  2D6の行為判定を行う。ダイス数が指定された場合、大きい出目2個を採用する。
21
-  n: ダイス数 (省略時 2)
22
-  s: スペシャル値 (省略時 12)
23
-  f: ファンブル値 (省略時 2)
24
-  x: 目標値 (省略可)
25
-  例)SG, SG@11, SG@11#3, SG#3>=7, 3SG>=7
21
+ 2D6の行為判定を行う。ダイス数が指定された場合、大きい出目2個を採用する。
22
+ n: ダイス数 (省略時 2)
23
+ s: スペシャル値 (省略時 12)
24
+ f: ファンブル値 (省略時 2)
25
+ x: 目標値 (省略可)
26
+ 例)SG, SG@11, SG@11#3, SG#3>=7, 3SG>=7
27
+
28
+ ・行為判定以外の表
29
+ 以下の表は「回数+コマンド」で複数回振れる
30
+ 例)3RCT, 2WT
26
31
 
27
32
  ・ランダム特技決定表 RTTn (n:分野番号、省略可能)
28
-  1器術 2体術 3忍術 4謀術 5戦術 6妖術
33
+ 1器術 2体術 3忍術 4謀術 5戦術 6妖術
29
34
 
30
35
  ・ランダム分野表 RCT
31
36
 
32
- ・各種表(基本ルールブック以降)
33
-  ファンブル表 FT、変調表 WT、戦国変調表 GWT、戦場表 BT、感情表 ET
34
-  妖魔化(異形表、妖魔忍法表一括) MT
35
-  異形表 MTR、妖魔忍法表(x:A,B,C) DSx
36
-  プライズ効果表 PT
37
+ ・各種表:基本ルールブック以降
38
+ ファンブル表 FT、戦場表 BT、感情表 ET、変調表 WT、戦国変調表 GWT、プライズ効果表 PT
39
+ 妖魔化(異形表、妖魔忍法表一括) MT、異形表 MTR、妖魔忍法表(x:A,B,C) DSx
37
40
 
38
- >流派ブック以降
39
-  新戦場表 BNT、【数奇】OTS、妖術変調対応表(x:なし-現代/戦国、1-現代、2-戦国)YWTx
40
-  妖魔化(新異形表利用) NMT、新異形表 NMTR、妖魔忍法表(x:1-異霊 2-凶身 3-神化 4-攻激)DSNx
41
-  覚醒表 OTAT、忍法授業シーン表(x:1-攻撃系 2-防御系 3-戦略系)NCTx
42
-  パニック表 HRPT、出物表 ONDT
41
+ ・各種表:流派ブック以降
42
+ 比良坂流派ブック
43
+ パニック表 HRPT
44
+ 鞍馬流派ブック
45
+ 新戦場表 BNT
46
+ 御斎流派ブック
47
+ 覚醒表 OTAT
48
+ 忍法授業シーン表(x:1-攻撃系 2-防御系 3-戦略系)NCTx
49
+ 【数奇】OTS
50
+ 隠忍流派ブック
51
+ 妖術変調対応表(x:なし-現代/戦国、1-現代、2-戦国)YWTx
52
+ 妖魔化(新異形表利用) NMT、新異形表 NMTR、妖魔忍法表(x:1-異霊 2-凶身 3-神化 4-攻激)DSNx
53
+ 出物表 ONDT
43
54
 
44
- (基本ルールブック改訂版以前)
45
- ・(無印)旧ファンブル表 OFT 、旧変調表 OWT、旧戦場表 OBT、異形表 MT
46
- ・(怪)怪ファンブル表 KFT、怪変調表 KWT (基本ルールブックと同一)
55
+ ・各種表:基本ルールブック改訂版以前
56
+ 無印
57
+ 旧ファンブル表 OFT 、旧変調表 OWT、旧戦場表 OBT、異形表 MT
58
+
59
+ 怪ファンブル表 KFT、怪変調表 KWT (基本ルールブックと同一)
47
60
 
48
61
  ・シーン表
49
- >基本ルールブック
50
-  通常 ST、出島 DST、都市 CST、館 MST、トラブル TST、回想 KST、日常 NST、学校 GAST、戦国 GST
51
- >忍秘伝
52
-  中忍試験 HC、滅びの塔 HT、影の街 HK、夜行列車 HY、病院 HO、龍動 HR、密室 HM、催眠 HS
53
- >基本ルールブック改訂版以前
54
-  (死)東京 TKST、(リプレイ戦1〜2巻)京都 KYST、神社仏閣 JBST
55
-  (その他シーン表)秋空に雪舞えば AKST、災厄 CLST、出島EX DXST、斜歯ラボ HLST、夏の終わり NTST、培養プラント PLST
56
- >正忍記
57
- カジノ TC、ロードムービ TRM、マスカレイド・キャッスル TMC、月天に死の咲く TGS、恋人との日々 TKH、学校(黒星祭) TKG、魔都学園 TMG、魔都東京 TMT
58
- >流派ブック以降
59
- 不良高校 OTFK
62
+ 基本ルールブック
63
+ 通常 ST、出島 DST、都市 CST、館 MST、トラブル TST、回想 KST、日常 NST、学校 GAST、戦国 GST
64
+ 忍秘伝
65
+ 中忍試験 HC、滅びの塔 HT、影の街 HK、夜行列車 HY、病院 HO、龍動 HR、密室 HM、催眠 HS
66
+ 正忍記
67
+ カジノ TC、ロードムービー TRM、マスカレイド・キャッスル TMC、月天に死の咲く TGS、恋人との日々 TKH、学校(黒星祭) TKG、魔都学園 TMG、魔都東京 TMT
68
+ 流派ブック以降
69
+ 御斎流派ブック
70
+ 不良高校 OTFK
71
+ 基本ルールブック改訂版以前
72
+
73
+ 東京 TKST
74
+ リプレイ戦1〜2巻
75
+ 京都 KYST、神社仏閣 JBST
76
+ その他
77
+ 秋空に雪舞えば AKST、夏の終わり NTST、出島EX DXST、災厄 CLST、斜歯ラボ HLST、培養プラント PLST
78
+
60
79
  ・D66ダイスあり
61
80
  INFO_MESSAGE_TEXT
62
81
 
@@ -99,8 +118,19 @@ module BCDice
99
118
  register_prefix('\d*SG')
100
119
 
101
120
  def eval_game_system_specific_command(command)
102
- return action_roll(command) || roll_tables(command, TABLES) || roll_tables(command, SCENE_TABLES) ||
103
- roll_tables(command, DEMON_SKILL_TABLES) || roll_tables(command, DEMON_SKILL_TABLES_NEW) || RTT.roll_command(@randomizer, command)
121
+ return action_roll(command) || repeat_table(command)
122
+ end
123
+
124
+ def repeat_table(command)
125
+ times = command.start_with?(/\d/) ? command.to_i : 1
126
+ key = command.sub(/^\d+/, '')
127
+ results = [*0...times].map do |_|
128
+ roll_tables(key, TABLES) || roll_tables(key, SCENE_TABLES) ||
129
+ roll_tables(key, DEMON_SKILL_TABLES) || roll_tables(key, DEMON_SKILL_TABLES_NEW) || RTT.roll_command(@randomizer, key)
130
+ end.compact
131
+ return nil if results.empty?
132
+
133
+ return results.join("\n")
104
134
  end
105
135
 
106
136
  RTT = DiceTable::SaiFicSkillTable.new(
@@ -209,12 +239,12 @@ module BCDice
209
239
  '妖魔忍法表・異霊',
210
240
  '1D6',
211
241
  [
212
- '【逢魔時】(基本 p173)/【虚舟】(隠忍 p28)',
213
- '【神隠】(基本 p173)/【夢喰】(隠忍 p28)',
214
- '【狂骨】(基本 p173)/【金毛】(隠忍 p28)',
215
- '【木魂】(基本 p173)/【朽縄】(隠忍 p28)',
216
- '【付喪神】(基本 p173)/【香魂】(隠忍 p28)',
217
- '【生剥】(基本 p173)/【三尸】(隠忍 p28)',
242
+ '【逢魔時】(基本 p172)/【虚舟】(隠忍 p28)',
243
+ '【神隠】(基本 p172)/【夢喰】(隠忍 p28)',
244
+ '【狂骨】(基本 p172)/【金毛】(隠忍 p28)',
245
+ '【木魂】(基本 p172)/【朽縄】(隠忍 p28)',
246
+ '【付喪神】(基本 p172)/【香魂】(隠忍 p28)',
247
+ '【生剥】(基本 p172)/【三尸】(隠忍 p28)',
218
248
  ]
219
249
  ),
220
250
  'DSN2' => DiceTable::Table.new(
@@ -538,12 +568,12 @@ module BCDice
538
568
  '覚醒表',
539
569
  '1D6',
540
570
  [
541
- '自分の力が急に恐ろしくなる。好きな『覚醒済みデータ』を一つ選び、それを『未覚醒データ』に変更する。',
571
+ '自分の力が急に恐ろしくなる。好きな覚醒済みデータを一つ選び、それを未覚醒データに変更する。',
542
572
  '自分の力が暴走し、周囲に被害を与える。そのシーンに登場しているキャラクター全員(自分含む)に射撃戦ダメージを1点与える。',
543
- '覚醒に伴い、身体の形が変化する。未覚醒忍法の中からランダムに一つ選び、それを覚醒済み忍法にする。',
573
+ '覚醒に伴い、身体の形が変化する。未覚醒忍法の中からランダムに一つを選び、それを覚醒済み忍法にする。',
544
574
  '忍者の血に目覚め、力の制御方法が理解出来るようになる。好きな未覚醒忍法を一つを選び、それを覚醒済み忍法にする。',
545
575
  '自分だけが操ることが出来る独自の力に目覚める。好きな未覚醒奥義一つを選び、それを覚醒済みの奥義にする。',
546
- '自分の脳に直接何かが囁きかける。集団戦ダメージを1点受ける(退魔編なら代わりに妖魔化する)と、好きな未覚醒データの中からひとつ選び、それを覚醒済みデータにする。'
576
+ '自分の脳に直接何かが囁きかける。集団戦ダメージを1点受けると、好きな未覚醒データの中から一つ選び、それを覚醒済みデータに変更することができる。退魔編であれば、集団戦ダメージを受ける代わりに妖魔化することで、好きな未覚醒データの中から一つ選び、それを覚醒済みデータに変更することができる。'
547
577
  ]
548
578
  ),
549
579
  'ONDT' => DiceTable::Table.new(
@@ -1187,7 +1217,7 @@ module BCDice
1187
1217
  ]
1188
1218
  ),
1189
1219
  }.freeze
1190
- register_prefix(RTT.prefixes, TABLES.keys, SCENE_TABLES.keys, DEMON_SKILL_TABLES.keys, DEMON_SKILL_TABLES_NEW.keys)
1220
+ register_prefix(RTT.prefixes.map { |k| "\\d*#{k}" }, TABLES.keys.map { |k| "\\d*#{k}" }, SCENE_TABLES.keys.map { |k| "\\d*#{k}" }, DEMON_SKILL_TABLES.keys.map { |k| "\\d*#{k}" }, DEMON_SKILL_TABLES_NEW.keys.map { |k| "\\d*#{k}" })
1191
1221
  end
1192
1222
  end
1193
1223
  end
@@ -85,7 +85,7 @@ module BCDice
85
85
 
86
86
  def eval_game_system_specific_command(command)
87
87
  command_sn(command) || command_d(command) || command_avo(command) || command_snavo(command) ||
88
- command_snd(command) || roll_tables(command, TABLES)
88
+ command_snd(command) || roll_tables(command, self.class::TABLES)
89
89
  end
90
90
 
91
91
  private
@@ -145,7 +145,7 @@ module BCDice
145
145
  .sub("F/", "[#{translate('SkynautsBouken.fire')}]/").sub("S/", "[#{translate('SkynautsBouken.big_shake')}]/")
146
146
  result = ["(#{command})", get_points_text(points, 0, 0)]
147
147
  if ballistics != 0
148
- dir = DIRECTION_INFOS[ballistics]
148
+ dir = self.class::DIRECTION_INFOS[ballistics]
149
149
  diff_x, diff_y = dir[:position_diff]
150
150
  result[-1] += "\n"
151
151
  result << "《#{translate('SkynautsBouken.ballistics')}》#{dir[:name]}"
@@ -160,7 +160,7 @@ module BCDice
160
160
  dmg = command.match(/^AVO@([2468])(.*?)$/)
161
161
  return nil unless dmg
162
162
 
163
- dir = DIRECTION_INFOS[dmg[1].to_i]
163
+ dir = self.class::DIRECTION_INFOS[dmg[1].to_i]
164
164
  diff_x, diff_y = dir[:position_diff]
165
165
  "《#{translate('SkynautsBouken.avoidance')}》#{dir[:name]} > " + dmg[2].gsub(/\(?\[(\d),(\d{1,2})\]\)?/) do
166
166
  y = Regexp.last_match(1).to_i + diff_y
@@ -224,7 +224,7 @@ module BCDice
224
224
  x = @randomizer.roll_sum(2, 6) # 横
225
225
 
226
226
  [[x, y]] + range.map do |r|
227
- xdiff, ydiff = DIRECTION_INFOS[r][:position_diff]
227
+ xdiff, ydiff = self.class::DIRECTION_INFOS[r][:position_diff]
228
228
  [x + xdiff, y + ydiff]
229
229
  end
230
230
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/game_system/SkynautsBouken"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class SkynautsBouken_Korean < SkynautsBouken
8
+ # ゲームシステムの識別子
9
+ ID = 'SkynautsBouken:Korean'
10
+
11
+ # ゲームシステム名
12
+ NAME = '톱니바퀴 탑의 탐공사'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Korean:톱니바퀴 탑의 탐공사'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~MESSAGETEXT
19
+ ・행위판정(nSNt#f) n:다이스 수(생략시 2), t:목표치(생략시 7), f:펌블치(생략시 1)
20
+ 예)SN6#2 3SN
21
+ ・대미지 체크 (Dx/y@m) x:대미지 범위、y:공격횟수
22
+   m:《탄도학》(생략 가능)상:8, 하:2, 좌:4, 우:6
23
+   예) D/4 D19/2 D/3@8 D[진동]/2
24
+ ・회피(AVO@m대미지)
25
+   m:회피 방향(상:8, 하:2, 좌:4, 우:6), 대미지: 대미지 체크 결과
26
+   예)AVO@8[1,4],[2,6],[3,8] AVO@2[6,4],[2,6]
27
+ ・FT 펌블표(p76)
28
+ ・NV 항행표
29
+ ・항행이벤트표
30
+  ・NEN 항행계
31
+  ・NEE 조우계
32
+  ・NEO 선내계
33
+  ・NEH 곤란계
34
+  ・NEL 장거리 여행계
35
+
36
+ ■ 판정 세트
37
+ ・《회피운동》판정+회피(nSNt#f/AVO@대미지)
38
+   nSNt#f → 성공하면 AVO@m
39
+   예)SN/AVO@8[1,4],[2,6],[3,8] 3SN#2/AVO@2[6,4],[2,6]
40
+ ・포격 판정+대미지 체크 (nSNt#f/Dx/y@m)
41
+   행위 판정의 출발(出目) 변경 타이밍을 놓치므로 GM의 허가 필요
42
+   nSNt#f → 성공하면 Dx/y@m
43
+   예)SN/D/4 3SN#2/D[진동]/2
44
+ MESSAGETEXT
45
+
46
+ def initialize(command)
47
+ super(command)
48
+ @locale = :ko_kr
49
+ end
50
+
51
+ register_prefix_from_super_class()
52
+
53
+ TABLES = translate_tables(:ko_kr).freeze
54
+ DIRECTION_INFOS = translate_direction_infos(:ko_kr).freeze
55
+ end
56
+ end
57
+ end
@@ -18,7 +18,7 @@ module BCDice
18
18
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
19
  VOT, GUT, BAT, KEYT, DRT: (보컬, 기타, 베이스, 키보드, 드럼)트러블표
20
20
  EMO: 감정표
21
- RTT[1-6], AT[1-6]: 특기표(공백: 랜덤 1: 주의 2: 신체 3: 모티브 4: 이모션 5: 행동 6: 역경)
21
+ RTT[1-6], AT[1-6]: 특기표(공백: 랜덤 1: 가치관 2: 신체 3: 모티브 4: 이모션 5: 행동 6: 역경)
22
22
  SCENE, MACHI, GAKKO, BAND: (범용, 거리, 학교, 밴드)장면표. 접근 장면에 사용
23
23
  TENKAI: 장면 전개표. 분주 장면, 연습 장면에 사용
24
24
  []내는 생략가능 D66는 변동있음
@@ -85,6 +85,7 @@ module BCDice
85
85
  round = 0
86
86
  first_to = command.first_to
87
87
  first_modify = command.first_modify
88
+ first_modify_ssp = command.first_modify_ssp
88
89
 
89
90
  loop do
90
91
  dice_raw, diceText = rollDice(command, round)
@@ -96,6 +97,9 @@ module BCDice
96
97
  elsif first_modify != 0
97
98
  dice += first_modify
98
99
  first_modify = 0
100
+ elsif first_modify_ssp != 0
101
+ dice += first_modify_ssp if dice_raw <= 10
102
+ first_modify_ssp = 0
99
103
  end
100
104
 
101
105
  # 出目がピンゾロの時にはそこで終了
@@ -46,11 +46,12 @@ module BCDice
46
46
   クリティカル値を指定しない場合、クリティカルなしと扱われます。
47
47
   例)OHK20  K20oh  OHK10-5@9  K20+8OH+2  K20+8OH+(1+1)
48
48
 
49
- ・ダイス目の修正(運命変転やクリティカルレイ用)
49
+ ・ダイス目の修正(運命変転やクリティカルレイ、魔女の火用)
50
50
   末尾に「$修正値」でダイス目に修正がかかります。
51
51
   $+1と修正表記ならダイス目に+修正、$9のように固定値ならダイス目をその出目に差し替え。
52
+  $~+1とチルダを追加して記述することで、出目10以下の場合のみダイス目に+修正(魔女の火用)
52
53
   クリティカルした場合でも固定値や修正値の適用は最初の一回だけです。
53
-  例)K20$+1   K10+5$9   k10-5@9$+2   k10[9]+10$9
54
+  例)K20$+1   K10+5$9   k10-5@9$+2   k10[9]+10$9   k20+6$~+1
54
55
 
55
56
  ・ダイス目の修正(必殺攻撃用)
56
57
   「#修正値」でダイス目に修正がかかります。
@@ -17,21 +17,34 @@ module BCDice
17
17
  ・行為判定
18
18
  TN6…「有利」を得ていない場合、6面ダイスを2つ振って判定します。
19
19
  TN10…「有利」を得ている場合、10面ダイスを2つ振って判定します。
20
- 不調 気づかぬうちの不満【C】…判定のダイス目が「4」でも判定に成功しません。数字の後ろに【C】をつけます。
20
+ 不調 気づかぬうちの不満【C】…このセッションの間、「4」の出目を出しても判定は成功になりません。数字の後ろに【C】をつけます。
21
21
   例)TN6C
22
22
  軍師スキル 〇〇サポート【S】…決戦フェイズの判定中「3」の出目を出しても判定に成功します。数字の後ろに【S】をつけます。
23
23
   例)TN6S
24
24
  英傑スキル/武人 煌めく刃【B】…決戦フェイズの判定中「3」の出目を出しても判定に成功となり、スペシャルが発生します。数字の後ろに【B】をつけます。
25
25
   例)TN6B
26
+ 英傑スキル/武人 力ずく…その判定のサイコロをすべて振った後、[使用者の【攻撃力】]個サイコロを振る。先頭に使用者の【攻撃力】をつけます。
27
+  例)4TN6
28
+ 英傑スキル/武人 必殺の剣【D】…《戦技》を使用している判定中「4」「5」の出目を出してもスペシャルが発生します。数字の後ろに【D】をつけます。
29
+  例)TN6K
30
+ 英傑スキル/武人 二刀流【T】…「攻撃」のスキルの判定中「2」の出目を出しても判定に成功となり、同じ出目のサイコロが2つ以上出ているとスペシャルが発生します。数字の後ろに【T】をつけます。
31
+  例)TN6T
26
32
  英傑スキル/カリスマ 御身のためならば【Y】…「交流」「スカウト」の判定中「3」の出目を出しても判定に成功となり、スペシャルが発生します。数字の後ろに【Y】をつけます。
27
33
   例)TN6Y
34
+ 英傑スキル/弓取り 愛用の弓【A】…「攻撃」のスキルの判定中「3」の出目を出しても判定に成功となり、スペシャルが発生します。数字の後ろに【A】をつけます。
35
+  例)TN6A
36
+ 英傑スキル/ヤンキー&マイルドヤンキー その辺の物を武器に【C】…「4」の出目を出しても判定は成功になりません。数字の後ろに【C】をつけます。
37
+  例)TN6C
38
+ 英傑スキル/ヤンキー&マイルドヤンキー 熱血判定【C】…「4」の出目を出しても判定は成功になりません。数字の後ろに【C】をつけます。
39
+  例)TN6C
28
40
  英傑スキル/英傑汎用 凄腕エージェント【A】…活動フェイズの判定中「3」の出目を出しても判定に成功となり、スペシャルが発生します。数字の後ろに【A】をつけます。
29
41
   例)TN6A
30
42
  数字の後ろに複数のコマンドを追加できます。
31
43
   例)TN10CYA
32
- ・ダメージ計算 xDM>=t
44
+ ・ダメージ計算 xDM+y>=t
33
45
   [ダメージ計算]を行う。成否と【HP】の減少量を表示する。
34
46
   x: 6面ダイス数
47
+  y: 補正値(省略可能)
35
48
   t: 防御力
36
49
  ・各種表
37
50
  関係決定表 RELA
@@ -48,7 +61,7 @@ module BCDice
48
61
  @round_type = RoundType::FLOOR
49
62
  end
50
63
 
51
- register_prefix('TN(6|10)[CSBYA]*', '\d+DM')
64
+ register_prefix('\d*TN(6|10)[ABCKSTY]*', '\d+DM')
52
65
 
53
66
  def eval_game_system_specific_command(command)
54
67
  roll_judge(command) || roll_damage(command) || roll_tables(command, self.class::TABLES)
@@ -58,7 +71,7 @@ module BCDice
58
71
 
59
72
  # 行為判定
60
73
  def roll_judge(command)
61
- m = /^TN(6|10)([CSBYA]*)$/.match(command)
74
+ m = /^(\d*)TN(6|10)([ABCKSTY]*)$/.match(command)
62
75
  unless m
63
76
  return nil
64
77
  end
@@ -73,51 +86,73 @@ module BCDice
73
86
  fumble_dices = [1]
74
87
 
75
88
  # 有利
76
- advantage = m[1] == "10"
89
+ advantage = m[2] == "10"
77
90
 
78
91
  # 不調 気づかぬうちの不満
79
- complaints = m[2].include?("C")
92
+ complaints = m[3].include?("C")
80
93
 
81
94
  # 軍師スキル 〇〇サポート
82
- support = m[2].include?("S")
95
+ support = m[3].include?("S")
83
96
 
84
97
  # 英傑スキル/武人 煌めく刃
85
- blade = m[2].include?("B")
98
+ blade = m[3].include?("B")
99
+
100
+ # 英傑スキル/武人 必殺の剣
101
+ killer = m[3].include?("K")
102
+
103
+ # 英傑スキル/武人 二刀流
104
+ twin = m[3].include?("T")
86
105
 
87
106
  # 英傑スキル/カリスマ 御身のためならば
88
- you = m[2].include?("Y")
107
+ you = m[3].include?("Y")
89
108
 
109
+ # 英傑スキル/弓取り 愛用の弓
90
110
  # 英傑スキル/英傑汎用 凄腕エージェント
91
- agent = m[2].include?("A")
111
+ agent = m[3].include?("A")
92
112
 
93
- # 〇〇サポート、煌めく刃、御身のためならば、凄腕エージェントいずれかの適用時
113
+ # 二刀流の適用時
114
+ if twin
115
+ # 成功となる出目に2を追加
116
+ success_dices.push(2)
117
+ end
118
+
119
+ # 〇〇サポート、煌めく刃、愛用の弓、御身のためならば、凄腕エージェントいずれかの適用時
94
120
  if support | blade | you | agent
95
121
  # 成功となる出目に3を追加
96
122
  success_dices.push(3)
97
123
  end
98
124
 
99
- # 煌めく刃、御身のためならば、凄腕エージェントいずれかの適用時
125
+ # 煌めく刃、御身のためならば、愛用の弓、凄腕エージェントいずれかの適用時
100
126
  if blade | you | agent
101
127
  # スペシャルとなる出目に3を追加
102
128
  special_dices.push(3)
103
129
  end
104
130
 
131
+ # 必殺の剣の適用時
132
+ if killer
133
+ # スペシャルとなる出目に4,5を追加
134
+ special_dices.push(4)
135
+ special_dices.push(5)
136
+ end
137
+
105
138
  # 気づかぬうちの不満適用時
106
139
  if complaints
107
140
  # 成功となる出目から4を削除
108
141
  success_dices.delete(4)
109
142
  end
110
143
 
144
+ # 英傑スキル/武人 力ずく
145
+ times = 2 + m[1].to_i
111
146
  dice_size = advantage ? 10 : 6
112
- dice_list = @randomizer.roll_barabara(2, dice_size)
147
+ dice_list = @randomizer.roll_barabara(times, dice_size)
113
148
 
114
149
  texts = []
115
150
  is_critical = false
116
151
  is_fumble = false
117
152
  is_success = false
118
153
 
119
- # スペシャルとなる出目を含む場合
120
- unless dice_list.intersection(special_dices).empty?
154
+ # スペシャルとなる出目を含む、または、二刀流の適用時かつ同じ出目のサイコロが2つ以上出ている場合
155
+ if !dice_list.intersection(special_dices).empty? | (twin & (dice_list.count != dice_list.uniq.count))
121
156
  # クリティカルフラグを立てる
122
157
  is_critical = true
123
158
  # スペシャルのシステムメッセージを追加
@@ -169,7 +204,6 @@ module BCDice
169
204
  def roll_damage(command)
170
205
  parser = Command::Parser.new("DM", round_type: @round_type)
171
206
  .has_prefix_number
172
- .disable_modifier
173
207
  .restrict_cmp_op_to(:>=)
174
208
  parsed = parser.parse(command)
175
209
  unless parsed
@@ -180,7 +214,7 @@ module BCDice
180
214
  is_success = false
181
215
 
182
216
  # ダメージ計算
183
- damage = @randomizer.roll_sum(parsed.prefix_number, 6)
217
+ damage = @randomizer.roll_sum(parsed.prefix_number, 6) + parsed.modify_number
184
218
  # HP減少量計算
185
219
  dec = damage / parsed.target_number
186
220
 
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class TheIndieHack < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'TheIndieHack'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'The Indie Hack'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'しいんていはつく'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
17
+ ■判定 cIH+a c:CL a:能力値
18
+
19
+ 例)IH: ライトダイスとダークダイスを1個ずつ振って、その結果を表示
20
+ INFO_MESSAGETEXT
21
+
22
+ register_prefix('([+-]?\d)?IH')
23
+
24
+ def eval_game_system_specific_command(command)
25
+ resolute_action(command)
26
+ end
27
+
28
+ private
29
+
30
+ # ダイス判定
31
+ # @param [String] command
32
+ # @return [Result]
33
+ def resolute_action(command)
34
+ m = /([+-]?\d)?IH([+-]\d)?/.match(command)
35
+ return nil unless m
36
+
37
+ cl = m[1].to_i
38
+ abilities = m[2].to_i
39
+
40
+ dices = @randomizer.roll_barabara(2, 6)
41
+ dice_text = dices.join(",")
42
+ dices[0] += cl
43
+ dices[1] += abilities
44
+ dice_text2 = dices.join(",")
45
+ diff = dices[1] - dices[0]
46
+ side = diff < 0 ? "ライト" : "ダーク"
47
+ side = "両" if diff == 0
48
+ if dice_text == dice_text2
49
+ output = "(IH) > #{dice_text} > #{side}#{get_success_level(diff)}"
50
+ else
51
+ output = "(#{m[1]}IH#{m[2]}) > [#{dice_text}] > #{dice_text2} > #{side}#{get_success_level(diff)}"
52
+ end
53
+ if diff > 0
54
+ return Result.success(output)
55
+ elsif diff < 0
56
+ return Result.failure(output)
57
+ else
58
+ return Result.new.tap do |result|
59
+ result.text = output
60
+ end
61
+ end
62
+ end
63
+
64
+ def get_success_level(die_difference)
65
+ case die_difference.abs
66
+ when 0
67
+ return "陣営がそれぞれ確定描写を1つ追加します"
68
+ when 1
69
+ return "陣営が確定描写を1つ追加しますが、味方によって追加されたネガティブな確定描写を1つ受けます"
70
+ when 2
71
+ return "陣営が確定描写を1つ追加します"
72
+ when 3
73
+ return "陣営が確定描写を1つ追加し、さらに場面描写を1つ追加します"
74
+ when 4
75
+ return "陣営が確定描写を1つ追加し、さらにその陣営の味方ひとりも確定描写を1つ追加します"
76
+ else
77
+ return "陣営が確定描写を2つ追加します"
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -31,6 +31,11 @@ module BCDice
31
31
    mはポシビリティを使用する前のロール結果を入れて下さい。
32
32
    出目が10未満の場合は、10への読み替えが行われます。
33
33
    また、振り足しを自動で行い、20の出目が出たときには技能無し値も並記します。
34
+  ・CPOS
35
+   "CPOSm"で、コズムポシビリティ使用による1d20のロールを行います。
36
+   mはポシビリティを使用する前のロール結果を入れて下さい。
37
+   出目が10未満の場合でも、10への読み替えが行われません。
38
+   振り足しは自動で行い、20の出目が出たときには技能無し値も並記します。
34
39
  ・ボーナスダメージロール
35
40
   "xBD[+y]"でロールします。[]内は省略可能。
36
41
   xはダメージダイス数。yはダメージ基本値 or 式を入れて下さい。
@@ -42,13 +47,14 @@ module BCDice
42
47
   ・ダメージ結果表「DTx or DAMAGEx」
43
48
   ・ロールボーナス表「BTx+y or BONUSx+y or TOTALx+y」 xは数値, yは技能基本値
44
49
  INFO_MESSAGE_TEXT
45
- register_prefix('TE', 'UP', 'POS', '\d+BD', 'TG', 'RT', 'Result', 'DT', 'damage', 'BT', 'bonus', 'total', '1R20')
50
+ register_prefix('TE', 'UP', 'POS', 'CPOS', '\d+BD', 'TG', 'RT', 'Result', 'DT', 'damage', 'BT', 'bonus', 'total', '1R20')
46
51
 
47
52
  def eval_game_system_specific_command(command)
48
53
  torg_check(command) ||
49
54
  getRolld20DiceCommandResult(command) ||
50
55
  getUpRollDiceCommandResult(command) ||
51
56
  getPossibilityRollDiceCommandResult(command) ||
57
+ getCosmPossibilityRollDiceCommandResult(command) ||
52
58
  getBonusDamageDiceCommandResult(command) ||
53
59
  getSuccessLevelDiceCommandResult(command) ||
54
60
  getDamageResultDiceCommandResult(command) ||
@@ -75,7 +81,7 @@ module BCDice
75
81
  mod = m[1]
76
82
 
77
83
  debug(mod)
78
- mod = ArithmeticEvaluator.eval(mod) if mod
84
+ mod = mod ? Arithmetic.eval(mod, @round_type) : 0
79
85
  debug(mod)
80
86
  mod = mod.to_i
81
87
  skilled, unskilled, dice_str, = torg_eternity_dice(false, false)
@@ -191,7 +197,7 @@ module BCDice
191
197
  return nil
192
198
  end
193
199
 
194
- output_modifier = ArithmeticEvaluator.eval(m[1])
200
+ output_modifier = m[1] ? Arithmetic.eval(m[1], @round_type) : 0
195
201
  skilled, unskilled, dice_str, = torg_eternity_dice(true, false)
196
202
  subtotal_skilled = skilled + output_modifier
197
203
  subtotal_unskilled = unskilled + output_modifier
@@ -206,6 +212,29 @@ module BCDice
206
212
  return output
207
213
  end
208
214
 
215
+ # ロールコマンド (コズムポシビリティロール)
216
+ def getCosmPossibilityRollDiceCommandResult(command)
217
+ debug("Torg Eternity CosmPossibility Roll Command ? ", command)
218
+ m = /^CPOS((\d+)(\+\d+)?)$/i.match(command)
219
+ unless m
220
+ return nil
221
+ end
222
+
223
+ output_modifier = m[1] ? Arithmetic.eval(m[1], @round_type) : 0
224
+ skilled, unskilled, dice_str, = torg_eternity_dice(false, false)
225
+ subtotal_skilled = skilled + output_modifier
226
+ subtotal_unskilled = unskilled + output_modifier
227
+ value_skilled = format("%+d", get_torg_eternity_bonus(subtotal_skilled))
228
+ if subtotal_skilled != subtotal_unskilled
229
+ value_unskilled = format("%+d", get_torg_eternity_bonus(subtotal_unskilled))
230
+ output = "d20ロール(ポシビリティ) > #{output_modifier}+1d20[#{dice_str}] > #{value_skilled}[#{subtotal_skilled}](技能有) / #{value_unskilled}[#{subtotal_unskilled}](技能無)"
231
+ else
232
+ output = "d20ロール(ポシビリティ) > #{output_modifier}+1d20[#{dice_str}] > #{value_skilled}[#{subtotal_skilled}]"
233
+ end
234
+
235
+ return output
236
+ end
237
+
209
238
  # ダメージボーナスコマンド
210
239
  def getBonusDamageDiceCommandResult(command)
211
240
  debug("TorgEternity Bonus Damage Roll Command ? ", command)
@@ -234,7 +263,7 @@ module BCDice
234
263
  return nil
235
264
  end
236
265
 
237
- value = ArithmeticEvaluator.eval(m[2])
266
+ value = m[2] ? Arithmetic.eval(m[2], @round_type) : 0
238
267
  debug(value)
239
268
  if value < 0
240
269
  output = "Failure."
@@ -254,7 +283,7 @@ module BCDice
254
283
  return nil
255
284
  end
256
285
 
257
- value = ArithmeticEvaluator.eval(m[2])
286
+ value = m[2] ? Arithmetic.eval(m[2], @round_type) : 0
258
287
  debug(value)
259
288
  output = get_torg_eternity_damage_result(value)
260
289
  output = "ダメージ結果表[#{value}] > #{output}"
@@ -307,7 +336,7 @@ module BCDice
307
336
  value_modifier = 0
308
337
  output_modifier = ""
309
338
  else
310
- value_modifier = ArithmeticEvaluator.eval(string_modifier)
339
+ value_modifier = string_modifier ? Arithmetic.eval(string_modifier, @round_type) : 0
311
340
  output_modifier = format("%+d", value_modifier)
312
341
  end
313
342
  debug(value_modifier)