bcdice 3.1.0 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -14,7 +14,7 @@ module BCDice
14
14
  NAME = 'エンゼルギア 天使大戦TRPG The 2nd Editon'
15
15
 
16
16
  # ゲームシステム名の読みがな
17
- SORT_KEY = 'エンセルキア2'
17
+ SORT_KEY = 'えんせるきあ2'
18
18
 
19
19
  # ダイスボットの使い方
20
20
  HELP_MESSAGE = <<~MESSAGETEXT
@@ -117,7 +117,7 @@ module BCDice
117
117
  )
118
118
  }.freeze
119
119
 
120
- register_prefix('(\d+)AG(\d+)?(([\+\-]\d+)*)', TABLES.keys)
120
+ register_prefix('\d+AG', TABLES.keys)
121
121
  end
122
122
  end
123
123
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'bcdice/dice_table/table'
4
4
  require 'bcdice/dice_table/range_table'
5
- require 'bcdice/arithmetic_evaluator'
5
+ require 'bcdice/arithmetic'
6
6
 
7
7
  module BCDice
8
8
  module GameSystem
@@ -32,17 +32,19 @@ module BCDice
32
32
  MESSAGETEXT
33
33
 
34
34
  def eval_game_system_specific_command(command)
35
- case command
36
- when /(\d+)AN<=(\d+([+\-]\d+)*)/i
37
- return check_action(Regexp.last_match)
38
- else
35
+ m = /(\d+)AN<=(\d+([+\-]\d+)*)/i.match(command)
36
+ if TABLES.key?(command)
39
37
  return roll_tables(command, TABLES)
38
+ elsif m
39
+ return check_action(m)
40
+ else
41
+ return nil
40
42
  end
41
43
  end
42
44
 
43
45
  def check_action(match_data)
44
- dice_cnt = ArithmeticEvaluator.eval(match_data[1])
45
- target = ArithmeticEvaluator.eval(match_data[2])
46
+ dice_cnt = Arithmetic.eval(match_data[1], RoundType::FLOOR)
47
+ target = Arithmetic.eval(match_data[2], RoundType::FLOOR)
46
48
  debug("dice_cnt", dice_cnt)
47
49
  debug("target", target)
48
50
 
@@ -52,7 +54,12 @@ module BCDice
52
54
  has_critical = dice_arr.include?(1)
53
55
  result = has_critical ? suc_cnt + 2 : suc_cnt
54
56
 
55
- return "(#{dice_cnt}B10<=#{target}) > #{dice_str} > #{result > 0 ? '成功' : '失敗'}(達成値:#{result})#{has_critical ? ' (クリティカル発生)' : ''}"
57
+ Result.new.tap do |r|
58
+ r.text = "(#{dice_cnt}B10<=#{target}) > #{dice_str} > #{result > 0 ? '成功' : '失敗'}(達成値:#{result})#{has_critical ? ' (クリティカル発生)' : ''}"
59
+ r.critical = has_critical
60
+ r.success = result > 0
61
+ r.failure = !r.success?
62
+ end
56
63
  end
57
64
 
58
65
  TABLES = {
@@ -86,7 +93,7 @@ module BCDice
86
93
  }.freeze
87
94
 
88
95
  # ダイスボットで使用するコマンドを配列で列挙する
89
- register_prefix('\d+AN<=\d([\+\-]\d+)*', TABLES.keys)
96
+ register_prefix('\d+AN<=', TABLES.keys)
90
97
  end
91
98
  end
92
99
  end
@@ -25,25 +25,23 @@ module BCDice
25
25
  @d66_sort_type = D66SortType::NO_SORT
26
26
  end
27
27
 
28
- def check_nD6(total, _dice_total, dice_list, cmp_op, target)
28
+ def result_nd6(total, _dice_total, dice_list, cmp_op, target)
29
29
  n_max = dice_list.count(6)
30
30
 
31
31
  if dice_list.count(1) == dice_list.size
32
32
  # 全部1の目ならファンブル
33
- "ファンブル"
33
+ Result.fumble("ファンブル")
34
34
  elsif n_max >= 2
35
35
  # 2個以上6の目があったらクリティカル
36
- "クリティカル(+#{n_max}D6)" if n_max >= 2
36
+ Result.critical("クリティカル(+#{n_max}D6)")
37
37
  elsif cmp_op != :>= || target == '?'
38
- ''
38
+ nil
39
39
  elsif total >= target
40
- "成功"
40
+ Result.success("成功")
41
41
  else
42
- "失敗"
42
+ Result.failure("失敗")
43
43
  end
44
44
  end
45
-
46
- alias check_2D6 check_nD6
47
45
  end
48
46
  end
49
47
  end
@@ -34,7 +34,7 @@ module BCDice
34
34
  ・8av4*7+10 → 8d10で目標値4、攻撃力7、クリティカルトリガー10の命中判定。
