bcdice 3.4.0 → 3.5.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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -0
  3. data/i18n/BeginningIdol/ja_jp.yml +2806 -0
  4. data/i18n/BeginningIdol/ko_kr.yml +1400 -0
  5. data/i18n/KillDeathBusiness/ja_jp.yml +1 -1
  6. data/i18n/MagicaLogia/ja_jp.yml +1 -1
  7. data/i18n/MonotoneMuseum/ko_kr.yml +526 -53
  8. data/lib/bcdice/common_command/choice.rb +5 -1
  9. data/lib/bcdice/common_command/tally_dice/node.rb +135 -0
  10. data/lib/bcdice/common_command/tally_dice/parser.rb +302 -0
  11. data/lib/bcdice/common_command/tally_dice.rb +19 -0
  12. data/lib/bcdice/common_command.rb +2 -0
  13. data/lib/bcdice/dice_table/d66_table.rb +5 -1
  14. data/lib/bcdice/game_system/Aoharubaan.rb +91 -0
  15. data/lib/bcdice/game_system/AssaultEngine.rb +91 -0
  16. data/lib/bcdice/game_system/BadLife.rb +264 -289
  17. data/lib/bcdice/game_system/Bakenokawa.rb +244 -0
  18. data/lib/bcdice/game_system/BeginningIdol.rb +116 -2390
  19. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +10 -2312
  20. data/lib/bcdice/game_system/CastleInGray.rb +133 -0
  21. data/lib/bcdice/game_system/Cthulhu.rb +2 -2
  22. data/lib/bcdice/game_system/Cthulhu7th.rb +6 -6
  23. data/lib/bcdice/game_system/DoubleCross.rb +5 -0
  24. data/lib/bcdice/game_system/Emoklore.rb +1 -1
  25. data/lib/bcdice/game_system/FateCoreSystem.rb +117 -0
  26. data/lib/bcdice/game_system/Karukami.rb +84 -0
  27. data/lib/bcdice/game_system/KurayamiCrying.rb +1 -1
  28. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
  29. data/lib/bcdice/game_system/{SterileLife.rb → StellarLife.rb} +162 -226
  30. data/lib/bcdice/game_system/SwordWorld.rb +6 -2
  31. data/lib/bcdice/game_system/SwordWorld2_0.rb +20 -5
  32. data/lib/bcdice/game_system/SwordWorld2_5.rb +6 -0
  33. data/lib/bcdice/game_system/TalesFromTheLoop.rb +83 -0
  34. data/lib/bcdice/game_system/YearZeroEngine.rb +40 -19
  35. data/lib/bcdice/game_system/beginning_idol/accessories_table.rb +31 -0
  36. data/lib/bcdice/game_system/beginning_idol/bad_status_table.rb +43 -0
  37. data/lib/bcdice/game_system/beginning_idol/chain_d66_table.rb +29 -0
  38. data/lib/bcdice/game_system/beginning_idol/chain_table.rb +37 -0
  39. data/lib/bcdice/game_system/beginning_idol/costume_table.rb +37 -0
  40. data/lib/bcdice/game_system/beginning_idol/d6_twice_table.rb +36 -0
  41. data/lib/bcdice/game_system/beginning_idol/item_table.rb +51 -0
  42. data/lib/bcdice/game_system/beginning_idol/my_skill_name_table.rb +44 -0
  43. data/lib/bcdice/game_system/beginning_idol/random_event_table.rb +31 -0
  44. data/lib/bcdice/game_system/beginning_idol/skill_table.rb +63 -0
  45. data/lib/bcdice/game_system/beginning_idol/table.rb +193 -0
  46. data/lib/bcdice/game_system/beginning_idol/with_abnormality.rb +74 -0
  47. data/lib/bcdice/game_system/beginning_idol/work_table.rb +57 -0
  48. data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +4 -4
  49. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +46 -3
  50. data/lib/bcdice/game_system/sword_world/rating_parser.rb +147 -106
  51. data/lib/bcdice/game_system.rb +8 -1
  52. data/lib/bcdice/version.rb +1 -1
  53. metadata +28 -3
