bcdice 3.1.3 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +186 -76
  3. data/README.md +3 -2
  4. data/i18n/BeginningIdol/ja_jp.yml +2806 -0
  5. data/i18n/BeginningIdol/ko_kr.yml +1400 -0
  6. data/i18n/Cthulhu/zh_hans.yml +11 -0
  7. data/i18n/KillDeathBusiness/ja_jp.yml +1 -1
  8. data/i18n/MagicaLogia/ja_jp.yml +1 -1
  9. data/i18n/MagicaLogia/zh_hans.yml +564 -0
  10. data/i18n/MonotoneMuseum/ko_kr.yml +526 -53
  11. data/i18n/StellarKnights/ja_jp.yml +498 -0
  12. data/i18n/StellarKnights/ko_kr.yml +498 -0
  13. data/i18n/zh_hans.yml +7 -0
  14. data/lib/bcdice/command/parsed.rb +11 -3
  15. data/lib/bcdice/command/parser.rb +179 -100
  16. data/lib/bcdice/common_command/add_dice.rb +1 -1
  17. data/lib/bcdice/common_command/barabara_dice/node.rb +2 -2
  18. data/lib/bcdice/common_command/barabara_dice/result.rb +6 -0
  19. data/lib/bcdice/common_command/calc.rb +1 -1
  20. data/lib/bcdice/common_command/choice.rb +82 -7
  21. data/lib/bcdice/common_command/tally_dice/node.rb +135 -0
  22. data/lib/bcdice/common_command/tally_dice/parser.rb +302 -0
  23. data/lib/bcdice/common_command/tally_dice.rb +19 -0
  24. data/lib/bcdice/common_command.rb +2 -0
  25. data/lib/bcdice/dice_table/d66_half_grid_table.rb +33 -0
  26. data/lib/bcdice/dice_table/d66_left_range_table.rb +29 -0
  27. data/lib/bcdice/dice_table/d66_one_third_table.rb +34 -0
  28. data/lib/bcdice/dice_table/d66_table.rb +5 -1
  29. data/lib/bcdice/dice_table.rb +3 -0
  30. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  31. data/lib/bcdice/game_system/Ainecadette.rb +68 -0
  32. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  33. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  34. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  35. data/lib/bcdice/game_system/Amadeus.rb +110 -93
  36. data/lib/bcdice/game_system/AngelGear.rb +10 -5
  37. data/lib/bcdice/game_system/AnimaAnimus.rb +16 -9
  38. data/lib/bcdice/game_system/Aoharubaan.rb +91 -0
  39. data/lib/bcdice/game_system/Arianrhod.rb +6 -8
  40. data/lib/bcdice/game_system/AssaultEngine.rb +91 -0
  41. data/lib/bcdice/game_system/Avandner.rb +1 -1
  42. data/lib/bcdice/game_system/BadLife.rb +264 -289
  43. data/lib/bcdice/game_system/Bakenokawa.rb +244 -0
  44. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  45. data/lib/bcdice/game_system/BattleTech.rb +109 -28
  46. data/lib/bcdice/game_system/BeastBindTrinity.rb +28 -12
  47. data/lib/bcdice/game_system/BeginningIdol.rb +118 -2392
  48. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +10 -2312
  49. data/lib/bcdice/game_system/BladeOfArcana.rb +1 -1
  50. data/lib/bcdice/game_system/BlindMythos.rb +39 -38
  51. data/lib/bcdice/game_system/BloodCrusade.rb +6 -7
  52. data/lib/bcdice/game_system/BloodMoon.rb +9 -8
  53. data/lib/bcdice/game_system/CardRanker.rb +8 -7
  54. data/lib/bcdice/game_system/CastleInGray.rb +133 -0
  55. data/lib/bcdice/game_system/ChaosFlare.rb +21 -15
  56. data/lib/bcdice/game_system/Chill.rb +10 -10
  57. data/lib/bcdice/game_system/Chill3.rb +9 -9
  58. data/lib/bcdice/game_system/CodeLayerd.rb +39 -39
  59. data/lib/bcdice/game_system/ColossalHunter.rb +34 -47
  60. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  61. data/lib/bcdice/game_system/Cthulhu.rb +3 -3
  62. data/lib/bcdice/game_system/Cthulhu7th.rb +56 -18
  63. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  64. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  65. data/lib/bcdice/game_system/Cthulhu_SimplifiedChinese.rb +60 -0
  66. data/lib/bcdice/game_system/DarkBlaze.rb +0 -11
  67. data/lib/bcdice/game_system/DarkDaysDrive.rb +8 -7
  68. data/lib/bcdice/game_system/DeadlineHeroes.rb +11 -10
  69. data/lib/bcdice/game_system/DemonParasite.rb +5 -13
  70. data/lib/bcdice/game_system/DesperateRun.rb +1 -1
  71. data/lib/bcdice/game_system/DoubleCross.rb +8 -1
  72. data/lib/bcdice/game_system/Dracurouge.rb +3 -2
  73. data/lib/bcdice/game_system/EclipsePhase.rb +14 -14
  74. data/lib/bcdice/game_system/Elric.rb +18 -14
  75. data/lib/bcdice/game_system/Elysion.rb +1 -1
  76. data/lib/bcdice/game_system/EmbryoMachine.rb +9 -8
  77. data/lib/bcdice/game_system/Emoklore.rb +25 -20
  78. data/lib/bcdice/game_system/FateCoreSystem.rb +117 -0
  79. data/lib/bcdice/game_system/Fiasco.rb +1 -1
  80. data/lib/bcdice/game_system/FilledWith.rb +4 -0
  81. data/lib/bcdice/game_system/FutariSousa.rb +12 -10
  82. data/lib/bcdice/game_system/GURPS.rb +17 -28
  83. data/lib/bcdice/game_system/Garako.rb +1 -1
  84. data/lib/bcdice/game_system/GardenOrder.rb +12 -7
  85. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  86. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  87. data/lib/bcdice/game_system/Gorilla.rb +2 -8
  88. data/lib/bcdice/game_system/GranCrest.rb +189 -417
  89. data/lib/bcdice/game_system/Gundog.rb +9 -8
  90. data/lib/bcdice/game_system/GundogRevised.rb +10 -9
  91. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  92. data/lib/bcdice/game_system/GurpsFW.rb +16 -16
  93. data/lib/bcdice/game_system/HarnMaster.rb +19 -26
  94. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
  95. data/lib/bcdice/game_system/Hieizan.rb +12 -21
  96. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  97. data/lib/bcdice/game_system/HuntersMoon.rb +5 -10
  98. data/lib/bcdice/game_system/InfiniteFantasia.rb +19 -17
  99. data/lib/bcdice/game_system/Insane.rb +13 -20
  100. data/lib/bcdice/game_system/Irisbane.rb +154 -0
  101. data/lib/bcdice/game_system/IthaWenUa.rb +8 -15
  102. data/lib/bcdice/game_system/JamesBond.rb +10 -10
  103. data/lib/bcdice/game_system/JekyllAndHyde.rb +1 -1
  104. data/lib/bcdice/game_system/Kamigakari.rb +1 -1
  105. data/lib/bcdice/game_system/KanColle.rb +4 -9
  106. data/lib/bcdice/game_system/Karukami.rb +84 -0
  107. data/lib/bcdice/game_system/KemonoNoMori.rb +26 -39
  108. data/lib/bcdice/game_system/KillDeathBusiness.rb +7 -15
  109. data/lib/bcdice/game_system/KurayamiCrying.rb +142 -3
  110. data/lib/bcdice/game_system/LiveraDoll.rb +254 -304
  111. data/lib/bcdice/game_system/LogHorizon.rb +10 -7
  112. data/lib/bcdice/game_system/MagicaLogia_SimplifiedChinese.rb +66 -0
  113. data/lib/bcdice/game_system/MeikyuDays.rb +10 -8
  114. data/lib/bcdice/game_system/MeikyuKingdom.rb +26 -26
  115. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +4 -3
  116. data/lib/bcdice/game_system/MetalHead.rb +12 -22
  117. data/lib/bcdice/game_system/MetalHeadExtream.rb +5 -5
  118. data/lib/bcdice/game_system/MonotoneMuseum.rb +8 -6
  119. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
  120. data/lib/bcdice/game_system/Nechronica.rb +63 -90
  121. data/lib/bcdice/game_system/NinjaSlayer.rb +6 -7
  122. data/lib/bcdice/game_system/NjslyrBattle.rb +8 -11
  123. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  124. data/lib/bcdice/game_system/Paradiso.rb +1 -1
  125. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  126. data/lib/bcdice/game_system/Peekaboo.rb +4 -9
  127. data/lib/bcdice/game_system/Pendragon.rb +7 -7
  128. data/lib/bcdice/game_system/PersonaO.rb +86 -0
  129. data/lib/bcdice/game_system/PhantasmAdventure.rb +8 -8
  130. data/lib/bcdice/game_system/Postman.rb +1 -1
  131. data/lib/bcdice/game_system/PulpCthulhu.rb +1 -1
  132. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  133. data/lib/bcdice/game_system/Revulture.rb +123 -0
  134. data/lib/bcdice/game_system/RuneQuest.rb +8 -8
  135. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  136. data/lib/bcdice/game_system/SRS.rb +17 -16
  137. data/lib/bcdice/game_system/SamsaraBallad.rb +38 -11
  138. data/lib/bcdice/game_system/Satasupe.rb +32 -32
  139. data/lib/bcdice/game_system/ScreamHighSchool.rb +5 -5
  140. data/lib/bcdice/game_system/SharedFantasia.rb +19 -23
  141. data/lib/bcdice/game_system/ShinobiGami.rb +14 -6
  142. data/lib/bcdice/game_system/Skynauts.rb +103 -142
  143. data/lib/bcdice/game_system/SkynautsBouken.rb +228 -0
  144. data/lib/bcdice/game_system/StarryDolls.rb +318 -0
  145. data/lib/bcdice/game_system/SteamPunkers.rb +25 -7
  146. data/lib/bcdice/game_system/StellarKnights.rb +85 -706
  147. data/lib/bcdice/game_system/StellarKnights_Korean.rb +79 -0
  148. data/lib/bcdice/game_system/{SterileLife.rb → StellarLife.rb} +162 -226
  149. data/lib/bcdice/game_system/StratoShout.rb +8 -16
  150. data/lib/bcdice/game_system/Strave.rb +1 -1
  151. data/lib/bcdice/game_system/SwordWorld.rb +22 -9
  152. data/lib/bcdice/game_system/SwordWorld2_0.rb +22 -7
  153. data/lib/bcdice/game_system/SwordWorld2_5.rb +8 -2
  154. data/lib/bcdice/game_system/TalesFromTheLoop.rb +83 -0
  155. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  156. data/lib/bcdice/game_system/TokumeiTenkousei.rb +4 -3
  157. data/lib/bcdice/game_system/TokyoGhostResearch.rb +1 -1
  158. data/lib/bcdice/game_system/TorgEternity.rb +2 -2
  159. data/lib/bcdice/game_system/ToshiakiHolyGrailWar.rb +92 -0
  160. data/lib/bcdice/game_system/TrinitySeven.rb +279 -280
  161. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  162. data/lib/bcdice/game_system/Utakaze.rb +53 -48
  163. data/lib/bcdice/game_system/Villaciel.rb +1 -1
  164. data/lib/bcdice/game_system/WARPS.rb +11 -9
  165. data/lib/bcdice/game_system/WaresBlade.rb +4 -9
  166. data/lib/bcdice/game_system/Warhammer.rb +15 -6
  167. data/lib/bcdice/game_system/Warhammer4.rb +15 -11
  168. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  169. data/lib/bcdice/game_system/YankeeYogSothoth.rb +4 -9
  170. data/lib/bcdice/game_system/YearZeroEngine.rb +40 -19
  171. data/lib/bcdice/game_system/Yggdrasill.rb +1 -1
  172. data/lib/bcdice/game_system/ZettaiReido.rb +20 -25
  173. data/lib/bcdice/game_system/beginning_idol/accessories_table.rb +31 -0
  174. data/lib/bcdice/game_system/beginning_idol/bad_status_table.rb +43 -0
  175. data/lib/bcdice/game_system/beginning_idol/chain_d66_table.rb +29 -0
  176. data/lib/bcdice/game_system/beginning_idol/chain_table.rb +37 -0
  177. data/lib/bcdice/game_system/beginning_idol/costume_table.rb +37 -0
  178. data/lib/bcdice/game_system/beginning_idol/d6_twice_table.rb +36 -0
  179. data/lib/bcdice/game_system/beginning_idol/item_table.rb +51 -0
  180. data/lib/bcdice/game_system/beginning_idol/my_skill_name_table.rb +44 -0
  181. data/lib/bcdice/game_system/beginning_idol/random_event_table.rb +31 -0
  182. data/lib/bcdice/game_system/beginning_idol/skill_table.rb +63 -0
  183. data/lib/bcdice/game_system/beginning_idol/table.rb +193 -0
  184. data/lib/bcdice/game_system/beginning_idol/with_abnormality.rb +74 -0
  185. data/lib/bcdice/game_system/beginning_idol/work_table.rb +57 -0
  186. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +1 -1
  187. data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +4 -4
  188. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +50 -7
  189. data/lib/bcdice/game_system/sword_world/rating_parser.rb +148 -107
  190. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +26 -8
  191. data/lib/bcdice/game_system.rb +18 -1
  192. data/lib/bcdice/repl.rb +1 -1
  193. data/lib/bcdice/result.rb +26 -0
  194. data/lib/bcdice/version.rb +1 -1
  195. metadata +48 -6
