bcdice 3.11.0 → 3.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +58 -0
  3. data/i18n/FutariSousa/ko_kr.yml +1625 -529
  4. data/i18n/Insane/ko_kr.yml +393 -258
  5. data/i18n/NinjaSlayer2/ja_jp.yml +34 -0
  6. data/lib/bcdice/arithmetic/parser.rb +4 -2
  7. data/lib/bcdice/base.rb +1 -1
  8. data/lib/bcdice/command/parser.rb +4 -2
  9. data/lib/bcdice/common_command/add_dice/parser.rb +4 -2
  10. data/lib/bcdice/common_command/barabara_dice/parser.rb +4 -2
  11. data/lib/bcdice/common_command/calc/parser.rb +4 -2
  12. data/lib/bcdice/common_command/reroll_dice/parser.rb +4 -2
  13. data/lib/bcdice/common_command/tally_dice/parser.rb +4 -2
  14. data/lib/bcdice/common_command/upper_dice/parser.rb +4 -2
  15. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  16. data/lib/bcdice/game_system/Alsetto.rb +2 -2
  17. data/lib/bcdice/game_system/AniMalus.rb +221 -0
  18. data/lib/bcdice/game_system/ArknightsFan.rb +182 -0
  19. data/lib/bcdice/game_system/Avandner.rb +1 -1
  20. data/lib/bcdice/game_system/BBN.rb +1 -1
  21. data/lib/bcdice/game_system/BadLife.rb +3 -3
  22. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  23. data/lib/bcdice/game_system/Chill3.rb +6 -6
  24. data/lib/bcdice/game_system/DarkSouls.rb +1 -1
  25. data/lib/bcdice/game_system/Elric.rb +1 -1
  26. data/lib/bcdice/game_system/Emoklore.rb +4 -6
  27. data/lib/bcdice/game_system/FullFace.rb +92 -0
  28. data/lib/bcdice/game_system/FutariSousa_Korean.rb +44 -19
  29. data/lib/bcdice/game_system/HunterTheReckoning5th.rb +10 -3
  30. data/lib/bcdice/game_system/InfiniteFantasia.rb +4 -1
  31. data/lib/bcdice/game_system/Insane_Korean.rb +11 -11
  32. data/lib/bcdice/game_system/Irisbane.rb +1 -1
  33. data/lib/bcdice/game_system/KamitsubakiCityUnderConstructionNarrative.rb +251 -0
  34. data/lib/bcdice/game_system/KillDeathBusiness.rb +1 -1
  35. data/lib/bcdice/game_system/KyokoShinshoku.rb +158 -0
  36. data/lib/bcdice/game_system/Liminal.rb +136 -0
  37. data/lib/bcdice/game_system/MetalHead.rb +1 -1
  38. data/lib/bcdice/game_system/MetalHeadExtream.rb +1 -1
  39. data/lib/bcdice/game_system/NRR.rb +122 -0
  40. data/lib/bcdice/game_system/NSSQ.rb +1 -1
  41. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  42. data/lib/bcdice/game_system/NightWizard3rd.rb +15 -2
  43. data/lib/bcdice/game_system/NinjaSlayer.rb +3 -1
  44. data/lib/bcdice/game_system/NinjaSlayer2.rb +299 -0
  45. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  46. data/lib/bcdice/game_system/PastFutureParadox.rb +1238 -0
  47. data/lib/bcdice/game_system/Postman.rb +3 -3
  48. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  49. data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +10 -7
  50. data/lib/bcdice/game_system/Ryutama.rb +4 -4
  51. data/lib/bcdice/game_system/SajinsenkiAGuS.rb +5 -1
  52. data/lib/bcdice/game_system/SajinsenkiAGuS2E.rb +285 -0
  53. data/lib/bcdice/game_system/Siren.rb +97 -0
  54. data/lib/bcdice/game_system/Skynauts.rb +1 -1
  55. data/lib/bcdice/game_system/SkynautsBouken.rb +1 -1
  56. data/lib/bcdice/game_system/Strave.rb +1 -1
  57. data/lib/bcdice/game_system/SwordWorld.rb +16 -0
  58. data/lib/bcdice/game_system/SwordWorld2_5.rb +8 -1
  59. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  60. data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
  61. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +21 -9
  62. data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +179 -0
  63. data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +1 -1
  64. data/lib/bcdice/game_system/sword_world/rating_options.rb +3 -0
  65. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +9 -0
  66. data/lib/bcdice/game_system/sword_world/rating_parser.rb +177 -130
  67. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -1
  68. data/lib/bcdice/game_system.rb +12 -0
  69. data/lib/bcdice/loader.rb +1 -1
  70. data/lib/bcdice/version.rb +1 -1
  71. metadata +32 -5
@@ -57,11 +57,11 @@ module BCDice
57
57
  diceCount = 2 if diceCount < 2
58
58
 
59
59
  modify = (Regexp.last_match(2) || 0).to_i
60
- modifyAddString = (Regexp.last_match(3) || '')
60
+ modifyAddString = Regexp.last_match(3) || ''
61
61
 
62
- type = (Regexp.last_match(6) || '')
62
+ type = Regexp.last_match(6) || ''
63
63
  target = (Regexp.last_match(7) || 0).to_i