35
35
  MESSAGETEXT
36
36
 
37
- register_prefix('\d+AV\d+((x|\*)\d+(\+\d+)?)?(c\d+)?')
37
+ register_prefix('\d+AV')
38
38
 
39
39
  def initialize(command)
40
40
  super(command)
@@ -26,7 +26,7 @@ module BCDice
26
26
   セット数が1以上の時はセット数も表示し、攻撃判定の場合は命中部位も表示します。
27
27
  INFO_MESSAGE_TEXT
28
28
 
29
- register_prefix('\d+BK', '\d+BA', '\d+BKC\d+', '\d+BAC\d+', '\d+R6')
29
+ register_prefix('\d+BK', '\d+BA', '\d+BKC', '\d+BAC', '\d+R6')
30
30
 
31
31
  def initialize(command)
32
32
  super(command)
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bcdice/format'
4
+ require 'bcdice/command/parser'
3
5
  require 'bcdice/dice_table/table'
4
6
  require 'bcdice/dice_table/range_table'
5
7
 
@@ -26,24 +28,45 @@ module BCDice
26
28
    正面からダメージ3の攻撃を技能ベース2目標値4で1回判定
27
29
   例)2BT3RL+5>=8
28
30
    右下半身にダメージ3の攻撃を技能ベース5目標値8で2回判定
29
-  ミサイルによるダメージは BT(ダメージ)の変わりに SRM2/4/6, LRM5/10/15/20を指定
31
+  ミサイルによるダメージは BT(ダメージ) の代わりに SRM2/4/6, LRM5/10/15/20 を指定
30
32
   例)3SRM6LU+5>=8
31
33
    左上半身にSRM6連を技能ベース5目標値8で3回判定
34
+ BT(ダメージ) の代わりに PPC を指定するとダメージ10で判定
35
+ 例)2PPCR+3>=10
36
+  右側からPPC(ダメージ10)による攻撃を技能ベース3目標値10で2回判定
32
37
  ・CT:致命的命中表
33
38
  ・DW:転倒後の向き表
34
- ・CDx:メック戦士意識維持表。ダメージ値xで判定 例)CD3
39
+ ・CDx:メック戦士意識維持ロール。ダメージ値x(1〜6)で判定 例)CD3
35
40
  MESSAGETEXT
36
41
 
37
- register_prefix('\d*SRM\d+.+', '\d*LRM\d+.+', '\d*BT.+', 'PPC', 'CT', 'DW', 'CD\d+')
42
+ register_prefix('\d*SRM', '\d*LRM', '\d*BT', '\d*PPC', 'CT', 'DW', 'CD')
38
43
 
39
44
  # 致命的命中が発生しない上限値
40
45
  NO_CRITICAL_HIT_LIMIT = 7
41
46
 
47
+ # @return [Command::Parser] PPCコマンドの構文解析器
48
+ def self.ppc_parser
49
+ return @ppc_parser if @ppc_parser
50
+
51
+ @ppc_parser = Command::Parser.new(/PPC(?:[LCR][LU]?)?/, round_type: RoundType::FLOOR)
52
+ @ppc_parser.enable_prefix_number
53
+ @ppc_parser.restrict_cmp_op_to(:>=)
54
+
55
+ @ppc_parser
56
+ end
57
+
58
+ # @return [Command::Parser] PPCコマンドの構文解析器
59
+ def ppc_parser
60
+ self.class.ppc_parser
61
+ end
62
+
42
63
  def eval_game_system_specific_command(command)
43
64
  result = roll_tables(command, TABLES)
44
65
  return result if result
45
66
 
46
- command = command.gsub("PPC", "BT10")
67
+ if (ppc_parse_result = ppc_parser.parse(command))
68
+ return execute_ppc(ppc_parse_result)
69
+ end
47
70
 
48
71
  count = 1
49
72
  if command =~ /^(\d+)(.+)/
@@ -55,9 +78,9 @@ module BCDice
55
78
  debug('executeCommandCatched command', command)
56
79
 
57
80
  case command
58
- when /^CD(\d+)$/
81
+ when /\ACD([1-6])\z/
59
82
  damage = Regexp.last_match(1).to_i
60
- return getCheckDieResult(damage)
83
+ return consciousness_roll(damage)
61
84
  when /^((S|L)RM\d+)(.+)/
62
85
  tail = Regexp.last_match(3)
63
86
  type = Regexp.last_match(1)
@@ -94,7 +117,7 @@ module BCDice
94
117
  LRM_LIMIT = 5
95
118
 
96
119
  def getHitResult(count, damageFunc, tail)
97
- m = /([LCR][LU]?)?(\+\d+)?>=(\d+)/.match(tail)
120
+ m = /\A([LCR][LU]?)?(\+\d+)?>=(\d+)/.match(tail)
98
121
  return nil unless m