@@ -0,0 +1,133 @@
1
+ module BCDice
2
+ module GameSystem
3
+ class CastleInGray < Base
4
+ # ゲームシステムの識別子
5
+ ID = "CastleInGray".freeze
6
+
7
+ # ゲームシステム名
8
+ NAME = "灰色城綺譚".freeze
9
+
10
+ # ゲームシステム名の読みがな
11
+ SORT_KEY = "はいいろしようきたん".freeze
12
+
13
+ HELP_MESSAGE = <<~TEXT.freeze
14
+ ■ 色占い (BnWm)
15
+ n: 黒
16
+ m: 白
17
+ n, m は1~12の異なる整数
18
+
19
+ 例) B12W7
20
+ 例) B5W12
21
+
22
+ ■ 悪意の渦による占い (MALn)
23
+ n: 悪意の渦
24
+ n は1~12の整数
25
+
26
+ ■ その他
27
+ ・感情表 ET
28
+ ・暗示表(黒) BIT
29
+ ・暗示表(白) WIT
30
+ TEXT
31
+
32
+ TABLES = {
33
+ "ET" => DiceTable::Table.new(
34
+ "感情表",
35
+ "1D12",
36
+ [
37
+ "友情(白)/敵視(黒)",
38
+ "恋慕(白)/嫌悪(黒)",
39
+ "信頼(白)/不信(黒)",
40
+ "同情(白)/憐憫(黒)",
41
+ "憧憬(白)/劣等感(黒)",
42
+ "尊敬(白)/蔑視(黒)",
43
+ "忠誠(白)/執着(黒)",
44
+ "有用(白)/邪魔(黒)",
45
+ "許容(白)/罪悪感(黒)",
46
+ "羨望(白)/嫉妬(黒)",
47
+ "共感(白)/拒絶(黒)",
48
+ "愛情(白)/狂信(黒)"
49
+ ]
50
+ ),
51
+ "BIT" => DiceTable::Table.new(
52
+ "暗示表(黒)",
53
+ "1D12",
54
+ [
55
+ "終わりなき夜に生まれつく者もあり",
56
+ "悪意もて真実を語らば",
57
+ "笑えども笑みはなし",
58
+ "影より抜け出ることあたわじ",
59
+ "心の赴くままに手をとれ",
60
+ "時ならぬ嵐の過ぎ去るを待つ",
61
+ "赦されぬと知るがゆえに",
62
+ "見張りは持ち場を離れる",
63
+ "誰もが盲いたる彷徨い人なり",
64
+ "落ちる日を眺めるがごとく",
65
+ "冷たく雨ぞ降りしきる",
66
+ "今日は笑む花も明日には枯れゆく"
67
+ ]
68
+ ),
69
+ "WIT" => DiceTable::Table.new(
70
+ "暗示表(白)",
71
+ "1D12",
72
+ [
73
+ "無垢なる者のみが真実を得る",
74
+ "げに慈悲深きは沈黙なり",
75
+ "懐かしき日々は去りぬ",
76
+ "束の間に光さす",
77
+ "迷える者に手を差し伸べよ",
78
+ "嵐の前には静けさがある",
79
+ "どうか責めないで",
80
+ "灯した明かりを絶やさぬように",
81
+ "目を開けて見よ",
82
+ "淑やかに訪れる",
83
+ "今こそ泣け、さもなくば二度と泣くな",
84
+ "時が許す間に薔薇を摘め"
85
+ ]
86
+ ),
87
+ }.freeze
88
+
89
+ register_prefix('B', 'MAL', TABLES.keys)
90
+
91
+ def eval_game_system_specific_command(command)
92
+ return roll_color(command) || roll_mal(command) || roll_tables(command, TABLES)
93
+ end
94
+
95
+ def roll_color(command)
96
+ m = /^B(\d{1,2})W(\d{1,2})$/.match(command)
97
+ return nil unless m
98
+
99
+ black = m[1].to_i
100
+ white = m[2].to_i
101
+ return nil unless black.between?(1, 12) && white.between?(1, 12)
102
+
103
+ value = @randomizer.roll_once(12)
104
+
105
+ if black == white
106
+ return color_text(black, white, value, '白と黒は重ねられません')
107
+ end
108
+
109
+ if white > black
110
+ return color_text(black, white, value, black <= value && value < white ? '黒' : '白')
111
+ else
112
+ return color_text(black, white, value, white <= value && value < black ? '白' : '黒')
113
+ end
114
+ end
115
+
116
+ def color_text(black, white, value, result)
117
+ return "色占い(黒#{black}白#{white}) > [#{value}] > #{result}"
118
+ end
119
+
120
+ def roll_mal(command)
121
+ m = /^MAL(\d{1,2})$/i.match(command)
122
+ return nil unless m
123
+
124
+ mal = m[1].to_i
125
+ return nil unless mal.between?(1, 12)
126
+
127
+ value = @randomizer.roll_once(12)
128
+ result = value <= mal ? '黒' : '白'
129
+ return "悪意の渦(#{mal}) > [#{value}] > #{result}"
130
+ end
131
+ end
132
+ end
133
+ end
@@ -193,12 +193,12 @@ module BCDice
193
193
  end