64
- targetAddString = (Regexp.last_match(8) || '')
64
+ targetAddString = Regexp.last_match(8) || ''
65
65
 
66
66
  modify_list = modifyAddString.scan(/[+-]\d+/)
67
67
  modify_list.each { |i| modify += i.to_i }
@@ -118,7 +118,7 @@ module BCDice
118
118
  end
119
119
 
120
120
  def getRoundCountText(roundCount)
121
- if roundCount <= 0
121
+ if roundCount <= 0
122
122
  return ""
123
123
  end
124
124
 
@@ -7,7 +7,7 @@ module BCDice
7
7
  ID = 'RuneQuestRoleplayingInGlorantha'
8
8
 
9
9
  # ゲームシステム名
10
- NAME = 'RuneQuest:Roleplaying in Glorantha'
10
+ NAME = 'ルーンクエスト:ロールプレイング・イン・グローランサ'
11
11
 
12
12
  # ゲームシステム名の読みがな
13
13
  SORT_KEY = 'るうんくえすと4'
@@ -128,10 +128,10 @@ module BCDice
128
128
  note_str = "クリティカル/スペシャル、ファンブルは未処理。必要なら確認すること。"
129
129
 
130
130
  if roll_value >= 96
131
- # 96-99は無条件で失敗
131
+ # 96以上は無条件で失敗
132
132
  Result.failure("#{result_prefix_str} 失敗\n#{note_str}")
133
133
  elsif roll_value <= 5 || roll_value <= modifiy_value
134
- # 02-05あるいは修正値以下は無条件で成功
134
+ # 05以下あるいは修正値以下は無条件で成功
135
135
  Result.success("#{result_prefix_str} 成功\n#{note_str}")
136
136
  else
137
137
  # 上記全てが当てはまらない時に突破可能な能力値を算出
@@ -151,15 +151,18 @@ module BCDice
151
151
  elsif (roll_value == 100) || (roll_value >= (100 - funmble_value + 1))
152
152
  # ファンブル(00は必ずファンブル)
153
153
  Result.fumble("#{result_str} ファンブル")
154
+ elsif roll_value >= 96 || ((roll_value > success_value) && (roll_value > 5))
155
+ # 失敗(96以上は必ず失敗、出目が01-05ではなく技能値より上なら失敗)
156
+ Result.failure("#{result_str} 失敗")
154
157
  elsif roll_value <= special_value
155
158
  # スペシャル
156
159
  Result.success("#{result_str} スペシャル")
157
- elsif (roll_value <= 95) && ((roll_value <= 5) || (roll_value <= success_value))
158
- # 成功(02-05は必ず成功で、96-99は必ず失敗)
160
+ elsif (roll_value <= 5) || (roll_value <= success_value)
161
+ # 成功(05以下は必ず成功)
159
162
  Result.success("#{result_str} 成功")
160
163
  else
161
- # 失敗
162
- Result.failure("#{result_str} 失敗")
164
+ # ここには到達しないはずだが、念のため捕捉
165
+ Result.failure("#{result_str} エラー")
163
166
  end
164
167
  end
165
168
  end
@@ -108,8 +108,8 @@ module BCDice
108
108
  end
109
109
 
110
110
  def isValidDice(dice1, dice2)
111
- return (isValidDiceOne(dice1) &&
112
- isValidDiceOne(dice2))
111
+ return isValidDiceOne(dice1) &&
112
+ isValidDiceOne(dice2)
113
113
  end
114
114
 
115
115
  def isValidDiceOne(dice)
@@ -144,7 +144,7 @@ module BCDice
144
144
  return ''
145
145
  end
146
146
 
147
- if total >= difficulty
147
+ if total >= difficulty
148
148
  return "成功"
149
149
  end
150
150
 
@@ -152,7 +152,7 @@ module BCDice
152
152
  end
153
153
 
154
154
  def isFamble(value1, value2)
155
- return ((value1 == 1) && (value2 == 1))
155
+ return (value1 == 1) && (value2 == 1)
156
156
  end
157
157
 
158
158
  def isCritical(value1, value2, dice1, dice2)
@@ -51,15 +51,17 @@ module BCDice
51
51
 
52
52
  dice_list = @randomizer.roll_barabara(2, 10).map { |d| d == 10 ? 0 : d }
53
53
  total = dice_list.sum
54
+ success_level = 1 + dice_list.count { |val| val <= level }
54
55
 
55
56
  return Result.new.tap do |result|
56
57
  result.condition = total <= target
58
+ result.rands = dice_list
57
59
 
58
60
  sequence = [
59
61
  "(2D10<=#{target})",
60
62
  "#{total}[#{dice_list.join(',')}]",
61
63
  ("チャンス" if dice_list.include?(0)),
62
- result.success? ? "成功" : "失敗"
64
+ result.success? ? "成功(+#{success_level})" : "失敗"
63
65
  ].compact
64
66
 
65
67
  result.text = sequence.join(" > ")
@@ -91,6 +93,7 @@ module BCDice
91
93
 
92
94
  return Result.new.tap do |r|
93
95
  r.condition = total <= target
96
+ r.rands = dice_list
94
97
  r.critical = criticals >= 1
