bcdice 3.1.0 → 3.3.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 (160) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +78 -1
  3. data/README.md +1 -1
  4. data/i18n/MagicaLogia/zh_hans.yml +564 -0
  5. data/i18n/StellarKnights/ja_jp.yml +498 -0
  6. data/i18n/StellarKnights/ko_kr.yml +498 -0
  7. data/i18n/zh_hans.yml +7 -0
  8. data/lib/bcdice/command/parsed.rb +11 -3
  9. data/lib/bcdice/command/parser.rb +179 -100
  10. data/lib/bcdice/common_command/add_dice.rb +1 -1
  11. data/lib/bcdice/common_command/barabara_dice/node.rb +2 -2
  12. data/lib/bcdice/common_command/barabara_dice/result.rb +6 -0
  13. data/lib/bcdice/common_command/calc.rb +1 -1
  14. data/lib/bcdice/dice_table.rb +2 -0
  15. data/lib/bcdice/dice_table/d66_half_grid_table.rb +33 -0
  16. data/lib/bcdice/dice_table/d66_one_third_table.rb +34 -0
  17. data/lib/bcdice/dice_table/sai_fic_skill_table.rb +1 -1
  18. data/lib/bcdice/game_system.rb +6 -0
  19. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  20. data/lib/bcdice/game_system/Ainecadette.rb +68 -0
  21. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  22. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  23. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  24. data/lib/bcdice/game_system/Amadeus.rb +110 -93
  25. data/lib/bcdice/game_system/AngelGear.rb +2 -2
  26. data/lib/bcdice/game_system/AnimaAnimus.rb +16 -9
  27. data/lib/bcdice/game_system/Arianrhod.rb +6 -8
  28. data/lib/bcdice/game_system/Avandner.rb +1 -1
  29. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  30. data/lib/bcdice/game_system/BattleTech.rb +109 -28
  31. data/lib/bcdice/game_system/BeastBindTrinity.rb +28 -12
  32. data/lib/bcdice/game_system/BeginningIdol.rb +5 -5
  33. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +5 -5
  34. data/lib/bcdice/game_system/BladeOfArcana.rb +1 -1
  35. data/lib/bcdice/game_system/BlindMythos.rb +39 -38
  36. data/lib/bcdice/game_system/BloodCrusade.rb +6 -7
  37. data/lib/bcdice/game_system/BloodMoon.rb +9 -8
  38. data/lib/bcdice/game_system/CardRanker.rb +8 -7
  39. data/lib/bcdice/game_system/ChaosFlare.rb +21 -15
  40. data/lib/bcdice/game_system/Chill.rb +10 -10
  41. data/lib/bcdice/game_system/Chill3.rb +9 -9
  42. data/lib/bcdice/game_system/CodeLayerd.rb +39 -39
  43. data/lib/bcdice/game_system/ColossalHunter.rb +34 -47
  44. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  45. data/lib/bcdice/game_system/Cthulhu.rb +1 -1
  46. data/lib/bcdice/game_system/Cthulhu7th.rb +48 -10
  47. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +2 -2
  48. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +2 -2
  49. data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +1 -1
  50. data/lib/bcdice/game_system/Cthulhu_Korean.rb +1 -1
  51. data/lib/bcdice/game_system/DarkBlaze.rb +0 -11
  52. data/lib/bcdice/game_system/DarkDaysDrive.rb +8 -7
  53. data/lib/bcdice/game_system/DeadlineHeroes.rb +11 -10
  54. data/lib/bcdice/game_system/DemonParasite.rb +5 -13
  55. data/lib/bcdice/game_system/DesperateRun.rb +1 -1
  56. data/lib/bcdice/game_system/DoubleCross.rb +3 -1
  57. data/lib/bcdice/game_system/Dracurouge.rb +1 -1
  58. data/lib/bcdice/game_system/EclipsePhase.rb +14 -14
  59. data/lib/bcdice/game_system/Elric.rb +18 -14
  60. data/lib/bcdice/game_system/Elysion.rb +1 -1
  61. data/lib/bcdice/game_system/EmbryoMachine.rb +9 -8
  62. data/lib/bcdice/game_system/Emoklore.rb +25 -20
  63. data/lib/bcdice/game_system/Fiasco.rb +1 -1
  64. data/lib/bcdice/game_system/FilledWith.rb +205 -1272
  65. data/lib/bcdice/game_system/FutariSousa.rb +12 -10
  66. data/lib/bcdice/game_system/GURPS.rb +17 -28
  67. data/lib/bcdice/game_system/Garako.rb +1 -1
  68. data/lib/bcdice/game_system/GardenOrder.rb +12 -7
  69. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  70. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  71. data/lib/bcdice/game_system/Gorilla.rb +2 -8
  72. data/lib/bcdice/game_system/GranCrest.rb +18 -11
  73. data/lib/bcdice/game_system/Gundog.rb +9 -8
  74. data/lib/bcdice/game_system/GundogRevised.rb +10 -9
  75. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  76. data/lib/bcdice/game_system/GurpsFW.rb +16 -16
  77. data/lib/bcdice/game_system/HarnMaster.rb +19 -26
  78. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
  79. data/lib/bcdice/game_system/Hieizan.rb +12 -21
  80. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  81. data/lib/bcdice/game_system/HuntersMoon.rb +5 -10
  82. data/lib/bcdice/game_system/InfiniteFantasia.rb +19 -17
  83. data/lib/bcdice/game_system/Insane.rb +13 -20
  84. data/lib/bcdice/game_system/IthaWenUa.rb +8 -15
  85. data/lib/bcdice/game_system/JamesBond.rb +10 -10
  86. data/lib/bcdice/game_system/JekyllAndHyde.rb +1 -1
  87. data/lib/bcdice/game_system/Kamigakari.rb +1 -1
  88. data/lib/bcdice/game_system/KanColle.rb +4 -9
  89. data/lib/bcdice/game_system/KemonoNoMori.rb +26 -39
  90. data/lib/bcdice/game_system/KillDeathBusiness.rb +7 -15
  91. data/lib/bcdice/game_system/KurayamiCrying.rb +141 -2
  92. data/lib/bcdice/game_system/LiveraDoll.rb +254 -304
  93. data/lib/bcdice/game_system/LogHorizon.rb +13 -10
  94. data/lib/bcdice/game_system/MagicaLogia_SimplifiedChinese.rb +66 -0
  95. data/lib/bcdice/game_system/MeikyuDays.rb +10 -8
  96. data/lib/bcdice/game_system/MeikyuKingdom.rb +26 -26
  97. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +5 -4
  98. data/lib/bcdice/game_system/MetalHead.rb +12 -22
  99. data/lib/bcdice/game_system/MetalHeadExtream.rb +5 -5
  100. data/lib/bcdice/game_system/MonotoneMuseum.rb +8 -6
  101. data/lib/bcdice/game_system/Nechronica.rb +63 -90
  102. data/lib/bcdice/game_system/NinjaSlayer.rb +6 -7
  103. data/lib/bcdice/game_system/NjslyrBattle.rb +8 -11
  104. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  105. data/lib/bcdice/game_system/Paradiso.rb +3 -3
  106. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  107. data/lib/bcdice/game_system/Peekaboo.rb +4 -9
  108. data/lib/bcdice/game_system/Pendragon.rb +7 -7
  109. data/lib/bcdice/game_system/PhantasmAdventure.rb +8 -8
  110. data/lib/bcdice/game_system/Postman.rb +1 -1
  111. data/lib/bcdice/game_system/PulpCthulhu.rb +1 -1
  112. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  113. data/lib/bcdice/game_system/Revulture.rb +123 -0
  114. data/lib/bcdice/game_system/RuneQuest.rb +8 -8
  115. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  116. data/lib/bcdice/game_system/SRS.rb +17 -16
  117. data/lib/bcdice/game_system/SamsaraBallad.rb +38 -11
  118. data/lib/bcdice/game_system/Satasupe.rb +32 -32
  119. data/lib/bcdice/game_system/ScreamHighSchool.rb +5 -5
  120. data/lib/bcdice/game_system/SharedFantasia.rb +19 -23
  121. data/lib/bcdice/game_system/ShinobiGami.rb +14 -6
  122. data/lib/bcdice/game_system/Skynauts.rb +103 -142
  123. data/lib/bcdice/game_system/SkynautsBouken.rb +228 -0
  124. data/lib/bcdice/game_system/StarryDolls.rb +318 -0
  125. data/lib/bcdice/game_system/SteamPunkers.rb +11 -6
  126. data/lib/bcdice/game_system/StellarKnights.rb +85 -706
  127. data/lib/bcdice/game_system/StellarKnights_Korean.rb +79 -0
  128. data/lib/bcdice/game_system/SterileLife.rb +2 -3
  129. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +1 -1
  130. data/lib/bcdice/game_system/StratoShout.rb +8 -16
  131. data/lib/bcdice/game_system/Strave.rb +1 -1
  132. data/lib/bcdice/game_system/SwordWorld.rb +16 -7
  133. data/lib/bcdice/game_system/SwordWorld2_0.rb +2 -2
  134. data/lib/bcdice/game_system/SwordWorld2_5.rb +2 -2
  135. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  136. data/lib/bcdice/game_system/TokumeiTenkousei.rb +4 -3
  137. data/lib/bcdice/game_system/TokyoGhostResearch.rb +1 -1
  138. data/lib/bcdice/game_system/TrinitySeven.rb +279 -280
  139. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  140. data/lib/bcdice/game_system/Utakaze.rb +53 -48
  141. data/lib/bcdice/game_system/Villaciel.rb +1 -1
  142. data/lib/bcdice/game_system/WARPS.rb +11 -9
  143. data/lib/bcdice/game_system/WaresBlade.rb +4 -9
  144. data/lib/bcdice/game_system/Warhammer.rb +15 -6
  145. data/lib/bcdice/game_system/Warhammer4.rb +15 -11
  146. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  147. data/lib/bcdice/game_system/YankeeYogSothoth.rb +4 -9
  148. data/lib/bcdice/game_system/Yggdrasill.rb +1 -1
  149. data/lib/bcdice/game_system/ZettaiReido.rb +20 -25
  150. data/lib/bcdice/game_system/filled_with/enemy_data_tables.rb +322 -0
  151. data/lib/bcdice/game_system/filled_with/event_tables.rb +392 -0
  152. data/lib/bcdice/game_system/filled_with/tresure_tables.rb +179 -0
  153. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +1 -1
  154. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +4 -4
  155. data/lib/bcdice/game_system/sword_world/rating_parser.rb +1 -1
  156. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +26 -8
  157. data/lib/bcdice/repl.rb +1 -1
  158. data/lib/bcdice/result.rb +26 -0
  159. data/lib/bcdice/version.rb +1 -1
  160. metadata +18 -4