99
122
 
100
123
  side = m[1] || 'C'
@@ -105,7 +128,7 @@ module BCDice
105
128
 
106
129
  partTable = HitPart::TABLES[side]
107
130
 
108
- resultTexts = []
131
+ resultLines = []
109
132
  damages = {}
110
133
  hitCount = 0
111
134
 
@@ -117,15 +140,24 @@ module BCDice
117
140
  damages, damageText = getDamages(damageFunc, partTable, damages)
118
141
  hitResult += damageText
119
142
  end
120
- resultTexts << hitResult
143
+ resultLines << hitResult
121
144
  end
122
145
 
123
- resultTexts.push(" > #{hitCount}回命中")
146
+ # 命中したか?
147
+ hit = hitCount > 0
124
148
 
125
- totalResultText = resultTexts.join("\n")
126
- totalResultText += " 命中箇所:" + getTotalDamage(damages) if hitCount > 0
149
+ hitCountText = " > #{hitCount}回命中"
150
+ hitDetails =
151
+ if hit
152
+ "#{hitCountText} 命中箇所:#{getTotalDamage(damages)}"
153
+ else
154
+ hitCountText
155
+ end
156
+ resultLines.push(hitDetails)
127
157
 
128
- return totalResultText
158
+ resultText = resultLines.join("\n")
159
+
160
+ return hit ? Result.success(resultText) : Result.failure(resultText)
129
161
  end
130
162
 
131
163
  def getBaseValue(baseString)
@@ -272,26 +304,75 @@ module BCDice
272
304
  return result_parts.join(' > '), hit_part.name, criticalText
273
305
  end
274
306
 
275
- def getCheckDieResult(damage)
276
- if damage >= 6
277
- return "死亡"
307
+ # メック戦士意識維持ロールを行う
308
+ #
309
+ # damageが6の場合は死亡。
310
+ # damageが5以下の場合は、2d6の結果が意識維持表の値以上かの成功判定。
311
+ #
312
+ # @param damage [Integer] メック戦士へのダメージ(1〜6)
313
+ # @return [Result]
314
+ # @see 「BattleTech: A Game of Armored Combat」ルールブックp. 44
315
+ def consciousness_roll(damage)
316
+ unless (1..6).include?(damage)
317
+ return nil
318
+ end
319
+
320
+ command = "CD#{damage}"
321
+
322
+ if damage == 6
323
+ return Result.fumble("#{command} > 死亡")
278
324
  end
279
325
 
280
- table = [[1, 3],
281
- [2, 5],
282
- [3, 7],
283
- [4, 10],
284
- [5, 11]]
326
+ consciousness_table = {
327
+ 1 => 3,
328
+ 2 => 5,
329
+ 3 => 7,
330
+ 4 => 10,
331
+ 5 => 11,
332
+ }
333
+
334
+ target = consciousness_table[damage]
335
+ expr = "(2D6>=#{target})"
336
+
337
+ values = @randomizer.roll_barabara(2, 6)
338
+ sum = values.sum
339
+ values_str = values.join(",")
340
+ sum_and_values = "#{sum}[#{values_str}]"
341
+
342
+ success = sum >= target
343
+ result = success ? "成功" : "失敗"
344
+
345
+ parts = [
346
+ command,
347
+ expr,
348
+ sum_and_values,
349
+ sum,
350
+ result,
351
+ ]
352
+ text = parts.join(" > ")
285
353
 
286
- target = get_table_by_number(damage, table, nil)
354
+ return success ? Result.success(text) : Result.failure(text)
355
+ end
287
356
 
288
- dice1 = @randomizer.roll_once(6)
289
- dice2 = @randomizer.roll_once(6)
290
- total = dice1 + dice2
291
- result = total >= target ? "成功" : "失敗"
292
- text = "#{total}[#{dice1},#{dice2}]>=#{target} #{result}"
357
+ # PPCコマンドを実行する
358
+ # @param parse_result [Command::Parsed] PPCコマンドの構文解析結果
359
+ # @return [Result, nil]
360
+ def execute_ppc(parse_result)
361
+ count = parse_result.prefix_number || 1
362
+
363
+ # getHitResult() の引数tailの形に合わせる
364
+ # TODO: 攻撃を表すクラスに変える
365
+
366
+ # "PPC" 以降の部位指定
367
+ side = parse_result.command[3..-1]
368
+
369
+ modifier = Format.modifier(parse_result.modify_number)
370
+ target = parse_result.target_number
371
+
372
+ tail = "#{side}#{modifier}>=#{target}"
293
373
 
294
- return text
374
+ # ダメージ10固定で命中判定を行う
375
+ return getHitResult(count, lambda { 10 }, tail)
295
376
  end
296
377
 
297
378
  # 表の集合