95
98
  r.text = [
96
99
  "(2D10<=#{target})",
@@ -114,6 +117,7 @@ module BCDice
114
117
 
115
118
  return Result.new.tap do |r|
116
119
  r.condition = total <= target
120
+ r.rands = dice_list
117
121
  r.critical = criticals >= 1
118
122
  r.text = [
119
123
  "(3D10<=#{target})",
@@ -0,0 +1,285 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/game_system/SajinsenkiAGuS'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class SajinsenkiAGuS2E < SajinsenkiAGuS
8
+ # ゲームシステムの識別子
9
+ ID = 'SajinsenkiAGuS2E'
10
+
11
+ # ゲームシステム名
12
+ NAME = '砂塵戦機アーガス2ndEdition'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = 'さしんせんきああかす2'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
+ ・一般判定Lv(チャンス出目0→判定0) nAG+x
20
+    nは習得レベル、Lv0の場合nの省略可能。xは判定値修正(数式による修正可)、省略した場合はレベル修正0
21
+    例)AG:習得レベル0の一般技能、1AG+1:習得レベル1・判定値修正+1の技能、AG+2-1:習得レベル0・判定値修正2-1の技能、(1-1)AG:習得レベル1・レベル修正-1の技能
22
+
23
+ ・適正距離での命中判定(チャンス出目0→判定0、HR算出)OM+y@z
24
+    yは命中補正値(数式可)、zはクリティカル値。クリティカル値省略時は0
25
+    HRの算出時には、HRが大きくなる場合に出目0を10に読み替えます。
26
+    例)OM+18-6@2:命中補正値+18-6でクリティカル値2、適正距離の判定
27
+
28
+ ・非適正距離での命中判定(チャンス出目0→判定0、HR算出)NM+y@z
29
+    yは命中補正値(数式可)、zはクリティカル値。クリティカル値省略時は0
30
+    HRの算出時には、HRが大きくなる場合に出目0を10に読み替えます。
31
+    例)NM+4-3:命中補正値+4-3で非適正距離の判定
32
+
33
+
34
+ ・『西風旅徨』で導入されたファンブル・ルールを用いた判定
35
+  判定時にダイスがすべて8以上ならファンブル(自動失敗)です。
36
+  それぞれのコマンドにWを付けると『西風旅徨』モードになります。
37
+    ・一般判定 nAGW+x
38
+    ・適正距離での命中判定 OMW+y@z
39
+    ・非適正距離での命中判定 NMW+y@z
40
+
41
+
42
+
43
+ ・クリティカル表   CR
44
+ ・鹵獲結果表     CAP
45
+ ・幕間クエスト表   INT
46
+ ・サルベージ表    SAL
47
+ ・赤字ペナルティー表 DEF
48
+ ・特殊戦況表     SPE
49
+
50
+ ※通常の1D10などの10面ダイスにおいて出目10の読み替えはしません。コマンドのみです。
51
+  ページ参照は、何もない場合は「ルールブック」、wは「西風旅徨」を示します。
52
+
53
+ INFO_MESSAGE_TEXT
54
+
55
+ def initialize(command)
56
+ super(command)
57
+ @enabled_d9 = true
58
+ end
59
+
60
+ def eval_game_system_specific_command(command)
61
+ super(command) ||
62
+ roll_ippan_west(command) ||
63
+ roll_hit_check_west(command) ||
64
+ roll_tables(command, SECOND_ED_TABLES)
65
+ end
66
+
67
+ def roll_ippan_west(command)
68
+ m = /AGW/.match(command)
69
+ return nil unless m
70
+
71
+ result = roll_ippan(command.sub(/(AG)W/) { ::Regexp.last_match(1) })
72
+ return change_fumble(result)
73
+ end
74
+
75
+ def roll_hit_check_west(command)
76
+ m = /[ON]MW/.match(command)
77
+ return nil unless m
78
+
79
+ result = roll_hit_check(command.sub(/([ON]M)W/) { ::Regexp.last_match(1) })
80
+ return change_fumble(result)
81
+ end
82
+
83
+ def change_fumble(result)
84
+ return nil if result.nil?
85
+
86
+ fumble_counts = result.rands.count { |val| val >= 8 }
87
+ if fumble_counts >= 2
88
+ result.text = result.text.sub(/(成功|失敗).*$/, 'ファンブル')
89
+ result.failure = true
90
+ result.success = false
91
+ result.fumble = true
92
+ end
93
+ return result
94
+ end
95
+
96
+ SECOND_ED_TABLES = {
97
+ "CAP" => DiceTable::Table.new(
98
+ "鹵獲結果表",
99
+ "2D10",
100
+ [
101
+ '0:敵A:GuS を完全な状態で鹵獲︕ ※総合価格÷ 2 で売却可。',
102
+ '1:敵A:GuS を完全な状態で鹵獲︕ ※総合価格÷ 2 で売却可。',
103
+ '2:敵A:GuS を完全な状態で鹵獲︕ ※総合価格÷ 2 で売却可。',
104
+ '3:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
105
+ '4:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
106
+ '5:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
107
+ '6:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
108
+ '7:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
109
+ '8:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
110
+ '9:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
111
+ '10:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
112
+ '11:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
113
+ '12:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
114
+ '13:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
115
+ '14:残念、完全にスクラップだ……。※部品代として[バランス値×300]cdtを獲得。',
116
+ '15:残念、完全にスクラップだ……。※部品代として[バランス値×300]cdtを獲得。',
117
+ '16:残念、完全にスクラップだ……。※部品代として[バランス値×300]cdtを獲得。',
118
+ '17:残念、完全にスクラップだ……。※部品代として[バランス値×300]cdtを獲得。',
119
+ '18:残念、完全にスクラップだ……。※部品代として[バランス値×300]cdtを獲得。',
120
+ ]
121
+ ),
122
+ "INT" => DiceTable::RangeTable.new(
123
+ "幕間クエスト表",
124
+ "1D100",
125
+ [
126
+ [1, '慰労 PC/クルー1名が、労ってくれる。 最大HP+4'],
127
+ [2..3, '感謝 PC/クルー1名が、感謝の気持ちを伝える。 最大HP+4'],
128
+ [4..5, '安堵 PC/ クルー1名が、安堵の気持ちを伝える。 最大HP+4'],
129
+ [6..7, '治療 戦闘中の怪我や急な病気で医療班のお世話になることに。 最大HP+4'],
130
+ [8..9, '日常 PC/クルー1名と、他愛のない日常の会話をする。 最大HP+4'],
131
+ [10..11, '遊興 PC/クルー1名と遊びに興じ、楽しい時を過ごす。 XP+1'],
132
+ [12..13, '勤労 PC/クルー1名と協力し、船内の仕事を行う。 XP+1'],
133
+ [14..15, '評価 PC/クルー1名が、仕事の出来を評価してくれる。 XP+1'],
134
+ [16..17, '調達 PC/クルー1名とともに生活品の買い出しを行うことに。 XP+1'],
135
+ [18..19, '社交 取引や補給などの仕事を通し、船外での社会経験を得る。 XP+1'],
136
+ [20..21, '注意 PC/クルー1名が、君の危険な戦闘行動について指摘する。 SP+1'],
137
+ [22..23, '反省 PC/クルー1名と、作戦行動の反省会を行う。 SP+1'],
138
+ [24..25, '鍛錬 PC/クルー1名に、模擬戦に付き合ってもらう。 SP+1'],
139
+ [26..27, '感心 PC/クルー1名の仕事や戦闘行動に対し、感銘を受ける。 SP+1'],
140
+ [28..29, '改良 整備班と協力し、A:GuSのプログラムの改良に努める。 SP+1'],
141
+ [30..31, '割引 兵装が割引されているのを発見し、格安で購入できる。 基本兵装1つを半額で購入可。'],
142
+ [32..33, '発見 クルー1名が、兵装を入手した。 基本兵装1つを半額で購入可。'],
143
+ [34..35, '発明 クルー1名が、兵装を開発した。 基本兵装1つを半額で購入可。'],
144
+ [36..37, '大発見 クルー1名が、強力な兵装を入手した! 上級兵装1つを購入可。(p37参照)'],
145
+ [38..39, '大発明 クルー1名が、新たな兵装を開発した! 上級兵装1つを購入可。(p37参照)'],
146
+ [40..41, '昔話 PC/クルー1名に、自分の過去について語ってしまう。 最大LP+1'],
147
+ [42..43, '願望 PC/クルー1名に、自分の夢や未来について語ってしまう。 最大LP+1'],
148
+ [44..45, '家族 PC/クルー1名に、自分の家族について語ってしまう。 最大LP+1'],
149
+ [46..47, '望郷 PC/クルー1名に、自分の故郷について語ってしまう。 最大LP+1'],
150
+ [48..49, '知人 PC/クルー1名に、自分の知人を重ね合わせてしまう。 最大LP+1'],
151
+ [50..51, '個人収入 チームとは関係ない個人的な商売や取引で利益を得る。 4,000cdtを獲得。'],
152
+ [52..53, '臨時収入 思いがけない臨時の収入が入る。 4,000cdt を獲得。'],
153
+ [54..55, '取引 クルー1 名と取引を行い、予算を獲得することに成功する。 4,000cdtを獲得。'],
154
+ [56..57, '裏取引 クルー1 名と秘密の取引を行い、見返りとして予算を獲得。 6,000cdtを獲得。'],
155
+ [58..59, '賞与 オーナーが特別に報酬を用意してくれた! 6,000cdtを獲得。'],
156
+ [60..61, '改造 整備班とともに機体の改造に明け暮れる。 任意の改造Lv+1。(上限:2Lv)'],
157
+ [62..63, '鹵獲 鹵獲品の中から機体の改造に使えるものを発見。 任意の改造Lv+1。(上限:2Lv)'],
158
+ [64..65, '強化 案機体を強化するための画期的なアイディアを思いつく。 任意の改造Lv+1。(上限:2Lv)'],
159
+ [66..67, '懇願 整備班に頼みこみ、機体の改造をしてもらう。 任意の改造Lv+1。(上限:3Lv)'],
160
+ [68..69, '掘出物 掘出物を発見、整備班が早速機体に取り付けてくれた。 任意の改造Lv+1。(上限:3Lv)'],
161
+ [70..71, '募集 クルーの募集を行ったところ、何名か候補が現れた。 クルー1名を割安(20,000cdt)で雇用可。'],
162
+ [72..73, '勧誘 有能な人材を発見した。ぜひ雇い入れたいものだが。 クルー1名を割安(20,000cdt)で雇用可。'],
163
+ [74..75, '推薦 依頼人からの推薦で、クルーを1名紹介される。 クルー1名を割安(20,000cdt)で雇用可。'],
164
+ [76..77, '志願 クルーとして雇って欲しい、という人物が現れる。クルー1名を割安(15,000cdt)で雇用可。'],
165
+ [78..79, '成長 見習いクルーが大分成長してきた。もう1人前と見てもいい。クルー1名を割安(15,000cdt)で雇用可。'],
166
+ [80..81, '交渉 依頼人との交渉がうまくいき、少し報酬を割増ししてもらえる。 チーム予算を8,000cdt獲得。'],
167
+ [82..83, '節約 経費が思ったよりも節約できた。経理やオーナーの機嫌が良い。 チーム予算を8,000cdt獲得。'],
168
+ [84..85, '賞金 今回の敵は賞金がかかっていたようで臨時収入が入った。 チーム予算を8,000cdt獲得。'],
169
+ [86..87, '名声 チームの名声が高まっており、クルーの自尊心が刺激される。 チーム予算を12,000cdt獲得。'],
170
+ [88..89, '一致団結 オーナーからの労いがあり、クルー一同の結束力が高まる。 チーム予算を12,000cdt獲得。'],
171
+ [90..91, '点検 PC/クルー1名とシップに異状がないか点検作業を行う。 拠点AP+10。'],
172
+ [92..93, '補修 整備班とともにくたびれたシップの改装作業を行う。 拠点AP+10。'],
173
+ [94..95, '全面改修 艦内の問題箇所を全面的に改修する。 拠点AP+10。'],
174
+ [96..97, '自由 行動自由気ままに好きなことをして過ごす。 00~49の任意の効果を適用可。(p69参照)'],
175
+ [98..99, '歓迎 街の住民にたいへんな歓迎を受ける。 50~95の任意の効果を適用可。(p69参照)'],
176
+ [100, '慰労 PC/クルー1名が、労ってくれる。 最大HP+4'],
177
+ ]
178
+ ),
179
+ "SAL" => DiceTable::RangeTable.new(
180
+ "サルベージ表",
181
+ "1D100",
182
+ [
183
+ [1..2, '大失敗…。大変な損失を出してしまった…。 -5,000cdt'],
184
+ [3..5, '失敗…。かなりの損失を出してしまった…。 -3,000cdt'],
185
+ [6..9, '失敗…。損失を出してしまった…。 -1,000cdt'],
186
+ [10, '大成功!大きな収益を上げることができた! +5,000cdt'],
187
+ [11..19, '空振り……何の成果も得られなかった…。 0cdt'],
188
+ [20, '掘り出し物を発見!2Lv改造済の【基本携行兵装】一つを獲得! 一般兵装(→p34)'],
189
+ [21..22, 'ジャンク品を発見。船の装甲強化くらいには使えそうだ。 拠点AP+[5]'],
190
+ [23..25, 'ジャンク品を発見。少し赤字だがまあやむを得まい。 +1,000cdt'],
191
+ [26..29, 'ジャンク品を発見。手間賃くらいにはなった。 +2,000cdt'],
192
+ [30, '掘り出し物を発見!2Lv改造済の【基本外装兵装】一つを獲得! 一般兵装(→p35)'],
193
+ [31..32, '成功!少しだが利益を出すことができた! +3,000cdt'],
194
+ [33..35, '成功!まずまずの利益を出すことができた! +5,000cdt'],
195
+ [36..39, '大成功!大きな利益を出すことができた! +7,000cdt'],
196
+ [40..41, '良質のバッテリーを獲得。 EP+[4]'],
197
+ [42..43, '良質の装甲版を獲得。 AP+[4]'],
198
+ [44, '大失敗…。大きな損失を出してしまった…。 -5,000cdt'],
199
+ [45, 'ブレードを獲得。 →p34'],
200
+ [46, 'ランスを獲得。 →p34'],
201
+ [47, 'アンカーブレードを獲得。 →p34'],
202
+ [48, 'パイルバンカーを獲得。 →p34'],
203
+ [49, 'ハンドガンを獲得。 →p35'],
204
+ [50, 'ヘビーハンドガンを獲得。 →p35'],
205
+ [51, 'ライフルを獲得。 →p35'],
206
+ [52, 'アンカーショットを獲得。 →p35'],
207
+ [53, 'マシンガンSを獲得。 →p35'],
208
+ [54, 'マシンガンLを獲得。 →p35'],
209
+ [55, 'ミサイルポッドSを獲得。 →p35'],
210
+ [56, 'ミサイルポッドLを獲得。 →p35'],
211
+ [57, 'バズーカを獲得。 →p35'],
212
+ [58, 'カノンを獲得。 →p35'],
213
+ [59, 'ライトシールドを獲得。 →p35'],
214
+ [60, 'ミドルシールドを獲得。 →p35'],
215
+ [61, 'ヘビーシールドを獲得。 →p35'],
216
+ [62, 'レーダーユニットを獲得。 →p35'],
217
+ [63, 'ECMユニットを獲得。 →p35'],
218
+ [64, 'サブブースターを獲得。 →p36'],
219
+ [65, 'ディフェンスサポートを獲得。 →p36'],
220
+ [66, 'コンバットサポートを獲得。 →p36'],
221
+ [67, '大失敗…。大きな損失を出してしまった…。 -5,000cdt'],
222
+ [68, 'ショットサポートを獲得。 →p36'],
223
+ [69, 'パワーローダーを獲得。 →p36'],
224
+ [70, 'サブバッテリーを獲得。 →p36'],
225
+ [71, 'サブバッテリー+を獲得。 →p36'],
226
+ [72, 'ファランクスを獲得。 →p36'],
227
+ [73, 'リアクティブアーマーを獲得。 →p36'],
228
+ [74, '強化装甲版を獲得。 →p36'],
229
+ [75, 'ヘビーマシンガンSを獲得。 →p35'],
230
+ [76, 'ヘビーマシンガンLを獲得。 →p35'],
231
+ [77, '掘り出し物を発見!25,000cdt以下の【上級外装兵装】一つを獲得! 上級兵装 (→p37)'],
232
+ [78..79, '失敗…。かなりの損失を出してしまった…。 -3,000cdt'],
233
+ [80, '医療用品を獲得! 調息値+[1](全PC)'],
234
+ [81, '大型ソーラーパネルを獲得! 整備値+[1](全PC)'],
235
+ [82, '艦内用の環境設備を獲得! サポート使用回数+[1]'],
236
+ [83, 'リニアガンを獲得。 →p37'],
237
+ [84, 'リニアマシンガンを獲得。 →p37'],
238
+ [85, 'ジャマ―ユニットを獲得。 →p37'],
239
+ [86, 'センサー+を獲得。 →p37'],
240
+ [87, 'パワーローダー++を獲得。 →p37'],
241
+ [88, 'サブバッテリー++を獲得。 →p37'],
242
+ [89, 'フレームカバーを獲得。 →p37'],
243
+ [90, '空振り……何の成果も得られなかった…。 0cdt'],
244
+ [91..92, '良質なA:GuSのパーツを獲得!機体の改造や予備パーツとして使えそうだ! 改造Lv+[1](上限:3Lv)'],
245
+ [93..95, 'A:GuSのパーツを獲得!機体の改造や予備パーツとして使えそうだ。 改造Lv+[1](上限:1Lv)'],
246
+ [96..98, '多少傷ついているが、A:GuS1機を獲得!→10,000cdtで売却可能→10,000cdt支払えば補修して取得が可能。 (→p30~33)(→w23)'],
247
+ [99, 'A:GuS1機をほぼ完全な状態で獲得! (→p30~33)(→w23)'],
248
+ [100, '掘り出し物を発見!25,000cdt以下の【上級携行兵装】一つを獲得! 上級兵装 (→p37)'],
249
+ ]
250
+ ),
251
+ "DEF" => DiceTable::RangeTable.new(
252
+ "赤字ペナルティー表",
253
+ "1D10",
254
+ [
255
+ [1, '解雇 クルー1名を失う。10,000cdtを得る。'],
256
+ [2..3, '劣化 任意のチーム能力一つは-1Lv。10,000cdtを得る。'],
257
+ [4..5, '借金 次回の維持費が+20,000cdt。10,000cdtを得る。'],
258
+ [6..7, '酷使 各PCは最大HP-4。10,000cdtを得る。'],
259
+ [8..9, '売却 各PCはオプション以外の兵装を一つずつ廃棄。10,000cdtを得る。'],
260
+ [10, '解雇 クルー1名を失う。10,000cdtを得る。'],
261
+ ]
262
+ ),
263
+ # DiceTable::Tableが現状1D9に未対応
264
+ "SPE" => DiceTable::Table.new(
265
+ "特殊戦況表",
266
+ "1D10",
267
+ [
268
+ '混戦 以下のエリアのユニットをシャッフルする。♠:A⇔C ♣:B⇔D ♦:A⇔D ♥:B⇔C',
269
+ '乱戦 R中、すべての攻撃は[距離:○]になる。',
270
+ '逸失 敵拠点エリアのユニットを[♠♣:A ♦♥:B]に移動。味方拠点エリアのユニットを[♠♣:D ♦♥:C]に移動。',
271
+ '突風 艦船、オブジェクト以外の全ユニットを「風向き」方向に移動。',
272
+ '流砂 以下のエリアのユニットは脱出のため、MPとEPを[3]点失う。[♠:A ♣:B ♦:C ♥:D]',
273
+ '混乱 母船内でトラブル発生。R中、【整備】は行えない。[♠♥:味方側 ♣♦:敵側]',
274
+ '岩盤 以下のエリアのユニットは岩盤に乗り上げ、《クリティカル》が1回発生。[♠:A ♣:B ♦:C ♥:D]',
275
+ '混乱 R中、イニシア値を逆順で処理する。 ※【エイミング】等の高低も逆として処理する。',
276
+ '飛礫 飛礫によって、すべてのユニットはAPを[1D10](以下のエリアでは[2D10])点失う。[♠:A ♣:B ♦:C ♥:D]',
277
+ '雨 雨は砂を土へと変えてしまう。R中、全ユニット移動/突撃不可。',
278
+ ]
279
+ ),
280
+ }.freeze
281
+ register_prefix_from_super_class()
282
+ register_prefix('-?\d*AGW', 'OMW', 'NMW', SECOND_ED_TABLES.keys)
283
+ end
284
+ end
285
+ end
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/command/parser'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class Siren < Base
8
+ # ゲームシステムの識別子
9
+ ID = "Siren"
10
+
11
+ # ゲームシステム名
12
+ NAME = "終末アイドル育成TRPG セイレーン"
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = "せいれえん"
16
+
17
+ HELP_MESSAGE = <<~TEXT
18
+ ・判定: SL+a<=b±c
19
+ a=達成値への修正(0の場合は省略)
20
+ b=能力値
21
+ c=判定への修正(0の場合は省略、複数可)
22
+ 例)判定修正-10の装備を装着しながら【技術:60】〈兵器:2〉で判定する場合。
23
+ SL+2<=60+40-10
24
+
25
+ ・育成: TR$a<=b
26
+ a=育成した回数
27
+ b=ヘルス
28
+ 例)ヘルスの現在値が60で2回目の【身体】の育成を行う場合。
29
+ TR$2<=60
30
+ TEXT
31
+
32
+ def eval_game_system_specific_command(command)
33
+ case command
34
+ when /^SL/ then check_action(command)
35
+ when /^TR/ then check_training(command)
36
+ else return nil
37
+ end
38
+ end
39
+
40
+ def check_action(command)
41
+ parser = Command::Parser.new('SL', round_type: @round_type).restrict_cmp_op_to(:<=)
42
+ parsed = parser.parse(command)
43
+ return nil if parsed.nil?
44
+
45
+ target = parsed.target_number
46
+
47
+ dice = @randomizer.roll_once(100)
48
+
49
+ if dice > target
50
+ return Result.failure("(1D100<=#{target}) > #{dice} > 失敗")
51
+ end
52
+
53
+ dig10 = dice / 10
54
+ dig1 = dice % 10
55
+ if dig10 == 0
56
+ dig10 = 10
57
+ end
58
+ if dig1 == 0
59
+ dig1 = 10
60
+ end
61
+ achievement_value = dig10 + dig1 + parsed.modify_number
62
+ return Result.success("(1D100<=#{target}) > #{dice} > 成功(達成値:#{achievement_value})")
63
+ end
64
+
65
+ def check_training(command)
66
+ parser = Command::Parser.new('TR', round_type: @round_type).restrict_cmp_op_to(:<=).enable_dollar.disable_modifier
67
+ parsed = parser.parse(command)
68
+ return nil if parsed.nil?
69
+
70
+ count = parsed.dollar
71
+ return nil if count.nil?
72
+
73
+ target = parsed.target_number
74
+
75
+ dice = @randomizer.roll_once(100)
76
+
77
+ dig10 = dice / 10
78
+ dig1 = dice % 10
79
+ if dig10 == 0
80
+ dig10 = 10
81
+ end
82
+ if dig1 == 0
83
+ dig1 = 10
84
+ end
85
+ achievement_value = dig10 + dig1
86
+
87
+ if dice > target
88
+ return Result.failure("(1D100<=#{target}) > #{dice} > 失敗(能力値減少:10 / ヘルス減少:#{achievement_value})")
89
+ end
90
+
91
+ return Result.success("(1D100<=#{target}) > #{dice} > 成功(能力値上昇:#{count * 5 + achievement_value} / ヘルス減少:#{achievement_value})")
92
+ end
93
+
94
+ register_prefix('SL', 'TR')
95
+ end
96
+ end
97
+ end
@@ -50,7 +50,7 @@ module BCDice
50
50
  private