@@ -699,7 +699,7 @@ module BCDice
699
699
  ),
700
700
  }.freeze
701
701
 
702
- register_prefix('R([A-DS]|\d+)', TABLES.keys)
702
+ register_prefix('R[A-DS]?', TABLES.keys)
703
703
  end
704
704
  end
705
705
  end
@@ -16,31 +16,22 @@ module BCDice
16
16
  HELP_MESSAGE = "大成功、自動成功、失敗、自動失敗、大失敗の自動判定を行います。\n"
17
17
 
18
18
  # ゲーム別成功度判定(1d100)
19
- def check_1D100(total, _dice_total, _cmp_op, target)
20
- return '' if target == '?'
19
+ def result_1d100(total, _dice_total, cmp_op, target)
20
+ return Result.nothing if target == '?'
21
+ return nil unless cmp_op == :<=
21
22
 
22
- if total <= 1
23
- # 1は自動成功
24
- if total <= (target / 5)
25
- " > 大成功"
26
- else
27
- " > 自動成功"
28
- end
29
- elsif total >= 100
30
- # 00は大失敗(大失敗は自動失敗でもある)
31
- " > 大失敗"
23
+ if total >= 100
24
+ Result.fumble("大失敗")
32
25
  elsif total >= 96
33
- # 96-00は自動失敗
34
- " 自動失敗"
26
+ Result.failure("自動失敗")
27
+ elsif total <= (target / 5)
28
+ Result.critical("大成功")
29
+ elsif total <= 1
30
+ Result.success("自動成功")
35
31
  elsif total <= target