194
194
 
195
195
  def getRegistResult(command)
196
- m = /^RES(B)?([-\d]+)$/i.match(command)
196
+ m = /^RESB?(-?\d+)$/i.match(command)
197
197
  unless m
198
198
  return nil
199
199
  end
200
200
 
201
- value = m[2].to_i
201
+ value = m[1].to_i
202
202
  target = value * 5 + 50
203
203
 
204
204
  if target < 5
@@ -64,17 +64,17 @@ module BCDice
64
64
  combine_roll(command)
65
65
  when /^FAR/i
66
66
  getFullAutoResult(command)
67
- when /^BMR/i # 狂気の発作(リアルタイム)
67
+ when "BMR" # 狂気の発作(リアルタイム)
68
68
  roll_bmr_table()
69
- when /^BMS/i # 狂気の発作(サマリー)
69
+ when "BMS" # 狂気の発作(サマリー)
70
70
  roll_bms_table()
71
- when /^FCL/i # キャスティング・ロールのプッシュに失敗した場合(小)
71
+ when "FCL" # キャスティング・ロールのプッシュに失敗した場合(小)
72
72
  roll_1d8_table("キャスティング・ロール失敗(小)表", FAILED_CASTING_L_TABLE)
73
- when /^FCM/i # キャスティング・ロールのプッシュに失敗した場合(大)
73
+ when "FCM" # キャスティング・ロールのプッシュに失敗した場合(大)
74
74
  roll_1d8_table("キャスティング・ロール失敗(大)表", FAILED_CASTING_M_TABLE)
75
- when /^PH/i # 恐怖症表
75
+ when "PH" # 恐怖症表
76
76
  roll_1d100_table("恐怖症表", PHOBIAS_TABLE)
77
- when /^MA/i # マニア表
77
+ when "MA" # マニア表
78
78
  roll_1d100_table("マニア表", MANIAS_TABLE)
79
79
  end
80
80
  end
@@ -30,6 +30,11 @@ module BCDice
30
30
  ・D66ダイスあり
31
31
  INFO_MESSAGE_TEXT
32
32
 
33
+ def initialize(command)
34
+ super(command)
35
+ @sides_implicit_d = 10
36
+ end
37
+
33
38
  register_prefix('\d+DX', 'ET')
34
39
 
35
40
  # 成功判定コマンドのノード
@@ -67,7 +67,7 @@ module BCDice
67
67
  success_value = 2 * critical + success - fumble
68
68
  result = compare_result(success_value)
69
69
 
70
- result.text = "#{values} > #{success_value} > #{result.text}"
70
+ result.text = "#{values} > #{success_value} > 成功数#{success_value} #{result.text}"
71
71
  return result
72
72
  end