51
51
 
52
52
  def get_judge_result(command)
53
- return nil unless (m = (/^2D6<=(\d)$/i.match(command) || /^SN(\d*)$/i.match(command)))
53
+ return nil unless (m = /^2D6<=(\d)$/i.match(command) || /^SN(\d*)$/i.match(command))
54
54
 
55
55
  debug("====get_judge_result====")
56
56
 
@@ -96,7 +96,7 @@ module BCDice
96
96
  "大漁\n船内マップ上にいるすべてのキャラクターの【生命点】の最大値を「2点」増加する。この効果は重複しない。\n 飛翔イカの群れだ! どうも、 窓から漏れる明かりにつられてやってきたらしい。網をはろう。今夜は新鮮なイカがたらふく食べられそうだ。",
97
97
  "気流+1\n飛空艇コマを1スポット分進める。\n 他の空域よりも、比較的強い流れが一定の方向に吹き続けている空域。ときに探空士たちの手助けになり、ときに探空士たちに立ちはだかる。どの空域にどんな風が流れているかを見極めて進むのが、空の旅での基本だ。",
98
98
  "ケセランパセラン\nキミは任意の船内マップ上に配置されてるパーツ1つを選択する。そのパーツが【快適度】のキーワード効果がある場合、このセッションの間、その数値は「1点」高いものとして扱う。\n ふわふわとした大きな綿毛のような浮遊生物。その毛のさわり心地は、上級階級のソファにも使われるほど柔らかい。捕まえて飼うことができれば、一服の癒やしをあたえてくれることだろう。",