36
- if total <= (target / 5)
37
- # 目標値の1/5以下は大成功
38
- " > 大成功"
39
- else
40
- " > 成功"
41
- end
32
+ Result.success("成功")
42
33
  else
43
- "失敗"
34
+ Result.failure("失敗")
44
35
  end
45
36
  end
46
37
  end
@@ -31,7 +31,7 @@ module BCDice
31
31
  例)Hourai : 仁義八徳は、【義】(奇数、奇数、偶数)
32
32
  INFO_MESSAGE_TEXT
33
33
 
34
- register_prefix('ROL', 'MED\(\d+,\d+\)', 'RES\(\d+,\d+\)', 'INY', 'HTK', 'GOG')
34
+ register_prefix('ROL', 'MED', 'RES', 'INY', 'HTK', 'GOG')
35
35
 
36
36
  # ゲームの名前
37
37
  # チャット欄表示名
@@ -47,18 +47,13 @@ module BCDice
47
47
  end
48
48
 
49
49
  # ゲーム別成功度判定(2D6)
50
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
51
- return '' if target == '?'
52
- return '' unless cmp_op == :>=
50
+ def result_2d6(_total, dice_total, _dice_list, cmp_op, _target)
51
+ return nil unless cmp_op == :>=
53
52
 
54
53
  if dice_total <= 2
55
- "ファンブル(モノビースト追加行動+1)"
54
+ Result.fumble("ファンブル(モノビースト追加行動+1)")
56
55
  elsif dice_total >= 12
57
- "スペシャル(変調1つ回復orダメージ+1D6)"
58
- elsif total >= target
59
- " > 成功"
60
- else
61
- " > 失敗"
56
+ Result.critical("スペシャル(変調1つ回復orダメージ+1D6)")
62
57
  end
63
58
  end
64
59
 
@@ -403,7 +398,7 @@ module BCDice
403
398
  ),
404
399
  }.freeze
405
400
 
406
- register_prefix(RTT.prefixes, 'SA2?T\d*', TABLES.keys)
401
+ register_prefix(RTT.prefixes, 'SA', TABLES.keys)
407
402
  end
408
403
  end
409
404
  end
@@ -13,38 +13,40 @@ module BCDice
13
13
  SORT_KEY = 'むけんのふあんたしあ'
14
14
 
15
15
  # ダイスボットの使い方
16
- HELP_MESSAGE = "失敗、成功レベルの自動判定を行います。\n"
16
+ HELP_MESSAGE = "失敗、成功レベルの自動判定を行います。"
17
17
 
18
18
  # ゲーム別成功度判定(1d20)
19
- def check_1D20(total, _dice_total, cmp_op, target)
20
- return '' if target == '?'
19
+ def result_1d20(total, _dice_total, cmp_op, target)
20
+ return Result.nothing if target == '?'
21
+ return nil unless cmp_op == :<=
21
22
 
22
- if cmp_op != :<=
23
- return ''
24
- elsif total > target
25
- return " > 失敗"
23
+ if total > target
24
+ return Result.failure("失敗")
26
25
  end
27
26
 
28
27
  output =
29
28
  if total <= (target / 32)
30
- "32レベル成功(32Lv+)"
29
+ "32レベル成功(32Lv+)"
31
30
  elsif total <= (target / 16)
32
- "16レベル成功(16LV+)"
31
+ "16レベル成功(16Lv+)"
33
32
  elsif total <= (target / 8)
34
- "8レベル成功"
33
+ "8レベル成功"
35
34
  elsif total <= (target / 4)
36
- "4レベル成功"
35
+ "4レベル成功"
37
36
  elsif total <= (target / 2)
38
- "2レベル成功"
37
+ "2レベル成功"
39
38
  else
40
- "1レベル成功"
39
+ "1レベル成功"
41
40
  end
42
41
 
43
- if total <= 1
44
- output += "/クリティカル"
42
+ Result.new.tap do |r|
43
+ r.text = output
44
+ r.success = true
45
+ if total <= 1
46
+ r.critical = true
47
+ r.text += "/クリティカル"
48
+ end
45
49
  end
46
-
47
- output
48
50
  end
49
51
  end
50
52
  end
@@ -46,27 +46,20 @@ module BCDice
46
46
  end
47
47
 
48
48
  # ゲーム別成功度判定(2D6)
49
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
50
- return '' unless cmp_op == :>=
51
-
52
- result =
53
- if dice_total <= 2
54
- translate("Insane.fumble")
55
- elsif dice_total >= 12
56
- translate("Insane.special")
57
- elsif target == "?"
58
- ""
59
- elsif total >= target
60
- translate("success")
61
- else
62
- translate("failure")
63
- end
64
-
65
- if result.empty?
66
- return ""
49
+ def result_2d6(total, dice_total, _dice_list, cmp_op, target)
50
+ return nil unless cmp_op == :>=
51
+
52
+ if dice_total <= 2
53
+ Result.fumble(translate("Insane.fumble"))
54
+ elsif dice_total >= 12
55
+ Result.critical(translate("Insane.special"))
56
+ elsif target == "?"
57
+ Result.nothing
58
+ elsif total >= target
59
+ Result.success(translate("success"))
60
+ else
61
+ Result.failure(translate("failure"))
67
62
  end
68
-
69
- return " > #{result}"
70
63
  end
71
64
 