73
73
 
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class FateCoreSystem < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'FateCoreSystem'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'Fate Core System'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'ふえいとこあしすてむ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ■ ファッジダイスによる判定 (xDF+y>=t)
18
+ ファッジダイスをx個ダイスロールし、結果を判定します。
19
+ x: ダイス数
20
+ y: 修正値(省略可)
21
+ t: 目標値値(省略可)
22
+ 例)4DF, 4DF>=3, 4DF+1>=3
23
+ MESSAGETEXT
24
+
25
+ register_prefix('\d+DF')
26
+
27
+ def eval_game_system_specific_command(command)
28
+ roll_df(command)
29
+ end
30
+
31
+ private
32
+
33
+ def roll_df(command)
34
+ parser = Command::Parser.new("DF", round_type: @round_type)
35
+ .enable_prefix_number()
36
+ .restrict_cmp_op_to(:>=, nil)
37
+
38
+ parsed = parser.parse(command)
39
+ unless parsed
40
+ return nil
41
+ end
42
+
43
+ dice_list = roll_fate_dice(parsed.prefix_number)
44
+ total = dice_list.sum() + parsed.modify_number
45
+
46
+ fate_dice_list = dice_list.map do |i|
47
+ if i.zero?
48
+ "[ ]"
49
+ elsif i.positive?
50
+ "[+]"
51
+ else
52
+ "[-]"
53
+ end
54
+ end
55
+
56
+ result = outcome(total, parsed.target_number)
57
+ sequence = [
58
+ "(#{parsed})",
59
+ "#{fate_dice_list.join()}#{Format.modifier(parsed.modify_number)}",
60
+ result_ladder(total),
61
+ result.text,
62
+ ]
63
+
64
+ result.text = sequence.compact.join(" > ")
65
+ return result
66
+ end
67
+
68
+ def roll_fate_dice(times)
69
+ @randomizer.roll_barabara(times, 3).map { |i| i - 2 }
70
+ end
71
+
72
+ def result_ladder(total)
73
+ ladder =
74
+ case total.clamp(-2, 8)
75
+ when 8
76
+ "Legendary"
77
+ when 7
78
+ "Epic"
79
+ when 6
80
+ "Fantastic"
81
+ when 5
82
+ "Superb"
83
+ when 4
84
+ "Great"
85
+ when 3
86
+ "Good"
87
+ when 2
88
+ "Fair"
89
+ when 1
90
+ "Average"
91
+ when 0
92
+ "Mediocre"
93
+ when -1
94
+ "Poor"
95
+ else
96
+ "Terrible"
97
+ end
98
+
99
+ return "#{ladder}(#{format('%+d', total)})"
100
+ end
101
+
102
+ def outcome(total, target)
103
+ if target.nil?
104
+ Result.new
105
+ elsif total == target
106
+ Result.success("Tie")
107
+ elsif total >= target + 3
108
+ Result.critical("Succeed with Style")
109
+ elsif total >= target
110
+ Result.success("Succeed")
111
+ else
112
+ Result.failure("Fail")
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Karukami < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'Karukami'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'カルカミ'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'かるかみ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~HELP_MESSAGE
17
+ ■ 行為判定、ダメージ算出 (xUB+y@c>=t)
18
+ 6面ダイスをx個ダイスロールし、クリティカル値以上の出目が出たら振り足して合計値を算出します。
19
+ x: ダイス数
20
+ y: 修正値(省略可)
21
+ c: クリティカル値(省略可)
22
+ t: 目標値値(省略可)
23
+ 例)2UB, 2UB>=7, 3UB+1@5, 3UB+1@5<10
24
+ HELP_MESSAGE
25
+
26
+ register_prefix('\d+UB')
27
+
28
+ def eval_game_system_specific_command(command)
29
+ roll_ub(command)
30
+ end
31
+
32
+ def roll_ub(command)
33
+ parser = Command::Parser.new("UB", round_type: @round_type)
34
+ .has_prefix_number
35
+ .enable_critical
36
+ parsed = parser.parse(command)
37
+ unless parsed
38
+ return nil
39
+ end
40
+
41
+ critical = parsed.critical || 6
42
+ if critical <= 1
43
+ return "(#{parsed}) > クリティカル値は2以上としてください"
44
+ end
45
+
46
+ list_list = []
47
+ criticals = 0
48
+ stack = parsed.prefix_number
49
+ while stack > 0
50
+ dice_list = @randomizer.roll_barabara(stack, 6)
51
+ list_list.push(dice_list)
52
+ stack = dice_list.count { |x| x >= critical }
53
+ criticals += stack
54
+ end
55
+
56
+ total = list_list.flatten.sum() + parsed.modify_number
57
+
58
+ result =
59
+ if list_list.first.all?(1)
60
+ total = 0
61
+ Result.fumble("ファンブル")
62
+ elsif parsed.cmp_op.nil?
63
+ Result.new()
64
+ elsif total.send(parsed.cmp_op, parsed.target_number)
65
+ Result.success("成功")
66
+ else
67
+ Result.failure("失敗")
68
+ end
69
+ result.critical = criticals > 0
70
+
71
+ sequence = [
72
+ "(#{parsed})",
73
+ *list_list.map { |list| "[#{list.join(',')}]" },
74
+ total,
75
+ ("#{criticals}クリティカル" if result.critical?),
76
+ result.text,
77
+ ].compact
78
+
79
+ result.text = sequence.join(" > ")
80
+ return result
81
+ end
82
+ end
83
+ end
84
+ end
@@ -47,7 +47,7 @@ module BCDice
47
47
  "さっきからずっと、不気味な視線を感じる……どうやら、良くない存在に目をつけられてしまったようだ。「怪異」があなたに一方的な「ツナガリ」を獲得する。すでに「怪異」から「ツナガリ」を獲得されている場合、ダイスを振り直し、再度「アクシデント表」に当てはめる。",