@@ -0,0 +1,244 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/dice_table/table'
4
+ require 'bcdice/dice_table/d66_table'
5
+ require 'bcdice/arithmetic'
6
+ require 'bcdice/command/parser'
7
+
8
+ module BCDice
9
+ module GameSystem
10
+ class Bakenokawa < Base
11
+ # ゲームシステムの識別子
12
+ ID = 'Bakenokawa'
13
+
14
+ # ゲームシステム名
15
+ NAME = 'バケノカワ'
16
+
17
+ # ゲームシステム名の読みがな
18
+ #
19
+ # 「ゲームシステム名の読みがなの設定方法」(docs/dicebot_sort_key.md)を参考にして
20
+ # 設定してください
21
+ SORT_KEY = 'はけのかわ'
22
+
23
+ # ダイスボットの使い方
24
+ HELP_MESSAGE = <<~MESSAGETEXT
25
+ ・行為判定
26
+ xBKy@z
27
+ x:振るダイスの数(省略可、省略した場合は2)
28
+ y:振るダイスの面数
29
+ z:スペシャル値(@ごと省略可、省略した場合は12)
30
+ (例)BK10
31
+    4BK6
32
+    2BK6@10
33
+
34
+ ・各種表
35
+ 今の関係表 NRT
36
+ カイブツ時代からの因縁表 KKT
37
+ 調査演出表
38
+ カイブツ RTK
39
+ バケノカワ RTB
40
+ コラボテーマ表
41
+ カイブツ CTK
42
+ バケノカワ CTB
43
+ ファンブル表 FT
44
+ MESSAGETEXT
45
+
46
+ def initialize(command)
47
+ super(command)
48
+ @sort_barabara_dice = true
49
+ @d66_sort_type = D66SortType::ASC
50
+ end
51
+
52
+ def eval_game_system_specific_command(command)
53
+ return check_action(command) || roll_tables(command, TABLES)
54
+ end
55
+
56
+ def check_action(command)
57
+ parser = Command::Parser.new("BK", round_type: RoundType::FLOOR).enable_critical.enable_prefix_number.has_suffix_number
58
+ parsed = parser.parse(command)
59
+ return nil if parsed.nil?
60
+
61
+ target = 4
62
+ dice_cnt = parsed.prefix_number || 2
63
+ dice_faces = parsed.suffix_number
64
+ special_target = parsed.critical || 12
65
+
66
+ debug("dice_faces", dice_faces)
67
+ debug("dice_cnt", dice_cnt)
68
+ debug("special_target", special_target)
69
+
70
+ dice_arr = @randomizer.roll_barabara(dice_cnt, dice_faces).sort
71
+ dice_str = dice_arr.join(",")
72
+ dice_sum = dice_arr.sum
73
+ has_special = dice_sum >= special_target
74
+ has_fumble = dice_sum <= 2
75
+ result = dice_arr.count { |x| x >= target } >= 1
76
+
77
+ Result.new.tap do |r|
78
+ r.text = "(#{dice_cnt}B#{dice_faces}>=#{target}) > [#{dice_str}] > #{dice_sum} > #{result ? '成功' : '失敗'}#{has_special ? '(スペシャル)' : ''}#{has_fumble ? '(ファンブル)' : ''}"
79
+ r.critical = has_special
80
+ r.fumble = has_fumble
81
+ r.success = result
82
+ r.failure = !r.success?
83
+ end
84
+ end
85
+
86
+ TABLES = {
87
+ 'NRT' => DiceTable::D66Table.new(
88
+ '今の関係表',
89
+ D66SortType::ASC,
90
+ {
91
+ 11 => 'バケノカワ同士が親戚だった',
92
+ 12 => '仲のいい職場の同僚',
93
+ 13 => '仕事のことで助けてもらったことがある',
94
+ 14 => '人間社会のことを教え合っている',
95
+ 15 => '施設同士がよくコラボする',
96
+ 16 => '街のお店に二人で出かける仲',
97
+ 22 => 'どうにもウマが合わずに喧嘩ばかりしている',
98
+ 23 => 'そのバケノカワを羨ましいと思っていた',
99
+ 24 => 'バケノカワに関する苦労を聞いたことがある',
100
+ 25 => 'バケノカワとしての生活圏が近い',
101
+ 26 => 'バケノカワ同士が知り合いだった',
102
+ 33 => 'あんな人間になりたいと憧れを覚えた',
103
+ 34 => '友人として色々な悩みを共に解決してきた',
104
+ 35 => '放っておけないところがあると思っている',
105
+ 36 => 'いつも迷惑をかけて悪いと思っている',
106
+ 44 => '毎朝挨拶をするようなご近所さん/寮の部屋が隣',
107
+ 45 => '何か悩んでいそうな顔が気になった',
108
+ 46 => '何かと仕事関係で助けてもらい、世話になっている',
109
+ 55 => '立ち振る舞いが人間らしくて羨ましい',
110
+ 56 => 'ワンダーランドでの振る舞いや仕事ぶりに一目置いている',
111
+ 66 => 'そのバケノカワを見ると懐かしさを覚える',
112
+ }
113
+ ),
114
+ 'KKT' => DiceTable::D66Table.new(
115
+ 'カイブツ時代からの因縁表',
116
+ D66SortType::ASC,
117
+ {
118
+ 11 => '一緒の牢獄に捕まっていたことがある',
119
+ 12 => '地下の国で一緒に遊んでいたことがある',
120
+ 13 => '地上に出て人間を楽しませる夢を語り合った',
121
+ 14 => '一緒に人間社会を学ぶ訓練を受けた',
122
+ 15 => '生まれた時からずっと一緒だった',
123
+ 16 => '時々喧嘩をし合うような仲だった',
124
+ 22 => '幼少期に育ててもらった恩がある',
125
+ 23 => '昔助けてもらった時の借りがある',
126
+ 24 => '思い出せないぐらい昔に、助けてもらった……気がする',
127
+ 25 => '一緒に地上で人間を楽しませようと約束した',
128
+ 26 => '人間に対する憧れを語った',
129
+ 33 => 'カイブツ時代、一方的に憧れを抱いていた',
130
+ 34 => '人間のまね事を一緒にしていた',
131
+ 35 => '少しの間、一緒に暮らしていたことがある',
132
+ 36 => '一緒にお茶会をした仲',
133
+ 44 => '同じ親のもとで育った',
134
+ 45 => 'カイブツ時代に貸しがあって、まだ返してもらってない',
135
+ 46 => '何かと競い合う、ライバル同士だった',
136
+ 55 => '戦いを挑み、ボコボコにされた',
137
+ 56 => '一緒に退屈を紛らわすために色々悪だくみしていた',
138
+ 66 => 'バケノカワを貰った後にやりたいことを語ってもらった覚えがある',
139
+ }
140
+ ),
141
+ 'RTK' => DiceTable::Table.new(
142
+ '調査演出表 カイブツ',
143
+ '1D10',
144
+ [
145
+ 'カイブツとして街に潜み、チェインNPCの周りを調べて回った',
146
+ 'カイブツとしての力を使い、チェインNPCを尾行して好みを調べた',
147
+ '人間には潜入できないルートを使って、チェインNPCの周りを調べた',
148
+ '人間として調べてみようとしたが、カイブツとしての特徴が出て困った',
149
+ 'カイブツとしての特徴を調査に活かし、調べ上げた',
150
+ '魔法の鏡に問いかけて、答えを貰った',
151
+ 'チェインNPCの痕跡から、魔法の力を使って過去を辿った',
152
+ '仲間のカイブツたちと一緒に、街に繰り出してドタバタ劇を繰り広げながら情報を集めた',
153
+ '小さなカイブツたちに、気付かれないようにチェインNPCを調べてもらった',
154
+ '魔女のカイブツに頼んで、調査に便利な薬を作ってもらった,'
155
+ ]
156
+ ),
157
+ 'RTB' => DiceTable::Table.new(
158
+ '調査演出表 バケノカワ',
159
+ '1D10',
160
+ [
161
+ '人間の友人を頼ってチェインNPCの噂話を聞く',
162
+ '人間の街に行ってチェインNPCのことを聞いて回る',
163
+ 'チェインPCに話を聞いて、その子の特徴から好みを推察する',
164
+ 'チェインPCと一緒に、チェインNPCの周囲を聞き込みして回った',
165
+ '人間として、情報通の人間が集まる場所に向かい、そこでいろいろな話を聞いて回った',
166
+ 'ネットを利用して、チェインNPCの痕跡がないか調べてみた',
167
+ 'チェインNPCがよく行く場所を掴み、そこで情報収集をした',
168
+ '実は、チェインNPCは自分のバケノカワとして会ったことがあり、そのときのことを思い出した',
169
+ '実は、チェインNPCはお客様として自分の担当施設に来たことがあり、そのときの印象を思い出した',
170
+ ]
171
+ ),
172
+ 'CTK' => DiceTable::D66Table.new(
173
+ 'コラボテーマ表 カイブツ',
174
+ D66SortType::ASC,
175
+ {
176
+ 11 => '自分とコラボ相手の「カイブツとしての姿」を使ったド派手なコラボ',
177
+ 12 => '自分の特徴を使ったコラボ',
178
+ 13 => 'コラボ相手の特徴を使ったコラボ',
179
+ 14 => '自分とコラボ相手の特徴を活かすコラボ',
180
+ 15 => '自分の施設とコラボ相手の特徴を合わせたコラボ',
181
+ 16 => 'コラボ相手の施設と自分の特徴を合わせたコラボ',
182
+ 22 => '自分とコラボ相手の「カイブツとしての力」を使ったコラボ',
183
+ 23 => '自分とコラボ相手のパビリオンを活かすコラボ',
184
+ 24 => '自分のカイブツとしての力を使ったコラボ',
185
+ 25 => '相手のカイブツとしての力を使ったコラボ',
186
+ 26 => '自分がカイブツとして優れているところを、コラボ相手に聞いてヒントにする',
187
+ 33 => 'カイブツとしての姿をキャラクターグッズとして売り出すコラボ',
188
+ 34 => '魔法の力を演出に使った、キラキラのコラボ',
189
+ 35 => '魔法の道具を使った、お客様を驚かせるようなコラボ',
190
+ 36 => '童話の世界をくっつけて、ちぐはぐな感じを楽しんでもらう',
191
+ 44 => 'パビリオンの仲間たちを集めたステージを開催',
192
+ 45 => 'カイブツとしての姿をあえて晒し、それを「演出」に組み込む',
193
+ 46 => '自分たちの力を「演出」として使ったコラボ',
194
+ 55 => '魔法の力がかかったお土産を持たせるコラボ',
195
+ 56 => '不思議な演出がいっぱいのコラボ',
196
+ 66 => '自分たち以外のカイブツも呼んだ、賑やかなコラボ',
197
+ }
198
+ ),
199
+ 'CTB' => DiceTable::D66Table.new(
200
+ 'コラボテーマ表 バケノカワ',
201
+ D66SortType::ASC,
202
+ {
203
+ 11 => 'バケノカワとして生活するうちに覚えた、「楽しかったこと」をやってみる',
204
+ 12 => 'コラボ相手の施設におじゃまするコラボ',
205
+ 13 => '自分の施設にコラボ相手を呼ぶ',
206
+ 14 => '自分とコラボ相手の施設にお土産を用意する',
207
+ 15 => 'コラボ相手の施設の要素を使う',
208
+ 16 => '自分の施設の要素をコラボ相手の施設に贈る',
209
+ 22 => 'バケノカワ生活の中で気付いた、「人間は面白い」と思えたことをやる',
210
+ 23 => '自分とコラボ相手の技能で園全体を盛り上げる',
211
+ 24 => '自分の技能をコラボ相手の施設に活かす',
212
+ 25 => 'パートナーの技能を自分の施設に活かす',
213
+ 26 => '自分のカバーパーソナルを活かすコラボ',
214
+ 33 => '自分だけではできないことをコラボ相手と相談する',
215
+ 34 => 'パートナーのカバーパーソナルを活かすコラボ',
216
+ 35 => '二つの施設を合わせたような施設を限定オープン',
217
+ 36 => 'お客様の笑顔を思い出し、そうなるように二人で努力する',
218
+ 44 => '二つの施設を繋げる園内バスを用意する',
219
+ 45 => 'お客様に楽しんでもらえる演出を二人で考える',
220
+ 46 => 'お客様が好みそうなお土産を二人で考える',
221
+ 55 => '人間の友達に、「何が楽しいのか」を改めて聞く',
222
+ 56 => 'バケノカワの伝手を使って、人間の友達に話を聞く',
223
+ 66 => 'ワンダーランドのみんなに手伝ってもらう豪華なコラボ',
224
+ }
225
+ ),
226
+ 'FT' => DiceTable::Table.new(
227
+ 'ファンブル表',
228
+ '1D6',
229
+ [
230
+ '「あれ?”自分”は一体何者だったかな?」カバーパーソナルを1つ選んで失う',
231
+ 'ふとした瞬間に、楽しい感情に対して懐疑的になってしまう。ワンダートークンを1個選んで失う',
232
+ 'せっかく用意した道具を壊してしまう。セットしていたサプライズカードを1枚選んで破棄する',
233
+ 'バケノカワの記憶が思い出される。カバーパーソナルとそれに付随するパーソナル技能を1つずつ獲得する',
234
+ 'カイブツとしての自分が前面に出てしまう。次に行う判定の間、すべての技能を修得していないものとして扱う',
235
+ '失敗してしまったが、それがお客様にウケた。ワンダートークンを1個獲得する',
236
+ ]
237
+ ),
238
+ }.freeze
239
+
240
+ # ダイスボットで使用するコマンドを配列で列挙する
241
+ register_prefix('\d*BK', TABLES.keys)
242
+ end
243
+ end
244
+ end
@@ -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