72
65
  def eval_game_system_specific_command(command)
@@ -15,22 +15,15 @@ module BCDice
15
15
  # ダイスボットの使い方
16
16
  HELP_MESSAGE = "1D100<=m 方式の判定で成否、クリティカル(01)・ファンブル(00)を自動判定します。\n"
17
17
 
18
- def check_1D100(total, _dice_total, cmp_op, target)
19
- return '' if target == '?'
20
- return '' unless cmp_op == :<=
18
+ def result_1d100(total, _dice_total, cmp_op, target)
19
+ return nil unless cmp_op == :<=
21
20
 
22
- diceValue = total % 100
23
- dice0 = diceValue / 10 # 10の位を代入
24
- dice1 = diceValue % 10 # 1の位を代入
25
-
26
- if (dice0 == 0) && (dice1 == 1)
27
- ' > 01 > クリティカル'
28
- elsif (dice0 == 0) && (dice1 == 0)
29
- ' > 00 > ファンブル'
30
- elsif total <= target
31
- ' > 成功'
32
- else
33
- ' > 失敗'
21
+ if total % 100 == 1
22
+ Result.critical("01 クリティカル")
23
+ elsif total % 100 == 0
24
+ Result.fumble("00 > ファンブル")
25
+ elsif target == "?"
26
+ Result.nothing
34
27
  end
35
28
  end
36
29
  end
@@ -16,28 +16,28 @@ module BCDice
16
16
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
17
  ・1D100の目標値判定で、効果レーティングを1~4で自動判定。
18
18
   例)1D100<=50
19
-    JamesBond : (1D100<=50) 20 効果3(良)
19
+    JamesBond : (1D100<=50) 20 効果3(良)
20
20
  INFO_MESSAGE_TEXT
21
21
 
22
- def check_1D100(total, _dice_total, cmp_op, target) # ゲーム別成功度判定(1d100)
23
- return '' if target == '?'
24
- return '' unless cmp_op == :<=
22
+ def result_1d100(total, _dice_total, cmp_op, target) # ゲーム別成功度判定(1d100)
23
+ return Result.nothing if target == '?'
24
+ return nil unless cmp_op == :<=
25
25
 
26
26
  base = ((target + 9) / 10).floor
27
27
 
28
28
  if total >= 100
29
29
  # 100は常に失敗
30
- "失敗"
30
+ Result.failure("失敗")
31
31
  elsif total <= base
32
- "効果1(完璧)"
32
+ Result.success("効果1(完璧)")
33
33
  elsif total <= base * 2
34
- "効果2(かなり良い)"
34
+ Result.success("効果2(かなり良い)")
35
35
  elsif total <= base * 5
36
- "効果3(良)"
36
+ Result.success("効果3(良)")
37
37
  elsif total <= target
38
- "効果4(まあまあ)"
38
+ Result.success("効果4(まあまあ)")
39
39
  else
40
- "失敗"
40
+ Result.failure("失敗")
41
41
  end
42
42
  end
43
43
  end
@@ -36,7 +36,7 @@ module BCDice
36
36
  )
37
37
  }.freeze
38
38
 
39
- register_prefix('RC\d+', 'DDC', TABLES.keys)
39
+ register_prefix('RC', 'DDC', TABLES.keys)
40
40
  end
41
41
  end
42
42
  end
@@ -193,7 +193,7 @@ module BCDice
193
193
 
194
194
  TABLES = translate_tables(:ja_jp)
195
195
 
196
- register_prefix('MT(\d*)', TABLES.keys)
196
+ register_prefix('MT', TABLES.keys)
197
197
  end
198
198
  end
199
199
  end
@@ -53,18 +53,13 @@ module BCDice
53
53
  @d66_sort_type = D66SortType::ASC
54
54
  end
55
55
 
56
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
57
- return '' if target == '?'
58
- return '' unless cmp_op == :>=
56
+ def result_2d6(_total, dice_total, _dice_list, cmp_op, _target)
57
+ return nil unless cmp_op == :>=
59
58
 
60
59
  if dice_total <= 2
61
- "ファンブル(判定失敗。アクシデント表を自分のPCに適用)"
60
+ Result.fumble("ファンブル(判定失敗。アクシデント表を自分のPCに適用)")
62
61
  elsif dice_total >= 12
63
- "スペシャル(判定成功。【行動力】が1D6点回復)"
64
- elsif total >= target
65
- " > 成功"
66
- else
67
- " > 失敗"
62
+ Result.critical("スペシャル(判定成功。【行動力】が1D6点回復)")
68
63
  end
69
64
  end
70
65
 
@@ -42,25 +42,18 @@ module BCDice
42
42
 
43
43
  def eval_game_system_specific_command(command)
44
44
  case command
45
- when /KA\d[-+\d]*/
46
- return check_1D12(command, true)
47
- when /KC\d[-+\d]*/
48
- return check_1D12(command, false)
49
- when 'CTR'
50
- return getTrapResult()
51
- when 'EET'
52
- return getEscapeExperienceTableResult(command)
53
- else
54
- return roll_tables(command, TABLES)
45
+ when /KA\d[-+\d]*/ then check_1D12(command, true)
46
+ when /KC\d[-+\d]*/ then check_1D12(command, false)
47
+ when 'CTR' then get_trap_result()
48
+ when 'EET' then get_escape_experience_table_result(command)
49
+ else roll_tables(command, TABLES)
55
50
  end
56
51
  end
57
52
 
58
53
  def check_1D12(command, is_action_judge)
59
54
  debug('獸ノ森の1d12判定')
60
55
  m = /K[AC](\d[-+\d]*)/.match(command)
61
- unless m
62
- return ''
63
- end
56
+ return nil unless m
64
57
 
65
58
  # 修正込みの目標値を計算
66
59
  target_total = ArithmeticEvaluator.eval(m[1])
@@ -74,41 +67,35 @@ module BCDice
74
67
  debug('dice_total, target_total, success_degree = ', dice_total, target_total, success_degree)