99
- "うさこぷたー\nキミの【生命点】を「3点」回復する。\n ふわふわとした大きな綿毛のような浮遊生物。その毛のさわり心地は、上流階級のソファにも使われるほど柔らかい。 捕まえて飼うことができれば、一服の癒やしをあたえてくれることだろう。"
99
+ "うさこぷたー\nキミの【生命点】を「3点」回復する。\n ふたつの耳を回転させて空を飛ぶうさぎのような浮遊生物が、ずっとこちらを見つめている。かわいいはかわいいのだが、こいつは一体なんなんだろう……。"
100
100
  ]
101
101
  ),
102
102
  "NEO" => DiceTable::Table.new(
@@ -90,7 +90,7 @@ module BCDice
90
90
  result = "(#{diceCount}D10\<\=#{target}) > #{diceText} > Hits:#{successCount}*#{damage} > #{totalDamage}ダメージ"
91
91
  else
92
92
  result = "(#{diceCount}D10\<\=#{target}) > #{diceText}"
93
- if successCount > 0
93
+ if successCount > 0
94
94
  result += " > 【成功】"
95
95
  else
96
96
  result += " > 【失敗】"
@@ -334,6 +334,11 @@ module BCDice
334
334
  if command.modifier_after_half != 0
335
335
  text += Format.modifier(command.modifier_after_half)
336
336
  end
337
+ elsif command.one_and_a_half
338
+ text = "(#{text})*1.5"
339
+ if command.modifier_after_one_and_a_half != 0
340
+ text += Format.modifier(command.modifier_after_one_and_a_half)
341
+ end
337
342
  end
338
343
  sequence.push(text)
339
344
  elsif command.half
@@ -342,6 +347,12 @@ module BCDice
342
347
  text += Format.modifier(command.modifier_after_half)
343
348
  end
344
349
  sequence.push(text)
350
+ elsif command.one_and_a_half
351
+ text = "#{rateResults.first}*1.5"
352
+ if command.modifier_after_one_and_a_half != 0
353
+ text += Format.modifier(command.modifier_after_one_and_a_half)
354
+ end
355
+ sequence.push(text)
345
356
  end
346
357
 
347
358
  if round > 1
@@ -355,6 +366,11 @@ module BCDice
355
366
  if command.modifier_after_half != 0
356
367
  total += command.modifier_after_half
357
368
  end
369
+ elsif command.one_and_a_half
370
+ total = (total * 1.5).ceil
371
+ if command.modifier_after_one_and_a_half != 0
372
+ total += command.modifier_after_one_and_a_half
373
+ end
358
374
  end
359
375
 
360
376
  total_text = total.to_s
@@ -39,6 +39,13 @@ module BCDice
39
39
   クリティカル値を指定しない場合、クリティカルなしと扱われます。
40
40
   例)HK20  K20h  HK10-5@9  K10-5@9H  K20gfH  K20+8H+2  K20+8H+(1+1)