48
48
  "ぶつんと頭の中で音がする。あれっ?誰かのことを考えていたような……なんだか記憶が霞んで、思い出せない。あなたが獲得している「ツナガリ」をランダムに1つ失う(「継続的なツナガリ」である場合、セッション終了後に再度獲得する)。「ツナガリ」が1つもない場合、ダイスを振り直し、再度「アクシデント表」に当てはめる。",
49
49
  "ぞわりと背中に懇寒が走る。自分を取り巻く「流れ」──運命に似た何かが歪んでしまったような、おぞましい予感が胸を走る。「確保」しているダイスの目が「10」になる。ダイスを「確保」していない場合、新たに「10」を「確保」する。すでに「10」の目を「確保」している場合、ダイスを振り直し、再度「アクシデント表」に当てはめる。",
50
- "違う……違う、違う。これは自分のせいじゃない。いや、きっと何かの間違いだ。そう、あいつのせいに決まってる!進行役があなた以外の主人公をランダムに1人選ぷ(誰を選んだか参加者に教えてはならない) 。選ばれた主人公が次に判定を行った際、進行役は、最も低い数字を示しているダイスの目を「10」に変更する。",
50
+ "違う……違う、違う。これは自分のせいじゃない。いや、きっと何かの間違いだ。そう、あいつのせいに決まってる!進行役があなた以外の主人公をランダムに1人選ぶ(誰を選んだか参加者に教えてはならない) 。選ばれた主人公が次に判定を行った際、進行役は、最も低い数字を示しているダイスの目を「10」に変更する。",
51
51
  "あぁ……見つからない。アレがないとダメなのに。一体どうしたら──!「アイテム」をランダムに1つ失う(「継続品」である場合、センョン終了後に再度獲得する)。「アイテム」を1つも所持していない場合、「アイテム」を所持する主人公をランダムに1人選び、2点のダメージを与え、「アイテム」を1つ奪い取る。主人公が誰も「アイテム」を所持していない場合、「理性」を2点失う。",
52
52
  "まるで自分を支える何かが失われたように、あなたはその場に立ち尽くす。諦めと絶望が心を支配する。ああ、そうか。これが、「心が折れる」ということか……。あなたは「理性」を4点失う。"
53
53
  ]
@@ -23,10 +23,10 @@ module BCDice
23
23
    자동성공, 자동실패, 성공, 실패를 자동표기합니다.
24
24
  ・각종표
25
25
   ・감정표 ET/감정표 2.0 ET2
26
-  ・징조표 OT/兆候表ver2.0 OT2/兆候表ver3.0 OT3
27
-  ・일그러짐표 DT/일그러짐표ver2.0 DT2/歪み表(野外) DTO/歪み表() DTS/歪み表(館・城) DTM
28
-  ・세계왜곡표  WDT/世界歪曲表2.0 WDT2
29
-  ・永劫消失表 EDT
26
+  ・징조표 OT/징조표ver2.0 OT2/징조표ver3.0 OT3
27
+  ・일그러짐표 DT/일그러짐표ver2.0 DT2/일그러짐표(야외) DTO/일그러짐표(바다) DTS/일그러짐표(저택・성) DTM
28
+  ・세계왜곡표  WDT/세계왜곡표2.0 WDT2
29
+  ・영구소실표 EDT
30
30
  ・D66다이스 있음
31
31
  INFO_MESSAGE_TEXT
32
32