75
68
 
76
69
  if dice_total == 12
77
- return "(1D12<=#{target_total}) > #{dice_total} > 大失敗"
70
+ Result.fumble("(1D12<=#{target_total}) > #{dice_total} > 大失敗")
78
71
  elsif dice_total == 11
79
- return "(1D12<=#{target_total}) > #{dice_total} > 大成功(成功度+#{success_degree}, 次の継続判定の目標値を10に変更)"
72
+ Result.critical("(1D12<=#{target_total}) > #{dice_total} > 大成功(成功度+#{success_degree}, 次の継続判定の目標値を10に変更)")
80
73
  elsif dice_total <= target_total
81
- return "(1D12<=#{target_total}) > #{dice_total} > 成功(成功度+#{success_degree})"
74
+ Result.success("(1D12<=#{target_total}) > #{dice_total} > 成功(成功度+#{success_degree})")
82
75
  else
83
- return "(1D12<=#{target_total}) > #{dice_total} > 失敗"
76
+ Result.failure("(1D12<=#{target_total}) > #{dice_total} > 失敗")
84
77
  end
85
78
  end
86
79
 
87
- def getTrapResult()
88
- trapCheckNumber = @randomizer.roll_once(12)
89
-
90
- # 12が出た場合のみ罠が動作する
91
- if trapCheckNumber == 12
92
- chaseNumber = @randomizer.roll_once(12)
93
- chase = nil
94
- case chaseNumber
95
- when 1, 2, 3, 4
96
- chase = '小型動物'
97
- when 5, 6, 7, 8
98
- chase = '大型動物'
99
- when 9, 10, 11, 12
100
- chase = '人間の放浪者'
101
- end
102
- return "罠動作チェック(1D12) > #{trapCheckNumber} > 罠が動作していた! > 獲物表(#{chaseNumber}) > #{chase}が罠にかかっていた"
80
+ def get_trap_result()
81
+ tra_check_num = @randomizer.roll_once(12)
82
+ unless tra_check_num == 12
83
+ return Result.new("罠動作チェック(1D12) > #{tra_check_num} > 罠は動作していなかった")
103
84
  end
104
85
 
105
- return "罠動作チェック(1D12) > #{trapCheckNumber} > 罠は動作していなかった"
86
+ chase_num = @randomizer.roll_once(12)
87
+ chase = case chase_num
88
+ when 1, 2, 3, 4 then '小型動物'
89
+ when 5, 6, 7, 8 then '大型動物'
90
+ when 9, 10, 11, 12 then '人間の放浪者'
91
+ end
92
+ Result.new("罠動作チェック(1D12) > #{tra_check_num} > 罠が動作していた! > 獲物表(#{chase_num}) > #{chase}が罠にかかっていた")
106
93
  end
107
94
 
108
- def getEscapeExperienceTableResult(command)
109
- escapeExperience = roll_tables(command, TABLES)
110
- escapeDuration = @randomizer.roll_once(12)
111
- return "#{escapeExperience} (再登場: #{escapeDuration}時間後)"
95
+ def get_escape_experience_table_result(command)
96
+ escape_experience = roll_tables(command, TABLES)
97
+ escape_duration = @randomizer.roll_once(12)
98
+ Result.new("#{escape_experience} (再登場: #{escape_duration}時間後)")
112
99
  end
113
100
 
114
101
  TABLES = {
@@ -252,7 +239,7 @@ module BCDice
252
239
  ),
253
240
  }.freeze
254
241
 
255
- register_prefix('K[AC]\d[-+\d]*', 'CTR', TABLES.keys)
242
+ register_prefix('K[AC]', 'CTR', TABLES.keys)
256
243
  end
257
244
  end
258
245
  end
@@ -49,22 +49,14 @@ module BCDice
49
49
  end
50
50
 
51
51
  # ゲーム別成功度判定(2D6)
52
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
53
- return '' if target == '?'
54
- return '' unless cmp_op == :>=
55
-
56
- result =
57
- if dice_total <= 2
58
- translate("KillDeathBusiness.fumble")
59
- elsif dice_total >= 12
60
- translate("KillDeathBusiness.special")
61
- elsif total >= target
62
- translate("success")
63
- else
64
- translate("failure")
65
- end
52
+ def result_2d6(_total, dice_total, _dice_list, cmp_op, _target)
53
+ return nil unless cmp_op == :>=
66
54
 
67
- return " #{result}"
55
+ if dice_total <= 2
56
+ Result.fumble(translate("KillDeathBusiness.fumble"))
57
+ elsif dice_total >= 12
58
+ Result.critical(translate("KillDeathBusiness.special"))
59
+ end
68
60
  end
69
61
 
70
62
  def eval_game_system_specific_command(command)
@@ -13,7 +13,18 @@ module BCDice
13
13
  SORT_KEY = 'くらやみくらいん'
14
14
 
15
15
  # ダイスボットの使い方
16
- HELP_MESSAGE = "・アクシデント表(ACT)\n"
16
+ HELP_MESSAGE = <<~TEXT
17
+ ・アクシデント表(ACT)
18
+ ・感情表(EMO)
19
+ ・幕間シーン表(情景)(SST)
20
+ ・幕間シーン表(関係)(SRT)
21
+ ■ ヨイヤミメビウス
22
+ ・大事故イベント表1 日常と正気の破壊(SAE1)
23
+ ・大事故イベント表2 アメリカンB級ホラー(SAE2)
24
+ ・大事故イベント表3 牙をむく異世界(SAE3)
25
+ ・大事故イベント表4 悪意のおとぎ話(SAE4)
26
+ ・大事故イベント表5 悲劇の運命(SAE5)
27
+ TEXT
17
28
 
18
29
  def eval_game_system_specific_command(command)
19
30
  if (m = /^ACT(\d+)$/i.match(command))