41
41
 
42
+ ・レーティング表の1.5倍 (OHKx, KxOH+N)
43
+  レーティング表の先頭または末尾に"OH"をつけると、レーティング表を振って最終結果を1.5倍します。
44
+  末尾につけた場合、直後に修正ををつけることで、1.5倍後の加減算を行うことができます。
45
+  この際、複数の項による修正にはカッコで囲うことが必要です(カッコがないとパースに失敗します)
46
+  クリティカル値を指定しない場合、クリティカルなしと扱われます。
47
+  例)OHK20  K20oh  OHK10-5@9  K20+8OH+2  K20+8OH+(1+1)
48
+
42
49
  ・ダイス目の修正(運命変転やクリティカルレイ用)
43
50
   末尾に「$修正値」でダイス目に修正がかかります。
44
51
   $+1と修正表記ならダイス目に+修正、$9のように固定値ならダイス目をその出目に差し替え。
@@ -82,7 +89,7 @@ module BCDice
82
89
   アビスカース表を出すことができます。
83
90
  INFO_MESSAGE_TEXT
84
91
 
85
- register_prefix('H?K', 'Gr', '2D6?@\d+', 'FT', 'TT', 'Dru', 'ABT')
92
+ register_prefix('H?K', 'OHK', 'Gr', '2D6?@\d+', 'FT', 'TT', 'Dru', 'ABT')
86
93
 
87
94
  def eval_game_system_specific_command(command)
88
95
  case command
@@ -73,7 +73,7 @@ module BCDice
73
73
 
74
74
  return result if target == 0
75
75
 
76
- if successValue >= target
76
+ if successValue >= target
77
77
  result += " > 【成功】"
78
78
  else
79
79
  result += " > 【失敗】"
@@ -355,7 +355,7 @@ module BCDice
355
355
  '武器防具の名前(ソード、メイルなど)',
356
356
  '自然現象の名前(カザンハリケーンなど)',
357
357
  '機械の名前(洗濯機、テレビなど)',
358
- '目についた物の名前(シャーペン、メガネなど)', # 100
358
+ '目についた物の名前(シャーペン、メガネなど)', # 100
359
359
  ]
360
360
  )
361
361
  end