@@ -82,16 +82,34 @@ module BCDice
82
82
 
83
83
  dice_list_org_str = "[#{dice_list_org.join(',')}]" if dice_list_filtered != dice_list_org
84
84
 
85
+ result = result_compare(total)
86
+ result.critical = critical?
87
+ result.fumble = fumble?
88
+
89
+ dice_status =
90
+ if result.fumble?
91
+ "ファンブル"
92
+ elsif result.critical?
93
+ "クリティカル"
94
+ end
95
+ result_str =
96
+ if result.success?
97
+ "成功"
98
+ elsif result.failure?
99
+ "失敗"
100
+ end
101
+
85
102
  sequence = [
86
103
  command_expr(),
87
104
  dice_list_org_str,
88
105
  interim_expr(dice_list_filtered),
89
- dice_status(),
106
+ dice_status,
90
107
  total.to_s,
91
- result_compare(total)
108
+ result_str
92
109
  ].compact
110
+ result.text = sequence.join(" > ")
93
111
 
94
- return sequence.join(" > ")
112
+ return result
95
113
  end
96
114
 
97
115
  private
@@ -187,14 +205,6 @@ module BCDice
187
205
  return expr
188
206
  end
189
207
 
190
- def dice_status
191
- if fumble?
192
- "ファンブル"
193
- elsif critical?
194
- "クリティカル"
195
- end
196
- end
197
-
198
208
  def fumble?
199
209
  @dice_total <= @fumble
200
210
  end
@@ -220,7 +230,13 @@ module BCDice
220
230
 
221
231
  def result_compare(total)
222
232
  if @cmp_op
223
- total.send(@cmp_op, @target_number) ? "成功" : "失敗"
233
+ if total.send(@cmp_op, @target_number)
234
+ Result.success(nil)
235
+ else
236
+ Result.failure(nil)
237
+ end
238
+ else
239
+ Result.new
224
240
  end
225
241
  end
226
242
  end
@@ -55,13 +55,13 @@ module BCDice
55
55
  INFO_MESSAGE_TEXT
56
56
 
57
57
  register_prefix(
58
- '[1-7]*PD\d+(?:[\+\-]\d+)?',
58
+ '[1-7]*PD',
59
59
  'HW',
60
60
  'BWT',
61
61
  'LWT',
62
62
  'TWT',
63
63
  'CWT',
64
- 'LO\d{0,2}',
64
+ 'LO',
65
65
  'SU',
66
66
  'WI',
67
67
  'NA',
@@ -88,7 +88,7 @@ module BCDice
88
88
  'NUR',
89
89
  'GUR',
90
90
  'BUR',
91
- 'BT\d*',
91
+ 'BT',
92
92
  'SGT',
93
93
  'RS',
94
94
  'SH',
@@ -110,7 +110,7 @@ module BCDice
110
110
  'NCH',
111
111
  'GCH',
112
112
  'PCH',
113
- 'IT\d*',
113
+ 'IT',
114
114
  'ACT',
115
115
  'ACB',
116
116
  'ACE',
@@ -124,7 +124,7 @@ module BCDice
124
124
  'RU',
125
125
  '\d{2}C',
126
126
  'BU',
127
- '\d+S?A[1-6]*(?:[\+\-]\d+)?',
127
+ '\d+S?A',
128
128
  'SIP',
129
129
  'BVT',
130
130
  'LVT',
@@ -53,13 +53,13 @@ module BCDice
53
53
  INFO_MESSAGE_TEXT
54
54
 
55
55
  register_prefix(
56
- '[1-7]*PD\d+(?:[\+\-]\d+)?',
56
+ '[1-7]*PD',
57
57
  'HW',
58
58
  'BWT',
59
59
  'LWT',
60
60
  'TWT',
61
61
  'CWT',
62
- 'LO\d{0,2}',
62
+ 'LO',
63
63
  'SU',
64
64
  'WI',
65
65
  'NA',
@@ -85,7 +85,7 @@ module BCDice
85
85
  'NUR',
86
86
  'GUR',
87
87
  'BUR',
88
- 'BT\d*',
88
+ 'BT',
89
89
  'SGT',
90
90
  'RS',
91
91
  'SH',
@@ -105,7 +105,7 @@ module BCDice
105
105
  'SCH',
106
106
  'WCH',
107
107
  'NCH',
108
- 'IT\d*',
108
+ 'IT',
109
109
  'ACT',
110
110
  'ACB',
111
111
  'ACE',
@@ -119,7 +119,7 @@ module BCDice
119
119
  'RU',
120
120
  '\d{2}C',
121
121
  'BU',
122
- '\d+S?A[1-6]*(?:[\+\-]\d+)?',
122
+ '\d+S?A',
123
123
  'SIP',
124
124
  'BVT',
125
125
  'LVT',