@@ -41,9 +52,137 @@ module BCDice
41
52
  "まるで自分を支える何かが失われたように、あなたはその場に立ち尽くす。諦めと絶望が心を支配する。ああ、そうか。これが、「心が折れる」ということか……。あなたは「理性」を4点失う。"
42
53
  ]
43
54
  ),
55
+ "EMO" => DiceTable::Table.new(
56
+ "感情表",
57
+ "1D10",
58
+ [
59
+ "(正)信頼/(負)依存",
60
+ "(正)安心/(負)不安",
61
+ "(正)友情/(負)憤怒",
62
+ "(正)尊敬/(負)恐怖",
63
+ "(正)愛情/(負)嫉妬",
64
+ "(正)共感/(負)否定",
65
+ "(正)忠誠/(負)侮蔑",
66
+ "(正)憧憬/(負)劣等感",
67
+ "(正)性愛/(負)拒絶",
68
+ "(正)狂信/(負)殺意",
69
+ ]
70
+ ),
71
+ "SST" => DiceTable::Table.new(
72
+ "幕間シーン表(情景)",
73
+ "1D10",
74
+ [
75
+ "先が見えない闇の中を、あなたは手探りに進んでいる。暗がりに入り込んでしまったのか、それとも辺りの光が消えたのか———その時、あなたの眼前に、闇から溶け出すように何者かの姿が現れた。",
76
+ "夢を見ていた。かつてあった出来事が、目の前で繰り返される……ハッと気が付き、現実に戻る。心配そうにあなたを覗き込む顔を見て、再び夢の光景がフラッシュバックする。この人、あの時の……!",
77
+ "気が付くと見知らぬ場所を1人歩いている。迷ってしまったのだろうか。辺りを見回していた、その時———あなたは背後に気配を感じた。いつの間にか誰か立っている……!",
78
+ "「危ない!」突然上がった声と同時に、あなたは突き飛ばされ、床を転がった。次の瞬間、不気味で巨大な何かがあなたの頭をかすめてゆく……。あなたは身を起こし、あなたと一緒に倒れ込んだ人物に声をかけた。",
79
+ "不気味な声を上げながら、何かがゆっくりと近づいてくる。あなたが咄嗟に身を隠した場所には、すでに誰かいた。このまま息を殺し、一緒に危険が過ぎ去るのを待つしかない。",
80
+ "むせかえるような臭いが辺りに満ちている。これは血の臭いだろうか。いや、それにしては……。すると、あなたの近くで、誰かが小さく咳き込んだ……",
81
+ "一息つけそうな場所を見つけ、あなたは座りこんだ。不気味なことに巻き込まれているとは思えない、穏やかな時間が流れる。ふと、あなたは隣りに座っている人物に話しかけた。",
82
+ "静寂の中、あなたを呼ぶ声が響く。声の主に対し、あなたは思う。望むところだ。自分の方こそ、確認しなければならないことがある———!あなたは足早に、声のする方へと進んだ。",
83
+ "高い場所に立ち、あなたは異常な世界を見下ろしている。その時、後ろで誰かが地面を踏む音がした。来たか……予想通り、ここでなら会うことができた。あなたは振り返り、相手を見た。",
84
+ "周囲を確認し、あなたは相手に合図を送る。足音静かに、相手があなたの元へと駆け寄る。———他の気配はない。慎重に、密やかに、あなたは相手と話し始めた。",
85
+ ]
86
+ ),
87
+ "SRT" => DiceTable::Table.new(
88
+ "幕間シーン表(関係)",
89
+ "1D10",
90
+ [
91
+ "微かな香り。ちょっとした仕事。横顔。あの人のすべてが、あなたの胸を高鳴らせる———こんな気持ちは、初めてだ。",
92
+ "頭の中にノイズが走る。あなたは、たしかに、あの人とあったことがある。けれど、詳しく思い出そうとするたびに頭痛が走る……この記憶、確かめなければ。",
93
+ "異常な事態だというのに……いや、異常な事態だからこそ、あの人はあなたに安心感を与えてくれる、とにかく話がしたい。今はまず、あの人を探そう。",
94
+ "今あなたに必要なのは「捨て駒」だ。そう、ピッタリの奴がいるじゃないか!誰を犠牲にしても生き残ってやる。そのためには……。あなたは、あの人の方へと歩み寄った。",
95
+ "こんな時でも、どこか気の合う相手というのは見つかるものだ———安堵するような、弾むような気持ちで、あなたはその人に声をかけた。さぁ、共闘といこうじゃないか。",
96
+ "なんでよりによってこんなヤツと……!?図らずも二人きりになってしまった相手に、あなたは眉をひそめた。会話はない。そもそもこいつが安全かわからない……誰か助けて!",
97
+ "特に理由はない。けれど、一緒に行動すること自体は大事でしょう?仕方ないじゃないか、怖いんだから……!あなたは、いそいそと手近な人間へと寄って行った。",
98
+ "不意に昔のこと———二度と取り戻せない過ちが頭をよぎる。そんなことを思い出したのも、あの人の面影を、あの顔に感じてしまうせいだ。別人とはわかっている。けれど、今度こそ———。",
99
+ "あなたは影に隠れ、その人物を見張っている。怪しい……この人こそが、事件の元凶じゃないか?とはいえ、このままではじり貧だ。あなたは意を決し、影から飛び出して話をかけた。",
100
+ "間違いない……!あなたはその人物をにらみつけた。何という幸運だろう。追い求めた相手が、すぐそこにいるなんて!あなたは荒れ狂う胸の内を気取られぬよう、ゆっくりと近づいた。",
101
+ ]
102
+ ),
103
+ "SAE1" => DiceTable::Table.new(
104
+ "大事故イベント表1 日常と正気の破壊",
105
+ "1D10",
106
+ [
107
+ "非日常に慣れてしまう自分が恐ろしい。心が恐怖を感じなくなってきたみたいだ……。セッション終了まで【精神】が2点減少する。",
108
+ "最悪の展開を予測する。死よりも恐ろしいことになるのは明白だ。あなたは理性を2点失う。",
109
+ "被害者の成れの果てを目撃し、絶望する。いやだ、こんな風になりたくない……!あなたは次に判定をする際、目標値が2点増加する。",
110
+ "日常の記憶が恐怖に支配されてゆく。友人も、家族も、家も街も、きっと呑み込まれてしまうんだ……。セッション終了まで「継続的なツナガリ」を1つ失う。「継続的なツナガリ」がない場合は理性を2点失う。",
111
+ "異世界の謎を解き明かす手掛かりを見つける。読み解くのはあまりに難解だが……人であることをやめれば、あるいは。理性を2点失い『真相』を1枚確認する。『真相』がない、あるいは確認できない状況である場合はダイスを振りなおす。",
112
+ "体の色が変わり、力が入らなくなってゆく……元に戻れないのでは、と思いゾッとする。セッション終了まで【肉体】が2点減少する。",
113
+ "異世界に染まる──なぜ、これほど簡単な逃げ道に気付かなかったのだろう。あなたは即座に発狂する。既に発狂していた場合は理性を2点失う。",
114
+ "この世界の背後にある物語、あるいは、破滅者に同情してしまう。戦わねばならない時、こぶしをふるうことはできるだろうか……。戦闘時、あなたの最初のラウンドでの行動のみ進行役が決定する。",
115
+ "侵蝕は思った以上に深刻だ。自分とは、何だったか。自分は本当に自分なのか……。セッション終了まで【頭脳】が2点減少する。",
116
+ "勘違いしていた。あいつも、こいつも、みんな敵だ。自分を陥れようとしているんだ……!セッション終了まで「援護」をすることができなくなる(この状態は「失調」として扱う)。",
117
+ ]
118
+ ),
119
+ "SAE2" => DiceTable::Table.new(
120
+ "大事故イベント表2 アメリカンB級ホラー",
121
+ "1D10",
122
+ [
123
+ "諦めかけたその時、過去に戦ったあいつらが俺の拳に乗り移る。お前ら……力を貸してくれ!以降、一度だけ自分の攻撃に〔ダイス2つ分〕点の追加ダメージを得る。「過去に戦ったあいつら」は好きに捏造してよい。",
124
+ "運命の人に出会う。こんなところでなければ、もっと幸せだったのに。あなたはツナガリを獲得する。対象は他の主人公や登場人物でも、今回のセッションに登場していないキャラクターでも構わない。また、破滅判定において目標値が2点減少する。",
125
+ "死んだと思っていたあいつが生きて帰ってきた。これは奇跡だ!あなたはツナガリを獲得する。対象はセッションに登場していないキャラクターにする。また、あなたは戦闘中、常に2点の追加ダメージを得る。",
126
+ "唐突に銃撃戦が始まった!!!Wow!!あなたに流れ弾が直撃し、4点のダメージを受ける。ただし、それっぽいアメリカンな演技で無事を主張できれば、このダメージをなかったことにできる。",
127
+ "何故かはわからないが、あなたが行動するたびに、どこからかアメリカンなリアクションが聞こえてくる。どうにも、集中力がそがれる……セッション終了まで、全ての判定の目標値が1点増加する(破滅判定を除く)。この効果は重複する。",
128
+ "唐突に、ポップな曲が辺り一帯に流れる。これは一体?主人公は全員、次に判定を行う際、アメリカンな行動をとった場合に目標値が1点増加する(破滅判定の場合は1点減少する)。アメリカンかどうかの判断は進行役に委ねられる。なお、曲に乗って踊りながら行動する演出にした場合は、判定の目標値がさらに1点増加する。",
129
+ "些細なことが気になり、他の主人公に対し声を荒げてしまう。そんなことをしてもどうにもならないと、わかっているのに……。あなたがツナガリを獲得している主人公を一人選び、相手とのツナガリを失う。ただし、ハグして仲直りする演出を行うなら、ツナガリを消さなくともよい。",
130
+ "要するに全部やっつけちまえばいい、そういう事だろ?脳内で声がする。そうだ、銃は全てを解決する!ダイスを1つ振り、出た目の数だけ「武器」を獲得する。ただし同じ数だけ、破滅判定の際の目標値が増加する。",
131
+ "気が付くと、顔や体格が変化している!㈰イケメン ㈪ブロンド ㈫タフガイ ㈬ブレインのどれかを選択する。㈰は全ての能力値が1点増加する。㈪は【精神】、㈫は【肉体】、㈬は【頭脳】が2点増加する。ただし㈰〜㈬は全て、破滅判定の目標値が2点増加する。",
132
+ "最後の一言を言い残し、あなたのキャラクターは絶命する。全米が号泣する感動のシーンだ。あなたは進行役が許可する範囲で、あなたの主人公の最期を自由に演出する。ただし、主人公は異世界の影響ですぐに復活する。侵蝕を〔ダイス2つ分〕点増加させる(最大10点)。",
133
+ ]
134
+ ),
135
+ "SAE3" => DiceTable::Table.new(
136
+ "大事故イベント表3 牙をむく異世界",
137
+ "1D10",
138
+ [
139
+ "異世界からの侵蝕の影響か、あなたの姿が乳児になり、全ての「能力値」を「失調」する(いずれかの「能力値」が「復調」した場合、姿は元に戻る)。",
140
+ "こんなところにいられるか!こいつらといたら命がいくつあっても足りない!あなたは、一人になろうとする。次の「選択」の結果、あなたが一人になることができなかった場合、あなたの理性は半分になる。(端数切り上げ)",
141
+ "何かはわからないが、あなたはこの異世界の住人の逆鱗に触れてしまったようだ。あなたに対して、誰かが「負の感情」で「ツナガリ」を結ぶ(誰が結ぶかは進行役が決定すること)。",
142
+ "運に見放された?主人公全員の「確保」しているダイスを捨て、新たに全員が「10」の目のダイスを「確保」する。",
143
+ "セッション終了まで、あなたが外来語を口にするたびに、あなたの主人公の「侵蝕」が1点増加する。",
144
+ "あなたには、周囲の人間全てがおぞましい怪物に見える。以降セッション終了まで、他の主人公が同じ場面にいる場合、判定に使用するダイスが一個減少する。",
145
+ "あなたの外見がおぞましい怪物へと変化する。こんな姿では、人とかかわることができない!他の主人公があなたに結んでいる「ツナガリ」がすべて失われる(「継続的なツナガリ」を除く)。",
146
+ "主人公全員の外見が、いずれかの主人公と同じになる。次の「選択」が行われるまで(戦闘中であればそのラウンドが終了するまで)全ての能力値がその主人公の数値と同じになる。進行役は、どの主人公の姿に変化するか決定すること。",
147
+ "主人公たちは、お互いの姿を見ることができなくなる。次の「選択」が行われるまで(戦闘中であればそのラウンドが終了するまで)主人公は全員、自分以外の主人公にアイテムを使用することができなくなる。",
148
+ "あなたの姿が老人になる。全ての能力値が4点減少し、また全ての「ツナガリ」を忘れてしまう(「ツナガリ」は消えないが「援護」や感情の変更を行うことができなくなる)。この状態は「失調」として扱い「薬」や「治療」の効果により元に戻る。また新たな「ツナガリ」を獲得した場合も姿は元に戻る。",
149
+ ]
150
+ ),
151
+ "SAE4" => DiceTable::Table.new(
152
+ "大事故イベント表4 悪意のおとぎ話",
153
+ "1D10",
154
+ [
155
+ "何か尖ったものに触れてしまった。途端に、あなたは強烈な眠気に襲われた……。あなたが次に幕間作成を行う場合「休憩」(『トコヤミメイズ』P74)しか選ぶことができない。",
156
+ "誰かが倒れ、息絶えている……いや、あれは自分だ。自分自身の、未来の姿なのか……?あなたが平静状態であれば発狂する。すでに発狂していれば侵蝕が4点増加する。",
157
+ "突然の爆音。あなたの脇を、スポーツカーがドリフトしながら駆け抜けてゆく。なにあれかっこいい!「穢れ:最後の執着」(『クラヤミクライン』P180)の効果をあなたに適用する。",
158
+ "別の異世界から来たという情報屋に出会う。情報屋は、今回の怪異のレベルを教え、どこかへと去る。侵蝕が4点増加する。",
159
+ "狐の嫁入り行列が目の前を遮る。狐は主人公たちに、毛皮をモフモフさせてくれる。幸せだ!……が、気が付くと、ふところが軽くなっている。主人公は全員、アイテムをランダムに一つ失う。",
160
+ "怪異(または破滅者)がシレッと横にいる。あなたの見たもの聞いたもの触れたものに興味があるようだ。今回登場する怪異(または破滅者)の存在点が〔ダイス1つ分〕増加する。",
161
+ "ボロボロの日記帳が、開かれた状態で落ちている。すると、日記帳に「ヤブッタページヲカエシテ!」と文字が浮かび上がった。あなたはアイテム「運命の日記」(『トコヤミメイズ』P73)を入手する。代わりに、破滅判定時、自分に向けられている「負の感情」一つにつき侵蝕が4点増加する。",
162
+ "エイリアンにアブダクションされる。あなたは突然、このシーンから消え去る。以降、幕間で「メイン」として指定されるか「終章」に入るまでゲームに登場することができない。なお、再登場した際は呆けた表情で戻ってくる。",
163
+ "悪魔と契約をしてしまった。以降、あなたは判定で出した「10」のダイス目をいくつでも「確保」できる。ただし「確保」した「10」のダイス目は「1」との相殺以外で消すことができない。",
164
+ "あなたは足元に現れた泉に落ちる。泉からはい上がると、あなたの頭の中に3人のあなたがいる。頭の中がうるさくて落ち着かない!以後、判定の際にダイスを一つ追加し、最も低い出目の一つはなかったことにする。",
165
+ ]
166
+ ),
167
+ "SAE5" => DiceTable::Table.new(
168
+ "大事故イベント表5 悲劇の運命",
169
+ "1D10",
170
+ [
171
+ "シナリオに直接関係ないが、あなたの家が燃える。",
172
+ "シナリオに直接関係ないが、あなたの口座残高が0になる。クレジットカードも使用不可能になる。",
173
+ "シナリオに直接関係ないが、会社から解雇される。自身が会社員ではない場合は経営している店や実家が倒産したり、持っている株が暴落したりする。",
174
+ "シナリオに直接関係ないが、あなたの親の訃報、もしくは大切な何かが喪失した連絡を受ける。本当かどうかは、現実に生還するまでわからない。",
175
+ "シナリオに直接関係ないが、あなたは突然〔ダイス2つ分〕歳を取る(能力値に変動は発生しない)。",
176
+ "シナリオに直接関係ないが、あなたが原因で大事故、もしくは大災害が発生する。損害賠償で数億〜数十億程度の借金を負う。",
177
+ "シナリオに直接関係ないが、病魔により余命幾ばくも無いことを悟ってしまう。",
178
+ "シナリオに直接関係ないが、あなたはSNSで大炎上する。マスコミにも実名報道され、今後大変な生活を送ることになる。",
179
+ "シナリオに直接関係ないが、この場で突然子供が誕生する。主人公役は名前や性別を決めること。なお、何らかの原因により子供が命を落とした場合、理性を10点失う。",
180
+ "進行役は主人公役に何か一つ質問をする。その質問に対し可能な限り正直に答えなければならない(公序良俗に反する質問やハラスメントにあたる質問であった場合を除く)。",
181
+ ]
182
+ ),
44
183
  }.freeze
45
184
 
46
- register_prefix("ACT.*", TABLES.keys)
185
+ register_prefix(TABLES.keys)
47
186
  end
48
187
  end
49
188
  end