open-optcg 0.0.0-stage → 0.1.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 (525) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +74 -2
  3. package/dist/cards.js +1 -0
  4. package/dist/chunks/chunk-4I54H2QI.js +1 -0
  5. package/dist/chunks/chunk-5QCGQIMI.js +1 -0
  6. package/dist/decks.js +2 -0
  7. package/dist/engine.js +1 -0
  8. package/dist/protocol.js +1 -0
  9. package/dist/types/cards.d.ts +1 -0
  10. package/dist/types/decks.d.ts +1 -0
  11. package/dist/types/engine.d.ts +1 -0
  12. package/dist/types/internal/cards/src/block-icons.d.ts +26 -0
  13. package/dist/types/internal/cards/src/eb01.d.ts +2 -0
  14. package/dist/types/internal/cards/src/eb02.d.ts +2 -0
  15. package/dist/types/internal/cards/src/eb03.d.ts +2 -0
  16. package/dist/types/internal/cards/src/eb04.d.ts +2 -0
  17. package/dist/types/internal/cards/src/eb05.d.ts +2 -0
  18. package/dist/types/internal/cards/src/generated-blocks.d.ts +3 -0
  19. package/dist/types/internal/cards/src/generated-community.d.ts +5972 -0
  20. package/dist/types/internal/cards/src/generated-eb01.d.ts +2981 -0
  21. package/dist/types/internal/cards/src/generated-eb02.d.ts +2994 -0
  22. package/dist/types/internal/cards/src/generated-eb03.d.ts +3133 -0
  23. package/dist/types/internal/cards/src/generated-eb04.d.ts +3068 -0
  24. package/dist/types/internal/cards/src/generated-eb05.d.ts +3046 -0
  25. package/dist/types/internal/cards/src/generated-op05.d.ts +5816 -0
  26. package/dist/types/internal/cards/src/generated-op06.d.ts +5813 -0
  27. package/dist/types/internal/cards/src/generated-op07.d.ts +5793 -0
  28. package/dist/types/internal/cards/src/generated-op08.d.ts +5833 -0
  29. package/dist/types/internal/cards/src/generated-op09.d.ts +5800 -0
  30. package/dist/types/internal/cards/src/generated-op10.d.ts +5815 -0
  31. package/dist/types/internal/cards/src/generated-op11.d.ts +5787 -0
  32. package/dist/types/internal/cards/src/generated-op12.d.ts +5765 -0
  33. package/dist/types/internal/cards/src/generated-op13.d.ts +5870 -0
  34. package/dist/types/internal/cards/src/generated-op14.d.ts +5926 -0
  35. package/dist/types/internal/cards/src/generated-op15.d.ts +5900 -0
  36. package/dist/types/internal/cards/src/generated-op16.d.ts +5887 -0
  37. package/dist/types/internal/cards/src/generated-op17.d.ts +5961 -0
  38. package/dist/types/internal/cards/src/generated-p.d.ts +5265 -0
  39. package/dist/types/internal/cards/src/generated-prb02.d.ts +891 -0
  40. package/dist/types/internal/cards/src/generated-st10.d.ts +840 -0
  41. package/dist/types/internal/cards/src/generated-st11.d.ts +248 -0
  42. package/dist/types/internal/cards/src/generated-st12.d.ts +832 -0
  43. package/dist/types/internal/cards/src/generated-st13.d.ts +946 -0
  44. package/dist/types/internal/cards/src/generated-st14.d.ts +820 -0
  45. package/dist/types/internal/cards/src/generated-st15.d.ts +246 -0
  46. package/dist/types/internal/cards/src/generated-st16.d.ts +239 -0
  47. package/dist/types/internal/cards/src/generated-st17.d.ts +248 -0
  48. package/dist/types/internal/cards/src/generated-st19.d.ts +256 -0
  49. package/dist/types/internal/cards/src/generated-st20.d.ts +241 -0
  50. package/dist/types/internal/cards/src/generated-st21.d.ts +814 -0
  51. package/dist/types/internal/cards/src/generated-st22.d.ts +822 -0
  52. package/dist/types/internal/cards/src/generated-st24.d.ts +250 -0
  53. package/dist/types/internal/cards/src/generated-st25.d.ts +247 -0
  54. package/dist/types/internal/cards/src/generated-st27.d.ts +258 -0
  55. package/dist/types/internal/cards/src/generated-st29.d.ts +816 -0
  56. package/dist/types/internal/cards/src/generated-st30.d.ts +832 -0
  57. package/dist/types/internal/cards/src/generated.d.ts +4328 -0
  58. package/dist/types/internal/cards/src/index.d.ts +58 -0
  59. package/dist/types/internal/cards/src/op05.d.ts +2 -0
  60. package/dist/types/internal/cards/src/op06.d.ts +2 -0
  61. package/dist/types/internal/cards/src/op07.d.ts +2 -0
  62. package/dist/types/internal/cards/src/op08.d.ts +2 -0
  63. package/dist/types/internal/cards/src/op09.d.ts +2 -0
  64. package/dist/types/internal/cards/src/op10.d.ts +2 -0
  65. package/dist/types/internal/cards/src/op11.d.ts +2 -0
  66. package/dist/types/internal/cards/src/op12.d.ts +2 -0
  67. package/dist/types/internal/cards/src/op13.d.ts +2 -0
  68. package/dist/types/internal/cards/src/op14.d.ts +2 -0
  69. package/dist/types/internal/cards/src/op15.d.ts +2 -0
  70. package/dist/types/internal/cards/src/op16.d.ts +2 -0
  71. package/dist/types/internal/cards/src/op17-rarity.d.ts +3 -0
  72. package/dist/types/internal/cards/src/op17.d.ts +2 -0
  73. package/dist/types/internal/cards/src/p.d.ts +2 -0
  74. package/dist/types/internal/cards/src/prb02.d.ts +2 -0
  75. package/dist/types/internal/cards/src/rules-derivation.d.ts +16 -0
  76. package/dist/types/internal/cards/src/sealed-promo.d.ts +43 -0
  77. package/dist/types/internal/cards/src/st10.d.ts +2 -0
  78. package/dist/types/internal/cards/src/st11.d.ts +2 -0
  79. package/dist/types/internal/cards/src/st12.d.ts +2 -0
  80. package/dist/types/internal/cards/src/st13.d.ts +2 -0
  81. package/dist/types/internal/cards/src/st14.d.ts +2 -0
  82. package/dist/types/internal/cards/src/st15.d.ts +2 -0
  83. package/dist/types/internal/cards/src/st16.d.ts +2 -0
  84. package/dist/types/internal/cards/src/st17.d.ts +2 -0
  85. package/dist/types/internal/cards/src/st19.d.ts +2 -0
  86. package/dist/types/internal/cards/src/st20.d.ts +2 -0
  87. package/dist/types/internal/cards/src/st21.d.ts +2 -0
  88. package/dist/types/internal/cards/src/st22.d.ts +2 -0
  89. package/dist/types/internal/cards/src/st24.d.ts +2 -0
  90. package/dist/types/internal/cards/src/st25.d.ts +2 -0
  91. package/dist/types/internal/cards/src/st27.d.ts +2 -0
  92. package/dist/types/internal/cards/src/st29.d.ts +2 -0
  93. package/dist/types/internal/cards/src/st30.d.ts +2 -0
  94. package/dist/types/internal/cards/src/text.d.ts +20 -0
  95. package/dist/types/internal/cards/src/unimplemented-clauses.d.ts +7 -0
  96. package/dist/types/internal/decks/src/deck-provenance.d.ts +30 -0
  97. package/dist/types/internal/decks/src/decklist.d.ts +3 -0
  98. package/dist/types/internal/decks/src/eb02-luffy-manifest.d.ts +2 -0
  99. package/dist/types/internal/decks/src/eb02-luffy-tournament-manifest.d.ts +2 -0
  100. package/dist/types/internal/decks/src/eb03-vivi-manifest.d.ts +2 -0
  101. package/dist/types/internal/decks/src/eb03-vivi-tournament-manifest.d.ts +2 -0
  102. package/dist/types/internal/decks/src/eb04-bonney-manifest.d.ts +2 -0
  103. package/dist/types/internal/decks/src/eb04-bonney-tournament-manifest.d.ts +2 -0
  104. package/dist/types/internal/decks/src/eb05-robin-manifest.d.ts +2 -0
  105. package/dist/types/internal/decks/src/generated.d.ts +115 -0
  106. package/dist/types/internal/decks/src/index.d.ts +64 -0
  107. package/dist/types/internal/decks/src/legality.d.ts +14 -0
  108. package/dist/types/internal/decks/src/op05-enel-tcgmm-manifest.d.ts +2 -0
  109. package/dist/types/internal/decks/src/op05-luffy-tournament-manifest.d.ts +2 -0
  110. package/dist/types/internal/decks/src/op06-reiju-regional-manifest.d.ts +2 -0
  111. package/dist/types/internal/decks/src/op06-yamato-manifest.d.ts +2 -0
  112. package/dist/types/internal/decks/src/op06-yamato-tournament-manifest.d.ts +2 -0
  113. package/dist/types/internal/decks/src/op07-vegapunk-store-battle-manifest.d.ts +2 -0
  114. package/dist/types/internal/decks/src/op08-pudding-manifest.d.ts +2 -0
  115. package/dist/types/internal/decks/src/op09-buggy-manifest.d.ts +2 -0
  116. package/dist/types/internal/decks/src/op09-buggy-tournament-manifest.d.ts +2 -0
  117. package/dist/types/internal/decks/src/op09-luffy-tournament-manifest.d.ts +2 -0
  118. package/dist/types/internal/decks/src/op09-robin-manifest.d.ts +2 -0
  119. package/dist/types/internal/decks/src/op09-shanks-tournament-manifest.d.ts +2 -0
  120. package/dist/types/internal/decks/src/op10-kid-tournament-manifest.d.ts +2 -0
  121. package/dist/types/internal/decks/src/op10-usopp-manifest.d.ts +2 -0
  122. package/dist/types/internal/decks/src/op11-jinbe-manifest.d.ts +2 -0
  123. package/dist/types/internal/decks/src/op11-jinbe-tournament-manifest.d.ts +2 -0
  124. package/dist/types/internal/decks/src/op11-katakuri-tournament-manifest.d.ts +2 -0
  125. package/dist/types/internal/decks/src/op11-koby-tournament-manifest.d.ts +2 -0
  126. package/dist/types/internal/decks/src/op11-shirahoshi-manifest.d.ts +2 -0
  127. package/dist/types/internal/decks/src/op11-shirahoshi-tournament-manifest.d.ts +2 -0
  128. package/dist/types/internal/decks/src/op12-koala-manifest.d.ts +2 -0
  129. package/dist/types/internal/decks/src/op12-koala-tournament-manifest.d.ts +2 -0
  130. package/dist/types/internal/decks/src/op12-rayleigh-manifest.d.ts +2 -0
  131. package/dist/types/internal/decks/src/op12-rayleigh-tournament-manifest.d.ts +2 -0
  132. package/dist/types/internal/decks/src/op12-sanji-manifest.d.ts +2 -0
  133. package/dist/types/internal/decks/src/op12-sanji-tournament-manifest.d.ts +2 -0
  134. package/dist/types/internal/decks/src/op12-zoro-manifest.d.ts +2 -0
  135. package/dist/types/internal/decks/src/op13-ace-manifest.d.ts +2 -0
  136. package/dist/types/internal/decks/src/op13-ace-tournament-manifest.d.ts +2 -0
  137. package/dist/types/internal/decks/src/op13-imu-manifest.d.ts +2 -0
  138. package/dist/types/internal/decks/src/op13-luffy-miracle-manifest.d.ts +2 -0
  139. package/dist/types/internal/decks/src/op13-roger-manifest.d.ts +2 -0
  140. package/dist/types/internal/decks/src/op13-roger-tournament-manifest.d.ts +2 -0
  141. package/dist/types/internal/decks/src/op13-sabo-tournament-manifest.d.ts +2 -0
  142. package/dist/types/internal/decks/src/op14-crocodile-manifest.d.ts +2 -0
  143. package/dist/types/internal/decks/src/op14-doflamingo-manifest.d.ts +2 -0
  144. package/dist/types/internal/decks/src/op14-doflamingo-tournament-manifest.d.ts +2 -0
  145. package/dist/types/internal/decks/src/op14-hancock-manifest.d.ts +2 -0
  146. package/dist/types/internal/decks/src/op14-hancock-tournament-manifest.d.ts +2 -0
  147. package/dist/types/internal/decks/src/op14-jinbe-manifest.d.ts +2 -0
  148. package/dist/types/internal/decks/src/op14-jinbe-tournament-manifest.d.ts +2 -0
  149. package/dist/types/internal/decks/src/op14-law-manifest.d.ts +2 -0
  150. package/dist/types/internal/decks/src/op14-law-tournament-manifest.d.ts +2 -0
  151. package/dist/types/internal/decks/src/op14-moria-manifest.d.ts +2 -0
  152. package/dist/types/internal/decks/src/op14-moria-tournament-manifest.d.ts +2 -0
  153. package/dist/types/internal/decks/src/op15-brook-manifest.d.ts +2 -0
  154. package/dist/types/internal/decks/src/op15-enel-chinoize-manifest.d.ts +2 -0
  155. package/dist/types/internal/decks/src/op15-krieg-manifest.d.ts +2 -0
  156. package/dist/types/internal/decks/src/op15-lucy-manifest.d.ts +2 -0
  157. package/dist/types/internal/decks/src/op15-luffy-manifest.d.ts +2 -0
  158. package/dist/types/internal/decks/src/op15-rebecca-manifest.d.ts +2 -0
  159. package/dist/types/internal/decks/src/op16-ace-manifest.d.ts +2 -0
  160. package/dist/types/internal/decks/src/op16-ace-open-manifest.d.ts +2 -0
  161. package/dist/types/internal/decks/src/op16-enel-manifest.d.ts +2 -0
  162. package/dist/types/internal/decks/src/op16-nami-manifest.d.ts +2 -0
  163. package/dist/types/internal/decks/src/op16-sengoku-manifest.d.ts +2 -0
  164. package/dist/types/internal/decks/src/op16-teach-manifest.d.ts +2 -0
  165. package/dist/types/internal/decks/src/op16-yamato-manifest.d.ts +2 -0
  166. package/dist/types/internal/decks/src/op17-kaido-field-manifest.d.ts +2 -0
  167. package/dist/types/internal/decks/src/op17-kaido-manifest.d.ts +2 -0
  168. package/dist/types/internal/decks/src/op17-linlin-manifest.d.ts +2 -0
  169. package/dist/types/internal/decks/src/op17-linlin-tournament-manifest.d.ts +2 -0
  170. package/dist/types/internal/decks/src/op17-luffy-ace-manifest.d.ts +2 -0
  171. package/dist/types/internal/decks/src/op17-luffy-manifest.d.ts +2 -0
  172. package/dist/types/internal/decks/src/op17-luffy-tournament-manifest.d.ts +2 -0
  173. package/dist/types/internal/decks/src/op17-newgate-manifest.d.ts +2 -0
  174. package/dist/types/internal/decks/src/op17-shanks-manifest.d.ts +2 -0
  175. package/dist/types/internal/decks/src/op17-shanks-tournament-manifest.d.ts +2 -0
  176. package/dist/types/internal/decks/src/op17-xebec-manifest.d.ts +2 -0
  177. package/dist/types/internal/decks/src/op17-xebec-open-manifest.d.ts +2 -0
  178. package/dist/types/internal/decks/src/sealed.d.ts +73 -0
  179. package/dist/types/internal/decks/src/st18-luffy-manifest.d.ts +2 -0
  180. package/dist/types/internal/decks/src/st21-luffy-open-manifest.d.ts +2 -0
  181. package/dist/types/internal/decks/src/st22-ace-newgate-manifest.d.ts +2 -0
  182. package/dist/types/internal/decks/src/st23-shanks-manifest.d.ts +2 -0
  183. package/dist/types/internal/decks/src/st26-luffy-manifest.d.ts +2 -0
  184. package/dist/types/internal/decks/src/st27-teach-manifest.d.ts +2 -0
  185. package/dist/types/internal/decks/src/st29-luffy-manifest.d.ts +2 -0
  186. package/dist/types/internal/decks/src/st29-luffy-tournament-manifest.d.ts +2 -0
  187. package/dist/types/internal/decks/src/st30-luffy-ace-manifest.d.ts +2 -0
  188. package/dist/types/internal/decks/src/st33-kuzan-tournament-manifest.d.ts +2 -0
  189. package/dist/types/internal/engine-core/src/ability-availability.d.ts +13 -0
  190. package/dist/types/internal/engine-core/src/actions/activate-counter-event.d.ts +2 -0
  191. package/dist/types/internal/engine-core/src/actions/activate-main.d.ts +2 -0
  192. package/dist/types/internal/engine-core/src/actions/attach-don.d.ts +2 -0
  193. package/dist/types/internal/engine-core/src/actions/attack.d.ts +2 -0
  194. package/dist/types/internal/engine-core/src/actions/block.d.ts +2 -0
  195. package/dist/types/internal/engine-core/src/actions/context.d.ts +19 -0
  196. package/dist/types/internal/engine-core/src/actions/counter.d.ts +2 -0
  197. package/dist/types/internal/engine-core/src/actions/index.d.ts +3 -0
  198. package/dist/types/internal/engine-core/src/actions/mulligan-decision.d.ts +2 -0
  199. package/dist/types/internal/engine-core/src/actions/pass.d.ts +2 -0
  200. package/dist/types/internal/engine-core/src/actions/play-card.d.ts +2 -0
  201. package/dist/types/internal/engine-core/src/actions/resolve-effect.d.ts +2 -0
  202. package/dist/types/internal/engine-core/src/actions/resolve-trigger.d.ts +2 -0
  203. package/dist/types/internal/engine-core/src/base-power.d.ts +4 -0
  204. package/dist/types/internal/engine-core/src/battle.d.ts +34 -0
  205. package/dist/types/internal/engine-core/src/board.d.ts +40 -0
  206. package/dist/types/internal/engine-core/src/canonical.d.ts +2 -0
  207. package/dist/types/internal/engine-core/src/card-mechanics.d.ts +57 -0
  208. package/dist/types/internal/engine-core/src/clone.d.ts +1 -0
  209. package/dist/types/internal/engine-core/src/condition-text.d.ts +3 -0
  210. package/dist/types/internal/engine-core/src/damage-replacement.d.ts +8 -0
  211. package/dist/types/internal/engine-core/src/don.d.ts +18 -0
  212. package/dist/types/internal/engine-core/src/effect-options.d.ts +4 -0
  213. package/dist/types/internal/engine-core/src/effects.d.ts +50 -0
  214. package/dist/types/internal/engine-core/src/engine.d.ts +31 -0
  215. package/dist/types/internal/engine-core/src/errors.d.ts +4 -0
  216. package/dist/types/internal/engine-core/src/event-text.d.ts +14 -0
  217. package/dist/types/internal/engine-core/src/hand-price.d.ts +7 -0
  218. package/dist/types/internal/engine-core/src/index.d.ts +26 -0
  219. package/dist/types/internal/engine-core/src/invariants.d.ts +10 -0
  220. package/dist/types/internal/engine-core/src/legal-actions/action-costs.d.ts +13 -0
  221. package/dist/types/internal/engine-core/src/legal-actions/block.d.ts +4 -0
  222. package/dist/types/internal/engine-core/src/legal-actions/counter.d.ts +4 -0
  223. package/dist/types/internal/engine-core/src/legal-actions/index.d.ts +6 -0
  224. package/dist/types/internal/engine-core/src/legal-actions/main/activations.d.ts +4 -0
  225. package/dist/types/internal/engine-core/src/legal-actions/main/attacks.d.ts +4 -0
  226. package/dist/types/internal/engine-core/src/legal-actions/main/don.d.ts +4 -0
  227. package/dist/types/internal/engine-core/src/legal-actions/main/hand.d.ts +4 -0
  228. package/dist/types/internal/engine-core/src/legal-actions/main/index.d.ts +4 -0
  229. package/dist/types/internal/engine-core/src/legal-actions/main/pass.d.ts +3 -0
  230. package/dist/types/internal/engine-core/src/legal-actions/mulligan.d.ts +3 -0
  231. package/dist/types/internal/engine-core/src/legal-actions/pending-effect.d.ts +4 -0
  232. package/dist/types/internal/engine-core/src/legal-actions/trigger.d.ts +3 -0
  233. package/dist/types/internal/engine-core/src/life.d.ts +27 -0
  234. package/dist/types/internal/engine-core/src/mechanic-choices.d.ts +14 -0
  235. package/dist/types/internal/engine-core/src/mechanic-conditions.d.ts +21 -0
  236. package/dist/types/internal/engine-core/src/mechanic-dsl.d.ts +696 -0
  237. package/dist/types/internal/engine-core/src/mechanics/eb01-battle.d.ts +2 -0
  238. package/dist/types/internal/engine-core/src/mechanics/eb01-main.d.ts +7 -0
  239. package/dist/types/internal/engine-core/src/mechanics/eb01-on-play.d.ts +7 -0
  240. package/dist/types/internal/engine-core/src/mechanics/eb01-reactions.d.ts +2 -0
  241. package/dist/types/internal/engine-core/src/mechanics/eb01-replacements.d.ts +2 -0
  242. package/dist/types/internal/engine-core/src/mechanics/eb01-shared.d.ts +7 -0
  243. package/dist/types/internal/engine-core/src/mechanics/eb01-static.d.ts +2 -0
  244. package/dist/types/internal/engine-core/src/mechanics/eb01-triggers.d.ts +2 -0
  245. package/dist/types/internal/engine-core/src/mechanics/eb02-battle.d.ts +2 -0
  246. package/dist/types/internal/engine-core/src/mechanics/eb02-main.d.ts +2 -0
  247. package/dist/types/internal/engine-core/src/mechanics/eb02-on-play.d.ts +8 -0
  248. package/dist/types/internal/engine-core/src/mechanics/eb02-reactions.d.ts +2 -0
  249. package/dist/types/internal/engine-core/src/mechanics/eb02-shared.d.ts +4 -0
  250. package/dist/types/internal/engine-core/src/mechanics/eb02-static.d.ts +2 -0
  251. package/dist/types/internal/engine-core/src/mechanics/eb02-triggers.d.ts +2 -0
  252. package/dist/types/internal/engine-core/src/mechanics/eb03-battle.d.ts +2 -0
  253. package/dist/types/internal/engine-core/src/mechanics/eb03-main.d.ts +5 -0
  254. package/dist/types/internal/engine-core/src/mechanics/eb03-on-play.d.ts +40 -0
  255. package/dist/types/internal/engine-core/src/mechanics/eb03-reactions.d.ts +2 -0
  256. package/dist/types/internal/engine-core/src/mechanics/eb03-replacements.d.ts +2 -0
  257. package/dist/types/internal/engine-core/src/mechanics/eb03-static.d.ts +3 -0
  258. package/dist/types/internal/engine-core/src/mechanics/eb03-triggers.d.ts +2 -0
  259. package/dist/types/internal/engine-core/src/mechanics/eb04-battle.d.ts +2 -0
  260. package/dist/types/internal/engine-core/src/mechanics/eb04-bonney.d.ts +2 -0
  261. package/dist/types/internal/engine-core/src/mechanics/eb04-main.d.ts +5 -0
  262. package/dist/types/internal/engine-core/src/mechanics/eb04-on-play.d.ts +5 -0
  263. package/dist/types/internal/engine-core/src/mechanics/eb04-reactions.d.ts +2 -0
  264. package/dist/types/internal/engine-core/src/mechanics/eb04-replacements.d.ts +2 -0
  265. package/dist/types/internal/engine-core/src/mechanics/eb04-static.d.ts +3 -0
  266. package/dist/types/internal/engine-core/src/mechanics/eb04-triggers.d.ts +2 -0
  267. package/dist/types/internal/engine-core/src/mechanics/eb05-battle.d.ts +2 -0
  268. package/dist/types/internal/engine-core/src/mechanics/eb05-main.d.ts +4 -0
  269. package/dist/types/internal/engine-core/src/mechanics/eb05-on-play.d.ts +4 -0
  270. package/dist/types/internal/engine-core/src/mechanics/eb05-reactions.d.ts +2 -0
  271. package/dist/types/internal/engine-core/src/mechanics/eb05-replacements.d.ts +2 -0
  272. package/dist/types/internal/engine-core/src/mechanics/eb05-shared.d.ts +12 -0
  273. package/dist/types/internal/engine-core/src/mechanics/eb05-static.d.ts +3 -0
  274. package/dist/types/internal/engine-core/src/mechanics/eb05-triggers.d.ts +2 -0
  275. package/dist/types/internal/engine-core/src/mechanics/format-static.d.ts +2 -0
  276. package/dist/types/internal/engine-core/src/mechanics/format.d.ts +2 -0
  277. package/dist/types/internal/engine-core/src/mechanics/index.d.ts +15 -0
  278. package/dist/types/internal/engine-core/src/mechanics/op02.d.ts +2 -0
  279. package/dist/types/internal/engine-core/src/mechanics/op03-static.d.ts +2 -0
  280. package/dist/types/internal/engine-core/src/mechanics/op03.d.ts +2 -0
  281. package/dist/types/internal/engine-core/src/mechanics/op04-static.d.ts +2 -0
  282. package/dist/types/internal/engine-core/src/mechanics/op04.d.ts +2 -0
  283. package/dist/types/internal/engine-core/src/mechanics/op05-battle.d.ts +2 -0
  284. package/dist/types/internal/engine-core/src/mechanics/op05-main.d.ts +6 -0
  285. package/dist/types/internal/engine-core/src/mechanics/op05-on-play.d.ts +5 -0
  286. package/dist/types/internal/engine-core/src/mechanics/op05-reactions.d.ts +2 -0
  287. package/dist/types/internal/engine-core/src/mechanics/op05-replacements.d.ts +2 -0
  288. package/dist/types/internal/engine-core/src/mechanics/op05-shared.d.ts +17 -0
  289. package/dist/types/internal/engine-core/src/mechanics/op05-static.d.ts +2 -0
  290. package/dist/types/internal/engine-core/src/mechanics/op05-triggers.d.ts +2 -0
  291. package/dist/types/internal/engine-core/src/mechanics/op06-battle.d.ts +2 -0
  292. package/dist/types/internal/engine-core/src/mechanics/op06-main.d.ts +8 -0
  293. package/dist/types/internal/engine-core/src/mechanics/op06-on-play.d.ts +2 -0
  294. package/dist/types/internal/engine-core/src/mechanics/op06-reactions.d.ts +2 -0
  295. package/dist/types/internal/engine-core/src/mechanics/op06-shared.d.ts +18 -0
  296. package/dist/types/internal/engine-core/src/mechanics/op06-static.d.ts +3 -0
  297. package/dist/types/internal/engine-core/src/mechanics/op06-triggers.d.ts +2 -0
  298. package/dist/types/internal/engine-core/src/mechanics/op06-yamato.d.ts +2 -0
  299. package/dist/types/internal/engine-core/src/mechanics/op07-battle.d.ts +2 -0
  300. package/dist/types/internal/engine-core/src/mechanics/op07-main.d.ts +2 -0
  301. package/dist/types/internal/engine-core/src/mechanics/op07-on-play.d.ts +2 -0
  302. package/dist/types/internal/engine-core/src/mechanics/op07-reactions.d.ts +2 -0
  303. package/dist/types/internal/engine-core/src/mechanics/op07-replacements.d.ts +2 -0
  304. package/dist/types/internal/engine-core/src/mechanics/op07-shared.d.ts +19 -0
  305. package/dist/types/internal/engine-core/src/mechanics/op07-static.d.ts +3 -0
  306. package/dist/types/internal/engine-core/src/mechanics/op07-triggers.d.ts +2 -0
  307. package/dist/types/internal/engine-core/src/mechanics/op08-battle.d.ts +2 -0
  308. package/dist/types/internal/engine-core/src/mechanics/op08-main.d.ts +6 -0
  309. package/dist/types/internal/engine-core/src/mechanics/op08-on-play.d.ts +4 -0
  310. package/dist/types/internal/engine-core/src/mechanics/op08-reactions.d.ts +2 -0
  311. package/dist/types/internal/engine-core/src/mechanics/op08-replacements.d.ts +2 -0
  312. package/dist/types/internal/engine-core/src/mechanics/op08-shared.d.ts +14 -0
  313. package/dist/types/internal/engine-core/src/mechanics/op08-static.d.ts +3 -0
  314. package/dist/types/internal/engine-core/src/mechanics/op08-triggers.d.ts +10 -0
  315. package/dist/types/internal/engine-core/src/mechanics/op09-battle.d.ts +2 -0
  316. package/dist/types/internal/engine-core/src/mechanics/op09-main.d.ts +2 -0
  317. package/dist/types/internal/engine-core/src/mechanics/op09-on-play.d.ts +2 -0
  318. package/dist/types/internal/engine-core/src/mechanics/op09-reactions.d.ts +2 -0
  319. package/dist/types/internal/engine-core/src/mechanics/op09-replacements.d.ts +2 -0
  320. package/dist/types/internal/engine-core/src/mechanics/op09-shared.d.ts +4 -0
  321. package/dist/types/internal/engine-core/src/mechanics/op09-static.d.ts +3 -0
  322. package/dist/types/internal/engine-core/src/mechanics/op09-triggers.d.ts +2 -0
  323. package/dist/types/internal/engine-core/src/mechanics/op10-battle.d.ts +2 -0
  324. package/dist/types/internal/engine-core/src/mechanics/op10-main.d.ts +4 -0
  325. package/dist/types/internal/engine-core/src/mechanics/op10-on-play.d.ts +2 -0
  326. package/dist/types/internal/engine-core/src/mechanics/op10-reactions.d.ts +2 -0
  327. package/dist/types/internal/engine-core/src/mechanics/op10-replacements.d.ts +2 -0
  328. package/dist/types/internal/engine-core/src/mechanics/op10-shared.d.ts +8 -0
  329. package/dist/types/internal/engine-core/src/mechanics/op10-static.d.ts +3 -0
  330. package/dist/types/internal/engine-core/src/mechanics/op10-triggers.d.ts +2 -0
  331. package/dist/types/internal/engine-core/src/mechanics/op11-battle.d.ts +2 -0
  332. package/dist/types/internal/engine-core/src/mechanics/op11-main.d.ts +4 -0
  333. package/dist/types/internal/engine-core/src/mechanics/op11-on-play.d.ts +2 -0
  334. package/dist/types/internal/engine-core/src/mechanics/op11-reactions.d.ts +2 -0
  335. package/dist/types/internal/engine-core/src/mechanics/op11-replacements.d.ts +2 -0
  336. package/dist/types/internal/engine-core/src/mechanics/op11-shared.d.ts +9 -0
  337. package/dist/types/internal/engine-core/src/mechanics/op11-static.d.ts +3 -0
  338. package/dist/types/internal/engine-core/src/mechanics/op11-triggers.d.ts +2 -0
  339. package/dist/types/internal/engine-core/src/mechanics/op12-battle.d.ts +2 -0
  340. package/dist/types/internal/engine-core/src/mechanics/op12-main.d.ts +6 -0
  341. package/dist/types/internal/engine-core/src/mechanics/op12-on-play.d.ts +10 -0
  342. package/dist/types/internal/engine-core/src/mechanics/op12-reactions.d.ts +2 -0
  343. package/dist/types/internal/engine-core/src/mechanics/op12-replacements.d.ts +2 -0
  344. package/dist/types/internal/engine-core/src/mechanics/op12-rosinante.d.ts +2 -0
  345. package/dist/types/internal/engine-core/src/mechanics/op12-shared.d.ts +2 -0
  346. package/dist/types/internal/engine-core/src/mechanics/op12-static.d.ts +3 -0
  347. package/dist/types/internal/engine-core/src/mechanics/op12-triggers.d.ts +5 -0
  348. package/dist/types/internal/engine-core/src/mechanics/op13-battle.d.ts +4 -0
  349. package/dist/types/internal/engine-core/src/mechanics/op13-main.d.ts +8 -0
  350. package/dist/types/internal/engine-core/src/mechanics/op13-on-play.d.ts +5 -0
  351. package/dist/types/internal/engine-core/src/mechanics/op13-reactions.d.ts +2 -0
  352. package/dist/types/internal/engine-core/src/mechanics/op13-replacements.d.ts +2 -0
  353. package/dist/types/internal/engine-core/src/mechanics/op13-shared.d.ts +7 -0
  354. package/dist/types/internal/engine-core/src/mechanics/op13-static.d.ts +3 -0
  355. package/dist/types/internal/engine-core/src/mechanics/op13-triggers.d.ts +2 -0
  356. package/dist/types/internal/engine-core/src/mechanics/op14-battle.d.ts +2 -0
  357. package/dist/types/internal/engine-core/src/mechanics/op14-main.d.ts +4 -0
  358. package/dist/types/internal/engine-core/src/mechanics/op14-mihawk.d.ts +2 -0
  359. package/dist/types/internal/engine-core/src/mechanics/op14-on-play.d.ts +2 -0
  360. package/dist/types/internal/engine-core/src/mechanics/op14-reactions.d.ts +2 -0
  361. package/dist/types/internal/engine-core/src/mechanics/op14-replacements.d.ts +2 -0
  362. package/dist/types/internal/engine-core/src/mechanics/op14-shared.d.ts +7 -0
  363. package/dist/types/internal/engine-core/src/mechanics/op14-static.d.ts +2 -0
  364. package/dist/types/internal/engine-core/src/mechanics/op14-triggers.d.ts +2 -0
  365. package/dist/types/internal/engine-core/src/mechanics/op15-battle.d.ts +2 -0
  366. package/dist/types/internal/engine-core/src/mechanics/op15-main.d.ts +2 -0
  367. package/dist/types/internal/engine-core/src/mechanics/op15-on-play.d.ts +2 -0
  368. package/dist/types/internal/engine-core/src/mechanics/op15-reactions.d.ts +2 -0
  369. package/dist/types/internal/engine-core/src/mechanics/op15-shared.d.ts +4 -0
  370. package/dist/types/internal/engine-core/src/mechanics/op15-static.d.ts +3 -0
  371. package/dist/types/internal/engine-core/src/mechanics/op15-triggers.d.ts +2 -0
  372. package/dist/types/internal/engine-core/src/mechanics/op16-ace.d.ts +2 -0
  373. package/dist/types/internal/engine-core/src/mechanics/op16-battle.d.ts +2 -0
  374. package/dist/types/internal/engine-core/src/mechanics/op16-enel.d.ts +2 -0
  375. package/dist/types/internal/engine-core/src/mechanics/op16-luffy.d.ts +2 -0
  376. package/dist/types/internal/engine-core/src/mechanics/op16-main.d.ts +2 -0
  377. package/dist/types/internal/engine-core/src/mechanics/op16-nami.d.ts +2 -0
  378. package/dist/types/internal/engine-core/src/mechanics/op16-on-play.d.ts +2 -0
  379. package/dist/types/internal/engine-core/src/mechanics/op16-reactions.d.ts +2 -0
  380. package/dist/types/internal/engine-core/src/mechanics/op16-replacements.d.ts +2 -0
  381. package/dist/types/internal/engine-core/src/mechanics/op16-shared.d.ts +8 -0
  382. package/dist/types/internal/engine-core/src/mechanics/op16-static.d.ts +2 -0
  383. package/dist/types/internal/engine-core/src/mechanics/op16-teach.d.ts +2 -0
  384. package/dist/types/internal/engine-core/src/mechanics/op16-triggers.d.ts +4 -0
  385. package/dist/types/internal/engine-core/src/mechanics/op17-battle.d.ts +2 -0
  386. package/dist/types/internal/engine-core/src/mechanics/op17-kaido.d.ts +2 -0
  387. package/dist/types/internal/engine-core/src/mechanics/op17-luffy-ace.d.ts +2 -0
  388. package/dist/types/internal/engine-core/src/mechanics/op17-main.d.ts +2 -0
  389. package/dist/types/internal/engine-core/src/mechanics/op17-meta.d.ts +2 -0
  390. package/dist/types/internal/engine-core/src/mechanics/op17-on-play.d.ts +2 -0
  391. package/dist/types/internal/engine-core/src/mechanics/op17-replacements.d.ts +2 -0
  392. package/dist/types/internal/engine-core/src/mechanics/op17-static.d.ts +2 -0
  393. package/dist/types/internal/engine-core/src/mechanics/op17-triggers.d.ts +2 -0
  394. package/dist/types/internal/engine-core/src/mechanics/prb02-battle.d.ts +2 -0
  395. package/dist/types/internal/engine-core/src/mechanics/prb02-on-play.d.ts +2 -0
  396. package/dist/types/internal/engine-core/src/mechanics/prb02-replacements.d.ts +2 -0
  397. package/dist/types/internal/engine-core/src/mechanics/prb02-static.d.ts +2 -0
  398. package/dist/types/internal/engine-core/src/mechanics/prb02-triggers.d.ts +2 -0
  399. package/dist/types/internal/engine-core/src/mechanics/promo-battle.d.ts +2 -0
  400. package/dist/types/internal/engine-core/src/mechanics/promo-main.d.ts +6 -0
  401. package/dist/types/internal/engine-core/src/mechanics/promo-on-play.d.ts +2 -0
  402. package/dist/types/internal/engine-core/src/mechanics/promo-reactions.d.ts +2 -0
  403. package/dist/types/internal/engine-core/src/mechanics/promo-replacements.d.ts +2 -0
  404. package/dist/types/internal/engine-core/src/mechanics/promo-shared.d.ts +4 -0
  405. package/dist/types/internal/engine-core/src/mechanics/promo-static.d.ts +3 -0
  406. package/dist/types/internal/engine-core/src/mechanics/promo-triggers.d.ts +2 -0
  407. package/dist/types/internal/engine-core/src/mechanics/reaction-shared.d.ts +7 -0
  408. package/dist/types/internal/engine-core/src/mechanics/registry.d.ts +29 -0
  409. package/dist/types/internal/engine-core/src/mechanics/shared.d.ts +53 -0
  410. package/dist/types/internal/engine-core/src/mechanics/st-main.d.ts +2 -0
  411. package/dist/types/internal/engine-core/src/mechanics/st01.d.ts +2 -0
  412. package/dist/types/internal/engine-core/src/mechanics/st02.d.ts +2 -0
  413. package/dist/types/internal/engine-core/src/mechanics/st06.d.ts +2 -0
  414. package/dist/types/internal/engine-core/src/mechanics/st10-battle.d.ts +2 -0
  415. package/dist/types/internal/engine-core/src/mechanics/st10-main.d.ts +2 -0
  416. package/dist/types/internal/engine-core/src/mechanics/st10-on-play.d.ts +2 -0
  417. package/dist/types/internal/engine-core/src/mechanics/st10-reactions.d.ts +2 -0
  418. package/dist/types/internal/engine-core/src/mechanics/st10-shared.d.ts +5 -0
  419. package/dist/types/internal/engine-core/src/mechanics/st10-static.d.ts +2 -0
  420. package/dist/types/internal/engine-core/src/mechanics/st10-triggers.d.ts +2 -0
  421. package/dist/types/internal/engine-core/src/mechanics/st11.d.ts +2 -0
  422. package/dist/types/internal/engine-core/src/mechanics/st12-battle.d.ts +2 -0
  423. package/dist/types/internal/engine-core/src/mechanics/st12-main.d.ts +4 -0
  424. package/dist/types/internal/engine-core/src/mechanics/st12-on-play.d.ts +2 -0
  425. package/dist/types/internal/engine-core/src/mechanics/st12-shared.d.ts +2 -0
  426. package/dist/types/internal/engine-core/src/mechanics/st12-triggers.d.ts +2 -0
  427. package/dist/types/internal/engine-core/src/mechanics/st13-main.d.ts +2 -0
  428. package/dist/types/internal/engine-core/src/mechanics/st13-on-play.d.ts +2 -0
  429. package/dist/types/internal/engine-core/src/mechanics/st13-shared.d.ts +9 -0
  430. package/dist/types/internal/engine-core/src/mechanics/st13-static.d.ts +2 -0
  431. package/dist/types/internal/engine-core/src/mechanics/st13-triggers.d.ts +2 -0
  432. package/dist/types/internal/engine-core/src/mechanics/st14-battle.d.ts +2 -0
  433. package/dist/types/internal/engine-core/src/mechanics/st14-main.d.ts +2 -0
  434. package/dist/types/internal/engine-core/src/mechanics/st14-on-play.d.ts +2 -0
  435. package/dist/types/internal/engine-core/src/mechanics/st14-shared.d.ts +5 -0
  436. package/dist/types/internal/engine-core/src/mechanics/st14-static.d.ts +3 -0
  437. package/dist/types/internal/engine-core/src/mechanics/st14-triggers.d.ts +2 -0
  438. package/dist/types/internal/engine-core/src/mechanics/st15-static.d.ts +2 -0
  439. package/dist/types/internal/engine-core/src/mechanics/st15.d.ts +2 -0
  440. package/dist/types/internal/engine-core/src/mechanics/st16-static.d.ts +2 -0
  441. package/dist/types/internal/engine-core/src/mechanics/st16.d.ts +2 -0
  442. package/dist/types/internal/engine-core/src/mechanics/st17.d.ts +2 -0
  443. package/dist/types/internal/engine-core/src/mechanics/st18.d.ts +2 -0
  444. package/dist/types/internal/engine-core/src/mechanics/st19-static.d.ts +2 -0
  445. package/dist/types/internal/engine-core/src/mechanics/st19.d.ts +2 -0
  446. package/dist/types/internal/engine-core/src/mechanics/st20.d.ts +2 -0
  447. package/dist/types/internal/engine-core/src/mechanics/st21-battle.d.ts +2 -0
  448. package/dist/types/internal/engine-core/src/mechanics/st21-main.d.ts +2 -0
  449. package/dist/types/internal/engine-core/src/mechanics/st21-shared.d.ts +2 -0
  450. package/dist/types/internal/engine-core/src/mechanics/st21-static.d.ts +2 -0
  451. package/dist/types/internal/engine-core/src/mechanics/st21-triggers.d.ts +2 -0
  452. package/dist/types/internal/engine-core/src/mechanics/st21.d.ts +2 -0
  453. package/dist/types/internal/engine-core/src/mechanics/st22-battle.d.ts +2 -0
  454. package/dist/types/internal/engine-core/src/mechanics/st22-main.d.ts +2 -0
  455. package/dist/types/internal/engine-core/src/mechanics/st22-on-play.d.ts +2 -0
  456. package/dist/types/internal/engine-core/src/mechanics/st22-replacements.d.ts +2 -0
  457. package/dist/types/internal/engine-core/src/mechanics/st22-shared.d.ts +2 -0
  458. package/dist/types/internal/engine-core/src/mechanics/st22-triggers.d.ts +2 -0
  459. package/dist/types/internal/engine-core/src/mechanics/st23-static.d.ts +2 -0
  460. package/dist/types/internal/engine-core/src/mechanics/st23.d.ts +2 -0
  461. package/dist/types/internal/engine-core/src/mechanics/st24.d.ts +2 -0
  462. package/dist/types/internal/engine-core/src/mechanics/st25-static.d.ts +2 -0
  463. package/dist/types/internal/engine-core/src/mechanics/st25.d.ts +2 -0
  464. package/dist/types/internal/engine-core/src/mechanics/st26-static.d.ts +2 -0
  465. package/dist/types/internal/engine-core/src/mechanics/st26.d.ts +2 -0
  466. package/dist/types/internal/engine-core/src/mechanics/st27-static.d.ts +2 -0
  467. package/dist/types/internal/engine-core/src/mechanics/st27.d.ts +2 -0
  468. package/dist/types/internal/engine-core/src/mechanics/st28-static.d.ts +2 -0
  469. package/dist/types/internal/engine-core/src/mechanics/st29-battle.d.ts +4 -0
  470. package/dist/types/internal/engine-core/src/mechanics/st29-main.d.ts +2 -0
  471. package/dist/types/internal/engine-core/src/mechanics/st29-on-play.d.ts +2 -0
  472. package/dist/types/internal/engine-core/src/mechanics/st29-replacements.d.ts +2 -0
  473. package/dist/types/internal/engine-core/src/mechanics/st29-shared.d.ts +2 -0
  474. package/dist/types/internal/engine-core/src/mechanics/st29-static.d.ts +2 -0
  475. package/dist/types/internal/engine-core/src/mechanics/st29-triggers.d.ts +4 -0
  476. package/dist/types/internal/engine-core/src/mechanics/st30-battle.d.ts +2 -0
  477. package/dist/types/internal/engine-core/src/mechanics/st30-main.d.ts +2 -0
  478. package/dist/types/internal/engine-core/src/mechanics/st30-on-play.d.ts +2 -0
  479. package/dist/types/internal/engine-core/src/mechanics/st30-replacements.d.ts +2 -0
  480. package/dist/types/internal/engine-core/src/mechanics/st30-shared.d.ts +4 -0
  481. package/dist/types/internal/engine-core/src/mechanics/st30-static.d.ts +2 -0
  482. package/dist/types/internal/engine-core/src/mechanics/st30-triggers.d.ts +2 -0
  483. package/dist/types/internal/engine-core/src/mechanics/static-shared.d.ts +37 -0
  484. package/dist/types/internal/engine-core/src/mechanics/types.d.ts +177 -0
  485. package/dist/types/internal/engine-core/src/mechanics-replacements.d.ts +10 -0
  486. package/dist/types/internal/engine-core/src/mechanics.d.ts +45 -0
  487. package/dist/types/internal/engine-core/src/model.d.ts +719 -0
  488. package/dist/types/internal/engine-core/src/offered-action.d.ts +9 -0
  489. package/dist/types/internal/engine-core/src/on-play-handlers.d.ts +8 -0
  490. package/dist/types/internal/engine-core/src/pending.d.ts +13 -0
  491. package/dist/types/internal/engine-core/src/program-analysis.d.ts +26 -0
  492. package/dist/types/internal/engine-core/src/provenance.d.ts +8 -0
  493. package/dist/types/internal/engine-core/src/queries.d.ts +26 -0
  494. package/dist/types/internal/engine-core/src/random-walk.d.ts +7 -0
  495. package/dist/types/internal/engine-core/src/reaction-rules.d.ts +60 -0
  496. package/dist/types/internal/engine-core/src/removal.d.ts +16 -0
  497. package/dist/types/internal/engine-core/src/replacement-eligibility.d.ts +16 -0
  498. package/dist/types/internal/engine-core/src/replay.d.ts +21 -0
  499. package/dist/types/internal/engine-core/src/resolve-effect/context.d.ts +15 -0
  500. package/dist/types/internal/engine-core/src/resolve-effect/costs.d.ts +10 -0
  501. package/dist/types/internal/engine-core/src/resolve-effect/deck.d.ts +6 -0
  502. package/dist/types/internal/engine-core/src/resolve-effect/discards.d.ts +11 -0
  503. package/dist/types/internal/engine-core/src/resolve-effect/don.d.ts +4 -0
  504. package/dist/types/internal/engine-core/src/resolve-effect/index.d.ts +3 -0
  505. package/dist/types/internal/engine-core/src/resolve-effect/leaders.d.ts +6 -0
  506. package/dist/types/internal/engine-core/src/resolve-effect/life.d.ts +6 -0
  507. package/dist/types/internal/engine-core/src/resolve-effect/mechanic-choice.d.ts +3 -0
  508. package/dist/types/internal/engine-core/src/resolve-effect/plays.d.ts +5 -0
  509. package/dist/types/internal/engine-core/src/resolve-effect/removal.d.ts +7 -0
  510. package/dist/types/internal/engine-core/src/resolve-effect/replacements.d.ts +7 -0
  511. package/dist/types/internal/engine-core/src/resolve-effect/restrictions.d.ts +7 -0
  512. package/dist/types/internal/engine-core/src/rng.d.ts +1 -0
  513. package/dist/types/internal/engine-core/src/rules-version.d.ts +1 -0
  514. package/dist/types/internal/engine-core/src/service.d.ts +25 -0
  515. package/dist/types/internal/engine-core/src/sha256.d.ts +1 -0
  516. package/dist/types/internal/engine-core/src/simulate.d.ts +19 -0
  517. package/dist/types/internal/engine-core/src/static-abilities.d.ts +102 -0
  518. package/dist/types/internal/engine-core/src/time-limit.d.ts +7 -0
  519. package/dist/types/internal/engine-core/src/turn.d.ts +9 -0
  520. package/dist/types/internal/protocol/src/index.d.ts +756 -0
  521. package/dist/types/internal/protocol/src/rng.d.ts +12 -0
  522. package/dist/types/internal/protocol/src/sha256.d.ts +3 -0
  523. package/dist/types/internal/protocol/src/version.d.ts +1 -0
  524. package/dist/types/protocol.d.ts +1 -0
  525. package/package.json +44 -3
package/dist/engine.js ADDED
@@ -0,0 +1 @@
1
+ import{PAYOFF_KINDS,PROTOCOL_VERSION,TIME_LIMIT_ADDITIONAL_TURNS,nextInt,seedRng,sha256Hex,shuffle}from"./chunks/chunk-5QCGQIMI.js";import{cardAttributes,cardNames,cardRegistry,cards,clauseParts,clauseText,counterClauseParts,hasCardAttribute,hasCardName,hasCardType,hasCardTypeIncluding,printedClauses}from"./chunks/chunk-4I54H2QI.js";var EngineError=class extends Error{constructor(code,message){super(message);this.code=code}code};function storedBasePower(setters,turn){let highest;for(const setter of setters??[]){if(setter.expiresAtTurn<turn)continue;if(highest===void 0||setter.value>highest)highest=setter.value}return highest}function outlasts(a,b){if(a.expiresAtTurn!==b.expiresAtTurn)return a.expiresAtTurn>b.expiresAtTurn;return!a.battleScoped||Boolean(b.battleScoped)}function withBasePowerSetter(setters,added,turn){const live=[...setters??[],added].filter(setter=>setter.expiresAtTurn>=turn);return live.filter((setter,index)=>!live.some((other,otherIndex)=>otherIndex!==index&&other.value>=setter.value&&outlasts(other,setter)&&!(otherIndex>index&&other.value===setter.value&&outlasts(setter,other))))}function withoutBasePowerSetters(setters,drop){const kept=(setters??[]).filter(setter=>!drop(setter));return kept.length>0?kept:void 0}var opponentOf=playerId=>playerId==="p1"?"p2":"p1";function costOf(state,playerId,card,db=cards){const printed=db.require(card.cardNumber).cost??0;const temporary=(card.costModifiers??[]).filter(modifier=>modifier.expiresAtTurn>=state.turn).reduce((total,modifier)=>total+modifier.amount,0);return Math.max(0,printed+temporary+staticCostDelta(state,playerId,card,db))}var trashEventCount=(state,playerId,db)=>state.players[playerId].trash.filter(card=>db.require(card.cardNumber).category==="event").length;function effectsNegated(state,instanceId){if((state.negatedEffects??[]).some(entry=>entry.instanceId===instanceId&&entry.expiresAtTurn>=state.turn)){return true}return continuouslyNegated(state,instanceId)}function continuouslyNegated(state,instanceId){for(const playerId of["p1","p2"]){const player=state.players[playerId];const roger=player.board.some(card=>card.cardNumber==="OP13-064");if(!roger)continue;if(instanceId===`${playerId}-leader`)return true;const own=player.board.find(card=>card.instanceId===instanceId);if(own){return!hasCardTypeIncluding(own.cardNumber,"Roger Pirates")}}return false}function leaderEffectsNegated(state,playerId){return effectsNegated(state,`${playerId}-leader`)}function negateEffects(state,instanceId,expiresAtTurn){if(effectsNegated(state,instanceId))return;state.negatedEffects=[...state.negatedEffects??[],{instanceId,expiresAtTurn}]}function clearExpiredNegations(state){if(!state.negatedEffects)return;const live=state.negatedEffects.filter(entry=>entry.expiresAtTurn>state.turn);if(live.length===0)delete state.negatedEffects;else state.negatedEffects=live}var REMOVAL_IMMUNITIES=[];var STATIC_OWN_DON_CEILING_CARDS=new Set;var STATIC_OPPONENT_DON_READERS=new Set;function collectDonReaders(){const own=new Set;const opponent=new Set;for(const row of[...STATIC_ABILITIES,...REMOVAL_IMMUNITIES]){for(const read of row.readsDon??[]){(read==="own-ceiling"?own:opponent).add(row.cardNumber)}}STATIC_OWN_DON_CEILING_CARDS=own;STATIC_OPPONENT_DON_READERS=opponent}function registerRemovalImmunities(immunities){REMOVAL_IMMUNITIES=immunities;collectDonReaders()}function immunityHolds(immunity,state,ownerId,card,removalKind,source){return(immunity.koOnly!==true||removalKind==="ko")&&(immunity.bySource===void 0||source!==void 0&&immunity.bySource(source))&&(immunity.when?.(state,ownerId,card)??true)}function isRestImmune(state,playerId,card,db=cards){const own=bySelf.get(card.cardNumber);if(!own||effectsNegated(state,card.instanceId))return false;const context={state,playerId,card,isLeader:false,db};return own.some(ability=>ability.restImmune?.(context)===true)}function characterEffectsSwitchedOff(state,playerId,card){if(effectsNegated(state,card.instanceId))return true;return card.cardNumber==="OP14-056"&&state.handTrashedByEffectOnTurn?.[playerId]===state.turn}function isRemovalImmune(state,ownerId,card,sourcePlayerId,sourceCardNumber,db=cards,removalKind="ko",sourceInstanceId){const source=sourceCardNumber===void 0?void 0:db.get(sourceCardNumber);if(sourcePlayerId!==ownerId&&state.players[sourcePlayerId].leaderCardNumber==="OP14-079"&&!leaderEffectsNegated(state,sourcePlayerId)){return true}if(!effectsNegated(state,card.instanceId)&&REMOVAL_IMMUNITIES.some(immunity=>immunity.from==="any"&&immunity.protects===void 0&&immunity.cardNumber===card.cardNumber&&immunityHolds(immunity,state,ownerId,card,removalKind,source))){return true}if(removalKind==="ko"&&"koImmuneToEffectsUntilTurn"in card&&(card.koImmuneToEffectsUntilTurn??-1)>=state.turn){return true}if(sourcePlayerId===ownerId)return false;if(removalKind==="ko"&&"koImmuneToOpponentEffectsUntilTurn"in card&&(card.koImmuneToOpponentEffectsUntilTurn??-1)>=state.turn){return true}if(REMOVAL_IMMUNITIES.some(aura=>aura.protects?.(db.require(card.cardNumber))===true&&state.players[ownerId].board.some(candidate=>candidate.cardNumber===aura.cardNumber&&!effectsNegated(state,candidate.instanceId)&&immunityHolds(aura,state,ownerId,candidate,removalKind,source)))){return true}if(effectsNegated(state,card.instanceId))return false;if(card.cardNumber==="OP14-003"&&sourceCardNumber!==void 0){const source2=db.get(sourceCardNumber);const sourceOnBoard=sourceInstanceId===void 0?void 0:state.players[sourcePlayerId].board.find(candidate=>candidate.instanceId===sourceInstanceId);const sourceBasePower=sourceOnBoard?cardBasePower(state,sourcePlayerId,sourceOnBoard,db):source2?.power;if(source2?.category==="character"&&(sourceBasePower??Number.POSITIVE_INFINITY)<=5e3){return true}}return REMOVAL_IMMUNITIES.some(immunity=>immunity.from==="opponent"&&immunity.protects===void 0&&immunity.cardNumber===card.cardNumber&&immunityHolds(immunity,state,ownerId,card,removalKind,source))}var STATIC_ABILITIES=[];var bySelf=new Map;var aurasBySource=new Map;var selfKeywordConditionals=new Set;function registerStaticAbilities(abilities){STATIC_ABILITIES=abilities;collectDonReaders();bySelf.clear();aurasBySource.clear();selfKeywordConditionals.clear();for(const[position,ability]of abilities.entries()){if(ability.scope!=="self"){const list=aurasBySource.get(ability.cardNumber)??[];list.push({ability,position});aurasBySource.set(ability.cardNumber,list)}else{const list=bySelf.get(ability.cardNumber)??[];list.push(ability);bySelf.set(ability.cardNumber,list);if(ability.keyword){selfKeywordConditionals.add(`${ability.cardNumber}\0${ability.keyword.keyword}`)}}}}function conditionalSelfKeywords(cardNumber){return(bySelf.get(cardNumber)??[]).map(ability=>ability.keyword?.keyword).filter(keyword=>keyword!==void 0)}function auraReaches(aura,context){const{state,playerId}=context;switch(aura.scope){case"controller-aura":return state.players[playerId].leaderCardNumber===aura.cardNumber&&!leaderEffectsNegated(state,playerId);case"opponent-aura":{const auraPlayerId=opponentOf(playerId);return state.players[auraPlayerId].leaderCardNumber===aura.cardNumber&&!leaderEffectsNegated(state,auraPlayerId)}case"stage-aura":case"opponent-stage-aura":{const stage=state.players[aura.scope==="opponent-stage-aura"?opponentOf(playerId):playerId].stage;return stage?.cardNumber===aura.cardNumber&&!effectsNegated(state,stage.instanceId)}case"board-aura":case"opponent-board-aura":return boardAuraCopies(aura,context)>0;case"self":return false}}function boardAuraCopies(aura,context){const{state,playerId}=context;const board=state.players[aura.scope==="opponent-board-aura"?opponentOf(playerId):playerId].board;return board.filter(card=>card.cardNumber===aura.cardNumber&&!effectsNegated(state,card.instanceId)).length}function abilitiesFor(context){const own=bySelf.get(context.card.cardNumber);const abilities=own&&!effectsNegated(context.state,context.card.instanceId)?[...own]:[];const candidates=presentAuras(context.state);if(candidates.length===0)return abilities;const reaching=candidates.filter(({ability})=>auraReaches(ability,context));if(reaching.length>1)reaching.sort((left,right)=>left.position-right.position);for(const{ability}of reaching){const copies=ability.scope==="board-aura"||ability.scope==="opponent-board-aura"?boardAuraCopies(ability,context):1;for(let copy=0;copy<copies;copy+=1)abilities.push(ability)}return abilities}function presentAuras(state){const found=[];for(const playerId of["p1","p2"]){const player=state.players[playerId];collectAuras(found,player.leaderCardNumber);if(player.stage)collectAuras(found,player.stage.cardNumber);for(const card of player.board)collectAuras(found,card.cardNumber)}return found}function collectAuras(found,cardNumber){const list=aurasBySource.get(cardNumber);if(!list)return;for(const entry of list)if(!found.includes(entry))found.push(entry)}function baseEffectiveCost(state,playerId,card,db=cards){const printed=db.require(card.cardNumber).cost??0;if(effectsNegated(state,card.instanceId))return printed;const context={state,playerId,card,isLeader:false,db};return(bySelf.get(card.cardNumber)??[]).reduce((total,ability)=>total+(selfCostReads(ability,context)?ability.cost?.(context)??0:0),printed)}function selfCostReads(ability,context){if(ability.cost===void 0)return true;const player=context.state.players[context.playerId];const id=context.card.instanceId;if(ability.scope==="self"&&ability.costZone==="hand")return player.hand.some(card=>card.instanceId===id);return player.board.some(card=>card.instanceId===id)||player.stage?.instanceId===id}function staticCostDelta(state,playerId,card,db=cards){const context={state,playerId,card,isLeader:false,db};return abilitiesFor(context).reduce((total,ability)=>total+(selfCostReads(ability,context)?ability.cost?.(context)??0:0),0)}function staticCostDeltaWhere(state,playerId,card,db,include){const context={state,playerId,card,isLeader:false,db};return abilitiesFor(context).reduce((total,ability)=>total+(include(ability)&&selfCostReads(ability,context)?ability.cost?.(context)??0:0),0)}function staticPowerContributions(state,playerId,card,isLeader,printed,db=cards,baseIsSet=false){const context={state,playerId,card,isLeader,db};const abilities=abilitiesFor(context);const contributions=[];const setBase=highestStaticSetBase(abilities,context);if(setBase&&(!baseIsSet||setBase.value>printed)){if(setBase.value!==printed){contributions.push({cardNumber:setBase.cardNumber,amount:setBase.value-printed})}}for(const ability of abilities){if(ability.power?.kind!=="add")continue;const amount=ability.power.value(context);if(amount!==0)contributions.push({cardNumber:ability.cardNumber,amount})}return contributions}function highestStaticSetBase(abilities,context){let highest;for(const ability of abilities){if(ability.power?.kind!=="set-base")continue;const value=ability.power.value(context);if(value===void 0)continue;if(!highest||value>highest.value)highest={cardNumber:ability.cardNumber,value}}return highest}function boardCardPower(state,playerId,card,includeAttachedDon=true,db=cards){const override=storedBasePower(card.basePowerOverrides,state.turn);const printed=override??db.require(card.cardNumber).power??0;const modifiers=(card.powerModifiers??[]).filter(modifier=>modifier.expiresAtTurn>=state.turn).reduce((total,modifier)=>total+modifier.amount,0);return staticPower(state,playerId,card,false,printed,db,override!==void 0)+modifiers+(includeAttachedDon?(card.attachedDon?.length??0)*1e3:0)}function cardBasePower(state,playerId,card,db=cards){const player=state.players[playerId];if(card.instanceId===`${playerId}-leader`){const override2=storedBasePower(player.leaderBasePowers,state.turn);const printed2=override2??db.require(player.leaderCardNumber).power??0;return staticBasePower(state,playerId,card,true,printed2,db,override2!==void 0)}const printed=db.require(card.cardNumber).power??void 0;const onBoard=player.board.find(candidate=>candidate.instanceId===card.instanceId);if(!onBoard)return printed;const override=storedBasePower(onBoard.basePowerOverrides,state.turn);const base=override??printed;if(base===void 0)return void 0;return staticBasePower(state,playerId,onBoard,false,base,db,override!==void 0)}function departedCardBasePower(state,playerId,card,db=cards){const printed=db.require(card.cardNumber).power??void 0;const override="basePowerOverrides"in card?storedBasePower(card.basePowerOverrides,state.turn):void 0;const base=override??printed;if(base===void 0)return void 0;return staticBasePower(state,playerId,card,false,base,db,override!==void 0)}function staticBasePower(state,playerId,card,isLeader,printed,db,baseIsSet){const context={state,playerId,card,isLeader,db};const setBase=highestStaticSetBase(abilitiesFor(context),context);if(!setBase)return printed;return baseIsSet?Math.max(printed,setBase.value):setBase.value}function staticPower(state,playerId,card,isLeader,printed,db=cards,baseIsSet=false){return staticPowerContributions(state,playerId,card,isLeader,printed,db,baseIsSet).reduce((total,contribution)=>total+contribution.amount,printed)}function handCounterPower(state,playerId,cardNumber,db=cards){const definition=db.require(cardNumber);if(definition.category!=="character")return 0;const board=state.players[playerId].board;if((definition.power??0)>=8e3&&board.some(card=>card.cardNumber==="OP16-118"&&!effectsNegated(state,card.instanceId))){return 2e3-(definition.counter??0)}if((definition.counter??0)>0)return 0;let bonus=0;if(board.some(card=>card.cardNumber==="OP17-063"&&!effectsNegated(state,card.instanceId))){bonus+=1e3}if(cardNumber==="OP17-118"){const characters=board.filter(card=>db.require(card.cardNumber).category==="character");if(characters.length>0&&characters.every(card=>(db.require(card.cardNumber).counter??0)===0)){bonus+=2e3}}return bonus}function attacksActiveCharacters(state,playerId,card,db=cards){if(effectsNegated(state,card.instanceId))return false;const context={state,playerId,card,isLeader:false,db};return abilitiesFor(context).some(ability=>ability.attacksActive?.(context))}function attackBannedByOwnText(state,playerId,card,db=cards){if(effectsNegated(state,card.instanceId))return false;const context={state,playerId,card,isLeader:false,db};return abilitiesFor(context).some(ability=>ability.attackBlocked?.(context))}function leaderContext(state,playerId,db){return{state,playerId,card:{instanceId:`${playerId}-leader`,cardNumber:state.players[playerId].leaderCardNumber},isLeader:true,db}}function survivesBattleKo(state,ownerId,card,attacker,db=cards){if("battleKoImmuneUntilTurn"in card&&(card.battleKoImmuneUntilTurn??-1)>=state.turn){return true}const context={state,playerId:ownerId,card,isLeader:false,db};return abilitiesFor(context).some(ability=>ability.battleKoImmune?.(context,attacker))}function winsOnOpponentBlock(state,playerId,db=cards){return state.players[playerId].board.some(card=>{const context={state,playerId,card,isLeader:false,db};return abilitiesFor(context).some(ability=>ability.winsOnOpponentBlock?.(context))})}function trashPlayGrantsRush(state,playerId,cardNumber,db=cards){const context=leaderContext(state,playerId,db);return abilitiesFor(context).some(ability=>ability.trashPlayRush?.(context,cardNumber))}function refreshBlocked(state,playerId,card,db=cards){const context={state,playerId,card,isLeader:false,db};return abilitiesFor(context).some(ability=>ability.blocksRefresh?.(context))}function staticHandPlayDiscount(state,playerId,cardNumber,db=cards){const context={state,playerId,card:{instanceId:`${playerId}-hand-price`,cardNumber},isLeader:false,db};return abilitiesFor(context).reduce((total,ability)=>total+(ability.handPlayDiscount?.(context)??0),0)}function staticHandCostDelta(state,playerId,cardNumber,db=cards){const context={state,playerId,card:{instanceId:`${playerId}-hand-price`,cardNumber},isLeader:false,db};return(bySelf.get(cardNumber)??[]).reduce((total,ability)=>ability.costZone==="hand"?total+(ability.cost?.(context)??0):total,0)}function effectPlayBarred(state,playerId,cardNumber,db=cards){const context={state,playerId,card:{instanceId:`${playerId}-hand-play`,cardNumber},isLeader:false,db};return abilitiesFor(context).some(ability=>ability.effectPlayFromHandBarred?.(context))}function charactersArriveRested(state,playerId,db=cards){const context=leaderContext(state,playerId,db);return abilitiesFor(context).some(ability=>ability.charactersPlayRested?.(context))}function faceUpLifeBanksToDeck(state,playerId,db=cards){const context=leaderContext(state,playerId,db);return abilitiesFor(context).some(ability=>ability.faceUpLifeGoesToDeckBottom?.(context))}function donPhaseGivesLeaderDon(state,playerId,db=cards){const context=leaderContext(state,playerId,db);return abilitiesFor(context).some(ability=>ability.donPhaseDonToLeader?.(context))}function onPlayEffectsNegated(state,playerId,db=cards){if((state.players[playerId].onPlayNegatedUntilTurn??-1)>=state.turn){return true}const context=leaderContext(state,playerId,db);return abilitiesFor(context).some(ability=>ability.onPlayNegated?.(context))}function hasStaticKeyword(state,playerId,card,keyword,db=cards,isLeader=false){const negated=effectsNegated(state,card.instanceId);const context={state,playerId,card,isLeader,db};const ownConditional=selfKeywordConditionals.has(`${card.cardNumber}\0${keyword}`);const abilities=abilitiesFor(context);const own=negated?false:ownConditional?abilities.some(ability=>ability.scope==="self"&&ability.keyword?.keyword===keyword&&ability.keyword.when(context)):context.db.facts(card.cardNumber).keywords.includes(keyword);if(own)return true;return abilities.some(ability=>ability.scope!=="self"&&ability.keyword?.keyword===keyword&&ability.keyword.when(context))}function bankDamagedLifeCard(state,playerId,card,db){const toDeck=card.faceUp===true&&faceUpLifeBanksToDeck(state,playerId,db);const landed={instanceId:card.instanceId,cardNumber:card.cardNumber};if(toDeck){state.players[playerId].deck.push(landed)}else{state.players[playerId].hand.push(landed)}return[{type:"card-moved",playerId,cardInstanceId:card.instanceId,cardNumber:card.cardNumber,from:"life",to:toDeck?"deck":"hand",position:toDeck?"bottom":"top",...card.faceUp!==true&&!toDeck?{identityVisibleTo:playerId}:{}}]}function lifePositionOf(index){return index===0?"top":"bottom"}function addToLife(state,playerId,card,options){const{from,position="top",faceUp=false,sourceCardNumber}=options;const entry={instanceId:card.instanceId,cardNumber:card.cardNumber,...faceUp?{faceUp:true}:{}};const life=state.players[playerId].life;if(position==="top")life.unshift(entry);else life.push(entry);return[{type:"card-moved",playerId,cardInstanceId:faceUp?entry.instanceId:null,cardNumber:faceUp?entry.cardNumber:null,from,to:"life",position,faceUp,...sourceCardNumber?{sourceCardNumber}:{}}]}function takeFromLife(state,playerId,instanceId,options){const life=state.players[playerId].life;const index=life.findIndex(card2=>card2.instanceId===instanceId);if(index<0)return null;const position=lifePositionOf(index);const[card]=life.splice(index,1);if(!card)return null;return{card,events:[{type:"card-moved",playerId,cardInstanceId:card.instanceId,cardNumber:card.cardNumber,from:"life",to:options.to,position,...options.sourceCardNumber?{sourceCardNumber:options.sourceCardNumber}:{},...card.faceUp!==true&&options.to==="hand"?{identityVisibleTo:playerId}:{}}]}}function takeLifeAt(state,playerId,position,options){const life=state.players[playerId].life;const card=position==="top"?life[0]:life.at(-1);if(!card)return null;return takeFromLife(state,playerId,card.instanceId,options)}function dealDamage(state,playerId,banish=false){if(state.pendingTrigger){throw new Error("PENDING_TRIGGER_ALREADY_OPEN")}const player=state.players[playerId];const damaged=player.life.shift();if(!damaged){const winner=playerId==="p1"?"p2":"p1";state.phase="finished";state.winner=winner;state.resultReason="life";return[{type:"game-ended",winner,reason:"life"}]}if(banish){player.trash.push(damaged);return[{type:"damage-taken",playerId,lifeRemaining:player.life.length},{type:"card-moved",playerId,cardInstanceId:damaged.instanceId,cardNumber:damaged.cardNumber,from:"life",to:"trash"}]}state.pendingTrigger={playerId,card:damaged,fromEffect:true};return[{type:"damage-taken",playerId,lifeRemaining:player.life.length}]}function flipLife(state,playerId,instanceId,faceUp,sourceCardNumber){const life=state.players[playerId].life;const index=life.findIndex(card2=>card2.instanceId===instanceId);const card=life[index];if(!card||card.faceUp===true===faceUp)return[];card.faceUp=faceUp;return[{type:"life-flipped",playerId,cardInstanceId:card.instanceId,cardNumber:faceUp?card.cardNumber:null,faceUp,position:lifePositionOf(index),...sourceCardNumber?{sourceCardNumber}:{}}]}var registry=new Map;function registerDamageReplacements(programs){registry=programs}function damageReplacementProtectors(state,playerId){return state.players[playerId].board.filter(card=>registry.has(card.cardNumber)&&!effectsNegated(state,card.instanceId))}var damageReplacementOption=instanceId=>`replace:${instanceId}`;var leaderInstanceId=playerId=>`${playerId}-leader`;var DON_POOL_ACTIVE="active";var DON_POOL_RESTED="rested";function donPool(state,playerId,pool){const player=state.players[playerId];if(pool===DON_POOL_ACTIVE)return player.activeDon;if(pool===DON_POOL_RESTED)return player.restedDon;if(pool===leaderInstanceId(playerId))return player.leaderAttachedDon;return player.board.find(entry=>entry.instanceId===pool)?.attachedDon}function writableDonPool(state,playerId,pool){const card=state.players[playerId].board.find(entry=>entry.instanceId===pool);if(card)return card.attachedDon??=[];return donPool(state,playerId,pool)}function fieldDonCount(state,playerId){const player=state.players[playerId];return player.activeDon.length+player.restedDon.length+player.leaderAttachedDon.length+player.board.reduce((total,card)=>total+(card.attachedDon?.length??0),0)}function addDonFromDeck(state,playerId,count2,posture){const player=state.players[playerId];const moved=player.donDeck.splice(0,count2);player[posture==="active"?"activeDon":"restedDon"].push(...moved);return moved.length}var ON_DON_RETURNED_REACTIONS=[{cardNumber:"OP17-062",turn:"own",apply:(state,playerId,events)=>{const added=addDonFromDeck(state,playerId,1,"active");if(added>0){events.push({type:"don-added",playerId,count:added,rested:false,sourceCardNumber:"OP17-062"})}const player=state.players[playerId];const activated=player.restedDon.splice(0,1);player.activeDon.push(...activated);if(activated.length>0){events.push({type:"don-activated",playerId,count:activated.length,sourceCardNumber:"OP17-062"})}}},{cardNumber:"OP14-068",turn:"opponent",when:(state,playerId)=>hasCardType(state.players[playerId].leaderCardNumber,"Donquixote Pirates"),apply:(state,playerId,events)=>{const added=addDonFromDeck(state,playerId,1,"rested");if(added>0){events.push({type:"don-added",playerId,count:added,rested:true,sourceCardNumber:"OP14-068"})}}}];function donReturnedReactionCards(){return ON_DON_RETURNED_REACTIONS.map(reaction=>reaction.cardNumber)}function returnDonToDeck(state,playerId,count2,source,events,from){const player=state.players[playerId];const returned=[];const origins=[];const take=(zone,pool)=>{const moved=zone.splice(0,Math.min(count2-returned.length,zone.length));returned.push(...moved);origins.push(...moved.map(()=>pool))};if(from==="active"){take(player.activeDon,DON_POOL_ACTIVE)}else{take(player.restedDon,DON_POOL_RESTED);take(player.activeDon,DON_POOL_ACTIVE);take(player.leaderAttachedDon,leaderInstanceId(playerId));for(const card of player.board){if(returned.length>=count2)break;take(card.attachedDon??[],card.instanceId)}}player.donDeck.push(...returned);if(returned.length>0){events.push({type:"don-returned",playerId,count:returned.length,sourceCardNumber:source.cardNumber})}if(origins.length>0&&from===void 0){const existing=state.donReturn?.playerId===playerId?state.donReturn:void 0;state.donReturn={playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,origins:[...existing?.origins??[],...origins],onFieldAtPayment:existing?.onFieldAtPayment??fieldDonIds(state,playerId)}}if(returned.length>0){if(state.turnPlayerId===playerId){const bigMomLeader=hasCardType(player.leaderCardNumber,"Big Mom Pirates");for(const katakuri of player.board.filter(card=>card.cardNumber==="ST34-001")){const key=`${state.turn}:${playerId}:${katakuri.instanceId}:don-return`;if(state.oncePerTurn.includes(key))continue;state.oncePerTurn.push(key);if(!bigMomLeader)continue;const given=addDonFromDeck(state,playerId,2,"rested");if(given>0){events.push({type:"don-added",playerId,count:given,rested:true,sourceCardNumber:katakuri.cardNumber})}}}for(const reaction of ON_DON_RETURNED_REACTIONS){const onOwnTurn=state.turnPlayerId===playerId;if(reaction.turn==="own"?!onOwnTurn:onOwnTurn)continue;if(reaction.when&&!reaction.when(state,playerId))continue;for(const card of player.board.filter(entry=>entry.cardNumber===reaction.cardNumber)){const key=`${state.turn}:${playerId}:${card.instanceId}:don-returned-reaction`;if(state.oncePerTurn.includes(key))continue;state.oncePerTurn.push(key);reaction.apply(state,playerId,events)}}}return returned.length}function donReturnPools(state,playerId,unplacedOrigins,onFieldAtPayment){const player=state.players[playerId];const candidates=[DON_POOL_RESTED,DON_POOL_ACTIVE,leaderInstanceId(playerId),...player.board.map(card=>card.instanceId)];return candidates.filter(pool=>donPoolSize(state,playerId,pool,onFieldAtPayment)>0||unplacedOrigins.includes(pool))}function donReturnHasChoice(state,playerId,unplacedOrigins,onFieldAtPayment){return donReturnPools(state,playerId,unplacedOrigins,onFieldAtPayment).some(pool=>donPoolSize(state,playerId,pool,onFieldAtPayment)>0&&unplacedOrigins.some(origin=>origin!==pool))}function donPoolSize(state,playerId,pool,onFieldAtPayment){const held=donPool(state,playerId,pool)??[];if(!onFieldAtPayment)return held.length;return held.filter(don=>onFieldAtPayment.includes(don)).length}var DON_CARD_NUMBER="DON!!";function activeDonOwner(state,instanceId){return["p1","p2"].find(playerId=>state.players[playerId].activeDon.includes(instanceId))}function fieldDonIds(state,playerId){const player=state.players[playerId];return[...player.activeDon,...player.restedDon,...player.leaderAttachedDon,...player.board.flatMap(card=>card.attachedDon??[])]}function placeReturnedDon(state,playerId,origins,pool,onFieldAtPayment){const remaining2=[...origins];const matching=remaining2.indexOf(pool);if(matching>=0){remaining2.splice(matching,1);return remaining2}const origin=remaining2.shift();if(origin===void 0)throw new Error("NO_DON_RETURN_PENDING");const target=donPool(state,playerId,pool)??[];const index=target.findLastIndex(don=>!onFieldAtPayment||onFieldAtPayment.includes(don));const taken=index>=0?target.splice(index,1)[0]:void 0;if(taken===void 0)throw new Error(`EMPTY_DON_POOL: ${pool}`);const player=state.players[playerId];player.donDeck.push(taken);const givenBack=player.donDeck.shift();if(givenBack===void 0)throw new Error("EMPTY_DON_DECK");const source=writableDonPool(state,playerId,origin)??state.players[playerId].restedDon;source.push(givenBack);return remaining2}var leaderBattledCharacterKey=(turn,playerId)=>`${turn}:${playerId}:leader-battled-character`;function describeMoveDestination(to){const pile=to.zone==="life"?"Life cards":to.zone==="deck"?"deck":to.zone;const owned=to.player==="self"?`your ${pile}`:to.player==="opponent"?`their ${pile}`:`the ${pile}`;const end=to.position==="top"?"the top of ":to.position==="bottom"?"the bottom of ":"";return`${end}${owned}`}var OWN_CARDS_ZONES=["board","stage"];var restableCards=player=>({player,zone:OWN_CARDS_ZONES,includeLeader:true,rested:false,canRest:true,includeActiveDon:true});function battleParticipant(state,playerId){const attack=state.activeAttack;if(!attack)return null;const instanceId=playerId===attack.attackerPlayerId?attack.attackerInstanceId:playerId===attack.defenderPlayerId?attack.targetInstanceId:null;if(instanceId===null)return null;if(instanceId===`${playerId}-leader`){return{instanceId,cardNumber:state.players[playerId].leaderCardNumber,isLeader:true}}const card=state.players[playerId].board.find(candidate=>candidate.instanceId===instanceId);if(!card)return null;return{instanceId,cardNumber:card.cardNumber,isLeader:false}}function battleTargetMatches(filter,participant){if(!filter)return true;if(filter.isLeader!==void 0&&filter.isLeader!==participant.isLeader){return false}if(filter.type!==void 0&&!hasCardType(participant.cardNumber,filter.type)){return false}if(filter.typeIncluding!==void 0&&!hasCardTypeIncluding(participant.cardNumber,filter.typeIncluding)){return false}if(filter.anyOfTypes!==void 0&&!filter.anyOfTypes.some(type=>hasCardType(participant.cardNumber,type))){return false}if(filter.name!==void 0&&!hasCardName(participant.cardNumber,filter.name)){return false}if(filter.anyOf!==void 0&&!filter.anyOf.some(branch=>battleTargetMatches(branch,participant))){return false}return true}function recordDeckTopKnowledge(state,knower,deckOwner){const card=state.players[deckOwner].deck[0];if(!card)return;const seen={instanceId:card.instanceId,cardNumber:card.cardNumber};if(knower===deckOwner)state.players[knower].knownOwnDeckTop=seen;else state.players[knower].knownOpponentDeckTop=seen}function searchRevealIsPublic(sourceCardNumber,db=cards){return db.require(sourceCardNumber).rules.searchRevealPublic}function resolveDeckTopKnowledge(state,deckOwner,remembered,db=cards){if(!remembered)return null;const top=state.players[deckOwner].deck[0];if(!top||top.instanceId!==remembered.instanceId)return null;const definition=db.require(top.cardNumber);return{instanceId:top.instanceId,cardNumber:top.cardNumber,name:definition.name,category:definition.category,cost:definition.cost,power:definition.power,counter:definition.counter}}function effectiveCost(state,playerId,card,db=cards){return costOf(state,playerId,card,db)}function donPowerApplies(state,playerId){return state.turnPlayerId===playerId}function currentPower(state,playerId,instanceId,includeAttachedDon=true,db=cards){const player=state.players[playerId];if(instanceId===`${playerId}-leader`){const override=storedBasePower(player.leaderBasePowers,state.turn);const printed=override??db.require(player.leaderCardNumber).power??0;const modifiers=player.leaderPowerModifiers.filter(modifier=>modifier.expiresAtTurn>=state.turn).reduce((total,modifier)=>total+modifier.amount,0);return staticPower(state,playerId,{instanceId,cardNumber:player.leaderCardNumber},true,printed,db,override!==void 0)+modifiers+(includeAttachedDon?player.leaderAttachedDon.length*1e3:0)}if(player.stage?.instanceId===instanceId)return 0;const card=player.board.find(candidate=>candidate.instanceId===instanceId);if(!card)throw new Error(`MISSING_CARD: ${instanceId}`);return boardCardPower(state,playerId,card,includeAttachedDon,db)}function boardOwner(state,card){return["p1","p2"].find(playerId=>state.players[playerId].board.some(candidate=>candidate.instanceId===card.instanceId))}function isRested(state,card){const leaderSeat=["p1","p2"].find(seat2=>card.instanceId===`${seat2}-leader`);if(leaderSeat)return state.players[leaderSeat].leaderRested;return"rested"in card?Boolean(card.rested):false}function defendingCounterPower(state,playerId,instanceId){const attack=state.activeAttack;return attack&&playerId===attack.defenderPlayerId&&instanceId===attack.targetInstanceId?attack.counterPower:0}function canBeTargeted(state,playerId,card,criteria,db=cards){const definition=db.require(card.cardNumber);const rested=isRested(state,card);const isLeader=card.instanceId===`${playerId}-leader`;const evaluatedPower=()=>"rested"in card||isLeader?currentPower(state,playerId,card.instanceId,donPowerApplies(state,playerId),db)+defendingCounterPower(state,playerId,card.instanceId):definition.power??0;const basePower=()=>cardBasePower(state,playerId,card,db);return(criteria.category===void 0||definition.category===criteria.category)&&(criteria.type===void 0||hasCardType(card.cardNumber,criteria.type))&&(criteria.maxCost===void 0||definition.category==="leader"||effectiveCost(state,playerId,card,db)<=criteria.maxCost)&&(criteria.minCost===void 0||definition.category==="leader"||effectiveCost(state,playerId,card,db)>=criteria.minCost)&&(criteria.maxPower===void 0||(basePower()??Number.POSITIVE_INFINITY)<=criteria.maxPower)&&(criteria.minPower===void 0||(basePower()??Number.NEGATIVE_INFINITY)>=criteria.minPower)&&(criteria.maxCurrentPower===void 0||evaluatedPower()<=criteria.maxCurrentPower)&&(criteria.minCurrentPower===void 0||evaluatedPower()>=criteria.minCurrentPower)&&(criteria.rested===void 0||rested===criteria.rested)&&(criteria.faceUp===void 0||Boolean(card.faceUp)===criteria.faceUp)&&(criteria.excludeInstanceId===void 0||card.instanceId!==criteria.excludeInstanceId)}function battleAttackPower(state,db=cards){const attack=state.activeAttack;if(!attack)return 0;const attackerIsLeader=attack.attackerInstanceId===`${attack.attackerPlayerId}-leader`;const onField=attackerIsLeader||state.players[attack.attackerPlayerId].board.some(card=>card.instanceId===attack.attackerInstanceId);if(!onField)return attack.battleAttackBonus;return currentPower(state,attack.attackerPlayerId,attack.attackerInstanceId,true,db)+attack.battleAttackBonus}var whenRestedCards=new Set;function registerWhenRestedCards(cards2){whenRestedCards=cards2}function remaining(state,context,selector,bindings,db,departed){const cards2=selectCards(state,context,selector,bindings,db);if(!departed)return cards2.length;const zones=typeof selector.zone==="string"?[selector.zone]:selector.zone;if(zones.includes(departed.zone))return cards2.length;return cards2.filter(card=>card.instanceId!==departed.instanceId).length}function effectSelectsNothing(state,context,effect,bindings,db,departed){switch(effect.kind){case"choose":{const candidates=remaining(state,context,effect.selector,bindings,db,departed);return candidates===0||candidates<effect.min}case"select":return remaining(state,context,effect.selector,bindings,db,departed)===0;case"pick-from-hand":return state.players[resolvePlayer(context,effect.player)].hand.length===0;case"sequence":{let left=departed;let payoffs=0;for(const step2 of effect.effects){if(stepIsPriceOnly(context,step2)){if(step2.kind==="move"&&step2.binding===SOURCE_BINDING){left={instanceId:context.source.instanceId,zone:step2.to.zone}}continue}payoffs+=1;if(!effectSelectsNothing(state,context,step2,bindings,db,left)){return false}}return payoffs>0}case"optional":return effectSelectsNothing(state,context,effect.effect,bindings,db,departed);case"choice":return effect.branches.every(branch=>branch.effect===void 0||effectSelectsNothing(state,context,branch.effect,bindings,db,departed));case"if":{const taken=conditionMatches(state,context,effect.condition,bindings,db)?effect.then:effect.else;return taken===void 0||effectSelectsNothing(state,context,taken,bindings,db,departed)}default:return false}}function programChangesNothing(state,context,program,db){const bindings={[SOURCE_BINDING]:[context.source.instanceId]};const visit=effect=>{switch(effect.kind){case"choose":{const candidates=selectCards(state,context,effect.selector,bindings,db);if(candidates.length===0||candidates.length<effect.min){return true}const swap=effect.effect;if(swap.kind!=="swap-base-power"||swap.first!==effect.bind||swap.second!==void 0){return false}const powers=new Set(candidates.map(card=>baseCardPower(state,card.instanceId,db)));return powers.size===1&&!powers.has(void 0)}case"select":return selectCards(state,context,effect.selector,bindings,db).length===0;case"sequence":return effect.effects.every(visit);case"if":{const taken=conditionMatches(state,context,effect.condition,bindings,db)?effect.then:effect.else;return taken===void 0||visit(taken)}default:return false}};return visit(program.effect)}function programBuffsOwnPowerForTheTurn(program){return effectBuffsOwnPowerForTheTurn(program.effect,new Set)}function effectBuffsOwnPowerForTheTurn(effect,ownBindings){switch(effect.kind){case"modify-power":return effect.amount>0&&effect.expiresAfterTurns===0&&effect.perGivenDonOf===void 0&&effect.perCards===void 0&&effect.perCostOf===void 0&&ownBindings.has(effect.binding);case"choose":case"select":{if(effect.selector.player!=="self")return false;const inner=new Set(ownBindings);inner.add(effect.bind);return effectBuffsOwnPowerForTheTurn(effect.effect,inner)}case"optional":return effectBuffsOwnPowerForTheTurn(effect.effect,ownBindings);case"sequence":return effect.effects.every(step2=>effectBuffsOwnPowerForTheTurn(step2,ownBindings));default:return false}}function programKeywordGrant(program){let effect=program.effect;while(effect.kind==="optional"||effect.kind==="if"){if(effect.kind==="if"&&effect.else!==void 0)return void 0;effect=effect.kind==="optional"?effect.effect:effect.then}if(effect.kind!=="choose"&&effect.kind!=="select")return void 0;const granted=effect.effect;if(granted.kind!=="grant-keyword")return void 0;return{keyword:granted.keyword,expiresThisTurn:granted.expiresAfterTurns===0}}function programRestedDonGift(context,program){let effect=program.effect;while(effect.kind==="optional"||effect.kind==="if"){if(effect.kind==="if"&&effect.else!==void 0)return void 0;effect=effect.kind==="optional"?effect.effect:effect.then}const steps=effect.kind==="sequence"?effect.effects:[effect];const payoffs=steps.filter(step2=>!stepIsPriceOnly(context,step2));const gift=payoffs[0];if(payoffs.length!==1)return void 0;if(gift?.kind!=="give-rested-don"||gift.player!=="self"){return void 0}return{count:gift.count,from:gift.from??"rested",...steps.length>payoffs.length?{priced:true}:{}}}function programUsesBattlePower(program){const visit=effect=>{switch(effect.kind){case"battle-power":return true;case"sequence":return effect.effects.some(visit);case"optional":case"select":case"choose":return visit(effect.effect);case"if":return visit(effect.then)||(effect.else?visit(effect.else):false);case"choice":return effect.branches.some(branch=>branch.effect?visit(branch.effect):false);default:return false}};return visit(program.effect)}function programRedirectSelectors(program){const visit=effect=>{switch(effect.kind){case"choose":case"select":return[...redirects(effect.effect)?[effect.selector]:[],...visit(effect.effect)];case"sequence":return effect.effects.flatMap(visit);case"optional":return visit(effect.effect);case"if":return[...visit(effect.then),...effect.else?visit(effect.else):[]];case"choice":return effect.branches.flatMap(branch=>branch.effect?visit(branch.effect):[]);default:return[]}};const redirects=effect=>effect.kind==="redirect-attack"||effect.kind==="sequence"&&effect.effects.some(redirects);return visit(program.effect)}function programBattlePower(program,playerRef,participant){const visit=effect=>{switch(effect.kind){case"battle-power":return effect.player===playerRef&&battleTargetMatches(effect.target,participant)?effect.amount:0;case"sequence":return effect.effects.reduce((total,child)=>total+visit(child),0);case"optional":return visit(effect.effect);case"select":case"choose":return visit(effect.effect);case"if":return Math.max(visit(effect.then),effect.else?visit(effect.else):0);case"choice":return Math.max(0,...effect.branches.map(branch=>branch.effect?visit(branch.effect):0));default:return 0}};return visit(program.effect)}var opponentOf2=playerId=>playerId==="p1"?"p2":"p1";var leaderInstanceId2=playerId=>`${playerId}-leader`;function effectiveBoardCost(state,card,db=cards){const owner=boardOwner(state,card);return owner?effectiveCost(state,owner,card,db):0}function actionCardLabel(state,playerId,instanceId,includeAttachedDon,db=cards){const player=state.players[playerId];if(instanceId===leaderInstanceId2(playerId)){const definition2=db.require(player.leaderCardNumber);return`${definition2.name} [${definition2.cardNumber}] (Leader, ${currentPower(state,playerId,instanceId,includeAttachedDon)} power)`}const card=player.board.find(candidate=>candidate.instanceId===instanceId);if(!card)throw new Error(`MISSING_CARD: ${instanceId}`);const definition=db.require(card.cardNumber);return`${definition.name} [${definition.cardNumber}] (Character, ${currentPower(state,playerId,instanceId,includeAttachedDon)} power, ${card.rested?"rested":"active"})`}function activationSummary(cardNumber,...markers){const definition=cards.require(cardNumber);const clause=markers.reduce((found,marker)=>found??clauseText(cardNumber,marker),void 0);const label=`Activate ${definition.name} [${cardNumber}]`;return clause?`${label}: ${clause}`:label}function hasRush(state,playerId,card,db=cards){if((card.rushUntilTurn??-1)>=state.turn)return true;return hasStaticKeyword(state,playerId,card,"Rush",db)}function hasRushCharacter(state,playerId,card,db=cards){if((card.rushCharacterUntilTurn??-1)>=state.turn)return true;return hasStaticKeyword(state,playerId,card,"Rush: Character",db)}function counterShortfall(attackPower,defensePower){return Math.max(0,attackPower-defensePower+1)}function counterEventPower(state,playerId,cardNumber,db=cards){if(["OP15-074","OP15-075","OP15-076"].includes(cardNumber)){return battleTargetName(state,db)==="Enel"?2e3:0}if(cardNumber==="OP15-078")return 1e3;if(cardNumber==="OP12-098"){return state.players[playerId].board.some(card=>db.require(card.cardNumber).types.includes("Revolutionary Army")&&effectiveCost(state,playerId,card)>=8)?4e3:2e3}if(cardNumber==="OP12-057"||cardNumber==="OP07-056")return 4e3;if(cardNumber==="OP11-079")return void 0;if(cardNumber==="OP17-096"){const giantOut=["p1","p2"].some(pid=>state.players[pid].board.some(card=>effectiveCost(state,pid,card)>=12));return giantOut?4e3:0}if(cardNumber==="OP17-018"){const qualifying=state.players[playerId].board.filter(card=>(db.require(card.cardNumber).power??0)>=8e3).length;return qualifying>=2?4e3:0}if(cardNumber==="OP17-116"){const qualifying=state.players[playerId].board.filter(card=>db.require(card.cardNumber).rules.hasTrigger).length;return qualifying>=2?4e3:0}if(["OP17-037","OP17-038","OP17-076"].includes(cardNumber)){return void 0}if(cardNumber==="OP17-077"){const program2=getCounterEventProgram(cardNumber);const remaining2=state.players[playerId].activeDon.length-(program2?.cost??0);if(remaining2<1)return 0;const participant2=battleParticipant(state,playerId);if(!participant2)return 0;return battleTargetMatches({isLeader:true},participant2)?4e3:0}const program=getCounterEventProgram(cardNumber);if(!program){return 3e3}if(program.powerWhen){const held=conditionMatches(state,{sourcePlayerId:playerId,source:{instanceId:`${playerId}-counter-event`,cardNumber}},program.powerWhen,{},db);if(!held)return 0}if(!program.target){if(program.power===0&&program.program){let effect=program.program.effect;while(effect.kind==="if")effect=effect.then;if(effect.kind==="optional")return void 0}return program.power}const participant=battleParticipant(state,playerId);if(!participant)return 0;return battleTargetMatches(program.target,participant)?program.power:0}function counterEventForecastPower(state,playerId,cardNumber,db=cards){const base=counterEventPower(state,playerId,cardNumber,db);if(base!==0)return base;const program=getCounterEventProgram(cardNumber);if(!program)return base;const player=state.players[playerId];const instanceId=player.hand.find(card=>card.cardNumber===cardNumber)?.instanceId;const asPlayed=instanceId?{...state,players:{...state.players,[playerId]:{...player,hand:player.hand.filter(card=>card.instanceId!==instanceId),trash:[...player.trash,{instanceId,cardNumber}]}}}:state;if(program.powerWhen){return counterEventPower(asPlayed,playerId,cardNumber,db)}if(!program.program||program.target)return base;const participant=battleParticipant(state,playerId);if(!participant)return 0;return resolvedProgramPower(program.program.effect,asPlayed,playerId,cardNumber,participant,db)}function resolvedProgramPower(effect,state,playerId,cardNumber,participant,db){switch(effect.kind){case"battle-power":return effect.player==="self"&&battleTargetMatches(effect.target,participant)?effect.amount:0;case"sequence":{let total=0;for(const child of effect.effects){const value=resolvedProgramPower(child,state,playerId,cardNumber,participant,db);if(value===void 0)return void 0;total+=value}return total}case"if":{const held=conditionMatches(state,{sourcePlayerId:playerId,source:{instanceId:`${playerId}-counter-event`,cardNumber}},effect.condition,{},db);const branch=held?effect.then:effect.else;return branch?resolvedProgramPower(branch,state,playerId,cardNumber,participant,db):0}case"optional":{const inner=effect.effect;if(inner.kind==="choose"&&inner.selector.player==="self"&&inner.selector.zone==="hand"&&(inner.chooser===void 0||inner.chooser==="self")){if(state.players[playerId].hand.length<inner.min)return 0;return resolvedProgramPower(inner.effect,state,playerId,cardNumber,participant,db)}return void 0}case"select":case"choose":case"choice":return void 0;default:return 0}}function battleForecast(attackPower,defensePower,stake){const shortfall=counterShortfall(attackPower,defensePower);return shortfall===0?`${attackPower} attack vs ${defensePower} defense: attack fails, target survives and the defender spends nothing`:`${attackPower} attack vs ${defensePower} defense: target is hit${stake?` and ${stake}`:""} unless ${shortfall} more Counter power is added, from any number of cards`}function battleStake(state,defenderPlayerId,targetInstanceId,attacker,db=cards){if(targetInstanceId!==leaderInstanceId2(defenderPlayerId)){return"the Character is K.O.'d"}const life=state.players[defenderPlayerId].life.length;if(life===0)return"the attacker wins the game";const points=attacker&&hasKeyword(state,attacker.playerId,attacker.instanceId,"Double Attack",db)?2:1;const taken=Math.min(points,life);const banish=attacker!==void 0&&hasKeyword(state,attacker.playerId,attacker.instanceId,"Banish",db);const destination=banish?"to their trash, without activating a [Trigger]":"to their hand";if(taken>1){return`the defender loses ${taken} of their ${life} Life cards ${destination}`}return`the defender loses 1 of their ${life} Life card${life===1?"":"s"} ${destination}`}function recordEventActivation(state,playerId,baseCost){const current=state.eventsActivatedOnTurn?.turn===state.turn?state.eventsActivatedOnTurn:{turn:state.turn};state.eventsActivatedOnTurn={...current,[playerId]:Math.max(current[playerId]??0,baseCost)}}function canAttack(state,playerId,instanceId,db=cards){if(state.phase!=="main"||state.activePlayer!==playerId)return false;return couldAttackThisTurn(state,playerId,instanceId,db)}function couldAttackThisTurn(state,playerId,instanceId,db=cards){if(state.turn<=2)return false;const player=state.players[playerId];if(instanceId===leaderInstanceId2(playerId)){if(db.require(player.leaderCardNumber).rules.cannotAttack){return false}if((player.leaderCannotAttackUntilTurn??-1)>=state.turn)return false;return!player.leaderRested}const card=player.board.find(candidate=>candidate.instanceId===instanceId);if(card&&db.require(card.cardNumber).rules.cannotAttack&&!characterEffectsSwitchedOff(state,playerId,card)){return false}if(card&&attackBannedByOwnText(state,playerId,card,db))return false;return Boolean(card&&!card.rested&&(card.cannotAttackUntilTurn??-1)<state.turn&&((card.attackTaxUntilTurn??-1)<state.turn||player.hand.length>=(card.attackTaxHandCards??0))&&(card.cannotRestUntilTurn??-1)<state.turn&&db.require(card.cardNumber).power!==null&&((card.playedTurn??0)<state.turn||hasRush(state,playerId,card)||hasRushCharacter(state,playerId,card)))}function restLocked(state,card){return(card.cannotRestUntilTurn??-1)>=state.turn}function canBlock(state,playerId,card,db=cards){if(card.rested)return false;if((card.cannotRestUntilTurn??-1)>=state.turn)return false;if((card.blockerDisabledUntilTurn??-1)>=state.turn)return false;if(state.activeAttack?.blockersDisabled===true)return false;return hasKeyword(state,playerId,card.instanceId,"Blocker",db)}function canLeaderBlock(state,playerId,db=cards){const attack=state.activeAttack;if(!attack||attack.defenderPlayerId!==playerId)return false;if(attack.targetInstanceId===leaderInstanceId2(playerId))return false;if(attack.blockersDisabled===true)return false;if(state.players[playerId].leaderRested)return false;return hasKeyword(state,playerId,leaderInstanceId2(playerId),"Blocker",db)}function hasKeyword(state,playerId,instanceId,keyword,db=cards){if(instanceId===leaderInstanceId2(playerId)){const player=state.players[playerId];if(keyword==="Unblockable"&&(player.leaderUnblockableUntilTurn??-1)>=state.turn){return true}if(keyword==="Double Attack"&&(player.leaderDoubleAttackUntilTurn??-1)>=state.turn){return true}if(keyword==="Blocker"&&(player.leaderBlockerUntilTurn??-1)>=state.turn){return true}if(keyword==="Banish"&&(player.leaderBanishUntilTurn??-1)>=state.turn){return true}return hasStaticKeyword(state,playerId,{instanceId,cardNumber:player.leaderCardNumber},keyword,db,true)}const card=state.players[playerId].board.find(candidate=>candidate.instanceId===instanceId);if(!card)return false;if(keyword==="Blocker"&&(card.blockerUntilTurn??-1)>=state.turn){return true}if(keyword==="Unblockable"&&(card.unblockableUntilTurn??-1)>=state.turn){return true}if(keyword==="Rush"&&(card.rushUntilTurn??-1)>=state.turn){return true}if(keyword==="Rush: Character"&&(card.rushCharacterUntilTurn??-1)>=state.turn){return true}if(keyword==="Banish"&&(card.banishUntilTurn??-1)>=state.turn){return true}if(keyword==="Double Attack"&&(card.doubleAttackUntilTurn??-1)>=state.turn){return true}return hasStaticKeyword(state,playerId,card,keyword,db)}function battleTargetName(state,db=cards){const attack=state.activeAttack;if(!attack)return void 0;const defender=state.players[attack.defenderPlayerId];if(attack.targetInstanceId===leaderInstanceId2(attack.defenderPlayerId)){return db.require(defender.leaderCardNumber).name}const card=defender.board.find(candidate=>candidate.instanceId===attack.targetInstanceId);return card?db.require(card.cardNumber).name:void 0}function isUnblockableAttack(state,db=cards){const attack=state.activeAttack;if(!attack)return false;return hasKeyword(state,attack.attackerPlayerId,attack.attackerInstanceId,"Unblockable",db)}var PRISONER_NAME="Prisoner of Impel Down";function offerBuggyBlockerEffect(state){const attack=state.activeAttack;if(!attack)return false;const defender=state.players[attack.defenderPlayerId];const buggy=defender.board.find(card=>{const activatedKey=`${state.turn}:${attack.defenderPlayerId}:${card.instanceId}:buggy-blocker`;const offeredKey=`${activatedKey}:offered:${attack.attackerInstanceId}`;return card.cardNumber==="OP16-048"&&!state.oncePerTurn.includes(activatedKey)&&!state.oncePerTurn.includes(offeredKey)});const eligibleInstanceIds=[...hasCardName(defender.leaderCardNumber,PRISONER_NAME)&&!defender.leaderRested?[leaderInstanceId2(attack.defenderPlayerId)]:[],...defender.board.filter(card=>hasCardName(card.cardNumber,PRISONER_NAME)&&!card.rested).map(card=>card.instanceId)];if(!buggy||eligibleInstanceIds.length===0)return false;state.pendingEffect={kind:"grant-prisoner-blocker",playerId:attack.defenderPlayerId,sourceCardNumber:"OP16-048",sourceInstanceId:buggy.instanceId,eligibleInstanceIds,resumePlayerId:attack.defenderPlayerId};state.oncePerTurn.push(`${state.turn}:${attack.defenderPlayerId}:${buggy.instanceId}:buggy-blocker:offered:${attack.attackerInstanceId}`);state.phase="block";state.activePlayer=attack.defenderPlayerId;return true}function survivesEmptyDeck(state,playerId,db=cards){return db.require(state.players[playerId].leaderCardNumber).rules.survivesEmptyDeck}function winsOnEmptyDeck(state,playerId,db=cards){return db.require(state.players[playerId].leaderCardNumber).rules.winsOnEmptyDeck}function handHasCategory(player,required,db=cards){return player.hand.filter(card=>required.categories.includes(db.require(card.cardNumber).category)).length>=required.count}function boardCardAttributes(state,card,db=cards){const granted=(card.grantedAttributes?.expiresAtTurn??-1)>=state.turn?card.grantedAttributes?.attributes??[]:[];return[...cardAttributes(db.require(card.cardNumber)),...granted]}function rememberedTargetOf(state,context){const source=state.players[context.sourcePlayerId].board.find(card=>card.instanceId===context.source.instanceId);const noted=source?.rememberedTarget;return noted&&noted.turn===state.turn?noted.instanceId:void 0}function givenDonOfBinding(state,execution,binding){const instanceId=(execution.bindings[binding]??[])[0];if(instanceId===void 0)return 0;for(const playerId of["p1","p2"]){const card=state.players[playerId].board.find(candidate=>candidate.instanceId===instanceId);if(card)return card.attachedDon?.length??0}return 0}function printedCostOfBinding(state,execution,binding,db){const instanceId=(execution.bindings[binding]??[])[0];if(instanceId===void 0)return 0;const cardNumber=findInstanceCardNumber(state,instanceId);if(cardNumber===void 0)return 0;return db.require(cardNumber).cost??0}function stagePlay(state,instanceId,context,db){const located=findCardZone(state,instanceId);if(!located){return instanceId===context.source.instanceId&&db.get(context.source.cardNumber)?.category==="stage"}const card=zoneCards(state,located.playerId,located.zone).find(candidate=>candidate.instanceId===instanceId);return card!==void 0&&db.require(card.cardNumber).category==="stage"}function eventPlay(state,instanceId,db){const located=findCardZone(state,instanceId);if(!located)return false;const card=zoneCards(state,located.playerId,located.zone).find(candidate=>candidate.instanceId===instanceId);return card!==void 0&&db.require(card.cardNumber).category==="event"}function cardHasKeyword(state,playerId,card,keyword,db){if(!("rested"in card))return false;const board=card;if(keyword==="Blocker"&&(board.blockerDisabledUntilTurn??-1)>=state.turn){return false}const granted=keyword==="Blocker"?(board.blockerUntilTurn??-1)>=state.turn:keyword==="Rush"?(board.rushUntilTurn??-1)>=state.turn:keyword==="Rush: Character"?(board.rushCharacterUntilTurn??-1)>=state.turn:keyword==="Unblockable"?(board.unblockableUntilTurn??-1)>=state.turn:(board.doubleAttackUntilTurn??-1)>=state.turn;return granted||hasStaticKeyword(state,playerId,board,keyword,db)}function boundCardNumber(state,instanceId){for(const playerId of["p1","p2"]){for(const zone of REMOVABLE_ZONES){const found=zoneCards(state,playerId,zone).find(card=>card.instanceId===instanceId);if(found)return found.cardNumber}}return void 0}function selectCards(state,context,selector,bindings,db=cards){if(selector.player==="either"){const unlimited={...selector};delete unlimited.limit;const both=[...selectCards(state,context,{...unlimited,player:"self"},bindings,db),...selectCards(state,context,{...unlimited,player:"opponent"},bindings,db)];return selector.limit===void 0?both:both.slice(0,selector.limit)}const playerId=resolvePlayer(context,selector.player);const zones=typeof selector.zone==="string"?[selector.zone]:selector.zone;const zoneOf=new Map;let cards2=zones.flatMap(zone=>zoneCards(state,playerId,zone).map(card=>{zoneOf.set(card.instanceId,zone);return card}));if(context.viaTrigger&&zones.includes("trash")){cards2=cards2.filter(card=>card.instanceId!==context.source.instanceId)}if(selector.includeLeader){cards2=[{instanceId:`${playerId}-leader`,cardNumber:state.players[playerId].leaderCardNumber},...cards2]}if(selector.binding!==void 0){const bound=new Set(bindings[selector.binding]??[]);cards2=cards2.filter(card=>bound.has(card.instanceId))}if(selector.excludeBinding!==void 0){const chosen=new Set(bindings[selector.excludeBinding]??[]);cards2=cards2.filter(card=>!chosen.has(card.instanceId))}if(selector.position==="top")cards2=cards2.slice(0,selector.positionCount??1);if(selector.position==="bottom")cards2=cards2.slice(-(selector.positionCount??1));if(selector.position==="edge"&&cards2.length>1){cards2=[cards2[0],cards2.at(-1)]}const matches=cards2.filter(card=>{const definition=db.require(card.cardNumber);const attributes="rested"in card?boardCardAttributes(state,card,db):cardAttributes(definition);return canBeTargeted(state,playerId,card,{...selector.category===void 0?{}:{category:selector.category},...selector.type===void 0?{}:{type:selector.type},...selector.maxCost===void 0?{}:{maxCost:selector.maxCost},...selector.minCost===void 0?{}:{minCost:selector.minCost},...selector.maxPower===void 0?{}:{maxPower:selector.maxPower},...selector.minPower===void 0?{}:{minPower:selector.minPower},...selector.maxCurrentPower===void 0?{}:{maxCurrentPower:selector.maxCurrentPower},...selector.minCurrentPower===void 0?{}:{minCurrentPower:selector.minCurrentPower},...selector.rested===void 0?{}:{rested:selector.rested},...selector.faceUp===void 0?{}:{faceUp:selector.faceUp},...selector.excludeSource?{excludeInstanceId:context.source.instanceId}:{}},db)&&(selector.typeIncluding===void 0||hasCardTypeIncluding(card.cardNumber,selector.typeIncluding))&&(selector.minBaseCost===void 0||(definition.cost??0)>=selector.minBaseCost)&&(selector.maxBaseCost===void 0||(definition.cost??0)<=selector.maxBaseCost)&&(selector.hasTrigger===void 0||definition.rules.hasTrigger===selector.hasTrigger)&&(selector.noBaseEffect===void 0||!(definition.rules.hasPrintedEffect||definition.rules.hasTrigger)===selector.noBaseEffect)&&(selector.lacksClause===void 0||!definition.rules.clauses.includes(selector.lacksClause))&&(selector.hasClause===void 0||definition.rules.clauses.includes(selector.hasClause))&&(selector.excludeName===void 0||definition.name!==selector.excludeName)&&(selector.differentColorFromBinding===void 0||(bindings[selector.differentColorFromBinding]??[]).every(instanceId=>{const named=boundCardNumber(state,instanceId);if(named===void 0)return true;const theirs=new Set(db.require(named).colors??[]);return!(definition.colors??[]).some(color=>theirs.has(color))}))&&(selector.sameNameAsBinding===void 0||(bindings[selector.sameNameAsBinding]??[]).some(instanceId=>{const named=boundCardNumber(state,instanceId);return named!==void 0&&cardNames(named).some(name=>hasCardName(card.cardNumber,name))}))&&(selector.name===void 0||hasCardName(card.cardNumber,selector.name))&&(selector.anyOf===void 0||selector.anyOf.some(clause=>(clause.zone===void 0||zoneOf.get(card.instanceId)===clause.zone)&&(clause.name===void 0||hasCardName(card.cardNumber,clause.name))&&(clause.type===void 0||hasCardType(card.cardNumber,clause.type))&&(clause.typeIncluding===void 0||hasCardTypeIncluding(card.cardNumber,clause.typeIncluding))&&(clause.category===void 0||definition.category===clause.category)&&(clause.color===void 0||definition.colors?.includes(clause.color)===true)&&(clause.attribute===void 0||attributes.includes(clause.attribute))&&(clause.hasTrigger===void 0||definition.rules.hasTrigger===clause.hasTrigger)&&(clause.maxPower===void 0||(cardBasePower(state,playerId,card,db)??0)<=clause.maxPower)&&(clause.minCost===void 0||effectiveCost(state,playerId,card,db)>=clause.minCost)))&&(selector.canRest!==true||("cannotRestUntilTurn"in card?card.cannotRestUntilTurn??-1:-1)<state.turn&&!isRested(state,card)&&!(selector.player==="opponent"&&isRestImmune(state,playerId,card,db)))&&(selector.keyword===void 0||cardHasKeyword(state,playerId,card,selector.keyword,db))&&(selector.excludeAttackTarget!==true||card.instanceId!==state.activeAttack?.targetInstanceId)&&(selector.color===void 0||definition.colors?.includes(selector.color)===true)&&(selector.attribute===void 0||attributes.includes(selector.attribute))&&(selector.minGivenDon===void 0||(card.instanceId===`${playerId}-leader`?state.players[playerId].leaderAttachedDon.length:"attachedDon"in card?card.attachedDon?.length??0:0)>=selector.minGivenDon)&&(selector.maxCostFromZoneCount===void 0||effectiveCost(state,playerId,card,db)<=(selector.maxCostFromZoneCount.player==="either"?["self","opponent"]:[selector.maxCostFromZoneCount.player]).reduce((total,side2)=>total+zoneCards(state,resolvePlayer(context,side2),selector.maxCostFromZoneCount.zone).length,0))&&(selector.maxCostFromFieldDon===void 0||effectiveCost(state,playerId,card,db)<=fieldDonCount(state,resolvePlayer(context,selector.maxCostFromFieldDon)))&&(selector.remembered!==true||card.instanceId===rememberedTargetOf(state,context))&&(selector.costEqualsGivenDon!==true||effectiveCost(state,playerId,card,db)===("attachedDon"in card?card.attachedDon?.length??0:0))});if(selector.includeActiveDon===true){const excluded=new Set(selector.excludeBinding===void 0?[]:bindings[selector.excludeBinding]??[]);matches.push(...state.players[playerId].activeDon.filter(instanceId=>!excluded.has(instanceId)).map(instanceId=>({instanceId,cardNumber:DON_CARD_NUMBER})))}return selector.limit===void 0?matches:matches.slice(0,selector.limit)}function baseCardPower(state,instanceId,db){const leaderPlayerId=["p1","p2"].find(playerId=>instanceId===`${playerId}-leader`);if(leaderPlayerId){const player=state.players[leaderPlayerId];return storedBasePower(player.leaderBasePowers,state.turn)??db.require(player.leaderCardNumber).power??0}for(const playerId of["p1","p2"]){const card=state.players[playerId].board.find(candidate=>candidate.instanceId===instanceId);if(!card)continue;return storedBasePower(card.basePowerOverrides,state.turn)??db.require(card.cardNumber).power??0}return void 0}function addBasePowerSetter(state,instanceId,setter,db){const leaderPlayerId=["p1","p2"].find(playerId=>instanceId===`${playerId}-leader`);let owner;let written;if(leaderPlayerId){const player=state.players[leaderPlayerId];player.leaderBasePowers=withBasePowerSetter(player.leaderBasePowers,setter,state.turn);owner=leaderPlayerId;written={instanceId,cardNumber:player.leaderCardNumber}}else{for(const playerId of["p1","p2"]){const card=state.players[playerId].board.find(candidate=>candidate.instanceId===instanceId);if(!card)continue;card.basePowerOverrides=withBasePowerSetter(card.basePowerOverrides,setter,state.turn);owner=playerId;written=card;break}}if(!owner||!written)return void 0;const applied=cardBasePower(state,owner,written,db);return applied!==void 0&&applied>setter.value?{owner,outrankedBy:applied}:{owner}}function setBaseCardPower(state,instanceId,value,scope,db){addBasePowerSetter(state,instanceId,{value,expiresAtTurn:state.turn,...scope==="battle"?{battleScoped:true}:{}},db)}function currentPowerOfBoardCard(state,playerId,instanceId,db){const card=state.players[playerId].board.find(candidate=>candidate.instanceId===instanceId);return card?boardCardPower(state,playerId,card,true,db):0}function conditionMatches(state,context,condition,bindings,db=cards){if(condition.kind==="combined-life"){const total=state.players.p1.life.length+state.players.p2.life.length;return condition.operator==="lte"?total<=condition.value:total>=condition.value}if(condition.kind==="life-versus"){const playerId2=resolvePlayer(context,condition.player);const mine=state.players[playerId2].life.length;const theirs=state.players[playerId2==="p1"?"p2":"p1"].life.length;return condition.operator==="lt"?mine<theirs:condition.operator==="gt"?mine>theirs:condition.operator==="lte"?mine<=theirs:mine>=theirs}if(condition.kind==="all-of"){return condition.conditions.every(inner=>conditionMatches(state,context,inner,bindings,db))}if(condition.kind==="hand-count-versus"){const playerId2=resolvePlayer(context,condition.player);const mine=state.players[playerId2].hand.length;const theirs=state.players[playerId2==="p1"?"p2":"p1"].hand.length;const by=condition.by??1;return condition.operator==="lt"?mine+by<=theirs:mine>=theirs+by}if(condition.kind==="character-count-versus"){const playerId2=resolvePlayer(context,condition.player);const characters=candidate=>state.players[candidate].board.filter(card=>db.require(card.cardNumber).category==="character").length;const mine=characters(playerId2);const theirs=characters(playerId2==="p1"?"p2":"p1");const by=condition.by??1;return condition.operator==="lt"?mine+by<=theirs:mine>=theirs+by}if(condition.kind==="turn-player"){return state.turnPlayerId===resolvePlayer(context,condition.player)}if(condition.kind==="leader-battled-character"){const playerId2=resolvePlayer(context,condition.player);return state.oncePerTurn.includes(leaderBattledCharacterKey(state.turn,playerId2))}if(condition.kind==="source-played-this-turn"){const playerId2=context.sourcePlayerId;const card=state.players[playerId2].board.find(candidate=>candidate.instanceId===context.source.instanceId);return card?.playedTurn===state.turn}if(condition.kind==="event-activated-this-turn"){const playerId2=resolvePlayer(context,condition.player);const stamp=state.eventsActivatedOnTurn;if(!stamp||stamp.turn!==state.turn)return false;return(stamp[playerId2]??-1)>=condition.minBaseCost}if(condition.kind==="character-koed-this-turn"){const playerId2=resolvePlayer(context,condition.player);return state.characterKoedOnTurn?.[playerId2]===state.turn}if(condition.kind==="source-cost"){const playerId2=context.sourcePlayerId;const card=state.players[playerId2].board.find(candidate=>candidate.instanceId===context.source.instanceId);if(!card)return false;const cost=effectiveCost(state,playerId2,card,db);return condition.operator==="lte"?cost<=condition.value:cost>=condition.value}if(condition.kind==="source-attached-don"){const playerId2=context.sourcePlayerId;const card=state.players[playerId2].board.find(candidate=>candidate.instanceId===context.source.instanceId);const attached=context.source.instanceId===`${playerId2}-leader`?state.players[playerId2].leaderAttachedDon.length:card?.attachedDon?.length??context.source.attachedDon?.length??0;return condition.operator==="lte"?attached<=condition.value:attached>=condition.value}if(condition.kind==="every-character-matches"){const playerId2=resolvePlayer(context,condition.player);const characters=state.players[playerId2].board.filter(card=>db.require(card.cardNumber).category==="character");const matching=selectCards(state,context,{...condition.selector,player:condition.player,zone:"board"},bindings,db).map(card=>card.instanceId);return characters.length>0&&characters.every(card=>matching.includes(card.instanceId))}if(condition.kind==="battle-target"){const attack=state.activeAttack;if(!attack)return false;const target=battleParticipant(state,attack.defenderPlayerId);return target!==null&&battleTargetMatches(condition.filter,target)}if(condition.kind==="battle-attacker"){const attack=state.activeAttack;if(!attack)return false;const attacker=battleParticipant(state,attack.attackerPlayerId);if(!attacker)return false;if(!battleTargetMatches(condition.filter,attacker))return false;if(condition.attribute===void 0)return true;const board=state.players[attack.attackerPlayerId].board.find(card=>card.instanceId===attacker.instanceId);const attributes=board?boardCardAttributes(state,board,db):cardAttributes(db.require(attacker.cardNumber));return attributes.includes(condition.attribute)}if(condition.kind==="deck-top-cost"){const top=state.players[resolvePlayer(context,condition.player)].deck[0];if(top===void 0)return false;const cost=db.require(top.cardNumber).cost;if(cost===null)return false;if(condition.operator==="lte")return cost<=condition.value;if(condition.operator==="gte")return cost>=condition.value;return cost===condition.value}if(condition.kind==="selector-cost-total"){const sides=condition.player==="either"?["self","opponent"]:[condition.player];const total=sides.reduce((sum,player)=>{const playerId2=resolvePlayer(context,player);return sum+selectCards(state,context,{...condition.selector,player},bindings,db).reduce((cost,card)=>cost+effectiveCost(state,playerId2,card,db),0)},0);return condition.operator==="lte"?total<=condition.value:total>=condition.value}if(condition.kind==="selector-count"){const sides=condition.player==="either"?["self","opponent"]:[condition.player];const matched=sides.flatMap(player=>selectCards(state,context,{...condition.selector,player},bindings,db));const total=condition.distinctNames?new Set(matched.map(card=>db.require(card.cardNumber).name)).size:matched.length;if(condition.operator==="eq")return total===condition.value;if(condition.operator==="lte")return total<=condition.value;return total>=condition.value}if(condition.kind==="any-of"){return condition.conditions.some(inner=>conditionMatches(state,context,inner,bindings,db))}if(condition.kind==="source-current-power"){const owner=["p1","p2"].find(candidate=>state.players[candidate].board.some(card=>card.instanceId===context.source.instanceId));const power=owner?currentPowerOfBoardCard(state,owner,context.source.instanceId,db):0;return condition.operator==="lte"?power<=condition.value:power>=condition.value}const playerId=resolvePlayer(context,condition.player);if(condition.kind==="leader-type-including"){return hasCardTypeIncluding(state.players[playerId].leaderCardNumber,condition.text)}if(condition.kind==="rested-cards"){const owner=state.players[playerId];const rested=(owner.leaderRested?1:0)+owner.board.filter(card=>card.rested).length+(owner.stage?.rested?1:0)+owner.restedDon.length;return condition.operator==="lte"?rested<=condition.value:rested>=condition.value}if(condition.kind==="active-don"){const active=state.players[playerId].activeDon.length;return condition.operator==="lte"?active<=condition.value:active>=condition.value}if(condition.kind==="rested-don"){const rested=state.players[playerId].restedDon.length;return condition.operator==="lte"?rested<=condition.value:rested>=condition.value}if(condition.kind==="leader-power"){const power=currentPower(state,playerId,`${playerId}-leader`,donPowerApplies(state,playerId),db);return condition.operator==="lte"?power<=condition.value:power>=condition.value}const leader=db.require(state.players[playerId].leaderCardNumber);if(condition.kind==="leader-has-type"){return hasCardType(state.players[playerId].leaderCardNumber,condition.type)}if(condition.kind==="leader-has-name"){return hasCardName(state.players[playerId].leaderCardNumber,condition.name)}if(condition.kind==="leader-has-attribute"){return cardAttributes(leader).includes(condition.attribute)}if(condition.kind==="leader-has-color"){const playerId2=resolvePlayer(context,condition.player);return db.require(state.players[playerId2].leaderCardNumber).colors?.includes(condition.color)===true}if(condition.kind==="leader-multicolored"){return(leader.colors?.length??0)>1}if(condition.kind==="given-don"){const owner=state.players[resolvePlayer(context,condition.player)];const given=owner.leaderAttachedDon.length+owner.board.reduce((total,card)=>total+(card.attachedDon?.length??0),0);return condition.operator==="lte"?given<=condition.value:given>=condition.value}if(condition.kind==="field-don"){const don=fieldDonCount(state,playerId);return condition.operator==="lte"?don<=condition.value:don>=condition.value}if(condition.kind==="field-don-versus"){const own=fieldDonCount(state,playerId);const other=fieldDonCount(state,opponentOf2(playerId));const by=condition.by??1;if(condition.operator==="lte")return own<=other;if(condition.operator==="lt")return own+by<=other;if(condition.operator==="gt")return own>=other+by;return own>=other}const count2=zoneCards(state,playerId,condition.zone).length;if(condition.operator==="eq")return count2===condition.value;if(condition.operator==="lte")return count2<=condition.value;return count2>=condition.value}function bareGateCondition(program){return program.effect.kind==="if"?program.effect.condition:null}function programSelectsNothing(state,context,program,db=cards){const bindings={[SOURCE_BINDING]:[context.source.instanceId]};return effectSelectsNothing(state,context,program.effect,bindings,db)}function stepIsPriceOnly(context,effect){switch(effect.kind){case"return-don":case"rest-don":return effect.player==="self";case"attach-don":case"give-rested-don":return effect.player==="self"&&effect.from==="active";case"rest":return effect.binding===SOURCE_BINDING&&!whenRestedCards.has(context.source.cardNumber);case"move":return effect.binding===SOURCE_BINDING&&(effect.to.player==="self"||effect.to.player==="owner")&&(effect.to.zone==="trash"||effect.to.zone==="hand"||effect.to.zone==="deck");default:return false}}var replacementRegistry=new Map;function registerReplacementPrograms(registry2){replacementRegistry=registry2}function eligibleReplacements(state,sourcePlayerId,targetPlayerId,target,db=cards,cause="effect",removalKind="ko"){const byOpponent=sourcePlayerId!==targetPlayerId;const eligible=[];const protectors=[{instanceId:`${targetPlayerId}-leader`,cardNumber:state.players[targetPlayerId].leaderCardNumber},...state.players[targetPlayerId].board,...(state.players[targetPlayerId].installedReplacements??[]).filter(entry=>entry.expiresAtTurn>=state.turn&&(entry.protects?.includes(target.instanceId)??true)).map(entry=>({instanceId:`${targetPlayerId}-installed-${entry.cardNumber}`,cardNumber:entry.cardNumber}))];for(const protector of protectors){const entry=replacementRegistry.get(protector.cardNumber);if(!entry)continue;const anyKo=entry.alsoAnyKo===true&&removalKind==="ko";if(!anyKo&&entry.opponentEffectOnly&&(!byOpponent||cause==="battle")){continue}if(entry.opponentOnly&&!byOpponent)continue;if(removalKind==="off-field"&&entry.removal!=="off-field")continue;if(entry.battleOnly&&cause!=="battle")continue;if(entry.effectOnly&&cause==="battle")continue;if(entry.oncePerTurn&&state.oncePerTurn.includes(`${state.turn}:${targetPlayerId}:${protector.instanceId}:replacement`)){continue}if(entry.protects===void 0){if(protector.instanceId!==target.instanceId)continue}else if(!selectCards(state,{sourcePlayerId:targetPlayerId,source:target},{...entry.protects,player:"self",zone:"board"},{},db).some(card=>card.instanceId===target.instanceId)){continue}else if(entry.excludesSelf&&protector.instanceId===target.instanceId){continue}if(entry.opponentTurnOnly&&state.turnPlayerId===targetPlayerId){continue}if(entry.requires!==void 0&&!conditionMatches(state,{sourcePlayerId:targetPlayerId,source:target},entry.requires,{},db)){continue}if(entry.cost.kind==="trash-from-hand"){const payable=selectCards(state,{sourcePlayerId:targetPlayerId,source:protector},{...entry.cost.match??{},player:"self",zone:"hand"},{},db).length;if(payable<entry.cost.count)continue}if(entry.cost.kind==="rest-own-cards"){const payable=selectCards(state,{sourcePlayerId:targetPlayerId,source:protector},restOwnCardsSelector(entry.cost),{},db).length;if(payable<entry.cost.count)continue}if(entry.cost.kind==="bury-from-trash"&&state.players[targetPlayerId].trash.length<entry.cost.count){continue}if(entry.cost.kind==="rest-opponent-characters"){const payable=selectCards(state,{sourcePlayerId:targetPlayerId,source:protector},{player:"opponent",zone:"board",category:"character",rested:false,canRest:true},{},db).length;if(payable<entry.cost.count)continue}if(entry.cost.kind==="bottom-deck-own-character"){const payable=selectCards(state,{sourcePlayerId:targetPlayerId,source:protector},{...entry.cost.match??{},player:"self",zone:"board",category:"character"},{},db).length;if(payable<entry.cost.count)continue}if((entry.cost.kind==="life-to-hand"||entry.cost.kind==="trash-life")&&state.players[targetPlayerId].life.length<entry.cost.count){continue}if(entry.leaderAttachedDon!==void 0&&state.players[targetPlayerId].leaderAttachedDon.length<entry.leaderAttachedDon){continue}const topLife=state.players[targetPlayerId].life[0];if(entry.cost.kind==="turn-life-face-up"&&(topLife===void 0||topLife.faceUp===true)){continue}if(entry.cost.kind==="trash-from-hand"&&entry.cost.restsSelf){if(protector.rested)continue}if(entry.cost.kind==="rest-self"&&protector.rested)continue;if(entry.cost.kind==="rest-don"&&state.players[targetPlayerId].activeDon.length<entry.cost.count){continue}if(entry.cost.kind==="return-don"&&fieldDonCount(state,targetPlayerId)<entry.cost.count){continue}eligible.push({protector,entry})}return eligible}function replacementCoveredTargets(state,sourcePlayerId,protectedPlayerId,{protector,entry},candidates,db,removalKind){if(entry.redirect!==void 0)return[];return candidates.filter(instanceId=>{const card=state.players[protectedPlayerId].board.find(candidate=>candidate.instanceId===instanceId);return card!==void 0&&eligibleReplacements(state,sourcePlayerId,protectedPlayerId,card,db,"effect",removalKind).some(other=>other.protector.instanceId===protector.instanceId)})}function boardCardNames(state,playerId,instanceIds,db){return instanceIds.flatMap(instanceId=>{const card=state.players[playerId].board.find(candidate=>candidate.instanceId===instanceId);return card?[db.require(card.cardNumber).name]:[]}).join(", ")}function restOwnCardsSelector(cost){const anyCard=cost.match===void 0&&cost.zones===void 0&&cost.includeLeader===void 0;return{...cost.match??{},player:"self",zone:cost.zones??(cost.match===void 0?OWN_CARDS_ZONES:"board"),includeLeader:cost.includeLeader??cost.match===void 0,rested:false,...anyCard?{includeActiveDon:true}:{}}}function replacementCostEffect(eligible,protectedPlayerIsSource,bind){if(eligible.entry.cost.kind==="ko-self"){return{kind:"knock-out",binding:bind,skipReplacements:true}}if(eligible.entry.cost.kind==="trash-self-and-draw"){const drawCount=eligible.entry.cost.draw;return{kind:"sequence",effects:[{kind:"move",binding:bind,to:{player:protectedPlayerIsSource?"self":"opponent",zone:"trash"},skipReplacements:true},{kind:"draw",player:protectedPlayerIsSource?"self":"opponent",count:drawCount}]}}if(eligible.entry.cost.kind==="rest-self"){return{kind:"rest",binding:bind}}if(eligible.entry.cost.kind==="return-self-to-hand"){return{kind:"move",binding:bind,to:{player:"owner",zone:"hand"},skipReplacements:true}}if(eligible.entry.cost.kind==="trash-self"){return{kind:"move",binding:bind,to:{player:protectedPlayerIsSource?"self":"opponent",zone:"trash"},skipReplacements:true}}const player=protectedPlayerIsSource?"self":"opponent";const cost=eligible.entry.cost;if(cost.kind==="power-penalty"){return{kind:"modify-power",binding:`${bind}-threatened`,amount:cost.amount,expiresAfterTurns:0}}if(cost.kind==="trash-life"){return{kind:"select",selector:{player,zone:"life",position:"top"},bind:`${bind}-cost`,count:cost.count,effect:{kind:"move",binding:`${bind}-cost`,to:{player,zone:"trash"}}}}if(cost.kind==="self-power-penalty"){return{kind:"modify-power",binding:bind,amount:cost.amount,expiresAfterTurns:0}}if(cost.kind==="leader-power-penalty"){return{kind:"select",selector:{player,zone:[],includeLeader:true},bind:`${bind}-cost`,count:"all",effect:{kind:"modify-power",binding:`${bind}-cost`,amount:cost.amount,expiresAfterTurns:0}}}if(cost.kind==="rest-own-cards"){return{kind:"choose",selector:{...restOwnCardsSelector(cost),player},bind:`${bind}-cost`,min:cost.count,max:cost.count,...player==="opponent"?{chooser:"opponent"}:{},effect:{kind:"rest",binding:`${bind}-cost`}}}if(cost.kind==="life-to-hand"){return{kind:"select",selector:{player,zone:"life",position:"top"},bind:`${bind}-cost`,count:cost.count,effect:{kind:"move",binding:`${bind}-cost`,to:{player,zone:"hand"}}}}if(cost.kind==="rest-don"){return{kind:"rest-don",player,count:cost.count}}if(cost.kind==="rest-opponent-characters"){const remover=player==="self"?"opponent":"self";return{kind:"choose",selector:{player:remover,zone:"board",category:"character",rested:false,canRest:true},bind:`${bind}-cost`,min:cost.count,max:cost.count,...player==="opponent"?{chooser:"opponent"}:{},effect:{kind:"rest",binding:`${bind}-cost`}}}if(cost.kind==="bottom-deck-own-character"){return{kind:"choose",selector:{...cost.match??{},player,zone:"board",category:"character"},bind:`${bind}-cost`,min:cost.count,max:cost.count,...player==="opponent"?{chooser:"opponent"}:{},effect:{kind:"move",binding:`${bind}-cost`,to:{player:"owner",zone:"deck",position:"bottom"},skipReplacements:true}}}if(eligible.entry.redirect==="own-life-face-down"){return{kind:"move",binding:`${bind}-threatened`,to:{player:"owner",zone:"life",position:"top"},skipReplacements:true}}if(cost.kind==="none"){return{kind:"sequence",effects:[]}}if(cost.kind==="return-don"){return{kind:"return-don",player,count:cost.count}}if(cost.kind==="bury-from-trash"){return{kind:"choose",selector:{player,zone:"trash"},bind:`${bind}-cost`,min:cost.count,max:cost.count,...player==="opponent"?{chooser:"opponent"}:{},effect:{kind:"move",binding:`${bind}-cost`,to:{player,zone:"deck",position:"bottom"}}}}if(cost.kind==="turn-life-face-up"){return{kind:"choose",selector:{player,zone:"life",position:"top",faceUp:false},bind:`${bind}-cost`,min:1,max:1,...player==="opponent"?{chooser:"opponent"}:{},effect:{kind:"update",binding:`${bind}-cost`,faceUp:true}}}const trashFromHand2={kind:"choose",selector:{...cost.match??{},player,zone:"hand"},bind:`${bind}-cost`,min:cost.count,max:cost.count,...player==="opponent"?{chooser:"opponent"}:{},effect:{kind:"move",binding:`${bind}-cost`,to:{player,zone:"trash"},sourceBinding:bind}};return cost.restsSelf?{kind:"sequence",effects:[{kind:"rest",binding:bind},trashFromHand2]}:trashFromHand2}function pendingEffectChain(effect){const chain=[];let current=effect;while(current){chain.push(current);current=current.kind==="return-don"?current.displaced:null}return chain}function retargetAttack(attack,targetInstanceId){attack.targetInstanceId=targetInstanceId;attack.counterPower=0}function knockOut(state,ownerId,instanceId,sourceCardNumber){const player=state.players[ownerId];const index=player.board.findIndex(card2=>card2.instanceId===instanceId);if(index<0)return void 0;const[card]=player.board.splice(index,1);if(!card)return void 0;player.restedDon.push(...card.attachedDon??[]);player.trash.push({instanceId:card.instanceId,cardNumber:card.cardNumber});state.characterKoedOnTurn={...state.characterKoedOnTurn,[ownerId]:state.turn};return{card,events:[{type:"character-ko",playerId:ownerId,cardInstanceId:card.instanceId,cardNumber:card.cardNumber,sourceCardNumber}]}}var replacementKey=(state,playerId,ownerId)=>`${state.turn}:${playerId}:${ownerId}:replacement`;function rosinanteLifeProtectionAvailable(state,targetPlayerId,target){const player=state.players[targetPlayerId];return player.leaderCardNumber==="OP12-061"&&!leaderEffectsNegated(state,targetPlayerId)&&hasCardName(target.cardNumber,"Trafalgar Law")&&player.life.length>0&&!state.oncePerTurn.includes(replacementKey(state,targetPlayerId,"OP12-061"))}function applyRosinanteLifeProtection(state,targetPlayerId){const player=state.players[targetPlayerId];const[life]=player.life.splice(0,1);if(!life)return[];player.hand.push({instanceId:life.instanceId,cardNumber:life.cardNumber});state.oncePerTurn.push(replacementKey(state,targetPlayerId,"OP12-061"));return[{type:"card-moved",playerId:targetPlayerId,cardInstanceId:life.instanceId,cardNumber:life.cardNumber,identityVisibleTo:targetPlayerId,from:"life",to:"hand",position:"top",sourceCardNumber:"OP12-061"}]}function replacementOptionsFor(state,sourcePlayerId,targetPlayerId,target,optionPrefix,db=cards){const byOpponent=sourcePlayerId!==targetPlayerId;if(!byOpponent)return[];if(isRemovalImmune(state,targetPlayerId,target,sourcePlayerId))return[];const board=state.players[targetPlayerId].board;const definition=db.require(target.cardNumber);const targetName=definition.name;const options=[];if(rosinanteLifeProtectionAvailable(state,targetPlayerId,target)){options.push({optionId:`rosinante:${optionPrefix}`,summary:`Add the top Life card to your hand instead of K.O. ${targetName}`})}if(definition.types.includes("Donquixote Pirates")&&fieldDonCount(state,targetPlayerId)>=1){options.push(...board.filter(card=>card.cardNumber==="OP14-061"&&!state.oncePerTurn.includes(replacementKey(state,targetPlayerId,card.instanceId))).map(vergo=>({optionId:`vergo:${optionPrefix}:${vergo.instanceId}`,summary:`Return 1 DON!! with Vergo instead of K.O. ${targetName}`})))}if(state.players[targetPlayerId].hand.length>=2){options.push(...board.filter(card=>card.cardNumber==="OP17-045").map(kyo=>({optionId:`handtrash045:${optionPrefix}:${kyo.instanceId}`,summary:`Trash 2 cards from your hand instead of K.O. ${targetName}`})))}return options}function giftOwner(state,pending,recipient){const opponent=opponentOf3(pending.playerId);return pending.eitherOwner&&(recipient===`${opponent}-leader`||state.players[opponent].board.some(card=>card.instanceId===recipient))?opponent:pending.playerId}function giftPools(state,pending,ownerId){const player=state.players[ownerId];return pending.from==="cost-area"?pending.eitherOwner&&ownerId===pending.execution.context.sourcePlayerId?[player.restedDon,player.activeDon]:[player.activeDon,player.restedDon]:pending.from==="active"?[player.activeDon]:[player.restedDon]}function giftCeiling(state,pending,recipient){const held=giftPools(state,pending,giftOwner(state,pending,recipient)).map(pool=>pool.length).reduce((sum,size)=>sum+size,0);return Math.min(pending.count,held)}var fewerGiftOption=(recipient,count2)=>`give:${recipient}:${String(count2)}`;function parseGiftOption(state,pending,optionId){if(pending.eligibleInstanceIds.includes(optionId)){return{recipient:optionId,count:giftCeiling(state,pending,optionId)}}const match=/^give:(.+):(\d+)$/.exec(optionId);if(!match)return void 0;const recipient=match[1];const count2=Number(match[2]);if(!pending.eligibleInstanceIds.includes(recipient)||count2<1||count2>=giftCeiling(state,pending,recipient)){return void 0}return{recipient,count:count2}}function getMechanicChoiceOptions(state,pending,db=cards){if(pending.kind==="optional")return["apply","skip"];if(pending.kind==="choice"){return pending.branches.map(branch=>branch.id)}if(pending.kind==="area-replacement"){return state.players[pending.playerId].board.map(character=>character.instanceId)}if(pending.kind==="order-to-bottom"){const order=pending.instanceIds.map((_,index)=>index);if(!pending.alternate)return[formatOrderOption(order)];return[formatSplitOrderOption(order,0),formatSplitOrderOption(order,order.length)]}if(pending.kind==="rest-opponent-cards"){return[...pending.eligibleInstanceIds,...state.players[pending.targetPlayerId].activeDon.length>0?["don"]:[],"skip"]}if(pending.kind==="give-rested-don"){return[...pending.eligibleInstanceIds,...pending.eligibleInstanceIds.flatMap(recipient=>{const fewer=[];for(let count2=giftCeiling(state,pending,recipient)-1;count2>=1;count2-=1){fewer.push(fewerGiftOption(recipient,count2))}return fewer}),"skip"]}if(pending.kind==="blind-hand-pick"){return pending.instanceIds.map((_,index)=>faceDownOption(index))}if(pending.kind==="order-reactions"){return orderReactionOptions(pending.reactions)}if(pending.kind==="return-don-choice"){const available=fieldDonCount(state,resolvePlayer(pending.execution.context,pending.player));const counts=[];for(let count2=pending.min;count2<=available;count2+=1){counts.push(`return:${String(count2)}`)}return counts}const eligible=effectPlayableCandidates(state,selectCards(state,pending.execution.context,pending.selector,pending.execution.bindings,db),pending.effect,pending.bind,db);let options=eligible.map(card=>card.instanceId).filter(instanceId=>!pending.selected.includes(instanceId));const firstDon=options.find(instanceId=>activeDonOwner(state,instanceId)!==void 0);options=options.filter(instanceId=>instanceId===firstDon||activeDonOwner(state,instanceId)===void 0);if(pending.distinctNames||pending.maxTotalCost!==void 0||pending.maxTotalPower!==void 0){const selectedCards=eligible.filter(card=>pending.selected.includes(card.instanceId));const costPlayerOf=card=>pending.selector.player==="either"?findCardZone(state,card.instanceId)?.playerId??pending.execution.context.sourcePlayerId:resolvePlayer(pending.execution.context,pending.selector.player);if(pending.distinctNames){const chosenNames=new Set(selectedCards.map(card=>db.require(card.cardNumber).name));options=options.filter(instanceId=>{const card=eligible.find(candidate=>candidate.instanceId===instanceId);return card?!chosenNames.has(db.require(card.cardNumber).name):false})}if(pending.maxTotalCost!==void 0){const used=selectedCards.reduce((total,card)=>total+effectiveCost(state,costPlayerOf(card),card,db),0);const remaining2=pending.maxTotalCost-used;options=options.filter(instanceId=>{const card=eligible.find(candidate=>candidate.instanceId===instanceId);return card?effectiveCost(state,costPlayerOf(card),card,db)<=remaining2:false})}if(pending.maxTotalPower!==void 0){const powerOf=card=>currentPowerOfBoardCard(state,costPlayerOf(card),card.instanceId,db);const used=selectedCards.reduce((total,card)=>total+powerOf(card),0);const remaining2=pending.maxTotalPower-used;options=options.filter(instanceId=>{const card=eligible.find(candidate=>candidate.instanceId===instanceId);return card?powerOf(card)<=remaining2:false})}}const mayStop=!pending.exhaustive||options.length===0||pending.max<=pending.selected.length;if(mayStop&&pending.selected.length>=pending.min)options.push("done");return options}function takeForcedChoices(state,pending,db){if(pending.kind!=="cards"||!pending.exhaustive)return;const candidates=choice=>getMechanicChoiceOptions(state,choice,db).filter(option=>option!=="done");while(pending.selected.length<pending.max){const options=candidates(pending);if(options.length===0)return;if(options.length===1){pending.selected.push(options[0]);continue}if(pending.selected.length+options.length>pending.max)return;const probe={...pending,selected:[...pending.selected]};for(const option of options){probe.selected.push(option);const left=candidates(probe);const crowdedOut=options.some(other=>!probe.selected.includes(other)&&!left.includes(other));if(crowdedOut)return}pending.selected.push(...options);return}}function resolveMechanicChoice(state,pending,optionId,db=cards){if(pending.kind==="order-reactions"){throw new Error("ORDER_REACTIONS_RESOLVED_BY_QUEUE")}if(pending.kind==="optional"){if(optionId!=="apply"&&optionId!=="skip"){throw new Error(`INVALID_MECHANIC_OPTION: ${optionId}`)}if(optionId==="apply")flatten(pending.effect,pending.execution.queue);return continueExecution(state,pending.execution,db)}if(pending.kind==="return-don-choice"){const count2=Number(optionId.slice("return:".length));if(!optionId.startsWith("return:")||!Number.isInteger(count2)||count2<pending.min||count2>fieldDonCount(state,resolvePlayer(pending.execution.context,pending.player))){throw new Error(`INVALID_MECHANIC_OPTION: ${optionId}`)}flatten({kind:"sequence",effects:[{kind:"return-don",player:pending.player,count:count2},pending.effect]},pending.execution.queue);return continueExecution(state,pending.execution,db)}if(pending.kind==="choice"){const branch=pending.branches.find(candidate=>candidate.id===optionId);if(!branch)throw new Error(`INVALID_MECHANIC_OPTION: ${optionId}`);if(optionId.startsWith("replace:")&&pending.chooserPlayerId){const protectorId=optionId.slice("replace:".length);const protectorCardNumber=protectorId===`${pending.chooserPlayerId}-leader`?state.players[pending.chooserPlayerId].leaderCardNumber:state.players[pending.chooserPlayerId].board.find(card=>card.instanceId===protectorId)?.cardNumber;const entry=protectorCardNumber===void 0?void 0:replacementRegistry.get(protectorCardNumber);if(entry?.oncePerTurn){state.oncePerTurn.push(`${state.turn}:${pending.chooserPlayerId}:${protectorId}:replacement`)}}if(branch.effect)flatten(branch.effect,pending.execution.queue);return continueExecution(state,pending.execution,db)}if(pending.kind==="area-replacement"){const player=state.players[pending.playerId];const boardIndex=player.board.findIndex(character=>character.instanceId===optionId);if(boardIndex<0)throw new Error(`INVALID_MECHANIC_OPTION: ${optionId}`);const[trashed]=player.board.splice(boardIndex,1);if(!trashed)throw new Error(`MISSING_MECHANIC_CARD: ${optionId}`);player.restedDon.push(...trashed.attachedDon??[]);player.trash.push({instanceId:trashed.instanceId,cardNumber:trashed.cardNumber});const placement=playOntoBoard(state,pending.playerId,pending.card.instanceId,pending.rested,pending.execution.context);const continued=continueExecution(state,pending.execution,db);return{pending:continued.pending,events:[{type:"character-trashed",playerId:pending.playerId,cardInstanceId:trashed.instanceId,cardNumber:trashed.cardNumber,reason:"character-area-limit"},...placement.events,...continued.events],signals:[...placement.signals,...continued.signals]}}if(pending.kind==="blind-hand-pick"){const index=parseFaceDownOption(optionId,pending.instanceIds.length);if(index===void 0){throw new Error(`INVALID_MECHANIC_OPTION: ${optionId}`)}pending.execution.bindings[pending.bind]=[pending.instanceIds[index]];flatten(pending.effect,pending.execution.queue);return continueExecution(state,pending.execution,db)}if(pending.kind==="order-to-bottom"){const order=parseOrderOption(optionId,pending.instanceIds.length);if(!order){throw new Error(`INVALID_MECHANIC_OPTION: ${optionId}`)}const execution=pending.execution;const ordered=order.map(index=>pending.instanceIds[index]);const atPrimary=pending.alternate?parseOrderSplit(optionId,ordered.length)??ordered.length:ordered.length;if(atPrimary!==0&&atPrimary!==ordered.length){throw new Error(`INVALID_MECHANIC_OPTION: ${optionId}`)}execution.bindings[pending.binding]=ordered.slice(0,atPrimary);if(pending.alternate&&atPrimary<ordered.length){const rest=`${pending.binding}-alternate`;execution.bindings[rest]=ordered.slice(atPrimary);execution.queue.unshift({kind:"move",binding:rest,to:pending.alternate})}if(atPrimary>0){execution.queue.unshift({kind:"move",binding:pending.binding,to:pending.to})}return continueExecution(state,execution,db)}if(pending.kind==="rest-opponent-cards"){const events=[];const restSignals=[];const target=state.players[pending.targetPlayerId];let eligibleInstanceIds=pending.eligibleInstanceIds;if(optionId==="don"){const moved=target.activeDon.splice(0,1);if(moved.length===0)throw new Error("INVALID_MECHANIC_OPTION: don");target.restedDon.push(...moved)}else if(optionId!=="skip"){if(!eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_MECHANIC_OPTION: ${optionId}`)}const card=target.board.find(entry=>entry.instanceId===optionId);if(!card)throw new Error(`MISSING_MECHANIC_CARD: ${optionId}`);card.rested=true;events.push({type:"character-rested",playerId:pending.targetPlayerId,cardInstanceId:card.instanceId,cardNumber:card.cardNumber,sourceCardNumber:pending.execution.context.source.cardNumber});restSignals.push({kind:"card-rested",card:{instanceId:card.instanceId,cardNumber:card.cardNumber},ownerId:pending.targetPlayerId,sourcePlayerId:pending.execution.context.sourcePlayerId,sourceIsCharacter:db.get(pending.execution.context.source.cardNumber)?.category==="character"});eligibleInstanceIds=eligibleInstanceIds.filter(candidate=>candidate!==optionId)}if(optionId!=="skip"&&pending.remaining>1&&(eligibleInstanceIds.length>0||target.activeDon.length>0)){return{pending:{...pending,eligibleInstanceIds,remaining:pending.remaining-1},events,signals:restSignals}}const continued=continueExecution(state,pending.execution,db);return{...continued,events:[...events,...continued.events],signals:[...restSignals,...continued.signals]}}if(pending.kind==="give-rested-don"){const events=[];if(optionId!=="skip"){const gift=parseGiftOption(state,pending,optionId);if(!gift)throw new Error(`INVALID_MECHANIC_OPTION: ${optionId}`);const ownerId=giftOwner(state,pending,gift.recipient);const player=state.players[ownerId];const moved=[];for(const pool of giftPools(state,pending,ownerId)){if(moved.length>=gift.count)break;moved.push(...pool.splice(0,gift.count-moved.length))}if(gift.recipient===`${ownerId}-leader`){player.leaderAttachedDon.push(...moved)}else{const target=player.board.find(card=>card.instanceId===gift.recipient);if(!target){throw new Error(`MISSING_MECHANIC_CARD: ${gift.recipient}`)}target.attachedDon??=[];target.attachedDon.push(...moved)}events.push({type:"don-attached",playerId:ownerId,targetInstanceId:gift.recipient,count:moved.length})}const continued=continueExecution(state,pending.execution,db);return{...continued,events:[...events,...continued.events]}}const options=getMechanicChoiceOptions(state,pending,db);if(!options.includes(optionId)){throw new Error(`INVALID_MECHANIC_OPTION: ${optionId}`)}if(optionId!=="done")pending.selected.push(optionId);takeForcedChoices(state,pending,db);if(optionId!=="done"&&pending.selected.length<pending.max&&getMechanicChoiceOptions(state,pending,db).some(option=>option!=="done")){return{pending,events:[],signals:[]}}pending.execution.bindings[pending.bind]=[...pending.selected];flatten(pending.effect,pending.execution.queue);return continueExecution(state,pending.execution,db)}var opponentOf3=playerId=>playerId==="p1"?"p2":"p1";function resolvePlayer(context,ref){return ref==="self"?context.sourcePlayerId:opponentOf3(context.sourcePlayerId)}function zoneCards(state,playerId,zone){if(zone==="stage"){const stage=state.players[playerId].stage;return stage?[stage]:[]}return state.players[playerId][zone]}var ORDER_OPTION_PREFIX="order:";function formatOrderOption(order){return`${ORDER_OPTION_PREFIX}${order.join(",")}`}function ownTurnExpiry(state,execution,afterTurns){if(afterTurns===0)return state.turn;const offTurn=state.turnPlayerId!==execution.context.sourcePlayerId;return state.turn+afterTurns-(offTurn?1:0)}function formatSplitOrderOption(order,atPrimary){return`${formatOrderOption(order)}|${atPrimary}`}function parseOrderSplit(optionId,count2){const separator=optionId.lastIndexOf("|");if(separator===-1)return void 0;const payload=optionId.slice(separator+1);if(!/^\d+$/.test(payload))return void 0;const atPrimary=Number(payload);return atPrimary<=count2?atPrimary:void 0}function parseOrderOption(optionId,count2){if(!optionId.startsWith(ORDER_OPTION_PREFIX))return void 0;const separator=optionId.lastIndexOf("|");const body=separator===-1?optionId:optionId.slice(0,separator);const parts=body.slice(ORDER_OPTION_PREFIX.length).split(",");if(parts.length!==count2)return void 0;if(!parts.every(part=>/^\d+$/.test(part)))return void 0;const order=parts.map(part=>Number(part));if(order.some(index=>index>=count2))return void 0;if(new Set(order).size!==count2)return void 0;return order}var FACE_DOWN_OPTION_PREFIX="face-down:";function faceDownOption(index){return`${FACE_DOWN_OPTION_PREFIX}${index}`}function parseFaceDownOption(optionId,count2){if(!optionId.startsWith(FACE_DOWN_OPTION_PREFIX))return void 0;const payload=optionId.slice(FACE_DOWN_OPTION_PREFIX.length);if(!/^\d+$/.test(payload))return void 0;const index=Number(payload);return index<count2?index:void 0}function findInstanceCardNumber(state,instanceId){const zones=["deck","hand","life","board","trash","stage"];for(const playerId of["p1","p2"]){for(const zone of zones){const found=zoneCards(state,playerId,zone).find(card=>card.instanceId===instanceId);if(found)return found.cardNumber}}return void 0}var eventMainRegistry=new Map;function registerEventMainPrograms(registry2){eventMainRegistry=registry2}var REMOVABLE_ZONES=["deck","hand","life","board","trash","stage"];function findCardZone(state,instanceId){for(const playerId of["p1","p2"]){for(const zone of REMOVABLE_ZONES){if(zoneCards(state,playerId,zone).some(card=>card.instanceId===instanceId)){return{playerId,zone}}}}return void 0}function moveSource(state,execution,sourceBinding){const instanceId=sourceBinding===void 0?void 0:execution.bindings[sourceBinding]?.[0];if(instanceId!==void 0){const leaderOf=["p1","p2"].find(playerId=>instanceId===`${playerId}-leader`);if(leaderOf){return{cardNumber:state.players[leaderOf].leaderCardNumber,playerId:leaderOf}}const found=findCardZone(state,instanceId);const card=found&&zoneCards(state,found.playerId,found.zone).find(candidate=>candidate.instanceId===instanceId);if(found&&card){return{cardNumber:card.cardNumber,playerId:found.playerId}}}return{cardNumber:execution.context.source.cardNumber,playerId:execution.context.sourcePlayerId}}function playsBinding(effect,bind){if(effect.kind==="play")return effect.binding===bind;if(effect.kind==="sequence"){return effect.effects.some(step2=>playsBinding(step2,bind))}return false}function effectPlayableCandidates(state,candidates,effect,bind,db){if(!playsBinding(effect,bind))return candidates;return candidates.filter(card=>!effectPlayBarredFromHand(state,card.instanceId,db))}function effectPlayBarredFromHand(state,instanceId,db){const located=findCardZone(state,instanceId);if(located?.zone!=="hand")return false;const card=state.players[located.playerId].hand.find(candidate=>candidate.instanceId===instanceId);return card!==void 0&&effectPlayBarred(state,located.playerId,card.cardNumber,db)}function removeCard(state,instanceId){for(const playerId of["p1","p2"]){for(const zone of REMOVABLE_ZONES){if(zone==="stage"){const stage=state.players[playerId].stage;if(!stage||stage.instanceId!==instanceId)continue;state.players[playerId].stage=null;return{card:stage,playerId,zone}}const cards2=zoneCards(state,playerId,zone);const index=cards2.findIndex(card2=>card2.instanceId===instanceId);if(index<0)continue;const[card]=cards2.splice(index,1);if(!card)throw new Error(`MISSING_MECHANIC_CARD: ${instanceId}`);if(zone==="board"){state.players[playerId].restedDon.push(...card.attachedDon??[])}return{card,playerId,zone}}}throw new Error(`MISSING_MECHANIC_CARD: ${instanceId}`)}function insertCard(state,playerId,zone,card,position){const cards2=zoneCards(state,playerId,zone);if(position==="top")cards2.unshift(card);else cards2.push(card)}function orderedZonePositionOf(state,instanceId){for(const playerId of["p1","p2"]){for(const zone of["deck","life"]){const cards2=zoneCards(state,playerId,zone);const index=cards2.findIndex(card=>card.instanceId===instanceId);if(index>=0)return index===0?"top":"bottom"}}return void 0}function movePosition(from,to,toPosition,originPosition){if(to==="life"||to==="deck"){return{position:toPosition==="top"?"top":"bottom"}}if((from==="life"||from==="deck")&&originPosition){return{position:originPosition}}return{}}function visibilityOf(card,from,zone,destinationPlayerId,faceUp){const{instanceId:cardInstanceId,cardNumber}=card;const wasHidden=from==="deck"||from==="hand"||from==="life";if(wasHidden&&(zone==="deck"||zone==="life"&&faceUp!==true)){return{cardInstanceId:null,cardNumber:null}}if(zone==="hand"){return{cardInstanceId,cardNumber,identityVisibleTo:destinationPlayerId}}return{cardInstanceId,cardNumber}}function flatten(effect,queue){if(effect.kind==="sequence")queue.unshift(...effect.effects);else queue.unshift(effect)}function playSource(context,db){if(context.viaTrigger)return{};const category=db.get(context.source.cardNumber)?.category;return category===void 0?{}:{bySourceCategory:category}}function playOntoBoard(state,playerId,instanceId,rested,context,db=cards){const player=state.players[playerId];const located=findCardZone(state,instanceId);if(!located&&instanceId===context.source.instanceId){player.board.push({instanceId:context.source.instanceId,cardNumber:context.source.cardNumber,rested,playedTurn:state.turn,attachedDon:[],powerModifiers:[]});return{events:[{type:"card-played",playerId,cardInstanceId:context.source.instanceId,cardNumber:context.source.cardNumber}],signals:[{kind:"card-played",card:context.source,playerId,...playSource(context,db)}]}}const{card,playerId:ownerId,zone:from}=removeCard(state,instanceId);if(ownerId!==playerId)throw new Error(`INVALID_PLAY_OWNER: ${instanceId}`);player.board.push({instanceId:card.instanceId,cardNumber:card.cardNumber,rested,playedTurn:state.turn,attachedDon:[],powerModifiers:[],...from==="trash"&&trashPlayGrantsRush(state,playerId,card.cardNumber,db)?{rushUntilTurn:state.turn}:{}});const movedCard={instanceId:card.instanceId,cardNumber:card.cardNumber};return{events:[...from==="hand"?[]:[{type:"card-moved",playerId,cardInstanceId:card.instanceId,cardNumber:card.cardNumber,from,to:"board",sourceCardNumber:context.source.cardNumber}],{type:"card-played",playerId,cardInstanceId:card.instanceId,cardNumber:card.cardNumber}],signals:[{kind:"card-moved",card:movedCard,ownerId,from,to:"board"},{kind:"card-played",card:movedCard,playerId,...playSource(context,db)}]}}function continueExecution(state,execution,db=cards){const events=[];const signals=[];while(execution.queue.length>0){const effect=execution.queue.shift();if(effect.kind==="sequence"){execution.queue.unshift(...effect.effects);continue}if(effect.kind==="if"){const selected=conditionMatches(state,execution.context,effect.condition,execution.bindings,db)?effect.then:effect.else;if(selected)flatten(selected,execution.queue);continue}if(effect.kind==="optional"){const chooserPlayerId=effect.chooser===void 0||effect.chooser==="self"?void 0:resolvePlayer(execution.context,effect.chooser);return{pending:{kind:"optional",execution,effect:effect.effect,...chooserPlayerId?{chooserPlayerId}:{}},events,signals}}if(effect.kind==="choice"){const chooserPlayerId=effect.chooser===void 0||effect.chooser==="self"?void 0:resolvePlayer(execution.context,effect.chooser);return{pending:{kind:"choice",execution,branches:effect.branches,...chooserPlayerId?{chooserPlayerId}:{}},events,signals}}if(effect.kind==="select"){const eligible=selectCards(state,execution.context,effect.selector,execution.bindings,db);execution.bindings[effect.bind]=(effect.count==="all"?eligible:eligible.slice(0,effect.count)).map(card=>card.instanceId);flatten(effect.effect,execution.queue);continue}if(effect.kind==="look-at"){const playerId=resolvePlayer(execution.context,effect.player);const pile=zoneCards(state,playerId,effect.zone??"deck");const looked=effect.count==="all"?[...pile]:pile.slice(0,effect.count);execution.bindings[effect.bind]=looked.map(card=>card.instanceId);events.push(...looked.map(card=>({type:"card-revealed",playerId,cardNumber:card.cardNumber,sourceCardNumber:execution.context.source.cardNumber,visibleTo:execution.context.sourcePlayerId})));continue}if(effect.kind==="deal-damage"){const targetPlayerId=resolvePlayer(execution.context,effect.player);const protectors=effect.skipReplacements===true?[]:damageReplacementProtectors(state,targetPlayerId);if(protectors.length>0){for(const protector of protectors){execution.bindings[damageReplacementOption(protector.instanceId)]=[protector.instanceId]}execution.queue.unshift({kind:"choice",chooser:targetPlayerId===execution.context.sourcePlayerId?"self":"opponent",branches:[...protectors.map(protector=>({id:damageReplacementOption(protector.instanceId),label:`Trash ${db.require(protector.cardNumber).name} instead of taking the damage`,effect:{kind:"move",binding:damageReplacementOption(protector.instanceId),to:{player:"owner",zone:"trash"},skipReplacements:true,sourceBinding:damageReplacementOption(protector.instanceId)}})),{id:"take-damage",label:"Take the damage",effect:{...effect,skipReplacements:true}}]});continue}events.push(...dealDamage(state,targetPlayerId));const damaged=state.pendingTrigger?.card;if(damaged){signals.push({kind:"card-moved",card:damaged,ownerId:targetPlayerId,from:"life",to:"hand"})}continue}if(effect.kind==="choose"){const eligible=effectPlayableCandidates(state,selectCards(state,execution.context,effect.selector,execution.bindings,db),effect.effect,effect.bind,db);if(eligible.length<effect.min)continue;if(eligible.length===0||effect.min===0&&effect.effect.kind==="play"&&(state.players[execution.context.sourcePlayerId].cannotPlayCharactersUntilTurn??-1)>=state.turn&&eligible.every(card=>(db.require(card.cardNumber).cost??0)>=(state.players[execution.context.sourcePlayerId].cannotPlayCharactersMinCost??0))){execution.bindings[effect.bind]=[];flatten(effect.effect,execution.queue);continue}const chooserPlayerId=effect.chooser===void 0||effect.chooser==="self"?void 0:resolvePlayer(execution.context,effect.chooser);const pending={kind:"cards",execution,selector:effect.selector,bind:effect.bind,min:effect.min,max:effect.max,selected:[],...chooserPlayerId?{chooserPlayerId}:{},...effect.maxTotalCost!==void 0?{maxTotalCost:effect.maxTotalCost}:{},...effect.maxTotalPower!==void 0?{maxTotalPower:effect.maxTotalPower}:{},...effect.distinctNames?{distinctNames:true}:{},...effect.exhaustive?{exhaustive:true}:{},effect:effect.effect};takeForcedChoices(state,pending,db);if(!getMechanicChoiceOptions(state,pending,db).some(option=>option!=="done")){execution.bindings[effect.bind]=[...pending.selected];flatten(effect.effect,execution.queue);continue}return{pending,events,signals}}if(effect.kind==="draw"){if(resolvePlayer(execution.context,effect.player)===execution.context.sourcePlayerId&&(state.players[execution.context.sourcePlayerId].cannotDrawByEffectUntilTurn??-1)>=state.turn){continue}const playerId=resolvePlayer(execution.context,effect.player);const player=state.players[playerId];const perCards=effect.perCards;const count2=effect.count+(perCards?(execution.bindings[perCards.binding]??[]).length*perCards.each:0);const drawn=player.deck.splice(0,count2);player.hand.push(...drawn);if(drawn.length>0){events.push({type:"cards-drawn",playerId,count:drawn.length,sourceCardNumber:execution.context.source.cardNumber});signals.push({kind:"card-drawn",playerId,count:drawn.length})}continue}if(effect.kind==="install-replacement"){const playerId=resolvePlayer(execution.context,effect.player);const player=state.players[playerId];const expiresAtTurn=state.turn+effect.expiresAfterTurns;const earlier=(player.installedReplacements??[]).find(entry=>entry.cardNumber===effect.cardNumber&&entry.expiresAtTurn>=state.turn);const protects=[...new Set([...earlier?.protects??[],...player.board.map(card=>card.instanceId)])];player.installedReplacements=[...(player.installedReplacements??[]).filter(entry=>entry.cardNumber!==effect.cardNumber),{cardNumber:effect.cardNumber,expiresAtTurn,protects}];continue}if(effect.kind==="extra-turn"){const playerId=resolvePlayer(execution.context,effect.player);const player=state.players[playerId];player.extraTurns=(player.extraTurns??0)+1;events.push({type:"extra-turn-granted",playerId,sourceCardNumber:execution.context.source.cardNumber});continue}if(effect.kind==="trash-top"){const playerId=resolvePlayer(execution.context,effect.player);const player=state.players[playerId];const trashed=player.deck.splice(0,effect.count);player.trash.push(...trashed);for(const card of trashed){signals.push({kind:"card-moved",card:{instanceId:card.instanceId,cardNumber:card.cardNumber},ownerId:playerId,from:"deck",to:"trash"});events.push({type:"card-moved",playerId,cardInstanceId:card.instanceId,cardNumber:card.cardNumber,from:"deck",to:"trash",position:"top",sourceCardNumber:execution.context.source.cardNumber})}continue}if(effect.kind==="attach-don"){const playerId=resolvePlayer(execution.context,effect.player);const player=state.players[playerId];const givenPool=[];if(effect.from==="given"){if(effect.target!=="leader"&&effect.target.each){throw new Error("ATTACH_DON_GIVEN_EACH_UNSUPPORTED")}const excluded=effect.target==="leader"?`${playerId}-leader`:execution.bindings[effect.target.binding]?.[0]??"";if(excluded!==`${playerId}-leader`&&!player.board.some(card=>card.instanceId===excluded)){continue}let remaining2=effect.count;const take=pile=>{givenPool.push(...pile.splice(0,Math.min(remaining2,pile.length)));remaining2=effect.count-givenPool.length};for(const card of player.board){if(remaining2<=0)break;if(card.instanceId===excluded)continue;take(card.attachedDon??[])}if(remaining2>0&&excluded!==`${playerId}-leader`){take(player.leaderAttachedDon)}}const sourcePiles=effect.from==="given"?[givenPool]:effect.from==="active"?[player.activeDon]:effect.from==="rested"?[player.restedDon]:[player.activeDon,player.restedDon];const cameFrom=new Map;const takeDon=count2=>{const taken=[];for(const pile of sourcePiles){if(taken.length>=count2)break;const share=pile.splice(0,count2-taken.length);for(const card of share)cameFrom.set(card,pile);taken.push(...share)}return taken};const putDonBack=cards2=>{for(const card of[...cards2].reverse()){(cameFrom.get(card)??sourcePiles[0]).unshift(card)}};const moved=takeDon(effect.count);if(effect.target==="leader"){player.leaderAttachedDon.push(...moved);events.push({type:"don-attached",playerId,targetInstanceId:`${playerId}-leader`,count:moved.length})}else if(effect.target.each){putDonBack(moved);for(const instanceId of execution.bindings[effect.target.binding]??[]){const target=player.board.find(card=>card.instanceId===instanceId);const pile=instanceId===`${playerId}-leader`?player.leaderAttachedDon:target&&(target.attachedDon??=[]);if(!pile)continue;const share=takeDon(effect.count);if(share.length===0)break;pile.push(...share);events.push({type:"don-attached",playerId,targetInstanceId:instanceId,count:share.length})}}else{const targetId=execution.bindings[effect.target.binding]?.[0];const target=player.board.find(card=>card.instanceId===targetId);const pile=targetId===`${playerId}-leader`?player.leaderAttachedDon:target&&(target.attachedDon??=[]);if(!pile){putDonBack(moved);continue}pile.push(...moved);events.push({type:"don-attached",playerId,targetInstanceId:targetId,count:moved.length})}continue}if(effect.kind==="spend-once-per-turn"){if(state.oncePerTurn.includes(effect.key)){execution.queue.length=0;continue}state.oncePerTurn.push(effect.key);events.push({type:"ability-triggered",playerId:execution.context.sourcePlayerId,sourceCardNumber:execution.context.source.cardNumber,sourceInstanceId:execution.context.source.instanceId});continue}if(effect.kind==="at-end-of-turn-effect"){const player=state.players[execution.context.sourcePlayerId];player.endOfTurnPrograms=[...player.endOfTurnPrograms??[],{turn:state.turn,source:{instanceId:execution.context.source.instanceId,cardNumber:execution.context.source.cardNumber},effect:effect.effect}];continue}if(effect.kind==="order-to-bottom"){if(effect.also){const{also,...placement}=effect;execution.bindings[effect.binding]=[effect.binding,...also].flatMap(bind=>execution.bindings[bind]??[]);execution.queue.unshift(placement);continue}const instanceIds2=execution.bindings[effect.binding]??[];const ownerOf2=instanceId=>effect.byOwner?findCardZone(state,instanceId)?.playerId??execution.context.sourcePlayerId:execution.context.sourcePlayerId;const owners=[...new Set(instanceIds2.map(ownerOf2))];if(owners.length>1){const first=state.turnPlayerId;for(const owner2 of[opponentOf3(first),first]){const bind=`${effect.binding}-${owner2}`;execution.bindings[bind]=instanceIds2.filter(instanceId=>ownerOf2(instanceId)===owner2);execution.queue.unshift({...effect,binding:bind})}continue}const owner=owners[0]??execution.context.sourcePlayerId;const placeAll=()=>{execution.queue.unshift({kind:"move",binding:effect.binding,to:effect.to})};if(instanceIds2.length<=1&&!effect.alternate){placeAll();continue}if(instanceIds2.length===0){placeAll();continue}const identities=new Set(instanceIds2.map(instanceId=>findInstanceCardNumber(state,instanceId)??""));if(identities.size<=1&&!effect.alternate){placeAll();continue}return{pending:{kind:"order-to-bottom",execution,binding:effect.binding,to:effect.to,...effect.alternate?{alternate:effect.alternate}:{},instanceIds:[...instanceIds2],...owner!==execution.context.sourcePlayerId?{chooserPlayerId:owner}:{}},events,signals}}if(effect.kind==="rest-opponent-cards"){const targetPlayerId=resolvePlayer(execution.context,effect.player);const target=state.players[targetPlayerId];const eligible=effect.match?new Set(selectCards(state,execution.context,{...effect.match,player:effect.player,zone:"board"},execution.bindings,db).map(card=>card.instanceId)):void 0;const eligibleInstanceIds=(effect.donOnly===true?[]:target.board).filter(card=>!card.rested&&(card.cannotRestUntilTurn??-1)<state.turn&&!isRestImmune(state,targetPlayerId,card,db)&&(effect.maxCost===void 0||effectiveCost(state,targetPlayerId,card,db)<=effect.maxCost)&&(eligible===void 0||eligible.has(card.instanceId))).map(card=>card.instanceId);if(eligibleInstanceIds.length===0&&target.activeDon.length===0){continue}return{pending:{kind:"rest-opponent-cards",execution,targetPlayerId,eligibleInstanceIds,remaining:effect.count},events,signals}}if(effect.kind==="give-rested-don"){const playerId=resolvePlayer(execution.context,effect.player);const from=effect.from??"rested";const available=ownerId=>{const owner=state.players[ownerId];return from==="cost-area"?owner.activeDon.length+owner.restedDon.length:from==="active"?owner.activeDon.length:owner.restedDon.length};const typeMatches=(cardNumber,attributes)=>(effect.type===void 0||hasCardType(cardNumber,effect.type))&&(effect.name===void 0||hasCardName(cardNumber,effect.name))&&(effect.anyOfTypes===void 0||effect.anyOfTypes.some(type=>hasCardType(cardNumber,type)))&&(effect.anyOfAttributes===void 0||effect.anyOfAttributes.some(attribute=>attributes().includes(attribute)))&&(effect.typeIncluding===void 0||hasCardTypeIncluding(cardNumber,effect.typeIncluding));const owners=effect.eitherOwner?[playerId,opponentOf3(playerId)]:[playerId];const eligibleInstanceIds=owners.filter(ownerId=>available(ownerId)>0).flatMap(ownerId=>{const owner=state.players[ownerId];return[...typeMatches(owner.leaderCardNumber,()=>cardAttributes(db.require(owner.leaderCardNumber)))?[`${ownerId}-leader`]:[],...(effect.recipient==="leader"?[]:owner.board).filter(card=>typeMatches(card.cardNumber,()=>boardCardAttributes(state,card,db))).map(card=>card.instanceId)]});if(owners.every(ownerId=>available(ownerId)===0))continue;return{pending:{kind:"give-rested-don",execution,playerId,eligibleInstanceIds,count:effect.count,...effect.type===void 0?{}:{type:effect.type},...from==="rested"?{}:{from},...effect.eitherOwner?{eitherOwner:true}:{}},events,signals}}if(effect.kind==="return-don"){signals.push({kind:"don-returned",playerId:resolvePlayer(execution.context,effect.player),count:effect.count});returnDonToDeck(state,resolvePlayer(execution.context,effect.player),effect.count,execution.context.source,events,effect.from);continue}if(effect.kind==="return-don-choice"){const playerId=resolvePlayer(execution.context,effect.player);if(fieldDonCount(state,playerId)<effect.min)continue;return{pending:{kind:"return-don-choice",execution,player:effect.player,min:effect.min,effect:effect.effect},events,signals}}if(effect.kind==="shuffle-deck"){const playerId=resolvePlayer(execution.context,effect.player);const player=state.players[playerId];const shuffled=shuffle(player.deck,state.rngState);player.deck=shuffled.items;state.rngState=shuffled.state;delete player.knownOwnDeckTop;delete state.players[opponentOf3(playerId)].knownOpponentDeckTop;continue}if(effect.kind==="pick-from-hand"){const targetPlayerId=resolvePlayer(execution.context,effect.player);const hand=state.players[targetPlayerId].hand;if(hand.length<=1||effect.pick==="random"){let picked=hand.map(card=>card.instanceId);if(hand.length>1){const drawn=nextInt(state.rngState,hand.length);state.rngState=drawn.state;picked=[hand[drawn.value].instanceId]}execution.bindings[effect.bind]=picked;flatten(effect.effect,execution.queue);continue}const shuffled=shuffle(hand.map(card=>card.instanceId),state.rngState);state.rngState=shuffled.state;return{pending:{kind:"blind-hand-pick",execution,targetPlayerId,bind:effect.bind,instanceIds:shuffled.items,effect:effect.effect},events,signals}}if(effect.kind==="rest-don"){const player=state.players[resolvePlayer(execution.context,effect.player)];player.restedDon.push(...player.activeDon.splice(0,effect.count));continue}if(effect.kind==="return-given-don"){const player=state.players[resolvePlayer(execution.context,effect.player)];if(effect.binding!==void 0){const playerId=resolvePlayer(execution.context,effect.player);for(const holder of execution.bindings[effect.binding]??[]){const pile=holder===`${playerId}-leader`?player.leaderAttachedDon:player.board.find(card=>card.instanceId===holder)?.attachedDon;player.restedDon.push(...pile?.splice(0,1)??[])}continue}let remaining2=effect.count;const take=pile=>{const moved=pile.splice(0,Math.min(remaining2,pile.length));player.restedDon.push(...moved);remaining2-=moved.length};for(const card of player.board){if(remaining2<=0)break;take(card.attachedDon??[])}if(remaining2>0)take(player.leaderAttachedDon);continue}if(effect.kind==="activate-don"){const playerId=resolvePlayer(execution.context,effect.player);const player=state.players[playerId];const fromCharacter=db.get(execution.context.source.cardNumber)?.category==="character";if(fromCharacter&&(player.cannotActivateDonByCharacterUntilTurn??-1)>=state.turn){continue}const activated=player.restedDon.splice(0,effect.count);player.activeDon.push(...activated);if(activated.length>0){events.push({type:"don-activated",playerId,count:activated.length,sourceCardNumber:execution.context.source.cardNumber})}continue}if(effect.kind==="add-don-at-end-of-turn"){const target=state.players[resolvePlayer(execution.context,effect.player)];target.addDonAtEndOfTurn=(target.addDonAtEndOfTurn??0)+effect.count;continue}if(effect.kind==="equalize-don-at-end-of-turn"){const target=state.players[resolvePlayer(execution.context,effect.player)];target.endOfTurnDonEqualize=[...target.endOfTurnDonEqualize??[],{turn:state.turn,sourceCardNumber:execution.context.source.cardNumber,sourceInstanceId:execution.context.source.instanceId}];continue}if(effect.kind==="deck-top-to-life-at-end-of-turn"){const target=state.players[resolvePlayer(execution.context,effect.player)];target.endOfTurnLifeFromDeck=[...target.endOfTurnLifeFromDeck??[],{turn:state.turn,count:effect.count}];continue}if(effect.kind==="restrict-player"){const targetPlayerId=resolvePlayer(execution.context,effect.player);const target=state.players[targetPlayerId];const until=state.turn+effect.expiresAfterTurns;if(effect.restriction==="cannot-activate-don-by-character"){target.cannotActivateDonByCharacterUntilTurn=until}else if(effect.restriction==="leader-cannot-attack-characters"){target.leaderCannotAttackCharactersUntilTurn=until;if(effect.maxBaseCost===void 0){delete target.leaderCannotAttackCharactersMaxBaseCost}else{target.leaderCannotAttackCharactersMaxBaseCost=effect.maxBaseCost}}else if(effect.restriction==="cannot-attack-leaders"){target.cannotAttackLeadersUntilTurn=until}else if(effect.restriction==="cannot-life-to-hand"){target.cannotLifeToHandUntilTurn=until}else if(effect.restriction==="cannot-draw-by-effect"){target.cannotDrawByEffectUntilTurn=until}else if(effect.restriction==="cannot-play-from-hand"){target.cannotPlayFromHandUntilTurn=until}else if(effect.restriction==="on-play-negated"){target.onPlayNegatedUntilTurn=until}else{target.cannotPlayCharactersUntilTurn=until;if(effect.minBaseCost!==void 0){target.cannotPlayCharactersMinCost=effect.minBaseCost}else{delete target.cannotPlayCharactersMinCost}}events.push({type:"player-restricted",playerId:targetPlayerId,restriction:effect.restriction,untilTurn:until,...effect.minBaseCost===void 0?{}:{minBaseCost:effect.minBaseCost},...effect.maxBaseCost===void 0?{}:{maxBaseCost:effect.maxBaseCost},sourceCardNumber:execution.context.source.cardNumber});continue}if(effect.kind==="rest-don-at-next-main"){const target=state.players[resolvePlayer(execution.context,effect.player)];target.donRestedAtNextMain=(target.donRestedAtNextMain??0)+effect.count;continue}if(effect.kind==="hold-don-from-refresh"){const target=state.players[resolvePlayer(execution.context,effect.player)];target.donHeldFromRefresh=Math.min(effect.count,target.restedDon.length);continue}if(effect.kind==="discount-next-play"){state.players[resolvePlayer(execution.context,effect.player)].playDiscount={name:effect.name,minCost:effect.minCost,amount:effect.amount,turn:state.turn};continue}if(effect.kind==="add-don"){const playerId=resolvePlayer(execution.context,effect.player);const player=state.players[playerId];const moved=player.donDeck.splice(0,effect.count);if(effect.rested)player.restedDon.push(...moved);else player.activeDon.push(...moved);if(moved.length>0){events.push({type:"don-added",playerId,count:moved.length,rested:effect.rested,sourceCardNumber:execution.context.source.cardNumber})}continue}if(effect.kind==="battle-power"){const attack=state.activeAttack;const playerId=resolvePlayer(execution.context,effect.player);const participant=battleParticipant(state,playerId);if(!attack||!participant||!battleTargetMatches(effect.target,participant)){continue}const amount=effect.perCard===void 0?effect.amount:effect.amount*(execution.bindings[effect.perCard]?.length??0);if(amount===0)continue;if(playerId===attack.attackerPlayerId){attack.battleAttackBonus+=amount}else{attack.counterPower+=amount}events.push({type:"power-changed",playerId,targetInstanceId:participant.instanceId,amount,expiresAtTurn:state.turn,sourceCardNumber:execution.context.source.cardNumber,sourceInstanceId:execution.context.source.instanceId});continue}if(effect.kind==="copy-power"){const sourceId=(execution.bindings[effect.from]??[])[0];if(sourceId===void 0)continue;const sourceLeaderPlayerId=["p1","p2"].find(candidate=>sourceId===`${candidate}-leader`);const sourceOwner=sourceLeaderPlayerId??["p1","p2"].find(candidate=>state.players[candidate].board.some(card=>card.instanceId===sourceId));if(!sourceOwner)continue;const copied=effect.base?baseCardPower(state,sourceId,db)??0:currentPower(state,sourceOwner,sourceId,donPowerApplies(state,sourceOwner),db);for(const instanceId of execution.bindings[effect.to]??[]){const owner=["p1","p2"].find(candidate=>state.players[candidate].board.some(card=>card.instanceId===instanceId));if(!owner)continue;const target=state.players[owner].board.find(card=>card.instanceId===instanceId);if(!target)continue;addBasePowerSetter(state,instanceId,{value:copied,expiresAtTurn:state.turn+effect.expiresAfterTurns},db)}continue}if(effect.kind==="set-base-power"){const expiresAtTurn=state.turn+effect.expiresAfterTurns;for(const instanceId of execution.bindings[effect.binding]??[]){const written=addBasePowerSetter(state,instanceId,{value:effect.value,expiresAtTurn},db);if(!written)continue;events.push({type:"base-power-set",playerId:written.owner,targetInstanceId:instanceId,basePower:effect.value,...written.outrankedBy===void 0?{}:{outrankedBy:written.outrankedBy},expiresAtTurn,sourceCardNumber:execution.context.source.cardNumber,sourceInstanceId:execution.context.source.instanceId})}continue}if(effect.kind==="activate-don-at-end-of-turn"){const playerId=resolvePlayer(execution.context,effect.player);state.endOfTurnDonActivation=[...state.endOfTurnDonActivation??[],{playerId,turn:state.turn,count:effect.count}];continue}if(effect.kind==="trash-life-down-to"){const playerId=resolvePlayer(execution.context,effect.player);const excess=state.players[playerId].life.length-effect.size;if(excess<=0)continue;flatten({kind:"select",selector:{player:effect.player,zone:"life",position:"top",positionCount:excess},bind:"trash-life-down-to",count:"all",effect:{kind:"move",binding:"trash-life-down-to",to:{player:effect.player,zone:"trash"}}},execution.queue);continue}if(effect.kind==="trash-hand-down-to"){const playerId=resolvePlayer(execution.context,effect.player);const excess=state.players[playerId].hand.length-effect.size;if(excess<=0)continue;flatten({kind:"choose",selector:{player:effect.player,zone:"hand"},bind:"trash-hand-down-to",min:excess,max:excess,...effect.player==="opponent"?{chooser:"opponent"}:{},effect:{kind:"move",binding:"trash-hand-down-to",to:{player:effect.player,zone:"trash"}}},execution.queue);continue}if(effect.kind==="bind-battle-target"){const playerId=resolvePlayer(execution.context,effect.player);const participant=battleParticipant(state,playerId);execution.bindings[effect.bind]=participant?[participant.instanceId]:[];flatten(effect.effect,execution.queue);continue}if(effect.kind==="swap-base-power"){const first=execution.bindings[effect.first]?.[0];const second=effect.second===void 0?execution.bindings[effect.first]?.[1]:execution.bindings[effect.second]?.[0];if(!first||!second||first===second)continue;const firstBase=baseCardPower(state,first,db);const secondBase=baseCardPower(state,second,db);if(firstBase===void 0||secondBase===void 0)continue;setBaseCardPower(state,first,secondBase,effect.scope,db);setBaseCardPower(state,second,firstBase,effect.scope,db);continue}if(effect.kind==="reveal-deck-top"){const ownerId=resolvePlayer(execution.context,effect.player);const top=state.players[ownerId].deck[0];if(top){recordDeckTopKnowledge(state,execution.context.sourcePlayerId,ownerId);recordDeckTopKnowledge(state,ownerId,ownerId);events.push({type:"card-revealed",playerId:ownerId,cardNumber:top.cardNumber,sourceCardNumber:execution.context.source.cardNumber})}continue}if(effect.kind==="disable-blockers"){if(state.activeAttack)state.activeAttack.blockersDisabled=true;continue}if(effect.kind==="set-leader-base-power"){const playerId=resolvePlayer(execution.context,effect.player);const expiresAtTurn=state.turn+effect.expiresAfterTurns;const written=addBasePowerSetter(state,`${playerId}-leader`,{value:effect.value,expiresAtTurn},db);events.push({type:"base-power-set",playerId,targetInstanceId:`${playerId}-leader`,basePower:effect.value,...written?.outrankedBy===void 0?{}:{outrankedBy:written.outrankedBy},expiresAtTurn,sourceCardNumber:execution.context.source.cardNumber,sourceInstanceId:execution.context.source.instanceId});continue}const instanceIds=execution.bindings[effect.binding]??[];if(effect.kind==="reveal"){for(const instanceId of instanceIds){const located=findCardZone(state,instanceId);if(!located)continue;const owner=located.playerId;const card=zoneCards(state,owner,located.zone).find(candidate=>candidate.instanceId===instanceId);if(!card)continue;events.push({type:"card-revealed",playerId:owner,cardNumber:card.cardNumber,sourceCardNumber:execution.context.source.cardNumber})}continue}if(effect.kind==="play"){const playerId=resolvePlayer(execution.context,effect.player??"self");const player=state.players[playerId];if((player.cannotPlayCharactersUntilTurn??-1)>=state.turn&&instanceIds.every(instanceId=>{const located=findCardZone(state,instanceId);const card=located?zoneCards(state,located.playerId,located.zone).find(candidate=>candidate.instanceId===instanceId):void 0;const cost=card?db.require(card.cardNumber).cost??0:0;return cost>=(player.cannotPlayCharactersMinCost??0)})){continue}for(const instanceId of instanceIds){if(effectPlayBarredFromHand(state,instanceId,db))continue;if(eventPlay(state,instanceId,db))continue;if(stagePlay(state,instanceId,execution.context,db)){const previous=player.stage;if(previous){player.trash.push({instanceId:previous.instanceId,cardNumber:previous.cardNumber})}const located=findCardZone(state,instanceId);const card=located?removeCard(state,instanceId).card:{instanceId:execution.context.source.instanceId,cardNumber:execution.context.source.cardNumber};player.stage={instanceId:card.instanceId,cardNumber:card.cardNumber,rested:effect.rested??false};events.push({type:"card-moved",playerId,cardInstanceId:card.instanceId,cardNumber:card.cardNumber,from:"hand",to:"stage"});continue}if(player.board.length>=5){const located=findCardZone(state,instanceId);if(!located)break;return{pending:{kind:"area-replacement",execution,playerId,card:{instanceId,cardNumber:zoneCards(state,located.playerId,located.zone).find(card=>card.instanceId===instanceId).cardNumber},rested:effect.rested??false},events,signals}}const placed=playOntoBoard(state,playerId,instanceId,(effect.rested??false)||charactersArriveRested(state,playerId,db),execution.context);events.push(...placed.events);signals.push(...placed.signals)}continue}if(effect.kind==="move"){const destination=effect.to.player;const mover=moveSource(state,execution,effect.sourceBinding);if(effect.to.zone==="hand"){const moverId=execution.context.sourcePlayerId;const barred=(state.players[moverId].cannotLifeToHandUntilTurn??-1)>=state.turn;if(barred&&instanceIds.some(instanceId=>state.players[moverId].life.some(card=>card.instanceId===instanceId))){continue}}for(const[index,instanceId]of instanceIds.entries()){if(instanceId===execution.context.source.instanceId&&findCardZone(state,instanceId)===void 0){const playerId2=destination==="owner"||destination==="self"?execution.context.sourcePlayerId:resolvePlayer(execution.context,destination);const card2={instanceId,cardNumber:execution.context.source.cardNumber,...effect.faceUp===void 0?{}:{faceUp:effect.faceUp}};insertCard(state,playerId2,effect.to.zone,card2,effect.to.position??"bottom");events.push({type:"card-moved",playerId:playerId2,cardInstanceId:instanceId,cardNumber:card2.cardNumber,from:"life",to:effect.to.zone});continue}if(!effect.skipReplacements){const boardOwner2=["p1","p2"].find(candidate=>state.players[candidate].board.some(card2=>card2.instanceId===instanceId));const threatened=boardOwner2?state.players[boardOwner2].board.find(card2=>card2.instanceId===instanceId):void 0;if(boardOwner2&&threatened&&isRemovalImmune(state,boardOwner2,threatened,execution.context.sourcePlayerId,execution.context.source.cardNumber,db,"off-field",execution.context.source.instanceId)){continue}const eligible=boardOwner2&&threatened?eligibleReplacements(state,execution.context.sourcePlayerId,boardOwner2,threatened,db,"effect","off-field"):[];if(boardOwner2&&threatened&&eligible.length>0){const remaining2=instanceIds.slice(index+1);const thenRest=(effectNow,restBind,rest)=>{if(rest.length===0)return effectNow;execution.bindings[restBind]=[...rest];return{kind:"sequence",effects:[effectNow,{...effect,binding:restBind}]}};const targetName=db.require(threatened.cardNumber).name;const moveBind=`${effect.binding}-move-${instanceId}`;execution.bindings[moveBind]=[instanceId];return{pending:{kind:"choice",execution,chooserPlayerId:boardOwner2,branches:[{id:`remove:${instanceId}`,label:`Remove ${targetName} from the field`,effect:thenRest({...effect,binding:moveBind,skipReplacements:true},`${effect.binding}-after-replacement`,remaining2)},...eligible.map(({protector,entry})=>{const bind=`${effect.binding}-replace-${protector.instanceId}`;execution.bindings[bind]=[protector.instanceId];const covered=replacementCoveredTargets(state,execution.context.sourcePlayerId,boardOwner2,{protector,entry},remaining2,db,"off-field");execution.bindings[`${bind}-threatened`]=[instanceId,...covered];return{id:`replace:${protector.instanceId}`,label:`${entry.label} instead of removing ${boardCardNames(state,boardOwner2,[instanceId,...covered],db)}`,effect:thenRest(replacementCostEffect({protector,entry},boardOwner2===execution.context.sourcePlayerId,bind),`${bind}-after-replacement`,remaining2.filter(rest=>!covered.includes(rest)))}})]},events,signals}}}const originPosition=orderedZonePositionOf(state,instanceId);const{card,playerId:ownerId,zone:from}=removeCard(state,instanceId);const banked=from==="life"&&effect.to.zone==="hand"&&card.faceUp===true&&faceUpLifeBanksToDeck(state,ownerId,db);const toZone=banked?"deck":effect.to.zone;const toPosition=banked?"bottom":effect.to.position;const playerId=banked?ownerId:destination==="owner"?ownerId:resolvePlayer(execution.context,destination);const moved={instanceId:card.instanceId,cardNumber:card.cardNumber,...effect.faceUp===true||effect.faceUp===void 0&&from==="life"&&effect.to.zone==="life"&&card.faceUp===true?{faceUp:true}:{},...toZone==="board"?{rested:effect.rested??false,playedTurn:state.turn,attachedDon:[],powerModifiers:[]}:{}};insertCard(state,playerId,toZone,moved,toPosition??"bottom");if(from==="hand"&&toZone==="trash"){state.handTrashedByEffectOnTurn={...state.handTrashedByEffectOnTurn,[ownerId]:state.turn}}signals.push({kind:"card-moved",card:{instanceId:card.instanceId,cardNumber:card.cardNumber},ownerId,from,to:toZone,sourceCardNumber:mover.cardNumber,sourcePlayerId:mover.playerId});events.push({type:"card-moved",playerId,...visibilityOf(card,from,toZone,playerId,effect.faceUp),from,to:toZone,...movePosition(from,toZone,toPosition,originPosition),...effect.faceUp===void 0?{}:{faceUp:effect.faceUp},sourceCardNumber:mover.cardNumber});if(from==="deck"&&toZone==="hand"&&searchRevealIsPublic(execution.context.source.cardNumber,db)){events.push({type:"card-revealed",playerId,cardNumber:card.cardNumber,sourceCardNumber:execution.context.source.cardNumber})}}continue}if(effect.kind==="restrict"){for(const instanceId of instanceIds){const leaderPlayerId=["p1","p2"].find(candidate=>instanceId===`${candidate}-leader`);if(leaderPlayerId){if(effect.restriction!=="cannot-refresh"&&effect.restriction!=="cannot-attack"){throw new Error(`LEADER_RESTRICTION_UNSUPPORTED: ${instanceId}`)}const expiresAtTurn2=state.turn+effect.expiresAfterTurns;if(effect.restriction==="cannot-attack"){state.players[leaderPlayerId].leaderCannotAttackUntilTurn=expiresAtTurn2;events.push({type:"attack-prevented",playerId:leaderPlayerId,targetInstanceId:instanceId,targetCardNumber:state.players[leaderPlayerId].leaderCardNumber,expiresAtTurn:expiresAtTurn2,sourceCardNumber:execution.context.source.cardNumber});continue}state.players[leaderPlayerId].leaderCannotRefreshUntilTurn=expiresAtTurn2;events.push({type:"refresh-prevented",playerId:leaderPlayerId,targetInstanceId:instanceId,targetCardNumber:state.players[leaderPlayerId].leaderCardNumber,expiresAtTurn:expiresAtTurn2,sourceCardNumber:execution.context.source.cardNumber});continue}const ownerId=["p1","p2"].find(candidate=>state.players[candidate].board.some(card=>card.instanceId===instanceId));const target=ownerId?state.players[ownerId].board.find(card=>card.instanceId===instanceId):void 0;if(!ownerId||!target){throw new Error(`MISSING_MECHANIC_CARD: ${instanceId}`)}const expiresAtTurn=state.turn+effect.expiresAfterTurns;if(effect.restriction==="cannot-attack"){target.cannotAttackUntilTurn=expiresAtTurn;target.cannotAttackSourceCardNumber=execution.context.source.cardNumber;events.push({type:"attack-prevented",playerId:ownerId,targetInstanceId:instanceId,targetCardNumber:target.cardNumber,expiresAtTurn,sourceCardNumber:execution.context.source.cardNumber})}else if(effect.restriction==="cannot-rest"){target.cannotRestUntilTurn=expiresAtTurn;target.cannotRestSourceCardNumber=execution.context.source.cardNumber;events.push({type:"rest-prevented",playerId:ownerId,targetInstanceId:instanceId,targetCardNumber:target.cardNumber,expiresAtTurn,sourceCardNumber:execution.context.source.cardNumber})}else if(effect.restriction==="attack-taxed"){target.attackTaxUntilTurn=expiresAtTurn;target.attackTaxHandCards=effect.handTrashCost??1;target.attackTaxSourceCardNumber=execution.context.source.cardNumber;events.push({type:"attack-prevented",playerId:ownerId,targetInstanceId:instanceId,targetCardNumber:target.cardNumber,expiresAtTurn,sourceCardNumber:execution.context.source.cardNumber})}else if(effect.restriction==="cannot-block"){target.blockerDisabledUntilTurn=expiresAtTurn}else if(effect.restriction==="battle-ko-immune"){target.battleKoImmuneUntilTurn=expiresAtTurn}else if(effect.restriction==="ko-immune"){target.koImmuneToOpponentEffectsUntilTurn=expiresAtTurn}else if(effect.restriction==="effect-ko-immune"){target.koImmuneToEffectsUntilTurn=expiresAtTurn}else{target.cannotRefreshUntilTurn=expiresAtTurn;events.push({type:"refresh-prevented",playerId:ownerId,targetInstanceId:instanceId,targetCardNumber:target.cardNumber,expiresAtTurn,sourceCardNumber:execution.context.source.cardNumber})}}continue}if(effect.kind==="rest"){for(const instanceId of instanceIds){const donOwner=activeDonOwner(state,instanceId);if(donOwner){const player=state.players[donOwner];player.activeDon=player.activeDon.filter(id=>id!==instanceId);player.restedDon.push(instanceId);continue}const leaderPlayerId=["p1","p2"].find(playerId=>instanceId===`${playerId}-leader`);if(leaderPlayerId){state.players[leaderPlayerId].leaderRested=true;continue}const ownerId=["p1","p2"].find(candidate=>state.players[candidate].board.some(card=>card.instanceId===instanceId)||state.players[candidate].stage?.instanceId===instanceId);const target=ownerId?state.players[ownerId].board.find(card=>card.instanceId===instanceId)??(state.players[ownerId].stage?.instanceId===instanceId?state.players[ownerId].stage:void 0):void 0;if(!ownerId||!target){throw new Error(`MISSING_MECHANIC_CARD: ${instanceId}`)}if((target.cannotRestUntilTurn??-1)>=state.turn){continue}target.rested=true;if(state.players[ownerId].stage?.instanceId!==instanceId){events.push({type:"character-rested",playerId:ownerId,cardInstanceId:target.instanceId,cardNumber:target.cardNumber,sourceCardNumber:execution.context.source.cardNumber});signals.push({kind:"card-rested",card:{instanceId:target.instanceId,cardNumber:target.cardNumber},ownerId,sourcePlayerId:execution.context.sourcePlayerId,sourceIsCharacter:db.get(execution.context.source.cardNumber)?.category==="character"})}}continue}if(effect.kind==="grant-attack-active"){const expiresAtTurn=state.turn+effect.expiresAfterTurns;for(const instanceId of instanceIds){const leaderPlayerId=["p1","p2"].find(playerId=>instanceId===`${playerId}-leader`);if(leaderPlayerId){state.players[leaderPlayerId].leaderAttacksActiveUntilTurn=expiresAtTurn;events.push({type:"attack-active-granted",playerId:leaderPlayerId,targetInstanceId:instanceId,targetCardNumber:state.players[leaderPlayerId].leaderCardNumber,expiresAtTurn,sourceCardNumber:execution.context.source.cardNumber});continue}const target=[...state.players.p1.board,...state.players.p2.board].find(card=>card.instanceId===instanceId);if(!target)throw new Error(`MISSING_MECHANIC_CARD: ${instanceId}`);target.attacksActiveUntilTurn=expiresAtTurn;events.push({type:"attack-active-granted",playerId:state.players.p1.board.includes(target)?"p1":"p2",targetInstanceId:target.instanceId,targetCardNumber:target.cardNumber,expiresAtTurn,sourceCardNumber:execution.context.source.cardNumber})}continue}if(effect.kind==="at-end-of-turn"){const playerId=execution.context.sourcePlayerId;const player=state.players[playerId];if(effect.action==="bury"){player.endOfTurnPrograms=[...player.endOfTurnPrograms??[],{turn:state.turn,source:{instanceId:execution.context.source.instanceId,cardNumber:execution.context.source.cardNumber},effect:{kind:"move",binding:END_OF_TURN_OWED_BINDING,to:{player:"owner",zone:"deck",position:"bottom"}},bindings:{[END_OF_TURN_OWED_BINDING]:[...instanceIds]}}];continue}player.endOfTurnCardActions=[...player.endOfTurnCardActions??[],...instanceIds.map(instanceId=>({kind:"set-active",instanceId,turn:state.turn}))];continue}if(effect.kind==="grant-keyword"){for(const instanceId of instanceIds){const leaderPlayerId=["p1","p2"].find(playerId=>instanceId===`${playerId}-leader`);if(leaderPlayerId){const expiresAtTurn2=ownTurnExpiry(state,execution,effect.expiresAfterTurns);if(effect.keyword==="Unblockable"){state.players[leaderPlayerId].leaderUnblockableUntilTurn=expiresAtTurn2}else if(effect.keyword==="Double Attack"){state.players[leaderPlayerId].leaderDoubleAttackUntilTurn=expiresAtTurn2}else if(effect.keyword==="Banish"){state.players[leaderPlayerId].leaderBanishUntilTurn=expiresAtTurn2}else if(effect.keyword!=="Rush"&&effect.keyword!=="Rush: Character"){throw new Error(`LEADER_KEYWORD_UNSUPPORTED: ${effect.keyword}`)}events.push({type:"keyword-granted",playerId:leaderPlayerId,targetInstanceId:instanceId,targetCardNumber:state.players[leaderPlayerId].leaderCardNumber,keyword:effect.keyword,expiresAtTurn:expiresAtTurn2,sourceCardNumber:execution.context.source.cardNumber});continue}const target=[...state.players.p1.board,...state.players.p2.board].find(card=>card.instanceId===instanceId);if(!target)continue;const expiresAtTurn=ownTurnExpiry(state,execution,effect.expiresAfterTurns);if(effect.keyword==="Unblockable"){target.unblockableUntilTurn=expiresAtTurn}else if(effect.keyword==="Rush"){target.rushUntilTurn=expiresAtTurn}else if(effect.keyword==="Double Attack"){target.doubleAttackUntilTurn=expiresAtTurn}else if(effect.keyword==="Rush: Character"){target.rushCharacterUntilTurn=expiresAtTurn}else if(effect.keyword==="Banish"){target.banishUntilTurn=expiresAtTurn}else{target.blockerUntilTurn=expiresAtTurn}const targetOwnerId=state.players.p1.board.includes(target)?"p1":"p2";events.push({type:"keyword-granted",playerId:targetOwnerId,targetInstanceId:target.instanceId,targetCardNumber:target.cardNumber,keyword:effect.keyword,expiresAtTurn,sourceCardNumber:execution.context.source.cardNumber})}continue}if(effect.kind==="activate-event"){const eventId=instanceIds[0];if(eventId===void 0)continue;const playerId=execution.context.sourcePlayerId;const player=state.players[playerId];const zone=["hand","trash"].find(candidate=>player[candidate].some(card=>card.instanceId===eventId));if(!zone)continue;const index=player[zone].findIndex(card=>card.instanceId===eventId);const[eventCard]=player[zone].splice(index,1);if(!eventCard)continue;const entry=eventMainRegistry.get(eventCard.cardNumber);player.trash.push(eventCard);events.push({type:"event-activated",playerId,cardNumber:eventCard.cardNumber,...effect.mainOnly===true?{mainOnly:true}:{}});if(!entry)continue;if(entry.donMinus){returnDonToDeck(state,playerId,entry.donMinus,eventCard,events)}if(entry.restDon){player.restedDon.push(...player.activeDon.splice(0,entry.restDon))}const nested=executeMechanicProgram(state,{sourcePlayerId:playerId,source:eventCard},entry.program,db);events.push(...nested.events);signals.push(...nested.signals);if(nested.pending)return{pending:nested.pending,events,signals};continue}if(effect.kind==="remember-target"){const remembered=instanceIds[0];const owner=state.players[execution.context.sourcePlayerId].board.find(card=>card.instanceId===execution.context.source.instanceId);if(owner&&remembered!==void 0){owner.rememberedTarget={instanceId:remembered,turn:state.turn}}continue}if(effect.kind==="redirect-attack"){const attack=state.activeAttack;const target=instanceIds[0];if(attack&&target!==void 0&&target!==attack.targetInstanceId){retargetAttack(attack,target);events.push({type:"attack-redirected",playerId:attack.defenderPlayerId,targetInstanceId:target,sourceCardNumber:execution.context.source.cardNumber})}continue}if(effect.kind==="grant-attribute"){const expiresAtTurn=state.turn+effect.expiresAfterTurns;for(const instanceId of instanceIds){const target=[...state.players.p1.board,...state.players.p2.board].find(card=>card.instanceId===instanceId);if(!target)continue;const live=(target.grantedAttributes?.expiresAtTurn??-1)>=state.turn?target.grantedAttributes?.attributes??[]:[];target.grantedAttributes={attributes:[...new Set([...live,effect.attribute])],expiresAtTurn}}continue}if(effect.kind==="negate"){for(const instanceId of instanceIds){const leaderPlayerId=["p1","p2"].find(candidate=>instanceId===`${candidate}-leader`);const ownerId=leaderPlayerId??["p1","p2"].find(candidate=>state.players[candidate].board.some(card=>card.instanceId===instanceId));const target=leaderPlayerId?{instanceId,cardNumber:state.players[leaderPlayerId].leaderCardNumber}:ownerId?state.players[ownerId].board.find(card=>card.instanceId===instanceId):void 0;if(!ownerId||!target){throw new Error(`MISSING_MECHANIC_CARD: ${instanceId}`)}const expiresAtTurn=state.turn+effect.expiresAfterTurns;negateEffects(state,instanceId,expiresAtTurn);events.push({type:"effect-negated",playerId:ownerId,targetInstanceId:instanceId,targetCardNumber:target.cardNumber,expiresAtTurn,sourceCardNumber:execution.context.source.cardNumber})}continue}if(effect.kind==="modify-power"){const multiplier=effect.perGivenDonOf===void 0?1:givenDonOfBinding(state,execution,effect.perGivenDonOf);const steps=effect.perCards===void 0?1:Math.floor((execution.bindings[effect.perCards.binding]?.length??0)/effect.perCards.each);const costOf2=effect.perCostOf===void 0?1:printedCostOfBinding(state,execution,effect.perCostOf,db);const amount=effect.amount*multiplier*steps*costOf2;if(amount===0)continue;const expiresAtTurn=ownTurnExpiry(state,execution,effect.expiresAfterTurns);const sourceCardNumber=execution.context.source.cardNumber;const sourceInstanceId=execution.context.source.instanceId;for(const instanceId of instanceIds){const modifier={amount,expiresAtTurn,sourceCardNumber,sourceInstanceId};const leaderPlayerId=["p1","p2"].find(playerId=>instanceId===`${playerId}-leader`);let owner;if(leaderPlayerId){state.players[leaderPlayerId].leaderPowerModifiers.push(modifier);owner=leaderPlayerId}else{const onP1=state.players.p1.board.find(card=>card.instanceId===instanceId);const target=onP1??state.players.p2.board.find(card=>card.instanceId===instanceId);if(!target)throw new Error(`MISSING_MECHANIC_CARD: ${instanceId}`);target.powerModifiers??=[];target.powerModifiers.push(modifier);owner=onP1?"p1":"p2"}events.push({type:"power-changed",playerId:owner,targetInstanceId:instanceId,amount,expiresAtTurn,sourceCardNumber,sourceInstanceId})}continue}if(effect.kind==="modify-cost"){for(const instanceId of instanceIds){const target=[...state.players.p1.board,...state.players.p2.board].find(card=>card.instanceId===instanceId);if(!target)throw new Error(`MISSING_MECHANIC_CARD: ${instanceId}`);target.costModifiers??=[];target.costModifiers.push({amount:effect.amount,expiresAtTurn:ownTurnExpiry(state,execution,effect.expiresAfterTurns)})}continue}if(effect.kind==="update"){for(const instanceId of instanceIds){const leaderPlayerId=["p1","p2"].find(candidate=>instanceId===`${candidate}-leader`);if(leaderPlayerId){if(effect.rested!==void 0){state.players[leaderPlayerId].leaderRested=effect.rested}continue}const target=[...state.players.p1.life,...state.players.p1.board,...state.players.p1.stage?[state.players.p1.stage]:[],...state.players.p2.life,...state.players.p2.board,...state.players.p2.stage?[state.players.p2.stage]:[]].find(card=>card.instanceId===instanceId);if(!target)throw new Error(`MISSING_MECHANIC_CARD: ${instanceId}`);if(effect.faceUp!==void 0){const owner=["p1","p2"].find(candidate=>state.players[candidate].life.some(card=>card.instanceId===instanceId));if(owner){events.push(...flipLife(state,owner,instanceId,effect.faceUp,execution.context.source.cardNumber))}else{target.faceUp=effect.faceUp}}if(effect.rested!==void 0&&"rested"in target){target.rested=effect.rested}}continue}if(!effect.remainder&&!effect.skipReplacements){for(const instanceId of instanceIds){const ownerId=["p1","p2"].find(candidate=>state.players[candidate].board.some(card=>card.instanceId===instanceId));const threatened=ownerId?state.players[ownerId].board.find(card=>card.instanceId===instanceId):void 0;execution.bindings[koProtectorsKey(instanceId)]=ownerId&&threatened?eligibleReplacements(state,execution.context.sourcePlayerId,ownerId,threatened,db).map(({protector})=>protector.instanceId):[]}}const koOrder=(()=>{if(effect.skipReplacements||instanceIds.length<2)return instanceIds;const offered=instanceIds.filter(instanceId=>{const ownerId=["p1","p2"].find(candidate=>state.players[candidate].board.some(card=>card.instanceId===instanceId));const threatened=ownerId?state.players[ownerId].board.find(card=>card.instanceId===instanceId):void 0;return ownerId!==void 0&&threatened!==void 0&&eligibleReplacements(state,execution.context.sourcePlayerId,ownerId,threatened,db).length>0});return[...offered,...instanceIds.filter(instanceId=>!offered.includes(instanceId))]})();for(const[index,instanceId]of koOrder.entries()){const ownerId=["p1","p2"].find(candidate=>state.players[candidate].board.some(card=>card.instanceId===instanceId));if(ownerId){const immuneTarget=state.players[ownerId].board.find(card=>card.instanceId===instanceId);if(immuneTarget&&isRemovalImmune(state,ownerId,immuneTarget,execution.context.sourcePlayerId,execution.context.source.cardNumber,db,"ko",execution.context.source.instanceId)){continue}const threatened=state.players[ownerId].board.find(card=>card.instanceId===instanceId);const protectorsBefore=execution.bindings[koProtectorsKey(instanceId)];const eligible=effect.skipReplacements||!threatened?[]:eligibleReplacements(state,execution.context.sourcePlayerId,ownerId,threatened,db).filter(({protector})=>protectorsBefore===void 0||protectorsBefore.includes(protector.instanceId));if(eligible.length>0&&threatened){const remaining2=koOrder.slice(index+1);const thenRest=(effectNow,restBind,rest)=>{if(rest.length===0)return effectNow;execution.bindings[restBind]=[...rest];return{kind:"sequence",effects:[effectNow,{kind:"knock-out",binding:restBind,remainder:true}]}};const targetName=db.require(threatened.cardNumber).name;const koBind=`${effect.binding}-ko-${instanceId}`;execution.bindings[koBind]=[instanceId];const prevented=eligible.some(({entry})=>entry.mandatory);return{pending:{kind:"choice",execution,chooserPlayerId:ownerId,branches:[...prevented?[]:[{id:`ko:${instanceId}`,label:`K.O. ${targetName}`,effect:thenRest({kind:"knock-out",binding:koBind,skipReplacements:true},`${effect.binding}-after-replacement`,remaining2)}],...eligible.map(({protector,entry})=>{const bind=`${effect.binding}-replace-${protector.instanceId}`;execution.bindings[bind]=[protector.instanceId];const covered=replacementCoveredTargets(state,execution.context.sourcePlayerId,ownerId,{protector,entry},remaining2,db,"ko");execution.bindings[`${bind}-threatened`]=[instanceId,...covered];return{id:`replace:${protector.instanceId}`,label:`${entry.label} instead of K.O. ${boardCardNames(state,ownerId,[instanceId,...covered],db)}`,effect:thenRest(replacementCostEffect({protector,entry},ownerId===execution.context.sourcePlayerId,bind),`${bind}-after-replacement`,remaining2.filter(rest=>!covered.includes(rest)))}})]},events,signals}}const removed=knockOut(state,ownerId,instanceId,execution.context.source.cardNumber);if(!removed)throw new Error(`MISSING_MECHANIC_CARD: ${instanceId}`);signals.push({kind:"card-moved",card:removed.card,ownerId,from:"board",to:"trash",ko:true,sourceCardNumber:execution.context.source.cardNumber,sourcePlayerId:execution.context.sourcePlayerId});events.push(...removed.events);continue}const stageOwnerId=["p1","p2"].find(candidate=>state.players[candidate].stage?.instanceId===instanceId);if(!stageOwnerId){if(effect.remainder)continue;throw new Error(`INVALID_KO_SOURCE_ZONE: ${instanceId}`)}const stage=state.players[stageOwnerId].stage;if(!stage)throw new Error(`MISSING_MECHANIC_CARD: ${instanceId}`);state.players[stageOwnerId].stage=null;state.players[stageOwnerId].trash.push({instanceId:stage.instanceId,cardNumber:stage.cardNumber});signals.push({kind:"card-moved",card:{instanceId:stage.instanceId,cardNumber:stage.cardNumber},ownerId:stageOwnerId,from:"board",to:"trash",ko:true});events.push({type:"character-ko",playerId:stageOwnerId,cardInstanceId:stage.instanceId,cardNumber:stage.cardNumber,sourceCardNumber:execution.context.source.cardNumber})}}return{pending:null,events,signals}}var SOURCE_BINDING="source";var END_OF_TURN_OWED_BINDING="end-of-turn-owed";var koProtectorsKey=instanceId=>`knock-out-protectors:${instanceId}`;function executeMechanicProgram(state,context,program,db=cards,initialBindings={}){const queue=[];flatten(program.effect,queue);return continueExecution(state,{context,bindings:{...initialBindings,[SOURCE_BINDING]:[context.source.instanceId]},queue},db)}function orderReactionOptions(reactions){const seen=new Set;const options=[];for(const reaction of reactions){const{cardNumber,instanceId}=reaction.context.source;if(seen.has(cardNumber))continue;seen.add(cardNumber);options.push(`reaction:${instanceId}`)}return options}function pickOrderedReaction(reactions,optionId){if(!orderReactionOptions(reactions).includes(optionId)){throw new Error(`INVALID_MECHANIC_OPTION: ${optionId}`)}const instanceId=optionId.slice("reaction:".length);const index=reactions.findIndex(reaction=>reaction.context.source.instanceId===instanceId);return{chosen:reactions[index],rest:reactions.filter((_,other)=>other!==index)}}function attachDon(state,playerId,targetInstanceId,don){const player=state.players[playerId];if(targetInstanceId===leaderInstanceId2(playerId)){player.leaderAttachedDon.push(...don);return}const target=player.board.find(card=>card.instanceId===targetInstanceId);if(!target)throw new Error(`MISSING_DON_TARGET: ${targetInstanceId}`);target.attachedDon??=[];target.attachedDon.push(...don)}function addPowerModifier(state,playerId,targetInstanceId,amount,expiresAtTurn,source,battleScoped=false){const modifier={amount,expiresAtTurn,...battleScoped?{battleScoped:true}:{},...source?{sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId}:{}};const player=state.players[playerId];if(targetInstanceId===leaderInstanceId2(playerId)){player.leaderPowerModifiers.push(modifier);return}const target=player.board.find(card=>card.instanceId===targetInstanceId);if(!target)throw new Error(`MISSING_POWER_TARGET: ${targetInstanceId}`);target.powerModifiers??=[];target.powerModifiers.push(modifier)}var BESPOKE_TRIGGERS=["OP04-016","OP13-021","OP12-039","EB04-028","OP12-057","ST36-002","OP10-109","OP12-113","P-088","OP13-116","OP11-079","OP11-081","OP02-068","OP11-061","OP06-058","OP12-098"];function opensTriggerWindow(state,playerId,card){if(card.faceUp===true&&faceUpLifeBanksToDeck(state,playerId)){return false}return BESPOKE_TRIGGERS.includes(card.cardNumber)||getTriggerMechanicProgram(card.cardNumber)!==void 0}function settleDoubleAttackDamage(state,events){const owed=state.pendingBattleDamage;if(!owed)return;if(state.phase==="finished"||state.phase==="trigger")return;if(state.pendingTrigger||state.pendingEffect||state.activeAttack)return;if(state.players[owed.playerId].life.length===0){delete state.pendingBattleDamage;return}if(owed.remaining>1){state.pendingBattleDamage={...owed,remaining:owed.remaining-1}}else{delete state.pendingBattleDamage}events.push(...dealDamage(state,owed.playerId,owed.banish===true))}function settleEffectDamage(state,events){const trigger=state.pendingTrigger;if(!trigger?.fromEffect)return;if(state.pendingEffect)return;const interrupted=state.phase==="block"||state.phase==="counter"?state.phase:"main";if(state.phase!=="finished"&&opensTriggerWindow(state,trigger.playerId,trigger.card)){events.push({type:"card-revealed",playerId:trigger.playerId,cardNumber:trigger.card.cardNumber,sourceCardNumber:trigger.card.cardNumber,...trigger.card.faceUp===true?{}:{visibleTo:trigger.playerId}});state.pendingTrigger={playerId:trigger.playerId,card:trigger.card,resume:{phase:interrupted,playerId:state.activePlayer}};state.phase="trigger";state.activePlayer=trigger.playerId;return}state.pendingTrigger=null;events.push(...bankDamagedLifeCard(state,trigger.playerId,trigger.card))}function resumeAfterTrigger(state){const resume=state.pendingTrigger?.resume;if(!resume){resumeMainAfterBattle(state);return}state.pendingTrigger=null;if(state.phase==="finished")return;state.phase=resume.phase;state.activePlayer=resume.playerId}function handOverPendingEffect(state){const pending=state.pendingEffect;if(!pending||pending.playerId===state.activePlayer)return;state.pendingEffectResume??={phase:state.phase==="block"||state.phase==="counter"?state.phase:"main",playerId:state.activePlayer};state.activePlayer=pending.playerId}function resumeMainAfterBattle(state){const attackerPlayerId=state.activeAttack?.attackerPlayerId;clearBattleScopedBasePower(state);state.activeAttack=null;if(!state.pendingTrigger?.fromEffect)state.pendingTrigger=null;if(state.phase!=="finished"&&attackerPlayerId){state.phase="main";state.activePlayer=attackerPlayerId}}function clearBattleScopedPower(state){if(state.activeAttack)return;for(const playerId of["p1","p2"]){const player=state.players[playerId];if(player.leaderPowerModifiers.some(modifier=>modifier.battleScoped)){player.leaderPowerModifiers=player.leaderPowerModifiers.filter(modifier=>!modifier.battleScoped)}for(const card of player.board){if(card.powerModifiers?.some(modifier=>modifier.battleScoped)){card.powerModifiers=card.powerModifiers.filter(modifier=>!modifier.battleScoped)}}}}function clearBattleScopedBasePower(state){for(const playerId of["p1","p2"]){const player=state.players[playerId];const leaderBasePowers=withoutBasePowerSetters(player.leaderBasePowers,setter=>setter.battleScoped===true);if(leaderBasePowers)player.leaderBasePowers=leaderBasePowers;else delete player.leaderBasePowers;for(const card of player.board){const basePowerOverrides=withoutBasePowerSetters(card.basePowerOverrides,setter=>setter.battleScoped===true);if(basePowerOverrides)card.basePowerOverrides=basePowerOverrides;else delete card.basePowerOverrides}}}function returnOwnCharacterToHand(state,playerId,instanceId,sourceCardNumber){const player=state.players[playerId];const boardIndex=player.board.findIndex(card2=>card2.instanceId===instanceId);const[returned]=boardIndex===-1?[]:player.board.splice(boardIndex,1);if(!returned)throw new Error(`MISSING_EFFECT_TARGET: ${instanceId}`);player.restedDon.push(...returned.attachedDon??[]);const card={instanceId:returned.instanceId,cardNumber:returned.cardNumber};player.hand.push(card);queuePendingContinuations(state,getMechanicSignalInvocations(state,[{kind:"card-moved",card,ownerId:playerId,from:"board",to:"hand",sourceCardNumber,sourcePlayerId:playerId}],false));return[{type:"card-moved",playerId,cardInstanceId:card.instanceId,cardNumber:card.cardNumber,from:"board",to:"hand",sourceCardNumber}]}function resolveP105LifeCost({state,effect,optionId}){if(optionId==="skip"){state.pendingEffect=null;return[]}if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const taken=takeFromLife(state,effect.playerId,optionId,{to:"hand",sourceCardNumber:effect.sourceCardNumber});if(!taken)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);player.hand.push({instanceId:taken.card.instanceId,cardNumber:taken.card.cardNumber});const eligibleInstanceIds=[`${effect.playerId}-leader`,...player.board.map(card=>card.instanceId)];state.pendingEffect=player.restedDon.length>0?{kind:"give-rested-don",playerId:effect.playerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,eligibleInstanceIds,maxCount:1,resumePhase:"main",resumePlayerId:effect.playerId}:null;return taken.events}function resolveSt35AttackCost({state,effect,optionId}){if(optionId!=="apply"&&optionId!=="skip"){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];if(optionId==="apply"){player.trash.push(...player.deck.splice(0,2));if(effect.sourceCardNumber==="ST35-003"&&state.players[effect.targetPlayerId].hand.length>=7){const target=state.players[effect.targetPlayerId];state.pendingEffect={kind:"opponent-discard",playerId:effect.targetPlayerId,sourcePlayerId:effect.playerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,eligibleInstanceIds:target.hand.map(card=>card.instanceId),resumePhase:"block",resumePlayerId:effect.targetPlayerId};state.activePlayer=effect.targetPlayerId;return[]}if(effect.sourceCardNumber==="OP12-090"&&effect.eligibleInstanceIds.length>0){state.pendingEffect={kind:"reduce-cost",playerId:effect.playerId,targetPlayerId:effect.targetPlayerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,eligibleInstanceIds:effect.eligibleInstanceIds,amount:-2,expiresAtTurn:state.turn,resumePlayerId:effect.resumePlayerId};return[]}}state.pendingEffect=null;state.phase="block";state.activePlayer=effect.resumePlayerId;return[]}function resolveReduceCost({state,effect,optionId}){if(optionId!=="skip"){if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const target=state.players[effect.targetPlayerId].board.find(card=>card.instanceId===optionId);if(!target)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);target.costModifiers??=[];target.costModifiers.push({amount:effect.amount,expiresAtTurn:effect.expiresAtTurn})}state.pendingEffect=null;state.phase="block";state.activePlayer=effect.resumePlayerId;return[]}function resolveSlaveArrowCost({state,effect,optionId}){const resume=()=>{state.pendingEffect=null;state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId};if(optionId==="skip"&&effect.step==="cost"){resume();return[]}if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const boost=targetInstanceId=>{const attack=state.activeAttack;if(!attack)return[];const used={type:"counter-used",playerId:effect.playerId,cardNumber:effect.sourceCardNumber,power:effect.power};if(targetInstanceId===attack.targetInstanceId){attack.counterPower+=effect.power;return[used]}addPowerModifier(state,effect.playerId,targetInstanceId,effect.power,state.turn,{instanceId:effect.sourceInstanceId,cardNumber:effect.sourceCardNumber},true);return[{...used,targetInstanceId}]};if(effect.step==="target"){const events2=boost(optionId);resume();return events2}const player=state.players[effect.playerId];const moved=returnOwnCharacterToHand(state,effect.playerId,optionId,effect.sourceCardNumber);const attacked=state.activeAttack?.targetInstanceId;const targets=[...new Set([...attacked!==void 0&&(attacked===`${effect.playerId}-leader`||player.board.some(card=>card.instanceId===attacked))?[attacked]:[],`${effect.playerId}-leader`,...player.board.map(card=>card.instanceId)])];if(targets.length>1){state.pendingEffect={...effect,step:"target",eligibleInstanceIds:targets};return moved}const events=boost(targets[0]);resume();return[...moved,...events]}function resolveSt34GuessCost({state,effect,optionId,db}){const[kind,costText]=optionId.split(":");const chosenCost=Number(costText);if(kind!=="cost"||!Number.isInteger(chosenCost)||chosenCost<0||chosenCost>10){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const revealed=state.players[effect.targetPlayerId].deck[0];const matched=revealed!==void 0&&db.require(revealed.cardNumber).cost===chosenCost;recordDeckTopKnowledge(state,effect.playerId,effect.targetPlayerId);recordDeckTopKnowledge(state,effect.targetPlayerId,effect.targetPlayerId);const events=revealed?[{type:"card-revealed",playerId:effect.playerId,cardNumber:revealed.cardNumber,sourceCardNumber:effect.sourceCardNumber}]:[];if(effect.outcome==="oven"){addDonFromDeck(state,effect.playerId,1,"rested")}if(matched&&effect.outcome==="perospero"){events.push(...drawCards(state,effect.playerId,1,effect.sourceCardNumber));addDonFromDeck(state,effect.playerId,1,"active")}else if(matched&&effect.outcome==="counter-event"){if(!state.activeAttack)throw new Error("NO_ACTIVE_ATTACK");state.activeAttack.counterPower+=5e3}else if(matched&&(effect.outcome==="oven"||effect.outcome==="cognac")){const maxCost=effect.outcome==="oven"?3:8;const eligibleInstanceIds=state.players[effect.targetPlayerId].board.filter(card=>(db.require(card.cardNumber).cost??99)<=maxCost).map(card=>card.instanceId);if(eligibleInstanceIds.length>0){state.pendingEffect={kind:"ko-character",playerId:effect.playerId,targetPlayerId:effect.targetPlayerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,eligibleInstanceIds,resumePhase:effect.resumePhase,resumePlayerId:effect.resumePlayerId}}}if(!state.pendingEffect){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return events}function resolveKinemonCost({state,effect,optionId}){if(optionId==="skip")return[];const player=state.players[effect.playerId];if(optionId==="leader"&&!player.leaderRested){player.leaderRested=true}else if(optionId==="don"&&player.activeDon.length>0){player.restedDon.push(...player.activeDon.splice(0,1))}else{throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const events=drawCards(state,effect.playerId,2,effect.sourceCardNumber);if(player.hand.length>0){state.pendingEffect={kind:"draw-trash",playerId:effect.playerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,trashCount:1}}return events}function markHandTrashedByEffect(state,playerId){state.handTrashedByEffectOnTurn={...state.handTrashedByEffectOnTurn,[playerId]:state.turn}}function resolveSt34Discard({state,effect,optionId}){if(optionId==="skip")return[];if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const handIndex=player.hand.findIndex(card=>card.instanceId===optionId);const[discard]=player.hand.splice(handIndex,1);if(!discard)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);player.trash.push(discard);if(effect.after==="perospero"){state.pendingEffect={kind:"st34-guess-cost",playerId:effect.playerId,targetPlayerId:effect.targetPlayerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,outcome:"perospero",resumePhase:"main",resumePlayerId:effect.playerId};return[]}const events=[];returnDonToDeck(state,effect.playerId,4,effectSource(effect),events);const life=player.deck.shift();if(life){events.push(...addToLife(state,effect.playerId,life,{from:"deck",sourceCardNumber:effect.sourceCardNumber}))}const eligibleInstanceIds=state.players[effect.targetPlayerId].board.map(card=>card.instanceId);if(eligibleInstanceIds.length>0){state.pendingEffect={kind:"set-base-power-zero",playerId:effect.playerId,targetPlayerId:effect.targetPlayerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,eligibleInstanceIds,expiresAtTurn:state.turn}}return events}function navyHandTrashDraws(state,playerId,sourceCardNumber,db){return state.players[playerId].leaderCardNumber==="OP12-040"&&!leaderEffectsNegated(state,playerId)&&db.require(sourceCardNumber).types.includes("Navy")?1:0}function resolveNavyDiscard({state,effect,optionId,db}){if(optionId==="skip"){if(!effect.optional)throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`);if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return[]}if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const handIndex=player.hand.findIndex(card=>card.instanceId===optionId);const[discard]=player.hand.splice(handIndex,1);if(!discard)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);player.trash.push(discard);markHandTrashedByEffect(state,effect.playerId);const leaderDrawCount=(effect.leaderDrawCount??0)+navyHandTrashDraws(state,effect.playerId,effect.sourceCardNumber,db);const events=[];if(effect.remaining>1&&player.hand.length>0){state.pendingEffect={...effect,eligibleInstanceIds:player.hand.map(card=>card.instanceId),remaining:effect.remaining-1,optional:false,leaderDrawCount};return events}events.push(...drawCards(state,effect.playerId,leaderDrawCount,effect.sourceCardNumber));if(effect.after.kind==="draw"){events.push(...drawCards(state,effect.playerId,effect.after.count,effect.sourceCardNumber))}else if(effect.after.kind==="bottom-deck"&&effect.after.eligibleInstanceIds.length>0){state.pendingEffect={kind:"bottom-deck-character",playerId:effect.playerId,targetPlayerId:effect.after.targetPlayerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,eligibleInstanceIds:effect.after.eligibleInstanceIds,remaining:effect.after.remaining,...effect.resumePhase?{resumePhase:effect.resumePhase}:{},...effect.resumePlayerId?{resumePlayerId:effect.resumePlayerId}:{}}}else if(effect.after.kind==="prevent-attack"&&effect.after.eligibleInstanceIds.length>0){state.pendingEffect={kind:"prevent-attack",playerId:effect.playerId,targetPlayerId:effect.after.targetPlayerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,eligibleInstanceIds:effect.after.eligibleInstanceIds,remaining:effect.after.remaining,expiresAtTurn:effect.after.expiresAtTurn,...effect.resumePhase?{resumePhase:effect.resumePhase}:{},...effect.resumePlayerId?{resumePlayerId:effect.resumePlayerId}:{}}}else if(effect.after.kind==="opponent-discard"&&state.players[effect.after.targetPlayerId].hand.length>=6){const targetPlayer=state.players[effect.after.targetPlayerId];state.pendingEffect={kind:"opponent-discard",playerId:effect.after.targetPlayerId,sourcePlayerId:effect.playerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,eligibleInstanceIds:targetPlayer.hand.map(card=>card.instanceId),resumePhase:"block",resumePlayerId:effect.after.targetPlayerId};state.activePlayer=effect.after.targetPlayerId}else if(effect.sourceCardNumber==="OP12-047"){const revealed=player.deck.splice(0,5);state.pendingEffect={kind:"navy-search",playerId:effect.playerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,revealed,eligibleInstanceIds:revealed.filter(card=>{const definition=db.require(card.cardNumber);return definition.types.includes("Navy")&&definition.name!=="Sengoku"}).map(card=>card.instanceId),remaining:2}}if(!state.pendingEffect&&effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return events}function resolveOpponentDiscard({state,effect,optionId}){if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const handIndex=player.hand.findIndex(card=>card.instanceId===optionId);const[discard]=player.hand.splice(handIndex,1);if(!discard)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);player.trash.push(discard);markHandTrashedByEffect(state,effect.playerId);const remaining2=(effect.remaining??1)-1;const eligibleInstanceIds=effect.eligibleInstanceIds.filter(candidate=>candidate!==optionId);if(remaining2>0&&eligibleInstanceIds.length>0){state.pendingEffect={...effect,remaining:remaining2,eligibleInstanceIds};return[]}state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId;return[]}function resolveBadMannersCounter({state,effect,optionId}){if(optionId==="skip")return[];if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const handIndex=player.hand.findIndex(card=>card.instanceId===optionId);const[discard]=player.hand.splice(handIndex,1);if(!discard||!state.activeAttack){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}player.trash.push(discard);state.activeAttack.counterPower+=3e3;return[{type:"card-moved",playerId:effect.playerId,cardInstanceId:discard.instanceId,cardNumber:discard.cardNumber,from:"hand",to:"trash",sourceCardNumber:effect.sourceCardNumber},{type:"counter-used",playerId:effect.playerId,cardNumber:effect.sourceCardNumber,power:3e3}]}function resolveDiscardForLife({state,effect,optionId}){if(optionId==="skip"){if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return[]}if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const handIndex=player.hand.findIndex(card=>card.instanceId===optionId);const[discard]=player.hand.splice(handIndex,1);if(!discard)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);player.trash.push({instanceId:discard.instanceId,cardNumber:discard.cardNumber});if(effect.kind==="discard-supernova-draw-two"){return drawCards(state,effect.playerId,2,effect.sourceCardNumber)}const life=player.deck.shift();const events=life?addToLife(state,effect.playerId,life,{from:"deck",sourceCardNumber:effect.sourceCardNumber}):[];if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return events}function resolveNavySearch({state,effect,optionId,db}){const player=state.players[effect.playerId];if(optionId==="skip"){player.deck.push(...effect.revealed);return[]}if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const selected=effect.revealed.find(card=>card.instanceId===optionId);if(!selected)throw new Error(`MISSING_SEARCH_CARD: ${optionId}`);player.hand.push(selected);const revealed=effect.revealed.filter(card=>card.instanceId!==optionId);const eligibleInstanceIds=effect.eligibleInstanceIds.filter(candidate=>candidate!==optionId);if(effect.remaining>1&&eligibleInstanceIds.length>0){state.pendingEffect={...effect,revealed,eligibleInstanceIds,remaining:effect.remaining-1}}else{player.deck.push(...revealed)}return[{type:"card-revealed",playerId:effect.playerId,cardNumber:selected.cardNumber,sourceCardNumber:effect.sourceCardNumber,...searchRevealIsPublic(effect.sourceCardNumber,db)?{}:{visibleTo:effect.playerId}}]}function resolveSearchTopFive({state,effect,optionId,db}){const player=state.players[effect.playerId];const[kind,selection]=optionId.split(":");if(kind!=="search-select"||!selection||selection!=="skip"&&!effect.eligibleInstanceIds.includes(selection)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const selected=effect.revealed.find(card=>card.instanceId===selection);if(selected)player.hand.push(selected);player.deck.push(...effect.revealed.filter(card=>card.instanceId!==selected?.instanceId));if(effect.sourceCardNumber==="OP16-026"){const eligibleInstanceIds=player.hand.filter(card=>{const definition=db.require(card.cardNumber);return definition.category==="character"&&(definition.cost??99)<=2}).map(card=>card.instanceId);if(eligibleInstanceIds.length>0){state.pendingEffect={kind:"free-play",playerId:effect.playerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,eligibleInstanceIds}}}if(effect.thenTrash&&player.hand.length>0){state.pendingEffect={kind:"navy-discard",playerId:effect.playerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,eligibleInstanceIds:player.hand.map(card=>card.instanceId),remaining:effect.thenTrash,optional:false,after:{kind:"none"}}}if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return selected?[{type:"card-revealed",playerId:effect.playerId,cardNumber:selected.cardNumber,sourceCardNumber:effect.sourceCardNumber,...searchRevealIsPublic(effect.sourceCardNumber,db)?{}:{visibleTo:effect.playerId}}]:[]}function resolveDrawTrash({state,effect,optionId,db}){const player=state.players[effect.playerId];const handIndex=player.hand.findIndex(card2=>card2.instanceId===optionId);const[card]=player.hand.splice(handIndex,1);if(!card)throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`);player.trash.push(card);markHandTrashedByEffect(state,effect.playerId);const source=db.require(effect.sourceCardNumber);const events=source.types.includes("Navy")&&player.leaderCardNumber==="OP12-040"&&!leaderEffectsNegated(state,effect.playerId)?drawCards(state,effect.playerId,1,effect.sourceCardNumber):[];if(effect.trashCount>1){state.pendingEffect={...effect,trashCount:effect.trashCount-1}}else if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return events}function resolveBottomDeckCharacter({state,effect,optionId}){if(optionId==="skip"){if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return[]}if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const ownerId=["p1","p2"].find(playerId=>state.players[playerId].board.some(card=>card.instanceId===optionId));if(!ownerId)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);const targetPlayer=state.players[ownerId];const target=targetPlayer.board.find(card=>card.instanceId===optionId);if(!target)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);if(effect.kind==="bottom-deck-character"){targetPlayer.board=targetPlayer.board.filter(card=>card.instanceId!==optionId);targetPlayer.restedDon.push(...target.attachedDon??[]);targetPlayer.deck.push({instanceId:target.instanceId,cardNumber:target.cardNumber})}else{target.cannotAttackUntilTurn=effect.expiresAtTurn;target.cannotAttackSourceCardNumber=effect.sourceCardNumber}const eligibleInstanceIds=effect.eligibleInstanceIds.filter(candidate=>candidate!==optionId);if(effect.remaining>1&&eligibleInstanceIds.length>0){state.pendingEffect={...effect,eligibleInstanceIds,remaining:effect.remaining-1}}else if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return effect.kind==="prevent-attack"?[{type:"attack-prevented",playerId:effect.playerId,targetInstanceId:target.instanceId,targetCardNumber:target.cardNumber,expiresAtTurn:effect.expiresAtTurn,sourceCardNumber:effect.sourceCardNumber}]:[{type:"card-moved",playerId:ownerId,cardInstanceId:target.instanceId,cardNumber:target.cardNumber,from:"board",to:"deck",position:"bottom",sourceCardNumber:effect.sourceCardNumber}]}function resolveReturnDon({state,effect,optionId}){const pool=optionId.slice("return-don:".length);if(!optionId.startsWith("return-don:")||!donReturnPools(state,effect.playerId,effect.origins,effect.onFieldAtPayment).includes(pool)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const origins=placeReturnedDon(state,effect.playerId,effect.origins,pool,effect.onFieldAtPayment);if(origins.length>0&&donReturnHasChoice(state,effect.playerId,origins,effect.onFieldAtPayment)){state.pendingEffect={...effect,origins};return[]}state.pendingEffect=effect.displaced;state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId;return[]}function resolveGiveRestedDon({state,effect,optionId}){if(optionId==="skip")return[];if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const pool=effect.from==="active"?player.activeDon:player.restedDon;const moved=pool.splice(0,Math.min(effect.maxCount,pool.length));if(optionId===leaderInstanceId3(effect.playerId)){player.leaderAttachedDon.push(...moved)}else{const target=player.board.find(card=>card.instanceId===optionId);if(!target)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);target.attachedDon??=[];target.attachedDon.push(...moved)}const eligibleInstanceIds=effect.eligibleInstanceIds.filter(candidate=>candidate!==optionId);if((effect.remainingTargets??1)>1&&eligibleInstanceIds.length>0&&pool.length>0){state.pendingEffect={...effect,eligibleInstanceIds,remainingTargets:(effect.remainingTargets??1)-1}}return[{type:"don-attached",playerId:effect.playerId,targetInstanceId:optionId,count:moved.length,sourceCardNumber:effect.sourceCardNumber}]}function resolveNamiLeader({state,effect,optionId}){if(optionId==="skip"){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId;return[]}if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const handIndex=player.hand.findIndex(card=>card.instanceId===optionId);const[discard]=player.hand.splice(handIndex,1);if(!discard)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);player.trash.push(discard);applyPowerModifier(state,effect.playerId,leaderInstanceId3(effect.playerId),2e3,state.turn,{instanceId:effect.sourceInstanceId,cardNumber:effect.sourceCardNumber});state.oncePerTurn.push(`${state.turn}:${effect.playerId}:OP11-041-def`);state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId;return[{type:"card-moved",playerId:effect.playerId,cardInstanceId:discard.instanceId,cardNumber:discard.cardNumber,from:"hand",to:"trash",sourceCardNumber:effect.sourceCardNumber},{type:"power-changed",playerId:effect.playerId,targetInstanceId:leaderInstanceId3(effect.playerId),amount:2e3,expiresAtTurn:state.turn,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId}]}function resolveKatakuriLeader({state,effect,optionId}){if(optionId==="skip"){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId;return[]}if(optionId!=="apply"||!state.activeAttack){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const events=[];returnDonToDeck(state,effect.playerId,1,effectSource(effect),events);if(state.activeAttack.attackerPlayerId===effect.playerId){state.activeAttack.battleAttackBonus+=1e3}else{state.activeAttack.counterPower+=1e3}state.oncePerTurn.push(`${state.turn}:${effect.playerId}:OP11-062`);state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId;const revealed=state.players[opponentOf4(effect.playerId)].deck[0];recordDeckTopKnowledge(state,effect.playerId,opponentOf4(effect.playerId));return[...events,{type:"power-changed",playerId:effect.playerId,targetInstanceId:leaderInstanceId3(effect.playerId),amount:1e3,expiresAtTurn:state.turn,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId},...revealed?[{type:"card-revealed",playerId:effect.playerId,cardNumber:revealed.cardNumber,sourceCardNumber:effect.sourceCardNumber,visibleTo:effect.playerId}]:[]]}function resolveKidLeaderEndTurn({state,effect,optionId}){if(optionId==="skip")return[];if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const life=player.life[0];const target=player.board.find(card=>card.instanceId===optionId);if(!life||!target)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);const flipped=flipLife(state,effect.playerId,life.instanceId,true,effect.sourceCardNumber);target.rested=false;target.blockerUntilTurn=state.turn+1;return flipped}function resolveBorsalinoEndTurn({state,effect,optionId}){const mark=instanceId=>state.oncePerTurn.push(`${state.turn}:${effect.playerId}:${instanceId}:borsalino-end-turn`);if(optionId==="skip"){effect.eligibleInstanceIds.forEach(mark);return[]}mark(optionId);if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const target=state.players[effect.playerId].board.find(card=>card.instanceId===optionId);if(!target)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);const events=[];returnDonToDeck(state,effect.playerId,2,effectSource(effect),events);target.rested=false;target.blockerUntilTurn=state.turn+1;return events}function resolveBegeLifeSwap({state,effect,optionId,db}){const player=state.players[effect.playerId];if(optionId==="skip")return[];if(effect.stage==="take-life"){if(optionId!=="top"&&optionId!=="bottom"){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const taken=takeLifeAt(state,effect.playerId,optionId,{to:"hand",sourceCardNumber:effect.sourceCardNumber});if(!taken)return[];player.hand.push({instanceId:taken.card.instanceId,cardNumber:taken.card.cardNumber});const eligibleInstanceIds=player.hand.filter(card2=>{const definition=db.require(card2.cardNumber);return definition.category==="character"&&definition.types.includes("Supernovas")}).map(card2=>card2.instanceId);if(eligibleInstanceIds.length>0){state.pendingEffect={...effect,stage:"place-life",eligibleInstanceIds}}return taken.events}if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const handIndex=player.hand.findIndex(card2=>card2.instanceId===optionId);const[card]=player.hand.splice(handIndex,1);if(!card)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);return addToLife(state,effect.playerId,card,{from:"hand",faceUp:true,sourceCardNumber:effect.sourceCardNumber})}function resolveMoveCharacterToLife({state,effect,optionId}){if(optionId==="skip")return[];const[position,targetId]=optionId.split(":");if(position!=="top"&&position!=="bottom"||!targetId||!effect.eligibleInstanceIds.includes(targetId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const targetPlayer=state.players[effect.targetPlayerId];const targetIndex=targetPlayer.board.findIndex(card=>card.instanceId===targetId);const[target]=targetPlayer.board.splice(targetIndex,1);if(!target)throw new Error(`MISSING_EFFECT_TARGET: ${targetId}`);targetPlayer.restedDon.push(...target.attachedDon??[]);return addToLife(state,effect.targetPlayerId,{instanceId:target.instanceId,cardNumber:target.cardNumber},{from:"board",position,faceUp:true,sourceCardNumber:effect.sourceCardNumber})}function resolveTrashOpponentLife({state,effect,optionId}){if(optionId==="skip")return[];if(optionId!=="apply"){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const target=state.players[effect.targetPlayerId];const taken=takeLifeAt(state,effect.targetPlayerId,"top",{to:"trash",sourceCardNumber:effect.sourceCardNumber});if(taken){target.trash.push({instanceId:taken.card.instanceId,cardNumber:taken.card.cardNumber})}if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return taken?.events??[]}function resolveAddTopDeckToLife({state,effect,optionId}){if(optionId==="skip")return[];if(optionId!=="apply"){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const card=player.deck.shift();if(!card)return[];return addToLife(state,effect.playerId,card,{from:"deck",sourceCardNumber:effect.sourceCardNumber})}function resolveMechanicChoiceEffect({state,effect,optionId}){let result;let ordered=[];if(effect.choice.kind==="order-reactions"){const{chosen,rest}=pickOrderedReaction(effect.choice.reactions,optionId);const first={...chosen};delete first.orderGroup;ordered=[first,...rest];result={events:[],signals:[],pending:null}}else{result=resolveMechanicChoice(state,effect.choice,optionId)}const waiting=(effect.continuations??[]).filter(invocation=>invocation.duringEffect!==true);const held=(effect.continuations??[]).filter(invocation=>invocation.duringEffect===true);const raised=getMechanicSignalInvocations(state,result.signals);const continuations=result.pending?[...ordered,...waiting,...held,...raised.map(duringEffect)]:[...ordered,...waiting,...orderSimultaneous(state,[...held.map(withoutDuringEffect),...raised])];if(result.pending){state.pendingEffect={...effect,playerId:(result.pending.kind==="cards"||result.pending.kind==="choice"||result.pending.kind==="optional"||result.pending.kind==="order-to-bottom"?result.pending.chooserPlayerId:void 0)??result.pending.execution.context.sourcePlayerId,choice:result.pending,...continuations.length>0?{continuations}:{}};return result.events}const dispatched=dispatchMechanicInvocations(state,continuations);state.pendingEffect=dispatched.pending&&dispatched.invocation?mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations,false,effect.activatedBy):null;const events=[...result.events,...dispatched.events];if(effect.activatedBy&&state.pendingEffect===null&&events.length>0){events.unshift({type:"ability-activated",playerId:effect.activatedBy,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId})}return events}function resolveFreePlay({state,effect,optionId,db}){if(optionId==="skip")return[];if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const events=[];if(effect.returnDon&&returnDonToDeck(state,effect.playerId,effect.returnDon,effectSource(effect),events)<effect.returnDon){throw new Error("INSUFFICIENT_DON")}const player=state.players[effect.playerId];const handIndex=player.hand.findIndex(card2=>card2.instanceId===optionId);const[card]=player.hand.splice(handIndex,1);if(!card)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);const definition=db.require(card.cardNumber);if(definition.category==="stage"){if(player.stage){player.trash.push({instanceId:player.stage.instanceId,cardNumber:player.stage.cardNumber})}player.stage={...card,rested:false};events.push({type:"stage-played",playerId:effect.playerId,cardInstanceId:card.instanceId,cardNumber:card.cardNumber})}else{const placement=placeCharacter(state,effect.playerId,card,false,db);state.pendingEffect=placement.pending;if(placement.pending&&effect.resumePhase&&effect.resumePlayerId){state.pendingEffectResume={phase:effect.resumePhase,playerId:effect.resumePlayerId}}return[...events,...placement.events]}const followUp=createOnPlayEffect(state,effect.playerId,card);state.pendingEffect=followUp.pending;if(followUp.pending&&effect.resumePhase&&effect.resumePlayerId){state.pendingEffectResume={phase:effect.resumePhase,playerId:effect.resumePlayerId}}else if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}events.push(...followUp.events);return events}function resolveFreePlayRested({state,effect,optionId,db}){if(optionId==="skip")return[];if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const handIndex=player.hand.findIndex(card2=>card2.instanceId===optionId);const[card]=player.hand.splice(handIndex,1);if(!card)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);const placement=placeCharacter(state,effect.playerId,card,true,db);state.pendingEffect=placement.pending;if(placement.pending&&effect.resumePhase&&effect.resumePlayerId){state.pendingEffectResume={phase:effect.resumePhase,playerId:effect.resumePlayerId}}else if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return placement.events}function resolveReturnOwnForFreePlay({state,effect,optionId,db}){if(optionId==="skip"){state.pendingEffect=null;return[]}if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const events=returnOwnCharacterToHand(state,effect.playerId,optionId,effect.sourceCardNumber);const eligibleInstanceIds=player.hand.filter(card=>{const definition=db.require(card.cardNumber);return definition.category==="character"&&definition.types.includes("Impel Down")&&(definition.cost??99)<=2}).map(card=>card.instanceId);state.pendingEffect=eligibleInstanceIds.length>0?{kind:"free-play",playerId:effect.playerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,eligibleInstanceIds}:null;return events}function replacementProtector(state,playerId,protectorId){if(protectorId===`${playerId}-leader`){return{instanceId:protectorId,cardNumber:state.players[playerId].leaderCardNumber}}const installed=`${playerId}-installed-`;if(protectorId.startsWith(installed)){const cardNumber=protectorId.slice(installed.length);return(state.players[playerId].installedReplacements??[]).some(entry=>entry.cardNumber===cardNumber)?{instanceId:protectorId,cardNumber}:void 0}return state.players[playerId].board.find(card=>card.instanceId===protectorId)}function replacementHandPayers(state,playerId,protector,match,db=cards){return selectCards(state,{sourcePlayerId:playerId,source:protector},{...match??{},player:"self",zone:"hand"},{},db)}function registeredReplacementOptions(state,sourcePlayerId,targetPlayerId,target,optionPrefix,db=cards,cause="effect"){if(isRemovalImmune(state,targetPlayerId,target,sourcePlayerId,void 0,db))return[];const targetName=db.require(target.cardNumber).name;return eligibleReplacements(state,sourcePlayerId,targetPlayerId,target,db,cause).map(({protector,entry})=>({optionId:`mechanic:${optionPrefix}:${protector.instanceId}`,summary:`${entry.label} instead of K.O. ${targetName}`,...entry.mandatory?{mandatory:true}:{}}))}var formatMechanics={onPlay:[["ST35-002",{effect:{kind:"choose",selector:{player:"opponent",zone:"board"},bind:"power-target",min:0,max:1,effect:{kind:"modify-power",binding:"power-target",amount:-3e3,expiresAfterTurns:0}}}],...["ST35-004","ST35-005"].map(cardNumber=>[cardNumber,{effect:{kind:"sequence",effects:[{kind:"optional",effect:{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"}},{kind:"choose",selector:{player:"self",zone:["hand","trash"],category:"character",type:"Revolutionary Army",maxCurrentPower:4e3,excludeSource:true},bind:"free-play",min:0,max:1,effect:{kind:"play",binding:"free-play"}}]}}]),["OP13-005",{effect:{kind:"optional",effect:{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"}}}],["EB04-026",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1},bind:"bottom-deck-target",min:0,max:1,effect:{kind:"move",binding:"bottom-deck-target",to:{player:"opponent",zone:"deck",position:"bottom"}}}}]],trigger:[["ST36-003",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Supernovas"},then:{kind:"set-leader-base-power",player:"self",value:7e3,expiresAfterTurns:0}}]}}],["OP12-098",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"top-deck",count:1,effect:{kind:"move",binding:"top-deck",to:{player:"self",zone:"trash"}}}]}}]]};var paidToHand=(bind,effects)=>({kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"hand",binding:bind},operator:"gte",value:1},then:{kind:"sequence",effects:[...effects]}});var lifeToHandCost=(effect,position="edge")=>({effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position},bind:"life-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"life-cost",to:{player:"self",zone:"hand"}},paidToHand("life-cost",[effect])]}}}});var preventCostSixAttack={effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"prevent-attack-target",min:0,max:1,effect:{kind:"restrict",binding:"prevent-attack-target",restriction:"cannot-attack",expiresAfterTurns:1}}};var thrillerBarkInTrash={player:"self",zone:"trash",category:"character",type:"Thriller Bark Pirates",maxCost:4,excludeSource:true};var playThrillerBarkFromTrashRested={effect:{kind:"choose",selector:thrillerBarkInTrash,bind:"free-play",min:0,max:1,effect:{kind:"play",binding:"free-play",rested:true}}};var ownCostTenBody={kind:"selector-count",player:"self",selector:{zone:"board",category:"character",minCost:10},operator:"gte",value:1};var haveNamed=(name,count2=1)=>({kind:"selector-count",player:"self",selector:{zone:OWN_CARDS_ZONES,includeLeader:true,name},operator:"gte",value:count2});var trashFromOpponentHandBlind=(count2,bind)=>{let effect;for(let index=count2;index>=1;index-=1){const pick=`${bind}-${index}`;const trash={kind:"move",binding:pick,to:{player:"opponent",zone:"trash"}};effect={kind:"pick-from-hand",player:"opponent",pick:"blind",bind:pick,effect:effect?{kind:"sequence",effects:[trash,effect]}:trash}}return effect};var elbaphGiantOut={kind:"selector-count",player:"either",selector:{zone:"board",category:"character",minCost:12},operator:"gte",value:1};var rayleighRemoval={effect:{kind:"if",condition:{kind:"leader-multicolored",player:"self"},then:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:3},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:7e3},bind:"rayleigh-target",min:0,max:1,effect:{kind:"knock-out",binding:"rayleigh-target"}}}}};var lookAndAdd=(count2,bind,match,max=1)=>({effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:count2,bind},{kind:"choose",selector:{...match,player:"self",zone:"deck",binding:bind},bind:`${bind}-add`,min:0,max,effect:{kind:"move",binding:`${bind}-add`,to:{player:"self",zone:"hand"}}},{kind:"select",selector:{player:"self",zone:"deck",binding:bind},bind:`${bind}-rest`,count:"all",effect:{kind:"order-to-bottom",binding:`${bind}-rest`,to:{player:"self",zone:"deck",position:"bottom"}}}]}});var lookAndAddOrTrash=(count2,bind,match)=>({effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:count2,bind},{kind:"choose",selector:{...match,player:"self",zone:"deck",binding:bind},bind:`${bind}-add`,min:0,max:1,effect:{kind:"move",binding:`${bind}-add`,to:{player:"self",zone:"hand"}}},{kind:"select",selector:{player:"self",zone:"deck",binding:bind},bind:`${bind}-rest`,count:"all",effect:{kind:"move",binding:`${bind}-rest`,to:{player:"self",zone:"trash"}}}]}});var donMinus=(count2,effect)=>({kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:count2},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:count2},effect]}}});var donMinusOrMore=(min,effect)=>({kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:min},then:{kind:"optional",effect:{kind:"return-don-choice",player:"self",min,effect}}});var skypieaDrawOnPlay={effect:donMinus(1,{kind:"draw",player:"self",count:1})};var trashForBattlePower=(amount,bind,target)=>({effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},bind,1,{kind:"battle-power",player:"self",amount,...target?{target}:{}})}});var drawAndDiscard=(draw,discard,bind)=>({kind:"sequence",effects:[{kind:"draw",player:"self",count:draw},{kind:"choose",selector:{player:"self",zone:"hand"},bind,min:discard,max:discard,effect:{kind:"move",binding:bind,to:{player:"self",zone:"trash"}}}]});var payFromHand=(selector,bind,count2,effect)=>({kind:"choose",selector,bind,min:count2,max:count2,effect:{kind:"sequence",effects:[{kind:"move",binding:bind,to:{player:"self",zone:"trash"}},effect]}});var maserSaberKo={kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"op17-maser-saber-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op17-maser-saber-ko"}};var guessDeckTopCost=(effect,player="opponent")=>({kind:"choice",branches:Array.from({length:11},(_,cost)=>({id:`cost-${cost}`,label:`Guess a cost of ${cost}`,effect:{kind:"sequence",effects:[{kind:"reveal-deck-top",player},{kind:"if",condition:{kind:"deck-top-cost",player,value:cost},then:effect}]}}))});var rayleighOnField={zone:"board",includeLeader:true,name:"Silvers Rayleigh"};var giveDonToRayleigh=(count2,bind,effect)=>({kind:"if",condition:{kind:"all-of",conditions:[{kind:"active-don",player:"self",operator:"gte",value:count2},{kind:"selector-count",player:"self",selector:rayleighOnField,operator:"gte",value:1}]},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",...rayleighOnField},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"attach-don",player:"self",from:"active",count:count2,target:{binding:bind}},effect]}}}});var rayleighOrCharacter={anyOf:[{isLeader:false},{isLeader:true,name:"Silvers Rayleigh"}]};var vanillaBody=zone=>({player:"self",zone,category:"character",maxPower:6e3,noBaseEffect:true});var playVanillaBody=(zone,bind)=>({kind:"choose",selector:vanillaBody(zone),bind,min:0,max:1,effect:{kind:"play",binding:bind}});function peekLife(player,bind){return{kind:"sequence",effects:[{kind:"look-at",player,count:1,bind,zone:"life"},{kind:"choice",branches:[{id:"top",label:"Place it on top of the Life cards",effect:{kind:"move",binding:bind,to:{player:"owner",zone:"life",position:"top"}}},{id:"bottom",label:"Place it at the bottom of the Life cards",effect:{kind:"move",binding:bind,to:{player:"owner",zone:"life",position:"bottom"}}}]}]}}var revealTopThen=(bind,effect)=>({kind:"sequence",effects:[{kind:"look-at",player:"self",count:1,bind},{kind:"reveal",binding:bind},effect,{kind:"select",selector:{player:"self",zone:"deck",binding:bind},bind:`${bind}-place`,count:"all",effect:{kind:"order-to-bottom",binding:`${bind}-place`,to:{player:"self",zone:"deck",position:"top"},alternate:{player:"self",zone:"deck",position:"bottom"}}}]});var lookAndReplace=(count2,bind,bottomAllowed)=>({kind:"sequence",effects:[{kind:"look-at",player:"self",count:count2,bind},{kind:"select",selector:{player:"self",zone:"deck",binding:bind},bind:`${bind}-place`,count:"all",effect:{kind:"order-to-bottom",binding:`${bind}-place`,to:{player:"self",zone:"deck",position:"top"},...bottomAllowed?{alternate:{player:"self",zone:"deck",position:"bottom"}}:{}}}]});var restCostAtMost=(maxCost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost,canRest:true},bind,min:0,max:1,effect:{kind:"rest",binding:bind}});var restOrKoCostAtMost=(maxCost,bind)=>({kind:"choice",branches:[{id:"rest",label:`Rest a Character with a cost of ${maxCost} or less`,effect:restCostAtMost(maxCost,`${bind}-rest`)},{id:"ko",label:`K.O. a rested Character with a cost of ${maxCost} or less`,effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost,rested:true},bind:`${bind}-ko`,min:0,max:1,effect:{kind:"knock-out",binding:`${bind}-ko`}}}]});var asOnPlayTrigger=program=>({...program,runsOnPlay:true});var restLock=(maxCost,bind,max=1)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost},bind,min:0,max,effect:{kind:"restrict",binding:bind,restriction:"cannot-refresh",expiresAfterTurns:1}});var rampRested={kind:"add-don",player:"self",count:1,rested:true};var rampActive={kind:"add-don",player:"self",count:1,rested:false};var whitebeardLeader={kind:"leader-type-including",player:"self",text:"Whitebeard Pirates"};var revealTwoWhitebeard=(bind,effect)=>({kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand",typeIncluding:"Whitebeard Pirates"},bind,min:2,max:2,effect:{kind:"sequence",effects:[{kind:"reveal",binding:bind},effect]}}});var koCostAtMost=(maxCost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost},bind,min:0,max:1,effect:{kind:"knock-out",binding:bind}});var costDebuff=(amount,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind,min:0,max:1,effect:{kind:"modify-cost",binding:bind,amount:-amount,expiresAfterTurns:0}});var powerDebuff=(amount,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind,min:0,max:1,effect:{kind:"modify-power",binding:bind,amount:-amount,expiresAfterTurns:0}});var playFromHand=(selector,bind)=>({kind:"choose",selector:{...selector,player:"self",zone:"hand"},bind,min:0,max:1,effect:{kind:"play",binding:bind}});var deckTopToLife=bind=>({kind:"optional",effect:{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind,count:1,effect:{kind:"move",binding:bind,to:{player:"self",zone:"life",position:"top"}}}});var chopperDig={effect:{kind:"if",condition:{kind:"turn-player",player:"self"},then:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind:"op08-chopper-dig"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"op08-chopper-dig",category:"character",type:"Animal",maxPower:4e3},bind:"op08-chopper-play",min:0,max:1,effect:{kind:"play",binding:"op08-chopper-play",rested:true}},{kind:"select",selector:{player:"self",zone:"deck",binding:"op08-chopper-dig"},bind:"op08-chopper-rest",count:"all",effect:{kind:"order-to-bottom",binding:"op08-chopper-rest",to:{player:"self",zone:"deck",position:"bottom"}}}]}}};var snakeAttackLock={effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6,excludeName:"Monkey.D.Luffy"},bind:"op08-snake-lock",min:0,max:1,effect:{kind:"restrict",binding:"op08-snake-lock",restriction:"cannot-attack",expiresAfterTurns:1}}};var donMinusOne=effect=>donMinus(1,effect);var donBehind={kind:"field-don-versus",player:"self",operator:"lte"};var foxyLeader={kind:"leader-has-type",player:"self",type:"Foxy Pirates"};var warlordLeader={kind:"leader-has-type",player:"self",type:"The Seven Warlords of the Sea"};var twoKujaBodies={kind:"selector-count",player:"self",selector:{zone:"board",category:"character",anyOf:[{type:"Amazon Lily"},{type:"Kuja Pirates"}]},operator:"gte",value:2};var kujaCard={anyOf:[{type:"Amazon Lily"},{type:"Kuja Pirates"}]};var lifeAtMost=value=>({kind:"zone-count",player:"self",zone:"life",operator:"lte",value});var trashAtLeastTen={kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:10};var bounceCostAtMost=(maxCost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost},bind,min:0,max:1,effect:{kind:"move",binding:bind,to:{player:"owner",zone:"hand"}}});var buryCostAtMost=(maxCost,bind)=>({kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost},bind,min:0,max:1,effect:{kind:"move",binding:bind,to:{player:"owner",zone:"deck",position:"bottom"}}});var restCostAtMost2=(maxCost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost,canRest:true},bind,min:0,max:1,effect:{kind:"rest",binding:bind}});var buffOwnCardForTurn=(amount,bind,expiresAfterTurns=0)=>({kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind,min:0,max:1,effect:{kind:"modify-power",binding:bind,amount,expiresAfterTurns}});var payFromTrash=(count2,bind,effect,match={})=>({kind:"optional",effect:{kind:"choose",selector:{...match,player:"self",zone:"trash"},bind,min:count2,max:count2,effect:{kind:"sequence",effects:[{kind:"order-to-bottom",binding:bind,to:{player:"self",zone:"deck",position:"bottom"}},effect]}}});var cpCard={typeIncluding:"CP"};var millTwoThenCostDebuff=(amount,bind)=>({kind:"sequence",effects:[{kind:"trash-top",player:"self",count:2},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind,min:0,max:1,effect:{kind:"modify-cost",binding:bind,amount:-amount,expiresAfterTurns:0}}]});var addDonRested={kind:"add-don",player:"self",count:1,rested:true};var addDonActive={kind:"add-don",player:"self",count:1,rested:false};var playSelfBehindVegapunk={kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Vegapunk"},then:{kind:"play",binding:SOURCE_BINDING}};var blazeSlice={effect:{kind:"sequence",effects:[buffOwnCardForTurn(1e3,"op07-blaze-buff"),{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:2},then:restCostAtMost2(4,"op07-blaze-rest")}]}};var threeOwnCharacters={kind:"selector-count",player:"self",selector:{zone:"board",category:"character"},operator:"gte",value:3};var op07BattleMechanics={counterEvent:[["OP07-018",{cost:1,power:0,program:{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Revolutionary Army"},bind:"op07-keepout-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op07-keepout-buff",amount:2e3,expiresAfterTurns:2}}}}],["OP07-035",{cost:1,power:2e3,program:{effect:{kind:"if",condition:threeOwnCharacters,then:{kind:"battle-power",player:"self",amount:1e3}}}}],["OP07-055",{cost:2,power:4e3,program:{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op07-snake-bounce",min:0,max:1,effect:{kind:"move",binding:"op07-snake-bounce",to:{player:"owner",zone:"hand"}}}}}],["OP07-075",{cost:1,donMinus:1,power:0,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:[],includeLeader:true},bind:"op07-beam-leader",min:0,max:1,effect:{kind:"modify-power",binding:"op07-beam-leader",amount:-2e3,expiresAfterTurns:0}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op07-beam-character",min:0,max:1,effect:{kind:"modify-power",binding:"op07-beam-character",amount:-2e3,expiresAfterTurns:0}}]}}}],["OP07-076",{cost:2,donMinus:1,power:2e3,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",canRest:true},bind:"op07-sword-rest",min:0,max:1,effect:{kind:"rest",binding:"op07-sword-rest"}}}}],["OP07-094",{cost:1,power:2e3,program:{effect:{kind:"if",condition:trashAtLeastTen,then:{kind:"choose",selector:{...cpCard,player:"self",zone:"board",category:"character"},bind:"op07-shave-bounce",min:0,max:1,effect:{kind:"move",binding:"op07-shave-bounce",to:{player:"owner",zone:"hand"}}}}}}],["OP07-095",{cost:2,power:4e3,program:{effect:{kind:"if",condition:trashAtLeastTen,then:{kind:"battle-power",player:"self",amount:2e3}}}}],["OP07-115",{cost:1,power:3e3,powerWhen:lifeAtMost(2)}],["OP07-116",{cost:1,power:0,program:blazeSlice}]],whenAttacking:[["OP07-011",{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:2e3},bind:"op07-bluejam-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op07-bluejam-ko"}}}}],["OP07-034",{effect:{kind:"if",condition:threeOwnCharacters,then:{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:0}}}],["OP07-039",{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:3,bind:"op07-weevil-look"},{kind:"select",selector:{player:"self",zone:"deck",binding:"op07-weevil-look"},bind:"op07-weevil-place",count:"all",effect:{kind:"order-to-bottom",binding:"op07-weevil-place",to:{player:"self",zone:"deck",position:"top"},alternate:{player:"self",zone:"deck",position:"bottom"}}}]}}}],["OP07-059",{oncePerTurn:false,requires:{fieldDon:3},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:3},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"Foxy Pirates"},operator:"gte",value:3},then:{kind:"sequence",effects:[{kind:"select",selector:{player:"opponent",zone:[],includeLeader:true,rested:true},bind:"op07-foxy-leader",count:"all",effect:{kind:"restrict",binding:"op07-foxy-leader",restriction:"cannot-refresh",expiresAfterTurns:1}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true},bind:"op07-foxy-character",min:0,max:1,effect:{kind:"restrict",binding:"op07-foxy-character",restriction:"cannot-refresh",expiresAfterTurns:1}}]}}]}}}}],["OP07-068",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"source-attached-don",operator:"gte",value:1},donBehind]},then:addDonRested}}],["OP07-079",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"trash-top",player:"self",count:2},costDebuff(1,"op07-lucci-leader-debuff")]}}}],["OP07-091",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"op07-luffy-trash",min:0,max:1,effect:{kind:"move",binding:"op07-luffy-trash",to:{player:"owner",zone:"trash"}}},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",minCost:4},bind:"op07-luffy-bury",min:0,max:50,effect:{kind:"sequence",effects:[{kind:"order-to-bottom",binding:"op07-luffy-bury",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:0,perCards:{binding:"op07-luffy-bury",each:3}}]}}]}}],["OP07-106",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"source-attached-don",operator:"gte",value:1},lifeAtMost(1)]},then:koCostAtMost(3,"op07-fuza-ko")}}],["OP07-112",{oncePerTurn:true,requires:{lifeCardsMatching:{match:{position:"edge"},count:1}},program:lifeToHandCost({kind:"sequence",effects:[restCostAtMost2(4,"op07-lucy-rest"),{kind:"if",condition:lifeAtMost(1),then:deckTopToLife("op07-lucy-refill")}]})}]],onOpponentAttack:[["OP07-010",{oncePerTurn:true,requires:{handCards:1},program:trashForBattlePower(2e3,"op07-baccarat-cost")}],["OP07-019",{oncePerTurn:true,requires:{activeDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true,canRest:true},bind:"op07-bonney-rest",min:0,max:1,effect:{kind:"rest",binding:"op07-bonney-rest"}}]}}}}],["OP07-024",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Fish-Man",maxCost:5},bind:"op07-koala-grant",min:0,max:1,effect:{kind:"grant-keyword",binding:"op07-koala-grant",keyword:"Blocker",expiresAfterTurns:0}}]}}}}]]};var op07MainMechanics={eventMain:[["OP07-016",{cost:1,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Revolutionary Army"},bind:"op07-wink-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op07-wink-buff",amount:2e3,expiresAfterTurns:0}},powerDebuff(1e3,"op07-wink-debuff")]}}}],["OP07-017",{cost:2,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:3e3},bind:"op07-breath-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op07-breath-ko"}},{kind:"choose",selector:{player:"opponent",zone:"stage",maxCost:1},bind:"op07-breath-stage",min:0,max:1,effect:{kind:"knock-out",binding:"op07-breath-stage"}}]}}}],["OP07-036",{cost:2,program:{effect:{kind:"sequence",effects:[buffOwnCardForTurn(3e3,"op07-asura-buff"),{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",minCost:3,rested:false},bind:"op07-asura-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:"op07-asura-cost"},restCostAtMost2(5,"op07-asura-rest")]}}}]}}}],["OP07-037",{cost:1,program:lookAndAdd(5,"op07-pizza-look",{type:"Supernovas",excludeName:"More Pizza!!"})}],["OP07-057",{cost:2,program:{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,type:"The Seven Warlords of the Sea"},bind:"op07-femur-target",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"modify-power",binding:"op07-femur-target",amount:2e3,expiresAfterTurns:0},{kind:"grant-keyword",binding:"op07-femur-target",keyword:"Unblockable",expiresAfterTurns:0}]}}}}],["OP07-078",{cost:3,program:{effect:{kind:"if",condition:{kind:"field-don-versus",player:"self",operator:"lte"},then:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name:"Foxy",rested:true},bind:"op07-megaton-target",min:0,max:1,effect:{kind:"update",binding:"op07-megaton-target",rested:false}}}}}],["OP07-096",{cost:1,program:{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"if",condition:trashAtLeastTen,then:costDebuff(3,"op07-tempest-debuff")}]}}}],["OP07-116",{cost:1,program:blazeSlice}]],activateMain:[["OP07-001",{oncePerTurn:true,requires:{givenDon:1},program:{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op07-dragon-gift",min:0,max:1,effect:{kind:"attach-don",player:"self",from:"given",count:2,target:{binding:"op07-dragon-gift"}}}}}],["OP07-003",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character"},operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op07-outlook-debuff",min:0,max:2,effect:{kind:"modify-power",binding:"op07-outlook-debuff",amount:-2e3,expiresAfterTurns:0}}]}}}}],["OP07-047",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:6},then:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"hand"}},{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op07-law-bury",chooser:"opponent",min:1,max:1,effect:{kind:"move",binding:"op07-law-bury",to:{player:"opponent",zone:"deck",position:"bottom"}}}]}}}}],["OP07-048",{oncePerTurn:true,requires:{activeDon:2},program:{effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:2},{kind:"look-at",player:"self",count:1,bind:"op07-doflamingo-top"},{kind:"reveal",binding:"op07-doflamingo-top"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"op07-doflamingo-top",category:"character",type:"The Seven Warlords of the Sea",maxCost:4},bind:"op07-doflamingo-play",min:0,max:1,effect:{kind:"play",binding:"op07-doflamingo-play",rested:true}},{kind:"select",selector:{player:"self",zone:"deck",binding:"op07-doflamingo-top"},bind:"op07-doflamingo-rest",count:"all",effect:{kind:"move",binding:"op07-doflamingo-rest",to:{player:"self",zone:"deck",position:"bottom"}}}]}}}],["OP07-058",{oncePerTurn:false,requires:{handCards:1,sourceActive:true},program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Kuja Pirates"},then:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},payFromHand({player:"self",zone:"hand"},"op07-island-cost",1,{kind:"choose",selector:{...kujaCard,player:"self",zone:"board",category:"character"},bind:"op07-island-bounce",min:0,max:1,effect:{kind:"move",binding:"op07-island-bounce",to:{player:"owner",zone:"hand"}}})]}}}}],["OP07-060",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[foxyLeader,{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",name:"Itomimizu",excludeSource:true},operator:"eq",value:0}]},then:addDonRested}}}],["OP07-071",{oncePerTurn:true,program:{effect:addDonRested}}],["OP07-073",{oncePerTurn:true,requires:{fieldDon:3,sourceRested:true},program:{effect:{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character"},operator:"gte",value:3},then:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:3},{kind:"update",binding:SOURCE_BINDING,rested:false}]}}}}],["OP07-074",{oncePerTurn:false,program:{effect:{kind:"if",condition:foxyLeader,then:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},addDonRested]}}}}],["OP07-083",{oncePerTurn:false,program:{effect:payFromTrash(4,"op07-moria-cost",{kind:"sequence",effects:[{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Banish",expiresAfterTurns:0},{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:0}]},{type:"Thriller Bark Pirates"})}}],["OP07-097",{oncePerTurn:true,requires:{activeDon:1,handCardsMatching:{match:{type:"Egghead",maxCost:5},count:1}},program:{effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand",type:"Egghead",maxCost:5},bind:"op07-vegapunk-pick",min:0,max:1,effect:{kind:"choice",branches:[{id:"play",label:"Play it",effect:{kind:"play",binding:"op07-vegapunk-pick"}},{id:"life",label:"Put it on top of Life, face-up",effect:{kind:"move",binding:"op07-vegapunk-pick",to:{player:"self",zone:"life",position:"top"},faceUp:true}}]}}]}}}],["OP07-109",{oncePerTurn:false,program:{effect:{kind:"if",condition:lifeAtMost(2),then:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"op07-luffy-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op07-luffy-ko"}},{kind:"draw",player:"self",count:1}]}}}}]]};var buffNamedCard=(name,bind)=>({kind:"if",condition:{kind:"turn-player",player:"self"},then:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name},bind,min:0,max:1,effect:{kind:"modify-power",binding:bind,amount:2e3,expiresAfterTurns:0}}});var playPartnerRested=(name,maxCost,bind)=>({kind:"choose",selector:{player:"self",zone:"hand",name,maxCost},bind,min:0,max:1,effect:{kind:"play",binding:bind,rested:true}});var op07OnPlayMechanics={onPlay:[["OP07-002",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op07-ain-zero",min:0,max:1,effect:{kind:"set-base-power",binding:"op07-ain-zero",value:0,expiresAfterTurns:0}}}],["OP07-004",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op07-dadan-cost",1,lookAndAdd(5,"op07-dadan-look",{category:"character",maxPower:2e3}).effect)}}],["OP07-005",{effect:powerDebuff(2e3,"op07-carina-debuff")}],["OP07-006",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:[],includeLeader:true,rested:false},bind:"op07-sterry-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"modify-power",binding:"op07-sterry-cost",amount:-5e3,expiresAfterTurns:0},{kind:"draw",player:"self",count:1},payFromHand({player:"self",zone:"hand"},"op07-sterry-discard",1,{kind:"sequence",effects:[]})]}}}}],["OP07-009",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",color:"Red",minCost:1,maxCost:1},bind:"op07-dogura-target",min:0,max:1,effect:{kind:"grant-keyword",binding:"op07-dogura-target",keyword:"Double Attack",expiresAfterTurns:0}}}],["OP07-012",{effect:powerDebuff(1e3,"op07-porchemy-debuff")}],["OP07-013",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Portgas.D.Ace"},then:lookAndAdd(5,"op07-deuce-look",{anyOf:[{name:"Portgas.D.Ace"},{color:"Red",category:"event"}]}).effect}}],["OP07-014",{effect:buffNamedCard("Portgas.D.Ace","op07-moda-buff")}],["OP07-015",{effect:{kind:"give-rested-don",player:"self",count:2}}],["OP07-025",{effect:playPartnerRested("Caribou",4,"op07-coribou-play")}],["OP07-026",{effect:{kind:"choice",branches:[{id:"character",label:"Hold down a rested Character",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true},bind:"op07-bonney-lock",min:0,max:1,effect:{kind:"restrict",binding:"op07-bonney-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}},{id:"don",label:"Hold down a rested DON!! card",effect:{kind:"if",condition:{kind:"rested-don",player:"opponent",operator:"gte",value:1},then:{kind:"hold-don-from-refresh",player:"opponent",count:1}}}]}}],["OP07-032",{effect:{kind:"if",condition:{kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"Fish-Man"},{kind:"leader-has-type",player:"self",type:"Merfolk"}]},then:restCostAtMost2(6,"op07-tiger-rest")}}],["OP07-040",{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:2},bind:"op07-crocodile-bounce",min:0,max:1,effect:{kind:"move",binding:"op07-crocodile-bounce",to:{player:"owner",zone:"hand"}}}]}}}],["OP07-041",lookAndAdd(5,"op07-gloriosa-look",{...kujaCard,excludeName:"Gloriosa (Grandma Nyon)"})],["OP07-043",{effect:buffNamedCard("Boa Hancock","op07-salome-buff")}],["OP07-044",{effect:{kind:"draw",player:"self",count:1}}],["OP07-045",{effect:playFromHand({category:"character",type:"The Seven Warlords of the Sea",maxCost:4,excludeName:"Jinbe"},"op07-jinbe-play")}],["OP07-046",lookAndAdd(5,"op07-sengoku-look",{type:"The Seven Warlords of the Sea"})],["OP07-049",{effect:playPartnerRested("Edward Weevil",4,"op07-buckin-play")}],["OP07-050",{effect:{kind:"if",condition:twoKujaBodies,then:bounceCostAtMost(3,"op07-sandersonia-bounce")}}],["OP07-051",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",excludeName:"Monkey.D.Luffy"},bind:"op07-hancock-lock",min:0,max:1,effect:{kind:"restrict",binding:"op07-hancock-lock",restriction:"cannot-attack",expiresAfterTurns:1}},buryCostAtMost(1,"op07-hancock-bury")]}}],["OP07-052",{effect:{kind:"if",condition:twoKujaBodies,then:buryCostAtMost(2,"op07-marigold-bury")}}],["OP07-053",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op07-ace-back",min:2,max:2,effect:{kind:"order-to-bottom",binding:"op07-ace-back",to:{player:"self",zone:"deck",position:"top"},alternate:{player:"self",zone:"deck",position:"bottom"}}}]}}],["OP07-054",{effect:{kind:"draw",player:"self",count:1}}],["OP07-061",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"The Vinsmoke Family"},then:{kind:"draw",player:"self",count:1}}]}}}}],["OP07-062",{effect:{kind:"if",condition:donBehind,then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"The Vinsmoke Family",minCost:1,maxCost:1},bind:"op07-reiju-bounce",min:0,max:1,effect:{kind:"move",binding:"op07-reiju-bounce",to:{player:"owner",zone:"hand"}}}}}],["OP07-063",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"if",condition:foxyLeader,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"op07-capote-lock",min:0,max:1,effect:{kind:"restrict",binding:"op07-capote-lock",restriction:"cannot-attack",expiresAfterTurns:1}}}]}}}}],["OP07-065",{effect:{kind:"if",condition:{kind:"all-of",conditions:[foxyLeader,donBehind]},then:addDonActive}}],["OP07-066",{effect:{kind:"if",condition:donBehind,then:addDonRested}}],["OP07-070",{effect:{kind:"if",condition:donBehind,then:playFromHand({type:"Foxy Pirates",maxCost:4},"op07-bigbun-play")}}],["OP07-072",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},lookAndAdd(5,"op07-porche-look",{type:"Foxy Pirates"}).effect,playFromHand({category:"character",color:"Purple",maxPower:4e3},"op07-porche-play")]}}}}],["OP07-080",{effect:payFromTrash(2,"op07-kaku-cost",{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op07-kaku-debuff",min:0,max:1,effect:{kind:"modify-cost",binding:"op07-kaku-debuff",amount:-3,expiresAfterTurns:0}},cpCard)}],["OP07-082",{effect:millTwoThenCostDebuff(1,"op07-john-debuff")}],["OP07-085",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op07-stussy-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op07-stussy-cost",to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op07-stussy-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op07-stussy-ko"}}]}}}}],["OP07-086",{effect:millTwoThenCostDebuff(2,"op07-spandam-debuff")}],["OP07-088",{effect:buffNamedCard("Rob Lucci","op07-hattori-buff")}],["OP07-090",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op07-morgans-trash",chooser:"opponent",min:1,max:1,effect:{kind:"move",binding:"op07-morgans-trash",to:{player:"opponent",zone:"trash"}}},{kind:"select",selector:{player:"opponent",zone:"hand"},bind:"op07-morgans-reveal",count:"all",effect:{kind:"reveal",binding:"op07-morgans-reveal"}},{kind:"draw",player:"opponent",count:1}]}}],["OP07-092",{effect:payFromTrash(2,"op07-joseph-cost",koCostAtMost(1,"op07-joseph-ko"),cpCard)}],["OP07-093",{effect:payFromTrash(3,"op07-lucci-cost",{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op07-lucci-discard",chooser:"opponent",min:1,max:1,effect:{kind:"move",binding:"op07-lucci-discard",to:{player:"opponent",zone:"trash"}}},{kind:"choose",selector:{player:"opponent",zone:"trash"},bind:"op07-lucci-bury",min:0,max:1,effect:{kind:"move",binding:"op07-lucci-bury",to:{player:"opponent",zone:"deck",position:"bottom"}}}]})}],["OP07-100",{effect:{kind:"if",condition:lifeAtMost(2),then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},payFromHand({player:"self",zone:"hand"},"op07-edison-discard",2,{kind:"sequence",effects:[]})]}}}],["OP07-110",lifeToHandCost(koCostAtMost(2,"op07-york-ko"))],["OP07-111",lookAndAdd(5,"op07-lilith-look",{type:"Egghead",excludeName:"Lilith"})],["OP07-118",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op07-sabo-cost",1,{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"op07-sabo-ko-five",min:0,max:1,effect:{kind:"knock-out",binding:"op07-sabo-ko-five"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:3,excludeBinding:"op07-sabo-ko-five"},bind:"op07-sabo-ko-three",min:0,max:1,effect:{kind:"knock-out",binding:"op07-sabo-ko-three"}}]})}}],["OP07-119",{effect:{kind:"sequence",effects:[{kind:"optional",effect:{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"op07-ace-life",count:1,effect:{kind:"move",binding:"op07-ace-life",to:{player:"self",zone:"life",position:"top"}}}},{kind:"if",condition:lifeAtMost(2),then:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}}]}}]]};var op07ReplacementMechanics={replacement:[["OP07-029",{opponentEffectOnly:true,removal:"off-field",oncePerTurn:true,label:"Rest an opposing Character",cost:{kind:"rest-opponent-characters",count:1}}],["OP07-042",{opponentEffectOnly:true,removal:"off-field",oncePerTurn:true,requires:warlordLeader,label:"Place 1 of your other Characters at the bottom of your deck",cost:{kind:"bottom-deck-own-character",count:1,match:{excludeName:"Gecko Moria"}}}]]};var ownEventProgram=cardNumber=>{const entry=(op07MainMechanics.eventMain??[]).find(([number])=>number===cardNumber)?.[1];if(!entry)throw new Error(`MISSING_OP07_EVENT_PROGRAM: ${cardNumber}`);return entry.program};var ownCounterProgram=cardNumber=>{const entry=(op07BattleMechanics.counterEvent??[]).find(([number])=>number===cardNumber)?.[1];if(!entry?.program){throw new Error(`MISSING_OP07_COUNTER_PROGRAM: ${cardNumber}`)}return entry.program};var selfToHand={kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"hand"}};var rampActiveProgram={effect:addDonActive};var op07TriggerMechanics={trigger:[["OP07-008",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP07-016",ownEventProgram("OP07-016")],["OP07-017",ownEventProgram("OP07-017")],["OP07-018",ownCounterProgram("OP07-018")],["OP07-056",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op07-slave-arrow-bottom",min:2,max:2,effect:{kind:"move",binding:"op07-slave-arrow-bottom",to:{player:"self",zone:"deck",position:"bottom"}}}]}}],["OP07-035",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:4},bind:"op07-karmic-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op07-karmic-ko"}}}],["OP07-036",{effect:restCostAtMost2(4,"op07-asura-trigger-rest")}],["OP07-037",{effect:{kind:"draw",player:"self",count:1}}],["OP07-057",{effect:{kind:"draw",player:"self",count:1}}],["OP07-055",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op07-snake-trigger-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op07-snake-trigger-cost",to:{player:"owner",zone:"hand"}},bounceCostAtMost(5,"op07-snake-trigger-bounce")]}}}}],["OP07-076",rampActiveProgram],["OP07-078",rampActiveProgram],["OP07-094",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op07-shave-trigger",min:0,max:1,effect:{kind:"move",binding:"op07-shave-trigger",to:{player:"owner",zone:"hand"}}}}],["OP07-095",{effect:buffOwnCardForTurn(1e3,"op07-iron-trigger")}],["OP07-096",{effect:koCostAtMost(3,"op07-tempest-trigger")}],["OP07-098",{effect:playSelfBehindVegapunk}],["OP07-100",{effect:playSelfBehindVegapunk}],["OP07-101",{effect:playSelfBehindVegapunk}],["OP07-105",{effect:playSelfBehindVegapunk}],["OP07-110",{effect:playSelfBehindVegapunk}],["OP07-111",{effect:playSelfBehindVegapunk}],["OP07-099",{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,type:"Egghead"},bind:"op07-usopp-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op07-usopp-buff",amount:2e3,expiresAfterTurns:2}}}],["OP07-102",{effect:{kind:"sequence",effects:[bounceCostAtMost(4,"op07-jinbe-trigger"),selfToHand]}}],["OP07-103",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Egghead"},bind:"op07-chopper-grant",min:0,max:1,effect:{kind:"grant-keyword",binding:"op07-chopper-grant",keyword:"Blocker",expiresAfterTurns:0}},selfToHand]}}],["OP07-104",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Egghead"},then:{kind:"draw",player:"self",count:2}}}],["OP07-109",{effect:koCostAtMost(4,"op07-luffy-trigger")}],["OP07-113",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Egghead"},then:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true,canRest:true},bind:"op07-zoro-rest",min:0,max:1,effect:{kind:"rest",binding:"op07-zoro-rest"}}}}],["OP07-115",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Egghead",maxCost:5},bind:"op07-quasar-play",min:0,max:1,effect:{kind:"play",binding:"op07-quasar-play"}}}],["OP07-116",{effect:restCostAtMost2(4,"op07-blaze-trigger")}],["OP07-117",{effect:{kind:"play",binding:SOURCE_BINDING}}]],onKo:[["OP07-020",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Fish-Man"},then:playFromHand({category:"character",anyOf:[{type:"Fish-Man"},{type:"Merfolk"}],maxCost:3},"op07-aladine-play")}}],["OP07-105",{effect:{kind:"if",condition:lifeAtMost(2),then:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Egghead",maxCost:4,excludeSource:true},bind:"op07-pythagoras-play",min:0,max:1,effect:{kind:"play",binding:"op07-pythagoras-play",rested:true}}}}]],onEndOfYourTurn:[["OP07-021",{effect:{kind:"activate-don",player:"self",count:1}}],["OP07-117",{effect:{kind:"if",condition:lifeAtMost(3),then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Egghead",maxCost:5,rested:true},bind:"op07-egghead-active",min:0,max:1,effect:{kind:"update",binding:"op07-egghead-active",rested:false}}}}]]};var hasNamed=name=>({kind:"selector-count",player:"self",selector:{zone:"board",category:"character",name},operator:"gte",value:1});var playRevealedWhitebeard=(maxCost,bind)=>revealTopThen(bind,{kind:"choose",selector:{player:"self",zone:"deck",binding:bind,category:"character",typeIncluding:"Whitebeard Pirates",maxCost},bind:`${bind}-play`,min:0,max:1,effect:{kind:"play",binding:`${bind}-play`}});var op08OnPlayMechanics={onPlay:[["OP08-004",{effect:{kind:"if",condition:haveNamed("Chess"),then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:3e3},bind:"op08-kuromarimo-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op08-kuromarimo-ko"}}}}],["OP08-005",{effect:{kind:"sequence",effects:[powerDebuff(2e3,"op08-chess-debuff"),{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",name:"Kuromarimo"},operator:"eq",value:0},then:playFromHand({name:"Kuromarimo"},"op08-chess-kuromarimo")}]}}],["OP08-007",chopperDig],["OP08-008",{effect:powerDebuff(1e3,"op08-dalton-debuff")}],["OP08-015",lookAndAdd(4,"op08-kureha-looked",{anyOf:[{name:"Tony Tony.Chopper"},{type:"Drum Kingdom"}],excludeName:"Dr.Kureha"})],["OP08-022",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Minks"},then:restLock(5,"op08-inuarashi-lock",2)}}],["OP08-025",{effect:restLock(3,"op08-shishilian-lock")}],["OP08-028",{effect:{kind:"if",condition:{kind:"rested-cards",player:"opponent",operator:"gte",value:7},then:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}}}],["OP08-031",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Minks",maxCost:2,rested:true},bind:"op08-miyagi-active",min:0,max:1,effect:{kind:"update",binding:"op08-miyagi-active",rested:false}}}],["OP08-033",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"Minks"},{kind:"rested-cards",player:"opponent",operator:"gte",value:7}]},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:2},bind:"op08-roddy-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op08-roddy-ko"}}}}],["OP08-034",lookAndAdd(5,"op08-wanda-looked",{type:"Minks",excludeName:"Wanda"})],["OP08-040",{effect:revealTwoWhitebeard("op08-atmos-reveal",{kind:"if",condition:whitebeardLeader,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"op08-atmos-bounce",min:0,max:1,effect:{kind:"move",binding:"op08-atmos-bounce",to:{player:"owner",zone:"hand"}}}})}],["OP08-043",{effect:{kind:"if",condition:{kind:"all-of",conditions:[whitebeardLeader,{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2}]},then:{kind:"select",selector:{player:"opponent",zone:"board",category:"character"},bind:"op08-newgate-tax",count:"all",effect:{kind:"restrict",binding:"op08-newgate-tax",restriction:"attack-taxed",handTrashCost:2,expiresAfterTurns:1}}}}],["OP08-047",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",excludeSource:true},bind:"op08-jozu-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op08-jozu-cost",to:{player:"owner",zone:"hand"}},{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:6},bind:"op08-jozu-bounce",min:0,max:1,effect:{kind:"move",binding:"op08-jozu-bounce",to:{player:"owner",zone:"hand"}}}]}}}}],["OP08-049",{effect:revealTopThen("op08-jil-top",{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"deck",binding:"op08-jil-top",typeIncluding:"Whitebeard Pirates"},operator:"gte",value:1},then:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}})}],["OP08-050",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op08-namule-back",min:2,max:2,effect:{kind:"order-to-bottom",binding:"op08-namule-back",to:{player:"self",zone:"deck",position:"top"},alternate:{player:"self",zone:"deck",position:"bottom"}}}]}}],["OP08-052",{effect:playRevealedWhitebeard(4,"op08-ace-top")}],["OP08-060",{effect:donMinusOne({kind:"if",condition:{kind:"field-don",player:"opponent",operator:"gte",value:5},then:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}})}],["OP08-063",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top",faceUp:true},bind:"op08-katakuri-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:"op08-katakuri-life",faceUp:false},rampActive]}}}}],["OP08-069",{effect:donMinusOne(payFromHand({player:"self",zone:"hand"},"op08-linlin-cost",1,{kind:"sequence",effects:[deckTopToLife("op08-linlin-life"),{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"op08-linlin-bury",min:0,max:1,effect:{kind:"choice",branches:[{id:"top",label:"Add it to the top of their Life cards",effect:{kind:"move",binding:"op08-linlin-bury",to:{player:"owner",zone:"life",position:"top"},faceUp:true}},{id:"bottom",label:"Add it to the bottom of their Life cards",effect:{kind:"move",binding:"op08-linlin-bury",to:{player:"owner",zone:"life",position:"bottom"},faceUp:true}}]}}]}))}],["OP08-080",lookAndAdd(5,"op08-queen-looked",{type:"Animal Kingdom Pirates",excludeName:"Queen"})],["OP08-086",{effect:{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",maxCost:0},operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op08-ginrummy-trash",min:2,max:2,effect:{kind:"move",binding:"op08-ginrummy-trash",to:{player:"self",zone:"trash"}}}]}}}],["OP08-088",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op08-duval-cost",min:0,max:1,effect:{kind:"modify-cost",binding:"op08-duval-cost",amount:1,expiresAfterTurns:1}}}],["OP08-090",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"SMILE",maxCost:2},bind:"op08-hamlet-play",min:0,max:1,effect:{kind:"play",binding:"op08-hamlet-play"}}}],["OP08-091",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op08-whoswho-cost",1,koCostAtMost(3,"op08-whoswho-ko"))}}],["OP08-092",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",name:"Ulti",maxCost:4},bind:"op08-page-one-play",min:0,max:1,effect:{kind:"play",binding:"op08-page-one-play"}}}],["OP08-100",{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:7,bind:"op08-south-bird"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"op08-south-bird",name:"Upper Yard"},bind:"op08-south-bird-play",min:0,max:1,effect:{kind:"play",binding:"op08-south-bird-play"}},{kind:"select",selector:{player:"self",zone:"deck",binding:"op08-south-bird"},bind:"op08-south-bird-rest",count:"all",effect:{kind:"order-to-bottom",binding:"op08-south-bird-rest",to:{player:"self",zone:"deck",position:"bottom"}}}]}}],["OP08-102",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op08-opera-cost",1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCostFromZoneCount:{player:"self",zone:"life"}},bind:"op08-opera-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op08-opera-ko"}})}}],["OP08-106",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",hasTrigger:true},"op08-nami-cost",1,{kind:"sequence",effects:[koCostAtMost(5,"op08-nami-ko"),{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:3},then:{kind:"draw",player:"self",count:1}}]})}}],["OP08-109",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"Shandian Warrior"},hasNamed("Kalgara")]},then:deckTopToLife("op08-noland-life")}}],["OP08-110",{effect:{kind:"sequence",effects:[lookAndAdd(5,"op08-wyper-looked",{name:"Upper Yard"}).effect,playFromHand({name:"Upper Yard"},"op08-wyper-stage")]}}],["OP08-112",snakeAttackLock],["OP08-118",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op08-rayleigh-big",min:0,max:1,effect:{kind:"modify-power",binding:"op08-rayleigh-big",amount:-3e3,expiresAfterTurns:1}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",excludeBinding:"op08-rayleigh-big"},bind:"op08-rayleigh-small",min:0,max:1,effect:{kind:"modify-power",binding:"op08-rayleigh-small",amount:-2e3,expiresAfterTurns:1}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:3e3},bind:"op08-rayleigh-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op08-rayleigh-ko"}}]}}]]};var givenDon=value=>({kind:"source-attached-don",operator:"gte",value});var restOneOpponent=(bind,maxCost)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",canRest:true,rested:false,...maxCost===void 0?{}:{maxCost}},bind,min:0,max:1,effect:{kind:"rest",binding:bind}});var restOwnCharacters=(count2,bind,effect)=>({kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",canRest:true,rested:false},bind,min:count2,max:count2,effect:{kind:"sequence",effects:[{kind:"rest",binding:bind},effect]}}});var kingdomOrBigMomLeader={kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},{kind:"leader-has-type",player:"self",type:"Big Mom Pirates"}]};var buryThreeFromTrash=(bind,effect)=>({kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash"},bind,min:3,max:3,effect:{kind:"sequence",effects:[{kind:"order-to-bottom",binding:bind,to:{player:"self",zone:"deck",position:"bottom"}},effect]}}});var munchMunchMutation={kind:"sequence",effects:[powerDebuff(3e3,"op08-munch-debuff"),{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op08-munch-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op08-munch-buff",amount:3e3,expiresAfterTurns:0}}]};var imperialFlame=buryThreeFromTrash("op08-imperial-bury",koCostAtMost(2,"op08-imperial-ko"));var op08MainMechanics={eventMain:[["OP08-018",{cost:2,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op08-cloven-buff",min:0,max:3,effect:{kind:"modify-power",binding:"op08-cloven-buff",amount:1e3,expiresAfterTurns:0}},powerDebuff(2e3,"op08-cloven-debuff")]}}}],["OP08-019",{cost:3,program:{effect:munchMunchMutation}}],["OP08-037",{cost:1,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Minks",canRest:true,rested:false},bind:"op08-garchu-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:"op08-garchu-cost"},restOneOpponent("op08-garchu-rest")]}}}}}],["OP08-038",{cost:1,program:{effect:restOwnCharacters(2,"op08-comrade-cost",{kind:"select",selector:{player:"self",zone:"board",category:"character"},bind:"op08-comrade-guard",count:"all",effect:{kind:"restrict",binding:"op08-comrade-guard",restriction:"ko-immune",expiresAfterTurns:1}})}}],["OP08-053",{cost:1,program:{effect:{kind:"if",condition:whitebeardLeader,then:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:3,bind:"op08-thankyou"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"op08-thankyou",anyOf:[{typeIncluding:"Whitebeard Pirates"},{name:"Monkey.D.Luffy"}]},bind:"op08-thankyou-add",min:0,max:1,effect:{kind:"move",binding:"op08-thankyou-add",to:{player:"self",zone:"hand"}}},{kind:"select",selector:{player:"self",zone:"deck",binding:"op08-thankyou"},bind:"op08-thankyou-rest",count:"all",effect:{kind:"order-to-bottom",binding:"op08-thankyou-rest",to:{player:"self",zone:"deck",position:"top"},alternate:{player:"self",zone:"deck",position:"bottom"}}}]}}}}],["OP08-055",{cost:4,program:{effect:revealTwoWhitebeard("op08-phoenix-reveal",{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:6},bind:"op08-phoenix-bury",min:0,max:1,effect:{kind:"move",binding:"op08-phoenix-bury",to:{player:"owner",zone:"deck",position:"bottom"}}})}}],["OP08-075",{cost:1,donMinus:1,program:{effect:{kind:"sequence",effects:[restOneOpponent("op08-candy-rest",2),{kind:"select",selector:{player:"self",zone:"life",faceUp:true},bind:"op08-candy-life",count:"all",effect:{kind:"update",binding:"op08-candy-life",faceUp:false}}]}}}],["OP08-076",{cost:3,program:{effect:{kind:"sequence",effects:[rampActive,{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",minCurrentPower:6e3},operator:"gte",value:1},then:rampActive}]}}}],["OP08-077",{cost:6,donMinus:2,program:{effect:{kind:"if",condition:kingdomOrBigMomLeader,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"op08-conquest-ko",min:0,max:2,effect:{kind:"knock-out",binding:"op08-conquest-ko"}}}}}],["OP08-094",{cost:2,program:{effect:imperialFlame}}],["OP08-095",{cost:2,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:10},then:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op08-iron-body",min:0,max:1,effect:{kind:"modify-power",binding:"op08-iron-body",amount:2e3,expiresAfterTurns:1}}}}}],["OP08-097",{cost:3,program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},then:{kind:"sequence",effects:[costDebuff(2,"op08-helice-cost"),{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:0},bind:"op08-helice-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op08-helice-ko"}}]}}}}],["OP08-117",{cost:5,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top"},bind:"op08-burn-blade-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op08-burn-blade-life",to:{player:"owner",zone:"trash"}},koCostAtMost(7,"op08-burn-blade-ko")]}}}}}]],activateMain:[["OP08-001",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",anyOf:[{type:"Animal"},{type:"Drum Kingdom"}]},bind:"op08-chopper-leader-don",min:0,max:3,effect:{kind:"attach-don",player:"self",from:"rested",count:1,target:{binding:"op08-chopper-leader-don",each:true}}}}}],["OP08-002",{oncePerTurn:true,program:{effect:{kind:"if",condition:givenDon(1),then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op08-marco-back",min:1,max:1,effect:{kind:"order-to-bottom",binding:"op08-marco-back",to:{player:"self",zone:"deck",position:"top"},alternate:{player:"self",zone:"deck",position:"bottom"}}},powerDebuff(2e3,"op08-marco-debuff")]}}}}],["OP08-008",{oncePerTurn:true,requires:{lifeCards:1},program:{effect:{kind:"if",condition:givenDon(1),then:lifeToHandCost({kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0},"top").effect}}}],["OP08-010",{oncePerTurn:true,program:{effect:{kind:"if",condition:givenDon(1),then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Animal",excludeSource:true},bind:"op08-hiking-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op08-hiking-buff",amount:1e3,expiresAfterTurns:0}}}}}],["OP08-016",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Tony Tony.Chopper"},then:{kind:"select",selector:{player:"self",zone:"board",category:"character",name:"Tony Tony.Chopper"},bind:"op08-hiriluk-buff",count:"all",effect:{kind:"modify-power",binding:"op08-hiriluk-buff",amount:2e3,expiresAfterTurns:0}}}]}}}}],["OP08-021",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"Minks"},operator:"gte",value:1},then:restOneOpponent("op08-carrot-rest",5)}}}],["OP08-032",{oncePerTurn:false,requires:{sourceActive:true,restedDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Minks"},then:{kind:"activate-don",player:"self",count:1}}]}}}}],["OP08-039",{oncePerTurn:false,requires:{sourceActive:true,restedDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Minks"},then:{kind:"activate-don",player:"self",count:1}}]}}}}],["OP08-041",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"hand"}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Kuja Pirates"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1},bind:"op08-aphelandra-bury",min:0,max:1,effect:{kind:"move",binding:"op08-aphelandra-bury",to:{player:"owner",zone:"deck",position:"bottom"}}}}]}}}}],["OP08-044",{oncePerTurn:true,requires:{handCardsMatching:{match:{typeIncluding:"Whitebeard Pirates"},count:2}},program:{effect:revealTwoWhitebeard("op08-kingdew-reveal",{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:0})}}],["OP08-057",{oncePerTurn:true,requires:{fieldDon:2},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:2},{kind:"choice",branches:[{id:"draw",label:"Draw 1 card (with 5 or less cards in hand)",effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:5},then:{kind:"draw",player:"self",count:1}}},{id:"cost",label:"Give 1 of their Characters -2 cost this turn",effect:costDebuff(2,"op08-king-leader-cost")}]}]}}}}],["OP08-059",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"trash"}},{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},{kind:"field-don",player:"self",operator:"gte",value:10}]},then:playFromHand({name:"King",maxCost:7},"op08-alber-king")}]}}}}],["OP08-062",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"trash"}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Big Mom Pirates"},then:playFromHand({name:"Charlotte Katakuri",minCost:3,maxCostFromFieldDon:"opponent"},"op08-katakuri-chain")}]}}}}],["OP08-064",{oncePerTurn:true,requires:{fieldDon:1},program:{effect:donMinusOne(playFromHand({name:"Biscuit Warrior"},"op08-cracker-biscuit"))}}],["OP08-074",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",name:"Black Maria",excludeSource:true},operator:"eq",value:0},then:{kind:"sequence",effects:[{kind:"add-don",player:"self",count:5,rested:true},{kind:"equalize-don-at-end-of-turn",player:"self"}]}}}}],["OP08-079",{oncePerTurn:true,requires:{handCards:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op08-kaido-cost",1,{kind:"if",condition:{kind:"source-played-this-turn"},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:7},bind:"op08-kaido-trash",min:0,max:1,effect:{kind:"move",binding:"op08-kaido-trash",to:{player:"owner",zone:"trash"}}},{kind:"choose",chooser:"opponent",selector:{player:"opponent",zone:"hand"},bind:"op08-kaido-their-trash",min:1,max:1,effect:{kind:"move",binding:"op08-kaido-their-trash",to:{player:"owner",zone:"trash"}}}]}})}}}],["OP08-082",{oncePerTurn:false,requires:{activeDon:1},program:{effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"optional",effect:{kind:"update",binding:SOURCE_BINDING,rested:true}},costDebuff(2,"op08-sasaki-cost")]}}}],["OP08-084",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op08-jack-trash",min:1,max:1,effect:{kind:"move",binding:"op08-jack-trash",to:{player:"self",zone:"trash"}}},koCostAtMost(3,"op08-jack-ko")]}}}}],["OP08-087",{oncePerTurn:true,program:{effect:costDebuff(1,"op08-apoo-cost")}}],["OP08-101",{oncePerTurn:true,requires:{lifeCards:1},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top"},bind:"op08-angel-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op08-angel-life",to:{player:"owner",zone:"trash"}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Big Mom Pirates"},then:{kind:"deck-top-to-life-at-end-of-turn",player:"self",count:1}}]}}}}}],["OP08-103",{oncePerTurn:true,requires:{lifeCards:1},program:lifeToHandCost({kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op08-custard-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op08-custard-buff",amount:1e3,expiresAfterTurns:1}},"top")}],["OP08-107",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name:"Charlotte Pudding"},bind:"op08-nitro-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op08-nitro-buff",amount:2e3,expiresAfterTurns:0}}]}}}}]],onEndOfYourTurn:[["OP08-039",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Minks",rested:true},bind:"op08-zou-active",min:0,max:1,effect:{kind:"update",binding:"op08-zou-active",rested:false}}}]]};var donMinusTen=effect=>donMinus(10,effect);var givenDon2=value=>({kind:"source-attached-don",operator:"gte",value});var op08BattleMechanics={counterEvent:[["OP08-017",{cost:2,power:4e3,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"op08-never-shoot-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op08-never-shoot-debuff",amount:-1e3,expiresAfterTurns:0}}}}],["OP08-019",{cost:3,power:0,program:{effect:munchMunchMutation}}],["OP08-054",{cost:3,power:3e3,program:{effect:playRevealedWhitebeard(3,"op08-king-counter")}}],["OP08-094",{cost:2,power:0,program:{effect:imperialFlame}}],["OP08-096",{cost:1,power:0,program:{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:1,bind:"op08-dreams-top"},{kind:"reveal",binding:"op08-dreams-top"},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"deck",binding:"op08-dreams-top",minCost:6},operator:"gte",value:1},then:{kind:"battle-power",player:"self",amount:5e3}},{kind:"select",selector:{player:"self",zone:"deck",binding:"op08-dreams-top"},bind:"op08-dreams-trash",count:"all",effect:{kind:"move",binding:"op08-dreams-trash",to:{player:"self",zone:"trash"}}}]}}}],["OP08-115",{cost:1,power:3e3,powerWhen:{kind:"leader-has-type",player:"self",type:"Shandian Warrior"},program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Shandian Warrior"},then:playFromHand({name:"Upper Yard"},"op08-earth-stage")}}}],["OP08-116",{cost:2,power:4e3,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"edge"},bind:"op08-bazooka-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op08-bazooka-life",to:{player:"self",zone:"hand"}},paidToHand("op08-bazooka-life",[{kind:"choose",selector:{player:"self",zone:"hand",type:"Shandian Warrior"},bind:"op08-bazooka-stack",min:0,max:1,effect:{kind:"move",binding:"op08-bazooka-stack",to:{player:"self",zone:"life",position:"top"},faceUp:true}}])]}}}}}]],whenAttacking:[["OP08-007",chopperDig],["OP08-012",{effect:{kind:"if",condition:{kind:"all-of",conditions:[givenDon2(2),{kind:"leader-has-type",player:"self",type:"Drum Kingdom"}]},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:4e3},bind:"op08-lapins-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op08-lapins-ko"}}}}],["OP08-014",{effect:{kind:"if",condition:givenDon2(1),then:{kind:"sequence",effects:[powerDebuff(2e3,"op08-wapol-debuff"),{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:1}]}}}],["OP08-024",{effect:restLock(4,"op08-concelot-lock")}],["OP08-026",{effect:{kind:"if",condition:givenDon2(1),then:restLock(1,"op08-giovanni-lock")}}],["OP08-042",{effect:{kind:"if",condition:givenDon2(1),then:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:3},bind:"op08-weevil-bounce",min:0,max:1,effect:{kind:"move",binding:"op08-weevil-bounce",to:{player:"owner",zone:"hand"}}}}}],["OP08-058",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top",positionCount:2,faceUp:false},bind:"op08-pudding-life",min:2,max:2,effect:{kind:"sequence",effects:[{kind:"update",binding:"op08-pudding-life",faceUp:true},rampRested]}}}}],["OP08-061",{effect:donMinusOne(koCostAtMost(3,"op08-oven-ko"))}],["OP08-081",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash",typeIncluding:"CP"},bind:"op08-guernica-bury",min:3,max:3,effect:{kind:"sequence",effects:[{kind:"order-to-bottom",binding:"op08-guernica-bury",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:0},bind:"op08-guernica-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op08-guernica-ko"}}]}}}}],["OP08-085",{effect:{kind:"if",condition:{kind:"all-of",conditions:[givenDon2(1),{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",minCost:8},operator:"gte",value:1}]},then:koCostAtMost(4,"op08-jinbe-ko")}}],["OP08-098",{effect:{kind:"if",condition:givenDon2(1),then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Shandian Warrior",maxCostFromFieldDon:"self"},bind:"op08-kalgara-play",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"play",binding:"op08-kalgara-play"},{kind:"select",selector:{player:"self",zone:"life",position:"top"},bind:"op08-kalgara-life",count:1,effect:{kind:"move",binding:"op08-kalgara-life",to:{player:"self",zone:"hand"}}}]}}}}],["OP08-111",{effect:{kind:"if",condition:givenDon2(1),then:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Unblockable",expiresAfterTurns:0}}}],["OP08-119",{effect:donMinusTen({kind:"sequence",effects:[{kind:"select",selector:{player:"either",zone:"board",category:"character",excludeSource:true},bind:"op08-kaidolinlin-wipe",count:"all",effect:{kind:"knock-out",binding:"op08-kaidolinlin-wipe"}},deckTopToLife("op08-kaidolinlin-life"),{kind:"optional",effect:{kind:"select",selector:{player:"opponent",zone:"life",position:"top"},bind:"op08-kaidolinlin-burn",count:1,effect:{kind:"move",binding:"op08-kaidolinlin-burn",to:{player:"owner",zone:"trash"}}}}]})}]]};var op08ReplacementMechanics={replacement:[["OP08-045",{opponentEffectOnly:true,alsoAnyKo:true,removal:"off-field",oncePerTurn:false,label:"Trash Thatch and draw 1 card",cost:{kind:"trash-self-and-draw",draw:1}}]]};var onPlayProgram=cardNumber=>(op08OnPlayMechanics.onPlay??[]).find(([number])=>number===cardNumber)[1];var drawOne={effect:{kind:"draw",player:"self",count:1}};var drawTwoTrashOne={kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op08-draw-two-trash",min:1,max:1,effect:{kind:"move",binding:"op08-draw-two-trash",to:{player:"self",zone:"trash"}}}]};var seraphimTrigger=(bind,then)=>({effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},bind,1,{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:then?{kind:"sequence",effects:[{kind:"play",binding:SOURCE_BINDING},then]}:{kind:"play",binding:SOURCE_BINDING}})}});var fetchFromDeck=(name,maxCost,bind)=>donMinusOne({kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"deck",category:"character",name,maxCost},bind,min:0,max:1,effect:{kind:"play",binding:bind}},{kind:"shuffle-deck",player:"self"}]});var onOpponentTurn=effect=>({kind:"if",condition:{kind:"turn-player",player:"opponent"},then:effect});var op08TriggerMechanics={trigger:[["OP08-017",{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"op08-never-shoot-trigger",min:0,max:1,effect:{kind:"modify-power",binding:"op08-never-shoot-trigger",amount:1e3,expiresAfterTurns:0}}}],["OP08-018",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"op08-cloven-trigger",min:0,max:1,effect:{kind:"modify-power",binding:"op08-cloven-trigger",amount:-3e3,expiresAfterTurns:0}}}],["OP08-019",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:5e3},bind:"op08-munch-trigger",min:0,max:1,effect:{kind:"knock-out",binding:"op08-munch-trigger"}}}],["OP08-037",drawOne],["OP08-053",drawOne],["OP08-038",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:3,canRest:true,rested:false},bind:"op08-comrade-trigger",min:0,max:1,effect:{kind:"rest",binding:"op08-comrade-trigger"}}}],["OP08-056",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP08-068",{effect:donMinusOne({kind:"play",binding:SOURCE_BINDING})}],["OP08-075",{effect:rampActive}],["OP08-076",{effect:rampActive}],["OP08-091",{effect:koCostAtMost(3,"op08-whoswho-trigger")}],["OP08-097",{effect:koCostAtMost(3,"op08-helice-trigger")}],["OP08-094",{effect:imperialFlame}],["OP08-095",{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"op08-iron-body-trigger",min:0,max:1,effect:{kind:"modify-power",binding:"op08-iron-body-trigger",amount:2e3,expiresAfterTurns:0}}}],["OP08-096",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",color:"Black",maxCost:3},bind:"op08-dreams-trigger",min:0,max:1,effect:{kind:"play",binding:"op08-dreams-trigger"}}}],["OP08-104",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op08-poire-cost",1,{kind:"sequence",effects:[{kind:"play",binding:SOURCE_BINDING},{kind:"draw",player:"self",count:1}]})}}],["OP08-105",{effect:drawTwoTrashOne}],["OP08-115",{effect:drawTwoTrashOne}],["OP08-106",asOnPlayTrigger(onPlayProgram("OP08-106"))],["OP08-111",seraphimTrigger("op08-shark-trigger")],["OP08-114",seraphimTrigger("op08-hawk-trigger")],["OP08-113",seraphimTrigger("op08-bear-trigger",koCostAtMost(3,"op08-bear-ko"))],["OP08-112",asOnPlayTrigger(snakeAttackLock)],["OP08-117",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top"},bind:"op08-burn-blade-trigger",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op08-burn-blade-trigger",to:{player:"self",zone:"hand"}},paidToHand("op08-burn-blade-trigger",[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op08-burn-blade-stack",min:0,max:1,effect:{kind:"move",binding:"op08-burn-blade-stack",to:{player:"self",zone:"life",position:"top"}}}])]}}}}]],onKo:[["OP08-030",{effect:{kind:"choice",branches:[{id:"rest-don",label:"Rest 1 of their DON!! cards",effect:{kind:"rest-don",player:"opponent",count:1}},{id:"ko",label:"K.O. 1 of their rested Characters (cost 6 or less)",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:6},bind:"op08-pedro-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op08-pedro-ko"}}}]}}],["OP08-066",{effect:rampRested}],["OP08-068",{effect:rampRested}],["OP08-070",{effect:donMinusOne(playFromHand({name:"Viscount Hiyoko",maxCost:5},"op08-tamago-hiyoko"))}],["OP08-071",{effect:onOpponentTurn(fetchFromDeck("Baron Tamago",4,"op08-niwatori-fetch"))}],["OP08-073",{effect:onOpponentTurn(fetchFromDeck("Count Niwatori",6,"op08-hiyoko-fetch"))}]]};var restedCharacters=value=>({kind:"selector-count",player:"self",selector:{zone:"board",category:"character",rested:true},operator:"gte",value});var twoRestedCharacters=restedCharacters(2);var threeRestedCharacters=restedCharacters(3);var debuffOneCharacter=(amount,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind,min:0,max:1,effect:{kind:"modify-power",binding:bind,amount:-amount,expiresAfterTurns:0}});var givenDon3=value=>({kind:"source-attached-don",operator:"gte",value});var op09BattleMechanics={counterEvent:[["OP09-039",{cost:1,power:0,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"ODYSSEY"},twoRestedCharacters]},then:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"op09-bazooka-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op09-bazooka-buff",amount:2e3,expiresAfterTurns:0}}}}}],["OP09-041",{cost:1,power:2e3,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"ODYSSEY"},twoRestedCharacters]},then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",rested:true},bind:"op09-solid-refresh",min:0,max:2,effect:{kind:"update",binding:"op09-solid-refresh",rested:false}}}}}],["OP09-059",{cost:2,power:3e3,program:{effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op09-steam-bath-trash",min:0,max:2,effect:{kind:"sequence",effects:[{kind:"move",binding:"op09-steam-bath-trash",to:{player:"self",zone:"trash"}},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"trash",binding:"op09-steam-bath-trash"},operator:"gte",value:1},then:{kind:"trash-top",player:"self",count:1}},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"trash",binding:"op09-steam-bath-trash"},operator:"gte",value:2},then:{kind:"trash-top",player:"self",count:1}}]}}}}],["OP09-078",{cost:1,donMinus:2,trashFromHand:1,power:4e3,powerWhen:{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"},program:{effect:payFromHand({player:"self",zone:"hand"},"op09-giant-cost",1,{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"},then:{kind:"draw",player:"self",count:2}})}}],["OP09-097",{cost:2,power:0,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"op09-vortex",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"negate",binding:"op09-vortex",expiresAfterTurns:0},{kind:"modify-power",binding:"op09-vortex",amount:-4e3,expiresAfterTurns:0}]}}}}],["OP09-116",{cost:1,power:2e3}]],onOpponentAttack:[["OP09-001",{oncePerTurn:true,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"op09-shanks-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op09-shanks-debuff",amount:-1e3,expiresAfterTurns:0}}}}}],["OP09-023",{oncePerTurn:true,requires:{activeDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"battle-power",player:"self",amount:2e3}]}}}}],["OP09-032",{oncePerTurn:true,program:{effect:{kind:"optional",effect:{kind:"update",binding:SOURCE_BINDING,rested:false}}}}]],whenAttacking:[["OP09-003",{effect:debuffOneCharacter(2e3,"op09-shachi-debuff")}],["OP09-010",{effect:{kind:"if",condition:givenDon3(1),then:{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:0}}}],["OP09-013",{effect:{kind:"if",condition:givenDon3(1),then:debuffOneCharacter(1e3,"op09-yasopp-debuff")}}],["OP09-027",{oncePerTurn:true,program:{effect:{kind:"if",condition:threeRestedCharacters,then:{kind:"draw",player:"self",count:1}}}}],["OP09-044",{effect:{kind:"sequence",effects:[lookAndAdd(5,"op09-izo-looked",{anyOf:[{type:"Land of Wano"},{typeIncluding:"Whitebeard Pirates"}]}).effect,{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op09-izo-discard",min:1,max:1,effect:{kind:"move",binding:"op09-izo-discard",to:{player:"self",zone:"trash"}}}]}}],["OP09-050",lookAndAdd(5,"op09-nami-looked",{category:"event",color:"Blue"})],["OP09-062",{oncePerTurn:false,requires:{handCardsMatching:{match:{hasTrigger:true},count:1}},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",hasTrigger:true},"op09-robin-leader-cost",1,{kind:"add-don",player:"self",count:1,rested:true})}}}],["OP09-073",{effect:donMinusOrMore(1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op09-brook-debuff",min:0,max:2,effect:{kind:"modify-power",binding:"op09-brook-debuff",amount:-2e3,expiresAfterTurns:0}})}],["OP09-088",{oncePerTurn:false,requires:{handCards:2},program:{effect:{kind:"if",condition:givenDon3(1),then:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op09-shiryu-cost",2,{kind:"draw",player:"self",count:2})}}}}]]};var redHairedDebuff=(amount,bind)=>({kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Red-Haired Pirates"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind,min:0,max:1,effect:{kind:"modify-power",binding:bind,amount:-amount,expiresAfterTurns:0}}});var ifBlackbeardLeader=effect=>({kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Blackbeard Pirates"},then:effect});var costDebuff2=(amount,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind,min:0,max:1,effect:{kind:"modify-cost",binding:bind,amount:-amount,expiresAfterTurns:0}});var op09MainMechanics={eventMain:[["OP09-018",{cost:3,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op09-get-out-ko",min:0,max:2,maxTotalPower:4e3,effect:{kind:"knock-out",binding:"op09-get-out-ko"}}}}],["OP09-019",{cost:2,program:{effect:{kind:"sequence",effects:[redHairedDebuff(3e3,"op09-friend-debuff"),{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",minCurrentPower:5e3},operator:"gte",value:1},then:{kind:"draw",player:"self",count:1}}]}}}],["OP09-020",{cost:1,program:lookAndAdd(5,"op09-come-on-looked",{type:"Red-Haired Pirates",excludeName:"Come On!! We'll Fight You!!"})}],["OP09-040",{cost:3,program:{effect:{kind:"if",condition:twoRestedCharacters,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"op09-thunder-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op09-thunder-ko"}}}}}],["OP09-057",{cost:1,program:lookAndAdd(4,"op09-cross-guild-looked",{type:"Cross Guild"})}],["OP09-058",{cost:2,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"op09-muggy-bounce",min:1,max:1,chooser:"opponent",effect:{kind:"move",binding:"op09-muggy-bounce",to:{player:"owner",zone:"hand"}}}}}],["OP09-077",{cost:2,program:{effect:donMinus(2,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:6e3},bind:"op09-lightning-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op09-lightning-ko"}})}}],["OP09-079",{cost:2,program:{effect:donMinus(2,{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5,canRest:true,rested:false},bind:"op09-jump-rope-rest",min:0,max:1,effect:{kind:"rest",binding:"op09-jump-rope-rest"}},{kind:"draw",player:"self",count:1}]})}}],["OP09-098",{cost:4,program:{effect:ifBlackbeardLeader({kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op09-black-hole",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"negate",binding:"op09-black-hole",expiresAfterTurns:0},{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",binding:"op09-black-hole",maxCost:4},operator:"gte",value:1},then:{kind:"knock-out",binding:"op09-black-hole"}}]}})}}],["OP09-115",{cost:1,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:3,hasTrigger:true},bind:"op09-ice-block-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op09-ice-block-ko"}}}}],["OP09-117",{cost:3,program:lookAndAdd(5,"op09-dereshi-looked",{hasTrigger:true,excludeName:"Dereshi!"},2)}]],activateMain:[["OP09-008",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"deck",position:"bottom"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op09-snake-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op09-snake-debuff",amount:-3e3,expiresAfterTurns:0}}]}}}}],["OP09-011",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},redHairedDebuff(2e3,"op09-hongo-debuff")]}}}}],["OP09-021",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},redHairedDebuff(1e3,"op09-red-force-debuff")]}}}}],["OP09-022",{oncePerTurn:true,requires:{activeDon:3},program:{effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:3},{kind:"add-don",player:"self",count:1,rested:true},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"ODYSSEY",maxCost:5},bind:"op09-lim-play",min:0,max:1,effect:{kind:"play",binding:"op09-lim-play"}}]}}}],["OP09-042",{oncePerTurn:false,requires:{activeDon:5,handCards:1},program:{effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:5},payFromHand({player:"self",zone:"hand"},"op09-buggy-cost",1,{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Cross Guild"},bind:"op09-buggy-play",min:0,max:1,effect:{kind:"play",binding:"op09-buggy-play"}})]}}}],["OP09-060",{oncePerTurn:false,requires:{sourceActive:true,handCards:2},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op09-emptee-cost",min:2,max:2,effect:{kind:"sequence",effects:[{kind:"order-to-bottom",binding:"op09-emptee-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Cross Guild"},then:{kind:"draw",player:"self",count:2}}]}}}}}],["OP09-081",{oncePerTurn:false,requires:{handCards:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op09-teach-leader-cost",1,{kind:"restrict-player",player:"opponent",restriction:"on-play-negated",expiresAfterTurns:1})}}}],["OP09-083",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},ifBlackbeardLeader(costDebuff2(3,"op09-augur-cost"))]}}}}],["OP09-084",{oncePerTurn:true,program:{effect:ifBlackbeardLeader({kind:"choice",branches:[{id:"double-attack",label:"Gain [Double Attack]",effect:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Double Attack",expiresAfterTurns:1}},{id:"banish",label:"Gain [Banish]",effect:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Banish",expiresAfterTurns:1}},{id:"blocker",label:"Gain [Blocker]",effect:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Blocker",expiresAfterTurns:1}}]})}}],["OP09-089",{oncePerTurn:false,requires:{handCards:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op09-stronger-cost",1,{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"trash"}},ifBlackbeardLeader({kind:"sequence",effects:[{kind:"draw",player:"self",count:1},costDebuff2(2,"op09-stronger-cost-debuff")]})]})}}}],["OP09-090",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},ifBlackbeardLeader({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1},bind:"op09-doc-q-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op09-doc-q-ko"}})]}}}}],["OP09-092",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:{kind:"hand-count-versus",player:"self",operator:"lt",by:3},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op09-teach-discard",min:1,max:1,effect:{kind:"move",binding:"op09-teach-discard",to:{player:"self",zone:"trash"}}}]}}]}}}}],["OP09-095",{oncePerTurn:false,requires:{sourceActive:true,activeDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"rest",binding:SOURCE_BINDING},lookAndAdd(5,"op09-laffitte-looked",{type:"Blackbeard Pirates"}).effect]}}}}]]};var op09OnPlayMechanics={onPlay:[["OP09-002",lookAndAdd(5,"op09-uta-looked",{type:"Red-Haired Pirates"})],["OP09-005",{effect:{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",minPower:5e3},operator:"gte",value:2},then:drawAndDiscard(2,1,"op09-refill-discard")}}],["OP09-007",{effect:{kind:"choose",selector:{player:"self",zone:[],includeLeader:true,maxCurrentPower:4e3},bind:"op09-heat-leader",min:0,max:1,effect:{kind:"modify-power",binding:"op09-heat-leader",amount:1e3,expiresAfterTurns:0}}}],["OP09-009",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:6e3},bind:"op09-beckman-trash",min:0,max:1,effect:{kind:"move",binding:"op09-beckman-trash",to:{player:"owner",zone:"trash"}}}}],["OP09-010",{effect:{kind:"choose",selector:{player:"self",zone:"hand",name:"Monster"},bind:"op09-bonk-monster",min:0,max:1,effect:{kind:"play",binding:"op09-bonk-monster"}}}],["OP09-013",{effect:{kind:"choose",selector:{player:"self",zone:[],includeLeader:true},bind:"op09-yasopp-leader",min:0,max:1,effect:{kind:"modify-power",binding:"op09-yasopp-leader",amount:1e3,expiresAfterTurns:1}}}],["OP09-014",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",keyword:"Blocker",maxCurrentPower:4e3},bind:"op09-limejuice-blocker",min:0,max:1,effect:{kind:"restrict",binding:"op09-limejuice-blocker",restriction:"cannot-block",expiresAfterTurns:0}}}],["OP09-023",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"ODYSSEY"},then:{kind:"activate-don",player:"self",count:3}}}],["OP09-024",{effect:{kind:"if",condition:twoRestedCharacters,then:drawAndDiscard(2,2,"op09-refill-discard")}}],["OP09-026",{effect:{kind:"if",condition:twoRestedCharacters,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"op09-sakazuki-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op09-sakazuki-ko"}}}}],["OP09-030",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op09-law-bounce",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op09-law-bounce",to:{player:"owner",zone:"hand"}},{kind:"choose",selector:{player:"self",zone:"hand",type:"ODYSSEY",category:"character",maxCost:3,excludeName:"Trafalgar Law"},bind:"op09-law-play",min:0,max:1,effect:{kind:"play",binding:"op09-law-play"}}]}}}}],["OP09-033",{effect:{kind:"if",condition:twoRestedCharacters,then:{kind:"select",selector:{player:"self",zone:"board",category:"character",anyOf:[{type:"ODYSSEY"},{type:"Straw Hat Crew"}]},bind:"op09-robin-immune",count:"all",effect:{kind:"restrict",binding:"op09-robin-immune",restriction:"ko-immune",expiresAfterTurns:1}}}}],["OP09-034",{effect:{kind:"sequence",effects:[lookAndAdd(5,"op09-perona-looked",{anyOf:[{name:"Dracule Mihawk"},{type:"Thriller Bark Pirates"}]}).effect,{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op09-perona-discard",min:1,max:1,effect:{kind:"move",binding:"op09-perona-discard",to:{player:"self",zone:"trash"}}}]}}],["OP09-035",{effect:{kind:"if",condition:twoRestedCharacters,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5,canRest:true,rested:false},bind:"op09-ace-rest",min:0,max:1,effect:{kind:"rest",binding:"op09-ace-rest"}}}}],["OP09-036",{effect:{kind:"if",condition:twoRestedCharacters,then:{kind:"rest-opponent-cards",player:"opponent",count:1,maxCost:6}}}],["OP09-037",lookAndAdd(5,"op09-lim-looked",{type:"ODYSSEY",excludeName:"Lim"})],["OP09-046",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:5,anyOf:[{type:"Cross Guild"},{typeIncluding:"Baroque Works"}]},bind:"op09-crocodile-play",min:0,max:1,effect:{kind:"play",binding:"op09-crocodile-play"}}}],["OP09-048",{effect:drawAndDiscard(2,1,"op09-refill-discard")}],["OP09-051",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op09-buggy-bury",min:0,max:1,effect:{kind:"move",binding:"op09-buggy-bury",to:{player:"owner",zone:"deck",position:"bottom"}}},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",minCost:5},operator:"gte",value:5},then:{kind:"sequence",effects:[]},else:{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"deck",position:"bottom"}}}]}}],["OP09-053",{effect:{kind:"sequence",effects:[lookAndAdd(5,"op09-mohji-looked",{name:"Richie"}).effect,{kind:"choose",selector:{player:"self",zone:"hand",name:"Richie"},bind:"op09-mohji-play",min:0,max:1,effect:{kind:"play",binding:"op09-mohji-play"}}]}}],["OP09-056",lookAndAdd(4,"op09-galdino-looked",{excludeName:"Mr.3(Galdino)",anyOf:[{type:"Cross Guild"},{typeIncluding:"Baroque Works"}]})],["OP09-064",{effect:donMinus(1,{kind:"choose",selector:{player:"self",zone:[],includeLeader:true,type:"Kid Pirates",rested:true},bind:"op09-killer-leader",min:0,max:1,effect:{kind:"update",binding:"op09-killer-leader",rested:false}})}],["OP09-065",{effect:donMinusOrMore(1,{kind:"sequence",effects:[{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6,canRest:true,rested:false},bind:"op09-sanji-rest",min:0,max:1,effect:{kind:"rest",binding:"op09-sanji-rest"}}]})}],["OP09-066",{effect:{kind:"if",condition:{kind:"field-don-versus",player:"self",operator:"lt"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:3},bind:"op09-jean-bart-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op09-jean-bart-ko"}}}}],["OP09-070",{effect:donMinusOrMore(1,{kind:"give-rested-don",player:"self",count:2})}],["OP09-075",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top"},bind:"op09-kid-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op09-kid-life",to:{player:"self",zone:"hand"}},paidToHand("op09-kid-life",[{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Kid Pirates"},then:{kind:"add-don",player:"self",count:1,rested:false}}])]}}}}],["OP09-076",{effect:donMinusOrMore(1,{kind:"add-don",player:"self",count:1,rested:false})}],["OP09-085",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Thriller Bark Pirates",maxCost:2},bind:"op09-moria-play",min:0,max:1,effect:{kind:"play",binding:"op09-moria-play",rested:true}}}],["OP09-087",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:5},then:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op09-pudding-discard",min:1,max:1,chooser:"opponent",effect:{kind:"move",binding:"op09-pudding-discard",to:{player:"opponent",zone:"trash"}}}}}],["OP09-101",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:3},bind:"op09-kuzan-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"choice",branches:[{id:"top",label:"Place it on top of their Life cards",effect:{kind:"move",binding:"op09-kuzan-life",faceUp:true,to:{player:"opponent",zone:"life",position:"top"}}},{id:"bottom",label:"Place it at the bottom of their Life cards",effect:{kind:"move",binding:"op09-kuzan-life",faceUp:true,to:{player:"opponent",zone:"life",position:"bottom"}}}]},{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op09-kuzan-discard",min:1,max:1,chooser:"opponent",effect:{kind:"move",binding:"op09-kuzan-discard",to:{player:"opponent",zone:"trash"}}}]}}}],["OP09-102",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Nico Robin"},then:lookAndAdd(3,"op09-clover-looked",{hasTrigger:true}).effect}}],["OP09-103",lifeToHandCost({kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Revolutionary Army",maxCost:4},bind:"op09-koala-play",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"play",binding:"op09-koala-play"},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",binding:"op09-koala-play"},operator:"gte",value:1},then:{kind:"draw",player:"self",count:1}}]}})],["OP09-104",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Revolutionary Army"},bind:"op09-sabo-life",min:0,max:1,effect:{kind:"move",binding:"op09-sabo-life",faceUp:true,to:{player:"self",zone:"life",position:"top"}}},{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"gte",value:2},then:{kind:"choose",selector:{player:"self",zone:"life",position:"edge"},bind:"op09-sabo-take",min:1,max:1,effect:{kind:"move",binding:"op09-sabo-take",to:{player:"self",zone:"hand"}}}}]}}],["OP09-106",{effect:{kind:"choose",selector:{player:"self",zone:[],includeLeader:true,name:"Nico Robin"},bind:"op09-olvia-leader",min:0,max:1,effect:{kind:"modify-power",binding:"op09-olvia-leader",amount:3e3,expiresAfterTurns:0}}}],["OP09-107",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"gte",value:3},then:{kind:"choose",selector:{player:"opponent",zone:"life",position:"top"},bind:"op09-robin-life",min:0,max:1,effect:{kind:"move",binding:"op09-robin-life",to:{player:"owner",zone:"trash"}}}}}],["OP09-110",{effect:drawAndDiscard(2,2,"op09-refill-discard")}],["OP09-114",{effect:{kind:"if",condition:{kind:"combined-life",operator:"lte",value:5},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:2e3},bind:"op09-lindbergh-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op09-lindbergh-ko"}}}}],["OP09-119",{effect:donMinusOrMore(1,{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}]})}]]};var op09ReplacementMechanics={replacement:[["OP09-012",{opponentEffectOnly:false,effectOnly:true,oncePerTurn:false,protects:{name:"Bonk Punch"},label:"Trash Monster",cost:{kind:"trash-self"}}]]};var eventMainProgram=cardNumber=>(op09MainMechanics.eventMain??[]).find(([number])=>number===cardNumber)[1].program;var onPlayProgram2=cardNumber=>(op09OnPlayMechanics.onPlay??[]).find(([number])=>number===cardNumber)[1];var drawOne2={effect:{kind:"draw",player:"self",count:1}};var rampOne={effect:{kind:"add-don",player:"self",count:1,rested:false}};var restCostFour=bind=>({effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4,canRest:true,rested:false},bind,min:0,max:1,effect:{kind:"rest",binding:bind}}});var negateOne=bind=>({effect:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind,min:0,max:1,effect:{kind:"negate",binding:bind,expiresAfterTurns:0}}});var playIfBehind=leaderType=>({effect:{kind:"if",condition:leaderType?{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:leaderType},{kind:"combined-life",operator:"lte",value:5}]}:{kind:"combined-life",operator:"lte",value:5},then:{kind:"play",binding:SOURCE_BINDING}}});var playFromHand2=(bind,match)=>({effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",...match},bind,min:0,max:1,effect:{kind:"play",binding:bind}}});var refreshSelf={effect:{kind:"update",binding:SOURCE_BINDING,rested:false}};var op09TriggerMechanics={trigger:[["OP09-019",drawOne2],["OP09-020",drawOne2],["OP09-059",drawOne2],["OP09-115",drawOne2],["OP09-117",drawOne2],["OP09-039",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4,rested:true},bind:"op09-bazooka-trigger-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op09-bazooka-trigger-ko"}}}],["OP09-040",restCostFour("op09-thunder-trigger-rest")],["OP09-041",restCostFour("op09-solid-trigger-rest")],["OP09-057",eventMainProgram("OP09-057")],["OP09-058",{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:3},bind:"op09-muggy-trigger",min:0,max:1,effect:{kind:"move",binding:"op09-muggy-trigger",to:{player:"owner",zone:"hand"}}}}],["OP09-077",rampOne],["OP09-079",rampOne],["OP09-097",negateOne("op09-vortex-trigger")],["OP09-098",negateOne("op09-black-hole-trigger")],["OP09-100",playIfBehind("Revolutionary Army")],["OP09-108",playIfBehind("Revolutionary Army")],["OP09-114",playIfBehind()],["OP09-102",asOnPlayTrigger(onPlayProgram2("OP09-102"))],["OP09-104",{effect:{kind:"if",condition:{kind:"leader-multicolored",player:"self"},then:{kind:"draw",player:"self",count:2}}}],["OP09-105",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Egghead"},then:{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"op09-sanji-life",count:1,effect:{kind:"move",binding:"op09-sanji-life",to:{player:"self",zone:"life",position:"top"}}},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op09-sanji-discard",min:0,max:2,exhaustive:true,effect:{kind:"move",binding:"op09-sanji-discard",to:{player:"self",zone:"trash"}}}]}}}],["OP09-106",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Nico Robin"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:3},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op09-olvia-discard",min:2,max:2,effect:{kind:"move",binding:"op09-olvia-discard",to:{player:"self",zone:"trash"}}}]}}}],["OP09-107",playFromHand2("op09-robin-trigger-play",{color:"Yellow",maxCost:3})],["OP09-109",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Nico Robin"},then:{kind:"play",binding:SOURCE_BINDING}}}],["OP09-110",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP09-111",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"Egghead"},{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:6}]},then:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op09-brook-trigger-discard",min:2,max:2,chooser:"opponent",effect:{kind:"move",binding:"op09-brook-trigger-discard",to:{player:"opponent",zone:"trash"}}}}}],["OP09-116",playFromHand2("op09-miracles-trigger-play",{type:"Revolutionary Army",maxCost:4})]],onKo:[["OP09-052",{opponentEffectOnly:true,program:{effect:{kind:"if",condition:{kind:"turn-player",player:"opponent"},then:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op09-marco-cost",1,{kind:"play",binding:SOURCE_BINDING,rested:true})}}}}],["OP09-015",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Red-Haired Pirates"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:6e3},bind:"op09-roux-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op09-roux-ko"}}}}],["OP09-028",lifeToHandCost({kind:"choose",selector:{player:"self",zone:"trash",category:"character",maxCost:4,anyOf:[{type:"ODYSSEY"},{type:"Straw Hat Crew"}]},bind:"op09-sanji-recur",min:0,max:1,effect:{kind:"play",binding:"op09-sanji-recur",rested:true}})],["OP09-043",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Cross Guild"},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:5,excludeName:"Alvida"},bind:"op09-alvida-play",min:0,max:1,effect:{kind:"play",binding:"op09-alvida-play"}}}}],["OP09-047",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op09-oden-discard",min:1,max:1,effect:{kind:"move",binding:"op09-oden-discard",to:{player:"self",zone:"trash"}}}]}}],["OP09-083",{effect:{kind:"draw",player:"self",count:1}}],["OP09-090",{effect:{kind:"draw",player:"self",count:1}}]],onEndOfYourTurn:[["OP09-029",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"ODYSSEY",maxCost:4,rested:true},bind:"op09-chopper-refresh",min:0,max:1,effect:{kind:"update",binding:"op09-chopper-refresh",rested:false}}}],["OP09-031",{effect:{kind:"if",condition:twoRestedCharacters,then:refreshSelf.effect}}],["OP09-037",{effect:{kind:"if",condition:threeRestedCharacters,then:refreshSelf.effect}}],["OP09-068",{effect:donMinusOrMore(1,{kind:"sequence",effects:[refreshSelf.effect,{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Blocker",expiresAfterTurns:1}]})}]]};var restDressrosaLeaderOrStage=(bind,effect)=>({effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:["stage"],includeLeader:true,type:"Dressrosa",canRest:true},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:bind},effect]}}}});var restOwnLeaderOrStage=(bind,effect)=>({effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:["stage"],includeLeader:true,canRest:true},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:bind},effect]}}}});var lifeEndToHand=(bind,effect)=>({effect:{kind:"optional",effect:{kind:"choice",branches:[{id:"top",label:"Add the top card of your Life cards to your hand",effect:lifeCardToHand("top",bind,effect)},{id:"bottom",label:"Add the bottom card of your Life cards to your hand",effect:lifeCardToHand("bottom",bind,effect)}]}}});var lifeCardToHand=(position,bind,effect)=>({kind:"choose",selector:{player:"self",zone:"life",position},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:bind,to:{player:"self",zone:"hand"}},effect]}});var restSelfAndDressrosaLeaderOrStage=(bind,effect)=>({effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:["stage"],includeLeader:true,type:"Dressrosa",canRest:true},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"rest",binding:bind},effect]}}}});var millTwo={kind:"trash-top",player:"self",count:2};var opponentDiscardsAtFive=(bind,then)=>{const discard={kind:"choose",selector:{player:"opponent",zone:"hand"},chooser:"opponent",bind,min:1,max:1,effect:{kind:"move",binding:bind,to:{player:"owner",zone:"trash"}}};return{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:5},then:then?{kind:"sequence",effects:[discard,then]}:discard}};var trashOpponentLifeTop=bind=>({kind:"select",selector:{player:"opponent",zone:"life",position:"top"},bind,count:1,effect:{kind:"move",binding:bind,to:{player:"owner",zone:"trash"}}});var returnOwnBodyFor=(type,minCost,bind,effect)=>({kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type,minCost},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:bind,to:{player:"owner",zone:"hand"}},effect]}}});var op10BattleMechanics={whenAttacking:[["OP10-002",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:2},then:returnOwnBodyFor("Punk Hazard",2,"op10-caesar-leader-cost",{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:4e3},bind:"op10-caesar-leader-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-caesar-leader-ko"}})}}}],["OP10-010",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",minCurrentPower:6e3},operator:"lte",value:1},then:{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:0}}}],["OP10-045",{oncePerTurn:true,program:{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op10-cavendish-discard",min:1,max:1,effect:{kind:"move",binding:"op10-cavendish-discard",to:{player:"self",zone:"trash"}}}]}}}],["OP10-047",{oncePerTurn:false,program:{effect:returnOwnBodyFor("Revolutionary Army",3,"op10-koala-cost",{kind:"modify-power",binding:SOURCE_BINDING,amount:3e3,expiresAfterTurns:0})}}],["OP10-051",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:lookAndAdd(3,"op10-hack-look",{type:"Revolutionary Army",category:"character"}).effect}}}],["OP10-069",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1},bind:"op10-fighting-fish-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-fighting-fish-ko"}}}]}}}}}}],["OP10-100",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",canRest:true,maxCostFromZoneCount:{player:"either",zone:"life"}},bind:"op10-inazuma-rest",min:0,max:1,effect:{kind:"rest",binding:"op10-inazuma-rest"}}}}}],["OP10-118",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash"},bind:"op10-luffy-cost",min:3,max:3,effect:{kind:"sequence",effects:[{kind:"move",binding:"op10-luffy-cost",to:{player:"self",zone:"deck",position:"bottom"}},opponentDiscardsAtFive("op10-luffy-discard")]}}}}}]],onBlock:[["OP10-077",{oncePerTurn:false,requires:{activeDon:2},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:2},{kind:"add-don",player:"self",count:1,rested:false}]}}}}]],onOpponentAttack:[["OP10-066",{oncePerTurn:true,requires:{activeDon:2},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:2},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4,canRest:true},bind:"op10-giolla-rest",min:0,max:1,effect:{kind:"rest",binding:"op10-giolla-rest"}}]}}}}],["OP10-071",{oncePerTurn:true,requires:{activeDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"add-don",player:"self",count:1,rested:false}]}}}}]],counterEvent:[["OP10-018",{cost:2,power:3e3,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"op10-igloo-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op10-igloo-debuff",amount:-2e3,expiresAfterTurns:0}}}}],["OP10-019",{cost:1,power:3e3,target:{isLeader:true}}],["OP10-040",{cost:5,power:0,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:7},bind:"op10-weak-counter-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-weak-counter-ko"}}}}],["OP10-078",{cost:1,power:0,program:lookAndAdd(3,"op10-forgive-counter-look",{type:"Donquixote Pirates",excludeName:"I Do Not Forgive Those Who Laugh at My Family!!!"})}],["OP10-080",{cost:3,power:4e3,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"field-don",player:"self",operator:"gte",value:7},{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:5}]},then:{kind:"draw",player:"self",count:1}}}}],["OP10-115",{cost:2,power:4e3,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"eq",value:0},then:{kind:"draw",player:"self",count:1}}}}],["OP10-117",{cost:1,power:3e3,powerWhen:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:1},program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:1},then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",rested:true,maxCost:5},bind:"op10-room-active",min:0,max:1,effect:{kind:"update",binding:"op10-room-active",rested:false}}}}}]]};var op10ReplacementMechanics={replacement:[["OP10-034",{opponentEffectOnly:false,battleOnly:true,oncePerTurn:true,label:"Add the top card of your Life cards to your hand",cost:{kind:"life-to-hand",count:1}}],["OP10-074",{opponentEffectOnly:true,oncePerTurn:true,label:"Rest 2 DON!!",cost:{kind:"rest-don",count:2}}],["OP10-118",{opponentEffectOnly:true,oncePerTurn:true,label:"Prevent the K.O.",cost:{kind:"none"},mandatory:true}],["OP10-049",{opponentEffectOnly:true,oncePerTurn:false,removal:"off-field",protects:{category:"character",maxBaseCost:7,excludeName:"Sabo"},label:"Return Sabo to the owner's hand",cost:{kind:"return-self-to-hand"}}]]};var ownLeaderOrCharacter={player:"self",zone:"board",includeLeader:true};var koRestedUpToCost=(cost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:cost},bind,min:0,max:1,effect:{kind:"knock-out",binding:bind}});var op10EventPrograms={"OP10-059":lookAndAdd(5,"op10-follow-look",{type:"Dressrosa",category:"character"}),"OP10-060":{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:6e3},bind:"op10-barrier-bury",min:0,max:1,effect:{kind:"move",binding:"op10-barrier-bury",to:{player:"owner",zone:"deck",position:"bottom"}}}}};var op10MainMechanics={activateMain:[["OP10-114",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"if",condition:{kind:"life-versus",player:"self",operator:"lte"},then:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4,rested:false,canRest:true},bind:"op10-drake-rest",min:0,max:1,effect:{kind:"rest",binding:"op10-drake-rest"}}]}}}}],["OP10-001",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",minCurrentPower:7e3},operator:"gte",value:1},then:{kind:"activate-don",player:"self",count:2}}}}],["OP10-022",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"source-attached-don",operator:"gte",value:1},{kind:"selector-cost-total",player:"self",selector:{zone:"board",category:"character"},operator:"gte",value:5}]},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op10-law-leader-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op10-law-leader-cost",to:{player:"owner",zone:"hand"}},{kind:"select",selector:{player:"self",zone:"life",position:"top"},bind:"op10-law-leader-life",count:1,effect:{kind:"sequence",effects:[{kind:"reveal",binding:"op10-law-leader-life"},{kind:"choose",selector:{player:"self",zone:"life",binding:"op10-law-leader-life",category:"character",type:"Supernovas",maxCost:5},bind:"op10-law-leader-play",min:0,max:1,effect:{kind:"play",binding:"op10-law-leader-play"}}]}}]}}}}}}],["OP10-030",{oncePerTurn:false,requires:{restedDon:1,donActivationAllowed:true},program:{effect:{kind:"sequence",effects:[{kind:"activate-don",player:"self",count:1},{kind:"restrict-player",player:"self",restriction:"cannot-activate-don-by-character",expiresAfterTurns:0}]}}}],["OP10-016",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"give-rested-don",player:"self",count:2},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op10-monet-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op10-monet-debuff",amount:-1e3,expiresAfterTurns:0}}]}}}}],["OP10-021",{oncePerTurn:false,requires:{sourceActive:true,restedDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Caesar Clown"},then:{kind:"give-rested-don",player:"self",count:1}}]}}}}],["OP10-026",{oncePerTurn:false,requires:{handCardsMatching:{match:{name:"Kin'emon",minBaseCost:6,maxBaseCost:6},count:1}},program:kinemonAssembly(0,"op10-kinemon-026")}],["OP10-027",{oncePerTurn:false,requires:{handCardsMatching:{match:{name:"Kin'emon",minBaseCost:6,maxBaseCost:6},count:1}},program:kinemonAssembly(1e3,"op10-kinemon-027")}],["OP10-028",{oncePerTurn:false,requires:{activeDon:2},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:2},{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},lookAndAdd(5,"op10-momonosuke-look",{type:"The Akazaya Nine"},2).effect]}}}}],["OP10-075",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"if",condition:{kind:"field-don-versus",player:"self",operator:"lte"},then:{kind:"draw",player:"self",count:1}}]}}}}],["OP10-082",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Blackbeard Pirates",maxCost:5,excludeName:"Kuzan"},bind:"op10-kuzan-recur",min:0,max:1,effect:{kind:"play",binding:"op10-kuzan-recur"}}]}}}}],["OP10-083",{oncePerTurn:false,requires:{sourceActive:true},program:restSelfAndDressrosaLeaderOrStage("op10-momo-cost",{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op10-momo-target",min:0,max:1,effect:{kind:"modify-cost",binding:"op10-momo-target",amount:-2,expiresAfterTurns:0}})}],["OP10-086",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"Blackbeard Pirates"},{kind:"source-played-this-turn"}]},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:3},bind:"op10-shiryu-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-shiryu-ko"}}}}}],["OP10-087",{oncePerTurn:false,requires:{sourceActive:true},program:restSelfAndDressrosaLeaderOrStage("op10-chopper-cost",opponentDiscardsAtFive("op10-chopper-discard",millTwo))}],["OP10-088",{oncePerTurn:false,requires:{sourceActive:true},program:restSelfAndDressrosaLeaderOrStage("op10-nami-cost",{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},millTwo]})}],["OP10-091",{oncePerTurn:false,requires:{sourceActive:true},program:restSelfAndDressrosaLeaderOrStage("op10-brook-cost",{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1},bind:"op10-brook-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-brook-ko"}},millTwo]})}],["OP10-092",{oncePerTurn:true,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash",type:"Thriller Bark Pirates"},bind:"op10-perona-cost",min:2,max:2,effect:{kind:"sequence",effects:[{kind:"move",binding:"op10-perona-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"choose",selector:{player:"self",zone:"board",category:"character",excludeName:"Perona"},bind:"op10-perona-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op10-perona-buff",amount:2e3,expiresAfterTurns:0}}]}}}}}],["OP10-093",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"self",zone:"board",category:"character",color:"Black"},bind:"op10-homing-target",min:0,max:1,effect:{kind:"modify-cost",binding:"op10-homing-target",amount:3,expiresAfterTurns:1}}]}}}}],["OP10-102",{oncePerTurn:true,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Revolutionary Army"},bind:"op10-ivankov-buff",min:0,max:3,effect:{kind:"modify-power",binding:"op10-ivankov-buff",amount:1e3,expiresAfterTurns:0}},{kind:"select",selector:{player:"self",zone:"life",position:"top"},bind:"op10-ivankov-life",count:1,effect:{kind:"move",binding:"op10-ivankov-life",to:{player:"self",zone:"hand"}}}]}}}]],eventMain:[["OP10-019",{cost:1,restDon:5,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:8e3},bind:"op10-divine-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-divine-ko"}}}}],["OP10-020",{cost:2,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op10-ufo-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op10-ufo-debuff",amount:-4e3,expiresAfterTurns:0}},{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:{kind:"choose",selector:ownLeaderOrCharacter,bind:"op10-ufo-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op10-ufo-buff",amount:1e3,expiresAfterTurns:0}}}]}}}],["OP10-039",{cost:3,program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"ODYSSEY"},then:lookAndAdd(5,"op10-twister-look",{type:"ODYSSEY",category:"character"},2).effect}}}],["OP10-040",{cost:5,program:{effect:koRestedUpToCost(7,"op10-weak-ko")}}],["OP10-041",{cost:4,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6,canRest:true},bind:"op10-radio-rest",min:0,max:1,effect:{kind:"rest",binding:"op10-radio-rest"}},koRestedUpToCost(5,"op10-radio-ko")]}}}],["OP10-059",{cost:1,program:op10EventPrograms["OP10-059"]}],["OP10-060",{cost:5,program:op10EventPrograms["OP10-060"]}],["OP10-061",{cost:3,program:{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"op10-bagworm-bounce",min:0,max:1,effect:{kind:"move",binding:"op10-bagworm-bounce",to:{player:"owner",zone:"hand"}}}]}}}],["OP10-078",{cost:1,program:lookAndAdd(3,"op10-forgive-look",{type:"Donquixote Pirates",excludeName:"I Do Not Forgive Those Who Laugh at My Family!!!"})}],["OP10-079",{cost:5,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"op10-god-thread-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-god-thread-ko"}},{kind:"add-don",player:"self",count:1,rested:false}]}}}],["OP10-096",{cost:4,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",type:"The Seven Warlords of the Sea",maxCost:8},bind:"op10-warlords-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-warlords-ko"}}}}],["OP10-097",{cost:1,program:{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Dressrosa"},bind:"op10-rhino-target",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"modify-power",binding:"op10-rhino-target",amount:2e3,expiresAfterTurns:0},{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:10},then:{kind:"grant-keyword",binding:"op10-rhino-target",keyword:"Banish",expiresAfterTurns:0}}]}}}}],["OP10-116",{cost:4,program:{effect:{kind:"sequence",effects:[{kind:"choice",branches:[{id:"own-life",label:"Look at the top card of your Life cards",effect:peekLife("self","op10-damned-own")},{id:"opponent-life",label:"Look at the top card of your opponent's Life cards",effect:peekLife("opponent","op10-damned-theirs")}]},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"op10-damned-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-damned-ko"}}]}}}],["OP10-098",{cost:6,program:{effect:{kind:"if",condition:{kind:"character-count-versus",player:"self",operator:"lt",by:2},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:6},bind:"op10-liberation-ko-six",min:0,max:1,effect:{kind:"knock-out",binding:"op10-liberation-ko-six"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:4},bind:"op10-liberation-ko-four",min:0,max:1,effect:{kind:"knock-out",binding:"op10-liberation-ko-four"}}]}}}}]]};function kinemonAssembly(trashPower,bind){return{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash",name:"Kin'emon",minPower:trashPower,maxPower:trashPower},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"deck",position:"bottom"}},{kind:"move",binding:bind,to:{player:"self",zone:"deck",position:"bottom"}},{kind:"choose",selector:{player:"self",zone:"hand",name:"Kin'emon",minBaseCost:6,maxBaseCost:6},bind:`${bind}-play`,min:0,max:1,effect:{kind:"play",binding:`${bind}-play`}}]}}}}}var drawTwoTrashOne2=bind=>({kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind,min:1,max:1,effect:{kind:"move",binding:bind,to:{player:"self",zone:"trash"}}}]});var restOpponentUpToCost=(cost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:cost,canRest:true},bind,min:0,max:1,effect:{kind:"rest",binding:bind}});var op10TriggerMechanics={onKo:[["OP10-035",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true,maxCost:5,canRest:true},bind:"op10-brook-ko-rest",min:0,max:1,effect:{kind:"rest",binding:"op10-brook-ko-rest"}}}],["OP10-055",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"op10-marco-bounce",min:0,max:1,effect:{kind:"move",binding:"op10-marco-bounce",to:{player:"owner",zone:"hand"}}}}],["OP10-062",{effect:donMinus(1,{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Donquixote Pirates"},then:{kind:"choose",selector:{player:"self",zone:"trash",category:"event",color:"Purple"},bind:"op10-violet-recur",min:0,max:1,effect:{kind:"move",binding:"op10-violet-recur",to:{player:"self",zone:"hand"}}}})}],["OP10-090",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Dressrosa",maxCost:3,excludeSource:true},bind:"op10-franky-recur",min:0,max:1,effect:{kind:"play",binding:"op10-franky-recur",rested:true}}}],["OP10-106",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Supernovas"},then:lookAndAdd(3,"op10-killer-look",{anyOf:[{type:"Supernovas"},{type:"Kid Pirates"}]}).effect}}]],onEndOfYourTurn:[["OP10-003",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"Donquixote Pirates",minCurrentPower:6e3},operator:"gte",value:1},then:{kind:"activate-don",player:"self",count:1}}}],["OP10-037",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"ODYSSEY",rested:true},bind:"op10-lim-active",min:0,max:1,effect:{kind:"update",binding:"op10-lim-active",rested:false}}}],["OP10-072",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:7},then:{kind:"activate-don",player:"self",count:2}}}],["OP10-112",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:2},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op10-kid-end-discard",min:1,max:1,effect:{kind:"move",binding:"op10-kid-end-discard",to:{player:"self",zone:"trash"}}}]}}}]],trigger:[["OP10-018",{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"op10-igloo-trigger",min:0,max:1,effect:{kind:"modify-power",binding:"op10-igloo-trigger",amount:1e3,expiresAfterTurns:0}}}],["OP10-020",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:3e3},bind:"op10-ufo-trigger-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-ufo-trigger-ko"}}}],["OP10-039",{effect:restOpponentUpToCost(5,"op10-twister-trigger-rest")}],["OP10-041",{effect:restOpponentUpToCost(4,"op10-radio-trigger-rest")}],["OP10-059",op10EventPrograms["OP10-059"]],["OP10-060",op10EventPrograms["OP10-060"]],["OP10-061",{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:2},bind:"op10-bagworm-trigger",min:0,max:1,effect:{kind:"move",binding:"op10-bagworm-trigger",to:{player:"owner",zone:"hand"}}}}],["OP10-079",{effect:{kind:"add-don",player:"self",count:1,rested:false}}],["OP10-080",{effect:{kind:"add-don",player:"self",count:1,rested:false}}],["OP10-096",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",type:"The Seven Warlords of the Sea",maxCost:4},bind:"op10-warlords-trigger-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-warlords-trigger-ko"}}}],["OP10-097",{effect:drawTwoTrashOne2("op10-rhino-trigger-discard")}],["OP10-098",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:[],includeLeader:true},bind:"op10-liberation-negate-leader",min:0,max:1,effect:{kind:"negate",binding:"op10-liberation-negate-leader",expiresAfterTurns:0}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op10-liberation-negate-character",min:0,max:1,effect:{kind:"negate",binding:"op10-liberation-negate-character",expiresAfterTurns:0}}]}}],["OP10-100",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"Revolutionary Army"},{kind:"combined-life",operator:"lte",value:5}]},then:{kind:"play",binding:SOURCE_BINDING}}}],["OP10-110",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:{kind:"play",binding:SOURCE_BINDING}}}],["OP10-113",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op10-zoro-trigger-cost",1,{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Supernovas"},then:{kind:"play",binding:SOURCE_BINDING}})}}],["OP10-115",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCostFromZoneCount:{player:"opponent",zone:"life"}},bind:"op10-meet-again-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-meet-again-ko"}}}],["OP10-116",{effect:drawTwoTrashOne2("op10-damned-trigger-discard")}],["OP10-117",{effect:{kind:"draw",player:"self",count:1}}]]};var twoRestedCharacters2={kind:"selector-count",player:"self",selector:{zone:"board",category:"character",rested:true},operator:"gte",value:2};var op10OnPlayMechanics={onPlay:[["OP10-004",lookAndAdd(5,"op10-vergo-look",{type:"Punk Hazard",excludeName:"Vergo"})],["OP10-006",{effect:{kind:"sequence",effects:[lookAndAdd(5,"op10-caesar-look",{name:"Smiley"}).effect,{kind:"choose",selector:{player:"self",zone:"hand",name:"Smiley"},bind:"op10-caesar-play",min:0,max:1,effect:{kind:"play",binding:"op10-caesar-play"}}]}}],["OP10-007",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Punk Hazard",maxCost:2},bind:"op10-soldier-play",min:0,max:1,effect:{kind:"play",binding:"op10-soldier-play"}}}],["OP10-008",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",name:"Rock"},operator:"eq",value:0},then:{kind:"choose",selector:{player:"self",zone:"hand",name:"Rock"},bind:"op10-scotch-play",min:0,max:1,effect:{kind:"play",binding:"op10-scotch-play"}}}}],["OP10-017",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",name:"Scotch"},operator:"eq",value:0},then:{kind:"choose",selector:{player:"self",zone:"hand",name:"Scotch"},bind:"op10-rock-play",min:0,max:1,effect:{kind:"play",binding:"op10-rock-play"}}}}],["OP10-009",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Punk Hazard"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op10-smiley-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op10-smiley-debuff",amount:-3e3,expiresAfterTurns:0}}}}],["OP10-015",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op10-mocha-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op10-mocha-debuff",amount:-1e3,expiresAfterTurns:0}}}],["OP10-023",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Navy"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5,canRest:true},bind:"op10-issho-rest",min:0,max:2,effect:{kind:"rest",binding:"op10-issho-rest"}}}}],["OP10-024",{effect:{kind:"if",condition:twoRestedCharacters2,then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5,canRest:true},bind:"op10-newgate-rest",min:0,max:1,effect:{kind:"rest",binding:"op10-newgate-rest"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:3},bind:"op10-newgate-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-newgate-ko"}}]}}}],["OP10-025",{effect:{kind:"if",condition:twoRestedCharacters2,then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:3},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op10-enel-discard",min:2,max:2,effect:{kind:"move",binding:"op10-enel-discard",to:{player:"self",zone:"trash"}}}]}}}],["OP10-029",{effect:{kind:"if",condition:twoRestedCharacters2,then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"ODYSSEY",rested:true,maxCost:5},bind:"op10-mihawk-active",min:0,max:1,effect:{kind:"update",binding:"op10-mihawk-active",rested:false}}}}],["OP10-033",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"ODYSSEY",rested:true},operator:"gte",value:2},then:{kind:"hold-don-from-refresh",player:"opponent",count:1}}}],["OP10-043",restDressrosaLeaderOrStage("op10-moocy-cost",{kind:"choose",selector:{player:"self",zone:"board",category:"character",name:"Monkey.D.Luffy"},bind:"op10-moocy-banish",min:0,max:1,effect:{kind:"grant-keyword",binding:"op10-moocy-banish",keyword:"Banish",expiresAfterTurns:0}})],["OP10-070",{effect:{kind:"select",selector:{player:"self",zone:"board",category:"character",maxPower:1e3},bind:"op10-trebol-protected",count:"all",effect:{kind:"restrict",binding:"op10-trebol-protected",restriction:"ko-immune",expiresAfterTurns:1}}}],["OP10-044",restDressrosaLeaderOrStage("op10-cub-cost",{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1},bind:"op10-cub-bounce",min:0,max:1,effect:{kind:"move",binding:"op10-cub-bounce",to:{player:"owner",zone:"hand"}}})],["OP10-048",restDressrosaLeaderOrStage("op10-sai-cost",{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1},bind:"op10-sai-bounce",min:0,max:1,effect:{kind:"move",binding:"op10-sai-bounce",to:{player:"owner",zone:"hand"}}})],["OP10-046",{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:5},bind:"op10-kyros-bounce",min:0,max:1,effect:{kind:"move",binding:"op10-kyros-bounce",to:{player:"owner",zone:"hand"}}}}],["OP10-052",{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:1},bind:"op10-bartolomeo-bury",min:0,max:1,effect:{kind:"move",binding:"op10-bartolomeo-bury",to:{player:"owner",zone:"deck",position:"bottom"}}}}],["OP10-056",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"Dressrosa",minCost:4},operator:"gte",value:1},then:restDressrosaLeaderOrStage("op10-mansherry-rest",{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Dressrosa",minCost:4},bind:"op10-mansherry-return",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op10-mansherry-return",to:{player:"owner",zone:"hand"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"op10-mansherry-bounce",min:0,max:1,effect:{kind:"move",binding:"op10-mansherry-bounce",to:{player:"owner",zone:"hand"}}}]}}).effect}}],["OP10-057",restOwnLeaderOrStage("op10-leo-cost",{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Usopp"},then:{kind:"sequence",effects:[lookAndAdd(5,"op10-leo-look",{type:"Dressrosa",excludeName:"Leo"},2).effect,{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op10-leo-discard",min:1,max:1,effect:{kind:"move",binding:"op10-leo-discard",to:{player:"self",zone:"trash"}}}]}})],["OP10-058",{effect:{kind:"if",condition:{kind:"selector-count",player:"either",selector:{zone:"board",category:"character",minCost:8},operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Dressrosa",maxCost:7,excludeName:"Rebecca"},bind:"op10-rebecca-revealed",min:0,max:2,effect:{kind:"sequence",effects:[{kind:"reveal",binding:"op10-rebecca-revealed"},{kind:"choose",selector:{player:"self",zone:"hand",binding:"op10-rebecca-revealed"},bind:"op10-rebecca-play",min:1,max:1,effect:{kind:"play",binding:"op10-rebecca-play"}},{kind:"select",selector:{player:"self",zone:"hand",binding:"op10-rebecca-revealed",maxCost:4},bind:"op10-rebecca-other",count:1,effect:{kind:"play",binding:"op10-rebecca-other",rested:true}}]}}]}}}],["OP10-063",{effect:{kind:"if",condition:{kind:"leader-type-including",player:"self",text:"GERMA"},then:lookAndAdd(5,"op10-sanji-look",{typeIncluding:"GERMA"}).effect}}],["OP10-071",{effect:donMinus(1,{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Donquixote Pirates",maxCost:5},bind:"op10-doflamingo-play",min:0,max:1,effect:{kind:"play",binding:"op10-doflamingo-play"}})}],["OP10-072",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",category:"event"},"op10-rosinante-cost",1,{kind:"draw",player:"self",count:2})}}],["OP10-076",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op10-baby5-cost",1,{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Donquixote Pirates"},then:{kind:"add-don",player:"self",count:1,rested:false}})}}],["OP10-081",restDressrosaLeaderOrStage("op10-usopp-cost",{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"op10-usopp-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-usopp-ko"}},{kind:"trash-top",player:"self",count:2}]})],["OP10-095",restDressrosaLeaderOrStage("op10-zoro-cost",{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"op10-zoro-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op10-zoro-ko"}},{kind:"trash-top",player:"self",count:2}]})],["OP10-107",lifeEndToHand("op10-bonney-cost",{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Supernovas",minBaseCost:5,maxBaseCost:5},bind:"op10-bonney-bank",min:0,max:1,effect:{kind:"move",binding:"op10-bonney-bank",to:{player:"self",zone:"life",position:"top"},faceUp:true}})],["OP10-110",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",canRest:true,maxCostFromZoneCount:{player:"opponent",zone:"life"}},bind:"op10-heat-wire-rest",min:0,max:1,effect:{kind:"rest",binding:"op10-heat-wire-rest"}}}],["OP10-112",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},trashOpponentLifeTop("op10-kid-life")]}}}],["OP10-119",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Supernovas"},bind:"op10-law-bank",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"reveal",binding:"op10-law-bank"},{kind:"move",binding:"op10-law-bank",to:{player:"self",zone:"life",position:"top"}}]}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Supernovas"},then:{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"}}]}}]]};var turnLifeFaceDown=(bind,effect)=>({effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top",faceUp:true},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:bind,faceUp:false},effect]}}}});var turnLifeFaceUp=(bind,effect)=>({effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top",faceUp:false},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:bind,faceUp:true},effect]}}}});var grantAttackActive=(bind,options={})=>({kind:"choose",selector:{player:"self",zone:"board",...options.includeLeader?{includeLeader:true}:{},...options.type===void 0?{}:{type:options.type}},bind,min:0,max:1,effect:{kind:"grant-attack-active",binding:bind,expiresAfterTurns:0}});var placeAtTopOrBottom=(binding,bind)=>({kind:"select",selector:{player:"self",zone:"deck",binding},bind,count:"all",effect:{kind:"order-to-bottom",binding:bind,to:{player:"self",zone:"deck",position:"top"},alternate:{player:"self",zone:"deck",position:"bottom"}}});var opponentPlacesAtBottom=(selector,count2,bind)=>{const place=size=>({kind:"choose",selector:{player:"opponent",...selector},chooser:"opponent",bind,min:size,max:size,effect:{kind:"move",binding:bind,to:{player:"owner",zone:"deck",position:"bottom"}}});let effect=place(1);for(let size=2;size<=count2;size+=1){effect={kind:"if",condition:{kind:"selector-count",player:"opponent",selector,operator:"gte",value:size},then:place(size),else:effect}}return effect};var ownLeaderOrCharacterBuff=(amount,bind,expiresAfterTurns=0)=>({kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind,min:0,max:1,effect:{kind:"modify-power",binding:bind,amount,expiresAfterTurns}});var bigBodyRider=bind=>({kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",minCurrentPower:6e3},operator:"gte",value:1},then:ownLeaderOrCharacterBuff(1e3,bind)});var op11BattleMechanics={whenAttacking:[["OP11-006",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",attribute:"Special"},bind:"op11-zephyr-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op11-zephyr-debuff",amount:-5e3,expiresAfterTurns:0}}}}}],["OP11-010",{oncePerTurn:false,program:{effect:{kind:"sequence",effects:[{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:0},{kind:"choose",selector:{player:"self",zone:[],includeLeader:true,type:"Navy"},bind:"op11-hibari-leader",min:0,max:1,effect:{kind:"grant-attack-active",binding:"op11-hibari-leader",expiresAfterTurns:0}}]}}}],["OP11-013",{oncePerTurn:false,program:{effect:{kind:"select",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:2e3},bind:"op11-grus-lock",count:"all",effect:{kind:"restrict",binding:"op11-grus-lock",restriction:"cannot-block",expiresAfterTurns:0}}}}],["OP11-050",{oncePerTurn:false,program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",type:"Firetank Pirates"},"op11-gotti-cost",1,{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:1},bind:"op11-gotti-target",min:0,max:1,effect:{kind:"choice",branches:[{id:"hand",label:"Bounce it to hand",effect:{kind:"move",binding:"op11-gotti-target",to:{player:"owner",zone:"hand"}}},{id:"deck",label:"Bottom-deck it",effect:{kind:"move",binding:"op11-gotti-target",to:{player:"owner",zone:"deck",position:"bottom"}}}]}})}}}],["OP11-084",{oncePerTurn:false,program:{effect:grantAttackActive("op11-kuzan-target",{type:"Navy",includeLeader:true})}}],["OP11-118",{oncePerTurn:false,program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op11-luffy-cost",1,{kind:"sequence",effects:[{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:4},bind:"op11-luffy-bounce",min:0,max:1,effect:{kind:"move",binding:"op11-luffy-bounce",to:{player:"owner",zone:"hand"}}},{kind:"give-rested-don",player:"self",count:1}]})}}}],["OP11-119",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash"},bind:"op11-koby-cost",min:2,max:2,effect:{kind:"sequence",effects:[{kind:"move",binding:"op11-koby-cost",to:{player:"self",zone:"deck",position:"bottom"}},ownLeaderOrCharacterBuff(1e3,"op11-koby-buff",1)]}}}}}]],onOpponentAttack:[["OP11-025",{oncePerTurn:true,requires:{activeDon:1,sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"rest",binding:SOURCE_BINDING},{kind:"battle-power",player:"self",amount:1e3}]}}}}],["OP11-043",{oncePerTurn:true,requires:{everyCharacterMatches:{zone:"board",typeIncluding:"GERMA"}},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"battle-power",player:"self",amount:1e3},{kind:"trash-top",player:"self",count:2}]}}}}],["OP11-049",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"battle-power",player:"self",amount:1e3,target:{isLeader:true}}]}}}}],["OP11-073",{oncePerTurn:true,requires:{fieldDon:5},program:{effect:donMinus(5,guessDeckTopCost({kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"op11-linlin-leader",count:"all",effect:{kind:"modify-power",binding:"op11-linlin-leader",amount:2e3,expiresAfterTurns:0}}))}}],["OP11-088",{oncePerTurn:true,requires:{battleAttacker:{filter:{isLeader:false},attribute:"Slash"}},program:{effect:{kind:"optional",effect:{kind:"battle-power",player:"self",amount:5e3}}}}]],counterEvent:[["OP11-019",{cost:2,power:2e3,program:{effect:bigBodyRider("op11-glorp-rider")}}],["OP11-020",{cost:2,power:2e3,program:{effect:bigBodyRider("op11-calibur-rider")}}],["OP11-038",{cost:1,power:3e3,target:{isLeader:true}}],["OP11-039",{cost:1,power:3e3,target:{anyOfTypes:["Fish-Man","Merfolk"]},program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:3,canRest:true},bind:"op11-vagabond-rest",min:0,max:1,effect:{kind:"rest",binding:"op11-vagabond-rest"}}}}],["OP11-059",{cost:1,power:2e3,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:4},then:{kind:"battle-power",player:"self",amount:2e3}}}}],["OP11-080",{cost:1,power:3e3,target:{isLeader:true}}],["OP11-097",{cost:1,power:1e3,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:10},then:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",color:"Black",maxCost:3},bind:"op11-edge-recur",min:0,max:1,effect:{kind:"move",binding:"op11-edge-recur",to:{player:"self",zone:"hand"}}}}}}],["OP11-114",{cost:1,power:3e3,target:{isLeader:true}}],["OP11-115",{cost:1,power:4e3,powerWhen:{kind:"leader-has-name",player:"self",name:"Shirahoshi"}}]]};var op11ReplacementMechanics={replacement:[["OP11-110",{opponentEffectOnly:false,oncePerTurn:false,label:"Rest your Fish-Man Island or your Shirahoshi Leader",cost:{kind:"rest-own-cards",count:1,match:{anyOf:[{name:"Fish-Man Island"},{name:"Shirahoshi"}]},zones:["stage"],includeLeader:true}}]]};var fishManOrMerfolkLeader={kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"Fish-Man"},{kind:"leader-has-type",player:"self",type:"Merfolk"}]};var shirahoshiLeader={kind:"leader-has-name",player:"self",name:"Shirahoshi"};var op11EventPrograms={"OP11-060":{effect:{kind:"if",condition:{kind:"leader-multicolored",player:"self"},then:lookAndAdd(5,"op11-wedding-look",{type:"Straw Hat Crew",excludeName:"Let's Crash This Wedding!!!"}).effect}},"OP11-099":lookAndAddOrTrash(3,"op11-officer-look",{type:"Navy",excludeName:"I'm Gonna Be a Navy Officer!!!"})};var op11MainMechanics={activateMain:[["OP11-066",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},guessDeckTopCost({kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:3},bind:"op11-oven-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op11-oven-ko"}},{kind:"add-don",player:"self",count:1,rested:true}]})]}}}}],["OP11-071",{oncePerTurn:true,requires:{handCards:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op11-perospero-cost",1,guessDeckTopCost({kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"add-don",player:"self",count:1,rested:false}]}))}}}],["OP11-004",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op11-kujyaku-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op11-kujyaku-buff",amount:1e3,expiresAfterTurns:0}}]}}}}],["OP11-007",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Navy"},then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Navy"},bind:"op11-tashigi-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op11-tashigi-buff",amount:2e3,expiresAfterTurns:0}}}]}}}}],["OP11-014",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},grantAttackActive("op11-borsalino-target",{type:"Navy",includeLeader:true})]}}}}],["OP11-016",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"give-rested-don",player:"self",count:1}}}],["OP11-022",{oncePerTurn:true,requires:{activeDon:1,lifeCardsMatching:{match:{position:"top",faceUp:false},count:1}},program:turnLifeFaceUp("op11-shirahoshi-cost",{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",anyOf:[{type:"Neptunian"},{name:"Megalo"}],maxCostFromFieldDon:"self"},bind:"op11-shirahoshi-play",min:0,max:1,effect:{kind:"play",binding:"op11-shirahoshi-play"}}]})}],["OP11-030",{oncePerTurn:false,requires:{sourceActive:true,activeDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"rest",binding:SOURCE_BINDING},lookAndAdd(5,"op11-shirahoshi-look",{anyOf:[{type:"Neptunian"},{type:"Fish-Man Island"}]}).effect]}}}}],["OP11-031",{oncePerTurn:true,program:{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",anyOf:[{type:"Fish-Man"},{type:"Merfolk"}]},bind:"op11-jinbe-rush",min:0,max:1,effect:{kind:"grant-keyword",binding:"op11-jinbe-rush",keyword:"Rush: Character",expiresAfterTurns:0}}}}],["OP11-034",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:fishManOrMerfolkLeader,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:3},bind:"op11-hatchan-lock",min:0,max:1,effect:{kind:"restrict",binding:"op11-hatchan-lock",restriction:"cannot-rest",expiresAfterTurns:1}}}]}}}}],["OP11-044",{oncePerTurn:true,requires:{handCards:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op11-judge-cost",1,{kind:"select",selector:{player:"self",zone:"board",category:"character",type:"GERMA 66"},bind:"op11-judge-buff",count:"all",effect:{kind:"modify-power",binding:"op11-judge-buff",amount:1e3,expiresAfterTurns:0}})}}}],["OP11-070",{oncePerTurn:false,requires:{sourceActive:true,fieldDon:1},program:{effect:donMinus(1,{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"look-at",player:"opponent",count:1,bind:"op11-pudding-peek"}]})}}],["OP11-072",{oncePerTurn:true,requires:{sourceActive:true,fieldDon:1},program:{effect:donMinus(1,{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},opponentPlacesAtBottom({zone:"trash"},2,"op11-montdor-bury"),{kind:"select",selector:{player:"self",zone:"life",position:"top"},bind:"op11-montdor-life",count:1,effect:{kind:"move",binding:"op11-montdor-life",to:{player:"self",zone:"hand"}}}]})}}],["OP11-074",{oncePerTurn:true,requires:{sourceActive:true,fieldDon:1},program:{effect:donMinus(1,{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},guessDeckTopCost({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4,canRest:true},bind:"op11-streusen-rest",min:0,max:1,effect:{kind:"rest",binding:"op11-streusen-rest"}})]})}}],["OP11-082",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Navy"},then:grantAttackActive("op11-aramaki-target",{type:"Navy"})},{kind:"trash-top",player:"self",count:2}]}}}}],["OP11-086",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"self",zone:"trash",name:"Caribou",maxCost:4},bind:"op11-coribou-play",min:0,max:1,effect:{kind:"play",binding:"op11-coribou-play"}}]}}}}],["OP11-103",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"if",condition:shirahoshiLeader,then:turnLifeFaceDown("op11-longjaw-cost",{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:3},bind:"op11-longjaw-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op11-longjaw-ko"}}]}).effect}}}],["OP11-107",{oncePerTurn:true,program:{effect:{kind:"if",condition:shirahoshiLeader,then:turnLifeFaceDown("op11-topknot-cost",{kind:"at-end-of-turn",binding:SOURCE_BINDING,action:"set-active"}).effect}}}],["OP11-117",{oncePerTurn:true,program:{effect:{kind:"if",condition:shirahoshiLeader,then:turnLifeFaceUp("op11-island-cost",{kind:"choose",selector:{player:"self",zone:"board",category:"character",anyOf:[{type:"Neptunian"},{type:"Fish-Man"},{type:"Merfolk"}]},bind:"op11-island-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op11-island-buff",amount:1e3,expiresAfterTurns:0}}).effect}}}]],eventMain:[["OP11-081",{cost:6,program:{effect:guessDeckTopCost({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:8},bind:"op11-cognac-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op11-cognac-ko"}})}}],["OP11-061",{cost:3,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:4},bind:"op11-culverin",min:0,max:1,effect:{kind:"move",binding:"op11-culverin",to:{player:"owner",zone:"deck",position:"bottom"}}}}}],["OP11-018",{cost:6,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op11-honesty-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op11-honesty-debuff",amount:-4e3,expiresAfterTurns:0}},koCurrentPowerAtMost(6e3,"op11-honesty-ko")]}}}],["OP11-037",{cost:1,program:lookAndAdd(4,"op11-poseidon-look",{category:"character",anyOf:[{type:"Neptunian"},{type:"Fish-Man Island"}]})}],["OP11-038",{cost:1,restDon:1,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5,canRest:true},bind:"op11-gatling-rest",min:0,max:1,effect:{kind:"rest",binding:"op11-gatling-rest"}}}}],["OP11-060",{cost:1,program:op11EventPrograms["OP11-060"]}],["OP11-080",{cost:1,restDon:2,program:{effect:{kind:"if",condition:{kind:"leader-has-color",player:"self",color:"Blue"},then:{kind:"add-don",player:"self",count:1,rested:true}}}}],["OP11-098",{cost:3,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"trash-top",player:"self",count:3},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"op11-blue-hole-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op11-blue-hole-ko"}}]}}}}],["OP11-099",{cost:1,program:op11EventPrograms["OP11-099"]}],["OP11-114",{cost:1,restDon:3,program:{effect:{kind:"if",condition:{kind:"combined-life",operator:"gte",value:5},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:5},bind:"op11-red-hawk-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op11-red-hawk-ko"}}}}}],["OP11-116",{cost:6,program:{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:6},bind:"op11-ultramarine",min:0,max:1,effect:{kind:"choice",branches:[{id:"top",label:"Add it to the top of the owner's Life cards",effect:{kind:"move",binding:"op11-ultramarine",to:{player:"owner",zone:"life",position:"top"},faceUp:true}},{id:"bottom",label:"Add it to the bottom of the owner's Life cards",effect:{kind:"move",binding:"op11-ultramarine",to:{player:"owner",zone:"life",position:"bottom"},faceUp:true}}]}}}}]]};function koCurrentPowerAtMost(power,bind){return{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:power},bind,min:0,max:1,effect:{kind:"knock-out",binding:bind}}}var restOpponentUpToCost2=(cost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:cost,canRest:true},bind,min:0,max:1,effect:{kind:"rest",binding:bind}});var fishManOrMerfolkLeader2={kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"Fish-Man"},{kind:"leader-has-type",player:"self",type:"Merfolk"}]};var op11OnPlayMechanics={onPlay:[["OP11-002",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op11-ain-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op11-ain-debuff",amount:-1e3,expiresAfterTurns:0}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:0},bind:"op11-ain-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op11-ain-ko"}}]}}],["OP11-004",lookAndAdd(5,"op11-kujyaku-look",{type:"Navy",excludeName:"Kujyaku"})],["OP11-008",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op11-doll-cost",1,{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Navy"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op11-doll-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op11-doll-debuff",amount:-6e3,expiresAfterTurns:0}}})}}],["OP11-010",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op11-hibari-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op11-hibari-debuff",amount:-2e3,expiresAfterTurns:0}}}],["OP11-028",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true},bind:"op11-lord-lock",min:0,max:1,effect:{kind:"restrict",binding:"op11-lord-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}}],["OP11-029",{effect:restOpponentUpToCost2(1,"op11-praline-rest")}],["OP11-031",{effect:{kind:"if",condition:fishManOrMerfolkLeader2,then:restOpponentUpToCost2(5,"op11-jinbe-rest")}}],["OP11-035",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",canRest:true},bind:"op11-tiger-rest",min:0,max:1,effect:{kind:"rest",binding:"op11-tiger-rest"}}}],["OP11-036",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Shirahoshi"},then:lookAndAdd(5,"op11-spotted-look",{anyOf:[{type:"Neptunian"},{name:"Shirahoshi"}]}).effect}}],["OP11-042",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",type:"Firetank Pirates"},"op11-vito-cost",1,{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0})}}],["OP11-047",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"The Vinsmoke Family"},then:lookAndAddOrTrash(5,"op11-reiju-look",{typeIncluding:"GERMA"}).effect}}],["OP11-048",lookAndAdd(4,"op11-bege-look",{anyOf:[{type:"Firetank Pirates"},{type:"Straw Hat Crew"}],minCost:2})],["OP11-049",{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:3,bind:"op11-carrot"},placeAtTopOrBottom("op11-carrot","op11-carrot-place")]}}],["OP11-051",{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxPower:5e3},bind:"op11-sanji-bounce",min:0,max:1,effect:{kind:"move",binding:"op11-sanji-bounce",to:{player:"owner",zone:"hand"}}}}],["OP11-054",{effect:{kind:"if",condition:{kind:"leader-multicolored",player:"self"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:3},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op11-nami-back",min:2,max:2,effect:{kind:"order-to-bottom",binding:"op11-nami-back",to:{player:"self",zone:"deck",position:"top"},alternate:{player:"self",zone:"deck",position:"bottom"}}}]}}}],["OP11-056",{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",minBaseCost:1,maxBaseCost:1},bind:"op11-brook-bury",min:0,max:1,effect:{kind:"move",binding:"op11-brook-bury",to:{player:"owner",zone:"deck",position:"bottom"}}}}],["OP11-063",{effect:donMinus(1,{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Impel Down"},then:restOpponentUpToCost2(3,"op11-sadi-rest")})}],["OP11-069",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top"},bind:"op11-brulee-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op11-brulee-cost",to:{player:"self",zone:"hand"}},paidToHand("op11-brulee-cost",[{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Big Mom Pirates"},then:{kind:"add-don",player:"self",count:1,rested:false}}])]}}}}],["OP11-070",lookAndAdd(5,"op11-pudding-look",{type:"Big Mom Pirates",minCost:2})],["OP11-075",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-name",player:"self",name:"Nico Robin"},{kind:"field-don",player:"self",operator:"gte",value:7}]},then:{kind:"draw",player:"self",count:2}}}],["OP11-076",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Impel Down"},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Impel Down",maxCost:3},bind:"op11-hannyabal-play",min:0,max:1,effect:{kind:"play",binding:"op11-hannyabal-play"}}}}],["OP11-083",{effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op11-caribou-trash",min:0,max:2,exhaustive:true,effect:{kind:"move",binding:"op11-caribou-trash",to:{player:"self",zone:"trash"}}}}],["OP11-084",{effect:{kind:"trash-top",player:"self",count:3}}],["OP11-085",{effect:{kind:"choose",selector:{player:"self",zone:"trash",type:"SMILE",maxCost:5},bind:"op11-orochi-recur",min:0,max:1,effect:{kind:"move",binding:"op11-orochi-recur",to:{player:"self",zone:"hand"}}}}],["OP11-086",{effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op11-coribou-trash",min:1,max:1,effect:{kind:"move",binding:"op11-coribou-trash",to:{player:"self",zone:"trash"}}}}],["OP11-091",{effect:opponentPlacesAtBottom({zone:"trash",category:"event"},3,"op11-berry-good")}],["OP11-092",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op11-helmeppo-cost",1,{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"SWORD",maxCost:8,excludeName:"Helmeppo"},bind:"op11-helmeppo-play",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"play",binding:"op11-helmeppo-play"},{kind:"at-end-of-turn",binding:"op11-helmeppo-play",action:"bury"}]}}]})}}],["OP11-095",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash",type:"Navy"},bind:"op11-garp-cost",min:3,max:3,effect:{kind:"sequence",effects:[{kind:"move",binding:"op11-garp-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"},{kind:"if",condition:{kind:"selector-count",player:"either",selector:{zone:"board",category:"character",minCost:9},operator:"gte",value:1},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:7},bind:"op11-garp-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op11-garp-ko"}}}]}}}}],["OP11-100",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Shirahoshi"},then:turnLifeFaceDown("op11-otohime-cost",{kind:"draw",player:"self",count:1}).effect}}],["OP11-104",turnLifeFaceDown("op11-shirley-cost",{kind:"sequence",effects:[{kind:"look-at",player:"self",count:3,bind:"op11-shirley"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"op11-shirley",type:"Fish-Man Island"},bind:"op11-shirley-add",min:0,max:1,effect:{kind:"move",binding:"op11-shirley-add",to:{player:"self",zone:"hand"}}},placeAtTopOrBottom("op11-shirley","op11-shirley-rest")]})],["OP11-108",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Shirahoshi"},then:turnLifeFaceDown("op11-neptune-cost",{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op11-neptune-trash",min:1,max:1,effect:{kind:"move",binding:"op11-neptune-trash",to:{player:"self",zone:"trash"}}}]}).effect}}],["OP11-109",{effect:{kind:"if",condition:haveNamed("Camie"),then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op11-pappag-trash",min:2,max:2,effect:{kind:"move",binding:"op11-pappag-trash",to:{player:"self",zone:"trash"}}}]}}}],["OP11-119",{effect:grantAttackActive("op11-koby-target")}],["OP11-110",{effect:{kind:"optional",effect:{kind:"choice",branches:[{id:"top",label:"Add the top card of your Life cards to your hand",effect:fukaboshi("top")},{id:"bottom",label:"Add the bottom card of your Life cards to your hand",effect:fukaboshi("bottom")}]}}}]]};function fukaboshi(position){return{kind:"choose",selector:{player:"self",zone:"life",position},bind:"op11-fukaboshi-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op11-fukaboshi-cost",to:{player:"self",zone:"hand"}},paidToHand("op11-fukaboshi-cost",[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1},bind:"op11-fukaboshi-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op11-fukaboshi-ko"}}])]}}}var filmLeader={kind:"leader-has-type",player:"self",type:"FILM"};var filmCard={type:"FILM"};var newFishManLeader={kind:"leader-has-type",player:"self",type:"New Fish-Man Pirates"};var thrillerBarkLeader={kind:"leader-has-type",player:"self",type:"Thriller Bark Pirates"};var germaLeader={kind:"leader-has-type",player:"self",type:"GERMA 66"};var lifeTopToHand={kind:"select",selector:{player:"self",zone:"life",position:"top"},bind:"op06-life-tail",count:1,effect:{kind:"move",binding:"op06-life-tail",to:{player:"self",zone:"hand"}}};var lookAndPlay=(count2,bind,match,rested=false)=>({effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:count2,bind},{kind:"choose",selector:{...match,player:"self",zone:"deck",binding:bind},bind:`${bind}-play`,min:0,max:1,effect:{kind:"play",binding:`${bind}-play`,rested}},{kind:"select",selector:{player:"self",zone:"deck",binding:bind},bind:`${bind}-rest`,count:"all",effect:{kind:"order-to-bottom",binding:`${bind}-rest`,to:{player:"self",zone:"deck",position:"bottom"}}}]}});var payWithStage=(bind,effect)=>({kind:"optional",effect:{kind:"choose",selector:{player:"either",zone:"stage",maxCost:1},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:bind,to:{player:"owner",zone:"deck",position:"bottom"}},effect]}}});var playSelfWhenOpponentBehind={effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:3},then:{kind:"play",binding:SOURCE_BINDING}}};var playSelfWhenBehind={effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:{kind:"play",binding:SOURCE_BINDING}}};var germaSwapUp=(name,cost,bind)=>({oncePerTurn:false,requires:{fieldDon:1},program:{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"if",condition:germaLeader,then:{kind:"choose",selector:{player:"self",zone:["hand","trash"],name,minCost:cost,maxCost:cost},bind,min:0,max:1,effect:{kind:"play",binding:bind}}}]}}}}});var koPowerAtMost=(maxPower,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:maxPower},bind,min:0,max:1,effect:{kind:"knock-out",binding:bind}});var koRestedCostAtMost=(maxCost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost},bind,min:0,max:1,effect:{kind:"knock-out",binding:bind}});var buryOpponentCostAtMost=(maxCost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost},bind,min:0,max:1,effect:{kind:"move",binding:bind,to:{player:"owner",zone:"deck",position:"bottom"}}});var trashFromHand=(count2,bind)=>({kind:"choose",selector:{player:"self",zone:"hand"},bind,min:count2,max:count2,effect:{kind:"move",binding:bind,to:{player:"self",zone:"trash"}}});var filmSearch=lookAndAdd(3,"op06-film-look",{type:"FILM"});var restOpponentUpToCost3=(cost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:cost,canRest:true},bind,min:0,max:1,effect:{kind:"rest",binding:bind}});var ownLeaderOrCharacterBuff2=bind=>({kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind,min:0,max:1,effect:{kind:"modify-power",binding:bind,amount:1e3,expiresAfterTurns:0}});var saulOnPlay=(op11OnPlayMechanics.onPlay??[]).find(([cardNumber])=>cardNumber==="OP11-075")[1];var fishManOrMerfolk=maxCost=>({category:"character",anyOf:[{type:"Fish-Man"},{type:"Merfolk"}],maxCost});var hasActiveDon={kind:"active-don",player:"self",operator:"gte",value:1};var op11TriggerMechanics={onStartOfYourTurn:[["OP11-040",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:8},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind:"op11-luffy-leader-look"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"op11-luffy-leader-look",type:"Straw Hat Crew"},bind:"op11-luffy-leader-add",min:0,max:1,effect:{kind:"move",binding:"op11-luffy-leader-add",to:{player:"self",zone:"hand"}}},placeAtTopOrBottom("op11-luffy-leader-look","op11-luffy-leader-rest")]}}}}]],onKo:[["OP11-051",{opponentEffectOnly:true,program:lookAndPlay(5,"op11-sanji-look",{category:"character",type:"Straw Hat Crew",maxCost:5})}],["OP11-024",{opponentEffectOnly:true,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[hasActiveDon,{kind:"zone-count",player:"self",zone:"hand",operator:"gte",value:1}]},then:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op11-aladine-cost",1,{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},playFromHand(fishManOrMerfolk(6),"op11-aladine-play")]})}}}}],["OP11-035",{opponentEffectOnly:true,program:{effect:{kind:"if",condition:hasActiveDon,then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},playFromHand(fishManOrMerfolk(4),"op11-tiger-play")]}}}}}]],onEndOfYourTurn:[["OP11-021",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:6},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",category:"character",anyOf:[{type:"Fish-Man"},{type:"Merfolk"}],rested:true},bind:"op11-jinbe-leader-active",min:0,max:1,effect:{kind:"update",binding:"op11-jinbe-leader-active",rested:false}},{kind:"activate-don",player:"self",count:1}]}}}],["OP11-067",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Big Mom Pirates",minCost:3,rested:true},bind:"op11-katakuri-active",min:0,max:2,effect:{kind:"update",binding:"op11-katakuri-active",rested:false}},{kind:"add-don",player:"self",count:1,rested:true}]}}]],trigger:[["OP11-018",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:6e3},bind:"op11-honesty-trigger-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op11-honesty-trigger-ko"}}}],["OP11-019",{effect:ownLeaderOrCharacterBuff2("op11-glorp-trigger")}],["OP11-020",{effect:ownLeaderOrCharacterBuff2("op11-calibur-trigger")}],["OP11-023",{effect:restOpponentUpToCost3(4,"op11-arlong-trigger")}],["OP11-028",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:3},bind:"op11-lord-trigger-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op11-lord-trigger-ko"}}}],["OP11-037",{effect:{kind:"draw",player:"self",count:1}}],["OP11-039",{effect:restOpponentUpToCost3(4,"op11-vagabond-trigger")}],["OP11-059",{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:2},bind:"op11-cobra-trigger",min:0,max:1,effect:{kind:"move",binding:"op11-cobra-trigger",to:{player:"owner",zone:"hand"}}}}],["OP11-060",op11EventPrograms["OP11-060"]],["OP11-075",asOnPlayTrigger(saulOnPlay)],["OP11-098",{effect:ownLeaderOrCharacterBuff2("op11-blue-hole-trigger")}],["OP11-099",op11EventPrograms["OP11-099"]],["OP11-115",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"op11-not-my-type-trigger",min:0,max:1,effect:{kind:"knock-out",binding:"op11-not-my-type-trigger"}}}],["OP11-116",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"op11-ultramarine-trigger",min:0,max:1,effect:{kind:"choice",branches:[{id:"top",label:"Add it to the top of the owner's Life cards",effect:{kind:"move",binding:"op11-ultramarine-trigger",to:{player:"owner",zone:"life",position:"top"},faceUp:true}},{id:"bottom",label:"Add it to the bottom of the owner's Life cards",effect:{kind:"move",binding:"op11-ultramarine-trigger",to:{player:"owner",zone:"life",position:"bottom"},faceUp:true}}]}}}]]};var revolutionaryArmyLeader={kind:"leader-has-type",player:"self",type:"Revolutionary Army"};var restOpponentUpToBaseCost=(cost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:cost,canRest:true},bind,min:0,max:1,effect:{kind:"rest",binding:bind}});var op12BattleMechanics={whenAttacking:[["OP12-024",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"given-don",player:"self",operator:"gte",value:3},then:restOpponentUpToBaseCost(6,"op12-gyukimaru-rest")}}}],["OP12-041",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"field-don-versus",player:"self",operator:"lte"},then:{kind:"add-don",player:"self",count:1,rested:true}}}}],["OP12-081",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"battle-target",filter:{isLeader:true}},{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",minCost:8},operator:"gte",value:2}]},then:{kind:"draw",player:"self",count:1}}}}],["OP12-085",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[revolutionaryArmyLeader,{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:5}]},then:{kind:"choose",selector:{player:"opponent",zone:"hand"},chooser:"opponent",bind:"op12-karasu-discard",min:1,max:1,effect:{kind:"move",binding:"op12-karasu-discard",to:{player:"owner",zone:"trash"}}}}}}]],onBlock:[["OP12-033",{oncePerTurn:false,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5,canRest:true},bind:"op12-helmeppo-rest",min:0,max:1,effect:{kind:"rest",binding:"op12-helmeppo-rest"}}}}]],onOpponentAttack:[["OP12-008",{oncePerTurn:true,requires:{handCards:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op12-shanks-cost",1,{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"op12-shanks-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op12-shanks-debuff",amount:-2e3,expiresAfterTurns:0}})}}}],["OP12-069",{oncePerTurn:true,requires:{fieldDon:1,leaderTypeIncluding:"Baroque Works"},program:{effect:donMinus(1,{kind:"if",condition:{kind:"leader-type-including",player:"self",text:"Baroque Works"},then:{kind:"battle-power",player:"self",amount:2e3}})}}]],counterEvent:[["OP12-016",{cost:0,power:2e3,target:rayleighOrCharacter}],["OP12-018",{cost:0,power:2e3,target:rayleighOrCharacter,program:{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"select",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"op12-supreme-debuff",count:"all",effect:{kind:"modify-power",binding:"op12-supreme-debuff",amount:-1e3,expiresAfterTurns:0}}]}}}}}],["OP12-019",{cost:0,power:2e3,target:rayleighOrCharacter}],["OP12-037",{cost:1,power:3e3,target:{isLeader:true}}],["OP12-038",{cost:1,power:3e3,target:{isLeader:true}}],["OP12-059",{cost:1,power:4e3,target:{isLeader:true},powerWhen:{kind:"selector-count",player:"self",selector:{zone:"trash",category:"event"},operator:"gte",value:4}}],["OP12-117",{cost:1,power:3e3,target:{isLeader:true}}]]};var revealTwoEvents=(bind,effect)=>({effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"event"},bind,min:2,max:2,effect:{kind:"sequence",effects:[{kind:"reveal",binding:bind},effect]}}}});var giveTwoRestedDon={kind:"give-rested-don",player:"self",count:2};var op12EventPrograms={"OP12-097":lookAndAddOrTrash(3,"op12-captains-look",{type:"Revolutionary Army",excludeName:"Captains Assembled"})};var op12MainMechanics={activateMain:[["OP12-020",{oncePerTurn:true,requires:{sourceRested:true},program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"source-attached-don",operator:"gte",value:3},{kind:"leader-battled-character",player:"self"}]},then:{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"op12-zoro-leader",count:"all",effect:{kind:"update",binding:"op12-zoro-leader",rested:false}},{kind:"restrict-player",player:"self",restriction:"leader-cannot-attack-characters",maxBaseCost:7,expiresAfterTurns:0}]}}}}],["OP12-026",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:4,rested:false,canRest:true},bind:"op12-kuina-rest",min:0,max:1,effect:{kind:"rest",binding:"op12-kuina-rest"}},{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Roronoa Zoro"},then:{kind:"attach-don",player:"self",from:"rested",count:3,target:"leader"}}]}}}}],["OP12-028",{oncePerTurn:false,requires:{sourceActive:true,activeDon:1},program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Roronoa Zoro"},then:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"rest",binding:SOURCE_BINDING},lookAndAdd(5,"op12-hiyori-look",{anyOf:[{attribute:"Slash"},{category:"event",color:"Green"}]}).effect]}}}}],["OP12-046",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"either",selector:{zone:"board",category:"character",maxCost:5,excludeSource:true},operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:5},bind:"op12-zephyr",min:0,max:1,effect:{kind:"move",binding:"op12-zephyr",to:{player:"owner",zone:"hand"}}}]}}}}],["OP12-001",{oncePerTurn:true,requires:{handCardsMatching:{match:{category:"event"},count:2}},program:revealTwoEvents("op12-rayleigh-reveal",{kind:"choose",selector:{player:"self",zone:"board",category:"character",maxPower:4e3},bind:"op12-rayleigh-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op12-rayleigh-buff",amount:2e3,expiresAfterTurns:0}})}],["OP12-004",{oncePerTurn:true,requires:{handCardsMatching:{match:{category:"event"},count:2}},program:revealTwoEvents("op12-oden-reveal",{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:0})}],["OP12-013",{oncePerTurn:false,requires:{sourceActive:true,restedDon:1,handCardsMatching:{match:{category:"event"},count:2}},program:revealTwoEvents("op12-hatchan-reveal",{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},giveTwoRestedDon]})}],["OP12-014",{oncePerTurn:false,requires:{restedDon:1,restedDonCountsSourceGiven:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},giveTwoRestedDon]}}}}],["OP12-022",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:5},bind:"op12-inuarashi-lock",min:0,max:1,effect:{kind:"restrict",binding:"op12-inuarashi-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}]}}}}],["OP12-041",{oncePerTurn:true,requires:{fieldDon:1,handCardsMatching:{match:{category:"event",type:"Straw Hat Crew",maxBaseCost:3,hasClause:"[Main]"},count:1}},program:{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand",category:"event",type:"Straw Hat Crew",maxBaseCost:3,hasClause:"[Main]"},bind:"op12-sanji-event",min:0,max:1,effect:{kind:"activate-event",binding:"op12-sanji-event"}}]}}}}}],["OP12-044",{oncePerTurn:true,requires:{handCards:1,restedDon:1},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op12-sakazuki-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op12-sakazuki-cost",to:{player:"self",zone:"trash"}},{kind:"give-rested-don",player:"self",count:1}]}}}}}],["OP12-051",{oncePerTurn:false,requires:{sourceActive:true,handCards:1},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op12-hina-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"move",binding:"op12-hina-cost",to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:4},bind:"op12-hina-lock",min:0,max:1,effect:{kind:"restrict",binding:"op12-hina-lock",restriction:"cannot-block",expiresAfterTurns:0}}]}}}}}],["OP12-080",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"deck",position:"bottom"}},{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Sanji"},then:lookAndAdd(3,"op12-baratie-look",{category:"event"}).effect}]}}}}],["OP12-091",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"trash"},operator:"gte",value:3},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash"},bind:"op12-poker-cost",min:3,max:3,effect:{kind:"sequence",effects:[{kind:"move",binding:"op12-poker-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"SMILE"},bind:"op12-poker-buff",min:0,max:2,effect:{kind:"modify-power",binding:"op12-poker-buff",amount:2e3,expiresAfterTurns:0}}]}}}}}}],["OP12-101",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Supernovas"},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"select",selector:{player:"self",zone:[],includeLeader:true,type:"Supernovas"},bind:"op12-bonney-leader",count:"all",effect:{kind:"modify-power",binding:"op12-bonney-leader",amount:1e3,expiresAfterTurns:1}}]}}}}}]],eventMain:[["OP12-016",{cost:0,program:{effect:giveDonToRayleigh(2,"op12-never-doubt",{kind:"grant-keyword",binding:"op12-never-doubt",keyword:"Unblockable",expiresAfterTurns:0})}}],["OP12-017",{cost:0,program:{effect:giveDonToRayleigh(1,"op12-observation",lookAndAdd(4,"op12-observation-look",{anyOf:[{color:"Red",category:"event"},{color:"Red",category:"character",minCost:3}]}).effect)}}],["OP12-019",{cost:0,program:{effect:giveDonToRayleigh(1,"op12-arms",{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"op12-arms-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op12-arms-buff",amount:1e3,expiresAfterTurns:0}})}}],["OP12-038",{cost:1,restDon:2,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxBaseCost:4},bind:"op12-rashomon-ko",min:0,max:2,effect:{kind:"knock-out",binding:"op12-rashomon-ko"}}}}],["OP12-037",{cost:1,restDon:3,program:{effect:{kind:"rest-opponent-cards",player:"opponent",count:2}}}],["OP12-039",{cost:3,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Roronoa Zoro"},then:{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"op12-three-thousand-worlds",count:"all",effect:{kind:"update",binding:"op12-three-thousand-worlds",rested:false}}}}}],["OP12-058",{cost:9,program:{effect:{kind:"if",condition:{kind:"leader-type-including",player:"self",text:"Whitebeard Pirates"},then:{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"op12-whitebeard-top",count:1,effect:{kind:"sequence",effects:[{kind:"reveal",binding:"op12-whitebeard-top"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"op12-whitebeard-top",category:"character",typeIncluding:"Whitebeard Pirates",maxCost:9},bind:"op12-whitebeard-play",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"play",binding:"op12-whitebeard-play"},{kind:"grant-keyword",binding:"op12-whitebeard-play",keyword:"Rush",expiresAfterTurns:0}]}}]}}}}}],["OP12-059",{cost:1,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Sanji"},then:{kind:"draw",player:"self",count:1}}}}],["OP12-060",{cost:3,program:{effect:{kind:"if",condition:{kind:"leader-multicolored",player:"self"},then:{kind:"choice",branches:[{id:"bounce",label:"Bounce an opposing cost-4-or-less Character",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"op12-boeuf-bounce",min:0,max:1,effect:{kind:"move",binding:"op12-boeuf-bounce",to:{player:"owner",zone:"hand"}}}},{id:"draw",label:"Draw 2 cards, at 6 or less cards in hand",effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:6},then:{kind:"draw",player:"self",count:2}}}]}}}}],["OP12-078",{cost:3,program:{effect:{kind:"if",condition:{kind:"field-don-versus",player:"self",operator:"lte"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op12-brochette-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op12-brochette-debuff",amount:-3e3,expiresAfterTurns:0}}]}}}}],["OP12-079",{cost:1,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Sanji"},then:lookAndAdd(3,"op12-king-look",{}).effect}}}],["OP12-096",{cost:4,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",minCost:8},operator:"gte",value:1},then:koOpponentUpToCost(6,"op12-ursa-wide"),else:koOpponentUpToCost(4,"op12-ursa-narrow")}}}],["OP12-097",{cost:1,program:op12EventPrograms["OP12-097"]}],["OP12-116",{cost:3,program:lookAndAdd(5,"op12-bell-look",{anyOf:[{type:"Shandian Warrior",category:"character"},{name:"Mont Blanc Noland"}]},2)}],["OP12-117",{cost:1,restDon:5,program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Supernovas"},then:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:9},bind:"op12-slam-gibson",min:0,max:1,effect:{kind:"choice",branches:[{id:"top",label:"Add it to the top of the owner's Life cards",effect:{kind:"move",binding:"op12-slam-gibson",to:{player:"owner",zone:"life",position:"top"}}},{id:"bottom",label:"Add it to the bottom of the owner's Life cards",effect:{kind:"move",binding:"op12-slam-gibson",to:{player:"owner",zone:"life",position:"bottom"}}}]}}}}}]]};function koOpponentUpToCost(cost,bind){return{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:cost},bind,min:0,max:1,effect:{kind:"knock-out",binding:bind}}}var revolutionaryArmyLeader2={kind:"leader-has-type",player:"self",type:"Revolutionary Army"};var deckTopToLife2=bind=>({kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind,count:1,effect:{kind:"move",binding:bind,to:{player:"self",zone:"life",position:"top"}}});var koAndKeep=bind=>({kind:"sequence",effects:[koOpponentUpToCost(1,bind),{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"hand"}}]});var op12TriggerMechanics={onKo:[["OP12-003",revealTwoEvents("op12-crocus-reveal",{kind:"choose",selector:{player:"self",zone:"hand",category:"character",color:"Red",maxPower:3e3},bind:"op12-crocus-play",min:0,max:1,effect:{kind:"play",binding:"op12-crocus-play"}})],["OP12-065",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"event"},bind:"op12-ivankov-recur",min:0,max:1,effect:{kind:"move",binding:"op12-ivankov-recur",to:{player:"self",zone:"hand"}}}}],["OP12-089",{effect:{kind:"if",condition:revolutionaryArmyLeader2,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:4},bind:"op12-hack-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op12-hack-ko"}}}}],["OP12-107",{effect:{kind:"if",condition:{kind:"turn-player",player:"opponent"},then:deckTopToLife2("op12-doflamingo-life")}}],["OP12-119",{effect:{kind:"if",condition:{kind:"turn-player",player:"opponent"},then:deckTopToLife2("op12-kuma-ko-life")}}]],trigger:[["OP12-058",{effect:{kind:"draw",player:"self",count:1}}],["OP12-075",{effect:donMinus(1,{kind:"play",binding:SOURCE_BINDING})}],["OP12-080",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP12-096",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"trash-top",player:"self",count:1}]}}],["OP12-097",op12EventPrograms["OP12-097"]],["OP12-101",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Supernovas"},then:{kind:"play",binding:SOURCE_BINDING}}}],["OP12-104",{effect:koOpponentUpToCost(4,"op12-sentomaru-ko")}],["OP12-109",{effect:koAndKeep("op12-pacifista-ko")}],["OP12-116",{effect:{kind:"draw",player:"self",count:1}}]]};var op12ReplacementMechanics={replacement:[["OP12-070",{opponentEffectOnly:true,removal:"off-field",oncePerTurn:false,label:"Return 1 DON!! card to your DON!! deck",cost:{kind:"return-don",count:1}}],["OP12-027",{opponentEffectOnly:true,oncePerTurn:false,protects:{category:"character",attribute:"Slash",maxCost:5},excludesSelf:true,label:"Rest Koushirou",cost:{kind:"rest-self"}}]]};var anyGivenDon={kind:"given-don",player:"self",operator:"gte",value:1};var filmOrStrawHatLeader={kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"FILM"},{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"}]};var trashAtLeast=count2=>({kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:count2});var setDonActive=count2=>({kind:"activate-don",player:"self",count:count2});var opponentLifeToTheirHand=bind=>({kind:"select",selector:{player:"opponent",zone:"life",position:"top"},bind,count:1,effect:{kind:"move",binding:bind,to:{player:"owner",zone:"hand"}}});var addRestedDon={kind:"add-don",player:"self",count:1,rested:true};var LUFFY_LEADER_TARGET={anyOf:[{isLeader:true},{type:"Straw Hat Crew"}]};var LUFFY_LEADER_MAX_REST=5;function luffyLeaderChoice(available){return{kind:"choice",branches:Array.from({length:available},(_,index)=>{const count2=index+1;return{id:`rest-${count2}`,label:`Rest ${count2} DON!! for +${count2*2e3} power`,effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:count2},{kind:"battle-power",player:"self",amount:count2*2e3,target:LUFFY_LEADER_TARGET}]}}})}}function luffyLeaderLadder(available){if(available===1)return luffyLeaderChoice(1);return{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:available},then:luffyLeaderChoice(available),else:luffyLeaderLadder(available-1)}}var luffyLeaderBranches={kind:"optional",effect:luffyLeaderLadder(LUFFY_LEADER_MAX_REST)};var snakeShotEffect={kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:4},bind:"op13-snake-shot-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op13-snake-shot-ko"}};var op13BattleMechanics={whenAttacking:[["OP13-044",{oncePerTurn:false,program:{effect:{kind:"give-rested-don",player:"self",count:1,typeIncluding:"Whitebeard Pirates"}}}],["OP13-045",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:4},then:{kind:"draw",player:"self",count:1}}}}],["OP13-053",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",typeIncluding:"Whitebeard Pirates"},bind:"op13-teach-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op13-teach-cost",to:{player:"self",zone:"trash"}},{kind:"draw",player:"self",count:1},{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Banish",expiresAfterTurns:0}]}}}}}],["OP13-055",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:4},then:{kind:"select",selector:{player:"self",zone:"board",category:"character",typeIncluding:"Whitebeard Pirates"},bind:"op13-rakuyo-buff",count:"all",effect:{kind:"modify-power",binding:"op13-rakuyo-buff",amount:1e3,expiresAfterTurns:0}}}}}],["OP13-056",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"leader-type-including",player:"self",text:"Whitebeard Pirates"},then:{kind:"draw",player:"self",count:1}}}}],["OP13-062",{oncePerTurn:false,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:3e3},bind:"op13-crocus-bounce",min:0,max:1,effect:{kind:"move",binding:"op13-crocus-bounce",to:{player:"owner",zone:"hand"}}}}}],["OP13-080",{oncePerTurn:false,program:{effect:{kind:"if",condition:trashAtLeast(10),then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op13-nusjuro-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op13-nusjuro-debuff",amount:-2e3,expiresAfterTurns:0}}}}}],["OP13-114",{oncePerTurn:false,program:turnLifeFaceUp("op13-snake-attack-cost",{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op13-snake-attack-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op13-snake-attack-debuff",amount:-2e3,expiresAfterTurns:0}})}]],onOpponentAttack:[["OP13-001",{oncePerTurn:false,requires:{activeDon:1},program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"source-attached-don",operator:"gte",value:1},{kind:"active-don",player:"self",operator:"lte",value:5},{kind:"battle-target",filter:LUFFY_LEADER_TARGET}]},then:luffyLeaderBranches}}}],["OP13-002",{oncePerTurn:true,requires:{handCards:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op13-ace-leader-cost",1,{kind:"battle-power",player:"opponent",amount:-2e3})}}}]],counterEvent:[["OP13-039",{cost:2,power:0,program:{effect:snakeShotEffect}}],["OP13-019",{cost:1,power:3e3,target:{isLeader:true}}],["OP13-040",{cost:1,power:3e3,target:{isLeader:true}}],["OP13-057",{cost:1,power:3e3,target:{isLeader:true}}],["OP13-058",{cost:1,power:3e3,target:{isLeader:true}}],["OP13-075",{cost:1,power:3e3,target:{isLeader:true}}],["OP13-077",{cost:1,power:3e3,target:{isLeader:true}}],["OP13-097",{cost:1,power:3e3,target:{isLeader:true}}],["OP13-098",{cost:1,power:4e3,powerWhen:{kind:"leader-has-name",player:"self",name:"Imu"}}],["OP13-115",{cost:2,power:3e3,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:2},then:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"op13-afterimage-rider",min:0,max:1,effect:{kind:"modify-power",binding:"op13-afterimage-rider",amount:1e3,expiresAfterTurns:0}}}}}]]};var offFieldReplacementMechanics={replacement:[["OP10-037",{opponentEffectOnly:true,oncePerTurn:true,removal:"off-field",label:"Rest an {ODYSSEY} Character",cost:{kind:"rest-own-cards",count:1,match:{category:"character",type:"ODYSSEY"}}}],["OP10-032",{opponentEffectOnly:true,oncePerTurn:false,removal:"off-field",protects:{category:"character",color:"Green",excludeName:"Tashigi"},label:"Rest Tashigi",cost:{kind:"rest-self"}}],["OP11-001",{opponentEffectOnly:true,oncePerTurn:true,removal:"off-field",protects:{category:"character",type:"Navy",maxPower:7e3},label:"Bottom-deck 3 from trash",cost:{kind:"bury-from-trash",count:3}}],["OP11-101",{opponentEffectOnly:true,oncePerTurn:true,removal:"off-field",protects:{category:"character",type:"Supernovas",excludeName:'Capone"Gang"Bege'},excludesSelf:true,redirect:"own-life-face-down",label:"Put it on top of Life, face-down",cost:{kind:"none"}}],["OP12-048",{opponentEffectOnly:true,oncePerTurn:false,opponentTurnOnly:true,removal:"off-field",protects:{category:"character",color:"Blue",type:"Navy"},label:"Rest Rosinante, trash 1 from hand",cost:{kind:"trash-from-hand",count:1,restsSelf:true}}],["OP12-053",{opponentEffectOnly:true,oncePerTurn:true,removal:"off-field",label:"Trash 1 from hand",cost:{kind:"trash-from-hand",count:1}}],["OP12-102",{opponentEffectOnly:true,oncePerTurn:false,removal:"off-field",protects:{category:"character",maxBaseCost:6},label:"Flip the top Life card face-up",cost:{kind:"turn-life-face-up"}}],["OP13-008",{opponentEffectOnly:true,oncePerTurn:false,protects:{category:"character",type:"Revolutionary Army"},label:"Trash Emporio.Ivankov",cost:{kind:"trash-self"}}],["OP13-017",{opponentEffectOnly:true,oncePerTurn:true,removal:"off-field",protects:{category:"character",type:"Revolutionary Army"},label:"Give Monkey.D.Dragon -2000 power",cost:{kind:"self-power-penalty",amount:-2e3}}],["OP13-047",{opponentEffectOnly:true,oncePerTurn:false,protects:{category:"character",typeIncluding:"Whitebeard Pirates"},label:"Trash Fossa",cost:{kind:"trash-self"}}],["OP13-060",{opponentEffectOnly:true,oncePerTurn:false,protects:{category:"character",typeIncluding:"Roger Pirates"},label:"Trash Amatsuki Toki",cost:{kind:"trash-self"}}],["OP13-046",{opponentEffectOnly:true,oncePerTurn:true,removal:"off-field",label:'Trash 1 "Whitebeard Pirates" card from your hand',cost:{kind:"trash-from-hand",count:1,match:{typeIncluding:"Whitebeard Pirates"}}}],["OP13-109",{opponentEffectOnly:true,oncePerTurn:false,removal:"off-field",label:"Flip the top Life card face-up",cost:{kind:"turn-life-face-up"}}]]};var imuLeader={kind:"leader-has-name",player:"self",name:"Imu"};var buffNamed=(name,amount,bind)=>({kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name},bind,min:0,max:1,effect:{kind:"modify-power",binding:bind,amount,expiresAfterTurns:0}});var op13EventPrograms={"OP13-020":{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op13-meteor-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op13-meteor-debuff",amount:-5e3,expiresAfterTurns:0}}},"OP13-096":lookAndAddOrTrash(3,"op13-elders-look",{type:"Celestial Dragons",excludeName:"The Five Elders Are at Your Service!!!"}),"OP13-116":lookAndAdd(5,"op13-pirate-king-look",{type:"Supernovas",category:"character"})};var op13MainMechanics={activateMain:[["OP13-081",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash"},bind:"op13-koala-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op13-koala-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"give-rested-don",player:"self",count:1}]}}}}}],["OP13-015",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},buffNamed("Monkey.D.Luffy",2e3,"op13-makino-buff")]}}}}],["OP13-022",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"board",category:"character",maxPower:2e3},bind:"op13-windmill-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op13-windmill-buff",amount:1e3,expiresAfterTurns:0}}]}}}}],["OP13-026",{oncePerTurn:true,requires:{activeDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:1}]}}}}],["OP13-079",{oncePerTurn:true,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:["board","hand"],anyOf:[{zone:"board",type:"Celestial Dragons"},{zone:"hand"}]},bind:"op13-imu-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op13-imu-cost",to:{player:"self",zone:"trash"}},{kind:"draw",player:"self",count:1}]}}}}}],["OP13-082",{oncePerTurn:false,requires:{activeDon:1,handCards:1},program:{effect:{kind:"if",condition:imuLeader,then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op13-elders-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"move",binding:"op13-elders-cost",to:{player:"self",zone:"trash"}},{kind:"select",selector:{player:"self",zone:"board",category:"character"},bind:"op13-elders-wipe",count:"all",effect:{kind:"move",binding:"op13-elders-wipe",to:{player:"self",zone:"trash"}}},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Five Elders",minPower:5e3,maxPower:5e3},bind:"op13-elders-revive",min:0,max:5,distinctNames:true,effect:{kind:"play",binding:"op13-elders-revive"}}]}}}}}}],["OP13-099",{oncePerTurn:false,requires:{sourceActive:true,activeDon:3},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"rest-don",player:"self",count:3},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",color:"Black",type:"Five Elders",maxCostFromFieldDon:"self"},bind:"op13-throne-play",min:0,max:1,effect:{kind:"play",binding:"op13-throne-play"}}]}}}}],["OP13-102",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"if",condition:{kind:"life-versus",player:"self",operator:"lte"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},restOpponentUpToCost4(3,"op13-edison-rest")]}}]}}}}],["OP13-120",{oncePerTurn:true,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op13-sabo-cost",min:0,max:1,effect:{kind:"modify-cost",binding:"op13-sabo-cost",amount:2,expiresAfterTurns:1}},{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"}]}}}]],eventMain:[["OP13-019",{cost:1,restDon:4,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op13-ace-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op13-ace-debuff",amount:-3e3,expiresAfterTurns:0}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:3e3},bind:"op13-ace-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op13-ace-ko"}}]}}}],["OP13-021",{cost:1,program:{effect:{kind:"sequence",effects:[{kind:"give-rested-don",player:"self",count:1,name:"Monkey.D.Luffy"},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op13-gatling-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op13-gatling-debuff",amount:-2e3,expiresAfterTurns:0}}]}}}],["OP13-040",{cost:1,restDon:2,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:7},bind:"op13-all-out",min:0,max:2,effect:{kind:"restrict",binding:"op13-all-out",restriction:"cannot-refresh",expiresAfterTurns:1}}}}],["OP13-116",{cost:1,program:op13EventPrograms["OP13-116"]}],["OP13-020",{cost:3,program:op13EventPrograms["OP13-020"]}],["OP13-038",{cost:2,program:{effect:{kind:"sequence",effects:[restOpponentUpToCost4(5,"op13-elephant-rest"),{kind:"activate-don-at-end-of-turn",player:"self",count:2}]}}}],["OP13-057",{cost:1,restDon:1,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:1},then:{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"op13-bowed-leader",count:"all",effect:{kind:"grant-keyword",binding:"op13-bowed-leader",keyword:"Unblockable",expiresAfterTurns:0}}}}}],["OP13-058",{cost:1,restDon:1,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:3e3},bind:"op13-pyreapple-bury",min:0,max:1,effect:{kind:"move",binding:"op13-pyreapple-bury",to:{player:"owner",zone:"deck",position:"bottom"}}}}}],["OP13-059",{cost:4,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op13-punk-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op13-punk-cost",to:{player:"owner",zone:"hand"}},{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:6},bind:"op13-punk-bounce",min:0,max:1,effect:{kind:"move",binding:"op13-punk-bounce",to:{player:"owner",zone:"hand"}}}]}}}}}],["OP13-075",{cost:1,restDon:1,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-name",player:"self",name:"Gol.D.Roger"},anyGivenDon]},then:addRestedDon}}}],["OP13-077",{cost:1,restDon:3,program:{effect:{kind:"if",condition:anyGivenDon,then:{kind:"sequence",effects:[koOpponentMaxPower(4e3,"op13-top-ko-four"),koOpponentMaxPower(3e3,"op13-top-ko-three")]}}}}],["OP13-096",{cost:1,program:op13EventPrograms["OP13-096"]}],["OP13-097",{cost:1,restDon:5,program:{effect:{kind:"if",condition:{kind:"every-character-matches",player:"self",selector:{zone:"board",type:"Celestial Dragons"}},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:6},bind:"op13-equilibrium-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op13-equilibrium-ko"}}}}}],["OP13-098",{cost:1,restDon:1,program:{effect:{kind:"if",condition:imuLeader,then:{kind:"choose",selector:{player:"opponent",zone:"stage",minBaseCost:7,maxBaseCost:7},bind:"op13-never-existed",min:0,max:1,effect:{kind:"knock-out",binding:"op13-never-existed"}}}}}],["OP13-117",{cost:5,program:turnLifeFaceUp("op13-dawn-stamp-cost",{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:6},bind:"op13-dawn-stamp-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op13-dawn-stamp-ko"}})}]]};function restOpponentUpToCost4(cost,bind){return{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:cost,canRest:true},bind,min:0,max:1,effect:{kind:"rest",binding:bind}}}function koOpponentMaxPower(power,bind){return{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:power},bind,min:0,max:1,effect:{kind:"knock-out",binding:bind}}}var giveRestedDonToNamed=(name,count2,bind)=>({kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name},bind,min:0,max:1,effect:{kind:"attach-don",player:"self",from:"rested",count:count2,target:{binding:bind}}});var playHancock=(maxCost,bind)=>({kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Boa Hancock"},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",name:"Boa Hancock",maxCost},bind,min:0,max:1,effect:{kind:"play",binding:bind}}});var op13OnPlayMechanics={onPlay:[["OP13-006",{effect:giveRestedDonToNamed("Monkey.D.Luffy",2,"op13-woop-slap")}],["OP13-012",lookAndAdd(4,"op13-vivi-look",{anyOf:[{type:"Alabasta"},{type:"Straw Hat Crew"}],minCost:2})],["OP13-013",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:0},bind:"op13-higuma-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op13-higuma-ko"}}}],["OP13-023",{effect:{kind:"sequence",effects:[setDonActive(2),{kind:"restrict-player",player:"self",restriction:"cannot-play-characters",minBaseCost:5,expiresAfterTurns:0}]}}],["OP13-024",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand",anyOf:[{type:"Music"},{type:"FILM"}]},bind:"op13-gordon-reveal",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"reveal",binding:"op13-gordon-reveal"},{kind:"activate-don-at-end-of-turn",player:"self",count:2}]}}}}],["OP13-025",{effect:{kind:"if",condition:{kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"FILM"},{kind:"leader-has-attribute",player:"self",attribute:"Strike"}]},then:setDonActive(1)}}],["OP13-027",{effect:setDonActive(2)}],["OP13-028",{effect:{kind:"sequence",effects:[setDonActive(10),{kind:"restrict-player",player:"self",restriction:"cannot-play-from-hand",expiresAfterTurns:0}]}}],["OP13-030",{effect:setDonActive(2)}],["OP13-032",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:8},bind:"op13-robin-lock",min:0,max:1,effect:{kind:"restrict",binding:"op13-robin-lock",restriction:"cannot-rest",expiresAfterTurns:1}}}],["OP13-034",{effect:{kind:"if",condition:filmOrStrawHatLeader,then:setDonActive(1)}}],["OP13-037",{effect:{kind:"if",condition:filmOrStrawHatLeader,then:setDonActive(2)}}],["OP13-041",{effect:{kind:"draw",player:"self",count:2}}],["OP13-043",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:3},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op13-otama-trash",min:1,max:1,effect:{kind:"move",binding:"op13-otama-trash",to:{player:"self",zone:"trash"}}}]}}}],["OP13-050",{effect:playHancock(3,"op13-sandersonia-play")}],["OP13-052",{effect:playHancock(6,"op13-marigold-play")}],["OP13-061",{effect:{kind:"if",condition:anyGivenDon,then:{kind:"sequence",effects:[addRestedDon,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1},bind:"op13-inuarashi-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op13-inuarashi-ko"}}]}}}],["OP13-062",{effect:{kind:"if",condition:anyGivenDon,then:{kind:"add-don",player:"self",count:1,rested:false}}}],["OP13-063",{effect:{kind:"if",condition:anyGivenDon,then:addRestedDon}}],["OP13-064",{effect:donMinus(3,{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"op13-roger-leader",count:"all",effect:{kind:"modify-power",binding:"op13-roger-leader",amount:2e3,expiresAfterTurns:1}},{kind:"select",selector:{player:"opponent",zone:"board",category:"character"},bind:"op13-roger-debuff",count:"all",effect:{kind:"modify-power",binding:"op13-roger-debuff",amount:-2e3,expiresAfterTurns:1}}]})}],["OP13-065",lookAndAdd(5,"op13-shanks-look",{typeIncluding:"Roger Pirates",excludeName:"Shanks"})],["OP13-066",{effect:{kind:"if",condition:anyGivenDon,then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5,canRest:true},bind:"op13-rayleigh-rest",min:0,max:1,effect:{kind:"rest",binding:"op13-rayleigh-rest"}},{kind:"add-don-at-end-of-turn",player:"self",count:1}]}}}],["OP13-067",{effect:{kind:"if",condition:{kind:"leader-type-including",player:"self",text:"Roger Pirates"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op13-gaban-trash",min:1,max:1,effect:{kind:"move",binding:"op13-gaban-trash",to:{player:"self",zone:"trash"}}},addRestedDon]}}}],["OP13-068",{effect:{kind:"if",condition:{kind:"leader-type-including",player:"self",text:"Roger Pirates"},then:addRestedDon}}],["OP13-069",{effect:donMinus(1,{kind:"choose",selector:{player:"self",zone:"trash",category:"stage",maxCost:3},bind:"op13-tom-recur",min:0,max:1,effect:{kind:"move",binding:"op13-tom-recur",to:{player:"self",zone:"hand"}}})}],["OP13-071",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:8},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:3e3},bind:"op13-nekomamushi-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op13-nekomamushi-ko"}}}}],["OP13-072",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-type-including",player:"self",text:"Roger Pirates"},anyGivenDon]},then:addRestedDon}}],["OP13-074",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Homies",maxPower:3e3},bind:"op13-hera-play",min:0,max:1,effect:{kind:"play",binding:"op13-hera-play"}}}],["OP13-083",lookAndAdd(5,"op13-saturn-look",{type:"Five Elders"})],["OP13-086",{effect:{kind:"sequence",effects:[lookAndAddOrTrash(3,"op13-shalria-look",{type:"Celestial Dragons",excludeName:"Saint Shalria"}).effect,{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op13-shalria-trash",min:1,max:1,effect:{kind:"move",binding:"op13-shalria-trash",to:{player:"self",zone:"trash"}}}]}}],["OP13-087",{effect:{kind:"trash-top",player:"self",count:1}}],["OP13-091",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op13-mars-cost",1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:5},bind:"op13-mars-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op13-mars-ko"}})}}],["OP13-092",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:3},then:{kind:"choose",selector:{player:"self",zone:"trash",category:"stage",type:"Mary Geoise",minBaseCost:1,maxBaseCost:1},bind:"op13-mjosgard-stage",min:0,max:1,effect:{kind:"play",binding:"op13-mjosgard-stage"}}}}],["OP13-093",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op13-morgans-trash",min:2,max:2,effect:{kind:"move",binding:"op13-morgans-trash",to:{player:"self",zone:"trash"}}}]}}],["OP13-094",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Celestial Dragons"},bind:"op13-york-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op13-york-buff",amount:2e3,expiresAfterTurns:0}}}],["OP13-095",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op13-rosward-cost",1,{kind:"if",condition:{kind:"every-character-matches",player:"self",selector:{zone:"board",type:"Celestial Dragons"}},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:3},bind:"op13-rosward-ko",min:0,max:2,effect:{kind:"knock-out",binding:"op13-rosward-ko"}}})}}],["OP13-105",{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind:"op13-momonosuke",zone:"life"},{kind:"choose",selector:{player:"self",zone:"life",binding:"op13-momonosuke"},bind:"op13-momonosuke-bottom",min:0,max:5,effect:{kind:"move",binding:"op13-momonosuke-bottom",to:{player:"self",zone:"life",position:"bottom"}}}]}}],["OP13-108",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Egghead"},then:{kind:"sequence",effects:[{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0},opponentLifeToTheirHand("op13-bonney-life")]}}}],["OP13-110",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Egghead"},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:5,hasTrigger:true},bind:"op13-stussy-play",min:0,max:1,effect:{kind:"play",binding:"op13-stussy-play"}}}}],["OP13-113",lookAndAdd(4,"op13-lilith-look",{hasTrigger:true,excludeName:"Lilith"})],["OP13-114",turnLifeFaceUp("op13-snake-cost",{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op13-snake-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op13-snake-debuff",amount:-2e3,expiresAfterTurns:0}})],["OP13-118",{effect:{kind:"if",condition:{kind:"leader-multicolored",player:"self"},then:{kind:"sequence",effects:[setDonActive(4),{kind:"restrict-player",player:"self",restriction:"cannot-play-characters",minBaseCost:5,expiresAfterTurns:0}]}}}],["OP13-119",{effect:{kind:"sequence",effects:[{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"},{kind:"optional",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"op13-ace-bounce",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op13-ace-bounce",to:{player:"owner",zone:"hand"}},{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"hand",binding:"op13-ace-bounce"},operator:"gte",value:1},then:{kind:"choose",selector:{player:"opponent",zone:"hand",category:"character",maxCost:4},chooser:"opponent",bind:"op13-ace-their-play",min:0,max:1,effect:{kind:"play",binding:"op13-ace-their-play",player:"opponent"}}}]}}}]}}]]};var drawOne3={kind:"draw",player:"self",count:1};var lilithOnPlay=(op13OnPlayMechanics.onPlay??[]).find(([cardNumber])=>cardNumber==="OP13-113")[1];var op13TriggerMechanics={onKo:[["OP13-023",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:5},bind:"op13-uta-play",min:0,max:1,effect:{kind:"play",binding:"op13-uta-play",rested:true}}}],["OP13-033",{effect:{kind:"choose",selector:restableCards("opponent"),bind:"op13-franky-rest",min:0,max:2,effect:{kind:"rest",binding:"op13-franky-rest"}}}],["OP13-044",{effect:drawOne3}],["OP13-051",{effect:{kind:"if",condition:{kind:"any-of",conditions:[{kind:"leader-has-name",player:"self",name:"Boa Hancock"},{kind:"leader-multicolored",player:"self"}]},then:{kind:"draw",player:"self",count:2}}}],["OP13-089",{effect:drawOne3}],["OP13-104",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op13-hiyori-cost",1,{kind:"if",condition:{kind:"leader-multicolored",player:"self"},then:{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"op13-hiyori-life",count:1,effect:{kind:"move",binding:"op13-hiyori-life",to:{player:"self",zone:"life",position:"top"}}}})}}]],onEndOfYourTurn:[["OP13-027",{effect:{kind:"if",condition:filmOrStrawHatLeader,then:setDonActive(1)}}],["OP13-035",{effect:{kind:"choice",branches:[{id:"self",label:"Make this Character active",effect:{kind:"update",binding:SOURCE_BINDING,rested:false}},{id:"don",label:"Set 1 of your DON!! cards as active",effect:setDonActive(1)}]}}],["OP13-037",{effect:{kind:"update",binding:SOURCE_BINDING,rested:false}}]],trigger:[["OP13-014",{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name:"Portgas.D.Ace"},bind:"op13-rouge-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op13-rouge-buff",amount:3e3,expiresAfterTurns:0}}}],["OP13-020",op13EventPrograms["OP13-020"]],["OP13-038",{effect:restOpponentUpToCost4(5,"op13-elephant-trigger")}],["OP13-039",{effect:snakeShotEffect}],["OP13-059",{effect:drawOne3}],["OP13-096",op13EventPrograms["OP13-096"]],["OP13-102",{effect:{kind:"sequence",effects:[drawOne3,restOpponentUpToCost4(3,"op13-edison-trigger")]}}],["OP13-106",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP13-108",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:1},then:restOpponentUpToCost4(7,"op13-bonney-trigger")}}],["OP13-109",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op13-bonney-trash",min:1,max:1,effect:{kind:"move",binding:"op13-bonney-trash",to:{player:"self",zone:"trash"}}}]}}],["OP13-113",asOnPlayTrigger(lilithOnPlay)],["OP13-114",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op13-snake-trigger-cost",1,{kind:"play",binding:SOURCE_BINDING})}}],["OP13-115",{effect:drawOne3}],["OP13-117",{effect:drawOne3}]]};var revolutionaryArmyLeader3={kind:"leader-has-type",player:"self",type:"Revolutionary Army"};var opponentDiscards=(floor,count2,bind)=>({kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:floor},then:{kind:"choose",selector:{player:"opponent",zone:"hand"},chooser:"opponent",bind,min:count2,max:count2,effect:{kind:"move",binding:bind,to:{player:"owner",zone:"trash"}}}});var op12OnPlayMechanics={onPlay:[["OP12-046",{effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op12-zephyr-cost",min:0,max:2,exhaustive:true,effect:{kind:"move",binding:"op12-zephyr-cost",to:{player:"self",zone:"trash"}}}}],["OP12-006",lookAndAdd(5,"op12-shakuyaku-look",{anyOf:[{name:"Monkey.D.Luffy"},{color:"Red",category:"event"}]})],["OP12-007",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",typeIncluding:"Roger Pirates",excludeName:"Shanks"},bind:"op12-shanks-rush",min:0,max:1,effect:{kind:"grant-keyword",binding:"op12-shanks-rush",keyword:"Rush",expiresAfterTurns:0}}}],["OP12-009",revealTwoEvents("op12-jinbe-reveal",{kind:"sequence",effects:[{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0},{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:1}]})],["OP12-012",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",typeIncluding:"Roger Pirates",excludeName:"Buggy"},bind:"op12-buggy-blocker",min:0,max:1,effect:{kind:"grant-keyword",binding:"op12-buggy-blocker",keyword:"Blocker",expiresAfterTurns:1}}}],["OP12-014",lookAndAdd(5,"op12-hancock-look",{anyOf:[{name:"Monkey.D.Luffy"},{color:"Red",category:"event"}]})],["OP12-015",revealTwoEvents("op12-luffy-reveal",{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",category:"character",color:"Red",maxPower:3e3},bind:"op12-luffy-play",min:0,max:1,effect:{kind:"play",binding:"op12-luffy-play"}},{kind:"give-rested-don",player:"self",count:1}]})],["OP12-029",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2,canRest:true},bind:"op12-kouzaburou-rest",min:0,max:1,effect:{kind:"rest",binding:"op12-kouzaburou-rest"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxBaseCost:1},bind:"op12-kouzaburou-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op12-kouzaburou-ko"}}]}}],["OP12-030",{effect:{kind:"sequence",effects:[{kind:"activate-don",player:"self",count:4},{kind:"restrict-player",player:"self",restriction:"cannot-play-characters",minBaseCost:7,expiresAfterTurns:0}]}}],["OP12-042",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:1},bind:"op12-alvida-bury",min:0,max:1,effect:{kind:"move",binding:"op12-alvida-bury",to:{player:"owner",zone:"deck",position:"bottom"}}}}],["OP12-044",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Navy"},then:{kind:"draw",player:"self",count:2}}}],["OP12-054",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"The Seven Warlords of the Sea"},then:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:1,excludeSource:true},bind:"op12-teach-bounce",min:0,max:1,effect:{kind:"move",binding:"op12-teach-bounce",to:{player:"owner",zone:"hand"}}}}}],["OP12-056",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op12-garp-cost",1,{kind:"choose",selector:{player:"self",zone:"hand",category:"character",color:"Blue",type:"Navy",maxPower:8e3,excludeName:"Monkey.D.Garp"},bind:"op12-garp-play",min:0,max:1,effect:{kind:"play",binding:"op12-garp-play"}})}}],["OP12-062",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-name",player:"self",name:"Sanji"},{kind:"field-don-versus",player:"self",operator:"lte"}]},then:{kind:"sequence",effects:[{kind:"add-don",player:"self",count:1,rested:true},{kind:"draw",player:"self",count:1}]}}}],["OP12-074",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",category:"event"},"op12-patty-cost",1,{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Sanji"},then:{kind:"add-don",player:"self",count:1,rested:false}})}}],["OP12-075",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:3},bind:"op12-sunday-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op12-sunday-ko"}},{kind:"optional",chooser:"opponent",effect:{kind:"add-don",player:"opponent",count:1,rested:false}}]}}],["OP12-084",{effect:{kind:"if",condition:revolutionaryArmyLeader3,then:{kind:"trash-top",player:"self",count:3}}}],["OP12-086",{effect:{kind:"if",condition:revolutionaryArmyLeader3,then:lookAndAddOrTrash(3,"op12-koala-look",{anyOf:[{type:"Revolutionary Army"},{name:"Nico Robin"}],excludeName:"Koala"}).effect}}],["OP12-087",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op12-robin-cost",1,opponentDiscards(5,2,"op12-robin-discard"))}}],["OP12-094",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash",type:"Revolutionary Army"},bind:"op12-dragon-cost",min:3,max:3,effect:{kind:"sequence",effects:[{kind:"move",binding:"op12-dragon-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"if",condition:revolutionaryArmyLeader3,then:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",maxCost:6},bind:"op12-dragon-play",min:0,max:1,effect:{kind:"play",binding:"op12-dragon-play"}}}]}}}}],["OP12-095",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op12-lindbergh-trash",min:1,max:1,effect:{kind:"move",binding:"op12-lindbergh-trash",to:{player:"self",zone:"trash"}}}]}}],["OP12-100",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top"},bind:"op12-sabo-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op12-sabo-cost",to:{player:"self",zone:"hand"}},paidToHand("op12-sabo-cost",[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op12-sabo-trash",min:1,max:1,effect:{kind:"move",binding:"op12-sabo-trash",to:{player:"self",zone:"trash"}}}])]}}}}],["OP12-105",{effect:{kind:"if",condition:{kind:"turn-player",player:"self"},then:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name:"Trafalgar Law"},bind:"op12-lammy-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op12-lammy-buff",amount:2e3,expiresAfterTurns:0}}}}],["OP12-118",{effect:{kind:"if",condition:{kind:"rested-cards",player:"self",operator:"gte",value:8},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op12-bonney-trash",min:1,max:1,effect:{kind:"move",binding:"op12-bonney-trash",to:{player:"self",zone:"trash"}}},{kind:"activate-don",player:"self",count:1}]}}}],["OP12-119",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op12-kuma-cost",1,{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"op12-kuma-life",count:1,effect:{kind:"move",binding:"op12-kuma-life",to:{player:"self",zone:"life",position:"top"}}},{kind:"modify-cost",binding:SOURCE_BINDING,amount:2,expiresAfterTurns:1}]})}}]]};var op12RosinanteMechanics={eventMain:[["OP12-077",{cost:2,program:{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",name:"Trafalgar Law"},bind:"silencing-target",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"modify-power",binding:"silencing-target",amount:2e3,expiresAfterTurns:0},{kind:"grant-keyword",binding:"silencing-target",keyword:"Unblockable",expiresAfterTurns:0}]}}}}]],counterEvent:[["OP12-115",{cost:1,power:2e3,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:{kind:"choose",selector:{player:"self",zone:"trash",name:"Trafalgar Law"},bind:"i-love-you-target",min:0,max:1,effect:{kind:"move",binding:"i-love-you-target",to:{player:"self",zone:"hand"}}}}}}]],whenAttacking:[["OP14-061",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"vergo-target",min:0,max:1,effect:{kind:"modify-power",binding:"vergo-target",amount:-2e3,expiresAfterTurns:0}}]}}}}]],activateMain:[["OP12-061",{oncePerTurn:true,requires:{fieldDon:1,handCardsMatching:{match:{category:"character",name:"Trafalgar Law",minBaseCost:4},count:1}},program:{effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"discount-next-play",player:"self",name:"Trafalgar Law",minCost:4,amount:2}]}}}],["OP10-065",{oncePerTurn:false,requires:{activeDon:1},program:{effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"optional",effect:{kind:"update",binding:SOURCE_BINDING,rested:true}},lookAndAdd(5,"sugar-looked",{type:"Donquixote Pirates"}).effect]}}}],["EB03-062",{oncePerTurn:false,requires:{handCards:1},program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"law-discard",min:1,max:1,effect:{kind:"move",binding:"law-discard",to:{player:"self",zone:"trash"}}},{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"law-life",count:1,effect:{kind:"move",binding:"law-life",to:{player:"self",zone:"life",position:"top"}}},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",name:"Trafalgar Law",maxCost:7},bind:"law-cheat",min:0,max:1,effect:{kind:"play",binding:"law-cheat"}}]}}}]],onPlay:[["OP09-069",lookAndAdd(4,"op09-law-looked",{anyOf:[{type:"Straw Hat Crew"},{type:"Heart Pirates"}],minCost:2})],["OP12-108",lookAndAdd(5,"op12-rosi-looked",{name:"Trafalgar Law"})],["OP12-073",{effect:{kind:"if",condition:{kind:"field-don-versus",player:"self",operator:"lte"},then:{kind:"sequence",effects:[{kind:"add-don",player:"self",count:1,rested:false},{kind:"select",selector:{player:"self",zone:"board",category:"character",anyOf:[{name:"Donquixote Rosinante"},{type:"Heart Pirates"}]},bind:"op12-073-buff",count:"all",effect:{kind:"modify-power",binding:"op12-073-buff",amount:1e3,expiresAfterTurns:1}}]}}}],["EB04-038",{effect:{kind:"sequence",effects:[{kind:"if",condition:{kind:"field-don-versus",player:"self",operator:"lte"},then:{kind:"draw",player:"self",count:1}},{kind:"add-don",player:"self",count:1,rested:false}]}}],["ST10-010",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:7},then:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},trashFromOpponentHandBlind(2,"law-hand-trash")]}}}}}]],trigger:[["OP12-112",{effect:{kind:"if",condition:{kind:"leader-multicolored",player:"self"},then:{kind:"draw",player:"self",count:2}}}],["OP12-077",{effect:{kind:"draw",player:"self",count:1}}]]};var sourceAtFivePower={kind:"source-current-power",operator:"gte",value:5e3};var costZeroOrEightPlusBody={kind:"any-of",conditions:[{kind:"selector-count",player:"either",selector:{zone:"board",category:"character",maxCost:0},operator:"gte",value:1},{kind:"selector-count",player:"either",selector:{zone:"board",category:"character",minCost:8},operator:"gte",value:1}]};var kujaTriggerPlay={effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Kuja Pirates"},then:{kind:"play",binding:SOURCE_BINDING}}};var playTriggerBodyFromHand={effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxPower:6e3,hasTrigger:true},bind:"op14-trigger-body",min:0,max:1,effect:{kind:"play",binding:"op14-trigger-body"}}};var topDeckToLife={kind:"optional",effect:{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"op14-deck-to-life",count:"all",effect:{kind:"move",binding:"op14-deck-to-life",to:{player:"self",zone:"life",position:"top"}}}};var opponentLifeToHand={kind:"select",selector:{player:"opponent",zone:"life",position:"top"},bind:"op14-life-strip",count:"all",effect:{kind:"move",binding:"op14-life-strip",to:{player:"opponent",zone:"hand"}}};var debuffOneOpponentCharacter=(amount,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind,min:0,max:1,effect:{kind:"modify-power",binding:bind,amount,expiresAfterTurns:0}});var conditionalCounterPower=amount=>({kind:"battle-power",player:"self",amount});var op14BattleMechanics={counterEvent:[["OP14-018",{cost:1,power:0,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"either",selector:{zone:"board",category:"character",minCurrentPower:8e3},operator:"gte",value:1},then:conditionalCounterPower(4e3)}}}],["OP14-036",{cost:1,power:0,program:{effect:{kind:"optional",effect:{kind:"choose",selector:restableCards("self"),bind:"op14-surpass-counter",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:"op14-surpass-counter"},conditionalCounterPower(4e3)]}}}}}],["OP14-037",{cost:1,power:3e3,target:{isLeader:true}}],["OP14-038",{cost:1,power:3e3,target:{isLeader:true}}],["OP14-058",{cost:2,power:3e3,target:{isLeader:true},program:{effect:{kind:"draw",player:"self",count:1}}}],["OP14-076",{cost:1,power:3e3,target:{isLeader:true}}],["OP14-077",{cost:2,power:4e3,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",minCurrentPower:6e3},operator:"gte",value:1},then:{kind:"add-don",player:"self",count:1,rested:true}}}}],["OP14-078",{cost:2,power:0,program:{effect:donMinus(1,{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Donquixote Pirates"},then:{kind:"sequence",effects:[conditionalCounterPower(2e3),{kind:"bind-battle-target",player:"self",bind:"op14-bullet-target",effect:{kind:"modify-power",binding:"op14-bullet-target",amount:2e3,expiresAfterTurns:0}}]}})}}],["OP14-096",{cost:1,power:0,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:10},then:conditionalCounterPower(4e3)}}}],["OP14-098",{cost:1,power:3e3,target:{isLeader:true}}],["OP14-116",{cost:4,power:2e3,program:{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:4,anyOf:[{type:"Amazon Lily"},{type:"Kuja Pirates"}]},bind:"op14-salamander-play",min:0,max:1,effect:{kind:"play",binding:"op14-salamander-play"}}}}],["OP14-117",{cost:1,power:3e3,target:{type:"Thriller Bark Pirates"}}],["OP14-118",{cost:1,power:0,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:false},bind:"op14-frighten",min:0,max:1,effect:{kind:"restrict",binding:"op14-frighten",restriction:"cannot-attack",expiresAfterTurns:0}}}}}]],onOpponentAttack:[["OP14-009",{oncePerTurn:true,requires:{handCards:2},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op14-law009-cost",2,{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"op14-law009-leader",count:"all",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op14-law009-body",min:1,max:1,effect:{kind:"swap-base-power",first:"op14-law009-leader",second:"op14-law009-body",scope:"battle"}}})}}}],["OP14-060",{oncePerTurn:true,requires:{fieldDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,excludeAttackTarget:true,anyOf:[{type:"Donquixote Pirates"},{category:"leader"}]},bind:"op14-doffy-redirect",min:1,max:1,effect:{kind:"redirect-attack",binding:"op14-doffy-redirect"}}]}}}}],["OP14-119",{oncePerTurn:true,requires:{handCards:1},program:trashForBattlePower(2e3,"op14-mihawk119-cost")}]],whenAttacking:[["OP14-002",{effect:{kind:"if",condition:sourceAtFivePower,then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:3e3},bind:"op14-urouge-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op14-urouge-ko"}}]}}}],["OP14-006",{effect:{kind:"if",condition:sourceAtFivePower,then:debuffOneOpponentCharacter(-2e3,"op14-shachi-debuff")}}],["OP14-012",{effect:{kind:"if",condition:sourceAtFivePower,then:{kind:"give-rested-don",player:"self",count:2}}}],["OP14-013",{effect:debuffOneOpponentCharacter(-1e3,"op14-luffy013-debuff")}],["OP14-016",{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:debuffOneOpponentCharacter(-2e3,"op14-drake-debuff")}}],["OP14-080",{oncePerTurn:false,requires:{handCards:3},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op14-moria-attack-cost",3,topDeckToLife)}}}]],whenRested:[["OP14-021",{yourTurnOnly:true,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top"},bind:"op14-issho-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op14-issho-life",to:{player:"self",zone:"hand"}},paidToHand("op14-issho-life",[{kind:"choose",selector:{player:"opponent",zone:["board","stage"],rested:true},bind:"op14-issho-lock",min:0,max:1,effect:{kind:"restrict",binding:"op14-issho-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}])]}}}}}],["OP14-027",{yourTurnOnly:true,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:7e3,canRest:true},bind:"op14-shanks-rest",min:0,max:1,effect:{kind:"rest",binding:"op14-shanks-rest"}}}}],["OP14-028",{yourTurnOnly:true,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:2},bind:"op14-johnny-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op14-johnny-ko"}}}}],["OP14-032",{yourTurnOnly:true,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4,canRest:true},bind:"op14-humandrill-rest",min:0,max:1,effect:{kind:"rest",binding:"op14-humandrill-rest"}}}}],["OP14-035",{yourTurnOnly:true,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:4},bind:"op14-yosaku-lock",min:0,max:1,effect:{kind:"restrict",binding:"op14-yosaku-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}}}],["OP14-070",{yourTurnOnly:false,source:"opponent-character-effect",program:{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"update",binding:SOURCE_BINDING,rested:false}]}}}}}],["OP14-119",{yourTurnOnly:true,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:9},bind:"op14-mihawk119-lock",min:0,max:1,effect:{kind:"restrict",binding:"op14-mihawk119-lock",restriction:"cannot-rest",expiresAfterTurns:1}}}}]]};var op14ReplacementMechanics={replacement:[["OP14-016",{opponentEffectOnly:true,opponentTurnOnly:true,oncePerTurn:true,protects:{category:"character",type:"Supernovas"},label:"Leader takes −2000",cost:{kind:"leader-power-penalty",amount:-2e3}}],["OP14-029",{opponentEffectOnly:true,opponentTurnOnly:true,oncePerTurn:false,label:"Rest 1 of your cards",cost:{kind:"rest-own-cards",count:1}}],["OP14-034",{opponentEffectOnly:true,oncePerTurn:true,protects:{category:"character",type:"Straw Hat Crew"},label:"Rest one of yours",cost:{kind:"rest-own-cards",count:1,match:{category:"character"}}}],["OP14-092",{opponentEffectOnly:false,opponentTurnOnly:true,oncePerTurn:true,label:"Bottom-deck 3 from trash",cost:{kind:"bury-from-trash",count:3}}]]};var restOwnCards=(count2,bind,effect)=>({kind:"optional",effect:{kind:"choose",selector:restableCards("self"),bind,min:count2,max:count2,effect:{kind:"sequence",effects:[{kind:"rest",binding:bind},effect]}}});var op14EventPrograms={"OP14-097":lookAndAddOrTrash(3,"op14-pirate-king",{type:"Thriller Bark Pirates",excludeName:"Hurry Up and Make Me the Pirate King!"}),"OP14-099":lookAndAddOrTrash(3,"op14-disappointed",{typeIncluding:"Baroque Works",excludeName:"Disappointed?"})};var op14MainMechanics={eventMain:[["OP14-017",{cost:3,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:9e3},bind:"op14-chambres",min:2,max:2,effect:{kind:"swap-base-power",first:"op14-chambres",scope:"turn"}}}}],["OP14-019",{cost:1,program:lookAndAdd(4,"op14-plan",{category:"character",anyOf:[{type:"Supernovas"},{type:"Straw Hat Crew"}]})}],["OP14-037",{cost:1,program:{effect:restOwnCards(3,"op14-forfun-cost",{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxPower:7e3},bind:"op14-forfun-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op14-forfun-ko"}})}}],["OP14-038",{cost:1,program:{effect:restOwnCards(2,"op14-faces-cost",{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:7e3,canRest:true},bind:"op14-faces-rest",min:0,max:1,effect:{kind:"rest",binding:"op14-faces-rest"}}]})}}],["OP14-057",{cost:2,program:{effect:{kind:"select",selector:{player:"self",zone:"board",includeLeader:true,anyOf:[{type:"Fish-Man"},{type:"Merfolk"}]},bind:"op14-dontworry",count:"all",effect:{kind:"modify-power",binding:"op14-dontworry",amount:1e3,expiresAfterTurns:0}}}}],["OP14-058",{cost:2,restDon:3,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Fish-Man",maxCost:3},bind:"op14-throw-play",min:0,max:1,effect:{kind:"play",binding:"op14-throw-play"}},{kind:"choice",branches:[{id:"theirs",label:"Return 1 of your opponent's 6000-power Characters",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",minPower:6e3,maxPower:6e3},bind:"op14-throw-theirs",min:1,max:1,effect:{kind:"move",binding:"op14-throw-theirs",to:{player:"opponent",zone:"hand"}}}},{id:"own",label:"Return 1 of your 6000-power Characters",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",minPower:6e3,maxPower:6e3},bind:"op14-throw-own",min:1,max:1,effect:{kind:"move",binding:"op14-throw-own",to:{player:"self",zone:"hand"}}}},{id:"none",label:"Return nothing"}]}]}}}],["OP14-059",{cost:1,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Jinbe"},then:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:2},then:{kind:"draw",player:"self",count:2}}}}}],["OP14-076",{cost:1,restDon:2,program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Donquixote Pirates"},then:{kind:"add-don",player:"self",count:1,rested:true}}}}],["OP14-096",{cost:1,restDon:2,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"op14-grounddeath",min:0,max:1,effect:{kind:"negate",binding:"op14-grounddeath",expiresAfterTurns:0}}}}],["OP14-097",{cost:1,program:op14EventPrograms["OP14-097"]}],["OP14-098",{cost:1,program:{effect:{kind:"if",condition:costZeroOrEightPlusBody,then:{kind:"select",selector:{player:"self",zone:"board",category:"character",typeIncluding:"Baroque Works"},bind:"op14-cutlass",count:"all",effect:{kind:"modify-cost",binding:"op14-cutlass",amount:3,expiresAfterTurns:1}}}}}],["OP14-099",{cost:1,program:op14EventPrograms["OP14-099"]}]],activateMain:[["OP14-001",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",anyOf:[{type:"Supernovas"},{type:"Heart Pirates"}]},operator:"gte",value:2},then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",anyOf:[{type:"Supernovas"},{type:"Heart Pirates"}]},bind:"op14-law-swap",min:2,max:2,effect:{kind:"swap-base-power",first:"op14-law-swap",scope:"turn"}}}}}],["OP14-005",{oncePerTurn:true,program:{effect:{kind:"give-rested-don",player:"self",count:1}}}],["OP14-020",{oncePerTurn:true,program:{effect:restOwnCards(1,"op14-mihawk-cost",{kind:"if",condition:{kind:"selector-count",player:"either",selector:{zone:"board",category:"character",minCost:5},operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"activate-don",player:"self",count:3},{kind:"restrict-player",player:"self",restriction:"cannot-play-characters",expiresAfterTurns:0}]}})}}],["OP14-029",{oncePerTurn:true,program:{effect:restOwnCards(2,"op14-tashigi-cost",{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:1})}}],["OP14-040",{oncePerTurn:false,requires:{handCards:1},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op14-jinbe-leader-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op14-jinbe-leader-cost",to:{player:"self",zone:"trash"}},{kind:"give-rested-don",player:"self",count:2,anyOfTypes:["Fish-Man","Merfolk"]}]}}}}}],["OP14-046",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,anyOf:[{type:"Fish-Man"},{type:"Merfolk"}]},bind:"op14-koala-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op14-koala-buff",amount:2e3,expiresAfterTurns:0}}]}}}}],["OP14-079",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",typeIncluding:"Baroque Works"},operator:"gte",value:1},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",typeIncluding:"Baroque Works"},bind:"op14-croc-leader-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"knock-out",binding:"op14-croc-leader-cost"},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op14-croc-leader-cost-down",min:0,max:1,effect:{kind:"modify-cost",binding:"op14-croc-leader-cost-down",amount:-10,expiresAfterTurns:0}},{kind:"optional",effect:{kind:"trash-top",player:"self",count:2}}]}}}}}}],["OP14-080",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"Thriller Bark Pirates"},operator:"gte",value:1},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Thriller Bark Pirates"},bind:"op14-moria-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"knock-out",binding:"op14-moria-cost"},{kind:"select",selector:{player:"self",zone:"board",includeLeader:true},bind:"op14-moria-buff",count:"all",effect:{kind:"modify-power",binding:"op14-moria-buff",amount:1e3,expiresAfterTurns:0}}]}}}}}}],["OP14-083",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",maxCost:0},operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:0},bind:"op14-wednesday",min:0,max:1,effect:{kind:"modify-power",binding:"op14-wednesday",amount:-3e3,expiresAfterTurns:0}}]}}}}}],["OP14-105",{oncePerTurn:true,requires:{handCardsMatching:{match:{anyOf:[{type:"Amazon Lily"},{type:"Kuja Pirates"}]},count:3}},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand",anyOf:[{type:"Amazon Lily"},{type:"Kuja Pirates"}]},bind:"op14-gorgon-reveal",min:3,max:3,effect:{kind:"sequence",effects:[{kind:"reveal",binding:"op14-gorgon-reveal"},{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"},{kind:"select",selector:{player:"self",zone:"board",category:"character"},bind:"op14-gorgon-board",count:"all",effect:{kind:"attach-don",player:"self",from:"rested",count:1,target:{binding:"op14-gorgon-board",each:true}}}]}}}}}],["OP14-114",{oncePerTurn:true,program:{effect:{kind:"give-rested-don",player:"self",count:1,type:"Kuja Pirates"}}}]]};var restOwnCharacters2=(count2,bind,effect)=>({kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",canRest:true},bind,min:count2,max:count2,effect:{kind:"sequence",effects:[{kind:"rest",binding:bind},effect]}}});var op14MihawkMechanics={onPlay:[["OP07-022",lookAndAdd(5,"op07-otama",{color:"Green",type:"Land of Wano",excludeName:"Otama"})],["OP12-034",{effect:{kind:"if",condition:{kind:"leader-has-attribute",player:"self",attribute:"Slash"},then:lookAndAdd(5,"op12-perona",{anyOf:[{attribute:"Slash"},{color:"Green",category:"event"}]}).effect}}],["ST24-004",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"st24-lawbepo-rest",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:"st24-lawbepo-rest"},{kind:"restrict",binding:"st24-lawbepo-rest",restriction:"cannot-refresh",expiresAfterTurns:1}]}},{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",rested:true},operator:"gte",value:2},then:{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"st24-lawbepo-leader",count:"all",effect:{kind:"modify-power",binding:"st24-lawbepo-leader",amount:2e3,expiresAfterTurns:1}}}]}}],["OP06-033",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"selector-count",player:"self",selector:{zone:["hand","stage"],anyOf:[{type:"Fish-Man"},{name:"The Ark Noah"}]},operator:"gte",value:1},{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",rested:true},operator:"gte",value:1}]},then:{kind:"optional",effect:payFromHand({player:"self",zone:["hand","stage"],anyOf:[{type:"Fish-Man"},{name:"The Ark Noah"}]},"op06-decken-cost",1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true},bind:"op06-decken-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op06-decken-ko"}})}}}],["OP06-035",{effect:{kind:"sequence",effects:[{kind:"rest-opponent-cards",player:"opponent",count:2},{kind:"select",selector:{player:"self",zone:"life",position:"edge"},bind:"op06-hody-life",count:1,effect:{kind:"move",binding:"op06-hody-life",to:{player:"self",zone:"hand"}}}]}}]],eventMain:[["OP01-055",{cost:1,program:{effect:restOwnCharacters2(2,"op01-samurai-cost",{kind:"draw",player:"self",count:2})}}],["OP08-036",{cost:3,program:{effect:{kind:"select",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:7},bind:"op08-luna-lock",count:"all",effect:{kind:"restrict",binding:"op08-luna-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}}}]],counterEvent:[["OP06-038",{cost:1,power:2e3,program:{effect:{kind:"if",condition:{kind:"rested-cards",player:"self",operator:"gte",value:8},then:{kind:"battle-power",player:"self",amount:2e3}}}}]],trigger:[["OP06-038",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:3},bind:"op06-trichiliocosm-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op06-trichiliocosm-ko"}}}],["OP08-036",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",canRest:true},bind:"op08-luna-trigger",min:0,max:1,effect:{kind:"rest",binding:"op08-luna-trigger"}}}]]};var op14OnPlayMechanics={onPlay:[["OP14-013",lookAndAdd(5,"op14-luffy013",{type:"Supernovas",excludeName:"Monkey.D.Luffy"})],["OP14-014",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Supernovas"},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",color:"Red",maxPower:2e3},bind:"op14-kid-play",min:0,max:1,effect:{kind:"play",binding:"op14-kid-play"}}}}],["OP14-024",{effect:{kind:"sequence",effects:[{kind:"activate-don",player:"self",count:3},{kind:"restrict-player",player:"self",restriction:"cannot-play-characters",expiresAfterTurns:0}]}}],["OP14-025",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Kuro"},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"East Blue",maxCost:6},bind:"op14-kuro-play",min:0,max:1,effect:{kind:"play",binding:"op14-kuro-play"}}}}],["OP14-031",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:8,canRest:true},bind:"op14-nami-rest",min:0,max:2,effect:{kind:"rest",binding:"op14-nami-rest"}},{kind:"activate-don-at-end-of-turn",player:"self",count:5}]}}],["OP14-033",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"op14-perona033-lock",min:0,max:2,effect:{kind:"restrict",binding:"op14-perona033-lock",restriction:"cannot-rest",expiresAfterTurns:1}}}],["OP14-039",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Dracule Mihawk"},then:{kind:"draw",player:"self",count:1}}}],["OP14-042",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Fish-Man"},then:lookAndAdd(4,"op14-arlong",{minCost:2}).effect}}],["OP14-043",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:3,anyOf:[{type:"Fish-Man"},{type:"Merfolk"}]},bind:"op14-aladine-play",min:0,max:1,effect:{kind:"play",binding:"op14-aladine-play"}}}],["OP14-044",{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:1,bind:"op14-wb-top"},{kind:"select",selector:{player:"self",zone:"deck",binding:"op14-wb-top"},bind:"op14-wb-show",count:"all",effect:{kind:"reveal",binding:"op14-wb-show"}},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"deck",binding:"op14-wb-top",typeIncluding:"Whitebeard Pirates"},operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op14-wb-discard",min:1,max:1,effect:{kind:"move",binding:"op14-wb-discard",to:{player:"self",zone:"trash"}}}]}}]}}],["OP14-047",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:3,anyOf:[{type:"Fish-Man"},{type:"Merfolk"}]},bind:"op14-shirahoshi-play",min:0,max:1,effect:{kind:"play",binding:"op14-shirahoshi-play"}}]}}],["OP14-048",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op14-shiryu-bounce",min:0,max:1,effect:{kind:"move",binding:"op14-shiryu-bounce",to:{player:"opponent",zone:"hand"}}},{kind:"select",selector:{player:"self",zone:"hand"},bind:"op14-shiryu-dump",count:"all",effect:{kind:"move",binding:"op14-shiryu-dump",to:{player:"self",zone:"trash"}}}]}}],["OP14-049",{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:2},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:2},{kind:"draw",player:"self",count:2},{kind:"choice",branches:[{id:"own",label:"Bounce one of yours",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",maxCost:7},bind:"op14-jinbe-own",min:0,max:1,effect:{kind:"move",binding:"op14-jinbe-own",to:{player:"self",zone:"hand"}}}},{id:"theirs",label:"Return 1 of your opponent's Characters",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:7},bind:"op14-jinbe-theirs",min:0,max:1,effect:{kind:"move",binding:"op14-jinbe-theirs",to:{player:"opponent",zone:"hand"}}}},{id:"none",label:"Return nothing"}]}]}}}}],["OP14-050",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Fish-Man"},then:{kind:"draw",player:"self",count:1}}}],["OP14-052",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op14-hannyabal-cost",min:3,max:3,effect:{kind:"sequence",effects:[{kind:"move",binding:"op14-hannyabal-cost",to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Impel Down",maxCost:6},bind:"op14-hannyabal-play",min:0,max:1,effect:{kind:"play",binding:"op14-hannyabal-play"}}]}}}}],["OP14-054",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Fish-Man"},then:{kind:"draw",player:"self",count:3}}}],["OP14-063",{effect:{kind:"add-don",player:"self",count:1,rested:false}}],["OP14-069",{effect:donMinus(3,{kind:"choice",branches:[{id:"ko",label:"K.O. 1 Character with a cost of 8 or less",effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Donquixote Pirates"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:8},bind:"op14-doflamingo-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op14-doflamingo-ko"}}}},{id:"lock",label:"Lock 3 Characters with a cost of 7 or less",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:7},bind:"op14-doflamingo-lock",min:0,max:3,effect:{kind:"restrict",binding:"op14-doflamingo-lock",restriction:"cannot-rest",expiresAfterTurns:1}}}]})}],["OP14-072",{effect:{kind:"add-don",player:"self",count:1,rested:false}}],["OP14-074",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Donquixote Pirates"},then:{kind:"add-don",player:"self",count:1,rested:false}}}],["OP14-081",{effect:{kind:"trash-top",player:"self",count:3}}],["OP14-084",{effect:{kind:"if",condition:{kind:"leader-type-including",player:"self",text:"Baroque Works"},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"trash",category:"character",typeIncluding:"Baroque Works",maxCost:4},bind:"op14-sunday-four",min:0,max:1,effect:{kind:"play",binding:"op14-sunday-four"}},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",typeIncluding:"Baroque Works",minCost:1,maxCost:1},bind:"op14-sunday-one",min:0,max:1,effect:{kind:"play",binding:"op14-sunday-one"}}]}}}],["OP14-087",{effect:{kind:"if",condition:{kind:"leader-type-including",player:"self",text:"Baroque Works"},then:lookAndAddOrTrash(4,"op14-valentine",{typeIncluding:"Baroque Works",excludeName:"Miss.Valentine(Mikita)"}).effect}}],["OP14-090",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:0,canRest:true},bind:"op14-mr1-rest",min:0,max:1,effect:{kind:"rest",binding:"op14-mr1-rest"}}}],["OP14-094",{effect:{kind:"if",condition:costZeroOrEightPlusBody,then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op14-mr5-discard",min:1,max:1,effect:{kind:"move",binding:"op14-mr5-discard",to:{player:"self",zone:"trash"}}}]}}}],["OP14-103",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"edge"},bind:"op14-gloriosa-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op14-gloriosa-cost",to:{player:"self",zone:"hand"}},paidToHand("op14-gloriosa-cost",[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op14-gloriosa-back",min:0,max:1,effect:{kind:"move",binding:"op14-gloriosa-back",to:{player:"self",zone:"life",position:"top"}}}])]}}}}],["OP14-107",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:3},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op14-shakuyaku-discard",min:2,max:2,effect:{kind:"move",binding:"op14-shakuyaku-discard",to:{player:"self",zone:"trash"}}}]}}}],["OP14-112",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"The Seven Warlords of the Sea"},then:{kind:"sequence",effects:[topDeckToLife,opponentLifeToHand]}}}],["OP14-113",{effect:{kind:"sequence",effects:[lookAndAdd(5,"op14-marguerite",{anyOf:[{type:"Amazon Lily"},{type:"Kuja Pirates"}]}).effect,{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op14-marguerite-discard",min:1,max:1,effect:{kind:"move",binding:"op14-marguerite-discard",to:{player:"self",zone:"trash"}}}]}}],["OP14-120",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:9},bind:"op14-croc-lock",min:0,max:1,effect:{kind:"restrict",binding:"op14-croc-lock",restriction:"cannot-attack",expiresAfterTurns:1}},{kind:"if",condition:{kind:"any-of",conditions:[{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",maxCost:0},operator:"gte",value:1},{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",minCost:8},operator:"gte",value:1}]},then:{kind:"draw",player:"self",count:1}}]}}]]};var drawThenDiscard=(draw,discard)=>({kind:"sequence",effects:[{kind:"draw",player:"self",count:draw},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op14-draw-discard",min:discard,max:discard,effect:{kind:"move",binding:"op14-draw-discard",to:{player:"self",zone:"trash"}}}]});var addRestedDon2={kind:"add-don",player:"self",count:1,rested:true};var op14TriggerMechanics={trigger:[["OP14-018",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",color:"Red",maxPower:2e3},bind:"op14-counterattack-play",min:0,max:1,effect:{kind:"play",binding:"op14-counterattack-play"}}}],["OP14-019",{effect:{kind:"draw",player:"self",count:1}}],["OP14-036",{effect:{kind:"optional",effect:{kind:"choose",selector:restableCards("self"),bind:"op14-surpass-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:"op14-surpass-cost"},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:7e3,canRest:true},bind:"op14-surpass-rest",min:0,max:1,effect:{kind:"rest",binding:"op14-surpass-rest"}}]}}}}],["OP14-057",{effect:{kind:"draw",player:"self",count:2}}],["OP14-059",{effect:{kind:"choice",branches:[{id:"theirs",label:"Return 1 of your opponent's Characters",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"op14-help-theirs",min:1,max:1,effect:{kind:"move",binding:"op14-help-theirs",to:{player:"opponent",zone:"hand"}}}},{id:"own",label:"Bounce one of yours",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",maxCost:4},bind:"op14-help-own",min:1,max:1,effect:{kind:"move",binding:"op14-help-own",to:{player:"self",zone:"hand"}}}},{id:"none",label:"Return nothing"}]}}],["OP14-082",playThrillerBarkFromTrashRested],["OP14-089",playThrillerBarkFromTrashRested],["OP14-100",playThrillerBarkFromTrashRested],["OP14-109",playThrillerBarkFromTrashRested],["OP14-117",playThrillerBarkFromTrashRested],["OP14-097",op14EventPrograms["OP14-097"]],["OP14-099",op14EventPrograms["OP14-099"]],["OP14-103",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP14-106",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP14-105",kujaTriggerPlay],["OP14-107",kujaTriggerPlay],["OP14-113",kujaTriggerPlay],["OP14-114",kujaTriggerPlay],["OP14-115",kujaTriggerPlay],["OP14-112",playTriggerBodyFromHand],["OP14-118",playTriggerBodyFromHand],["OP14-116",{effect:{kind:"draw",player:"self",count:1}}]],onKo:[["OP14-010",{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind:"op14-hawkins"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"op14-hawkins",category:"character",type:"Supernovas",maxPower:2e3,excludeName:"Basil Hawkins"},bind:"op14-hawkins-play",min:0,max:1,effect:{kind:"play",binding:"op14-hawkins-play"}},{kind:"select",selector:{player:"self",zone:"deck",binding:"op14-hawkins"},bind:"op14-hawkins-rest",count:"all",effect:{kind:"order-to-bottom",binding:"op14-hawkins-rest",to:{player:"self",zone:"deck",position:"bottom"}}}]}}],["OP14-024",{effect:{kind:"choose",selector:restableCards("opponent"),bind:"op14-kinemon-rest",min:0,max:1,effect:{kind:"rest",binding:"op14-kinemon-rest"}}}],["OP14-033",{effect:{kind:"optional",effect:{kind:"choose",selector:restableCards("self"),bind:"op14-perona033-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:"op14-perona033-cost"},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",color:"Green",maxCost:5},bind:"op14-perona033-play",min:0,max:1,effect:{kind:"play",binding:"op14-perona033-play"}}]}}}}],["OP14-043",{effect:{kind:"draw",player:"self",count:1}}],["OP14-045",{effect:{kind:"draw",player:"self",count:1}}],["OP14-051",{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:2},then:{kind:"draw",player:"self",count:1}}}],["OP14-062",{effect:donMinus(1,{kind:"choice",branches:[{id:"ko",label:"K.O. 1 Character with 6000 base power or less",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:6e3},bind:"op14-gladius-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op14-gladius-ko"}}},{id:"rest",label:"Rest 1 Character with 6000 base power or less",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:6e3,canRest:true},bind:"op14-gladius-rest",min:0,max:1,effect:{kind:"rest",binding:"op14-gladius-rest"}}}]})}],["OP14-063",{effect:{kind:"if",condition:{kind:"field-don",player:"opponent",operator:"gte",value:6},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Donquixote Pirates",maxCost:5},bind:"op14-sugar-play",min:0,max:1,effect:{kind:"play",binding:"op14-sugar-play"}}}}],["OP14-064",{effect:{kind:"sequence",effects:[addRestedDon2,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",minPower:0,maxPower:0},bind:"op14-giolla-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op14-giolla-ko"}}]}}],["OP14-065",{effect:{kind:"return-don",player:"opponent",count:1}}],["OP14-067",{effect:{kind:"sequence",effects:[addRestedDon2,lookAndAdd(5,"op14-dellinger",{type:"Donquixote Pirates"}).effect]}}],["OP14-072",{effect:donMinus(1,topDeckToLife)}],["OP14-074",{effect:{kind:"sequence",effects:[drawThenDiscard(2,1),{kind:"add-don",player:"self",count:2,rested:true}]}}],["OP14-075",{effect:{kind:"sequence",effects:[addRestedDon2,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op14-laog-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op14-laog-debuff",amount:-2e3,expiresAfterTurns:0}}]}}],["OP14-081",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",minBaseCost:1,maxBaseCost:1},bind:"op14-spidermice-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op14-spidermice-ko"}}}],["OP14-082",{effect:{kind:"select",selector:{player:"self",zone:"board",category:"character",type:"Thriller Bark Pirates"},bind:"op14-oinkchuck",count:"all",effect:{kind:"modify-cost",binding:"op14-oinkchuck",amount:4,expiresAfterTurns:1}}}],["OP14-085",{effect:drawThenDiscard(2,2)}],["OP14-088",{effect:{kind:"if",condition:{kind:"leader-type-including",player:"self",text:"Baroque Works"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"stage",minCost:1,maxCost:1},bind:"op14-merry-stage",min:0,max:1,effect:{kind:"knock-out",binding:"op14-merry-stage"}}]}}}],["OP14-089",{effect:drawThenDiscard(2,2)}],["OP14-091",{effect:{kind:"choose",selector:{player:"self",zone:["hand","trash"],category:"character",typeIncluding:"Baroque Works",maxCost:5,excludeName:"Mr.2.Bon.Kurei(Bentham)"},bind:"op14-bentham-play",min:0,max:1,effect:{kind:"play",binding:"op14-bentham-play"}}}],["OP14-093",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",typeIncluding:"Baroque Works",maxCost:8},bind:"op14-babe-recur",min:0,max:1,effect:{kind:"move",binding:"op14-babe-recur",to:{player:"self",zone:"hand"}}}}],["OP14-100",lookAndAdd(3,"op14-absalom",{type:"Thriller Bark Pirates"})],["OP14-115",{effect:{kind:"if",condition:{kind:"turn-player",player:"opponent"},then:{kind:"sequence",effects:[topDeckToLife,{kind:"deal-damage",player:"self"}]}}}],["OP14-120",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op14-croc-cost",1,{kind:"play",binding:SOURCE_BINDING})}}]],onEndOfYourTurn:[["OP14-022",{effect:{kind:"if",condition:{kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"FILM"},{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"}]},then:{kind:"activate-don",player:"self",count:2}}}],["OP14-023",{effect:{kind:"update",binding:SOURCE_BINDING,rested:false}}],["OP14-039",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Dracule Mihawk"},then:{kind:"activate-don",player:"self",count:1}}}],["OP14-054",{effect:{kind:"trash-hand-down-to",player:"self",size:5}}],["OP14-071",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Donquixote Pirates"},then:{kind:"add-don",player:"self",count:1,rested:false}}}]]};var amazonDebuff={kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"op15-amazon-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op15-amazon-debuff",amount:-2e3,expiresAfterTurns:0}};var lucyTrashForPower={effect:{kind:"choose",selector:{player:"self",zone:"hand",anyOf:[{category:"event"},{category:"stage"}]},bind:"op15-lucy-pitch",min:0,max:10,effect:{kind:"sequence",effects:[{kind:"move",binding:"op15-lucy-pitch",to:{player:"self",zone:"trash"}},{kind:"battle-power",player:"self",amount:1e3,perCard:"op15-lucy-pitch",target:{isLeader:true}}]}}};var op15BattleMechanics={onOpponentAttack:[["OP15-002",{oncePerTurn:false,requires:{handCards:1},program:lucyTrashForPower}],["OP15-057",{oncePerTurn:false,requires:{sourceActive:true,handCardsOfCategory:{categories:["event","stage"],count:1}},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"hand",anyOf:[{category:"event"},{category:"stage"}]},bind:"op15-dressrosa-cost",min:1,max:1,effect:{kind:"move",binding:"op15-dressrosa-cost",to:{player:"self",zone:"trash"}}},{kind:"battle-power",player:"self",amount:2e3}]}}}}],["OP15-059",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:{kind:"active-don",player:"opponent",operator:"gte",value:1},then:{kind:"choice",chooser:"opponent",branches:[{id:"return-don",label:"Return 1 active DON!! to your DON!! deck",effect:{kind:"return-don",player:"opponent",count:1}},{id:"take-debuff",label:"Keep your DON!! and take −2000 power",effect:amazonDebuff}]},else:amazonDebuff}]}}}}]],whenAttacking:[["OP15-002",lucyTrashForPower],["OP15-005",{effect:{kind:"if",condition:{kind:"given-don",player:"opponent",operator:"gte",value:1},then:{kind:"modify-power",binding:"source",amount:2e3,expiresAfterTurns:0}}}],["OP15-012",{effect:{kind:"give-rested-don",player:"self",count:1,eitherOwner:true}}],["OP15-111",{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name:"Kalgara"},bind:"op15-noland-rush",min:0,max:1,effect:{kind:"grant-keyword",binding:"op15-noland-rush",keyword:"Rush",expiresAfterTurns:0}}}}],["OP15-018",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:3e3,minGivenDon:1},bind:"op15-mohji-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op15-mohji-ko"}}}]]};var embarrassingLock={effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:10},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:5},bind:"op15-embarrassing-lock",min:0,max:1,effect:{kind:"restrict",binding:"op15-embarrassing-lock",restriction:"cannot-attack",expiresAfterTurns:1}}}};var impactDialKo={kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"op15-impact-dial-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op15-impact-dial-ko"}};var absalomRecursion={effect:{kind:"choose",selector:{player:"self",zone:"trash",type:"Thriller Bark Pirates"},bind:"op15-absalom-recur",min:0,max:1,effect:{kind:"move",binding:"op15-absalom-recur",to:{player:"self",zone:"hand"}}}};var aceDebuff={effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op15-ace-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op15-ace-debuff",amount:-3e3,expiresAfterTurns:0}}};var OPPONENT_CAN_PAY_DON_PRICE={kind:"all-of",conditions:[{kind:"rested-don",player:"opponent",operator:"gte",value:1},{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character"},operator:"gte",value:1}]};var op15MainMechanics={activateMain:[["OP15-032",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"},then:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"self",zone:"board",category:"character",maxBaseCost:8,rested:true},bind:"op15-brook-active",min:0,max:1,effect:{kind:"update",binding:"op15-brook-active",rested:false}}]}}}}],["OP15-008",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"source-played-this-turn"},then:{kind:"select",selector:{player:"opponent",zone:"board",category:"character",remembered:true},bind:"op15-krieg-marked",count:"all",effect:{kind:"select",selector:{player:"opponent",zone:"board",category:"character"},bind:"op15-krieg-sweep",count:"all",effect:{kind:"modify-power",binding:"op15-krieg-sweep",amount:-1e3,perGivenDonOf:"op15-krieg-marked",expiresAfterTurns:0}}}}}}],["OP15-010",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"any-of",conditions:[{kind:"rested-don",player:"self",operator:"gte",value:1},{kind:"rested-don",player:"opponent",operator:"gte",value:1}]},then:{kind:"give-rested-don",player:"self",count:1,eitherOwner:true}}}}],["OP15-001",{oncePerTurn:true,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",minGivenDon:2,canRest:true},bind:"op15-krieg-rest",min:0,max:1,effect:{kind:"rest",binding:"op15-krieg-rest"}}}}],["OP15-093",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:15},then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",name:"Monkey.D.Luffy"},bind:"op15-risky-grant",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"grant-keyword",binding:"op15-risky-grant",keyword:"Rush: Character",expiresAfterTurns:0},{kind:"grant-attribute",binding:"op15-risky-grant",attribute:"Slash",expiresAfterTurns:0}]}}}]}}}}],["OP15-002",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"event-activated-this-turn",player:"self",minBaseCost:3},then:{kind:"draw",player:"self",count:1}}}}],["OP15-039",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"Dressrosa"},operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"op15-rebecca-leader",count:"all",effect:{kind:"update",binding:"op15-rebecca-leader",rested:true}},{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Dressrosa"},bind:"op15-rebecca-bounce",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op15-rebecca-bounce",to:{player:"self",zone:"hand"}},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Dressrosa",minCost:3,maxCost:3},bind:"op15-rebecca-play",min:0,max:1,effect:{kind:"play",binding:"op15-rebecca-play"}}]}}]}}}}],["OP15-003",{oncePerTurn:true,program:{effect:{kind:"if",condition:OPPONENT_CAN_PAY_DON_PRICE,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op15-alvida-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"attach-don",player:"opponent",from:"rested",count:1,target:{binding:"op15-alvida-cost"}},{kind:"give-rested-don",player:"self",count:1,eitherOwner:true}]}}}}}],["OP15-017",{oncePerTurn:true,program:{effect:{kind:"if",condition:OPPONENT_CAN_PAY_DON_PRICE,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op15-morgan-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"attach-don",player:"opponent",from:"rested",count:1,target:{binding:"op15-morgan-cost"}},{kind:"give-rested-don",player:"self",count:1,eitherOwner:true}]}}}}}],["OP15-023",{oncePerTurn:true,program:{effect:{kind:"if",condition:OPPONENT_CAN_PAY_DON_PRICE,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op15-arlong-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"attach-don",player:"opponent",from:"rested",count:1,target:{binding:"op15-arlong-cost"}},{kind:"give-rested-don",player:"opponent",count:1,from:"cost-area",eitherOwner:true}]}}}}}],["OP15-099",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"life",position:"top",faceUp:true},bind:"op15-urouge-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:"op15-urouge-life",faceUp:false},{kind:"give-rested-don",player:"self",count:1}]}}]}}}}],["OP15-022",{oncePerTurn:true,program:{effect:{kind:"sequence",effects:[{kind:"trash-top",player:"self",count:4},{kind:"if",condition:{kind:"zone-count",player:"self",zone:"deck",operator:"eq",value:0},then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",rested:true},bind:"op15-brook-refresh",min:0,max:1,effect:{kind:"update",binding:"op15-brook-refresh",rested:false}}}]}}}],["OP15-026",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op15-jango-give",min:0,max:1,effect:{kind:"attach-don",player:"opponent",from:"rested",count:1,target:{binding:"op15-jango-give"}}}]}}}}],["OP15-041",{oncePerTurn:true,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op15-orlumbus-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op15-orlumbus-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}]}}]}}}}],["OP15-064",{oncePerTurn:false,requires:{fieldDon:2,sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:2},{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:haveNamed("Satori"),then:{kind:"if",condition:haveNamed("Hotori"),then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:5e3,canRest:true},bind:"op15-kotori-rest",min:0,max:1,effect:{kind:"rest",binding:"op15-kotori-rest"}}}}]}}}}],["OP15-072",{oncePerTurn:false,requires:{fieldDon:2,sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:2},{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:haveNamed("Kotori"),then:{kind:"if",condition:haveNamed("Satori"),then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op15-hotori-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op15-hotori-debuff",amount:-3e3,expiresAfterTurns:0}}}}]}}}}],["OP15-083",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:15},then:{kind:"give-rested-don",player:"self",count:1}}]}}}}],["OP15-085",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"},then:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Straw Hat Crew",excludeName:"Tony Tony.Chopper"},bind:"op15-chopper-recur",min:0,max:1,effect:{kind:"move",binding:"op15-chopper-recur",to:{player:"self",zone:"hand"}}}}]}}}}]],eventMain:[["OP15-019",{cost:3,program:{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"op15-barrier-leader",count:"all",effect:{kind:"modify-power",binding:"op15-barrier-leader",amount:1e3,expiresAfterTurns:1}}]}}}],["OP15-020",{cost:7,program:{effect:{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"op15-fire-fist-leader",count:"all",effect:{kind:"modify-power",binding:"op15-fire-fist-leader",amount:3e3,expiresAfterTurns:0}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op15-fire-fist-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op15-fire-fist-debuff",amount:-8e3,expiresAfterTurns:1}},{kind:"optional",effect:{kind:"sequence",effects:[{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"hand"},operator:"gte",value:2},then:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op15-fire-fist-cost",min:2,max:2,effect:{kind:"sequence",effects:[{kind:"move",binding:"op15-fire-fist-cost",to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:0},bind:"op15-fire-fist-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op15-fire-fist-ko"}}]}},else:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op15-fire-fist-cost",min:1,max:1,effect:{kind:"move",binding:"op15-fire-fist-cost",to:{player:"self",zone:"trash"}}}}]}}]}}}],["OP15-021",{cost:4,program:aceDebuff}],["OP15-056",{cost:7,program:{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Lucy"},then:{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"op15-flame-leader",count:"all",effect:{kind:"sequence",effects:[{kind:"grant-keyword",binding:"op15-flame-leader",keyword:"Double Attack",expiresAfterTurns:0},{kind:"modify-power",binding:"op15-flame-leader",amount:3e3,expiresAfterTurns:0}]}}}]}}}],["OP15-095",{cost:1,restDon:1,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:15},then:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,type:"Straw Hat Crew"},bind:"op15-storm-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op15-storm-buff",amount:3e3,expiresAfterTurns:0}}}}}],["OP15-116",{cost:1,program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"},then:{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:"life",position:"top"},bind:"op15-rifle-burn",count:"all",effect:{kind:"move",binding:"op15-rifle-burn",to:{player:"self",zone:"trash"}}},{kind:"choose",selector:{player:"self",zone:"deck",position:"top"},bind:"op15-rifle-bank",min:0,max:1,effect:{kind:"move",binding:"op15-rifle-bank",to:{player:"self",zone:"life",position:"top"}}},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op15-rifle-discard",min:1,max:1,effect:{kind:"move",binding:"op15-rifle-discard",to:{player:"self",zone:"trash"}}}]}}}}],["OP15-037",{cost:1,program:lookAndAdd(5,"op15-outcome-look",{type:"East Blue",excludeName:"The Outcome Will Tell Us Who's Strong and Who's Weak"})}],["OP15-038",{cost:1,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:8,minGivenDon:2},bind:"op15-order-lock",min:0,max:1,effect:{kind:"restrict",binding:"op15-order-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}}}],["OP15-054",{cost:4,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Lucy"},then:{kind:"choice",branches:[{id:"draw-and-play",label:"Draw 2, trash 1, then play a Dressrosa Character with a cost of 4 or less",effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op15-memento-discard",min:1,max:1,effect:{kind:"move",binding:"op15-memento-discard",to:{player:"self",zone:"trash"}}},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Dressrosa",maxCost:4},bind:"op15-memento-play",min:0,max:1,effect:{kind:"play",binding:"op15-memento-play"}}]}},{id:"bounce-stage",label:"Return a Stage to its owner's hand",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"stage"},bind:"op15-memento-own-stage",min:0,max:1,effect:{kind:"move",binding:"op15-memento-own-stage",to:{player:"self",zone:"hand"}}},{kind:"choose",selector:{player:"opponent",zone:"stage"},bind:"op15-memento-their-stage",min:0,max:1,effect:{kind:"move",binding:"op15-memento-their-stage",to:{player:"opponent",zone:"hand"}}}]}}]}}}}],["OP15-055",{cost:3,program:{effect:{kind:"choice",branches:[{id:"draw",label:"Draw 2 cards",effect:{kind:"draw",player:"self",count:2}},{id:"blocker",label:"Give a Dressrosa Character [Blocker]",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Dressrosa"},bind:"op15-mr-luffy-blocker",min:0,max:1,effect:{kind:"grant-keyword",binding:"op15-mr-luffy-blocker",keyword:"Blocker",expiresAfterTurns:1}}}]}}}],["OP15-096",{cost:0,restDon:1,program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"},then:{kind:"trash-top",player:"self",count:5}}}}],["OP15-097",{cost:1,program:embarrassingLock}],["OP15-115",{cost:2,program:{effect:{kind:"sequence",effects:[impactDialKo,{kind:"choose",selector:{player:"self",zone:"life",position:"edge"},bind:"op15-impact-dial-life",min:1,max:1,effect:{kind:"move",binding:"op15-impact-dial-life",to:{player:"self",zone:"hand"}}}]}}}],["OP15-117",{cost:1,program:{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"give-rested-don",player:"self",count:1,type:"Sky Island"}]}}}]],counterEvent:[["OP15-021",{cost:4,power:0,program:aceDebuff}],["OP15-095",{cost:1,power:0,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:15},then:{kind:"battle-power",player:"self",amount:4e3}}}}],["OP15-116",{cost:1,power:4e3,target:{isLeader:true}}],["OP15-038",{cost:1,power:4e3,target:{name:"Krieg"}}],["OP15-096",{cost:0,power:0,program:trashForBattlePower(3e3,"op15-swallow-counter")}]]};var op15OnPlayMechanics={onPlay:[["OP15-032",{effect:{kind:"choose",selector:restableCards("opponent"),bind:"op15-brook-rest",min:0,max:1,effect:{kind:"rest",binding:"op15-brook-rest"}}}],["OP15-004",{effect:{kind:"if",condition:{kind:"leader-power",player:"self",operator:"lte",value:0},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op15-sea-cat-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op15-sea-cat-debuff",amount:-3e3,expiresAfterTurns:0}}}}],["OP15-007",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"East Blue"},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:5},bind:"op15-gin-play",min:0,max:1,effect:{kind:"play",binding:"op15-gin-play"}}}}],["OP15-028",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"East Blue"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op15-meowban-target",min:0,max:1,effect:{kind:"attach-don",player:"opponent",from:"cost-area",count:1,target:{binding:"op15-meowban-target"}}}}}],["OP15-026",lookAndAdd(3,"op15-jango-look",{type:"East Blue"})],["OP15-033",{effect:{kind:"sequence",effects:[{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Fish-Man"},then:{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"op15-hody-leader",count:"all",effect:{kind:"update",binding:"op15-hody-leader",rested:false}}},{kind:"choose",selector:{player:"self",zone:"life",position:"edge"},bind:"op15-hody-life",min:1,max:1,effect:{kind:"move",binding:"op15-hody-life",to:{player:"self",zone:"hand"}}}]}}],["OP15-029",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"op15-kuma-lock",min:0,max:1,effect:{kind:"restrict",binding:"op15-kuma-lock",restriction:"cannot-rest",expiresAfterTurns:1}}}],["OP15-040",lookAndAdd(3,"op15-viola-look",{type:"Dressrosa"})],["OP15-043",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",name:"Bobby Funk"},bind:"op15-kelly-play",min:0,max:1,effect:{kind:"play",binding:"op15-kelly-play"}}}],["OP15-045",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",category:"event"},bind:"op15-sai-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op15-sai-cost",to:{player:"self",zone:"trash"}},{kind:"draw",player:"self",count:2}]}}]}}}],["OP15-053",lookAndAdd(3,"op15-rebecca-look",{type:"Dressrosa"})],["OP15-087",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op15-robin-discard",min:2,max:2,effect:{kind:"move",binding:"op15-robin-discard",to:{player:"self",zone:"trash"}}}]}}],["OP15-008",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op15-krieg-mark",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"attach-don",player:"opponent",from:"rested",count:3,target:{binding:"op15-krieg-mark"}},{kind:"remember-target",binding:"op15-krieg-mark"}]}},{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}]}}],["OP15-014",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"event",type:"Dressrosa",maxCost:3},bind:"op15-bartolomeo-event",min:0,max:1,effect:{kind:"activate-event",binding:"op15-bartolomeo-event"}}}],["OP15-046",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Dressrosa"},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"event",type:"Dressrosa"},bind:"op15-sabo-event",min:0,max:1,effect:{kind:"activate-event",binding:"op15-sabo-event"}}}}],["OP15-015",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op15-higuma-give",min:0,max:1,effect:{kind:"attach-don",player:"opponent",from:"rested",count:1,target:{binding:"op15-higuma-give"}}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",minGivenDon:1},bind:"op15-higuma-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op15-higuma-debuff",amount:-1e3,expiresAfterTurns:0}}]}}],["OP15-065",{effect:{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"op15-goro-reveal",count:"all",effect:{kind:"reveal",binding:"op15-goro-reveal"}},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"deck",binding:"op15-goro-reveal",maxCost:2},operator:"gte",value:1},then:{kind:"add-don",player:"self",count:1,rested:true}}]}}],["OP15-025",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op15-kuro-give",min:0,max:1,effect:{kind:"attach-don",player:"opponent",from:"cost-area",count:2,target:{binding:"op15-kuro-give"}}}}],["OP15-027",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",minGivenDon:1,canRest:true},bind:"op15-mihawk-rest",min:0,max:1,effect:{kind:"rest",binding:"op15-mihawk-rest"}}}],["OP15-034",{effect:{kind:"if",condition:{kind:"turn-player",player:"self"},then:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name:"Brook"},bind:"op15-yorki-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op15-yorki-buff",amount:2e3,expiresAfterTurns:0}}}}],["OP15-081",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"},then:{kind:"trash-top",player:"self",count:5}}}],["OP15-082",{effect:{kind:"trash-top",player:"self",count:3}}],["OP15-083",{effect:{kind:"trash-top",player:"self",count:3}}],["OP15-084",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Thriller Bark Pirates"},then:{kind:"trash-top",player:"self",count:5}}}],["OP15-085",{effect:{kind:"trash-top",player:"self",count:3}}],["OP15-088",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"trash-top",player:"self",count:3},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Straw Hat Crew",maxCost:2},bind:"op15-docking-play",min:0,max:1,effect:{kind:"play",binding:"op15-docking-play"}}]}}}],["OP15-042",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op15-kyros-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op15-kyros-cost",to:{player:"self",zone:"trash"}},{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Rebecca"},then:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}}]}}]}}}],["OP15-048",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",category:"event"},bind:"op15-chinjao-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op15-chinjao-cost",to:{player:"self",zone:"trash"}},{kind:"draw",player:"self",count:2}]}}]}}}],["OP15-057",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Dressrosa"},then:{kind:"draw",player:"self",count:1}}}],["OP15-073",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",anyOf:[{name:"Heavenly Warriors"},{type:"Vassals"}],minCost:1,maxCost:1},bind:"op15-yama-play",min:0,max:1,effect:{kind:"play",binding:"op15-yama-play"}}}],["OP15-086",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"},then:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Straw Hat Crew",maxCost:7},bind:"op15-nami-revive",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"play",binding:"op15-nami-revive"},{kind:"grant-keyword",binding:"op15-nami-revive",keyword:"Rush",expiresAfterTurns:0}]}}}}],["OP15-100",lifeToHandCost({kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"op15-kamakiri-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op15-kamakiri-ko"}}]},"top")],["OP15-031",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,costEqualsGivenDon:true},bind:"op15-purinpurin-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op15-purinpurin-ko"}}}],["OP15-099",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",type:"Supernovas"},bind:"op15-urouge-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op15-urouge-cost",to:{player:"self",zone:"trash"}},{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}]}}]}}}],["OP15-101",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op15-kalgara-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op15-kalgara-cost",to:{player:"self",zone:"trash"}},{kind:"look-at",player:"self",count:5,bind:"op15-kalgara-look"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"op15-kalgara-look",anyOf:[{name:"Mont Blanc Noland"},{type:"Shandian Warrior"}]},bind:"op15-kalgara-add",min:0,max:2,effect:{kind:"move",binding:"op15-kalgara-add",to:{player:"self",zone:"hand"}}},{kind:"select",selector:{player:"self",zone:"deck",binding:"op15-kalgara-look"},bind:"op15-kalgara-rest",count:"all",effect:{kind:"order-to-bottom",binding:"op15-kalgara-rest",to:{player:"self",zone:"deck",position:"bottom"}}}]}}]}}}],["OP15-102",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCostFromZoneCount:{player:"opponent",zone:"life"},canRest:true},bind:"op15-ganfall-rest",min:0,max:1,effect:{kind:"rest",binding:"op15-ganfall-rest"}}}],["OP15-109",lifeToHandCost({kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"deck",position:"top"},bind:"op15-robin109-bank",min:0,max:1,effect:{kind:"move",binding:"op15-robin109-bank",to:{player:"self",zone:"life",position:"top"}}},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Sky Island",maxCost:5},bind:"op15-robin109-play",min:0,max:1,effect:{kind:"play",binding:"op15-robin109-play"}}]}},"top")],["OP15-104",{effect:{kind:"if",condition:{kind:"life-versus",player:"self",operator:"lt"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op15-conis-discard",min:2,max:2,effect:{kind:"move",binding:"op15-conis-discard",to:{player:"self",zone:"trash"}}}]}}}],["OP15-112",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Shandian Warrior",maxCost:3},bind:"op15-raki-play",min:0,max:1,effect:{kind:"play",binding:"op15-raki-play"}}}],["OP15-091",{effect:{kind:"choose",selector:{player:"opponent",zone:"trash"},bind:"op15-margarita-bury",min:0,max:1,effect:{kind:"move",binding:"op15-margarita-bury",to:{player:"opponent",zone:"deck",position:"bottom"}}}}],["OP15-108",lookAndAdd(3,"op15-nami-look",{type:"Sky Island"})]]};var op15TriggerMechanics={onKo:[["OP15-012",{effect:{kind:"draw",player:"self",count:1}}],["OP15-042",{effect:{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"hand"}}}],["OP15-044",lookAndAdd(3,"op15-koala-look",{type:"Dressrosa",category:"event"})],["OP15-048",{effect:{kind:"if",condition:{kind:"turn-player",player:"opponent"},then:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op15-chinjao-bury",min:1,max:1,chooser:"opponent",effect:{kind:"move",binding:"op15-chinjao-bury",to:{player:"opponent",zone:"deck",position:"bottom"}}}}}],["OP15-011",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"East Blue"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:6e3},bind:"op15-pearl-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op15-pearl-ko"}}}}],["OP15-023",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true,rested:true},bind:"op15-arlong-lock",min:0,max:2,effect:{kind:"restrict",binding:"op15-arlong-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}}],["OP15-024",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true,maxCost:7,canRest:true},bind:"op15-usopp-rest",min:0,max:1,effect:{kind:"rest",binding:"op15-usopp-rest"}}}],["OP15-041",{effect:{kind:"draw",player:"self",count:1}}],["OP15-079",absalomRecursion],["OP15-110",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Shandian Warrior"},then:{kind:"choose",selector:{player:"self",zone:"deck",position:"top"},bind:"op15-braham-life",min:0,max:1,effect:{kind:"move",binding:"op15-braham-life",to:{player:"self",zone:"life",position:"top"}}}}}],["OP15-080",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"trash"},bind:"op15-oars-cost",min:3,max:3,effect:{kind:"sequence",effects:[{kind:"move",binding:"op15-oars-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"select",selector:{player:"self",zone:"trash",binding:SOURCE_BINDING},bind:"op15-oars-self",count:"all",effect:{kind:"play",binding:"op15-oars-self"}}]}}]}}}],["OP15-082",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",maxCost:8},bind:"op15-lola-recur",min:0,max:1,effect:{kind:"move",binding:"op15-lola-recur",to:{player:"self",zone:"hand"}}}}],["OP15-084",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:6},then:{kind:"draw",player:"self",count:1}}}]],trigger:[["OP15-079",absalomRecursion],["OP15-097",embarrassingLock],["OP15-019",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op15-barrier-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op15-barrier-debuff",amount:-4e3,expiresAfterTurns:0}}}],["OP15-037",{effect:{kind:"draw",player:"self",count:1}}],["OP15-117",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Sky Island"},then:{kind:"draw",player:"self",count:2}}}],["OP15-056",{effect:{kind:"draw",player:"self",count:2}}],["OP15-115",{effect:impactDialKo}],["OP15-103",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:{kind:"play",binding:SOURCE_BINDING}}]}}],["OP15-104",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op15-conis-trigger-discard",min:1,max:1,effect:{kind:"move",binding:"op15-conis-trigger-discard",to:{player:"self",zone:"trash"}}}]}}],["OP15-106",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand",color:"Yellow",anyOf:[{category:"character"},{category:"stage"}],maxCost:2},bind:"op15-octoballoon-play",min:0,max:1,effect:{kind:"play",binding:"op15-octoballoon-play"}}]}}]],onEndOfYourTurn:[["OP15-025",{effect:{kind:"if",condition:{kind:"source-played-this-turn"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,minGivenDon:3},bind:"op15-kuro-lock",min:0,max:1,effect:{kind:"restrict",binding:"op15-kuro-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}}}]]};var op16EnelMechanics={eventMain:[["OP15-075",{cost:0,donMinus:1,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Enel"},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"thor-buff",min:0,max:1,effect:{kind:"modify-power",binding:"thor-buff",amount:1e3,expiresAfterTurns:0}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:3e3},bind:"thor-target",min:0,max:1,effect:{kind:"knock-out",binding:"thor-target"}}]}}}}],["OP15-076",{cost:0,donMinus:1,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Enel"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"kiten-target",min:0,max:1,effect:{kind:"modify-power",binding:"kiten-target",amount:-1e3,expiresAfterTurns:0}}]}}}}],["OP15-077",{cost:0,donMinus:1,program:{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCurrentPower:6e3},bind:"dragon-target",min:0,max:1,effect:{kind:"restrict",binding:"dragon-target",restriction:"cannot-refresh",expiresAfterTurns:1}}]}}}],["OP15-078",{cost:0,donMinus:2,program:{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:false,maxCurrentPower:5e3},bind:"mamaragan-target",min:0,max:1,effect:{kind:"update",binding:"mamaragan-target",rested:true}}]}}}],["OP15-074",{cost:0,donMinus:1,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Enel"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"varie-target",min:0,max:1,effect:{kind:"modify-cost",binding:"varie-target",amount:2,expiresAfterTurns:1}}]}}}}],["OP13-076",{cost:0,restDon:5,program:{effect:{kind:"if",condition:{kind:"given-don",player:"self",operator:"gte",value:1},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"departure-target",min:0,max:1,effect:{kind:"modify-power",binding:"departure-target",amount:-8e3,expiresAfterTurns:0}}}}}],["OP05-077",{cost:2,donMinus:1,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"gamma-target",min:0,max:1,effect:{kind:"modify-power",binding:"gamma-target",amount:-5e3,expiresAfterTurns:0}}}}]],whenAttacking:[["OP15-061",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"lte",value:6},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"ohm-target",min:0,max:1,effect:{kind:"modify-power",binding:"ohm-target",amount:-1e3,expiresAfterTurns:0}}}}],["OP15-066",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"lte",value:6},then:lookAndReplace(2,"satori-look",true)}}]],activateMain:[["OP15-060",{oncePerTurn:false,requires:{fieldDon:1},program:{effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Blocker",expiresAfterTurns:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"enel-blocker-discard",min:1,max:1,effect:{kind:"move",binding:"enel-blocker-discard",to:{player:"self",zone:"trash"}}}]}}}]],onPlay:[["OP15-061",skypieaDrawOnPlay],["OP15-066",skypieaDrawOnPlay],["OP15-067",skypieaDrawOnPlay],["OP15-063",skypieaDrawOnPlay],["OP09-072",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"gte",value:1},then:donMinus(2,{kind:"choose",selector:{player:"self",zone:"hand"},bind:"franky-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"franky-cost",to:{player:"self",zone:"trash"}},{kind:"draw",player:"self",count:2}]}})}}],["OP16-073",{effect:{kind:"sequence",effects:[{kind:"add-don",player:"self",count:1,rested:false},{kind:"add-don",player:"self",count:1,rested:true}]}}],["OP10-067",{effect:donMinus(1,{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"trash",category:"event",color:"Purple",maxCost:5},bind:"pink-recover",min:0,max:1,effect:{kind:"move",binding:"pink-recover",to:{player:"self",zone:"hand"}}},{kind:"activate-don",player:"self",count:1}]})}]],onKo:[["OP15-063",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"lte",value:6},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:2e3},bind:"gedatsu-target",min:0,max:1,effect:{kind:"knock-out",binding:"gedatsu-target"}}}}]],trigger:[["OP05-077",{effect:{kind:"optional",effect:{kind:"add-don",player:"self",count:1,rested:false}}}]]};var op16AceMechanics={onPlay:[["OP13-016",{effect:{kind:"if",condition:{kind:"any-of",conditions:[{kind:"leader-has-name",player:"self",name:"Sabo"},{kind:"leader-has-name",player:"self",name:"Portgas.D.Ace"},{kind:"leader-has-name",player:"self",name:"Monkey.D.Luffy"}]},then:lookAndAdd(4,"op13-garp-look",{minCost:3}).effect}}]],activateMain:[["OP13-007",{oncePerTurn:false,requires:{activeDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"give-rested-don",player:"self",count:1,from:"active"},{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op13-asl-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op13-asl-debuff",amount:-3e3,expiresAfterTurns:0}}]}}}}]]};var powerEightThousand={category:"character",minPower:8e3,maxPower:8e3};var revealEightThousand=(bind,effect)=>({effect:{kind:"optional",effect:{kind:"choose",selector:{...powerEightThousand,player:"self",zone:"hand"},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"reveal",binding:bind},effect]}}}});var trashEightThousand=(bind,effect)=>({effect:{kind:"optional",effect:payFromHand({...powerEightThousand,player:"self",zone:"hand"},bind,1,effect)}});var impelDownPair=(partner,bind)=>({kind:"if",condition:haveNamed(partner),then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:2},bind,min:0,max:1,effect:{kind:"play",binding:bind}}});var op16BattleMechanics={whenAttacking:[["OP16-025",{effect:impelDownPair("Antlerkov","op16-bunkov-play")}],["OP16-029",{effect:impelDownPair("Bunkov","op16-antlerkov-play")}],["OP16-011",{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:2e3},bind:"op16-vista-ko",min:0,max:2,effect:{kind:"knock-out",binding:"op16-vista-ko"}}}}],["OP16-068",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Donquixote Pirates"},then:{kind:"modify-power",binding:SOURCE_BINDING,amount:3e3,expiresAfterTurns:0}}}],["OP16-069",{effect:{kind:"add-don",player:"self",count:1,rested:false}}],["OP16-104",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op16-devon-mirror",min:0,max:1,effect:{kind:"copy-power",from:"op16-devon-mirror",to:SOURCE_BINDING,expiresAfterTurns:0}}}],["OP16-053",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:6},then:{kind:"draw",player:"self",count:1}}}]],onOpponentAttack:[["OP16-080",{oncePerTurn:true,requires:{handCardsMatching:{match:{hasTrigger:true},count:1}},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand",hasTrigger:true},bind:"op16-teach-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op16-teach-cost",to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,excludeAttackTarget:true,anyOf:[{name:"Marshall.D.Teach"},{type:"Blackbeard Pirates"}]},bind:"op16-teach-redirect",min:1,max:1,effect:{kind:"redirect-attack",binding:"op16-teach-redirect"}}]}}}}}],["OP16-015",{oncePerTurn:false,requires:{handCardsMatching:{match:powerEightThousand,count:1}},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{...powerEightThousand,player:"self",zone:"hand"},bind:"op16-luffy015-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op16-luffy015-cost",to:{player:"self",zone:"trash"}},{kind:"set-leader-base-power",player:"self",value:7e3,expiresAfterTurns:0},{kind:"set-base-power",binding:SOURCE_BINDING,value:7e3,expiresAfterTurns:0}]}}]}}}}]],counterEvent:[["OP16-020",{cost:0,power:0,program:trashForBattlePower(3e3,"op16-goodbye-counter")}],["OP16-038",{cost:1,power:3e3,target:{isLeader:true}}],["OP16-040",{cost:1,power:3e3,target:{isLeader:true}}],["OP16-100",{cost:1,power:3e3,target:{isLeader:true}}],["OP16-076",{cost:1,power:0,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"Admiral"},operator:"gte",value:1},then:{kind:"battle-power",player:"self",amount:4e3}}}}],["OP16-099",{cost:1,power:3e3,target:{isLeader:true}}],["OP16-057",{cost:1,power:0,program:{effect:{kind:"if",condition:haveNamed("Prisoner of Impel Down",2),then:{kind:"battle-power",player:"self",amount:4e3}}}}],["OP16-058",{cost:1,power:4e3,target:{name:"Buggy"}}],["OP16-059",{cost:1,power:3e3,target:{isLeader:true}}]]};var op16MainMechanics={activateMain:[["OP16-022",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"if",condition:{kind:"every-character-matches",player:"self",selector:{zone:"board",category:"character",type:"Impel Down"}},then:{kind:"activate-don",player:"self",count:2}}}}],["OP16-056",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:9},bind:"op16-mr3-lock",min:0,max:1,effect:{kind:"restrict",binding:"op16-mr3-lock",restriction:"cannot-attack",expiresAfterTurns:1}}]}}}}],["OP16-001",{oncePerTurn:true,program:{effect:{kind:"choice",branches:[{id:"luffy",label:"Give a [Monkey.D.Luffy] Character [Rush]",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",name:"Monkey.D.Luffy"},bind:"op16-ace-rush-luffy",min:0,max:1,effect:{kind:"grant-keyword",binding:"op16-ace-rush-luffy",keyword:"Rush",expiresAfterTurns:0}}},{id:"whitebeard",label:"Give a Whitebeard Pirates Character with 8000 power or more [Rush]",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",typeIncluding:"Whitebeard Pirates",minCurrentPower:8e3},bind:"op16-ace-rush-wb",min:0,max:1,effect:{kind:"grant-keyword",binding:"op16-ace-rush-wb",keyword:"Rush",expiresAfterTurns:0}}}]}}}],["OP16-060",{oncePerTurn:false,requires:{activeDon:8},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:8},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Admiral"},bind:"op16-sengoku-play",min:0,max:3,distinctNames:true,effect:{kind:"play",binding:"op16-sengoku-play"}}]}}}}],["OP16-021",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"give-rested-don",player:"self",count:1}]}}}}],["OP16-063",{oncePerTurn:true,requires:{fieldDon:1},program:{effect:donMinus(1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op16-kuzan-silence",min:0,max:1,effect:{kind:"restrict",binding:"op16-kuzan-silence",restriction:"cannot-block",expiresAfterTurns:0}})}}],["OP16-078",{oncePerTurn:false,requires:{fieldDon:1,sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"rest",binding:SOURCE_BINDING},{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-marineford-discard",min:1,max:1,effect:{kind:"move",binding:"op16-marineford-discard",to:{player:"self",zone:"trash"}}}]}}}}],["OP16-081",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:{kind:"selector-count",player:"either",selector:{zone:"board",category:"character",minCost:8},operator:"gte",value:1},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op16-otama-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op16-otama-debuff",amount:-2e3,expiresAfterTurns:0}}}]}}}}],["OP16-084",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"source-cost",operator:"gte",value:20},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:9},then:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",name:"Kouzuki Momonosuke",minCost:9,maxCost:9},bind:"op16-momo084-revive",min:0,max:1,effect:{kind:"play",binding:"op16-momo084-revive"}}}]}}}}}],["OP16-094",{oncePerTurn:true,requires:{fieldDon:1},program:{effect:{kind:"give-rested-don",player:"self",count:1,type:"Land of Wano"}}}],["OP16-098",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",name:"Yamato",color:"Black",minCost:8,maxCost:8},bind:"op16-yamato098-revive",min:0,max:1,effect:{kind:"play",binding:"op16-yamato098-revive"}}]}}}}],["OP16-047",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:8},then:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op16-doflamingo-bury",min:2,max:2,chooser:"opponent",effect:{kind:"move",binding:"op16-doflamingo-bury",to:{player:"opponent",zone:"deck",position:"bottom"}}}}]}}}}],["OP16-049",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"draw",player:"self",count:1}]}}}}],["OP16-052",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"give-rested-don",player:"self",count:1}}}],["OP16-065",{oncePerTurn:true,requires:{activeDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Navy"},then:{kind:"add-don",player:"self",count:2,rested:false}}]}}}}]],eventMain:[["OP16-038",{cost:1,restDon:6,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"Impel Down"},operator:"gte",value:5,distinctNames:true},then:{kind:"select",selector:{player:"self",zone:"board",includeLeader:true},bind:"op16-headquarters",count:"all",effect:{kind:"update",binding:"op16-headquarters",rested:false}}}}}],["OP16-058",{cost:1,program:{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:10},then:{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:"board",category:"character",name:"Prisoner of Impel Down"},bind:"op16-riot-set",count:"all",effect:{kind:"set-base-power",binding:"op16-riot-set",value:7e3,expiresAfterTurns:0}},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:[],includeLeader:true,name:"Prisoner of Impel Down"},operator:"gte",value:1},then:{kind:"set-leader-base-power",player:"self",value:7e3,expiresAfterTurns:0}}]}}}}],["OP16-115",{cost:1,program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Blackbeard Pirates"},then:{kind:"choose",selector:{player:"self",zone:"trash",hasTrigger:true,excludeName:"Black Vortex"},bind:"op16-vortex-recover",min:0,max:1,effect:{kind:"move",binding:"op16-vortex-recover",to:{player:"self",zone:"hand"}}}}}}],["OP16-116",{cost:8,program:{effect:{kind:"sequence",effects:[{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:10},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",name:"Marshall.D.Teach"},bind:"op16-zehaha-play",min:0,max:1,effect:{kind:"play",binding:"op16-zehaha-play"}}},{kind:"choose",selector:{player:"opponent",zone:"life",position:"top"},bind:"op16-zehaha-life",min:0,max:1,effect:{kind:"move",binding:"op16-zehaha-life",to:{player:"opponent",zone:"hand"}}}]}}}],["OP16-117",{cost:2,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",hasTrigger:true},bind:"op16-black-hole-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op16-black-hole-cost",to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:8},bind:"op16-black-hole-negate",min:0,max:1,effect:{kind:"negate",binding:"op16-black-hole-negate",expiresAfterTurns:0}}]}}]}}}}],["OP16-019",{cost:9,program:{effect:{kind:"choose",selector:{...powerEightThousand,player:"self",zone:"hand",typeIncluding:"Whitebeard Pirates"},bind:"op16-show-em-play",min:0,max:2,effect:{kind:"play",binding:"op16-show-em-play"}}}}],["OP16-076",{cost:1,restDon:3,program:{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Admiral"},bind:"op16-admirals-buff",min:0,max:3,effect:{kind:"modify-power",binding:"op16-admirals-buff",amount:2e3,expiresAfterTurns:0}}}}],["OP16-077",{cost:1,program:{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind:"op16-buddha-look"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"op16-buddha-look",type:"Navy"},bind:"op16-buddha-add",min:0,max:2,effect:{kind:"move",binding:"op16-buddha-add",to:{player:"self",zone:"hand"}}},{kind:"select",selector:{player:"self",zone:"deck",binding:"op16-buddha-look"},bind:"op16-buddha-rest",count:"all",effect:{kind:"order-to-bottom",binding:"op16-buddha-rest",to:{player:"self",zone:"deck",position:"bottom"}}},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-buddha-discard",min:1,max:1,effect:{kind:"move",binding:"op16-buddha-discard",to:{player:"self",zone:"trash"}}}]}}}],["OP16-099",{cost:1,restDon:6,program:{effect:{kind:"sequence",effects:[{kind:"trash-top",player:"self",count:5},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Land of Wano",maxCost:6},bind:"op16-chains-revive",min:0,max:1,effect:{kind:"play",binding:"op16-chains-revive"}}]}}}],["OP16-100",{cost:1,restDon:2,program:{effect:{kind:"if",condition:{kind:"character-koed-this-turn",player:"opponent"},then:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Yamato"},then:{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"op16-glacier-leader",count:"all",effect:{kind:"update",binding:"op16-glacier-leader",rested:false}}}}}}],["OP16-101",{cost:2,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"op16-mahoroba-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op16-mahoroba-buff",amount:3e3,expiresAfterTurns:0}},{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:10},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"op16-mahoroba-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op16-mahoroba-ko"}}}]}}}],["OP16-020",{cost:0,program:{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"choose",selector:{...powerEightThousand,player:"self",zone:"hand"},bind:"op16-goodbye-reveal",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"reveal",binding:"op16-goodbye-reveal"},{kind:"draw",player:"self",count:1}]}}}}}}],["OP16-039",{cost:1,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name:"Monkey.D.Luffy"},bind:"op16-twin-jet-grant",min:0,max:1,effect:{kind:"grant-keyword",binding:"op16-twin-jet-grant",keyword:"Double Attack",expiresAfterTurns:0}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Impel Down"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:3,canRest:true},bind:"op16-twin-jet-rest-targets",min:0,max:2,effect:{kind:"rest",binding:"op16-twin-jet-rest-targets"}}}]}}}],["OP16-040",{cost:1,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",includeLeader:true,name:"Monkey.D.Luffy"},operator:"gte",value:1},then:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",includeLeader:true,name:"Mr.3(Galdino)"},operator:"gte",value:1},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:6},bind:"op16-hammer-lock",min:0,max:1,effect:{kind:"restrict",binding:"op16-hammer-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}}}}}],["OP16-059",{cost:1,restDon:7,program:{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind:"op16-flashy-look"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"op16-flashy-look",category:"character",type:"Impel Down",maxPower:6e3},bind:"op16-flashy-play",min:0,max:2,effect:{kind:"play",binding:"op16-flashy-play"}},{kind:"select",selector:{player:"self",zone:"deck",binding:"op16-flashy-look"},bind:"op16-flashy-rest",count:"all",effect:{kind:"order-to-bottom",binding:"op16-flashy-rest",to:{player:"self",zone:"deck",position:"bottom"}}}]}}}]]};var blackbeardLeader={kind:"leader-has-type",player:"self",type:"Blackbeard Pirates"};var pizarroRecursion={effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:["hand","trash"],name:"Fullalead"},bind:"op16-pizarro-play",min:0,max:1,effect:{kind:"play",binding:"op16-pizarro-play"}}]}};var vanAugurRecursion={effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"turn-player",player:"opponent"},blackbeardLeader]},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"op16-augur-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op16-augur-debuff",amount:-3e3,expiresAfterTurns:0}}]}}};var sanjuanRecursion={effect:{kind:"if",condition:blackbeardLeader,then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"op16-sanjuan-set",min:0,max:1,effect:{kind:"set-base-power",binding:"op16-sanjuan-set",value:7e3,expiresAfterTurns:0}}]}}};var docQRecursion={effect:{kind:"if",condition:blackbeardLeader,then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1},bind:"op16-doc-q-ko",min:0,max:2,effect:{kind:"knock-out",binding:"op16-doc-q-ko"}}]}}};var vascoRecursion={effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6,canRest:true},bind:"op16-vasco-rest",min:0,max:1,effect:{kind:"rest",binding:"op16-vasco-rest"}}]}};var laffitteKo={effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"op16-laffitte-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op16-laffitte-ko"}}};var ace118Search=lookAndAdd(5,"op16-ace118-look",{anyOf:[{name:"Monkey.D.Luffy"},{typeIncluding:"Whitebeard Pirates"}]});var op16TriggerMechanics={onKo:[["OP16-013",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:8e3},bind:"op16-mcguy-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op16-mcguy-ko"}}}],["OP16-014",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{...powerEightThousand,player:"self",zone:"hand"},bind:"op16-marco-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op16-marco-cost",to:{player:"self",zone:"trash"}},{kind:"play",binding:SOURCE_BINDING}]}}]}}}],["OP16-071",{effect:{kind:"add-don",player:"self",count:1,rested:true}}],["OP16-074",{effect:{kind:"return-don",player:"opponent",count:4}}],["OP16-094",{effect:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op16-ace-discard",min:0,max:2,exhaustive:true,chooser:"opponent",effect:{kind:"move",binding:"op16-ace-discard",to:{player:"opponent",zone:"trash"}}}}],["OP16-096",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",name:"Yamato",maxCost:6},bind:"op16-yamato096-revive",min:0,max:1,effect:{kind:"play",binding:"op16-yamato096-revive"}}}],["OP16-102",pizarroRecursion],["OP16-103",vanAugurRecursion],["OP16-106",sanjuanRecursion],["OP16-107",{effect:{kind:"choose",selector:{player:"opponent",zone:"life",position:"top"},bind:"op16-burgess-life",min:0,max:1,effect:{kind:"move",binding:"op16-burgess-life",to:{player:"opponent",zone:"hand"}}}}],["OP16-109",docQRecursion],["OP16-110",vascoRecursion],["OP16-114",laffitteKo],["OP16-118",ace118Search],["OP16-024",{opponentEffectOnly:true,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op16-inazuma-rest",min:0,max:1,effect:{kind:"rest",binding:"op16-inazuma-rest"}}}}],["OP16-031",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",name:"Prisoner of Impel Down"},bind:"op16-buggy-prisoner",min:0,max:1,effect:{kind:"play",binding:"op16-buggy-prisoner"}}}],["OP16-043",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"stage",includeLeader:true,type:"Dressrosa",canRest:true},bind:"op16-usopp-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:"op16-usopp-cost"},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"op16-usopp-bounce",min:0,max:1,effect:{kind:"move",binding:"op16-usopp-bounce",to:{player:"opponent",zone:"hand"}}}]}}]}}}]],onEndOfYourTurn:[["OP16-030",{effect:{kind:"select",selector:{player:"self",zone:"board",category:"character",color:"Green",maxCost:5},bind:"op16-law-refresh",count:"all",effect:{kind:"update",binding:"op16-law-refresh",rested:false}}}]],trigger:[["OP16-102",pizarroRecursion],["OP16-103",vanAugurRecursion],["OP16-106",sanjuanRecursion],["OP16-109",docQRecursion],["OP16-110",vascoRecursion],["OP16-114",laffitteKo],["OP16-104",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Blackbeard Pirates",minCost:1,maxCost:1},bind:"op16-devon-revive",min:0,max:1,effect:{kind:"play",binding:"op16-devon-revive"}}]}}],["OP16-111",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:{kind:"play",binding:SOURCE_BINDING}}}],["OP16-113",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Kuja Pirates"},then:{kind:"play",binding:SOURCE_BINDING}}}],["OP16-115",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"op16-vortex-negate",min:0,max:1,effect:{kind:"negate",binding:"op16-vortex-negate",expiresAfterTurns:0}}}],["OP16-116",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-zehaha-discard",min:1,max:1,effect:{kind:"move",binding:"op16-zehaha-discard",to:{player:"self",zone:"trash"}}}]}}],["OP16-117",{effect:{kind:"choose",selector:{player:"self",zone:"trash",type:"Blackbeard Pirates"},bind:"op16-black-hole-recover",min:0,max:1,effect:{kind:"move",binding:"op16-black-hole-recover",to:{player:"self",zone:"hand"}}}}],["OP16-105",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:1},then:{kind:"sequence",effects:["Absalom","Dr. Hogback","Perona"].map((name,index)=>({kind:"choose",selector:{player:"self",zone:"trash",category:"character",name,maxCost:4},bind:`op16-moria-revive-${index}`,min:0,max:1,effect:{kind:"play",binding:`op16-moria-revive-${index}`}}))}}}],["OP16-107",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-burgess-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op16-burgess-cost",to:{player:"self",zone:"trash"}},{kind:"play",binding:SOURCE_BINDING}]}}]}}}],["OP16-108",{effect:{kind:"draw",player:"self",count:2}}],["OP16-101",{effect:{kind:"choose",selector:{player:"self",zone:"trash",name:"Yamato"},bind:"op16-mahoroba-recover",min:0,max:1,effect:{kind:"move",binding:"op16-mahoroba-recover",to:{player:"self",zone:"hand"}}}}],["OP16-019",{effect:{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"op16-show-em-leader",count:"all",effect:{kind:"modify-power",binding:"op16-show-em-leader",amount:1e3,expiresAfterTurns:0}}}],["OP16-039",{effect:{kind:"select",selector:{player:"opponent",zone:[],includeLeader:true},bind:"op16-twin-jet-rest",count:"all",effect:{kind:"rest",binding:"op16-twin-jet-rest"}}}],["OP16-057",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-savior-discard",min:1,max:1,effect:{kind:"move",binding:"op16-savior-discard",to:{player:"self",zone:"trash"}}}]}}]]};var op16OnPlayMechanics={onPlay:[["OP16-002",revealEightThousand("op16-izo-reveal",{kind:"draw",player:"self",count:1})],["OP16-003",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",category:"character",minPower:8e3,maxPower:8e3},bind:"op16-newgate-reveal",min:2,max:2,effect:{kind:"sequence",effects:[{kind:"reveal",binding:"op16-newgate-reveal"},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op16-newgate-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op16-newgate-debuff",amount:-6e3,expiresAfterTurns:0}}]}}]}}}],["OP16-006",{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:2},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:2},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:4e3},bind:"op16-shanks-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op16-shanks-ko"}}]}}}}],["OP16-007",revealEightThousand("op16-jozu-reveal",{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op16-jozu-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op16-jozu-debuff",amount:-1e3,expiresAfterTurns:0}})],["OP16-008",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",category:"character",minPower:1e4,maxPower:1e4},bind:"op16-squard-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op16-squard-cost",to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:8e3},bind:"op16-squard-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op16-squard-ko"}}]}}]}}}],["OP16-009",trashEightThousand("op16-speed-jil-cost",{kind:"sequence",effects:[{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:1},{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:1}]})],["OP16-010",revealEightThousand("op16-namule-reveal",{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:2e3},bind:"op16-namule-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op16-namule-ko"}})],["OP16-011",revealEightThousand("op16-vista-reveal",{kind:"draw",player:"self",count:1})],["OP16-012",{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Red-Haired Pirates"},then:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:10},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",name:"Shanks"},bind:"op16-beckman-play",min:0,max:1,effect:{kind:"play",binding:"op16-beckman-play"}}}}]}}}}],["OP16-118",ace118Search],["OP16-021",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Whitebeard Pirates"},then:lookAndAdd(3,"op16-moby-look",{}).effect}}],["OP16-030",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true},bind:"op16-law-lock",min:0,max:1,effect:{kind:"restrict",binding:"op16-law-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}}],["OP16-035",{effect:{kind:"sequence",effects:[{kind:"choose",selector:restableCards("opponent"),bind:"op16-zoro-rest",min:0,max:1,effect:{kind:"rest",binding:"op16-zoro-rest"}},{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-zoro-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op16-zoro-cost",to:{player:"self",zone:"trash"}},{kind:"give-rested-don",player:"self",count:3,recipient:"leader"}]}}]}}]}}],["OP16-036",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4,canRest:true},bind:"op16-bentham-rest",min:0,max:1,effect:{kind:"rest",binding:"op16-bentham-rest"}}}],["OP16-037",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Impel Down"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5,canRest:true},bind:"op16-galdino-rest",min:0,max:1,effect:{kind:"rest",binding:"op16-galdino-rest"}}}}],["OP16-050",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",category:"character",minCost:2},bind:"op16-olive-bounce",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op16-olive-bounce",to:{player:"self",zone:"hand"}},{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-olive-discard",min:1,max:1,effect:{kind:"move",binding:"op16-olive-discard",to:{player:"self",zone:"trash"}}}]}}]}}}],["OP16-051",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:5},then:{kind:"draw",player:"self",count:2}}}],["OP16-063",{effect:{kind:"add-don",player:"self",count:2,rested:true}}],["OP16-064",lookAndAdd(5,"op16-koby-look",{type:"Navy",excludeName:"Koby"})],["OP16-066",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Navy"},then:{kind:"sequence",effects:[{kind:"add-don",player:"self",count:2,rested:true},{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-sengoku-discard",min:2,max:2,effect:{kind:"move",binding:"op16-sengoku-discard",to:{player:"self",zone:"trash"}}}]}}}],["OP16-067",{effect:{kind:"sequence",effects:[lookAndAdd(5,"op16-tsuru-look",{type:"Navy"}).effect,{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-tsuru-discard",min:1,max:1,effect:{kind:"move",binding:"op16-tsuru-discard",to:{player:"self",zone:"trash"}}}]}}],["OP16-065",{effect:donMinus(1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op16-sakazuki-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op16-sakazuki-debuff",amount:-6e3,expiresAfterTurns:1}})}],["OP16-068",{effect:{kind:"add-don",player:"self",count:1,rested:false}}],["OP16-069",{effect:{kind:"add-don",player:"self",count:1,rested:false}}],["OP16-070",{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:2},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:2},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Navy"},then:{kind:"add-don",player:"self",count:1,rested:true}}]}}}}],["OP16-071",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-benevolent-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op16-benevolent-cost",to:{player:"self",zone:"trash"}},{kind:"add-don",player:"self",count:1,rested:true}]}}]}}}],["OP16-072",lookAndAdd(5,"op16-hannyabal-look",{type:"Impel Down"})],["OP16-074",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Impel Down"},then:{kind:"return-don",player:"opponent",count:1}}}],["OP16-075",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Navy"},then:{kind:"sequence",effects:[{kind:"add-don",player:"self",count:1,rested:false},{kind:"add-don",player:"self",count:1,rested:true}]}}}],["OP16-078",lookAndAdd(5,"op16-marineford-look",{type:"Navy"})],["OP16-082",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Land of Wano"},then:lookAndAddOrTrash(5,"op16-kinemon-look",{type:"Land of Wano"}).effect}}],["OP16-083",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",category:"character",minCost:8},bind:"op16-oden-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op16-oden-cost",to:{player:"self",zone:"trash"}},{kind:"draw",player:"self",count:2}]}}]}}}],["OP16-085",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Land of Wano",maxCost:6,excludeName:"Kouzuki Momonosuke"},bind:"op16-momo-revive",min:0,max:1,effect:{kind:"play",binding:"op16-momo-revive"}}}],["OP16-087",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Land of Wano"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"board",category:"character",name:"Kouzuki Momonosuke"},bind:"op16-shinobu-buff",min:0,max:1,effect:{kind:"modify-cost",binding:"op16-shinobu-buff",amount:20,expiresAfterTurns:0}}]}}]}}}],["OP16-089",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-mihawk-discard",min:2,max:2,effect:{kind:"move",binding:"op16-mihawk-discard",to:{player:"self",zone:"trash"}}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op16-mihawk-cost",min:0,max:1,effect:{kind:"modify-cost",binding:"op16-mihawk-cost",amount:-4,expiresAfterTurns:0}}]}}],["OP16-090",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-chopper-discard",min:2,max:2,effect:{kind:"move",binding:"op16-chopper-discard",to:{player:"self",zone:"trash"}}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1},bind:"op16-chopper-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op16-chopper-ko"}}]}}],["OP16-091",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Land of Wano"},then:lookAndAddOrTrash(4,"op16-nami-look",{type:"Land of Wano",excludeName:"Nami"}).effect}}],["OP16-092",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",category:"character",minCost:8},bind:"op16-robin-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op16-robin-cost",to:{player:"self",zone:"trash"}},{kind:"draw",player:"self",count:2}]}}]}}}],["OP16-093",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-kuma-discard",min:2,max:2,effect:{kind:"move",binding:"op16-kuma-discard",to:{player:"self",zone:"trash"}}},{kind:"give-rested-don",player:"self",count:1}]}}],["OP16-095",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",color:"Black",type:"Land of Wano"},bind:"op16-luffy095-unblockable",min:0,max:1,effect:{kind:"grant-keyword",binding:"op16-luffy095-unblockable",keyword:"Unblockable",expiresAfterTurns:0}}}],["OP16-097",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Land of Wano",maxCost:6},bind:"op16-yamato097-recover",min:0,max:1,effect:{kind:"move",binding:"op16-yamato097-recover",to:{player:"self",zone:"hand"}}},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:2},bind:"op16-yamato097-play",min:0,max:1,effect:{kind:"play",binding:"op16-yamato097-play"}}]}}],["OP16-098",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-yamato098-discard",min:1,max:1,effect:{kind:"move",binding:"op16-yamato098-discard",to:{player:"self",zone:"trash"}}}]}}],["OP16-108",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op16-shiryu-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op16-shiryu-cost",to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"self",zone:"trash",type:"Blackbeard Pirates",maxCost:6},bind:"op16-shiryu-life",min:0,max:1,effect:{kind:"move",binding:"op16-shiryu-life",to:{player:"self",zone:"life",position:"top"},faceUp:true}}]}}]}}}]]};var replacementMechanics={replacement:[["OP15-009",{opponentEffectOnly:true,oncePerTurn:false,removal:"off-field",protects:{category:"character",maxPower:7e3},label:"Leader takes −2000",cost:{kind:"leader-power-penalty",amount:-2e3}}],["OP15-003",{opponentEffectOnly:false,oncePerTurn:false,label:"Trash a 6000-or-less Character from hand",cost:{kind:"trash-from-hand",count:1,match:{category:"character",maxPower:6e3}}}],["OP15-014",{opponentEffectOnly:false,oncePerTurn:false,label:"Trash an Event from your hand",cost:{kind:"trash-from-hand",count:1,match:{category:"event"}}}],["OP15-052",{opponentEffectOnly:true,oncePerTurn:false,removal:"off-field",protects:{category:"character",maxPower:7e3},label:"Bottom-deck one of yours",cost:{kind:"bottom-deck-own-character",count:1}}],["OP15-035",{opponentEffectOnly:true,oncePerTurn:false,removal:"off-field",protects:{category:"character",maxPower:7e3},label:"Rest 2 of your cards",cost:{kind:"rest-own-cards",count:2}}],["OP15-094",{opponentEffectOnly:true,oncePerTurn:false,protects:{category:"character",type:"Straw Hat Crew"},excludesSelf:true,label:"Trash Roronoa Zoro",cost:{kind:"trash-self"}}],["OP15-098",{opponentEffectOnly:false,opponentOnly:true,oncePerTurn:false,removal:"off-field",protects:{category:"character",type:"Sky Island",minPower:6e3},label:"Take the top Life card",cost:{kind:"life-to-hand",count:1}}],["OP15-105",{opponentEffectOnly:true,oncePerTurn:false,removal:"off-field",protects:{category:"character",maxPower:7e3},label:"Take the top Life card",cost:{kind:"life-to-hand",count:1}}],["OP15-069",{opponentEffectOnly:true,oncePerTurn:false,removal:"off-field",protects:{category:"character",maxPower:7e3},label:"Return 1 DON!! card to your DON!! deck",cost:{kind:"return-don",count:1}}],["OP15-090",{opponentEffectOnly:true,oncePerTurn:false,removal:"off-field",protects:{category:"character",maxPower:7e3},label:"Trash 1 from hand",cost:{kind:"trash-from-hand",count:1}}],["OP16-014",{opponentEffectOnly:true,oncePerTurn:false,protects:{category:"character"},label:"K.O. Marco",cost:{kind:"ko-self"}}],["OP16-033",{opponentEffectOnly:false,oncePerTurn:false,label:"Rest 2 of your cards",cost:{kind:"rest-own-cards",count:2}}],["OP16-018",{opponentEffectOnly:false,oncePerTurn:true,protects:{category:"character",type:"Red-Haired Pirates"},label:"Trash a Character with 6000 power or more from your hand",cost:{kind:"trash-from-hand",count:1,match:{category:"character",minPower:6e3}}}]]};var op16LuffyMechanics={onPlay:[...["OP16-054","OP16-055"].map(cardNumber=>[cardNumber,{effect:{kind:"draw",player:"self",count:1}}]),["OP16-032",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",excludeName:"Monkey.D.Luffy"},bind:"prevent-rest-target",min:0,max:1,effect:{kind:"restrict",binding:"prevent-rest-target",restriction:"cannot-rest",expiresAfterTurns:1}}}]]};var op16NamiMechanics={activateMain:[["P-096",{oncePerTurn:true,program:{effect:{kind:"give-rested-don",player:"self",count:1,name:"Nami"}}}],["OP15-114",{oncePerTurn:true,program:{effect:{kind:"give-rested-don",player:"self",count:1,type:"Sky Island"}}}]],onPlay:[["EB03-053",{effect:{kind:"sequence",effects:[{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"},{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"gte",value:3},then:{kind:"optional",effect:{kind:"select",selector:{player:"opponent",zone:"life",position:"top"},bind:"opponent-life",count:1,effect:{kind:"move",binding:"opponent-life",to:{player:"opponent",zone:"hand"}}}}}]}}],["EB03-055",{effect:{kind:"optional",effect:{kind:"select",selector:{player:"self",zone:"life",position:"top"},bind:"trashed-life",count:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"trashed-life",to:{player:"self",zone:"trash"}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"},then:{kind:"select",selector:{player:"self",zone:"deck",limit:2},bind:"replacement-life",count:2,effect:{kind:"move",binding:"replacement-life",to:{player:"self",zone:"life",position:"top"},faceUp:false}}}]}}}}],["OP16-119",{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:3,bind:"teach-looked"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"teach-looked"},bind:"teach-life",min:0,max:1,effect:{kind:"move",binding:"teach-life",to:{player:"self",zone:"life",position:"top"},faceUp:false}},{kind:"select",selector:{player:"self",zone:"deck",binding:"teach-looked"},bind:"teach-rest",count:3,effect:{kind:"move",binding:"teach-rest",to:{player:"self",zone:"deck",position:"bottom"}}}]}}],["OP14-104",{effect:{kind:"choice",branches:[{id:"play",label:"Play a Thriller Bark Character from your trash",effect:{kind:"choose",selector:thrillerBarkInTrash,bind:"moria-target",min:0,max:1,effect:{kind:"play",binding:"moria-target"}}},{id:"life",label:"Add a Thriller Bark Character from your trash face-up to the top of your Life cards",effect:{kind:"choose",selector:thrillerBarkInTrash,bind:"moria-target",min:0,max:1,effect:{kind:"move",binding:"moria-target",to:{player:"self",zone:"life",position:"top"},faceUp:true}}},{id:"skip",label:"Select no card"}]}}],["OP15-114",{effect:{kind:"optional",effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"life",position:"top",faceUp:false},operator:"gte",value:1},then:{kind:"select",selector:{player:"self",zone:"life",position:"top",faceUp:false},bind:"face-up-life",count:1,effect:{kind:"sequence",effects:[{kind:"update",binding:"face-up-life",faceUp:true},{kind:"select",selector:{player:"opponent",zone:"board",limit:5},bind:"opponent-board",count:5,effect:{kind:"sequence",effects:[{kind:"modify-power",binding:"opponent-board",amount:-2e3,expiresAfterTurns:0},{kind:"select",selector:{player:"opponent",zone:"board",maxCurrentPower:0,limit:5},bind:"zero-power",count:5,effect:{kind:"knock-out",binding:"zero-power"}}]}}]}}}}}],["P-096",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"girl-discard",min:1,max:1,effect:{kind:"move",binding:"girl-discard",to:{player:"self",zone:"trash"}}}]}}],["OP15-047",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"unblockable-target",min:0,max:1,effect:{kind:"grant-keyword",binding:"unblockable-target",keyword:"Unblockable",expiresAfterTurns:0}}}],["OP09-112",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:{kind:"draw",player:"self",count:1}}}],["OP13-054",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:3},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"optional",effect:{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"}}]}}}],["OP14-108",rayleighRemoval],["OP13-042",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"discard",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"discard",to:{player:"self",zone:"trash"}},{kind:"optional",effect:{kind:"attach-don",player:"self",from:"rested",count:2,target:"leader"}},{kind:"choose",selector:{player:"self",zone:"board"},bind:"don-target",min:0,max:1,effect:{kind:"attach-don",player:"self",from:"rested",count:2,target:{binding:"don-target"}}}]}}]}}],["EB04-058",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"new-life",count:1,effect:{kind:"move",binding:"new-life",to:{player:"self",zone:"life",position:"top"},faceUp:false}}}}],["OP15-113",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"discard",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"discard",to:{player:"self",zone:"trash"}},{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"new-life",count:1,effect:{kind:"move",binding:"new-life",to:{player:"self",zone:"life",position:"top"},faceUp:false}}]}}}}],["OP14-111",preventCostSixAttack],["OP06-106",lifeToHandCost({kind:"choose",selector:{player:"self",zone:"hand"},bind:"replacement-life",min:0,max:1,effect:{kind:"move",binding:"replacement-life",to:{player:"self",zone:"life",position:"top"}}})],["OP11-106",lifeToHandCost({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"ko-target",min:0,max:1,effect:{kind:"knock-out",binding:"ko-target"}})]],onKo:[["PRB02-008",{effect:{kind:"draw",player:"self",count:2}}],["OP06-104",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:3},then:{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"new-life",count:1,effect:{kind:"move",binding:"new-life",to:{player:"self",zone:"life",position:"top"},faceUp:false}}}}],["OP14-111",preventCostSixAttack],["OP14-110",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",maxCost:4,hasTrigger:true,excludeName:"Dr. Hogback",excludeSource:true},bind:"free-play",min:0,max:1,effect:{kind:"play",binding:"free-play"}}}],["EB03-055",{effect:{kind:"if",condition:{kind:"turn-player",player:"opponent"},then:{kind:"optional",effect:{kind:"deal-damage",player:"opponent"}}}}],["EB03-053",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top",faceUp:false},bind:"nami-life-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:"nami-life-cost",faceUp:true},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxPower:6e3},bind:"nami-free-play",min:0,max:1,effect:{kind:"play",binding:"nami-free-play"}}]}}}}]],trigger:[["OP14-102",playThrillerBarkFromTrashRested],["OP14-110",playThrillerBarkFromTrashRested],["OP14-111",playThrillerBarkFromTrashRested],["OP06-104",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:3},then:{kind:"play",binding:SOURCE_BINDING}}}],["OP14-104",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",maxCost:4,excludeSource:true},bind:"free-play",min:0,max:1,effect:{kind:"play",binding:"free-play"}}}],["OP09-112",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Revolutionary Army"},then:{kind:"if",condition:{kind:"combined-life",operator:"lte",value:5},then:{kind:"play",binding:SOURCE_BINDING}}}}],["OP14-108",asOnPlayTrigger(rayleighRemoval)],["OP16-119",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"teach-negate",min:0,max:1,effect:{kind:"negate",binding:"teach-negate",expiresAfterTurns:0}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"teach-ko",min:0,max:1,effect:{kind:"knock-out",binding:"teach-ko"}}]}}]]};var myEraBegins=lookAndAddOrTrash(3,"op09-my-era",{type:"Blackbeard Pirates",excludeName:"My Era...Begins!!"});var op16TeachMechanics={activateMain:[["OP09-093",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"Blackbeard Pirates"},{kind:"source-played-this-turn"}]},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:[],includeLeader:true},bind:"op09-teach-leader",min:0,max:1,effect:{kind:"negate",binding:"op09-teach-leader",expiresAfterTurns:0}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op09-teach-character",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"negate",binding:"op09-teach-character",expiresAfterTurns:1},{kind:"restrict",binding:"op09-teach-character",restriction:"cannot-attack",expiresAfterTurns:1}]}}]}}}}],["OP09-099",{oncePerTurn:false,requires:{handCards:1,sourceActive:true},program:{effect:payFromHand({player:"self",zone:"hand"},"op09-fullalead-cost",1,{kind:"sequence",effects:[{kind:"update",binding:SOURCE_BINDING,rested:true},lookAndAdd(3,"op09-fullalead-looked",{type:"Blackbeard Pirates"}).effect]})}}]],eventMain:[["OP09-096",{cost:1,program:myEraBegins}],["EB04-059",{cost:6,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top"},bind:"eb04-twister-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:"eb04-twister-life",faceUp:true},{kind:"if",condition:{kind:"character-count-versus",player:"self",operator:"lt"},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"eb04-twister-six",min:0,max:1,effect:{kind:"knock-out",binding:"eb04-twister-six"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"eb04-twister-five",min:0,max:1,effect:{kind:"knock-out",binding:"eb04-twister-five"}}]}}]}}}}}]],trigger:[["OP09-096",myEraBegins],["EB04-059",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb04-twister-discard",min:1,max:1,effect:{kind:"move",binding:"eb04-twister-discard",to:{player:"self",zone:"trash"}}}]}}]]};var op17BattleMechanics={counterEvent:[["OP17-017",{cost:1,power:2e3,target:{typeIncluding:"Whitebeard Pirates"},program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"op17-gura-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op17-gura-debuff",amount:-2e3,expiresAfterTurns:0}}}}],["OP17-097",{cost:1,power:3e3,target:{isLeader:true}}],["OP17-098",{cost:1,power:3e3,target:{isLeader:true}}],["OP17-078",{cost:2,power:4e3}],["OP17-115",{cost:1,power:4e3,target:{name:"Charlotte Linlin"}}],["OP17-036",{cost:1,power:4e3,target:{name:"Shanks"}}],["OP17-117",{cost:1,power:3e3,target:{name:"Charlotte Linlin"}}],["OP17-055",{cost:0,power:2e3,target:{typeIncluding:"Rocks Pirates"}}],["OP17-056",{cost:0,power:2e3,target:{typeIncluding:"Rocks Pirates"}}],["OP17-096",{cost:1,power:4e3}],["OP17-018",{cost:1,power:4e3}],["OP17-116",{cost:1,power:4e3}],["OP17-037",{cost:1,power:0,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:restableCards("self"),bind:"op17-037-cost",min:1,max:1,effect:{kind:"rest",binding:"op17-037-cost"}},{kind:"battle-power",player:"self",amount:3e3}]}}}}],["OP17-076",{cost:0,power:0,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-076-cost",min:1,max:1,effect:{kind:"move",binding:"op17-076-cost",to:{player:"self",zone:"trash"}}},{kind:"battle-power",player:"self",amount:3e3}]}}}}],["OP17-038",{cost:0,power:0,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-038-counter-cost",min:1,max:1,effect:{kind:"move",binding:"op17-038-counter-cost",to:{player:"self",zone:"trash"}}},{kind:"battle-power",player:"self",amount:3e3}]}}}}],["OP17-077",{cost:1,power:0,program:{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:1},then:{kind:"return-don",player:"self",count:1}}}}]],onOpponentAttack:[["OP17-014",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"battle-power",player:"self",amount:1e3,target:{isLeader:true}}]}}}}],["OP17-057",{oncePerTurn:false,requires:{handCards:1,sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-fullalead-cost",min:1,max:1,effect:{kind:"move",binding:"op17-fullalead-cost",to:{player:"self",zone:"trash"}}},{kind:"battle-power",player:"self",amount:1e3,target:{typeIncluding:"Rocks Pirates"}}]}}}}],["OP17-064",{oncePerTurn:true,requires:{handCards:1},program:trashForBattlePower(2e3,"op17-king-cost")}],["OP17-072",{oncePerTurn:true,requires:{handCards:1},program:trashForBattlePower(1e3,"op17-black-maria-cost")}],["OP17-001",{oncePerTurn:true,requires:{handCards:1},program:trashForBattlePower(4e3,"op17-newgate001-cost")}],["OP17-049",{oncePerTurn:true,requires:{handCards:1},program:trashForBattlePower(1e3,"op17-linlin049-cost")}],["OP17-033",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"op17-lucky-roux-target",min:0,max:1,effect:{kind:"rest",binding:"op17-lucky-roux-target"}}]}}}}],["OP17-048",{oncePerTurn:true,requires:{handCardsMatching:{match:{typeIncluding:"Rocks Pirates"},count:1}},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",typeIncluding:"Rocks Pirates"},bind:"op17-shiki048-cost",min:1,max:1,effect:{kind:"move",binding:"op17-shiki048-cost",to:{player:"self",zone:"trash"}}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op17-shiki048-target",min:0,max:1,effect:{kind:"modify-power",binding:"op17-shiki048-target",amount:-3e3,expiresAfterTurns:0}}]}}}}],["OP17-058",{oncePerTurn:true,requires:{fieldDon:1},program:{effect:donMinus(1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op17-kaido058-target",min:0,max:1,effect:{kind:"modify-power",binding:"op17-kaido058-target",amount:-2e3,expiresAfterTurns:0}})}}]],leaderWatcher:[["OP17-040",{oncePerTurn:true,requires:{handCards:1,leaderTypeIncluding:"Rocks Pirates"},program:trashForBattlePower(3e3,"op17-newgate040-cost",{isLeader:true})}]],whenAttacking:[["OP17-011",{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:2},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op17-blamenco-target",min:0,max:1,effect:{kind:"modify-power",binding:"op17-blamenco-target",amount:-4e3,expiresAfterTurns:0}}}}],["OP17-039",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-xebec039-cost",min:1,max:1,effect:{kind:"move",binding:"op17-xebec039-cost",to:{player:"self",zone:"trash"}}},{kind:"look-at",player:"self",count:1,bind:"op17-xebec039-reveal"},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"deck",binding:"op17-xebec039-reveal",typeIncluding:"Rocks Pirates"},operator:"gte",value:1},then:{kind:"draw",player:"self",count:2}}]}}}],["OP17-026",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Red-Haired Pirates"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"op17-fugar-target",min:0,max:1,effect:{kind:"rest",binding:"op17-fugar-target"}}}}],["OP17-068",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-sasaki-cost",min:2,max:2,effect:{kind:"move",binding:"op17-sasaki-cost",to:{player:"self",zone:"trash"}}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},then:{kind:"add-don",player:"self",count:2,rested:true}}]}}}],["OP17-099",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-linlin099-cost",min:1,max:1,effect:{kind:"move",binding:"op17-linlin099-cost",to:{player:"self",zone:"trash"}}},{kind:"choice",chooser:"opponent",branches:[{id:"mill-then-life",label:"Trash 1 from hand, top deck card to Life",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-linlin099-mill",min:1,max:1,effect:{kind:"move",binding:"op17-linlin099-mill",to:{player:"self",zone:"trash"}}},{kind:"choose",selector:{player:"self",zone:"deck",position:"top"},bind:"op17-linlin099-life",min:0,max:1,effect:{kind:"move",binding:"op17-linlin099-life",to:{player:"self",zone:"life",position:"top"}}}]}},{id:"opponent-discards",label:"Trash 1 card at random from your opponent's hand",effect:{kind:"pick-from-hand",player:"opponent",pick:"random",bind:"op17-linlin099-discard",effect:{kind:"move",binding:"op17-linlin099-discard",to:{player:"opponent",zone:"trash"}}}}]}]}}}}],["OP17-048",{oncePerTurn:true,requires:{handCardsMatching:{match:{typeIncluding:"Rocks Pirates"},count:1}},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",typeIncluding:"Rocks Pirates"},bind:"op17-shiki048-cost",min:1,max:1,effect:{kind:"move",binding:"op17-shiki048-cost",to:{player:"self",zone:"trash"}}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op17-shiki048-target",min:0,max:1,effect:{kind:"modify-power",binding:"op17-shiki048-target",amount:-3e3,expiresAfterTurns:0}}]}}}}],["OP17-058",{oncePerTurn:true,requires:{fieldDon:1},program:{effect:donMinus(1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op17-kaido058-target",min:0,max:1,effect:{kind:"modify-power",binding:"op17-kaido058-target",amount:-2e3,expiresAfterTurns:0}})}}]]};var op17MainMechanics={eventMain:[["OP17-097",{cost:1,program:{effect:{kind:"select",selector:{player:"opponent",zone:"board",category:"character"},bind:"op17-rage-all",count:"all",effect:{kind:"modify-cost",binding:"op17-rage-all",amount:-1,expiresAfterTurns:0}}}}],["OP17-098",{cost:1,restDon:6,program:{effect:{kind:"if",condition:elbaphGiantOut,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"op17-kong-ko",min:0,max:2,effect:{kind:"knock-out",binding:"op17-kong-ko"}}}}}],["OP17-078",{cost:2,restDon:2,trashFromHand:2,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-bagua-cost",min:2,max:2,effect:{kind:"move",binding:"op17-bagua-cost",to:{player:"self",zone:"trash"}}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},then:{kind:"add-don",player:"self",count:3,rested:true}}]}}}],["OP17-115",{cost:1,program:{effect:{kind:"select",selector:{player:"self",zone:"board",includeLeader:true,category:"leader",name:"Charlotte Linlin"},bind:"op17-honour-leader",count:1,effect:{kind:"grant-keyword",binding:"op17-honour-leader",keyword:"Unblockable",expiresAfterTurns:0}}}}],["OP17-019",{cost:1,program:lookAndAdd(5,"op17-019-look",{typeIncluding:"Whitebeard Pirates"})}],["OP17-037",{cost:1,program:lookAndAdd(5,"op17-037-look",{typeIncluding:"Red-Haired Pirates"})}],["OP17-038",{cost:0,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:restableCards("self"),operator:"gte",value:4},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:restableCards("self"),bind:"op17-038-cost",min:4,max:4,effect:{kind:"rest",binding:"op17-038-cost"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",canRest:true},bind:"op17-038-target",min:0,max:1,effect:{kind:"rest",binding:"op17-038-target"}}]}}}}}],["OP17-077",{cost:1,restDon:3,trashFromHand:2,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-077-cost",min:2,max:2,effect:{kind:"move",binding:"op17-077-cost",to:{player:"self",zone:"trash"}}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},then:{kind:"add-don",player:"self",count:3,rested:true}}]}}}],["OP17-036",{cost:1,restDon:6,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board"},bind:"op17-036-rest",min:0,max:1,effect:{kind:"rest",binding:"op17-036-rest"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:6},bind:"op17-036-ko",min:0,max:2,effect:{kind:"knock-out",binding:"op17-036-ko"}}]}}}],["OP17-055",{cost:0,restDon:1,program:{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name:"Rocks.D.Xebec"},bind:"op17-055-target",min:0,max:1,effect:{kind:"grant-keyword",binding:"op17-055-target",keyword:"Unblockable",expiresAfterTurns:0}}}}],["OP17-056",{cost:0,restDon:5,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"op17-056-bounce",min:0,max:1,effect:{kind:"move",binding:"op17-056-bounce",to:{player:"opponent",zone:"hand"}}}}}],["OP17-018",{cost:1,restDon:2,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"stage"},bind:"op17-018-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op17-018-ko"}}}}],["OP17-116",{cost:1,restDon:2,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"stage"},bind:"op17-116-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op17-116-ko"}}}}]],activateMain:[["OP17-020",{oncePerTurn:true,program:{effect:{kind:"optional",effect:{kind:"choice",branches:[{id:"hand",label:"Trash 1 from hand",effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-shanks020-hand",min:1,max:1,effect:{kind:"move",binding:"op17-shanks020-hand",to:{player:"self",zone:"trash"}}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true},bind:"op17-shanks020-target-hand",min:0,max:1,effect:{kind:"restrict",binding:"op17-shanks020-target-hand",restriction:"cannot-refresh",expiresAfterTurns:1}}]}}},{id:"don",label:"Rest 1 DON!!",effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true},bind:"op17-shanks020-target-don",min:0,max:1,effect:{kind:"restrict",binding:"op17-shanks020-target-don",restriction:"cannot-refresh",expiresAfterTurns:1}}]}}}]}}}}],["OP17-044",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-captainjohn-cost",min:1,max:1,effect:{kind:"move",binding:"op17-captainjohn-cost",to:{player:"self",zone:"trash"}}}]}}}}],["OP17-010",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",minCurrentPower:1e4},operator:"gte",value:1},then:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",includeLeader:true,name:"Fossa",excludeSource:true},operator:"eq",value:0},then:{kind:"sequence",effects:[{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Blocker",expiresAfterTurns:1},{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:1}]}}}}}],["OP17-030",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:5},then:{kind:"activate-don",player:"self",count:1}}}}],["OP17-053",{oncePerTurn:true,requires:{handCards:1},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-barbell-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op17-barbell-cost",to:{player:"self",zone:"trash"}},{kind:"modify-power",binding:SOURCE_BINDING,amount:3e3,expiresAfterTurns:0}]}}}}}],["OP17-101",{oncePerTurn:true,program:lifeToHandCost({kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op17-caribou-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op17-caribou-debuff",amount:-3e3,expiresAfterTurns:0}},"top")}],["OP17-034",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"leader-power",player:"opponent",operator:"gte",value:6e3},then:{kind:"sequence",effects:[{kind:"activate-don",player:"self",count:1},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Red-Haired Pirates"},then:{kind:"set-leader-base-power",player:"self",value:6e3,expiresAfterTurns:1}}]}}}}],["OP17-063",{oncePerTurn:true,requires:{fieldDon:1},program:{effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"if",condition:{kind:"source-played-this-turn"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"op17-kaido063-target",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"negate",binding:"op17-kaido063-target",expiresAfterTurns:0},{kind:"knock-out",binding:"op17-kaido063-target"}]}}}]}}}],["OP17-025",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Shanks"},then:{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"}}}}],["OP17-054",{oncePerTurn:false,requires:{activeDon:3},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:3},{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"opponent",zone:"board"},bind:"op17-stussy-target",min:0,max:1,effect:{kind:"restrict",binding:"op17-stussy-target",restriction:"cannot-attack",expiresAfterTurns:1}}]}}}}],["OP17-061",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"self",zone:"hand",anyOf:[{name:"King"},{name:"Queen"},{name:"Jack"}]},bind:"op17-lead-performers-play",min:0,max:1,effect:{kind:"play",binding:"op17-lead-performers-play"}}]}}}}]]};var claimTheOnePiece={effect:{kind:"if",condition:{kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},{kind:"leader-has-type",player:"self",type:"Big Mom Pirates"}]},then:lookAndAdd(5,"op07-claim-look",{anyOf:[{type:"Animal Kingdom Pirates"},{type:"Big Mom Pirates"}]}).effect}};var op17KaidoMechanics={replacement:[["EB04-030",{opponentEffectOnly:false,oncePerTurn:false,label:"Return 1 DON!! card to your DON!! deck",cost:{kind:"return-don",count:1}}],["EB04-031",{opponentEffectOnly:false,oncePerTurn:false,label:"Return 1 DON!! card to your DON!! deck",cost:{kind:"return-don",count:1}}]],onPlay:[["EB04-030",{effect:donMinus(2,{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},then:{kind:"sequence",effects:[{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:7},bind:"eb04-kaido-rest",min:0,max:1,effect:{kind:"rest",binding:"eb04-kaido-rest"}}]}})}],["EB04-032",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"hand",type:"Animal Kingdom Pirates"},operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",type:"Animal Kingdom Pirates"},bind:"eb04-queen-cost",min:1,max:1,effect:{kind:"move",binding:"eb04-queen-cost",to:{player:"self",zone:"trash"}}},{kind:"draw",player:"self",count:2}]}}}}]],activateMain:[["EB04-031",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",name:"King"},operator:"lte",value:1}]},then:{kind:"sequence",effects:[{kind:"add-don",player:"self",count:1,rested:false},{kind:"add-don",player:"self",count:1,rested:true}]}}}}],["EB04-032",{oncePerTurn:true,requires:{activeDon:2},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:2},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},then:{kind:"add-don",player:"self",count:1,rested:true}}]}}}}]],eventMain:[["OP07-077",{cost:1,program:claimTheOnePiece}]],trigger:[["OP07-077",claimTheOnePiece]]};var molePistol={effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"st21-017-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"st21-017-debuff",amount:-5e3,expiresAfterTurns:0}},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",minCurrentPower:6e3},operator:"gte",value:1},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:2e3},bind:"st21-017-ko",min:0,max:1,effect:{kind:"knock-out",binding:"st21-017-ko"}}}]}};var op17LuffyAceMechanics={onPlay:[["ST30-012",{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}]}}}}],["EB02-017",lookAndAdd(5,"eb02-017-look",{type:"Straw Hat Crew",excludeName:"Nami"})],["EB04-002",lookAndAdd(4,"eb04-002-look",{anyOf:[{type:"Egghead"},{type:"Straw Hat Crew"}],excludeName:"Jewelry Bonney"})],["P-135",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5,canRest:true},bind:"p-135-rest",min:0,max:1,effect:{kind:"rest",binding:"p-135-rest"}}}]],whenAttacking:[["ST30-012",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",keyword:"Blocker",canRest:true},bind:"st30-012-rest-blocker",min:0,max:1,effect:{kind:"rest",binding:"st30-012-rest-blocker"}}}]],eventMain:[["ST21-017",{cost:4,program:molePistol}]],trigger:[["ST21-017",molePistol]]};var revolutionaryArmyLeader4={kind:"leader-has-type",player:"self",type:"Revolutionary Army"};var sourceAtLeast7000={kind:"source-current-power",operator:"gte",value:7e3};var sourceHasDon={kind:"source-attached-don",operator:"gte",value:1};var eightFieldDon={kind:"field-don",player:"self",operator:"gte",value:8};var donBehindStrict={kind:"field-don-versus",player:"self",operator:"lt"};var multicoloredLeader={kind:"leader-multicolored",player:"self"};var debuffLeaderOrCharacter=(amount,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind,min:0,max:1,effect:{kind:"modify-power",binding:bind,amount:-amount,expiresAfterTurns:0}});var koPowerAtMost2=(maxCurrentPower,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower},bind,min:0,max:1,effect:{kind:"knock-out",binding:bind}});var koRestedCostAtMost2=(maxCost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost},bind,min:0,max:1,effect:{kind:"knock-out",binding:bind}});var koCostAtMostOpponentLife=bind=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCostFromZoneCount:{player:"opponent",zone:"life"}},bind,min:0,max:1,effect:{kind:"knock-out",binding:bind}});var bounceEitherCostAtMost=(maxCost,bind)=>({kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost},bind,min:0,max:1,effect:{kind:"move",binding:bind,to:{player:"owner",zone:"hand"}}});var revolutionaryArmyBody={category:"character",type:"Revolutionary Army",maxPower:5e3};var trashToPlaySelfBehindMulticolor=bind=>({kind:"if",condition:multicoloredLeader,then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:bind,to:{player:"self",zone:"trash"}},{kind:"play",binding:SOURCE_BINDING}]}}}});var opponentCharacterToLife=(maxCost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost},bind,min:0,max:1,effect:{kind:"choice",branches:[{id:"life-top",label:"Place it at the top of their Life cards face-up",effect:{kind:"move",binding:bind,to:{player:"owner",zone:"life",position:"top"},faceUp:true}},{id:"life-bottom",label:"Place it at the bottom of their Life cards face-up",effect:{kind:"move",binding:bind,to:{player:"owner",zone:"life",position:"bottom"},faceUp:true}}]}});var restAndBuryTwoFromTrash=(bind,effect)=>({kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:2},then:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"trash"},bind,min:2,max:2,effect:{kind:"sequence",effects:[{kind:"order-to-bottom",binding:bind,to:{player:"self",zone:"deck",position:"bottom"}},effect]}}]}});var blackCharacterFromTrash=(minCost,maxCost,bind,excludeName)=>({kind:"choose",selector:{player:"self",zone:"trash",category:"character",color:"Black",minCost,maxCost,...excludeName?{excludeName}:{}},bind,min:0,max:1,effect:{kind:"move",binding:bind,to:{player:"self",zone:"hand"}}});var amazonDilemma={kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"gte",value:1},then:{kind:"choice",chooser:"opponent",branches:[{id:"trash-life",label:"Trash the top card of your Life",effect:{kind:"select",selector:{player:"opponent",zone:"life",position:"top"},bind:"op05-amazon-life",count:1,effect:{kind:"move",binding:"op05-amazon-life",to:{player:"opponent",zone:"trash"}}}},{id:"take-debuff",label:"Keep the Life card and let Amazon give −2000 power",effect:debuffLeaderOrCharacter(2e3,"op05-amazon-debuff")}]},else:debuffLeaderOrCharacter(2e3,"op05-amazon-debuff")};var op05BattleMechanics={counterEvent:[["OP05-018",{cost:3,power:3e3,program:{effect:playFromHand(revolutionaryArmyBody,"op05-hormone-play")}}],["OP05-037",{cost:0,trashFromHand:1,power:0,program:trashForBattlePower(3e3,"op05-justice-cost")}],["OP05-038",{cost:2,power:4e3,program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op05-charlestone-cost",1,{kind:"activate-don",player:"self",count:3})}}}],["OP05-039",{cost:2,power:4e3,program:{effect:koRestedCostAtMost2(3,"op05-meteora-ko")}}],["OP05-095",{cost:2,power:4e3,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:15},then:koCostAtMost(4,"op05-dragon-claw-ko")}}}],["OP05-114",{cost:1,power:2e3,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:2},then:{kind:"battle-power",player:"self",amount:2e3}}}}]],whenAttacking:[["OP05-005",{effect:{kind:"if",condition:sourceAtLeast7000,then:debuffLeaderOrCharacter(1e3,"op05-karasu-attack-debuff")}}],["OP05-014",{effect:{kind:"if",condition:sourceHasDon,then:powerDebuff(2e3,"op05-pell-debuff")}}],["OP05-016",{effect:{kind:"if",condition:sourceAtLeast7000,then:{kind:"disable-blockers"}}}],["OP05-017",{effect:{kind:"if",condition:sourceAtLeast7000,then:koPowerAtMost2(3e3,"op05-lindbergh-ko")}}],["OP05-023",{effect:{kind:"if",condition:sourceHasDon,then:koRestedCostAtMost2(3,"op05-vergo-ko")}}],["OP05-026",{oncePerTurn:true,program:{effect:{kind:"if",condition:sourceHasDon,then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",minCost:3,rested:false,canRest:true,excludeSource:true},bind:"op05-sarquiss-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:"op05-sarquiss-cost"},{kind:"update",binding:SOURCE_BINDING,rested:false}]}}}}}}],["OP05-031",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",rested:true},operator:"gte",value:2},then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",rested:true,minCost:1,maxCost:1},bind:"op05-buffalo-stand",min:0,max:1,effect:{kind:"update",binding:"op05-buffalo-stand",rested:false}}}}}],["OP05-041",{effect:costDebuff(1,"op05-sakazuki-debuff")}],["OP05-048",{effect:{kind:"if",condition:sourceHasDon,then:buryCostAtMost(2,"op05-bastille-bury")}}],["OP05-049",{effect:{kind:"if",condition:sourceHasDon,then:bounceEitherCostAtMost(3,"op05-haccha-bounce")}}],["OP05-061",{effect:{kind:"if",condition:{kind:"all-of",conditions:[sourceHasDon,eightFieldDon]},then:restCostAtMost2(4,"op05-usohachi-rest")}}],["OP05-067",{effect:{kind:"if",condition:lifeAtMost(3),then:{kind:"add-don",player:"self",count:1,rested:false}}}],["OP05-069",{effect:{kind:"if",condition:donBehindStrict,then:lookAndAdd(5,"op05-law-look",{type:"Heart Pirates"}).effect}}],["OP05-071",{effect:{kind:"if",condition:donBehindStrict,then:powerDebuff(2e3,"op05-bepo-debuff")}}],["OP05-080",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:20},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash"},bind:"op05-elizabello-cost",min:20,max:20,effect:{kind:"sequence",effects:[{kind:"move",binding:"op05-elizabello-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"shuffle-deck",player:"self"},{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Double Attack",expiresAfterTurns:0},{kind:"battle-power",player:"self",amount:1e4}]}}}}}}],["OP05-087",{effect:{kind:"if",condition:sourceHasDon,then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",excludeSource:true},bind:"op05-hakuba-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"knock-out",binding:"op05-hakuba-cost"},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"trash",binding:"op05-hakuba-cost"},operator:"gte",value:1},then:costDebuff(5,"op05-hakuba-debuff")}]}}}}}]],onOpponentAttack:[["OP05-029",{oncePerTurn:true,requires:{activeDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},restCostAtMost2(6,"op05-doflamingo-rest")]}}}}],["OP05-075",{oncePerTurn:true,requires:{fieldDon:1},program:{effect:donMinus(1,playFromHand({category:"character",type:"Baroque Works",maxCost:3},"op05-mr1-play"))}}],["OP05-099",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},amazonDilemma]}}}}]],onBlock:[["OP05-036",{oncePerTurn:false,program:{effect:restCostAtMost2(4,"op05-monet-rest")}}],["OP05-047",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:3},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"battle-power",player:"self",amount:1e3}]}}}}]]};var trashSelfFor=effect=>({kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},effect]});var restDonAndSelfFor=effect=>({kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"rest",binding:SOURCE_BINDING},effect]});var fireFist={kind:"sequence",effects:[powerDebuff(4e3,"op05-fire-fist-debuff"),{kind:"if",condition:lifeAtMost(2),then:koPowerAtMost2(0,"op05-fire-fist-ko")}]};var wanoSearch=lookAndAdd(3,"op05-wano-look",{anyOf:[{type:"Straw Hat Crew"},{type:"Kid Pirates"},{type:"Heart Pirates"}]});var hinoBirdZap=koCostAtMostOpponentLife("op05-hino-bird-ko");var op05MainMechanics={eventMain:[["OP05-019",{cost:2,program:{effect:fireFist}}],["OP05-020",{cost:2,program:{effect:{kind:"sequence",effects:[buffOwnCardForTurn(2e3,"op05-brick-fist-buff"),koPowerAtMost2(2e3,"op05-brick-fist-ko")]}}}],["OP05-057",{cost:2,program:{effect:{kind:"sequence",effects:[buffOwnCardForTurn(3e3,"op05-hound-blaze-buff"),buryCostAtMost(2,"op05-hound-blaze-bury")]}}}],["OP05-058",{cost:8,program:{effect:{kind:"sequence",effects:[{kind:"select",selector:{player:"either",zone:"board",category:"character",maxCost:3},bind:"op05-waste-bury",count:"all",effect:{kind:"order-to-bottom",binding:"op05-waste-bury",byOwner:true,to:{player:"owner",zone:"deck",position:"bottom"}}},{kind:"trash-hand-down-to",player:"self",size:5},{kind:"trash-hand-down-to",player:"opponent",size:5}]}}}],["OP05-059",{cost:5,program:{effect:{kind:"sequence",effects:[{kind:"if",condition:multicoloredLeader,then:{kind:"draw",player:"self",count:1}},bounceEitherCostAtMost(5,"op05-violence-bounce")]}}}],["OP05-076",{cost:1,program:wanoSearch}],["OP05-078",{cost:2,donMinus:1,program:{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,type:"Kid Pirates"},bind:"op05-punk-rotten-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op05-punk-rotten-buff",amount:5e3,expiresAfterTurns:0}}}}],["OP05-094",{cost:1,program:{effect:{kind:"sequence",effects:[costDebuff(3,"op05-patchwork-debuff"),{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:0},bind:"op05-patchwork-lock",min:0,max:1,effect:{kind:"restrict",binding:"op05-patchwork-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}]}}}],["OP05-096",{cost:3,program:{effect:{kind:"sequence",effects:[{kind:"choice",branches:[{id:"ko",label:"K.O. a Character with a cost of 1 or less",effect:koCostAtMost(1,"op05-bid-ko")},{id:"bounce",label:"Return a Character with a cost of 1 or less to hand",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1},bind:"op05-bid-bounce",min:0,max:1,effect:{kind:"move",binding:"op05-bid-bounce",to:{player:"owner",zone:"hand"}}}},{id:"life",label:"Place a Character with a cost of 1 or less into their Life face-up",effect:opponentCharacterToLife(1,"op05-bid-life")}]},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"Celestial Dragons"},operator:"gte",value:1},then:{kind:"draw",player:"self",count:1}}]}}}],["OP05-115",{cost:2,program:{effect:{kind:"sequence",effects:[buffOwnCardForTurn(3e3,"op05-amaru-buff"),{kind:"if",condition:lifeAtMost(1),then:restCostAtMost2(4,"op05-amaru-rest")}]}}}],["OP05-116",{cost:2,program:{effect:hinoBirdZap}}]],activateMain:[["OP05-002",{oncePerTurn:true,requires:{handCardsMatching:{match:{type:"Revolutionary Army"},count:1}},program:{effect:payFromHand({player:"self",zone:"hand",type:"Revolutionary Army"},"op05-betty-leader-cost",1,{kind:"choose",selector:{player:"self",zone:"board",category:"character",anyOf:[{type:"Revolutionary Army"},{hasTrigger:true}]},bind:"op05-betty-leader-buff",min:0,max:3,effect:{kind:"modify-power",binding:"op05-betty-leader-buff",amount:3e3,expiresAfterTurns:0}})}}],["OP05-004",{oncePerTurn:true,program:{effect:{kind:"if",condition:sourceAtLeast7000,then:playFromHand({...revolutionaryArmyBody,excludeName:"Emporio.Ivankov"},"op05-ivankov-play")}}}],["OP05-008",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"if",condition:sourceHasDon,then:{kind:"give-rested-don",player:"self",count:2}}}}],["OP05-021",{oncePerTurn:false,requires:{handCards:1,sourceActive:true},program:{effect:payFromHand({player:"self",zone:"hand"},"op05-hq-cost",1,{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},lookAndAdd(3,"op05-hq-look",{type:"Revolutionary Army"}).effect]})}}],["OP05-025",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},restCostAtMost2(3,"op05-gladius-rest")]}}}],["OP05-027",{oncePerTurn:false,program:{effect:trashSelfFor(restCostAtMost2(3,"op05-law-rest"))}}],["OP05-028",{oncePerTurn:false,program:{effect:trashSelfFor(koRestedCostAtMost2(2,"op05-doflamingo-ko"))}}],["OP05-033",{oncePerTurn:false,requires:{activeDon:1,sourceActive:true},program:{effect:restDonAndSelfFor(playFromHand({category:"character",type:"Donquixote Pirates",maxCost:2},"op05-baby5-play"))}}],["OP05-034",{oncePerTurn:false,requires:{activeDon:1,sourceActive:true},program:{effect:restDonAndSelfFor(lookAndAdd(5,"op05-baby5-look",{type:"Donquixote Pirates"}).effect)}}],["OP05-041",{oncePerTurn:true,requires:{handCards:1},program:{effect:payFromHand({player:"self",zone:"hand"},"op05-sakazuki-cost",1,{kind:"draw",player:"self",count:1})}}],["OP05-045",{oncePerTurn:false,requires:{handCards:1,sourceActive:true},program:{effect:payFromHand({player:"self",zone:"hand"},"op05-stainless-cost",1,{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},buryCostAtMost(2,"op05-stainless-bury")]})}}],["OP05-060",{oncePerTurn:true,requires:{lifeCards:1},program:lifeToHandCost({kind:"if",condition:{kind:"any-of",conditions:[{kind:"field-don",player:"self",operator:"lte",value:0},{kind:"field-don",player:"self",operator:"gte",value:3}]},then:{kind:"add-don",player:"self",count:1,rested:false}},"top")}],["OP05-081",{oncePerTurn:false,program:{effect:trashSelfFor(costDebuff(3,"op05-toy-soldier-debuff"))}}],["OP05-082",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:restAndBuryTwoFromTrash("op05-shirahoshi-cost",{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:6},then:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op05-shirahoshi-discard",min:1,max:1,chooser:"opponent",effect:{kind:"move",binding:"op05-shirahoshi-discard",to:{player:"opponent",zone:"trash"}}}})}}],["OP05-088",{oncePerTurn:false,requires:{activeDon:1,sourceActive:true},program:{effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},restAndBuryTwoFromTrash("op05-mansherry-cost",blackCharacterFromTrash(3,5,"op05-mansherry-recover"))]}}}],["OP05-089",{oncePerTurn:false,requires:{activeDon:1,sourceActive:true},program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",rested:false,canRest:true,excludeSource:true},operator:"gte",value:1},then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",rested:false,canRest:true,excludeSource:true},bind:"op05-mjosgard-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"rest",binding:SOURCE_BINDING},{kind:"rest",binding:"op05-mjosgard-cost"},blackCharacterFromTrash(1,1,"op05-mjosgard-recover")]}}}}}],["OP05-119",{oncePerTurn:true,requires:{activeDon:1},program:{effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"add-don",player:"self",count:1,rested:false}]}}}]]};var placeTopOrBottom=(binding,bind)=>({kind:"select",selector:{player:"self",zone:"deck",binding},bind,count:"all",effect:{kind:"order-to-bottom",binding:bind,to:{player:"self",zone:"deck",position:"top"},alternate:{player:"self",zone:"deck",position:"bottom"}}});var drawThenBottom=(count2,bind)=>({kind:"sequence",effects:[{kind:"draw",player:"self",count:count2},{kind:"choose",selector:{player:"self",zone:"hand"},bind,min:count2,max:count2,effect:{kind:"order-to-bottom",binding:bind,to:{player:"self",zone:"deck",position:"bottom"}}}]});var rikuBuff={kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Dressrosa"},bind:"op05-riku-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op05-riku-buff",amount:2e3,expiresAfterTurns:0}};var op05OnPlayMechanics={onPlay:[["OP05-005",{effect:{kind:"if",condition:revolutionaryArmyLeader4,then:debuffLeaderOrCharacter(1e3,"op05-karasu-debuff")}}],["OP05-006",{effect:{kind:"if",condition:revolutionaryArmyLeader4,then:powerDebuff(3e3,"op05-koala-debuff")}}],["OP05-007",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op05-sabo-ko",min:0,max:2,maxTotalPower:4e3,effect:{kind:"knock-out",binding:"op05-sabo-ko"}}}],["OP05-009",{effect:{kind:"if",condition:{kind:"leader-power",player:"self",operator:"lte",value:0},then:{kind:"draw",player:"self",count:1}}}],["OP05-010",{effect:koPowerAtMost2(1e3,"op05-robin-ko")}],["OP05-011",{effect:koPowerAtMost2(2e3,"op05-kuma-ko")}],["OP05-015",lookAndAdd(5,"op05-betty-look",{type:"Revolutionary Army",excludeName:"Belo Betty"})],["OP05-042",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:7},bind:"op05-issho-lock",min:0,max:1,effect:{kind:"restrict",binding:"op05-issho-lock",restriction:"cannot-attack",expiresAfterTurns:1}}}],["OP05-043",{effect:{kind:"if",condition:multicoloredLeader,then:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:3,bind:"op05-ulti-look"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"op05-ulti-look"},bind:"op05-ulti-add",min:0,max:1,effect:{kind:"move",binding:"op05-ulti-add",to:{player:"self",zone:"hand"}}},placeTopOrBottom("op05-ulti-look","op05-ulti-rest")]}}}],["OP05-050",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:5},then:{kind:"draw",player:"self",count:1}}}],["OP05-051",{effect:buryCostAtMost(4,"op05-borsalino-bury")}],["OP05-054",{effect:drawThenBottom(2,"op05-garp-bottom")}],["OP05-055",{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind:"op05-drake-look"},placeTopOrBottom("op05-drake-look","op05-drake-place")]}}],["OP05-056",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",excludeSource:true},bind:"op05-barrels-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op05-barrels-cost",to:{player:"owner",zone:"deck",position:"bottom"}},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"deck",binding:"op05-barrels-cost"},operator:"gte",value:1},then:{kind:"draw",player:"self",count:1}}]}}}}],["OP05-063",{effect:{kind:"if",condition:eightFieldDon,then:koCostAtMost(3,"op05-robi-ko")}}],["OP05-064",lookAndAdd(5,"op05-killer-look",{type:"Kid Pirates",excludeName:"Killer"})],["OP05-068",{effect:{kind:"if",condition:eightFieldDon,then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",color:"Purple",type:"Straw Hat Crew",maxCurrentPower:6e3,rested:true},bind:"op05-chopaemon-stand",min:0,max:1,effect:{kind:"update",binding:"op05-chopaemon-stand",rested:false}}}}],["OP05-072",{effect:{kind:"if",condition:eightFieldDon,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op05-honekichi-debuff",min:0,max:2,effect:{kind:"modify-power",binding:"op05-honekichi-debuff",amount:-2e3,expiresAfterTurns:0}}}}],["OP05-073",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op05-zala-cost",1,{kind:"add-don",player:"self",count:1,rested:true})}}],["OP05-079",{effect:{kind:"choose",selector:{player:"opponent",zone:"trash"},bind:"op05-viola-bury",min:0,max:3,exhaustive:true,chooser:"opponent",effect:{kind:"order-to-bottom",binding:"op05-viola-bury",to:{player:"opponent",zone:"deck",position:"bottom"}}}}],["OP05-085",{effect:{kind:"trash-top",player:"self",count:1}}],["OP05-090",{effect:rikuBuff}],["OP05-091",{effect:{kind:"sequence",effects:[blackCharacterFromTrash(3,7,"op05-rebecca-recover","Rebecca"),{kind:"choose",selector:{player:"self",zone:"hand",category:"character",color:"Black",maxCost:3},bind:"op05-rebecca-play",min:0,max:1,effect:{kind:"play",binding:"op05-rebecca-play",rested:true}}]}}],["OP05-093",{effect:payFromTrash(3,"op05-lucci-cost",{kind:"sequence",effects:[koCostAtMost(2,"op05-lucci-ko-two"),koCostAtMost(1,"op05-lucci-ko-one")]})}],["OP05-101",{effect:{kind:"sequence",effects:[lookAndAdd(5,"op05-ohm-look",{name:"Holly"}).effect,playFromHand({name:"Holly"},"op05-ohm-play")]}}],["OP05-102",{effect:koCostAtMostOpponentLife("op05-gedatsu-ko")}],["OP05-103",{effect:{kind:"if",condition:haveNamed("Hotori"),then:koCostAtMostOpponentLife("op05-kotori-ko")}}],["OP05-104",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"stage"},bind:"op05-conis-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op05-conis-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"draw",player:"self",count:1},payFromHand({player:"self",zone:"hand"},"op05-conis-trash",1,{kind:"sequence",effects:[]})]}}}}],["OP05-106",lookAndAdd(5,"op05-shura-look",{type:"Sky Island",excludeName:"Shura"})],["OP05-111",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand",name:"Kotori"},bind:"op05-hotori-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"play",binding:"op05-hotori-cost"},opponentCharacterToLife(3,"op05-hotori-target")]}}}}],["OP05-117",lookAndAdd(5,"op05-upper-yard-look",{type:"Sky Island"})],["OP05-118",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:3},then:{kind:"draw",player:"self",count:4}}}],["OP05-119",{effect:donMinus(10,{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:"board",category:"character",excludeSource:true},bind:"op05-luffy-bury",count:"all",effect:{kind:"order-to-bottom",binding:"op05-luffy-bury",to:{player:"self",zone:"deck",position:"bottom"}}},{kind:"extra-turn",player:"self"}]})}]],onKo:[["OP05-046",{effect:drawThenBottom(1,"op05-dalmatian-bottom")}],["OP05-090",{effect:rikuBuff}],["OP05-112",{effect:playFromHand({category:"character",type:"Sky Island",minCost:1,maxCost:1},"op05-mckinley-play")}]]};var op05ReplacementMechanics={replacement:[["OP05-001",{opponentEffectOnly:false,oncePerTurn:true,opponentTurnOnly:true,leaderAttachedDon:1,protects:{category:"character",minCurrentPower:5e3},label:"Give it −1000 power",cost:{kind:"power-penalty",amount:-1e3}}],["OP05-030",{opponentEffectOnly:false,oncePerTurn:false,opponentTurnOnly:true,protects:{category:"character",rested:true},label:"Trash Donquixote Rosinante",cost:{kind:"trash-self"}}],["OP05-032",{opponentEffectOnly:false,oncePerTurn:true,label:"Rest 1 of your other Characters with a cost of 3 or more",cost:{kind:"rest-own-cards",count:1,match:{category:"character",minCost:3,excludeName:"Pica"}}}],["OP05-100",{opponentEffectOnly:false,oncePerTurn:true,removal:"off-field",requires:{kind:"selector-count",player:"either",selector:{zone:"board",category:"character",name:"Monkey.D.Luffy"},operator:"eq",value:0},label:"Trash the top card of your Life",cost:{kind:"trash-life",count:1}}]]};var rampActive2={kind:"add-don",player:"self",count:1,rested:false};var playSelfBehindMulticolor={kind:"if",condition:multicoloredLeader,then:{kind:"play",binding:SOURCE_BINDING}};var op05TriggerMechanics={trigger:[["OP05-011",{effect:playSelfBehindMulticolor}],["OP05-016",{effect:trashToPlaySelfBehindMulticolor("op05-morley-trigger")}],["OP05-017",{effect:trashToPlaySelfBehindMulticolor("op05-lindbergh-trigger")}],["OP05-018",{effect:playFromHand(revolutionaryArmyBody,"op05-hormone-trigger")}],["OP05-019",{effect:fireFist}],["OP05-020",{effect:buffOwnCardForTurn(1e3,"op05-brick-fist-trigger")}],["OP05-037",{effect:restCostAtMost2(4,"op05-justice-trigger")}],["OP05-038",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true,maxCost:3,canRest:true},bind:"op05-charlestone-trigger",min:0,max:1,effect:{kind:"rest",binding:"op05-charlestone-trigger"}}}],["OP05-039",{effect:koRestedCostAtMost2(5,"op05-meteora-trigger")}],["OP05-057",{effect:bounceEitherCostAtMost(3,"op05-hound-blaze-trigger")}],["OP05-058",{effect:{kind:"select",selector:{player:"either",zone:"board",category:"character",maxCost:2},bind:"op05-waste-trigger",count:"all",effect:{kind:"order-to-bottom",binding:"op05-waste-trigger",byOwner:true,to:{player:"owner",zone:"deck",position:"bottom"}}}}],["OP05-059",{effect:{kind:"if",condition:multicoloredLeader,then:{kind:"draw",player:"self",count:2}}}],["OP05-073",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"play",binding:SOURCE_BINDING}]}}}}],["OP05-076",wanoSearch],["OP05-078",{effect:rampActive2}],["OP05-094",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},payFromHand({player:"self",zone:"hand"},"op05-patchwork-trigger",1,{kind:"sequence",effects:[]})]}}],["OP05-096",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"op05-bid-trigger",min:0,max:1,effect:{kind:"choice",branches:[{id:"ko",label:"K.O. it",effect:{kind:"knock-out",binding:"op05-bid-trigger"}},{id:"bounce",label:"Bounce it to hand",effect:{kind:"move",binding:"op05-bid-trigger",to:{player:"owner",zone:"hand"}}}]}}}],["OP05-105",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op05-satori-trigger",1,{kind:"play",binding:SOURCE_BINDING})}}],["OP05-106",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP05-114",{effect:koCostAtMostOpponentLife("op05-el-thor-trigger")}],["OP05-115",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op05-amaru-trigger",2,{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"op05-amaru-life",count:1,effect:{kind:"move",binding:"op05-amaru-life",to:{player:"self",zone:"life",position:"top"}}})}}],["OP05-116",{effect:hinoBirdZap}]],onEndOfYourTurn:[["OP05-022",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:6},then:{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"op05-rosinante-leader-stand",count:"all",effect:{kind:"update",binding:"op05-rosinante-leader-stand",rested:false}}}}],["OP05-032",{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"update",binding:SOURCE_BINDING,rested:false}]}}}}],["OP05-040",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:10},then:{kind:"sequence",effects:[{kind:"select",selector:{player:"either",zone:"board",category:"character",rested:true,maxCost:5},bind:"op05-birdcage-ko",count:"all",effect:{kind:"knock-out",binding:"op05-birdcage-ko"}},{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}}]}}}]]};var withDon=(count2,then)=>({kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:count2},then});var shuraiyaCopy={kind:"sequence",effects:[{kind:"select",selector:{player:"opponent",zone:[],includeLeader:true},bind:"op06-shuraiya-leader",count:1,effect:{kind:"copy-power",from:"op06-shuraiya-leader",to:SOURCE_BINDING,base:true,expiresAfterTurns:1}}]};var op06BattleMechanics={whenAttacking:[["OP06-001",{oncePerTurn:false,requires:{handCardsMatching:{match:filmCard,count:1}},program:{effect:{kind:"optional",effect:payFromHand({...filmCard,player:"self",zone:"hand"},"op06-uta-cost",1,{kind:"sequence",effects:[powerDebuff(2e3,"op06-uta"),addDonRested]})}}}],["OP06-006",{oncePerTurn:false,program:{effect:withDon(1,{kind:"sequence",effects:[{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:1},{kind:"at-end-of-turn-effect",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"FILM"},bind:"op06-saga-price",min:1,max:1,effect:{kind:"move",binding:"op06-saga-price",to:{player:"self",zone:"trash"}}}}]})}}],["OP06-009",{oncePerTurn:true,program:{effect:shuraiyaCopy}}],["OP06-028",{oncePerTurn:false,program:{effect:withDon(1,{kind:"if",condition:newFishManLeader,then:{kind:"sequence",effects:[{kind:"activate-don",player:"self",count:1},{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:0},lifeTopToHand]}})}}],["OP06-029",{oncePerTurn:true,program:{effect:withDon(1,{kind:"if",condition:newFishManLeader,then:{kind:"sequence",effects:[{kind:"update",binding:SOURCE_BINDING,rested:false},{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:0},lifeTopToHand]}})}}],["OP06-030",{oncePerTurn:false,program:{effect:{kind:"if",condition:newFishManLeader,then:{kind:"sequence",effects:[{kind:"restrict",binding:SOURCE_BINDING,restriction:"battle-ko-immune",expiresAfterTurns:1},{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:1},lifeTopToHand]}}}}],["OP06-055",{oncePerTurn:false,program:{effect:withDon(2,{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:4},then:{kind:"disable-blockers"}})}}],["OP06-080",{oncePerTurn:false,requires:{activeDon:2,handCards:1},program:{effect:withDon(1,{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:2},payFromHand({player:"self",zone:"hand"},"op06-moria-leader-cost",1,{kind:"sequence",effects:[{kind:"trash-top",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Thriller Bark Pirates",maxCost:4},bind:"op06-moria-leader",min:0,max:1,effect:{kind:"play",binding:"op06-moria-leader"}}]})]}})}}],["OP06-100",{oncePerTurn:false,requires:{handCards:1},program:{effect:withDon(2,{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op06-inuarashi-cost",1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCostFromZoneCount:{player:"opponent",zone:"life"}},bind:"op06-inuarashi",min:0,max:1,effect:{kind:"knock-out",binding:"op06-inuarashi"}})})}}],["OP06-103",{oncePerTurn:false,requires:{handCards:2},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op06-kawamatsu-cost",2,{kind:"choose",selector:{player:"self",zone:"board",category:"character",minCurrentPower:0,maxCurrentPower:0},bind:"op06-kawamatsu",min:0,max:1,effect:{kind:"choice",branches:[{id:"life-top",label:"Put it on top of Life",effect:{kind:"move",binding:"op06-kawamatsu",to:{player:"owner",zone:"life",position:"top"},faceUp:true}},{id:"life-bottom",label:"Add it to the bottom of your Life cards",effect:{kind:"move",binding:"op06-kawamatsu",to:{player:"owner",zone:"life",position:"bottom"},faceUp:true}}]}})}}}],["OP06-112",{oncePerTurn:false,requires:{handCards:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op06-raizo-cost",1,{kind:"rest-don",player:"opponent",count:1})}}}]],onBlock:[["OP06-009",{oncePerTurn:true,program:{effect:shuraiyaCopy}}]],onOpponentAttack:[["OP06-014",{oncePerTurn:false,requires:{handCardsMatching:{match:filmCard,count:1}},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{...filmCard,player:"self",zone:"hand"},bind:"op06-ratchet",min:1,max:10,effect:{kind:"sequence",effects:[{kind:"move",binding:"op06-ratchet",to:{player:"self",zone:"trash"}},{kind:"battle-power",player:"self",amount:1e3,perCard:"op06-ratchet"}]}}}}}]]};var buffOwnLeader=(amount,bind,perCards)=>({kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind,count:1,effect:{kind:"modify-power",binding:bind,amount,expiresAfterTurns:0,...perCards?{perCards}:{}}});var shadowsAsgard={kind:"sequence",effects:[buffOwnLeader(1e3,"op06-asgard-base"),{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Thriller Bark Pirates",maxCost:2},bind:"op06-asgard-fodder",min:0,max:5,effect:{kind:"sequence",effects:[{kind:"knock-out",binding:"op06-asgard-fodder"},buffOwnLeader(1e3,"op06-asgard-bonus",{binding:"op06-asgard-fodder",each:1})]}}]};var battleShield={kind:"select",selector:{player:"self",zone:"board",category:"character",maxCost:7},bind:"op06-nothing-at-all",count:"all",effect:{kind:"restrict",binding:"op06-nothing-at-all",restriction:"battle-ko-immune",expiresAfterTurns:0}};var sharkArrows={kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:3},bind:"op06-shark-arrows",min:0,max:2,effect:{kind:"knock-out",binding:"op06-shark-arrows"}};var murakumoSword={kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"op06-murakumo-first",min:0,max:1,effect:{kind:"sequence",effects:[]}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1,excludeBinding:"op06-murakumo-first"},bind:"op06-murakumo-second",min:0,max:1,effect:{kind:"sequence",effects:[]}},{kind:"order-to-bottom",binding:"op06-murakumo-first",also:["op06-murakumo-second"],byOwner:true,to:{player:"owner",zone:"deck",position:"bottom"}}]};var killingTime={kind:"choice",branches:[{id:"rest",label:"Rest a Character with a cost of 6 or less",effect:restCostAtMost2(6,"op06-killing-time-rest")},{id:"ko",label:"K.O. a rested Character with a cost of 6 or less",effect:koRestedCostAtMost(6,"op06-killing-time-ko")}]};var negativeHollow=trashFromOpponentHandBlind(1,"op06-negative-hollow");var op06MainMechanics={eventMain:[["OP06-017",{cost:2,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top"},bind:"op06-meteor-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op06-meteor-cost",to:{player:"self",zone:"hand"}},paidToHand("op06-meteor-cost",[buffOwnCardForTurn(3e3,"op06-meteor")])]}}}}}],["OP06-018",{cost:2,program:{effect:{kind:"sequence",effects:[buffOwnCardForTurn(3e3,"op06-gatling"),{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",minCurrentPower:7e3},operator:"gte",value:1},then:buffOwnCardForTurn(1e3,"op06-gatling-bonus")}]}}}],["OP06-019",{cost:3,program:{effect:koPowerAtMost(5e3,"op06-water-stream")}}],["OP06-039",{cost:4,program:{effect:killingTime}}],["OP06-040",{cost:2,program:{effect:sharkArrows}}],["OP06-056",{cost:2,program:{effect:murakumoSword}}],["OP06-057",{cost:1,program:{effect:{kind:"sequence",effects:[buffOwnCardForTurn(1e3,"op06-tears"),{kind:"look-at",player:"self",count:1,bind:"op06-tears-look"},{kind:"reveal",binding:"op06-tears-look"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"op06-tears-look",category:"character",minCost:2,maxCost:2},bind:"op06-tears-play",min:0,max:1,effect:{kind:"play",binding:"op06-tears-play"}},{kind:"select",selector:{player:"self",zone:"deck",binding:"op06-tears-look"},bind:"op06-tears-rest",count:"all",effect:{kind:"order-to-bottom",binding:"op06-tears-rest",to:{player:"self",zone:"deck",position:"bottom"},alternate:{player:"self",zone:"deck",position:"top"}}}]}}}],["OP06-058",{cost:7,program:{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:6},bind:"op06-gravity",min:0,max:2,effect:{kind:"order-to-bottom",binding:"op06-gravity",byOwner:true,to:{player:"owner",zone:"deck",position:"bottom"}}}}}],["OP06-077",{cost:4,program:{effect:{kind:"if",condition:donBehind,then:buryOpponentCostAtMost(5,"op06-black-bug")}}}],["OP06-078",{cost:1,program:lookAndAdd(5,"op06-germa-search",{typeIncluding:"GERMA",excludeName:"GERMA 66"})}],["OP06-095",{cost:2,program:{effect:shadowsAsgard}}],["OP06-097",{cost:2,program:{effect:negativeHollow}}],["OP06-116",{cost:4,program:{effect:{kind:"choice",branches:[{id:"ko",label:"K.O. a Character with a cost of 5 or less",effect:koCostAtMost(5,"op06-reject-ko")},{id:"damage",label:"Deal 1 damage while your opponent is on 1 Life",effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"eq",value:1},then:{kind:"sequence",effects:[{kind:"deal-damage",player:"opponent"},lifeTopToHand]}}}]}}}]],counterEvent:[["OP06-017",{cost:2,power:0,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top"},bind:"op06-meteor-counter-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op06-meteor-counter-cost",to:{player:"self",zone:"hand"}},paidToHand("op06-meteor-counter-cost",[buffOwnCardForTurn(3e3,"op06-meteor-counter")])]}}}}}],["OP06-059",{cost:2,power:0,program:{effect:{kind:"sequence",effects:[buffOwnCardForTurn(1e3,"op06-white-snake"),{kind:"draw",player:"self",count:1}]}}}],["OP06-095",{cost:2,power:0,program:{effect:shadowsAsgard}}],["OP06-096",{cost:3,power:0,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top"},bind:"op06-nothing-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op06-nothing-cost",to:{player:"self",zone:"hand"}},paidToHand("op06-nothing-cost",[battleShield])]}}}}}]],activateMain:[["OP06-011",{oncePerTurn:true,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name:"Uta",rested:false},bind:"op06-tot-musica-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:"op06-tot-musica-cost"},{kind:"modify-power",binding:SOURCE_BINDING,amount:5e3,expiresAfterTurns:0}]}}}}}],["OP06-015",{oncePerTurn:true,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",minCurrentPower:6e3},bind:"op06-lily-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"knock-out",binding:"op06-lily-cost"},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"FILM",minPower:2e3,maxPower:5e3},bind:"op06-lily",min:0,max:1,effect:{kind:"play",binding:"op06-lily",rested:true}}]}}}}}],["OP06-016",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"deck",position:"bottom"}},powerDebuff(3e3,"op06-raise-max")]}}}}],["OP06-020",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"rest-opponent-cards",player:"opponent",count:1,maxCost:3,match:{category:"character"}},{kind:"restrict-player",player:"self",restriction:"cannot-life-to-hand",expiresAfterTurns:0}]}}}}],["OP06-021",{oncePerTurn:true,program:{effect:{kind:"choice",branches:[{id:"rest",label:"Rest a Character with a cost of 4 or less",effect:restCostAtMost2(4,"op06-perona-leader-rest")},{id:"cost",label:"Give a Character −1 cost",effect:costDebuff(1,"op06-perona-leader-cost")}]}}}],["OP06-034",{oncePerTurn:true,program:{effect:{kind:"sequence",effects:[restCostAtMost2(4,"op06-hyouzou"),{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:0},lifeTopToHand]}}}],["OP06-043",{oncePerTurn:true,requires:{handCards:1},program:{effect:{kind:"if",condition:{kind:"selector-count",player:"either",selector:{zone:"board",category:"character",maxCost:2},operator:"gte",value:1},then:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op06-aramaki-cost",1,{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:2},bind:"op06-aramaki-bury",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op06-aramaki-bury",to:{player:"owner",zone:"deck",position:"bottom"}},{kind:"modify-power",binding:SOURCE_BINDING,amount:3e3,expiresAfterTurns:0}]}})}}}}],["OP06-060",germaSwapUp("Vinsmoke Ichiji",7,"op06-ichiji-swap")],["OP06-064",germaSwapUp("Vinsmoke Niji",5,"op06-niji-swap")],["OP06-066",germaSwapUp("Vinsmoke Yonji",4,"op06-yonji-swap")],["OP06-068",germaSwapUp("Vinsmoke Reiju",4,"op06-reiju-swap")],["OP06-062",{oncePerTurn:true,requires:{fieldDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"rest-don",player:"opponent",count:1}]}}}}],["OP06-079",{oncePerTurn:false,requires:{handCards:1,sourceActive:true},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op06-germa-stage-cost",1,{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},lookAndAdd(3,"op06-germa-stage",{typeIncluding:"GERMA"}).effect]})}}}],["OP06-083",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Thriller Bark Pirates"},bind:"op06-oars-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"knock-out",binding:"op06-oars-cost"},{kind:"negate",binding:SOURCE_BINDING,expiresAfterTurns:0}]}}}}}],["OP06-098",{oncePerTurn:false,requires:{activeDon:1,sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:thrillerBarkLeader,then:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Thriller Bark Pirates",maxCost:2},bind:"op06-thriller-bark",min:0,max:1,effect:{kind:"play",binding:"op06-thriller-bark",rested:true}}}]}}}}],["OP06-102",{oncePerTurn:true,program:{effect:payWithStage("op06-kamakiri-cost",koCostAtMost(2,"op06-kamakiri"))}}],["OP06-111",{oncePerTurn:true,program:{effect:payWithStage("op06-braham-cost",restCostAtMost2(4,"op06-braham"))}}],["OP06-117",{oncePerTurn:true,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name:"Enel",rested:false},bind:"op06-ark-maxim-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"rest",binding:"op06-ark-maxim-cost"},{kind:"select",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"op06-ark-maxim",count:"all",effect:{kind:"knock-out",binding:"op06-ark-maxim"}}]}}}}}]]};var drawTwoTrashTwo={kind:"sequence",effects:[{kind:"draw",player:"self",count:2},trashFromHand(2,"op06-draw-trash")]};var pickedFromTrash=binding=>({kind:"selector-count",player:"self",selector:{zone:"trash",binding},operator:"gte",value:1});var op06OnPlayMechanics={onPlay:[["OP06-003",lookAndPlay(3,"op06-ivankov",{category:"character",type:"Revolutionary Army",maxPower:5e3})],["OP06-004",{effect:playFromHand({name:"Lily Carnation"},"op06-omatsuri")}],["OP06-007",{effect:koPowerAtMost(1e4,"op06-shanks")}],["OP06-013",filmSearch],["OP06-023",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op06-arlong-cost",1,{kind:"choose",selector:{player:"opponent",zone:[],includeLeader:true,rested:true},bind:"op06-arlong-lock",min:0,max:1,effect:{kind:"restrict",binding:"op06-arlong-lock",restriction:"cannot-attack",expiresAfterTurns:1}})}}],["OP06-024",{effect:{kind:"if",condition:newFishManLeader,then:{kind:"sequence",effects:[playFromHand({category:"character",type:"Fish-Man",maxCost:4},"op06-ikaros"),lifeTopToHand]}}}],["OP06-025",lookAndAdd(4,"op06-camie",{anyOf:[{type:"Fish-Man"},{type:"Merfolk"}],excludeName:"Camie"})],["OP06-026",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",category:"character",attribute:"Slash",maxCost:4,rested:true},bind:"op06-koushirou",min:0,max:1,effect:{kind:"update",binding:"op06-koushirou",rested:false}},{kind:"restrict-player",player:"self",restriction:"cannot-attack-leaders",expiresAfterTurns:0}]}}],["OP06-036",{effect:koRestedCostAtMost(4,"op06-ryuma")}],["OP06-041",{effect:{kind:"select",selector:{player:"opponent",zone:"board",category:"character",rested:false,canRest:true},bind:"op06-ark-noah",count:"all",effect:{kind:"rest",binding:"op06-ark-noah"}}}],["OP06-045",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op06-kuzan",min:2,max:2,effect:{kind:"order-to-bottom",binding:"op06-kuzan",to:{player:"self",zone:"deck",position:"bottom"}}}]}}],["OP06-046",{effect:buryCostAtMost(2,"op06-sakazuki")}],["OP06-047",{effect:{kind:"sequence",effects:[{kind:"select",selector:{player:"opponent",zone:"hand"},bind:"op06-pudding",count:"all",effect:{kind:"move",binding:"op06-pudding",to:{player:"owner",zone:"deck",position:"bottom"}}},{kind:"shuffle-deck",player:"opponent"},{kind:"draw",player:"opponent",count:5}]}}],["OP06-050",lookAndAdd(5,"op06-tashigi",{type:"Navy",excludeName:"Tashigi"})],["OP06-051",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op06-tsuru-cost",2,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op06-tsuru",chooser:"opponent",min:1,max:1,effect:{kind:"move",binding:"op06-tsuru",to:{player:"owner",zone:"hand"}}})}}],["OP06-061",{effect:{kind:"if",condition:donBehind,then:{kind:"sequence",effects:[powerDebuff(2e3,"op06-ichiji"),{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}]}}}],["OP06-062",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op06-judge-cost",2,{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"GERMA 66",maxPower:4e3},bind:"op06-judge",min:0,max:4,distinctNames:true,effect:{kind:"play",binding:"op06-judge"}})}]}}}}],["OP06-063",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"op06-sora-cost",1,{kind:"if",condition:donBehind,then:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"The Vinsmoke Family",maxPower:4e3},bind:"op06-sora",min:0,max:1,effect:{kind:"move",binding:"op06-sora",to:{player:"self",zone:"hand"}}}})}}],["OP06-065",{effect:{kind:"if",condition:donBehind,then:{kind:"choice",branches:[{id:"ko",label:"K.O. a Character with a cost of 2 or less",effect:koCostAtMost(2,"op06-niji-ko")},{id:"bounce",label:"Return a Character with a cost of 4 or less",effect:bounceCostAtMost(4,"op06-niji-bounce")}]}}}],["OP06-069",{effect:{kind:"if",condition:{kind:"all-of",conditions:[donBehind,{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:5}]},then:{kind:"draw",player:"self",count:2}}}],["OP06-071",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"if",condition:filmLeader,then:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"FILM",maxCost:4},bind:"op06-tesoro",min:0,max:2,effect:{kind:"move",binding:"op06-tesoro",to:{player:"self",zone:"hand"}}}}]}}}}],["OP06-073",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:8},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},trashFromHand(1,"op06-shiki")]}}}],["OP06-074",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op06-zephyr",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"negate",binding:"op06-zephyr",expiresAfterTurns:0},{kind:"select",selector:{player:"opponent",zone:"board",binding:"op06-zephyr",maxCurrentPower:5e3},bind:"op06-zephyr-ko",count:"all",effect:{kind:"knock-out",binding:"op06-zephyr-ko"}}]}}]}}}}],["OP06-075",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2,rested:false,canRest:true},bind:"op06-battler",min:0,max:2,effect:{kind:"rest",binding:"op06-battler"}}]}}}}],["OP06-081",{effect:payFromTrash(2,"op06-absalom-cost",{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:2},bind:"op06-absalom",min:0,max:1,effect:{kind:"knock-out",binding:"op06-absalom"}})}],["OP06-082",{effect:{kind:"if",condition:thrillerBarkLeader,then:drawTwoTrashTwo}}],["OP06-086",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"trash",category:"character",maxCost:4},bind:"op06-moria-big",min:0,max:1,effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",maxCost:2,excludeBinding:"op06-moria-big"},bind:"op06-moria-small",min:0,max:1,effect:{kind:"if",condition:{kind:"all-of",conditions:[pickedFromTrash("op06-moria-big"),pickedFromTrash("op06-moria-small")]},then:{kind:"choice",branches:[{id:"rest-small",label:"Play the cheaper card rested",effect:{kind:"sequence",effects:[{kind:"play",binding:"op06-moria-big"},{kind:"play",binding:"op06-moria-small",rested:true}]}},{id:"rest-big",label:"Play the costlier card rested",effect:{kind:"sequence",effects:[{kind:"play",binding:"op06-moria-big",rested:true},{kind:"play",binding:"op06-moria-small"}]}}]},else:{kind:"sequence",effects:[{kind:"play",binding:"op06-moria-big"},{kind:"play",binding:"op06-moria-small"}]}}}}]}}],["OP06-089",{effect:{kind:"trash-top",player:"self",count:3}}],["OP06-090",{effect:payFromTrash(2,"op06-hogback-cost",{kind:"choose",selector:{player:"self",zone:"trash",type:"Thriller Bark Pirates",excludeName:"Dr. Hogback"},bind:"op06-hogback",min:0,max:1,effect:{kind:"move",binding:"op06-hogback",to:{player:"self",zone:"hand"}}})}],["OP06-091",{effect:{kind:"if",condition:thrillerBarkLeader,then:{kind:"trash-top",player:"self",count:5}}}],["OP06-092",{effect:{kind:"choice",branches:[{id:"trash",label:"Trash a Character with a cost of 4 or less",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"op06-brook",min:0,max:1,effect:{kind:"move",binding:"op06-brook",to:{player:"owner",zone:"trash"}}}},{id:"bury-trash",label:"Your opponent buries 3 cards from their trash",effect:{kind:"select",selector:{player:"opponent",zone:"trash"},bind:"op06-brook-bury",count:3,effect:{kind:"move",binding:"op06-brook-bury",to:{player:"owner",zone:"deck",position:"bottom"}}}}]}}],["OP06-093",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:5},then:{kind:"choice",branches:[{id:"discard",label:"Opponent trashes 1 from hand",effect:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op06-perona-discard",chooser:"opponent",min:1,max:1,effect:{kind:"move",binding:"op06-perona-discard",to:{player:"owner",zone:"trash"}}}},{id:"cost",label:"Give a Character −3 cost",effect:costDebuff(3,"op06-perona-cost")}]}}}],["OP06-099",{effect:{kind:"optional",effect:{kind:"choice",branches:[{id:"own-life",label:"Look at the top of your Life cards",effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:1,bind:"op06-aisa",zone:"life"},{kind:"order-to-bottom",binding:"op06-aisa",to:{player:"owner",zone:"life",position:"bottom"},alternate:{player:"owner",zone:"life",position:"top"}}]}},{id:"opponent-life",label:"Look at the top of your opponent's Life cards",effect:{kind:"sequence",effects:[{kind:"look-at",player:"opponent",count:1,bind:"op06-aisa",zone:"life"},{kind:"order-to-bottom",binding:"op06-aisa",to:{player:"owner",zone:"life",position:"bottom"},alternate:{player:"owner",zone:"life",position:"top"}}]}}]}}}],["OP06-101",{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"op06-onami",min:0,max:1,effect:{kind:"grant-keyword",binding:"op06-onami",keyword:"Banish",expiresAfterTurns:0}}}],["OP06-114",{effect:payWithStage("op06-wyper-cost",lookAndAdd(5,"op06-wyper",{anyOf:[{name:"Upper Yard"},{type:"Shandian Warrior"}]}).effect)}],["OP06-119",{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:1,bind:"op06-sanji"},{kind:"reveal",binding:"op06-sanji"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"op06-sanji",category:"character",maxCost:9,excludeName:"Sanji"},bind:"op06-sanji-play",min:0,max:1,effect:{kind:"play",binding:"op06-sanji-play"}},{kind:"select",selector:{player:"self",zone:"deck",binding:"op06-sanji"},bind:"op06-sanji-rest",count:"all",effect:{kind:"move",binding:"op06-sanji-rest",to:{player:"self",zone:"deck",position:"bottom"}}}]}}]]};var op06TriggerMechanics={trigger:[["OP06-013",asOnPlayTrigger(filmSearch)],["OP06-018",{effect:koPowerAtMost(5e3,"op06-gatling-trigger")}],["OP06-019",{effect:koPowerAtMost(4e3,"op06-water-stream-trigger")}],["OP06-023",{effect:restCostAtMost2(4,"op06-arlong-trigger")}],["OP06-031",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",anyOf:[{type:"Fish-Man"},{type:"Merfolk"}],maxCost:3},bind:"op06-hatchan",min:0,max:1,effect:{kind:"play",binding:"op06-hatchan"}}}],["OP06-039",{effect:killingTime}],["OP06-040",{effect:sharkArrows}],["OP06-056",{effect:murakumoSword}],["OP06-097",{effect:negativeHollow}],["OP06-041",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP06-057",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",minCost:2,maxCost:2},bind:"op06-tears-trigger",min:0,max:1,effect:{kind:"play",binding:"op06-tears-trigger"}}}],["OP06-059",{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind:"op06-white-snake-look"},{kind:"select",selector:{player:"self",zone:"deck",binding:"op06-white-snake-look"},bind:"op06-white-snake-order",count:"all",effect:{kind:"order-to-bottom",binding:"op06-white-snake-order",to:{player:"self",zone:"deck",position:"bottom"},alternate:{player:"self",zone:"deck",position:"top"}}}]}}],["OP06-077",{effect:buryOpponentCostAtMost(4,"op06-black-bug-trigger")}],["OP06-078",{effect:{kind:"draw",player:"self",count:1}}],["OP06-116",{effect:{kind:"draw",player:"self",count:1}}],["OP06-095",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},trashFromHand(1,"op06-asgard-trigger")]}}],["OP06-096",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top"},bind:"op06-nothing-trigger-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op06-nothing-trigger-cost",to:{player:"self",zone:"hand"}},paidToHand("op06-nothing-trigger-cost",[battleShield])]}}}}],["OP06-100",playSelfWhenOpponentBehind],["OP06-103",playSelfWhenOpponentBehind],["OP06-112",playSelfWhenOpponentBehind],["OP06-102",playSelfWhenBehind],["OP06-111",playSelfWhenBehind],["OP06-101",{effect:koCostAtMost(5,"op06-onami-trigger")}],["OP06-108",{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,type:"Land of Wano"},bind:"op06-hitetsu",min:0,max:1,effect:{kind:"modify-power",binding:"op06-hitetsu",amount:2e3,expiresAfterTurns:0}}}]],onKo:[["OP06-027",{effect:restCostAtMost2(3,"op06-gyro")}],["OP06-036",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:4},bind:"op06-ryuma-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op06-ryuma-ko"}}}],["OP06-053",{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:2},bind:"op06-saul",min:0,max:1,effect:{kind:"move",binding:"op06-saul",to:{player:"owner",zone:"deck",position:"bottom"}}}}],["OP06-082",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Thriller Bark Pirates"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},trashFromHand(2,"op06-inuppe-ko")]}}}],["OP06-084",{effect:buffOwnCardForTurn(1e3,"op06-jigoro")}],["OP06-089",{effect:{kind:"trash-top",player:"self",count:3}}]]};var opponentBehind={kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:3};var wanoLeader={kind:"leader-has-type",player:"self",type:"Land of Wano"};var zoroSetActive=donCost=>({oncePerTurn:true,requires:{activeDon:donCost},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:donCost},{kind:"update",binding:SOURCE_BINDING,rested:false}]}}}});var carrotRestLock={effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:7},bind:"carrot-lock",min:0,max:1,effect:{kind:"restrict",binding:"carrot-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}};var op06YamatoMechanics={activateMain:[["OP06-022",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"if",condition:opponentBehind,then:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"yamato-don-target",min:0,max:1,effect:{kind:"attach-don",player:"self",from:"rested",count:2,target:{binding:"yamato-don-target"}}}}}}],["OP06-118",zoroSetActive(2)],["PRB02-016",{oncePerTurn:false,requires:{sourceActive:true,lifeCards:1},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"edge"},bind:"otama-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"move",binding:"otama-life",to:{player:"self",zone:"hand"}},{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"otama-buff",min:0,max:1,effect:{kind:"modify-power",binding:"otama-buff",amount:3e3,expiresAfterTurns:0}}]}}}}}],["ST28-004",{oncePerTurn:true,requires:{givenDon:2},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[...[1,2].map(pick=>({kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,minGivenDon:1},bind:`st28-momonosuke-don-${pick}`,min:1,max:1,effect:{kind:"return-given-don",player:"self",count:1,binding:`st28-momonosuke-don-${pick}`}})),{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0},{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:0}]}}}}]],whenAttacking:[["OP06-118",zoroSetActive(1)],["OP08-023",carrotRestLock]],onPlay:[["OP06-107",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Land of Wano",excludeName:"Kouzuki Momonosuke"},bind:"momo-to-life",min:0,max:1,effect:{kind:"choice",branches:[{id:"top",label:"Put it on top of Life, face-up",effect:{kind:"move",binding:"momo-to-life",to:{player:"owner",zone:"life",position:"top"},faceUp:true}},{id:"bottom",label:"Add it to the bottom of your Life cards face-up",effect:{kind:"move",binding:"momo-to-life",to:{player:"owner",zone:"life",position:"bottom"},faceUp:true}}]}}}],["OP08-023",carrotRestLock],["ST28-001",{effect:{kind:"if",condition:{kind:"all-of",conditions:[wanoLeader,{kind:"zone-count",player:"opponent",zone:"life",operator:"gte",value:3}]},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:5},bind:"ashura-ko",min:0,max:1,effect:{kind:"knock-out",binding:"ashura-ko"}}}}],["ST28-002",{effect:{kind:"select",selector:{player:"self",zone:"board",includeLeader:true,category:"leader",type:"Land of Wano"},bind:"izo-leader",count:1,effect:{kind:"grant-keyword",binding:"izo-leader",keyword:"Banish",expiresAfterTurns:0}}}],["ST28-005",lookAndAdd(5,"yamato-search",{type:"Land of Wano",minCost:2})]],counterEvent:[["OP06-115",{cost:0,power:0,program:trashForBattlePower(3e3,"disappear-cost")}]],trigger:[["OP06-109",playSelfWhenOpponentBehind],["OP06-110",playSelfWhenOpponentBehind],["ST28-003",{effect:{kind:"if",condition:{kind:"all-of",conditions:[wanoLeader,opponentBehind]},then:{kind:"play",binding:SOURCE_BINDING}}}],["PRB02-016",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",canRest:true,maxCost:4},bind:"otama-rest",min:0,max:1,effect:{kind:"rest",binding:"otama-rest"}}}],["OP06-115",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:0},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"disappear-new-life",count:1,effect:{kind:"move",binding:"disappear-new-life",to:{player:"self",zone:"life",position:"top"},faceUp:false}},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"disappear-trigger-cost",min:1,max:1,effect:{kind:"move",binding:"disappear-trigger-cost",to:{player:"self",zone:"trash"}}}]}}}}]]};var revealFromHand=(match,count2,bind,effect)=>({kind:"choose",selector:{...match,player:"self",zone:"hand"},bind,min:count2,max:count2,effect:{kind:"sequence",effects:[{kind:"reveal",binding:bind},effect]}});var playCharacterFromHand=(match,bind,rested=false)=>({kind:"choose",selector:{...match,player:"self",zone:"hand",category:"character"},bind,min:0,max:1,effect:{kind:"play",binding:bind,...rested?{rested}:{}}});var fishManOrMerfolkLeader3={isLeader:true,anyOfTypes:["Fish-Man","Merfolk"]};var anyCharacterPower=(bind,amount)=>({kind:"choose",selector:{player:"either",zone:"board",category:"character"},bind,min:0,max:1,effect:{kind:"modify-power",binding:bind,amount,expiresAfterTurns:0}});var shirahoshiLeaderActive={zone:[],includeLeader:true,name:"Shirahoshi",rested:false};var deckTopToLife3=bind=>({kind:"choose",selector:{player:"self",zone:"deck",position:"top"},bind,min:0,max:1,effect:{kind:"move",binding:bind,to:{player:"self",zone:"life",position:"top"}}});var atlasSearch=lookAndAdd(4,"eb05-050-look",{attribute:"Wisdom"});var eb05OnPlayMechanics={onPlay:[["EB05-001",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Supernovas"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxPower:2e3},bind:"eb05-001-play",min:0,max:2,effect:{kind:"play",binding:"eb05-001-play"}}]}}}],["EB05-002",{effect:{kind:"sequence",effects:[lookAndAdd(5,"eb05-002-look",{type:"Navy",minCost:2},2).effect,{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb05-002-trash",min:1,max:1,effect:{kind:"move",binding:"eb05-002-trash",to:{player:"self",zone:"trash"}}}]}}],["EB05-004",{effect:{kind:"optional",effect:revealFromHand({category:"event"},2,"eb05-004-reveal",{kind:"draw",player:"self",count:2})}}],["EB05-005",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Revolutionary Army",hasTrigger:true},bind:"eb05-005-buff",min:0,max:3,effect:{kind:"modify-power",binding:"eb05-005-buff",amount:2e3,expiresAfterTurns:0}}}],["EB05-007",{effect:{kind:"optional",effect:revealFromHand({anyOf:[{category:"event"},{type:"Punk Hazard"}]},3,"eb05-007-reveal",{kind:"draw",player:"self",count:1})}}],["EB05-011",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-name",player:"self",name:"Shirahoshi"},{kind:"selector-count",player:"self",selector:{zone:"life",position:"top",faceUp:true},operator:"gte",value:1}]},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top",faceUp:true},bind:"eb05-011-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:"eb05-011-life",faceUp:false},restCostAtMost(5,"eb05-011-rest")]}}}}}],["EB05-012",{effect:restCostAtMost(6,"eb05-012-rest")}],["EB05-014",{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind:"eb05-014-look"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"eb05-014-look",anyOf:[{name:"Megalo"},{type:"Neptunian"}]},bind:"eb05-014-add",min:0,max:2,effect:{kind:"move",binding:"eb05-014-add",to:{player:"self",zone:"hand"}}},{kind:"select",selector:{player:"self",zone:"deck",binding:"eb05-014-look"},bind:"eb05-014-rest",count:"all",effect:{kind:"move",binding:"eb05-014-rest",to:{player:"self",zone:"trash"}}}]}}],["EB05-016",{effect:{kind:"if",condition:{kind:"turn-player",player:"self"},then:playCharacterFromHand({maxCost:5,attribute:"Wisdom"},"eb05-016-play")}}],["EB05-018",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:6},bind:"eb05-018-lock",min:0,max:1,effect:{kind:"restrict",binding:"eb05-018-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}}],["EB05-061",{effect:playCharacterFromHand({color:"Red",maxCost:2},"eb05-061-play")}],["EB05-021",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Cross Guild",maxCost:8},bind:"eb05-021-play",min:0,max:1,effect:{kind:"play",binding:"eb05-021-play"}},{kind:"restrict-player",player:"self",restriction:"cannot-play-characters",expiresAfterTurns:0}]}}],["EB05-023",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",category:"event"},"eb05-023-cost",2,{kind:"draw",player:"self",count:3})}}],["EB05-025",lookAndAdd(3,"eb05-025-look",{type:"Impel Down"})],["EB05-027",{effect:{kind:"sequence",effects:[drawAndDiscard(3,2,"eb05-027-trash"),{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:2},bind:"eb05-027-bury",min:0,max:1,effect:{kind:"move",binding:"eb05-027-bury",to:{player:"owner",zone:"deck",position:"bottom"}}}]}}],["EB05-028",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:9},then:{kind:"choose",selector:{player:"opponent",zone:"hand"},chooser:"opponent",bind:"eb05-028-discard",min:4,max:4,effect:{kind:"move",binding:"eb05-028-discard",to:{player:"owner",zone:"trash"}}}}}],["EB05-031",{effect:donMinus(1,{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"The Vinsmoke Family"},then:{kind:"trash-top",player:"self",count:10}})}],["EB05-033",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"},{kind:"field-don-versus",player:"self",operator:"lt",by:6}]},then:{kind:"sequence",effects:[drawAndDiscard(3,2,"eb05-033-trash"),{kind:"add-don",player:"self",count:4,rested:true}]}}}],["EB05-034",{effect:donMinus(2,{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:7},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"eb05-034-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"eb05-034-debuff",amount:-4e3,expiresAfterTurns:0}}})}],["EB05-035",{effect:donMinus(1,{kind:"sequence",effects:[lookAndAdd(5,"eb05-035-look",{type:"SMILE"},2).effect,{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"SMILE",maxPower:5e3},bind:"eb05-035-play",min:0,max:2,effect:{kind:"play",binding:"eb05-035-play"}}]})}],["EB05-036",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Navy"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"add-don",player:"self",count:1,rested:true}]}}}],["EB05-037",lookAndAdd(3,"eb05-037-look",{type:"Animal Kingdom Pirates"})],["EB05-038",{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name:"Senor Pink"},bind:"eb05-038-buff",min:0,max:1,effect:{kind:"modify-power",binding:"eb05-038-buff",amount:3e3,expiresAfterTurns:0}}}],["EB05-042",{effect:drawAndDiscard(2,2,"eb05-042-trash")}],["EB05-044",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-type-including",player:"self",text:"Baroque Works"},{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",maxCost:0},operator:"gte",value:1}]},then:{kind:"select",selector:{player:"opponent",zone:[],includeLeader:true},bind:"eb05-044-leader",count:"all",effect:{kind:"modify-power",binding:"eb05-044-leader",amount:-1e3,expiresAfterTurns:0}}}}],["EB05-045",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",typeIncluding:"Baroque Works"},bind:"eb05-045-ko",min:0,max:1,effect:{kind:"knock-out",binding:"eb05-045-ko"}}}],["EB05-047",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"eb05-047-cost",1,{kind:"choose",selector:{player:"self",zone:"trash",category:"character",maxCost:2},bind:"eb05-047-play",min:0,max:1,effect:{kind:"play",binding:"eb05-047-play"}})}}],["EB05-050",atlasSearch],["EB05-051",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCostFromZoneCount:{player:"either",zone:"life"},canRest:true},bind:"eb05-051-rest",min:0,max:1,effect:{kind:"rest",binding:"eb05-051-rest"}}}],["EB05-055",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"turn-player",player:"self"},{kind:"leader-has-attribute",player:"self",attribute:"Wisdom"}]},then:deckTopToLife3("eb05-055-life")}}],["EB05-056",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",hasTrigger:true},"eb05-056-cost",1,{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Nico Robin"},then:{kind:"draw",player:"self",count:2}})}}]]};var koThrillerBarkFor=(bind,effect)=>({kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Thriller Bark Pirates"},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"knock-out",binding:bind},effect]}}});var eb05MainMechanics={eventMain:[["EB05-008",{cost:1,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"hand",category:"event",color:"Red"},operator:"gte",value:2},then:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"attach-don",player:"self",from:"active",count:1,target:"leader"},revealFromHand({category:"event",color:"Red"},2,"eb05-008-reveal",{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true},bind:"eb05-008-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"eb05-008-debuff",amount:-7e3,expiresAfterTurns:0}})]}}}}}}],["EB05-009",{cost:1,program:{effect:{kind:"select",selector:{player:"self",zone:"board",category:"character",maxPower:4e3},bind:"eb05-009-team",count:"all",effect:{kind:"modify-power",binding:"eb05-009-team",amount:1e3,expiresAfterTurns:1}}}}],["EB05-020",{cost:1,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:shirahoshiLeaderActive,operator:"gte",value:1},then:{kind:"optional",effect:{kind:"select",selector:{...shirahoshiLeaderActive,player:"self"},bind:"eb05-020-leader",count:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:"eb05-020-leader"},{kind:"draw",player:"self",count:2}]}}}}}}],["EB05-029",{cost:5,trashFromHand:1,program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"eb05-029-cost",1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"eb05-029-bounce",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"negate",binding:"eb05-029-bounce",expiresAfterTurns:0},{kind:"move",binding:"eb05-029-bounce",to:{player:"owner",zone:"hand"}}]}})}}}],["EB05-030",{cost:2,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Nami"},then:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:5},bind:"eb05-030-bounce",min:0,max:1,effect:{kind:"move",binding:"eb05-030-bounce",to:{player:"owner",zone:"hand"}}}}}}],["EB05-039",{cost:1,donMinus:1,program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"The Vinsmoke Family"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"eb05-039-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"eb05-039-debuff",amount:-4e3,expiresAfterTurns:0}}}}}],["EB05-040",{cost:0,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"Donquixote Pirates"},{kind:"active-don",player:"self",operator:"gte",value:1}]},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:1,from:"active"},drawAndDiscard(3,1,"eb05-040-trash")]}}}}}],["EB05-048",{cost:1,program:{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",typeIncluding:"Baroque Works"},bind:"eb05-048-ko",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"knock-out",binding:"eb05-048-ko"},{kind:"select",selector:{player:"opponent",zone:"board",category:"character",maxCost:0},bind:"eb05-048-no-block",count:"all",effect:{kind:"restrict",binding:"eb05-048-no-block",restriction:"cannot-block",expiresAfterTurns:0}}]}}}}}}],["EB05-049",{cost:1,program:{effect:koThrillerBarkFor("eb05-049-main-cost",{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"eb05-049-debuff",min:0,max:1,effect:{kind:"modify-cost",binding:"eb05-049-debuff",amount:-3,expiresAfterTurns:0}})}}],["EB05-059",{cost:1,program:{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"select",selector:{player:"self",zone:"board",category:"character",type:"Big Mom Pirates",minPower:4e3,maxPower:4e3},bind:"eb05-059-protected",count:"all",effect:{kind:"restrict",binding:"eb05-059-protected",restriction:"battle-ko-immune",expiresAfterTurns:1}}]}}}],["EB05-060",{cost:1,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Egghead",minCost:5},bind:"eb05-060-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"eb05-060-cost",to:{player:"self",zone:"trash"}},deckTopToLife3("eb05-060-life")]}}}}}]],activateMain:[["EB05-001",{oncePerTurn:true,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true,minCurrentPower:6e3},bind:"eb05-001-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"eb05-001-debuff",amount:-1e3,expiresAfterTurns:1}}}}],["EB05-005",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"eb05-005-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"eb05-005-debuff",amount:-2e3,expiresAfterTurns:0}}]}}}}],["EB05-006",{oncePerTurn:true,requires:{lifeCards:1},program:lifeToHandCost({kind:"choice",branches:[{id:"plus-3000",label:"+3000 to a Character this turn",effect:anyCharacterPower("eb05-006-plus",3e3)},{id:"minus-4000",label:"−4000 to a Character this turn",effect:anyCharacterPower("eb05-006-minus",-4e3)}]},"top")}],["EB05-010",{oncePerTurn:true,program:{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",attribute:"Wisdom",maxCurrentPower:6e3},bind:"eb05-010-active",min:0,max:1,effect:{kind:"update",binding:"eb05-010-active",rested:false}}}}],["EB05-014",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Neptunian",maxCurrentPower:6e3},bind:"eb05-014-rush",min:0,max:1,effect:{kind:"grant-keyword",binding:"eb05-014-rush",keyword:"Rush",expiresAfterTurns:0}}]}}}}],["EB05-031",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",minPower:8e3},operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"add-don",player:"self",count:4,rested:false}]}}}}}],["EB05-057",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"give-rested-don",player:"self",count:1,anyOfAttributes:["Special","Wisdom"]}}}]]};var restOwnCardCost=(bind,effect)=>({kind:"optional",effect:{kind:"choose",selector:restableCards("self"),bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:bind},effect]}}});var trashSelfToPlay=(bind,zones,type,maxCost,excludeName)=>({kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"self",zone:zones,category:"character",type,maxCost,...excludeName===void 0?{}:{excludeName}},bind,min:0,max:1,effect:{kind:"play",binding:bind}}]}});var debuffOpponentCharacter=(bind,amount)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind,min:0,max:1,effect:{kind:"modify-power",binding:bind,amount,expiresAfterTurns:0}});var eb04FingerPistolKo={kind:"optional",effect:{kind:"sequence",effects:[{kind:"trash-top",player:"self",count:2},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:5},bind:"eb04-049-ko",min:0,max:1,effect:{kind:"knock-out",binding:"eb04-049-ko"}}]}};var eb04MainMechanics={activateMain:[["EB04-012",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"source-played-this-turn"},{kind:"leader-has-type",player:"self",type:"Land of Wano"}]},then:{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"eb04-012-leader",count:"all",effect:{kind:"update",binding:"eb04-012-leader",rested:false}}}}}],["EB04-014",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Land of Wano"},then:{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"}}}}],["EB04-016",{oncePerTurn:false,requires:{donActivationAllowed:true,restedDon:1},program:{effect:{kind:"sequence",effects:[{kind:"activate-don",player:"self",count:1},{kind:"restrict-player",player:"self",restriction:"cannot-activate-don-by-character",expiresAfterTurns:0}]}}}],["EB04-021",{oncePerTurn:true,requires:{handCards:1,restedDon:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"eb04-021-don-cost",1,{kind:"give-rested-don",player:"self",count:1,from:"rested"})}}}],["EB04-024",{oncePerTurn:false,requires:{handCards:1,sourceActive:true},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"eb04-024-cost",1,{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Alabasta"},bind:"eb04-024-unblockable",min:0,max:1,effect:{kind:"grant-keyword",binding:"eb04-024-unblockable",keyword:"Unblockable",expiresAfterTurns:0}}]})}}}],["EB04-036",{oncePerTurn:true,program:{effect:{kind:"add-don",player:"self",count:1,rested:true}}}],["EB04-039",{oncePerTurn:false,program:{effect:trashSelfToPlay("eb04-039-play",["hand"],"Kid Pirates",5)}}],["EB04-045",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:{kind:"selector-count",player:"either",selector:{zone:"board",category:"character",minCost:8},operator:"gte",value:2},then:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,type:"Revolutionary Army"},bind:"eb04-045-buff",min:0,max:1,effect:{kind:"modify-power",binding:"eb04-045-buff",amount:1e3,expiresAfterTurns:0}}}]}}}}],["EB04-047",{oncePerTurn:false,program:{effect:trashSelfToPlay("eb04-047-play",["hand","trash"],"SWORD",3,"Helmeppo")}}]],eventMain:[["EB04-028",{cost:5,trashFromHand:1,program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Navy"},then:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"eb04-ice-time-cost",1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:1e4},bind:"eb04-ice-time",min:0,max:2,effect:{kind:"restrict",binding:"eb04-ice-time",restriction:"cannot-attack",expiresAfterTurns:1}})}}}}],["EB04-008",{cost:1,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:debuffOpponentCharacter("eb04-008-debuff",-3e3)}}}],["EB04-009",{cost:0,program:{effect:giveDonToRayleigh(1,"eb04-009-don",debuffOpponentCharacter("eb04-009-debuff",-2e3))}}],["EB04-019",{cost:1,program:{effect:restOwnCardCost("eb04-019-rest",{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Minks"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"eb04-019-cost",min:0,max:1,effect:{kind:"modify-cost",binding:"eb04-019-cost",amount:-3,expiresAfterTurns:0}}})}}],["EB04-029",{cost:1,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Sanji"},then:lookAndAddOrTrash(3,"eb04-029-look",{anyOf:[{name:"Sanji"},{category:"event"}]}).effect}}}],["EB04-040",{cost:1,restDon:6,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name:"Kaido"},bind:"eb04-040-buff",min:0,max:1,effect:{kind:"modify-power",binding:"eb04-040-buff",amount:3e3,expiresAfterTurns:0}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",canRest:true},bind:"eb04-040-rest",min:0,max:1,effect:{kind:"rest",binding:"eb04-040-rest"}}]}}}],["EB04-041",{cost:3,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-name",player:"self",name:"Sanji"},{kind:"field-don",player:"self",operator:"gte",value:4}]},then:{kind:"choose",selector:{player:"self",zone:["hand","trash"],category:"character",name:"Sanji",maxPower:6e3},bind:"eb04-041-play",min:0,max:1,effect:{kind:"play",binding:"eb04-041-play"}}}}}],["EB04-049",{cost:4,program:{effect:eb04FingerPistolKo}}],["EB04-050",{cost:1,program:{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,type:"SWORD"},bind:"eb04-050-attacker",min:0,max:1,effect:{kind:"grant-attack-active",binding:"eb04-050-attacker",expiresAfterTurns:0}}}}],["EB04-060",{cost:2,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"edge"},bind:"eb04-060-life-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"eb04-060-life-cost",to:{player:"self",zone:"hand"}},paidToHand("eb04-060-life-cost",[{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Egghead"},bind:"eb04-060-to-life",min:0,max:1,effect:{kind:"move",binding:"eb04-060-to-life",to:{player:"self",zone:"life",position:"top"},faceUp:true}},debuffOpponentCharacter("eb04-060-debuff",-1e3)])]}}}}}]]};var eb05BattleMechanics={counterEvent:[["EB05-008",{cost:1,power:4e3,powerWhen:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",minCost:5},operator:"eq",value:0}}],["EB05-009",{cost:1,power:3e3,target:{isLeader:true}}],["EB05-019",{cost:1,power:0,program:{effect:restOwnCardCost("eb05-019-rest",{kind:"battle-power",player:"self",amount:4e3,target:{type:"Land of Wano"}})}}],["EB05-030",{cost:2,power:0,program:{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"eb05-030-buff",min:0,max:1,effect:{kind:"modify-power",binding:"eb05-030-buff",amount:1e3,expiresAfterTurns:0}}]}}}],["EB05-039",{cost:1,donMinus:1,power:4e3,target:{isLeader:true}}],["EB05-040",{cost:0,power:2e3,target:{isLeader:true}}],["EB05-048",{cost:1,power:3e3,target:{isLeader:true}}],["EB05-049",{cost:1,power:0,program:{effect:koThrillerBarkFor("eb05-049-counter-cost",{kind:"battle-power",player:"self",amount:4e3})}}],["EB05-060",{cost:1,power:0,program:turnLifeFaceUp("eb05-060-counter-cost",{kind:"battle-power",player:"self",amount:4e3})}]],onOpponentAttack:[["EB05-013",{oncePerTurn:true,requires:{activeDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"battle-power",player:"self",amount:2e3,target:fishManOrMerfolkLeader3}]}}}}],["EB05-017",{oncePerTurn:false,requires:{activeDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"battle-power",player:"self",amount:4e3,target:fishManOrMerfolkLeader3}]}}}}],["EB05-046",{oncePerTurn:false,requires:{handCards:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"eb05-046-cost",1,{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:10},then:{kind:"set-leader-base-power",player:"self",value:7e3,expiresAfterTurns:0}})}}}]],whenAttacking:[["EB05-021",{oncePerTurn:false,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"eb05-021-negate",min:0,max:1,effect:{kind:"negate",binding:"eb05-021-negate",expiresAfterTurns:0}}}}],["EB05-053",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:9},then:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb05-053-life",min:0,max:1,effect:{kind:"move",binding:"eb05-053-life",to:{player:"self",zone:"life",position:"top"}}}}}}]]};var playThisCard={kind:"play",binding:SOURCE_BINDING};var playFromHand3=(bind,max,filter)=>({kind:"choose",selector:{player:"self",zone:"hand",category:"character",...filter},bind,min:0,max,effect:{kind:"play",binding:bind}});var eb05TriggerMechanics={trigger:[["EB05-016",{effect:restCostAtMost(6,"eb05-016-rest")}],["EB05-019",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:3},then:playCharacterFromHand({type:"Land of Wano",maxPower:6e3},"eb05-019-play")}}],["EB05-025",asOnPlayTrigger(lookAndAdd(3,"eb05-025-trigger-look",{type:"Impel Down"}))],["EB05-029",{effect:drawAndDiscard(2,1,"eb05-029-trigger-trash")}],["EB05-050",asOnPlayTrigger(atlasSearch)],["EB05-051",{effect:playThisCard}],["EB05-052",{effect:drawAndDiscard(2,1,"eb05-052-trash")}],["EB05-053",seraphimTrigger("eb05-053-trigger-cost")],["EB05-054",{effect:playFromHand3("eb05-054-play",2,{minPower:4e3,maxPower:4e3,type:"Big Mom Pirates"})}],["EB05-055",seraphimTrigger("eb05-055-trigger-cost")],["EB05-056",{effect:playThisCard}],["EB05-057",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:playFromHand3("eb05-057-play",1,{maxPower:6e3,hasTrigger:true})}}],["EB05-059",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},playFromHand3("eb05-059-play",1,{minPower:4e3,maxPower:4e3,hasTrigger:true})]}}]],onKo:[["EB05-004",{effect:playCharacterFromHand({maxPower:6e3},"eb05-004-play",true)}],["EB05-022",{effect:{kind:"draw",player:"self",count:2}}],["EB05-043",{effect:{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",maxCost:6},operator:"gte",value:1},then:{kind:"choice",branches:[{id:"ko",label:"K.O. an opposing cost-6-or-less Character",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"eb05-043-ko",min:0,max:1,effect:{kind:"knock-out",binding:"eb05-043-ko"}}},{id:"rest",label:"Rest an opposing cost-6-or-less Character",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6,canRest:true},bind:"eb05-043-rest",min:0,max:1,effect:{kind:"rest",binding:"eb05-043-rest"}}}]}}}],["EB05-045",lookAndAddOrTrash(3,"eb05-045-look",{typeIncluding:"Baroque Works"})]],onEndOfYourTurn:[["EB05-007",{effect:{kind:"modify-power",binding:SOURCE_BINDING,amount:5e3,expiresAfterTurns:1}}]]};var eb05ReplacementMechanics={replacement:[["EB05-061",{opponentEffectOnly:false,opponentOnly:true,oncePerTurn:true,removal:"off-field",protects:{category:"character",maxPower:6e3},label:"Take the top Life card",cost:{kind:"life-to-hand",count:1}}]],damageReplacement:[["EB05-052",{cost:"trash-self"}]]};var leaderPlusTwoThousand={kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"eb04-leader-buff",count:"all",effect:{kind:"modify-power",binding:"eb04-leader-buff",amount:2e3,expiresAfterTurns:1}};var deckTopToLife4=bind=>({kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind,count:1,effect:{kind:"move",binding:bind,to:{player:"self",zone:"life",position:"top"},faceUp:false}});var opponentLifeToTheirHand2=bind=>({kind:"select",selector:{player:"opponent",zone:"life",position:"top"},bind,count:1,effect:{kind:"move",binding:bind,to:{player:"opponent",zone:"hand"}}});var eb04BonneyMechanics={activateMain:[["EB04-001",{oncePerTurn:true,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"eb04-001-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"eb04-001-debuff",amount:-1e3,expiresAfterTurns:0}},{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"gte",value:2},then:{kind:"optional",effect:{kind:"select",selector:{player:"self",zone:"life",position:"edge"},bind:"eb04-001-life",count:1,effect:{kind:"move",binding:"eb04-001-life",to:{player:"self",zone:"hand"}}}}}]}}}],["EB04-007",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",minCurrentPower:8e3},operator:"gte",value:1},then:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush: Character",expiresAfterTurns:0}}}}]],onPlay:[["EB04-007",{effect:leaderPlusTwoThousand}],["EB04-054",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:deckTopToLife4("eb04-054-life")}}],["EB04-061",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"eb04-061-cost",1,{kind:"sequence",effects:[leaderPlusTwoThousand,{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Blocker",expiresAfterTurns:1}]})}}]],whenAttacking:[["EB04-052",{effect:{kind:"sequence",effects:[{kind:"select",selector:{player:"opponent",zone:[],includeLeader:true},bind:"eb04-052-leader",count:"all",effect:{kind:"copy-power",from:"eb04-052-leader",to:SOURCE_BINDING,expiresAfterTurns:0}}]}}]],onKo:[["EB04-052",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",color:"Yellow",maxPower:6e3},bind:"eb04-052-free-play",min:0,max:1,effect:{kind:"play",binding:"eb04-052-free-play"}}}}],["EB04-054",{effect:opponentLifeToTheirHand2("eb04-054-opponent-life")}]],eventMain:[["OP07-114",{cost:1,program:lookAndAdd(5,"op07-114-look",{type:"Egghead",excludeName:"He Possesses the World's Most Brilliant Mind"})}]],trigger:[["OP07-107",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:1},then:{kind:"play",binding:SOURCE_BINDING}}]}}],["OP07-114",{effect:{kind:"draw",player:"self",count:1}}]]};var drawTwoTrashOne3=bind=>({kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind,min:1,max:1,effect:{kind:"move",binding:bind,to:{player:"self",zone:"trash"}}}]});var restOpponentCharacterUpToCost=(bind,maxCost)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost,canRest:true},bind,min:0,max:1,effect:{kind:"rest",binding:bind}});var playFromHandUpToCost=(bind,type,maxCost)=>({kind:"choose",selector:{player:"self",zone:"hand",category:"character",type,maxCost},bind,min:0,max:1,effect:{kind:"play",binding:bind}});var eb04OnPlayMechanics={onPlay:[["EB04-006",lookAndAdd(7,"eb04-006-look",{name:"Lulucia Kingdom"})],["EB04-010",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"eb04-010-zero",min:0,max:1,effect:{kind:"set-base-power",binding:"eb04-010-zero",value:0,expiresAfterTurns:0}}}],["EB04-011",{effect:neptunianDrawThenTrash()}],["EB04-013",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Minks"},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Minks"},bind:"eb04-013-minks",min:0,max:2,effect:{kind:"update",binding:"eb04-013-minks",rested:false}},{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"eb04-013-leader",count:"all",effect:{kind:"update",binding:"eb04-013-leader",rested:false}}]}}}],["EB04-017",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Minks"},then:playFromHandUpToCost("eb04-017-play","Minks",5)}}],["EB04-018",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",binding:SOURCE_BINDING,rested:false},operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCurrentPower:8e3},bind:"eb04-018-ko",min:0,max:1,effect:{kind:"knock-out",binding:"eb04-018-ko"}}]}}}}],["EB04-021",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Nefeltari Vivi"},then:drawTwoTrashOne3("eb04-021-trash")}}],["EB04-022",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"eb04-022-cost",2,{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:6},then:{kind:"choose",chooser:"opponent",selector:{player:"opponent",zone:"hand"},bind:"eb04-022-bottom",min:2,max:2,effect:{kind:"order-to-bottom",binding:"eb04-022-bottom",to:{player:"opponent",zone:"deck",position:"bottom"}}}})}}],["EB04-023",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:[],includeLeader:true,rested:false},bind:"eb04-023-leader",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"modify-power",binding:"eb04-023-leader",amount:-5e3,expiresAfterTurns:0},{kind:"draw",player:"self",count:2}]}}}}],["EB04-025",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Alabasta",maxCost:8,excludeName:"Nefeltari Vivi"},bind:"eb04-025-play",min:0,max:1,effect:{kind:"play",binding:"eb04-025-play"}},{kind:"choose",chooser:"opponent",selector:{player:"opponent",zone:"hand"},bind:"eb04-025-bottom",min:1,max:1,effect:{kind:"move",binding:"eb04-025-bottom",to:{player:"opponent",zone:"deck",position:"bottom"}}}]}}],["EB04-027",{effect:drawTwoTrashOne3("eb04-027-trash")}],["EB04-033",{effect:donMinus(1,{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"Foxy Pirates"},operator:"gte",value:3},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:6e3},bind:"eb04-033-ko",min:0,max:1,effect:{kind:"knock-out",binding:"eb04-033-ko"}}})}],["EB04-036",{effect:donMinus(1,{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Foxy Pirates"},then:{kind:"sequence",effects:[drawTwoTrashOne3("eb04-036-trash"),restOpponentCharacterUpToCost("eb04-036-rest",9)]}})}],["EB04-037",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Foxy Pirates"},then:lookAndAdd(5,"eb04-037-look",{type:"Foxy Pirates"}).effect}}],["EB04-039",{effect:{kind:"add-don",player:"self",count:1,rested:false}}],["EB04-042",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"trash-top",player:"self",count:3},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"eb04-042-cost",min:0,max:1,effect:{kind:"modify-cost",binding:"eb04-042-cost",amount:-1,expiresAfterTurns:0}}]}}}],["EB04-043",{effect:{kind:"trash-top",player:"self",count:2}}],["EB04-048",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"eb04-048-trash",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"eb04-048-trash",to:{player:"self",zone:"trash"}},{kind:"draw",player:"self",count:1}]}}}}]]};function neptunianDrawThenTrash(){const branch=count2=>({kind:"sequence",effects:[{kind:"draw",player:"self",count:count2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:`eb04-011-trash-${count2}`,min:count2,max:count2,effect:{kind:"move",binding:`eb04-011-trash-${count2}`,to:{player:"self",zone:"trash"}}}]});const counted=count2=>({kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"Neptunian"},operator:"eq",value:count2},then:branch(count2),...count2<5?{else:counted(count2+1)}:{}});return counted(1)}var setFishManActive={kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Fish-Man"},bind:"eb04-020-active",min:0,max:1,effect:{kind:"update",binding:"eb04-020-active",rested:false}};var eb04BattleMechanics={counterEvent:[["EB04-008",{cost:1,power:3e3,target:{isLeader:true}}],["EB04-009",{cost:0,power:2e3,target:rayleighOrCharacter}],["EB04-019",{cost:1,power:3e3,target:{type:"Minks"}}],["EB04-020",{cost:1,power:3e3,target:{type:"Fish-Man"},program:{effect:setFishManActive}}],["EB04-029",{cost:1,power:0,program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"eb04-029-counter-cost",1,{kind:"battle-power",player:"self",amount:4e3,target:{name:"Sanji"}})}}}],["EB04-040",{cost:1,power:0,program:{effect:donMinus(1,{kind:"battle-power",player:"self",amount:4e3,target:{isLeader:true}})}}],["EB04-050",{cost:1,power:3e3,target:{isLeader:true}}]],whenAttacking:[["EB04-004",{oncePerTurn:false,program:{effect:{kind:"set-leader-base-power",player:"self",value:7e3,expiresAfterTurns:1}}}],["EB04-016",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"Neptunian"},operator:"gte",value:3},then:restOpponentCharacterUpToCost("eb04-016-rest",8)}}}],["EB04-022",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"eb04-022-attack-cost",1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"eb04-022-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"eb04-022-debuff",amount:-2e3,expiresAfterTurns:0}})}}}}]],onBlock:[["EB04-053",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:{kind:"draw",player:"self",count:1}}}}]],onOpponentAttack:[["EB04-034",{oncePerTurn:true,requires:{handCards:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"eb04-034-cost",1,{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"trash",category:"event"},operator:"gte",value:4},then:{kind:"battle-power",player:"self",amount:2e3}})}}}]]};var triggerDrawTwoTrashOne=bind=>({kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind,min:1,max:1,effect:{kind:"move",binding:bind,to:{player:"self",zone:"trash"}}}]});var eb04TriggerMechanics={trigger:[["EB04-020",{effect:restOpponentCharacterUpToCost("eb04-020-trigger-rest",4)}],["EB04-027",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxPower:5e3,hasTrigger:true},bind:"eb04-027-trigger-play",min:0,max:1,effect:{kind:"play",binding:"eb04-027-trigger-play"}}}],["EB04-041",{effect:triggerDrawTwoTrashOne("eb04-041-trigger-trash")}],["EB04-049",{effect:eb04FingerPistolKo}],["EB04-051",{effect:{kind:"sequence",effects:[{kind:"select",selector:{player:"opponent",zone:"board",category:"character"},bind:"eb04-051-debuff",count:"all",effect:{kind:"modify-power",binding:"eb04-051-debuff",amount:-3e3,expiresAfterTurns:0}},{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"eq",value:0},then:{kind:"play",binding:SOURCE_BINDING}}]}}],["EB04-055",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"Revolutionary Army"},{kind:"combined-life",operator:"lte",value:5}]},then:{kind:"play",binding:SOURCE_BINDING}}}],["EB04-060",{effect:triggerDrawTwoTrashOne("eb04-060-trigger-trash")}]],onKo:[["EB04-015",{effect:restOwnCardCost("eb04-015-rest",{kind:"if",condition:{kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"Fish-Man"},{kind:"leader-has-type",player:"self",type:"Merfolk"}]},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",color:"Green",maxCost:6},bind:"eb04-015-play",min:0,max:1,effect:{kind:"play",binding:"eb04-015-play"}}})}],["EB04-055",{effect:playFromHandUpToCost("eb04-055-ko-play","Revolutionary Army",4)}]]};var eb04ReplacementMechanics={replacement:[["EB04-043",{opponentEffectOnly:true,oncePerTurn:true,removal:"ko",protects:{category:"character",color:"Black",maxBaseCost:5},label:"Bottom-deck 3 from trash",cost:{kind:"bury-from-trash",count:3}}],["EB04-044",{opponentEffectOnly:false,oncePerTurn:true,removal:"off-field",requires:{kind:"leader-type-including",player:"self",text:"Navy"},label:"Trash 1 from hand",cost:{kind:"trash-from-hand",count:1}}]]};var musicSearch=lookAndAdd(4,"eb02-music",{minCost:4});var donParity={kind:"field-don-versus",player:"self",operator:"lte"};var strawHatLeader={kind:"leader-has-type",player:"self",type:"Straw Hat Crew"};var giveRestedDonToLeader=count2=>({kind:"attach-don",player:"self",from:"rested",count:count2,target:"leader"});var digForStage=(name,bind)=>({kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:3},then:{kind:"sequence",effects:[lookAndAdd(7,bind,{name}).effect,{kind:"choose",selector:{player:"self",zone:"hand",name},bind:`${bind}-play`,min:0,max:1,effect:{kind:"play",binding:`${bind}-play`}}]}});var playFromHand4=(match,bind)=>({kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:match.type,maxCost:match.maxCost},bind,min:0,max:1,effect:{kind:"play",binding:bind}});var restOpponentCostFour=bind=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4,canRest:true},bind,min:0,max:1,effect:{kind:"rest",binding:bind}});var recoverLaboon={kind:"choose",selector:{player:"self",zone:"trash",name:"Laboon"},bind:"eb02-048-recover",min:0,max:1,effect:{kind:"move",binding:"eb02-048-recover",to:{player:"self",zone:"hand"}}};var peekOneLife=(player,bind)=>({kind:"sequence",effects:[{kind:"look-at",player,count:1,bind,zone:"life"},{kind:"select",selector:{player,zone:"life",binding:bind},bind:`${bind}-place`,count:"all",effect:{kind:"order-to-bottom",binding:`${bind}-place`,to:{player:"owner",zone:"life",position:"bottom"},alternate:{player:"owner",zone:"life",position:"top"}}}]});var peekAtLife={effect:{kind:"choice",branches:[{id:"own-life",label:"Look at the top of your own Life cards",effect:peekOneLife("self","eb02-053-own")},{id:"opponent-life",label:"Look at the top of your opponent's Life cards",effect:peekOneLife("opponent","eb02-053-theirs")}]}};var frankyRamp={effect:{kind:"if",condition:{kind:"all-of",conditions:[strawHatLeader,donParity]},then:{kind:"add-don",player:"self",count:1,rested:true}}};var eb02OnPlayMechanics={onPlay:[["EB02-003",{effect:{kind:"if",condition:strawHatLeader,then:{kind:"give-rested-don",player:"self",count:1}}}],["EB02-011",{effect:{kind:"if",condition:{kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"Fish-Man"},{kind:"leader-has-type",player:"self",type:"East Blue"}]},then:{kind:"sequence",effects:[giveRestedDonToLeader(1),{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"eb02-011-lock",min:0,max:1,effect:{kind:"restrict",binding:"eb02-011-lock",restriction:"cannot-rest",expiresAfterTurns:1}}]}}}],["EB02-013",{effect:digForStage("Zou","eb02-013-dig")}],["EB02-014",{effect:{kind:"choose",selector:{player:"self",zone:"hand",name:"Gaimon"},bind:"eb02-014-gaimon",min:0,max:1,effect:{kind:"play",binding:"eb02-014-gaimon"}}}],["EB02-015",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true},bind:"eb02-015-lock",min:0,max:1,effect:{kind:"restrict",binding:"eb02-015-lock",restriction:"cannot-refresh",expiresAfterTurns:1}},{kind:"activate-don-at-end-of-turn",player:"self",count:1}]}}],["EB02-016",{effect:playFromHand4({type:"Animal",maxCost:3},"eb02-016-animal")}],["EB02-018",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",name:"Buggy",excludeSource:true},operator:"eq",value:0},then:{kind:"choose",selector:{player:"self",zone:[],includeLeader:true},bind:"eb02-018-leader",min:0,max:1,effect:{kind:"grant-keyword",binding:"eb02-018-leader",keyword:"Double Attack",expiresAfterTurns:0}}}}],["EB02-019",{effect:{kind:"if",condition:strawHatLeader,then:restOpponentCostFour("eb02-019-rest")}}],["EB02-022",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",minCurrentPower:5e3},operator:"lte",value:2},then:playVanillaBody("hand","eb02-022-body")}}],["EB02-024",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb02-024-down",min:2,max:2,effect:{kind:"order-to-bottom",binding:"eb02-024-down",to:{player:"self",zone:"deck",position:"bottom"}}},{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:1},bind:"eb02-024-bounce",min:0,max:1,effect:{kind:"move",binding:"eb02-024-bounce",to:{player:"owner",zone:"hand"}}}]}}],["EB02-026",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-multicolored",player:"self"},{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:5}]},then:{kind:"draw",player:"self",count:2}}}],["EB02-027",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:1e3},bind:"eb02-027-bury",min:0,max:1,effect:{kind:"move",binding:"eb02-027-bury",to:{player:"owner",zone:"deck",position:"bottom"}}}}],["EB02-028",{effect:{kind:"if",condition:{kind:"leader-type-including",player:"self",text:"Whitebeard Pirates"},then:{kind:"sequence",effects:[lookAndAdd(5,"eb02-028-look",{category:"character",minCost:2,maxCost:2}).effect,{kind:"choose",selector:{player:"self",zone:"hand",category:"character",minCost:2,maxCost:2},bind:"eb02-028-play",min:0,max:1,effect:{kind:"play",binding:"eb02-028-play",rested:true}}]}}}],["EB02-032",{effect:digForStage("Galley-La Company","eb02-032-dig")}],["EB02-035",{effect:{kind:"if",condition:donParity,then:{kind:"draw",player:"self",count:1}}}],["EB02-037",frankyRamp],["EB02-038",{effect:playFromHand4({type:"Impel Down",maxCost:2},"eb02-038-impel")}],["EB02-041",{effect:{kind:"if",condition:strawHatLeader,then:{kind:"draw",player:"self",count:1}}}],["EB02-044",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",color:"Black",type:"Navy",maxCost:4},bind:"eb02-044-recur",min:0,max:1,effect:{kind:"play",binding:"eb02-044-recur",rested:true}}}],["EB02-045",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash"},bind:"eb02-045-cost",min:2,max:2,effect:{kind:"sequence",effects:[{kind:"order-to-bottom",binding:"eb02-045-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"choice",branches:[{id:"draw",label:"Draw 1 card",effect:{kind:"draw",player:"self",count:1}},{id:"discard",label:"Opponent trashes 1 from hand",effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:5},then:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"eb02-045-discard",chooser:"opponent",min:1,max:1,effect:{kind:"move",binding:"eb02-045-discard",to:{player:"owner",zone:"trash"}}}}}]}]}}}}],["EB02-046",{effect:{kind:"sequence",effects:[{kind:"trash-top",player:"self",count:2},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"eb02-046-shrink",min:0,max:1,effect:{kind:"modify-cost",binding:"eb02-046-shrink",amount:-1,expiresAfterTurns:0}}]}}],["EB02-048",{effect:recoverLaboon}],["EB02-049",{effect:giveRestedDonToLeader(2)}],["EB02-053",peekAtLife],["EB02-054",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb02-054-trash",min:1,max:1,effect:{kind:"move",binding:"eb02-054-trash",to:{player:"self",zone:"trash"}}}]}}}],["EB02-056",{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind:"eb02-056-look"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"eb02-056-look",category:"character",type:"Scientist",maxCost:5,excludeName:"Vegapunk"},bind:"eb02-056-play",min:0,max:1,effect:{kind:"play",binding:"eb02-056-play"}},{kind:"select",selector:{player:"self",zone:"deck",binding:"eb02-056-look"},bind:"eb02-056-rest",count:"all",effect:{kind:"order-to-bottom",binding:"eb02-056-rest",to:{player:"self",zone:"deck",position:"bottom"}}},{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character"},operator:"lte",value:2},then:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb02-056-pay",min:1,max:1,effect:{kind:"move",binding:"eb02-056-pay",to:{player:"self",zone:"trash"}}}}]}}]]};var koOpponentUpToCost2=(maxCost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost},bind,min:0,max:1,effect:{kind:"knock-out",binding:bind}});var shrinkOpponentCost=(amount,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind,min:0,max:1,effect:{kind:"modify-cost",binding:bind,amount:-amount,expiresAfterTurns:0}});var eb02MainMechanics={eventMain:[["EB02-007",{cost:3,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"eb02-007-buff",min:0,max:3,effect:{kind:"modify-power",binding:"eb02-007-buff",amount:1e3,expiresAfterTurns:0}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:3e3},bind:"eb02-007-ko",min:0,max:1,effect:{kind:"knock-out",binding:"eb02-007-ko"}}]}}}],["EB02-008",{cost:2,program:musicSearch}],["EB02-020",{cost:2,program:musicSearch}],["EB02-031",{cost:2,program:musicSearch}],["EB02-040",{cost:2,program:musicSearch}],["EB02-050",{cost:2,program:musicSearch}],["EB02-058",{cost:2,program:musicSearch}],["EB02-021",{cost:3,program:{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Straw Hat Crew"},bind:"eb02-021-target",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"modify-power",binding:"eb02-021-target",amount:6e3,expiresAfterTurns:0},{kind:"restrict",binding:"eb02-021-target",restriction:"cannot-refresh",expiresAfterTurns:2}]}}}}],["EB02-039",{cost:4,trashFromHand:1,program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",category:"character",type:"GERMA 66",maxPower:4e3},"eb02-039-cost",1,{kind:"if",condition:donParity,then:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",minPower:5e3,maxPower:7e3,sameNameAsBinding:"eb02-039-cost"},bind:"eb02-039-play",min:0,max:1,effect:{kind:"play",binding:"eb02-039-play"}}})}}}],["EB02-051",{cost:3,program:{effect:{kind:"choice",branches:[{id:"ko",label:"K.O. a Character with a cost of 2 or less",effect:koOpponentUpToCost2(2,"eb02-051-ko")},{id:"shrink",label:"Give a Character −4 cost during this turn",effect:shrinkOpponentCost(4,"eb02-051-shrink")}]}}}]],activateMain:[["EB02-002",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Revolutionary Army",excludeName:"Sabo"},bind:"eb02-002-buff",min:0,max:1,effect:{kind:"modify-power",binding:"eb02-002-buff",amount:2e3,expiresAfterTurns:0}}]}}}}],["EB02-006",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"Land of Wano"},{kind:"leader-has-name",player:"self",name:"Portgas.D.Ace"}]},then:{kind:"sequence",effects:[{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"},{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}]}}}}],["EB02-009",{oncePerTurn:false,requires:{sourceActive:true,givenDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Straw Hat Crew"},bind:"eb02-009-target",min:0,max:1,effect:{kind:"attach-don",player:"self",from:"given",count:1,target:{binding:"eb02-009-target"}}}]}}}}],["EB02-010",{oncePerTurn:true,requires:{fieldDon:2},program:{effect:donMinus(2,{kind:"if",condition:{kind:"all-of",conditions:[{kind:"selector-count",player:"self",selector:{zone:"board",category:"character"},operator:"gte",value:1},{kind:"every-character-matches",player:"self",selector:{zone:"board",type:"Straw Hat Crew"}}]},then:{kind:"sequence",effects:[{kind:"activate-don",player:"self",count:2},{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"eb02-010-leader",count:1,effect:{kind:"modify-power",binding:"eb02-010-leader",amount:1e3,expiresAfterTurns:1}}]}})}}],["EB02-025",{oncePerTurn:false,requires:{sourceActive:true,activeDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Donquixote Rosinante"},then:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind:"eb02-025-look"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"eb02-025-look",category:"character",maxCost:2},bind:"eb02-025-play",min:0,max:1,effect:{kind:"play",binding:"eb02-025-play",rested:true}},{kind:"select",selector:{player:"self",zone:"deck",binding:"eb02-025-look"},bind:"eb02-025-rest",count:"all",effect:{kind:"order-to-bottom",binding:"eb02-025-rest",to:{player:"self",zone:"deck",position:"bottom"}}}]}}]}}}}],["EB02-041",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:donParity,then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Straw Hat Crew"},bind:"eb02-041-protect",min:0,max:1,effect:{kind:"modify-cost",binding:"eb02-041-protect",amount:2,expiresAfterTurns:1}}}]}}}}],["EB02-047",{oncePerTurn:false,requires:{handCards:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"eb02-047-cost",1,{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",typeIncluding:"CP",maxCost:5,excludeName:"Blueno"},bind:"eb02-047-play",min:0,max:1,effect:{kind:"play",binding:"eb02-047-play"}}]})}}}],["EB02-049",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Monkey.D.Garp"},then:koOpponentUpToCost2(1,"eb02-049-ko")}]}}}}],["EB02-060",{oncePerTurn:false,requires:{sourceActive:true,lifeCards:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"life",position:"top",faceUp:false},bind:"eb02-060-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:"eb02-060-life",faceUp:true},{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Straw Hat Crew"},bind:"eb02-060-buff",min:0,max:1,effect:{kind:"modify-power",binding:"eb02-060-buff",amount:1e3,expiresAfterTurns:1}}]}}]}}}}]]};var eb02BattleMechanics={counterEvent:[["EB02-030",{cost:2,power:0,program:{effect:{kind:"install-replacement",player:"self",cardNumber:"EB02-030",expiresAfterTurns:0}}}],["EB02-059",{cost:4,power:1e3,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:1},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:5,anyOf:[{color:"Yellow",type:"Straw Hat Crew"},{color:"Yellow",name:"Sanji"}]},bind:"eb02-059-play",min:0,max:1,effect:{kind:"play",binding:"eb02-059-play"}}}}}]],whenAttacking:[["EB02-037",frankyRamp],["EB02-052",{oncePerTurn:false,requires:{handCards:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"eb02-052-cost",1,{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:1},then:{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"eb02-052-bank",count:1,effect:{kind:"move",binding:"eb02-052-bank",to:{player:"self",zone:"life",position:"top"}}},{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:0}]}})}}}],["EB02-057",{oncePerTurn:false,requires:{lifeCardsMatching:{match:{position:"edge"},count:1}},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"edge"},bind:"eb02-057-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"eb02-057-cost",to:{player:"self",zone:"hand"}},paidToHand("eb02-057-cost",[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:3},bind:"eb02-057-target",min:0,max:1,effect:{kind:"choice",branches:[{id:"top",label:"Add it to the top of their Life cards",effect:{kind:"move",binding:"eb02-057-target",to:{player:"opponent",zone:"life",position:"top"},faceUp:true}},{id:"bottom",label:"Add it to the bottom of their Life cards",effect:{kind:"move",binding:"eb02-057-target",to:{player:"opponent",zone:"life",position:"bottom"},faceUp:true}}]}}])]}}}}}],["EB02-061",{oncePerTurn:true,requires:{activeDon:2},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:2,from:"active"},{kind:"update",binding:SOURCE_BINDING,rested:false},{kind:"select",selector:{player:"self",zone:"life",position:"top"},bind:"eb02-061-life",count:1,effect:{kind:"move",binding:"eb02-061-life",to:{player:"self",zone:"hand"}}}]}}}}]]};var eb02TriggerMechanics={trigger:[["EB02-007",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:4e3},bind:"eb02-007-trigger-ko",min:0,max:1,effect:{kind:"knock-out",binding:"eb02-007-trigger-ko"}}}],["EB02-008",musicSearch],["EB02-020",musicSearch],["EB02-031",musicSearch],["EB02-040",musicSearch],["EB02-050",musicSearch],["EB02-058",musicSearch],["EB02-018",{effect:restOpponentCostFour("eb02-018-trigger-rest")}],["EB02-021",{effect:restOpponentCostFour("eb02-021-trigger-rest")}],["EB02-030",{effect:{kind:"draw",player:"self",count:1}}],["EB02-055",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"Fish-Man"},{kind:"leader-has-type",player:"self",type:"Merfolk"}]},{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2}]},then:{kind:"play",binding:SOURCE_BINDING}}}],["EB02-056",{effect:{kind:"draw",player:"self",count:1}}]],onKo:[["EB02-036",{effect:donMinus(1,lookAndAdd(3,"eb02-036-look",{type:"Straw Hat Crew"}).effect)}],["EB02-048",{effect:{kind:"choose",selector:{player:"self",zone:"hand",name:"Laboon",maxCost:4},bind:"eb02-048-play",min:0,max:1,effect:{kind:"play",binding:"eb02-048-play"}}}],["EB02-053",peekAtLife]],replacement:[["EB02-030",{label:"Trash 1 from hand",opponentEffectOnly:false,battleOnly:true,oncePerTurn:false,protects:{category:"character"},cost:{kind:"trash-from-hand",count:1}}]]};var baroqueWorksLeader={kind:"leader-type-including",player:"self",text:"Baroque Works"};var waterSevenLeader={kind:"leader-has-type",player:"self",type:"Water Seven"};var impelDownLeader={kind:"leader-has-type",player:"self",type:"Impel Down"};var addActiveDon=count2=>({kind:"add-don",player:"self",count:count2,rested:false});var koCostAtMost2=(maxCost,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost},bind,min:0,max:1,effect:{kind:"knock-out",binding:bind}});var debuffOpponentCharacter2=(amount,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind,min:0,max:1,effect:{kind:"modify-power",binding:bind,amount:-amount,expiresAfterTurns:0}});var costDebuff3=(amount,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind,min:0,max:1,effect:{kind:"modify-cost",binding:bind,amount:-amount,expiresAfterTurns:0}});var brookCostThenKo={kind:"sequence",effects:[costDebuff3(1,"eb01-brook-cost"),koCostAtMost2(0,"eb01-brook-ko")]};var cavendishRamp={kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"Supernovas"},{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",name:"Cavendish",excludeSource:true},operator:"eq",value:0}]},then:{kind:"activate-don",player:"self",count:2}};var eb01OnPlayMechanics={onPlay:[["EB01-002",{effect:{kind:"give-rested-don",player:"self",count:1}}],["EB01-012",{effect:cavendishRamp}],["EB01-015",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2,rested:false},bind:"eb01-apoo",min:0,max:1,effect:{kind:"rest",binding:"eb01-apoo"}}}],["EB01-023",{effect:{kind:"draw",player:"self",count:1}}],["EB01-027",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb01-daz-trash",min:1,max:1,effect:{kind:"move",binding:"eb01-daz-trash",to:{player:"self",zone:"trash"}}}]}}],["EB01-031",{effect:donMinus(1,{kind:"if",condition:waterSevenLeader,then:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",maxCost:4},bind:"eb01-kalifa",min:0,max:2,effect:{kind:"move",binding:"eb01-kalifa",to:{player:"self",zone:"hand"}}}})}],["EB01-033",{effect:donMinus(1,{kind:"if",condition:waterSevenLeader,then:{kind:"choose",selector:{player:"self",zone:["hand","trash"],category:"character",type:"Water Seven",minCost:5,maxCost:5,excludeName:"Blueno"},bind:"eb01-blueno",min:0,max:1,effect:{kind:"play",binding:"eb01-blueno"}}})}],["EB01-035",{effect:{kind:"if",condition:baroqueWorksLeader,then:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"eb01-monday",min:0,max:1,effect:{kind:"modify-power",binding:"eb01-monday",amount:1e3,expiresAfterTurns:0}}}}],["EB01-043",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash",typeIncluding:"CP"},bind:"eb01-spandine-cost",min:3,max:3,effect:{kind:"sequence",effects:[{kind:"order-to-bottom",binding:"eb01-spandine-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",typeIncluding:"CP",maxCost:4,excludeName:"Spandine"},bind:"eb01-spandine-play",min:0,max:1,effect:{kind:"play",binding:"eb01-spandine-play",rested:true}}]}}}}],["EB01-045",{effect:{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",minCost:0,maxCost:0},operator:"gte",value:1},then:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}}}],["EB01-046",{effect:brookCostThenKo}],["EB01-049",{effect:koCostAtMost2(2,"eb01-tbone")}],["EB01-052",{effect:{kind:"choice",branches:[{id:"look",label:"Look at your opponent's Life cards and reorder them",effect:{kind:"select",selector:{player:"opponent",zone:"life"},bind:"eb01-viola-look",count:"all",effect:{kind:"order-to-bottom",binding:"eb01-viola-look",to:{player:"opponent",zone:"life",position:"bottom"}}}},{id:"hide",label:"Hide every Life card",effect:{kind:"select",selector:{player:"self",zone:"life",faceUp:true},bind:"eb01-viola-hide",count:"all",effect:{kind:"update",binding:"eb01-viola-hide",faceUp:false}}}]}}],["EB01-053",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:3},bind:"eb01-gastino",min:0,max:1,effect:{kind:"choice",branches:[{id:"top",label:"Place it on top of their Life cards",effect:{kind:"sequence",effects:[{kind:"move",binding:"eb01-gastino",to:{player:"opponent",zone:"life",position:"top"}},{kind:"update",binding:"eb01-gastino",faceUp:true}]}},{id:"bottom",label:"Place it at the bottom of their Life cards",effect:{kind:"sequence",effects:[{kind:"move",binding:"eb01-gastino",to:{player:"opponent",zone:"life",position:"bottom"}},{kind:"update",binding:"eb01-gastino",faceUp:true}]}}]}}}],["EB01-054",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:1},then:koCostAtMost2(3,"eb01-ganfall")}}],["EB01-056",lifeToHandCost({kind:"draw",player:"self",count:1})],["EB01-061",{effect:{kind:"add-don",player:"self",count:1,rested:false}}]]};var burnLifeToOne={kind:"trash-life-down-to",player:"self",size:1};var trashSelfToPlay2=(match,bind,rested,then)=>({kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:match.type,maxCost:match.maxCost,excludeName:match.excludeName},bind,min:0,max:1,effect:{kind:"play",binding:bind,...rested?{rested}:{}}},then]}});var chambresSwap={kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Supernovas"},then:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"eb01-chambres-return",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"eb01-chambres-return",to:{player:"owner",zone:"hand"}},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:2,differentColorFromBinding:"eb01-chambres-return"},bind:"eb01-chambres-play",min:0,max:1,effect:{kind:"play",binding:"eb01-chambres-play"}}]}}};var fingerPistolKo={kind:"if",condition:{kind:"zone-count",player:"self",zone:"deck",operator:"gte",value:2},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"trash-top",player:"self",count:2},koCostAtMost2(5,"eb01-finger-pistol")]}}};var eb01MainMechanics={activateMain:[["EB01-007",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"give-rested-don",player:"self",count:1}}}],["EB01-011",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",minPower:1e3,maxPower:1e3},bind:"eb01-merry-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"move",binding:"eb01-merry-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"draw",player:"self",count:1}]}}}}}],["EB01-013",{oncePerTurn:false,program:{effect:trashSelfToPlay2({type:"Land of Wano",maxCost:5,excludeName:"Kouzuki Hiyori"},"eb01-hiyori",false,{kind:"draw",player:"self",count:1})}}],["EB01-016",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1,rested:true},bind:"eb01-bingoh",min:0,max:1,effect:{kind:"knock-out",binding:"eb01-bingoh"}}]}}}}],["EB01-030",{oncePerTurn:false,requires:{handCards:1},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb01-loguetown-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"deck",position:"bottom"}},{kind:"move",binding:"eb01-loguetown-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"draw",player:"self",count:2}]}}}}}],["EB01-040",{oncePerTurn:true,requires:{lifeCards:1},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top",faceUp:false},bind:"eb01-kyros-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:"eb01-kyros-cost",faceUp:true},koCostAtMost2(0,"eb01-kyros")]}}}}}],["EB01-042",{oncePerTurn:false,program:{effect:trashSelfToPlay2({type:"Dressrosa",maxCost:3,excludeName:"Scarlet"},"eb01-scarlet",true,costDebuff3(2,"eb01-scarlet-cost"))}}],["EB01-044",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"board",category:"character",name:"Spandam"},bind:"eb01-funkfreed",min:0,max:1,effect:{kind:"modify-power",binding:"eb01-funkfreed",amount:3e3,expiresAfterTurns:0}}]}}}}]],eventMain:[["EB01-020",{cost:1,program:{effect:chambresSwap}}],["EB01-039",{cost:5,program:{effect:donMinus(1,koCostAtMost2(8,"eb01-ragnaraku"))}}],["EB01-051",{cost:4,program:{effect:fingerPistolKo}}],["EB01-059",{cost:6,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"eb01-kingdom-come",min:0,max:1,effect:{kind:"knock-out",binding:"eb01-kingdom-come"}},burnLifeToOne]}}}],["EB01-060",{cost:4,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:["hand","trash"],name:"Enel",maxCost:7},bind:"eb01-kami",min:0,max:1,effect:{kind:"play",binding:"eb01-kami"}},burnLifeToOne]}}}]]};var bounceCostAtMost2=(maxCost,bind)=>({kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost},bind,min:0,max:1,effect:{kind:"move",binding:bind,to:{player:"owner",zone:"hand"}}});var eb01BattleMechanics={whenAttacking:[["EB01-001",{oncePerTurn:false,requires:{activeDon:1},program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"source-attached-don",operator:"gte",value:1},{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"Land of Wano",minCost:5},operator:"gte",value:1}]},then:{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:1}}}}],["EB01-003",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:2},then:{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:0}}}],["EB01-004",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:[],includeLeader:true,rested:false},bind:"eb01-koza-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"modify-power",binding:"eb01-koza-cost",amount:-5e3,expiresAfterTurns:0},debuffOpponentCharacter2(3e3,"eb01-koza")]}}}}],["EB01-006",{oncePerTurn:false,requires:{activeDon:2},program:{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:2},then:debuffOpponentCharacter2(3e3,"eb01-chopper")}}}],["EB01-012",{effect:cavendishRamp}],["EB01-026",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"source-attached-don",operator:"gte",value:1},{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:1}]},then:bounceCostAtMost2(3,"eb01-bellett")}}}],["EB01-046",{effect:brookCostThenKo}],["EB01-061",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"eb01-bentham",min:0,max:1,effect:{kind:"copy-power",from:"eb01-bentham",to:SOURCE_BINDING,expiresAfterTurns:0}}}]],onOpponentAttack:[["EB01-002",{oncePerTurn:true,requires:{handCards:1},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb01-izo-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"eb01-izo-cost",to:{player:"self",zone:"trash"}},{kind:"if",condition:{kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"Land of Wano"},{kind:"leader-has-type",player:"self",type:"Whitebeard Pirates"}]},then:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"eb01-izo",min:0,max:1,effect:{kind:"modify-power",binding:"eb01-izo",amount:-2e3,expiresAfterTurns:0}}}]}}}}}],["EB01-034",{oncePerTurn:true,requires:{fieldDon:1},program:{effect:donMinus(1,{kind:"if",condition:baroqueWorksLeader,then:addActiveDon(1)})}}],["EB01-037",{oncePerTurn:true,requires:{fieldDon:1},program:{effect:donMinus(1,koCostAtMost2(2,"eb01-mr9"))}}]],counterEvent:[["EB01-009",{cost:1,power:0,program:{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind:"eb01-009"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"eb01-009",category:"character",type:"Animal",maxCost:3},bind:"eb01-009-play",min:0,max:1,effect:{kind:"play",binding:"eb01-009-play"}},{kind:"select",selector:{player:"self",zone:"deck",binding:"eb01-009"},bind:"eb01-009-rest",count:"all",effect:{kind:"order-to-bottom",binding:"eb01-009-rest",to:{player:"self",zone:"deck",position:"bottom"}}}]}}}],["EB01-010",{cost:3,power:0,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:6e3},bind:"eb01-010",min:0,max:1,effect:{kind:"knock-out",binding:"eb01-010"}}}}],["EB01-019",{cost:2,power:4e3,program:lookAndAdd(3,"eb01-019",{category:"character",type:"Donquixote Pirates"})}],["EB01-028",{cost:1,power:2e3,powerWhen:impelDownLeader,program:{effect:{kind:"if",condition:impelDownLeader,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:false},chooser:"opponent",bind:"eb01-028",min:1,max:1,effect:{kind:"move",binding:"eb01-028",to:{player:"owner",zone:"hand"}}}}}}],["EB01-029",{cost:1,power:0,program:{effect:{kind:"sequence",effects:[{kind:"reveal-deck-top",player:"self"},{kind:"if",condition:{kind:"deck-top-cost",player:"self",operator:"gte",value:4},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"eb01-029",min:0,max:1,effect:{kind:"move",binding:"eb01-029",to:{player:"owner",zone:"hand"}}},{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"eb01-029-bottom",count:"all",effect:{kind:"move",binding:"eb01-029-bottom",to:{player:"self",zone:"deck",position:"bottom"}}}]}}]}}}],["EB01-038",{cost:1,donMinus:1,power:0,program:{effect:{kind:"if",condition:baroqueWorksLeader,then:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"eb01-038",min:1,max:1,effect:{kind:"redirect-attack",binding:"eb01-038"}}}}}],["EB01-050",{cost:3,power:0,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:30},then:{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"eb01-050",count:"all",effect:{kind:"move",binding:"eb01-050",to:{player:"self",zone:"life",position:"top"}}}}}}]]};var bounceToOwner=(maxCost,zone,bind)=>({kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost},bind,min:0,max:1,effect:{kind:"move",binding:bind,to:zone==="deck"?{player:"owner",zone:"deck",position:"bottom"}:{player:"owner",zone:"hand"}}});var eb01TriggerMechanics={trigger:[["EB01-010",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:5e3},bind:"eb01-010-trigger",min:0,max:1,effect:{kind:"knock-out",binding:"eb01-010-trigger"}}}],["EB01-020",{effect:chambresSwap}],["EB01-028",{effect:bounceToOwner(3,"deck","eb01-028-trigger")}],["EB01-029",{effect:bounceToOwner(8,"hand","eb01-029-trigger")}],["EB01-030",{effect:{kind:"play",binding:SOURCE_BINDING}}],["EB01-035",{effect:donMinus(1,{kind:"play",binding:SOURCE_BINDING})}],["EB01-038",{effect:donMinus(1,{kind:"draw",player:"self",count:2})}],["EB01-039",{effect:addActiveDon(1)}],["EB01-051",{effect:fingerPistolKo}],["EB01-053",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"eb01-053-trigger",min:0,max:2,effect:{kind:"modify-power",binding:"eb01-053-trigger",amount:-3e3,expiresAfterTurns:0}}}],["EB01-059",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCostFromZoneCount:{player:"either",zone:"life"}},bind:"eb01-059-trigger",min:0,max:1,effect:{kind:"knock-out",binding:"eb01-059-trigger"}}}],["EB01-060",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb01-060-trash",min:1,max:1,effect:{kind:"move",binding:"eb01-060-trash",to:{player:"self",zone:"trash"}}}]}}]],onKo:[["EB01-036",{effect:{kind:"if",condition:impelDownLeader,then:{kind:"add-don",player:"self",count:1,rested:true}}}],["EB01-057",{opponentEffectOnly:true,program:{effect:{kind:"choose",selector:{player:"self",zone:"deck",position:"top"},bind:"eb01-shirahoshi-life",min:0,max:1,effect:{kind:"move",binding:"eb01-shirahoshi-life",to:{player:"self",zone:"life",position:"top"}}}}}]],onEndOfYourTurn:[["EB01-021",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Impel Down",minCost:2},bind:"eb01-hannyabal",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"eb01-hannyabal",to:{player:"owner",zone:"hand"}},addActiveDon(1)]}}}}],["EB01-022",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:2},then:{kind:"draw",player:"self",count:2}}}]]};var eb01ReplacementMechanics={replacement:[["EB01-008",{opponentEffectOnly:false,effectOnly:true,oncePerTurn:true,label:"Trash an Event or Stage from hand",cost:{kind:"trash-from-hand",count:1,match:{anyOf:[{category:"event"},{category:"stage"}]}}}]]};var digExcludingSelf=(type,name,bind)=>lookAndAdd(5,bind,{type,excludeName:name});var prb02OnPlayMechanics={onPlay:[["PRB02-003",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",category:"character",minPower:6e3},"prb02-roux-cost",1,{kind:"draw",player:"self",count:2})}}],["PRB02-005",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"turn-player",player:"self"},{kind:"leader-multicolored",player:"self"},{kind:"field-don",player:"opponent",operator:"lte",value:7}]},then:{kind:"rest-don-at-next-main",player:"opponent",count:1}}}],["PRB02-007",digExcludingSelf("The Seven Warlords of the Sea","Jinbe","prb02-jinbe")],["PRB02-010",{effect:donMinus(2,{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"Big Mom Pirates"},{kind:"field-don",player:"opponent",operator:"gte",value:6}]},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Big Mom Pirates",minPower:6e3,maxPower:8e3},bind:"prb02-pudding-play",min:0,max:1,effect:{kind:"play",binding:"prb02-pudding-play"}}]}})}],["PRB02-011",{effect:{kind:"if",condition:{kind:"leader-multicolored",player:"self"},then:{kind:"add-don",player:"self",count:1,rested:true}}}],["PRB02-012",digExcludingSelf("Straw Hat Crew","Nami","prb02-nami")],["PRB02-013",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Thriller Bark Pirates"},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"trash",category:"character",maxCost:4,excludeSource:true},bind:"prb02-moria-play",min:0,max:1,effect:{kind:"play",binding:"prb02-moria-play",rested:true}},{kind:"give-rested-don",player:"self",count:1}]}}}],["PRB02-017",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",hasTrigger:true},"prb02-hancock-cost",1,{kind:"choice",branches:[{id:"leader",label:"Lock your opponent's rested Leader",effect:{kind:"choose",selector:{player:"opponent",zone:[],includeLeader:true,rested:true},bind:"prb02-hancock-leader",min:0,max:1,effect:{kind:"restrict",binding:"prb02-hancock-leader",restriction:"cannot-attack",expiresAfterTurns:1}}},{id:"character",label:"Lock 1 of your opponent's Characters",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",excludeName:"Monkey.D.Luffy"},bind:"prb02-hancock-character",min:0,max:1,effect:{kind:"restrict",binding:"prb02-hancock-character",restriction:"cannot-attack",expiresAfterTurns:1}}}]})}}],["PRB02-018",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"life",faceUp:true},operator:"gte",value:1},then:{kind:"choose",selector:{player:"self",zone:["hand","trash"],minCost:2,maxCost:2,anyOf:[{name:"Sabo"},{name:"Portgas.D.Ace"},{name:"Monkey.D.Luffy"}]},bind:"prb02-ace-play",min:0,max:1,effect:{kind:"play",binding:"prb02-ace-play"}}}}]]};var prb02BattleMechanics={whenAttacking:[["PRB02-001",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:3e3},bind:"prb02-koby-ko",min:0,max:1,effect:{kind:"knock-out",binding:"prb02-koby-ko"}},{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:6},then:{kind:"draw",player:"self",count:1}}]}}],["PRB02-002",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"prb02-law-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"prb02-law-debuff",amount:-2e3,expiresAfterTurns:0}}}],["PRB02-007",{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:1},bind:"prb02-jinbe-bounce",min:0,max:1,effect:{kind:"move",binding:"prb02-jinbe-bounce",to:{player:"owner",zone:"deck",position:"bottom"}}}}]],whenRested:[["PRB02-009",{yourTurnOnly:false,source:"opponent-effect",program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"trash"}},{kind:"draw",player:"self",count:2}]}}}}],["PRB02-006",{yourTurnOnly:false,source:"opponent-character-effect",program:{effect:{kind:"if",condition:{kind:"turn-player",player:"opponent"},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",excludeSource:true,rested:false,canRest:true},bind:"prb02-zoro-instead",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:"prb02-zoro-instead"},{kind:"update",binding:SOURCE_BINDING,rested:false}]}}}}}}]],onOpponentAttack:[["PRB02-004",{oncePerTurn:true,program:{effect:{kind:"activate-don",player:"self",count:1}}}]]};var prb02ReplacementMechanics={replacement:[["PRB02-002",{opponentEffectOnly:true,oncePerTurn:true,removal:"off-field",label:"Give it −2000 power instead",cost:{kind:"power-penalty",amount:-2e3}}]]};var prb02TriggerMechanics={trigger:[["PRB02-012",{effect:{kind:"play",binding:SOURCE_BINDING}}],["PRB02-017",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"prb02-hancock-trigger",min:0,max:1,effect:{kind:"knock-out",binding:"prb02-hancock-trigger"}}}]]};var bankDeckTopOnLife=bind=>({kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind,count:1,effect:{kind:"move",binding:bind,to:{player:"self",zone:"life",position:"top"}}});var swordAttacksActive={effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,type:"SWORD"},bind:"eb03-hibari-target",min:0,max:1,effect:{kind:"grant-attack-active",binding:"eb03-hibari-target",expiresAfterTurns:0}}};var eb03OnPlayMechanics={onPlay:[["EB03-003",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Uta"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},playVanillaBody("hand","eb03-uta-body")]}}}],["EB03-005",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Sugar"},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Donquixote Pirates",maxPower:6e3},bind:"eb03-sugar-body",min:0,max:1,effect:{kind:"play",binding:"eb03-sugar-body",rested:true}}}}],["EB03-006",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,category:"leader",rested:false},bind:"eb03-nami-leader",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"modify-power",binding:"eb03-nami-leader",amount:-5e3,expiresAfterTurns:0},{kind:"draw",player:"self",count:1}]}}}}],["EB03-008",swordAttacksActive],["EB03-010",lookAndAdd(5,"eb03-monet-looked",{anyOf:[{category:"character",maxPower:1e3},{category:"event"}]})],["EB03-016",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Kouzuki Oden"},then:{kind:"draw",player:"self",count:1}}}],["EB03-017",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Supernovas"},then:{kind:"sequence",effects:[{kind:"activate-don",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:8},bind:"eb03-bonney-freeze",min:0,max:1,effect:{kind:"restrict",binding:"eb03-bonney-freeze",restriction:"cannot-rest",expiresAfterTurns:1}}]}}}],["EB03-021",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb03-alvida-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"eb03-alvida-cost",to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:4e3},bind:"eb03-alvida-small",min:0,max:1,effect:{kind:"move",binding:"eb03-alvida-small",to:{player:"owner",zone:"deck",position:"bottom"}}},{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxBaseCost:3},bind:"eb03-alvida-cheap",min:0,max:1,effect:{kind:"move",binding:"eb03-alvida-cheap",to:{player:"owner",zone:"deck",position:"bottom"}}}]}}}}],["EB03-022",{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:4},bind:"eb03-isuka-bury",min:0,max:1,effect:{kind:"move",binding:"eb03-isuka-bury",to:{player:"owner",zone:"deck",position:"bottom"}}}}],["EB03-023",{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind:"eb03-kaya-looked"},{kind:"select",selector:{player:"self",zone:"deck",binding:"eb03-kaya-looked"},bind:"eb03-kaya-place",count:"all",effect:{kind:"order-to-bottom",binding:"eb03-kaya-place",to:{player:"self",zone:"deck",position:"top"},alternate:{player:"self",zone:"deck",position:"bottom"}}}]}}],["EB03-024",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:5,anyOf:[{type:"Alabasta"},{type:"Straw Hat Crew"}]},bind:"eb03-vivi-body",min:0,max:1,effect:{kind:"play",binding:"eb03-vivi-body"}},{kind:"restrict-player",player:"self",restriction:"cannot-play-characters",expiresAfterTurns:0}]}}],["EB03-025",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb03-hina-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"eb03-hina-cost",to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"either",zone:"board",category:"character",minPower:6e3,maxPower:6e3},bind:"eb03-hina-bounce",min:0,max:1,effect:{kind:"move",binding:"eb03-hina-bounce",to:{player:"owner",zone:"hand"}}}]}}}}],["EB03-026",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:5},then:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"eb03-hancock-bury",min:1,max:1,chooser:"opponent",effect:{kind:"move",binding:"eb03-hancock-bury",to:{player:"owner",zone:"deck",position:"bottom"}}}}}],["EB03-027",{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",minPower:7e3,maxPower:7e3},bind:"eb03-marguerite-bounce",min:0,max:1,effect:{kind:"move",binding:"eb03-marguerite-bounce",to:{player:"owner",zone:"hand"}}}}],["EB03-028",{effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb03-yu-discard",min:1,max:1,effect:{kind:"move",binding:"eb03-yu-discard",to:{player:"self",zone:"trash"}}}}],["EB03-031",{effect:donMinus(1,{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Sanji"},then:{kind:"choose",selector:{player:"self",zone:"trash",category:"event",maxCost:7},bind:"eb03-reiju-event",min:0,max:1,effect:{kind:"activate-event",binding:"eb03-reiju-event",mainOnly:true}}})}],["EB03-034",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb03-linlin-stack",min:1,max:1,effect:{kind:"move",binding:"eb03-linlin-stack",to:{player:"self",zone:"deck",position:"top"}}},{kind:"add-don",player:"self",count:1,rested:false}]}}],["EB03-036",{effect:donMinus(1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:3},bind:"eb03-baby5-ko",min:0,max:2,effect:{kind:"knock-out",binding:"eb03-baby5-ko"}})}],["EB03-037",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:7},then:{kind:"select",selector:{player:"self",zone:"board",includeLeader:true,type:"ODYSSEY"},bind:"eb03-lim-buff",count:"all",effect:{kind:"modify-power",binding:"eb03-lim-buff",amount:1e3,expiresAfterTurns:1}}}}],["EB03-039",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb03-ulti-discard",min:1,max:1,effect:{kind:"move",binding:"eb03-ulti-discard",to:{player:"self",zone:"trash"}}},playVanillaBody("trash","eb03-ulti-body")]}}}],["EB03-041",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand",type:"Navy"},bind:"eb03-kujyaku-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"eb03-kujyaku-cost",to:{player:"self",zone:"trash"}},{kind:"draw",player:"self",count:2}]}}}}],["EB03-043",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash",typeIncluding:"CP"},bind:"eb03-stussy-cost",min:2,max:2,effect:{kind:"sequence",effects:[{kind:"order-to-bottom",binding:"eb03-stussy-cost",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"eb03-stussy-ko",min:0,max:1,effect:{kind:"knock-out",binding:"eb03-stussy-ko"}}]}}}}],["EB03-044",{effect:{kind:"sequence",effects:[lookAndAdd(5,"eb03-maria-looked",{name:"Onigashima Island"}).effect,{kind:"choose",selector:{player:"self",zone:"hand",name:"Onigashima Island"},bind:"eb03-maria-stage",min:0,max:1,effect:{kind:"play",binding:"eb03-maria-stage"}}]}}],["EB03-045",{effect:{kind:"sequence",effects:[{kind:"give-rested-don",player:"self",count:1},{kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:10},then:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Thriller Bark Pirates",maxCost:2,excludeSource:true},bind:"eb03-perona-body",min:0,max:1,effect:{kind:"play",binding:"eb03-perona-body",rested:true}}}]}}],["EB03-046",{effect:{kind:"if",condition:{kind:"any-of",conditions:[{kind:"selector-count",player:"either",selector:{zone:"board",category:"character",maxCost:0},operator:"gte",value:1},{kind:"selector-count",player:"either",selector:{zone:"board",category:"character",minCost:8},operator:"gte",value:1}]},then:{kind:"draw",player:"self",count:1}}}],["EB03-047",{effect:{kind:"trash-top",player:"self",count:3}}],["EB03-048",{effect:{kind:"sequence",effects:[lookAndAdd(5,"eb03-rebecca-looked",{category:"stage",type:"Dressrosa"}).effect,{kind:"choose",selector:{player:"self",zone:"hand",category:"stage",type:"Dressrosa",minCost:1,maxCost:1},bind:"eb03-rebecca-stage",min:0,max:1,effect:{kind:"play",binding:"eb03-rebecca-stage"}}]}}],["EB03-050",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Sky Island"},bind:"eb03-conis-target",min:0,max:1,effect:{kind:"grant-keyword",binding:"eb03-conis-target",keyword:"Double Attack",expiresAfterTurns:0}}}],["EB03-051",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"life",faceUp:true},operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"eb03-smoothie-ko",min:0,max:1,effect:{kind:"knock-out",binding:"eb03-smoothie-ko"}},{kind:"select",selector:{player:"self",zone:"life"},bind:"eb03-smoothie-life",count:"all",effect:{kind:"update",binding:"eb03-smoothie-life",faceUp:false}}]}}}],["EB03-054",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"edge"},bind:"eb03-robin-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"eb03-robin-cost",to:{player:"self",zone:"trash"}},bankDeckTopOnLife("eb03-robin-bank")]}}}}],["EB03-056",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"edge",faceUp:false},bind:"eb03-betty-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:"eb03-betty-cost",faceUp:true},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:3},bind:"eb03-betty-ko",min:0,max:1,effect:{kind:"knock-out",binding:"eb03-betty-ko"}}]}}}}],["EB03-057",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Land of Wano"},then:{kind:"attach-don",player:"self",from:"rested",count:3,target:"leader"}}}],["EB03-058",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:{kind:"draw",player:"self",count:1}}}],["EB03-059",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-type",player:"self",type:"Egghead"},{kind:"zone-count",player:"self",zone:"life",operator:"gte",value:2}]},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",hasTrigger:true},bind:"eb03-snake-bank",min:0,max:1,effect:{kind:"move",binding:"eb03-snake-bank",to:{player:"self",zone:"life",position:"top"},faceUp:true}}}}]]};var shrinkOne=(amount,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind,min:0,max:1,effect:{kind:"modify-power",binding:bind,amount:-amount,expiresAfterTurns:0}});var namiServantSearch={effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Nami"},then:lookAndAdd(4,"eb03-060-looked",{minCost:2,maxCost:8}).effect}};var trashSelf={kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}};var eb03MainMechanics={activateMain:[["EB03-001",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},shrinkOne(2e3,"eb03-vivi-shrink"),{kind:"choose",selector:{player:"self",zone:"board",category:"character",lacksClause:"[When Attacking]"},bind:"eb03-vivi-rush",min:0,max:1,effect:{kind:"grant-keyword",binding:"eb03-vivi-rush",keyword:"Rush",expiresAfterTurns:0}}]}}}}],["EB03-006",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Alabasta"},then:shrinkOne(1e3,"eb03-nami-shrink")}}}],["EB03-008",{oncePerTurn:true,program:{effect:shrinkOne(1e3,"eb03-hibari-shrink")}}],["EB03-009",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"board",category:"character",noBaseEffect:true},bind:"eb03-makino-buff",min:0,max:1,effect:{kind:"modify-power",binding:"eb03-makino-buff",amount:2e3,expiresAfterTurns:0}}]}}}}],["EB03-012",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"rest-opponent-cards",player:"opponent",count:1,match:{category:"character",maxCost:3,anyOf:[{type:"Animal"},{type:"SMILE"}]}}]}}}}],["EB03-013",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"source-played-this-turn"},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:5},bind:"eb03-carrot-ko",min:0,max:1,effect:{kind:"knock-out",binding:"eb03-carrot-ko"}},{kind:"choose",selector:{player:"self",zone:"hand",name:"Zou"},bind:"eb03-carrot-stage",min:0,max:1,effect:{kind:"play",binding:"eb03-carrot-stage"}}]}}}}],["EB03-014",{oncePerTurn:false,requires:{sourceActive:true,restedDon:1},program:{effect:{kind:"if",condition:{kind:"leader-has-attribute",player:"self",attribute:"Slash"},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"attach-don",player:"self",from:"rested",count:2,target:"leader"}]}}}}}],["EB03-015",{oncePerTurn:false,requires:{sourceActive:true,restedDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"give-rested-don",player:"self",count:1,anyOfTypes:["Fish-Man","Merfolk"]},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2,canRest:true},bind:"eb03-camie-rest",min:0,max:1,effect:{kind:"rest",binding:"eb03-camie-rest"}}]}}}}],["EB03-016",{oncePerTurn:false,requires:{restedDon:1},program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Land of Wano"},then:{kind:"optional",effect:{kind:"sequence",effects:[trashSelf,{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"}]}}}}}],["EB03-026",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"eb03-hancock-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"eb03-hancock-cost",to:{player:"owner",zone:"deck",position:"bottom"}},{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"},{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"eb03-hancock-give",min:0,max:1,effect:{kind:"attach-don",player:"self",from:"rested",count:1,target:{binding:"eb03-hancock-give"}}}]}}}}],["EB03-028",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:4},then:{kind:"optional",effect:{kind:"sequence",effects:[trashSelf,{kind:"draw",player:"self",count:2}]}}}}}],["EB03-052",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Shirahoshi"},then:{kind:"optional",effect:{kind:"sequence",effects:[trashSelf,bankDeckTopOnLife("eb03-shirahoshi-bank"),{kind:"select",selector:{player:"self",zone:"board",category:"character",type:"Neptunian"},bind:"eb03-shirahoshi-buff",count:"all",effect:{kind:"modify-power",binding:"eb03-shirahoshi-buff",amount:1e3,expiresAfterTurns:0}}]}}}}}],["EB03-061",{oncePerTurn:true,program:{effect:{kind:"sequence",effects:[{kind:"activate-don",player:"self",count:1},{kind:"rest-opponent-cards",player:"opponent",count:1,match:{category:"character",maxCost:4}}]}}}]],eventMain:[["EB03-060",{cost:1,program:namiServantSearch}],["EB03-029",{cost:1,restDon:4,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Boa Hancock"},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:6,anyOf:[{type:"Amazon Lily"},{type:"Kuja Pirates"}]},bind:"eb03-hancock-event-body",min:0,max:1,effect:{kind:"play",binding:"eb03-hancock-event-body"}}}}}],["EB03-038",{cost:1,restDon:1,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"field-don-versus",player:"self",operator:"lte"},{kind:"selector-count",player:"self",selector:{zone:"board",category:"character"},operator:"gte",value:1},{kind:"every-character-matches",player:"self",selector:{zone:"board",typeIncluding:"GERMA"}}]},then:{kind:"add-don",player:"self",count:2,rested:true}}}}],["EB03-049",{cost:1,restDon:7,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Perona"},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:["hand","trash"],category:"character",type:"Thriller Bark Pirates",maxCost:6},bind:"eb03-perona-event-big",min:0,max:1,effect:{kind:"play",binding:"eb03-perona-event-big"}},{kind:"choose",selector:{player:"self",zone:["hand","trash"],category:"character",type:"Thriller Bark Pirates",maxCost:4},bind:"eb03-perona-event-small",min:0,max:1,effect:{kind:"play",binding:"eb03-perona-event-small"}}]}}}}]]};var eb03BattleMechanics={counterEvent:[["EB03-011",{cost:1,power:4e3,powerWhen:{kind:"leader-has-name",player:"self",name:"Nefeltari Vivi"}}],["EB03-020",{cost:1,power:2e3,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"FILM"},operator:"gte",value:2},then:{kind:"battle-power",player:"self",amount:2e3}}}}],["EB03-029",{cost:1,power:3e3,target:{name:"Boa Hancock"}}],["EB03-038",{cost:1,power:3e3,target:{isLeader:true}}],["EB03-049",{cost:1,power:3e3,target:{isLeader:true}}]],whenAttacking:[["EB03-008",swordAttacksActive]]};var eb03TriggerMechanics={trigger:[["EB03-060",namiServantSearch],["EB03-011",{effect:shrinkOne(2e3,"eb03-011-trigger-shrink")}],["EB03-020",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",rested:true},bind:"eb03-020-refresh",min:0,max:1,effect:{kind:"update",binding:"eb03-020-refresh",rested:false}}}],["EB03-054",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb03-054-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"eb03-054-cost",to:{player:"self",zone:"trash"}},{kind:"play",binding:SOURCE_BINDING}]}}}}],["EB03-058",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Vegapunk"},then:{kind:"play",binding:SOURCE_BINDING}}}],["EB03-059",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6,excludeName:"Monkey.D.Luffy"},bind:"eb03-059-lock",min:0,max:1,effect:{kind:"restrict",binding:"eb03-059-lock",restriction:"cannot-attack",expiresAfterTurns:0}}}]],onKo:[["EB03-007",{effect:playVanillaBody("hand","eb03-baccarat-body")}],["EB03-034",{effect:donMinus(1,bankDeckTopOnLife("eb03-linlin-bank"))}],["EB03-042",{effect:{kind:"if",condition:{kind:"turn-player",player:"opponent"},then:{kind:"choose",selector:{player:"self",zone:["hand","trash"],category:"character",maxCost:6,excludeName:"Koala",anyOf:[{type:"Revolutionary Army"},{name:"Nico Robin"}]},bind:"eb03-koala-body",min:0,max:1,effect:{kind:"play",binding:"eb03-koala-body"}}}}],["EB03-046",{effect:{kind:"trash-top",player:"self",count:2}}],["EB03-047",{effect:{kind:"draw",player:"self",count:1}}],["EB03-057",{effect:{kind:"select",selector:{player:"opponent",zone:"life",position:"top"},bind:"eb03-yamato-life",count:1,effect:{kind:"move",binding:"eb03-yamato-life",to:{player:"owner",zone:"trash"}}}}]],onEndOfYourTurn:[["EB03-018",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"active-don",player:"self",operator:"gte",value:1},{kind:"zone-count",player:"self",zone:"hand",operator:"gte",value:1}]},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"eb03-tashigi-cost",min:1,max:1,effect:{kind:"move",binding:"eb03-tashigi-cost",to:{player:"self",zone:"trash"}}},{kind:"update",binding:SOURCE_BINDING,rested:false}]}}}}],["EB03-061",{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"FILM",rested:true},bind:"eb03-uta-refresh",min:0,max:1,effect:{kind:"update",binding:"eb03-uta-refresh",rested:false}}]}}}}]]};var eb03ReplacementMechanics={replacement:[["EB03-001",{opponentEffectOnly:false,oncePerTurn:true,protects:{category:"character",minBaseCost:4},label:"Trash 1 from hand",cost:{kind:"trash-from-hand",count:1}}]]};var op17MetaMechanics={onPlay:[["ST16-004",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true},bind:"st16-shanks-ko",min:0,max:1,effect:{kind:"knock-out",binding:"st16-shanks-ko"}}}],["OP13-031",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op13-law-bounce",min:1,max:1,effect:{kind:"move",binding:"op13-law-bounce",to:{player:"self",zone:"hand"}}},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:5},bind:"op13-law-play",min:0,max:1,effect:{kind:"play",binding:"op13-law-play",rested:true}}]}}}],["OP08-051",{effect:{kind:"choose",selector:{player:"self",zone:"board",name:"Edward Weevil"},bind:"op08-buckin-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op08-buckin-buff",amount:2e3,expiresAfterTurns:0}}}]]};var op17OnPlayMechanics={onPlay:[["OP17-009",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:2e3},bind:"op17-haruta-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op17-haruta-ko"}}}],["OP17-016",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:2e3},bind:"op17-rakuyo-ko",min:0,max:2,effect:{kind:"knock-out",binding:"op17-rakuyo-ko"}}}],["OP17-014",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:2e3},bind:"op17-whitey-bay-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op17-whitey-bay-ko"}}}],["OP17-113",lookAndAdd(3,"op17-streusen-looked",{type:"Big Mom Pirates"})],["OP17-082",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-sanji-discard",min:2,max:2,effect:{kind:"move",binding:"op17-sanji-discard",to:{player:"self",zone:"trash"}}}]}}],["OP17-084",{effect:{kind:"if",condition:elbaphGiantOut,then:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"op17-chopper-target",min:0,max:1,effect:{kind:"grant-keyword",binding:"op17-chopper-target",keyword:"Unblockable",expiresAfterTurns:0}}}}],["OP17-090",{effect:{kind:"if",condition:elbaphGiantOut,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"op17-franky-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op17-franky-ko"}}}}],["OP17-091",{effect:{kind:"if",condition:elbaphGiantOut,then:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op17-brook-discard",min:1,max:1,chooser:"opponent",effect:{kind:"move",binding:"op17-brook-discard",to:{player:"opponent",zone:"trash"}}}}}],["OP17-080",lookAndAddOrTrash(3,"op17-usopp-looked",{type:"Elbaph"})],["OP17-049",{effect:{kind:"choice",chooser:"opponent",branches:[{id:"draw",label:"Draw 2 cards",effect:{kind:"draw",player:"self",count:2}},{id:"opponent-discards",label:"Opponent trashes 2 from hand",effect:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op17-linlin049-discard",min:0,max:2,exhaustive:true,chooser:"opponent",effect:{kind:"move",binding:"op17-linlin049-discard",to:{player:"opponent",zone:"trash"}}}}]}}],["OP17-045",{effect:{kind:"draw",player:"self",count:1}}],["OP17-086",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"hand",type:"Elbaph"},operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",type:"Elbaph"},bind:"op17-nami086-cost",min:1,max:1,effect:{kind:"move",binding:"op17-nami086-cost",to:{player:"self",zone:"trash"}}},{kind:"draw",player:"self",count:2}]}}}}],["OP17-089",lookAndAddOrTrash(3,"op17-saul-looked",{type:"Elbaph"})],["OP17-085",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Elbaph"},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:["hand","trash"],name:"Brogy",maxCost:5},bind:"op17-dorry-play",min:0,max:1,effect:{kind:"play",binding:"op17-dorry-play"}},{kind:"restrict-player",player:"self",restriction:"cannot-play-characters",expiresAfterTurns:0}]}}}],["OP17-092",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Elbaph"},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:["hand","trash"],name:"Dorry",maxCost:5},bind:"op17-brogy-play",min:0,max:1,effect:{kind:"play",binding:"op17-brogy-play"}},{kind:"restrict-player",player:"self",restriction:"cannot-play-characters",expiresAfterTurns:0}]}}}],["OP17-093",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",maxCost:2},bind:"op17-luffy-recur",min:0,max:1,effect:{kind:"play",binding:"op17-luffy-recur"}}]}}],["OP17-030",{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}]}}}}],["OP17-022",{effect:{kind:"sequence",effects:[{kind:"activate-don",player:"self",count:2},{kind:"select",selector:{player:"opponent",zone:"board",category:"character"},bind:"op17-shanks022-rest",count:"all",effect:{kind:"rest",binding:"op17-shanks022-rest"}}]}}],["OP17-031",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:8,canRest:true},bind:"op17-yasopp-rest",min:0,max:1,effect:{kind:"rest",binding:"op17-yasopp-rest"}}]}}],["OP17-046",{effect:{kind:"choice",branches:[{id:"self",label:"Bottom your own cost-5-or-less Character",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",maxCost:5},bind:"op17-gloriosa-self",min:0,max:1,effect:{kind:"move",binding:"op17-gloriosa-self",to:{player:"self",zone:"deck",position:"bottom"}}}},{id:"opponent",label:"Bottom your opponent's cost-5-or-less Character",effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"op17-gloriosa-opponent",min:0,max:1,effect:{kind:"move",binding:"op17-gloriosa-opponent",to:{player:"opponent",zone:"deck",position:"bottom"}}}}]}}],["OP17-004",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",anyOf:[{type:"Land of Wano"},{typeIncluding:"Whitebeard Pirates"}]},bind:"op17-minks-rush",min:0,max:1,effect:{kind:"grant-keyword",binding:"op17-minks-rush",keyword:"Rush",expiresAfterTurns:0}}}],["OP17-028",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6,rested:true},bind:"op17-bonk-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op17-bonk-ko"}}}],["OP17-066",{effect:donMinus(1,{kind:"if",condition:ownCostTenBody,then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-orochi-discard",min:1,max:1,effect:{kind:"move",binding:"op17-orochi-discard",to:{player:"self",zone:"trash"}}}]}})}],["OP17-067",{effect:donMinus(1,{kind:"if",condition:ownCostTenBody,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",canRest:true},bind:"op17-kanjuro-rest",min:0,max:1,effect:{kind:"rest",binding:"op17-kanjuro-rest"}}})}],["OP17-069",{effect:donMinus(1,{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op17-jack-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op17-jack-debuff",amount:-2e3,expiresAfterTurns:0}}})}],["OP17-071",{effect:donMinus(1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"op17-whoswho-ko",min:0,max:2,effect:{kind:"knock-out",binding:"op17-whoswho-ko"}})}],["OP17-075",{effect:donMinus(2,{kind:"pick-from-hand",player:"opponent",pick:"blind",bind:"op17-drake-discard",effect:{kind:"move",binding:"op17-drake-discard",to:{player:"opponent",zone:"trash"}}})}],["OP17-105",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand",hasTrigger:true},bind:"op17-chiffon-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op17-chiffon-cost",to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",hasTrigger:true},bind:"op17-chiffon-bounce",min:0,max:1,effect:{kind:"move",binding:"op17-chiffon-bounce",to:{player:"opponent",zone:"hand"}}}]}}}}],["OP17-024",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",canRest:true},bind:"op17-gab-rest",min:0,max:1,effect:{kind:"rest",binding:"op17-gab-rest"}}}],["OP17-052",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"event",color:"Blue",maxCost:0},bind:"op17-marlon-recur",min:0,max:1,effect:{kind:"move",binding:"op17-marlon-recur",to:{player:"self",zone:"hand"}}}}],["OP17-050",{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:2,bind:"op17-streusen-look"},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"deck",binding:"op17-streusen-look"},operator:"gte",value:1},then:{kind:"choice",branches:["top","bottom"].map(position=>({id:position,label:position==="top"?"Place them at the top of your deck":"Place them at the bottom of your deck",effect:{kind:"select",selector:{player:"self",zone:"deck",binding:"op17-streusen-look"},bind:"op17-streusen-place",count:"all",effect:{kind:"order-to-bottom",binding:"op17-streusen-place",to:{player:"self",zone:"deck",position}}}}))}},{kind:"draw",player:"self",count:1}]}}],["OP17-106",{effect:{kind:"if",condition:{kind:"turn-player",player:"self"},then:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:2},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:2},{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"op17-smoothie-life",count:1,effect:{kind:"move",binding:"op17-smoothie-life",to:{player:"self",zone:"life",position:"top"}}},{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op17-smoothie-discard",min:1,max:1,chooser:"opponent",effect:{kind:"move",binding:"op17-smoothie-discard",to:{player:"opponent",zone:"trash"}}}]}}}}}],["OP17-003",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Edward.Newgate"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true},bind:"op17-izo-target",min:0,max:1,effect:{kind:"modify-power",binding:"op17-izo-target",amount:-6e3,expiresAfterTurns:0}},else:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Land of Wano"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true},bind:"op17-izo-target",min:0,max:1,effect:{kind:"modify-power",binding:"op17-izo-target",amount:-6e3,expiresAfterTurns:0}}}}}],["OP17-005",{effect:{kind:"if",condition:{kind:"leader-multicolored",player:"self"},then:{kind:"sequence",effects:[]},else:{kind:"set-leader-base-power",player:"self",value:8e3,expiresAfterTurns:1}}}],["OP17-013",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Edward.Newgate"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true},bind:"op17-ace-target",min:0,max:1,effect:{kind:"modify-power",binding:"op17-ace-target",amount:-6e3,expiresAfterTurns:0}}}}],["OP17-007",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Edward.Newgate"},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",anyOf:[{type:"Land of Wano"},{typeIncluding:"Whitebeard Pirates"}],maxPower:6e3},bind:"op17-oden-play",min:0,max:1,effect:{kind:"play",binding:"op17-oden-play"}},else:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Land of Wano"},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",anyOf:[{type:"Land of Wano"},{typeIncluding:"Whitebeard Pirates"}],maxPower:6e3},bind:"op17-oden-play",min:0,max:1,effect:{kind:"play",binding:"op17-oden-play"}}}}}],["OP17-043",{effect:{kind:"set-leader-base-power",player:"self",value:6e3,expiresAfterTurns:1}}],["OP17-008",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Edward.Newgate"},then:{kind:"set-leader-base-power",player:"self",value:8e3,expiresAfterTurns:1}}}],["OP17-027",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Red-Haired Pirates"},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board"},bind:"op17-beckman-rest",min:0,max:2,effect:{kind:"rest",binding:"op17-beckman-rest"}}]}}}],["OP17-029",{effect:{kind:"sequence",effects:[{kind:"activate-don",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"op17-hongo-rest",min:0,max:2,effect:{kind:"rest",binding:"op17-hongo-rest"}}]}}],["OP17-032",lookAndAdd(3,"op17-032-look",{typeIncluding:"Red-Haired Pirates"})],["OP17-033",lookAndAdd(3,"op17-033-look",{typeIncluding:"Red-Haired Pirates"})],["OP17-040",{effect:{kind:"draw",player:"self",count:1}}],["OP17-041",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-wangzhi-cost",min:1,max:1,effect:{kind:"move",binding:"op17-wangzhi-cost",to:{player:"self",zone:"trash"}}},{kind:"select",selector:{player:"opponent",zone:"board",category:"character",minBaseCost:1,maxBaseCost:1},bind:"op17-wangzhi-bottom",count:"all",effect:{kind:"order-to-bottom",binding:"op17-wangzhi-bottom",byOwner:true,to:{player:"opponent",zone:"deck",position:"bottom"}}}]}}}],["OP17-042",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand",typeIncluding:"Rocks Pirates"},bind:"op17-kaido-reveal",min:3,max:3,effect:{kind:"choose",selector:{player:"opponent",zone:"board"},bind:"op17-kaido-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op17-kaido-debuff",amount:-3e3,expiresAfterTurns:0}}}}}],["OP17-059",{effect:donMinus(1,{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"op17-aramaki-ko",min:0,max:2,effect:{kind:"knock-out",binding:"op17-aramaki-ko"}}]})}],["OP17-065",{effect:donMinus(1,{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"op17-queen-prevent",min:0,max:2,effect:{kind:"restrict",binding:"op17-queen-prevent",restriction:"cannot-attack",expiresAfterTurns:1}}]})}],["OP17-073",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-hawkins-cost",min:1,max:1,effect:{kind:"move",binding:"op17-hawkins-cost",to:{player:"self",zone:"trash"}}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},then:{kind:"add-don",player:"self",count:1,rested:false}}]}}}],["OP17-054",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:6},bind:"op17-stussy-onplay-target",min:0,max:1,effect:{kind:"restrict",binding:"op17-stussy-onplay-target",restriction:"cannot-attack",expiresAfterTurns:1}}}],["OP17-060",{effect:{kind:"sequence",effects:[{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},then:{kind:"add-don",player:"self",count:1,rested:false}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:3e3},bind:"op17-ulti-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op17-ulti-ko"}}]}}],["OP17-061",{effect:donMinus(1,{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Animal Kingdom Pirates"},then:{kind:"choose",selector:{player:"self",zone:"deck",position:"top"},bind:"op17-lead-performers-life",min:0,max:1,effect:{kind:"move",binding:"op17-lead-performers-life",to:{player:"self",zone:"life",position:"top"}}}})}],["OP17-074",{effect:{kind:"add-don",player:"self",count:1,rested:true}}],["OP17-081",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-gerd-cost",min:1,max:1,effect:{kind:"move",binding:"op17-gerd-cost",to:{player:"self",zone:"trash"}}},{kind:"choose",selector:{player:"self",zone:"trash",category:"character",maxCost:8,excludeName:"Gerd"},bind:"op17-gerd-recur",min:0,max:1,effect:{kind:"move",binding:"op17-gerd-recur",to:{player:"self",zone:"hand"}}}]}}}],["OP17-087",{effect:{kind:"if",condition:elbaphGiantOut,then:{kind:"choose",selector:{player:"opponent",zone:"board"},bind:"op17-robin-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op17-robin-debuff",amount:-3e3,expiresAfterTurns:0}}}}],["OP17-103",{effect:{kind:"if",condition:{kind:"turn-player",player:"self"},then:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Big Mom Pirates"},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"deck",position:"top"},bind:"op17-katakuri-life",min:0,max:1,effect:{kind:"move",binding:"op17-katakuri-life",to:{player:"self",zone:"life",position:"top"}}},{kind:"choose",selector:{player:"opponent",zone:"board"},bind:"op17-katakuri-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"op17-katakuri-debuff",amount:-3e3,expiresAfterTurns:0}}]}}}}],["OP17-104",{effect:{kind:"if",condition:{kind:"turn-player",player:"self"},then:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:2},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:2},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Big Mom Pirates"},then:{kind:"choose",selector:{player:"self",zone:"deck",position:"top"},bind:"op17-cracker-life",min:0,max:1,effect:{kind:"move",binding:"op17-cracker-life",to:{player:"self",zone:"life",position:"top"}}}}]}}}}}],["OP17-109",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",hasTrigger:true},bind:"op17-pudding-cost",min:1,max:1,effect:{kind:"move",binding:"op17-pudding-cost",to:{player:"self",zone:"trash"}}},{kind:"draw",player:"self",count:3}]}}}],["OP17-110",{effect:{kind:"if",condition:{kind:"turn-player",player:"self"},then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Big Mom Pirates",maxBaseCost:6},bind:"op17-perospero-play",min:0,max:1,effect:{kind:"play",binding:"op17-perospero-play"}},{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}]}}}],["OP17-111",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand",hasTrigger:true},bind:"op17-montdor-reveal",min:2,max:2,effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1},bind:"op17-montdor-ko",min:0,max:2,effect:{kind:"knock-out",binding:"op17-montdor-ko"}}}}}],["OP17-114",{effect:{kind:"if",condition:{kind:"turn-player",player:"self"},then:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:2},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:2},{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"deck",position:"top"},bind:"op17-sweet3-life",min:0,max:1,effect:{kind:"move",binding:"op17-sweet3-life",to:{player:"self",zone:"life",position:"top"}}},{kind:"choose",selector:{player:"opponent",zone:"board"},bind:"op17-sweet3-debuff",min:0,max:2,effect:{kind:"modify-power",binding:"op17-sweet3-debuff",amount:-3e3,expiresAfterTurns:0}}]}}}}}],["OP17-118",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Rocks Pirates"},bind:"op17-xebec-play",min:0,max:2,maxTotalCost:9,distinctNames:true,effect:{kind:"play",binding:"op17-xebec-play"}}]}}],["OP17-119",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op17-loki-ko",min:0,max:5,maxTotalCost:4,effect:{kind:"knock-out",binding:"op17-loki-ko"}}}],["OP17-112",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choice",branches:[{id:"life",label:"Add a card from the top of your deck to the top of your Life cards",effect:{kind:"choose",selector:{player:"self",zone:"deck",position:"top"},bind:"op17-linlin-life",min:0,max:1,effect:{kind:"move",binding:"op17-linlin-life",to:{player:"self",zone:"life",position:"top"}}}},{id:"steal",label:"Add a card from the top of your opponent's Life cards to their hand",effect:{kind:"choose",selector:{player:"opponent",zone:"life",position:"top"},bind:"op17-linlin-steal",min:0,max:1,effect:{kind:"move",binding:"op17-linlin-steal",to:{player:"opponent",zone:"hand"}}}}]}]}}]]};var op17TriggerMechanics={onKo:[["OP10-005",{effect:{kind:"draw",player:"self",count:1}}],["OP17-053",{effect:{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"hand"},operator:"gte",value:2},then:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op17-barbell-bury",min:2,max:2,chooser:"opponent",effect:{kind:"move",binding:"op17-barbell-bury",to:{player:"opponent",zone:"deck",position:"bottom"}}},else:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op17-barbell-bury",min:0,max:1,exhaustive:true,chooser:"opponent",effect:{kind:"move",binding:"op17-barbell-bury",to:{player:"opponent",zone:"deck",position:"bottom"}}}}}],["OP17-012",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",typeIncluding:"Whitebeard Pirates",minCost:1,maxCost:1},bind:"op17-blenheim-play",min:0,max:1,effect:{kind:"play",binding:"op17-blenheim-play"}}}],["OP17-102",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",maxPower:4e3,excludeName:"Charlotte Oven"},bind:"op17-oven-free-play",min:0,max:1,effect:{kind:"play",binding:"op17-oven-free-play"}}}],["OP17-015",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand",typeIncluding:"Whitebeard Pirates"},bind:"op17-marco-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op17-marco-cost",to:{player:"self",zone:"trash"}},{kind:"play",binding:SOURCE_BINDING}]}}}}],["OP17-025",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:6},bind:"op17-building-snake-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op17-building-snake-ko"}}}],["OP17-026",{effect:{kind:"draw",player:"self",count:1}}]],onEndOfYourTurn:[["OP17-047",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:2},then:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op17-shiki-bury",min:1,max:1,chooser:"opponent",effect:{kind:"move",binding:"op17-shiki-bury",to:{player:"opponent",zone:"deck",position:"bottom"}}}}}],["OP17-031",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",typeIncluding:"Red-Haired Pirates",rested:true},bind:"op17-yasopp-activate",min:0,max:1,effect:{kind:"update",binding:"op17-yasopp-activate",rested:false}}}]],trigger:[["OP17-076",{effect:donMinus(1,{kind:"draw",player:"self",count:2})}],["OP17-102",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP17-107",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP17-101",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op17-caribou-trigger-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"op17-caribou-trigger-cost",to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"op17-caribou-trigger-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op17-caribou-trigger-ko"}}]}}}}],["OP17-071",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP17-108",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:6},bind:"op17-brulee-rest",min:0,max:1,effect:{kind:"rest",binding:"op17-brulee-rest"}}}],["OP17-106",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP17-019",{effect:{kind:"select",selector:{player:"self",zone:"board",includeLeader:true,category:"leader"},bind:"op17-019-leader",count:1,effect:{kind:"modify-power",binding:"op17-019-leader",amount:1e3,expiresAfterTurns:0}}}],["OP17-109",lookAndAdd(5,"op17-109-look",{type:"Big Mom Pirates"})],["OP17-114",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP17-096",{effect:{kind:"choose",selector:{player:"self",zone:"trash",type:"Elbaph"},bind:"op17-096-trigger-add",min:0,max:1,effect:{kind:"move",binding:"op17-096-trigger-add",to:{player:"self",zone:"hand"}}}}],["OP17-103",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP17-104",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP17-110",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP17-111",{effect:{kind:"play",binding:SOURCE_BINDING}}],["OP17-117",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:3},then:{kind:"choice",chooser:"opponent",branches:[{id:"trash",label:"Trash 3 from hand",effect:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op17-maser-saber-trash",min:3,max:3,chooser:"opponent",effect:{kind:"move",binding:"op17-maser-saber-trash",to:{player:"opponent",zone:"trash"}}}},{id:"decline",label:"Do not trash",effect:maserSaberKo}]},else:maserSaberKo}}]]};var op17ReplacementMechanics={replacement:[["OP17-015",{opponentEffectOnly:true,removal:"off-field",oncePerTurn:false,protects:{category:"character"},label:"K.O. Marco",cost:{kind:"ko-self"}}],["OP17-021",{opponentEffectOnly:true,removal:"off-field",oncePerTurn:false,protects:{category:"character",typeIncluding:"Red-Haired Pirates"},label:"Rest 1 of your cards",cost:{kind:"rest-own-cards",count:1}}],["OP17-023",{opponentEffectOnly:false,oncePerTurn:false,protects:{category:"character",anyOf:[{type:"East Blue"},{type:"Straw Hat Crew"}]},label:"Rest Nami",cost:{kind:"rest-self"}}],["OP17-043",{opponentEffectOnly:false,removal:"off-field",oncePerTurn:false,label:"Trash 2 from hand",cost:{kind:"trash-from-hand",count:2}}],["OP17-095",{opponentEffectOnly:true,removal:"off-field",oncePerTurn:false,protects:{category:"character"},label:"Bottom-deck 3 from trash",cost:{kind:"bury-from-trash",count:3}}]]};var CLAUSES=["eventMain","counterEvent","onOpponentAttack","leaderWatcher","whenAttacking","whenRested","activateMain","onPlay","onBlock","onKo","onEndOfYourTurn","onStartOfYourTurn","trigger","replacement","damageReplacement"];function mergeSetMechanics(modules){const merged={};const sources=new Map;for(const clause of CLAUSES)merged[clause]=new Map;for(const{name,mechanics}of modules){for(const clause of CLAUSES){for(const[cardNumber,program]of mechanics[clause]??[]){const key=`${clause}:${cardNumber}`;const existing=sources.get(key);if(existing!==void 0){throw new Error(`duplicate mechanic registration: ${cardNumber} ${clause} is registered in both ${existing} and ${name}`)}sources.set(key,name);merged[clause].set(cardNumber,program)}}}return merged}var REACTION_RULES=[];function registerReactionRules(rules){REACTION_RULES=rules}var koalaLifeToHand={kind:"select",selector:{player:"opponent",zone:"life",position:"top"},bind:"op12-koala-life",count:1,effect:{kind:"move",binding:"op12-koala-life",to:{player:"owner",zone:"hand"}}};var camieTrashBothLives={kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"gte",value:2},then:{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:"life",position:"top"},bind:"op11-camie-own",count:1,effect:{kind:"move",binding:"op11-camie-own",to:{player:"owner",zone:"trash"}}},{kind:"select",selector:{player:"opponent",zone:"life",position:"top"},bind:"op11-camie-theirs",count:1,effect:{kind:"move",binding:"op11-camie-theirs",to:{player:"owner",zone:"trash"}}}]}};var bonneyDrawTwoTrashOne={kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op08-bonney-trash",min:1,max:1,effect:{kind:"move",binding:"op08-bonney-trash",to:{player:"self",zone:"trash"}}}]};var drawOneTrashOne={kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op07-bartolomeo-trash",min:1,max:1,effect:{kind:"move",binding:"op07-bartolomeo-trash",to:{player:"self",zone:"trash"}}}]};var zeffMill={kind:"if",condition:{kind:"leader-has-type",player:"self",type:"East Blue"},then:{kind:"optional",effect:{kind:"trash-top",player:"self",count:4}}};var op15LuffyReveal={kind:"optional",effect:{kind:"select",selector:{player:"self",zone:"life",position:"top"},bind:"op15-119-reveal",count:1,effect:{kind:"sequence",effects:[{kind:"reveal",binding:"op15-119-reveal"},{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:0,perCostOf:"op15-119-reveal"}]}}};var op07ReactionRules=[{cardNumber:"OP07-031",controller:"board",signal:{kind:"card-rested",restedBy:"self"},ownTurn:true,oncePerTurn:true,program:{effect:drawOneTrashOne}},{cardNumber:"OP07-038",controller:"leader",signal:{kind:"card-moved",from:"board",bySource:"self"},ownTurn:true,oncePerTurn:true,optionalActivation:true,maxHandSize:5,program:{effect:{kind:"draw",player:"self",count:1}}}];var op12ReactionRules=[{cardNumber:"OP12-040",controller:"leader",signal:{kind:"card-moved",from:"hand",to:"trash",movedOwner:"self",sourceType:"Navy"},ownTurn:false,opponentTurn:false,oncePerTurn:false,program:{effect:{kind:"draw",player:"self",count:1}}},{cardNumber:"OP12-081",controller:"leader",signal:{kind:"card-played",category:"character",playedBy:"opponent",minBaseCost:8},ownTurn:false,oncePerTurn:true,optionalActivation:true,program:{effect:koalaLifeToHand}},{cardNumber:"OP12-081",controller:"leader",signal:{kind:"card-played",category:"character",playedBy:"opponent",bySourceCategory:"character"},ownTurn:false,oncePerTurn:true,optionalActivation:true,program:{effect:koalaLifeToHand}},{cardNumber:"OP12-099",controller:"board",signal:{kind:"card-moved",from:"life"},ownTurn:true,oncePerTurn:false,program:{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"restrict-player",player:"self",restriction:"cannot-draw-by-effect",expiresAfterTurns:0}]}}},{cardNumber:"OP12-072",controller:"board",signal:{kind:"don-returned",returnedBy:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Sanji"},then:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}}}}];var op10ReactionRules=[{cardNumber:"OP10-042",controller:"leader",signal:{kind:"card-moved",from:"board",movedType:"Dressrosa",movedOwner:"self"},ownTurn:false,opponentTurn:true,oncePerTurn:true,optionalActivation:true,maxHandSize:5,program:{effect:{kind:"draw",player:"self",count:1}}},{cardNumber:"OP10-003",controller:"leader",signal:{kind:"event-activated",activatedBy:"self"},ownTurn:false,opponentTurn:true,oncePerTurn:true,program:{effect:{kind:"add-don",player:"self",count:1,rested:false}}}];var op11ReactionRules=[{cardNumber:"OP11-012",controller:"board",signal:{kind:"event-activated",activatedBy:"opponent"},ownTurn:true,oncePerTurn:true,oncePerCopy:true,program:{effect:{kind:"select",selector:{player:"self",zone:"board",category:"character"},bind:"op11-franky-buff",count:"all",effect:{kind:"modify-power",binding:"op11-franky-buff",amount:2e3,expiresAfterTurns:0}}}},{cardNumber:"OP11-102",controller:"board",signal:{kind:"event-activated",activatedBy:"opponent"},ownTurn:true,oncePerTurn:true,optionalActivation:true,program:{effect:camieTrashBothLives}},{cardNumber:"OP11-102",controller:"board",signal:{kind:"trigger-activated"},ownTurn:true,oncePerTurn:true,optionalActivation:true,program:{effect:camieTrashBothLives}},{cardNumber:"OP11-077",controller:"board",signal:{kind:"don-returned",returnedBy:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Big Mom Pirates"},bind:"op11-randolph-target",min:0,max:1,effect:{kind:"modify-cost",binding:"op11-randolph-target",amount:2,expiresAfterTurns:1}}}},{cardNumber:"OP11-041",controller:"leader",signal:{kind:"card-moved",from:"life"},ownTurn:true,oncePerTurn:true,optionalActivation:true,maxHandSize:7,program:{effect:{kind:"draw",player:"self",count:1}}}];var op13ReactionRules=[{cardNumber:"OP13-002",controller:"leader",signal:{kind:"card-moved",from:"life",movedOwner:"self"},ownTurn:false,oncePerTurn:true,leaderAttachedDon:1,program:{effect:{kind:"draw",player:"self",count:1}}},{cardNumber:"OP13-002",controller:"leader",signal:{kind:"card-moved",from:"board",to:"trash",ko:true,movedOwner:"self",movedMinPower:6e3},ownTurn:false,oncePerTurn:true,leaderAttachedDon:1,program:{effect:{kind:"draw",player:"self",count:1}}},{cardNumber:"OP13-078",controller:"stage",signal:{kind:"card-moved",from:"board",movedTypeIncluding:"Roger Pirates",movedOwner:"self",bySource:"opponent"},ownTurn:false,oncePerTurn:true,program:{effect:{kind:"add-don",player:"self",count:1,rested:true}}},{cardNumber:"OP13-100",controller:"leader",signal:{kind:"card-played",category:"character",playedBy:"self",hasTrigger:true},ownTurn:true,oncePerTurn:true,optionalActivation:true,program:{effect:{kind:"give-rested-don",player:"self",count:2}}},{cardNumber:"OP13-106",controller:"board",signal:{kind:"trigger-activated"},ownTurn:false,opponentTurn:true,oncePerTurn:false,program:{effect:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Blocker",expiresAfterTurns:0}}}];var op16ReactionRules=[{cardNumber:"OP16-041",controller:"leader",signal:{kind:"card-moved",from:"board",movedType:"Impel Down",movedOwner:"self"},ownTurn:false,oncePerTurn:true,optionalActivation:true,leaderAttachedDon:1,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",name:"Prisoner of Impel Down"},bind:"op16-buggy-prisoner",min:1,max:1,effect:{kind:"play",binding:"op16-buggy-prisoner"}}}}}];var op14ReactionRules=[{cardNumber:"OP14-041",controller:"leader",signal:{kind:"card-played",category:"character",playedBy:"self"},ownTurn:false,opponentTurn:true,oncePerTurn:false,program:{effect:{kind:"draw",player:"self",count:1}}},{cardNumber:"OP14-041",controller:"leader",signal:{kind:"card-moved",from:"board",to:"trash",ko:true,movedOwner:"self",movedAnyOfTypes:["Amazon Lily","Kuja Pirates"],movedMinPower:5e3},ownTurn:false,oncePerTurn:true,leaderAttachedDon:1,program:{effect:{kind:"select",selector:{player:"opponent",zone:"life",position:"top"},bind:"op14-hancock-life",count:"all",effect:{kind:"move",binding:"op14-hancock-life",to:{player:"opponent",zone:"hand"}}}}}];var eb05ReactionRules=[{cardNumber:"EB05-010",controller:"leader",signal:{kind:"card-moved",from:"board",to:"trash",ko:true,movedOwner:"self",movedAttribute:"Wisdom",movedLacksKeyword:"Blocker"},ownTurn:false,oncePerTurn:true,program:{effect:deckTopToLife3("eb05-010-life")}}];var eb04ReactionRules=[{cardNumber:"EB04-035",controller:"board",signal:{kind:"don-returned",returnedBy:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Kid Pirates"},then:{kind:"add-don",player:"self",count:1,rested:true}}}},{cardNumber:"EB04-044",controller:"board",signal:{kind:"card-moved",from:"board",to:"trash",ko:true,movedOwner:"opponent"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"draw",player:"self",count:1}}}];var op09ReactionRules=[{cardNumber:"OP09-061",controller:"leader",signal:{kind:"don-returned",returnedBy:"self",minCount:2},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"sequence",effects:[{kind:"add-don",player:"self",count:1,rested:false},{kind:"add-don",player:"self",count:1,rested:true}]}}},{cardNumber:"OP09-074",controller:"board",signal:{kind:"don-returned",returnedBy:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"op09-bepo-buff",min:0,max:1,effect:{kind:"modify-power",binding:"op09-bepo-buff",amount:1e3,expiresAfterTurns:0}}}},{cardNumber:"OP09-080",controller:"stage",signal:{kind:"card-moved",from:"board",movedType:"Straw Hat Crew",movedOwner:"self"},ownTurn:false,opponentTurn:true,oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"stage",rested:false},operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"add-don",player:"self",count:1,rested:true}]}}}}}];var eb03ReactionRules=[{cardNumber:"EB03-033",controller:"board",signal:{kind:"don-returned",returnedBy:"self"},ownTurn:false,opponentTurn:true,oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Big Mom Pirates"},then:{kind:"add-don",player:"self",count:1,rested:true}}}}];var op08ReactionRules=[{cardNumber:"OP08-046",controller:"board",signal:{kind:"card-moved",from:"board",bySource:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:5},then:{kind:"sequence",effects:[{kind:"choose",chooser:"opponent",selector:{player:"opponent",zone:"hand"},bind:"op08-shakuyaku-bury",min:1,max:1,effect:{kind:"move",binding:"op08-shakuyaku-bury",to:{player:"owner",zone:"deck",position:"bottom"}}},{kind:"rest",binding:SOURCE_BINDING}]}}}},{cardNumber:"OP08-056",controller:"stage",signal:{kind:"card-moved",from:"board",movedTypeIncluding:"Whitebeard Pirates",movedOwner:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op08-moby-back",min:1,max:1,effect:{kind:"order-to-bottom",binding:"op08-moby-back",to:{player:"self",zone:"deck",position:"top"},alternate:{player:"self",zone:"deck",position:"bottom"}}}]}}},{cardNumber:"OP08-067",controller:"board",signal:{kind:"don-returned",returnedBy:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"add-don",player:"self",count:1,rested:true}}},{cardNumber:"OP08-105",controller:"board",signal:{kind:"card-moved",from:"life",movedOwner:"opponent"},ownTurn:true,oncePerTurn:true,sourceAttachedDon:1,program:{effect:bonneyDrawTwoTrashOne}}];var op06ReactionRules=[{cardNumber:"OP06-042",controller:"leader",signal:{kind:"don-returned",returnedBy:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"draw",player:"self",count:1}}},{cardNumber:"OP06-076",controller:"board",signal:{kind:"don-returned",returnedBy:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2},bind:"op06-kamazo",min:0,max:1,effect:{kind:"knock-out",binding:"op06-kamazo"}}}},{cardNumber:"OP06-044",controller:"board",signal:{kind:"event-activated",activatedBy:"opponent"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"op06-gion",chooser:"opponent",min:1,max:1,effect:{kind:"order-to-bottom",binding:"op06-gion",to:{player:"owner",zone:"deck",position:"bottom"}}}}},{cardNumber:"OP06-048",controller:"board",signal:{kind:"blocker-activated",activatedBy:"opponent"},ownTurn:true,oncePerTurn:false,program:{effect:zeffMill}},{cardNumber:"OP06-048",controller:"board",signal:{kind:"event-activated",activatedBy:"opponent"},ownTurn:true,oncePerTurn:false,program:{effect:zeffMill}}];var op15ReactionRules=[{cardNumber:"OP15-119",controller:"board",signal:{kind:"blocker-activated",activatedBy:"opponent"},ownTurn:false,oncePerTurn:false,program:{effect:op15LuffyReveal}},{cardNumber:"OP15-119",controller:"board",signal:{kind:"event-activated",activatedBy:"opponent"},ownTurn:false,oncePerTurn:false,program:{effect:op15LuffyReveal}}];var op05ReactionRules=[{cardNumber:"OP05-053",controller:"board",signal:{kind:"card-drawn",drawnBy:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:0}}},{cardNumber:"OP05-074",controller:"board",signal:{kind:"don-returned",returnedBy:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"add-don",player:"self",count:1,rested:false}}},{cardNumber:"OP05-098",controller:"leader",signal:{kind:"card-moved",from:"life",movedOwner:"self"},ownTurn:false,opponentTurn:true,oncePerTurn:true,condition:{kind:"zone-count",player:"self",zone:"life",operator:"eq",value:0},program:{effect:{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"op05-enel-leader-life",count:1,effect:{kind:"move",binding:"op05-enel-leader-life",to:{player:"self",zone:"life",position:"top"}}},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op05-enel-leader-trash",min:1,max:1,effect:{kind:"move",binding:"op05-enel-leader-trash",to:{player:"self",zone:"trash"}}}]}}},{cardNumber:"OP05-107",controller:"board",signal:{kind:"card-moved",from:"life",to:"hand",movedOwner:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:0}}},{cardNumber:"OP05-109",controller:"board",signal:{kind:"trigger-activated"},ownTurn:false,oncePerTurn:true,program:{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op05-pagaya-trash",min:2,max:2,effect:{kind:"move",binding:"op05-pagaya-trash",to:{player:"self",zone:"trash"}}}]}}}];var eb02ReactionRules=[{cardNumber:"EB02-023",controller:"board",signal:{kind:"card-moved",from:"board",to:"hand",movedOwner:"opponent",bySource:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:3,bind:"eb02-023-look"},{kind:"select",selector:{player:"self",zone:"deck",binding:"eb02-023-look"},bind:"eb02-023-place",count:"all",effect:{kind:"order-to-bottom",binding:"eb02-023-place",to:{player:"self",zone:"deck",position:"bottom"},alternate:{player:"self",zone:"deck",position:"top"}}}]}}},{cardNumber:"EB02-035",controller:"board",signal:{kind:"don-returned",returnedBy:"self",minCount:2},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"add-don",player:"self",count:1,rested:false}}}];var eb01ReactionRules=[{cardNumber:"EB01-047",controller:"board",signal:{kind:"card-moved",from:"board",to:"trash",ko:true},ownTurn:false,oncePerTurn:true,answersOwnExit:true,program:{effect:drawOneTrashOne}}];var promoReactionRules=[{cardNumber:"P-117",controller:"leader",signal:{kind:"card-moved",from:"life",to:"hand",movedOwner:"opponent",byLeaderAttack:true},ownTurn:true,oncePerTurn:false,leaderAttachedDon:1,program:{effect:{kind:"optional",effect:{kind:"trash-top",player:"self",count:1}}}},{cardNumber:"P-077",controller:"board",signal:{kind:"don-returned",returnedBy:"self",minCount:2},ownTurn:false,oncePerTurn:true,program:{effect:{kind:"sequence",effects:[{kind:"add-don",player:"self",count:1,rested:true},{kind:"choose",selector:{player:"self",zone:"stage",color:"Purple",rested:true},bind:"p077-stage",min:0,max:1,effect:{kind:"update",binding:"p077-stage",rested:false}}]}}}];var st10ReactionRules=[{cardNumber:"ST10-006",controller:"board",signal:{kind:"blocker-activated",activatedBy:"opponent"},ownTurn:false,oncePerTurn:true,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:8e3},bind:"st10-luffy-ko",min:0,max:1,effect:{kind:"knock-out",binding:"st10-luffy-ko"}}}},{cardNumber:"ST10-007",controller:"board",signal:{kind:"don-returned",returnedBy:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true,maxCost:3},bind:"st10-killer-ko",min:0,max:1,effect:{kind:"knock-out",binding:"st10-killer-ko"}}}},{cardNumber:"ST10-011",controller:"board",signal:{kind:"don-returned",returnedBy:"self"},ownTurn:true,oncePerTurn:true,program:{effect:{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:1}}},{cardNumber:"ST10-014",controller:"board",signal:{kind:"don-returned",returnedBy:"self"},ownTurn:false,oncePerTurn:true,program:{effect:drawOneTrashOne}}];function totalGivenDon(state,playerId){const player=state.players[playerId];return player.leaderAttachedDon.length+player.board.reduce((total,card)=>total+(card.attachedDon?.length??0),0)}var attachedDon=context=>context.isLeader?context.state.players[context.playerId].leaderAttachedDon.length:context.card.attachedDon?.length??0;var leaderHasType=(context,type)=>hasCardType(context.state.players[context.playerId].leaderCardNumber,type);var currentLeaderPower=context=>{const player=context.state.players[context.playerId];const override=storedBasePower(player.leaderBasePowers,context.state.turn);const base=override??context.db.require(player.leaderCardNumber).power??0;const modifiers=player.leaderPowerModifiers.filter(modifier=>modifier.expiresAtTurn>=context.state.turn).reduce((total,modifier)=>total+modifier.amount,0);return base+modifiers+player.leaderAttachedDon.length*1e3};var opposingLeaderPower=context=>leaderPowerWithLayers(context,opponentOf(context.playerId));var ownLeaderPower=context=>leaderPowerWithLayers(context,context.playerId);function leaderPowerWithLayers(context,leaderPlayerId){const leaderPlayer=context.state.players[leaderPlayerId];const override=storedBasePower(leaderPlayer.leaderBasePowers,context.state.turn);const printed=override??context.db.require(leaderPlayer.leaderCardNumber).power??0;const modifiers=leaderPlayer.leaderPowerModifiers.filter(modifier=>modifier.expiresAtTurn>=context.state.turn).reduce((total,modifier)=>total+modifier.amount,0);const don=context.state.turnPlayerId===leaderPlayerId?leaderPlayer.leaderAttachedDon.length*1e3:0;return staticPower(context.state,leaderPlayerId,{instanceId:`${leaderPlayerId}-leader`,cardNumber:leaderPlayer.leaderCardNumber},true,printed,context.db,override!==void 0)+modifiers+don}var isNamedOrSelf=(context,name,self)=>hasCardName(context.card.cardNumber,name)||context.card.cardNumber===self;var always=()=>true;var leaderMulticolored=context=>(context.db.require(context.state.players[context.playerId].leaderCardNumber).colors??[]).length>1;var turnPlayer=context=>context.state.turnPlayerId;var fieldDon=context=>fieldDonCount(context.state,context.playerId);var restedCharacters2=context=>context.state.players[context.playerId].board.filter(card=>card.rested&&context.db.require(card.cardNumber).category==="character").length;var trashAtLeastCount=(context,count2)=>context.state.players[context.playerId].trash.length>=count2;var lowLife=(context,ceiling)=>context.state.players[context.playerId].life.length<=ceiling;var twoBaseCostFiveCharacters=context=>context.state.players[context.playerId].board.filter(card=>(context.db.require(card.cardNumber).cost??0)>=5).length>=2;var robinLeader=context=>{const leader=context.state.players[context.playerId].leaderCardNumber;return hasCardName(leader,"Koala")||hasCardName(leader,"Monkey.D.Luffy")};var shirahoshiCount=context=>context.state.players[context.playerId].board.filter(card=>hasCardName(card.cardNumber,"Shirahoshi")&&context.db.require(card.cardNumber).cost===2).length;var anyCharacterWithCost=(context,minimum)=>["p1","p2"].some(playerId=>context.state.players[playerId].board.some(card=>costOf(context.state,playerId,card,context.db)>=minimum));var ownCharacterWithCost=(context,minimum)=>context.state.players[context.playerId].board.some(card=>costOf(context.state,context.playerId,card,context.db)>=minimum);var restedCardCount=context=>{const player=context.state.players[context.playerId];return(player.leaderRested?1:0)+player.board.filter(card=>card.rested).length+(player.stage?.rested?1:0)+player.restedDon.length};var anyCharacterAtZeroCost=context=>["p1","p2"].some(playerId=>context.state.players[playerId].board.some(card=>costOf(context.state,playerId,card,context.db)<=0));var handTrashedThisTurn=context=>context.state.handTrashedByEffectOnTurn?.[context.playerId]===context.state.turn;var trashHasName=(context,name)=>context.state.players[context.playerId].trash.some(card=>hasCardName(card.cardNumber,name));var hawkArmed=context=>!context.isLeader&&attachedDon(context)>=1&&context.state.players[context.playerId].life.length<context.state.players[opponentOf(context.playerId)].life.length;var fullBaroqueTrash=context=>context.state.players[context.playerId].trash.length>=7;var ELBAPH_COST=12;var lucciSteps=context=>hasCardTypeIncluding(context.state.players[context.playerId].leaderCardNumber,"CP")?Math.floor(context.state.players[context.playerId].trash.length/5):0;var trashEventCountOf=context=>trashEventCount(context.state,context.playerId,context.db);function fieldHasName(context,name){const player=context.state.players[context.playerId];return hasCardName(player.leaderCardNumber,name)||player.board.some(card=>hasCardName(card.cardNumber,name))||player.stage!==null&&hasCardName(player.stage.cardNumber,name)}function opponentCharacters(context){return context.state.players[opponentOf(context.playerId)].board.filter(card=>context.db.require(card.cardNumber).category==="character").length}function celestialDragonsCourt(context){if(context.isLeader)return false;if(context.db.require(context.card.cardNumber).category!=="character"){return false}const sourceId=opponentOf(context.playerId);if(turnPlayer(context)!==sourceId)return false;const board=context.state.players[sourceId].board;return board.length>0&&board.every(card=>hasCardType(card.cardNumber,"Celestial Dragons"))}function buggyCostBandBan(context,buggyOwner){if(context.isLeader)return false;if(context.db.require(context.card.cardNumber).category!=="character"){return false}if(!hasCardName(context.state.players[buggyOwner].leaderCardNumber,"Buggy")){return false}const cost=costOf(context.state,context.playerId,context.card,context.db);return cost===3||cost===4}function birdcageHolds(context,stageOwner){if(context.isLeader)return false;if(context.db.require(context.card.cardNumber).category!=="character"){return false}if(!hasCardName(context.state.players[stageOwner].leaderCardNumber,"Donquixote Doflamingo")){return false}return costOf(context.state,context.playerId,context.card,context.db)<=5}function saboAura(context){const player=context.state.players[context.playerId];return player.leaderCardNumber==="OP13-004"&&!leaderEffectsNegated(context.state,context.playerId)&&player.leaderAttachedDon.length>=1&&player.board.some(card=>baseEffectiveCost(context.state,context.playerId,card,context.db)>=8)}var op14StaticAbilities=[{cardNumber:"OP14-004",scope:"self",keyword:{keyword:"Rush",when:context=>!context.isLeader&&boardCardPower(context.state,context.playerId,context.card,true,context.db)>=5e3}},{cardNumber:"OP14-011",scope:"self",keyword:{keyword:"Blocker",when:context=>attachedDon(context)>=2}},{cardNumber:"OP14-020",scope:"self",power:{kind:"add",value:context=>context.isLeader&&cardAttributes(context.db.require(context.state.players[opponentOf(context.playerId)].leaderCardNumber)).includes("Slash")?1e3:0}},{cardNumber:"OP14-026",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId&&"rested"in context.card&&context.card.rested?2e3:0}},{cardNumber:"OP14-027",scope:"opponent-board-aura",power:{kind:"add",value:context=>!context.isLeader&&turnPlayer(context)===context.playerId&&context.state.players[opponentOf(context.playerId)].board.some(card=>card.cardNumber==="OP14-027"&&card.rested)?-1e3:0}},{cardNumber:"OP14-034",scope:"board-aura",power:{kind:"add",value:context=>{if(context.isLeader)return 0;if(turnPlayer(context)!==context.playerId)return 0;const definition=context.db.require(context.card.cardNumber);return definition.colors?.includes("Green")&&definition.types.includes("Straw Hat Crew")&&(definition.cost??0)>=4?1e3:0}}},{cardNumber:"OP14-045",scope:"self",keyword:{keyword:"Rush",when:handTrashedThisTurn}},{cardNumber:"OP14-049",scope:"self",keyword:{keyword:"Rush",when:handTrashedThisTurn}},{cardNumber:"OP14-053",scope:"self",power:{kind:"set-base",value:context=>{if(context.isLeader)return void 0;if(turnPlayer(context)===context.playerId)return void 0;const player=context.state.players[context.playerId];if(player.hand.length>7)return void 0;return storedBasePower(player.leaderBasePowers,context.state.turn)??context.db.require(player.leaderCardNumber).power??0}}},{cardNumber:"OP14-086",scope:"self",power:{kind:"add",value:context=>fullBaroqueTrash(context)?1e3:0}},{cardNumber:"OP14-086",scope:"board-aura",cost:context=>!context.isLeader&&context.state.players[context.playerId].board.some(card=>card.instanceId===context.card.instanceId)&&fullBaroqueTrash(context)&&hasCardTypeIncluding(context.card.cardNumber,"Baroque Works")?2:0},{cardNumber:"OP14-090",scope:"self",keyword:{keyword:"Rush: Character",when:context=>anyCharacterWithCost(context,8)||anyCharacterAtZeroCost(context)}},{cardNumber:"OP14-015",scope:"self",keyword:{keyword:"Rush",when:always}}];var op10StaticAbilities=[{cardNumber:"OP10-005",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)===context.playerId?3e3:0}},{cardNumber:"OP10-011",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId?2e3:0}},{cardNumber:"OP10-086",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId?2e3:0}},{cardNumber:"OP10-108",scope:"self",keyword:{keyword:"Blocker",when:context=>context.state.players[context.playerId].board.some(card=>card.instanceId!==context.card.instanceId&&!hasCardName(card.cardNumber,"Scratchmen Apoo")&&hasCardType(card.cardNumber,"Supernovas")&&(context.db.require(card.cardNumber).colors??[]).includes("Yellow"))}},{cardNumber:"OP10-053",scope:"self",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&context.state.players[context.playerId].board.some(card=>card.instanceId!==context.card.instanceId&&!hasCardName(card.cardNumber,"Bian")&&hasCardType(card.cardNumber,"The Tontattas"))}},{cardNumber:"OP10-085",scope:"self",keyword:{keyword:"Rush",when:context=>!context.isLeader&&attachedDon(context)>=1&&context.state.players[context.playerId].trash.length>=8}},{cardNumber:"OP10-104",scope:"self",battleKoImmune:context=>!context.isLeader&&attachedDon(context)>=1&&leaderHasType(context,"Supernovas")&&context.state.players[opponentOf(context.playerId)].life.length>=3},{cardNumber:"OP10-001",scope:"controller-aura",power:{kind:"add",value:context=>!context.isLeader&&turnPlayer(context)!==context.playerId&&(hasCardType(context.card.cardNumber,"Navy")||hasCardType(context.card.cardNumber,"Punk Hazard"))?1e3:0}},{cardNumber:"OP10-038",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId&&restedCharacters2(context)>=2?2e3:0}},{cardNumber:"OP10-042",scope:"controller-aura",cost:context=>{if(context.isLeader)return 0;const onBoard=context.state.players[context.playerId].board.find(card=>card.instanceId===context.card.instanceId);if(!onBoard||!hasCardType(context.card.cardNumber,"Dressrosa")){return 0}const printed=context.db.require(context.card.cardNumber).cost??0;const others=include=>staticCostDeltaWhere(context.state,context.playerId,context.card,context.db,ability=>ability.cardNumber!=="OP10-042"&&include(ability));const first=others(ability=>ability.scope==="opponent-aura"||ability.scope==="opponent-board-aura");if(printed+first<2)return 0;const temporary=(onBoard.costModifiers??[]).filter(modifier=>modifier.expiresAtTurn>=context.state.turn).reduce((total,modifier)=>total+modifier.amount,0);return printed+others(()=>true)+temporary+1>=2?1:0}},{cardNumber:"OP10-113",scope:"self",keyword:{keyword:"Rush",when:context=>context.state.players[context.playerId].life.length<context.state.players[opponentOf(context.playerId)].life.length}},{cardNumber:"OP10-094",scope:"self",keyword:{keyword:"Double Attack",when:context=>attachedDon(context)>=1}}];var op10RemovalImmunities=[{cardNumber:"OP10-082",from:"opponent"}];var onlyGermaCharacters=(state,playerId,db)=>state.players[playerId].board.filter(card=>db.require(card.cardNumber).category==="character").every(card=>hasCardTypeIncluding(card.cardNumber,"GERMA"));var handSize=context=>context.state.players[context.playerId].hand.length;var op11StaticAbilities=[{cardNumber:"OP11-023",scope:"self",costZone:"hand",cost:context=>leaderHasType(context,"Fish-Man")&&context.state.players[context.playerId].life.length<=3&&restedCardCount({...context,playerId:context.playerId==="p1"?"p2":"p1"})>=5?-3:0},{cardNumber:"OP11-001",scope:"controller-aura",keyword:{keyword:"Rush: Character",when:context=>!context.isLeader&&hasCardType(context.card.cardNumber,"SWORD")}},{cardNumber:"OP11-096",scope:"self",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&context.state.players[context.playerId].board.some(card=>{if(hasCardName(card.cardNumber,"Ripper"))return false;const record=context.db.require(card.cardNumber);return record.category==="character"&&(record.colors??[]).includes("Black")&&hasCardType(card.cardNumber,"Navy")})}},{cardNumber:"OP11-073",scope:"self",keyword:{keyword:"Rush",when:context=>leaderHasType(context,"Big Mom Pirates")}},{cardNumber:"OP11-112",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId&&hasCardName(context.state.players[context.playerId].leaderCardNumber,"Shirahoshi")?4e3:0}},{cardNumber:"OP11-027",scope:"self",keyword:{keyword:"Rush: Character",when:context=>hasCardName(context.state.players[context.playerId].leaderCardNumber,"Shirahoshi")}},{cardNumber:"OP11-046",scope:"self",restImmune:context=>onlyGermaCharacters(context.state,context.playerId,context.db)},{cardNumber:"OP11-057",scope:"self",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&handSize(context)<=4}},{cardNumber:"OP11-058",scope:"self",attackBlocked:context=>handSize(context)>=5},{cardNumber:"OP11-065",scope:"self",keyword:{keyword:"Blocker",when:context=>context.state.players[context.playerId].board.some(candidate=>{if(candidate.instanceId===context.card.instanceId)return false;const definition=context.db.require(candidate.cardNumber);return definition.colors?.includes("Purple")===true&&definition.types.includes("Big Mom Pirates")})}}];var op11RemovalImmunities=[{cardNumber:"OP11-005",from:"any",koOnly:true,bySource:source=>source.category==="character"&&!cardAttributes(source).includes("Special"),when:(_state,_ownerId,card)=>(card.attachedDon?.length??0)>=1},{cardNumber:"OP11-046",from:"opponent",koOnly:true,when:(state,ownerId)=>onlyGermaCharacters(state,ownerId,cards)}];var op17StaticAbilities=[{cardNumber:"OP17-002",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId?3e3:0}},{cardNumber:"OP17-009",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId?3e3:0}},{cardNumber:"OP17-082",scope:"self",power:{kind:"add",value:context=>anyCharacterWithCost(context,ELBAPH_COST)?3e3:0}},{cardNumber:"OP17-090",scope:"self",power:{kind:"add",value:context=>anyCharacterWithCost(context,ELBAPH_COST)?3e3:0}},{cardNumber:"OP17-095",scope:"self",power:{kind:"add",value:context=>anyCharacterWithCost(context,ELBAPH_COST)?3e3:0}},{cardNumber:"OP17-091",scope:"self",power:{kind:"add",value:context=>anyCharacterWithCost(context,ELBAPH_COST)?3e3:0}},{cardNumber:"OP17-087",scope:"self",power:{kind:"add",value:context=>anyCharacterWithCost(context,ELBAPH_COST)?3e3:0}},{cardNumber:"OP17-083",scope:"self",power:{kind:"add",value:context=>anyCharacterWithCost(context,ELBAPH_COST)?3e3:0},keyword:{keyword:"Blocker",when:context=>anyCharacterWithCost(context,ELBAPH_COST)}},{cardNumber:"OP17-080",scope:"self",power:{kind:"add",value:context=>anyCharacterWithCost(context,ELBAPH_COST)?3e3:0}},{cardNumber:"OP17-093",scope:"self",keyword:{keyword:"Rush",when:context=>anyCharacterWithCost(context,ELBAPH_COST)}},{cardNumber:"OP17-085",scope:"self",cost:()=>12},{cardNumber:"OP17-089",scope:"self",cost:()=>12},{cardNumber:"OP17-092",scope:"self",cost:()=>12},{cardNumber:"OP17-119",scope:"self",cost:()=>12,power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId?3e3:0}},{cardNumber:"OP17-081",scope:"self",cost:context=>leaderHasType(context,"Elbaph")?12:0},{cardNumber:"OP17-094",scope:"self",cost:context=>leaderHasType(context,"Elbaph")?12:0},{cardNumber:"OP17-112",scope:"board-aura",power:{kind:"set-base",value:context=>{if(context.isLeader)return void 0;if(turnPlayer(context)!==context.playerId)return void 0;const definition=context.db.require(context.card.cardNumber);if(!definition.rules.hasTrigger)return void 0;if((definition.power??0)!==4e3)return void 0;return 8e3}}},{cardNumber:"OP17-079",scope:"controller-aura",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&costOf(context.state,context.playerId,context.card)>=12}},{cardNumber:"OP17-003",scope:"self",keyword:{keyword:"Rush: Character",when:always}},{cardNumber:"OP17-027",scope:"self",keyword:{keyword:"Rush: Character",when:always}}];var promoStaticAbilities=[{cardNumber:"P-084",scope:"board-aura",attackBlocked:context=>buggyCostBandBan(context,context.playerId)},{cardNumber:"P-084",scope:"opponent-board-aura",attackBlocked:context=>buggyCostBandBan(context,opponentOf(context.playerId))},{cardNumber:"P-105",scope:"self",keyword:{keyword:"Blocker",when:context=>leaderHasType(context,"Revolutionary Army")}},{cardNumber:"P-105",scope:"self",cost:context=>leaderHasType(context,"Revolutionary Army")?4:0},{cardNumber:"P-001",scope:"self",keyword:{keyword:"Rush",when:context=>attachedDon(context)>=2}},{cardNumber:"P-003",scope:"self",keyword:{keyword:"Double Attack",when:context=>attachedDon(context)>=2}},{cardNumber:"P-004",scope:"self",keyword:{keyword:"Blocker",when:context=>attachedDon(context)>=1}},{cardNumber:"P-113",scope:"self",keyword:{keyword:"Blocker",when:context=>attachedDon(context)>=2&&turnPlayer(context)!==context.playerId}},{cardNumber:"P-113",scope:"self",power:{kind:"add",value:context=>attachedDon(context)>=2&&turnPlayer(context)!==context.playerId?2e3:0}},{cardNumber:"P-007",scope:"self",battleKoImmune:(context,attacker)=>attachedDon(context)>=1&&attacker.attributes.includes("Strike")},{cardNumber:"P-025",scope:"self",battleKoImmune:(context,attacker)=>attachedDon(context)>=1&&!attacker.isLeader&&!attacker.attributes.includes("Special")},{cardNumber:"P-052",scope:"self",battleKoImmune:(context,attacker)=>attachedDon(context)>=1&&attacker.attributes.includes("Slash")},{cardNumber:"P-054",scope:"self",battleKoImmune:(context,attacker)=>attachedDon(context)>=1&&attacker.attributes.includes("Strike")},{cardNumber:"P-006",scope:"self",power:{kind:"add",value:context=>attachedDon(context)>=2&&turnPlayer(context)===context.playerId?2e3:0}},{cardNumber:"P-027",scope:"board-aura",power:{kind:"add",value:context=>!context.isLeader&&turnPlayer(context)!==context.playerId&&(context.db.require(context.card.cardNumber).power??0)<=3e3?1e3:0}},{cardNumber:"P-034",scope:"self",power:{kind:"add",value:context=>attachedDon(context)>=1&&turnPlayer(context)===context.playerId&&lowLife(context,2)?2e3:0}},{cardNumber:"P-039",scope:"self",power:{kind:"add",value:context=>attachedDon(context)>=2&&lowLife(context,0)?2e3:0}},{cardNumber:"P-044",scope:"self",power:{kind:"add",value:context=>!context.isLeader&&attachedDon(context)>=1&&context.state.players[context.playerId].hand.length<=4?2e3:0}},{cardNumber:"P-050",scope:"self",power:{kind:"add",value:context=>attachedDon(context)>=1&&turnPlayer(context)===context.playerId&&context.state.players[context.playerId].hand.length<=3?4e3:0}},{cardNumber:"P-078",scope:"self",power:{kind:"add",value:context=>context.state.players[context.playerId].board.filter(card=>card.rested&&hasCardType(card.cardNumber,"ODYSSEY")).length>=2?1e3:0}},{cardNumber:"P-092",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId?-3e3:0}},{cardNumber:"P-032",scope:"opponent-board-aura",cost:context=>!context.isLeader&&turnPlayer(context)!==context.playerId&&context.state.players[context.playerId==="p1"?"p2":"p1"].board.some(card=>card.cardNumber==="P-032"&&(card.attachedDon?.length??0)>=1)?-2:0}];var promoRemovalImmunities=[{cardNumber:"P-104",from:"opponent",readsDon:["opponent"],when:(state,ownerId)=>fieldDonCount(state,ownerId)>=10||fieldDonCount(state,opponentOf(ownerId))>=10}];var op15StaticAbilities=[{cardNumber:"OP15-011",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId&&leaderHasType(context,"East Blue")?2e3:0},keyword:{keyword:"Blocker",when:context=>turnPlayer(context)!==context.playerId&&leaderHasType(context,"East Blue")}},{cardNumber:"OP15-070",scope:"board-aura",keyword:{keyword:"Unblockable",when:context=>isNamedOrSelf(context,"Shura","OP15-070")},power:{kind:"set-base",value:context=>turnPlayer(context)!==context.playerId&&isNamedOrSelf(context,"Shura","OP15-070")?6e3:void 0}},{cardNumber:"OP15-080",scope:"self",power:{kind:"add",value:context=>{const board=context.state.players[context.playerId].board;const moria=board.some(card=>hasCardName(card.cardNumber,"Gecko Moria")&&boardCardPower(context.state,context.playerId,card)>=1e4);const otherOars=board.some(card=>card.instanceId!==context.card.instanceId&&hasCardName(card.cardNumber,"Oars"));return moria&&!otherOars?7e3:0}}},{cardNumber:"OP15-006",scope:"self",power:{kind:"add",value:context=>trashEventCountOf(context)>=4?2e3:0}},{cardNumber:"OP15-021",scope:"self",costZone:"hand",cost:context=>trashEventCountOf(context)>=4?-3:0},{cardNumber:"OP15-102",scope:"self",costZone:"hand",cost:context=>context.state.players[context.playerId].board.some(card=>hasCardType(card.cardNumber,"Sky Island")&&boardCardPower(context.state,context.playerId,card)>=7e3)?-3:0},{cardNumber:"OP15-071",scope:"board-aura",keyword:{keyword:"Double Attack",when:context=>isNamedOrSelf(context,"Ohm","OP15-071")},power:{kind:"set-base",value:context=>turnPlayer(context)!==context.playerId&&isNamedOrSelf(context,"Ohm","OP15-071")?6e3:void 0}},{cardNumber:"OP15-001",scope:"opponent-aura",power:{kind:"add",value:context=>{if(context.isLeader)return 0;const kriegPlayerId=opponentOf(context.playerId);const krieg=context.state.players[kriegPlayerId];if(turnPlayer(context)!==context.playerId)return 0;if(krieg.leaderAttachedDon.length<1)return 0;const characters=krieg.board.filter(card=>context.db.require(card.cardNumber).category==="character");const onlyEastBlue=characters.length>0&&characters.every(card=>hasCardType(card.cardNumber,"East Blue"));return onlyEastBlue?-2e3:0}}},{cardNumber:"OP15-024",scope:"self",keyword:{keyword:"Blocker",when:context=>turnPlayer(context)!==context.playerId},restImmune:context=>turnPlayer(context)!==context.playerId},{cardNumber:"OP15-051",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId&&leaderHasType(context,"Dressrosa")?3e3:0}},{cardNumber:"OP15-088",scope:"self",cost:()=>6},{cardNumber:"OP15-053",scope:"self",keyword:{keyword:"Blocker",when:context=>attachedDon(context)>=1}},{cardNumber:"OP15-087",scope:"self",keyword:{keyword:"Blocker",when:context=>context.state.players[context.playerId].trash.length>=10}},{cardNumber:"OP15-092",scope:"self",power:{kind:"set-base",value:context=>context.state.players[context.playerId].trash.length>=10?9e3:void 0},cost:context=>context.state.players[context.playerId].trash.length>=10?10:0},{cardNumber:"OP15-092",scope:"board-aura",power:{kind:"set-base",value:context=>{if(!context.isLeader)return void 0;if(turnPlayer(context)===context.playerId)return void 0;return context.state.players[context.playerId].trash.length>=20?7e3:void 0}}},{cardNumber:"OP15-092",scope:"self",power:{kind:"add",value:context=>context.state.players[context.playerId].trash.length>=30?1e3:0}},{cardNumber:"OP15-067",scope:"self",readsDon:["own-ceiling"],keyword:{keyword:"Rush",when:context=>fieldDon(context)<=6}},{cardNumber:"OP15-119",scope:"self",keyword:{keyword:"Rush",when:context=>fieldDon(context)>=6}},{cardNumber:"OP15-068",scope:"self",readsDon:["own-ceiling"],keyword:{keyword:"Blocker",when:context=>fieldDon(context)<=6}},{cardNumber:"OP15-050",scope:"self",power:{kind:"add",value:context=>fieldHasName(context,"Kelly Funk")?3e3:0}},{cardNumber:"OP15-013",scope:"self",costZone:"hand",cost:context=>ownLeaderPower(context)<=0?-2:0},{cardNumber:"OP15-060",scope:"self",power:{kind:"add",value:context=>fieldDon(context)<=6?2e3:0}},{cardNumber:"OP15-118",scope:"self",power:{kind:"add",value:context=>fieldDon(context)<=6?2e3:0}}];var op15RemovalImmunities=[{cardNumber:"OP15-060",from:"opponent",readsDon:["own-ceiling"],when:(state,ownerId)=>fieldDonCount(state,ownerId)<=6},{cardNumber:"OP15-118",from:"opponent",readsDon:["own-ceiling"],when:(state,ownerId)=>fieldDonCount(state,ownerId)<=6}];var op13StaticAbilities=[{cardNumber:"OP13-009",scope:"self",keyword:{keyword:"Double Attack",when:context=>context.state.players[context.playerId].board.some(card=>card.instanceId!==context.card.instanceId&&hasCardType(card.cardNumber,"Mountain Bandits"))}},{cardNumber:"OP13-004",scope:"self",power:{kind:"add",value:context=>context.isLeader&&context.state.players[context.playerId].life.length>=4?-1e3:0}},{cardNumber:"OP13-004",scope:"controller-aura",power:{kind:"add",value:context=>saboAura(context)?1e3:0}},{cardNumber:"OP13-031",scope:"self",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&context.state.players[context.playerId].life.length<=1}},{cardNumber:"OP13-112",scope:"self",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&totalGivenDon(context.state,context.playerId)>=2}},{cardNumber:"OP13-003",scope:"self",readsDon:["own-ceiling"],power:{kind:"add",value:context=>fieldDon(context)<=9?-2e3:0},donPhaseDonToLeader:context=>context.isLeader},{cardNumber:"OP13-068",scope:"self",power:{kind:"add",value:context=>fieldDon(context)>=8?2e3:0}},{cardNumber:"OP13-080",scope:"self",keyword:{keyword:"Rush",when:context=>trashAtLeastCount(context,7)}},{cardNumber:"OP13-084",scope:"board-aura",power:{kind:"set-base",value:context=>turnPlayer(context)===context.playerId&&trashAtLeastCount(context,10)&&!context.isLeader&&hasCardType(context.card.cardNumber,"Five Elders")?7e3:void 0}},{cardNumber:"OP13-089",scope:"self",keyword:{keyword:"Blocker",when:context=>trashAtLeastCount(context,7)}},{cardNumber:"OP13-091",scope:"self",keyword:{keyword:"Blocker",when:context=>trashAtLeastCount(context,7)}},{cardNumber:"OP13-099",scope:"stage-aura",power:{kind:"add",value:context=>context.isLeader&&turnPlayer(context)===context.playerId&&trashAtLeastCount(context,19)?1e3:0}},{cardNumber:"OP13-119",scope:"self",keyword:{keyword:"Rush",when:context=>context.state.players[context.playerId].life.length<=3}},{cardNumber:"ST35-005",scope:"self",cost:()=>3},{cardNumber:"OP13-081",scope:"self",cost:context=>leaderHasType(context,"Revolutionary Army")?3:0}];var op13RemovalImmunities=[...["OP13-080","OP13-083","OP13-084","OP13-089","OP13-091"].map(cardNumber=>({cardNumber,from:"opponent",when:(state,ownerId)=>state.players[ownerId].trash.length>=7}))];var op16StaticAbilities=[{cardNumber:"OP16-003",scope:"board-aura",keyword:{keyword:"Double Attack",when:context=>context.isLeader&&turnPlayer(context)===context.playerId},power:{kind:"add",value:context=>context.isLeader&&turnPlayer(context)===context.playerId?2e3:0}},{cardNumber:"OP16-054",scope:"self",power:{kind:"add",value:context=>attachedDon(context)>=1&&turnPlayer(context)===context.playerId&&context.state.players[context.playerId].hand.length>=5?3e3:0}},{cardNumber:"OP16-027",scope:"self",power:{kind:"add",value:context=>attachedDon(context)>=1?2e3:0}},{cardNumber:"OP16-034",scope:"self",power:{kind:"add",value:context=>attachedDon(context)>=1&&turnPlayer(context)===context.playerId?new Set(context.state.players[context.playerId].board.map(candidate=>context.db.require(candidate.cardNumber).name)).size*1e3:0}},{cardNumber:"OP16-082",scope:"self",cost:context=>context.state.players[context.playerId].board.some(card=>card.instanceId===context.card.instanceId)?3:0},{cardNumber:"OP16-079",scope:"self",trashPlayRush:(context,cardNumber)=>context.db.require(cardNumber).category==="character"&&hasCardType(cardNumber,"Land of Wano")},{cardNumber:"OP16-113",scope:"self",keyword:{keyword:"Blocker",when:context=>context.state.players[context.playerId].life.length<=2}},{cardNumber:"OP16-080",scope:"controller-aura",cost:context=>!context.isLeader&&context.db.require(context.card.cardNumber).category==="character"&&turnPlayer(context)!==context.playerId?1:0},{cardNumber:"OP16-017",scope:"self",power:{kind:"add",value:context=>context.state.players[context.playerId].board.some(card=>hasCardTypeIncluding(card.cardNumber,"Whitebeard Pirates")&&costOf(context.state,context.playerId,card,context.db)>=8)?0:-4e3}},{cardNumber:"OP16-036",scope:"self",implementsClause:"[When Attacking]",power:{kind:"add",value:context=>context.state.activeAttack?.attackerInstanceId===context.card.instanceId?opposingLeaderPower(context)-(context.db.require(context.card.cardNumber).power??0):0}},{cardNumber:"OP16-055",scope:"self",implementsClause:"[When Attacking]",power:{kind:"add",value:context=>attachedDon(context)>=1&&context.state.activeAttack?.attackerInstanceId===context.card.instanceId?opposingLeaderPower(context)-(context.db.require(context.card.cardNumber).power??0):0}}];var formatStaticAbilities=[{cardNumber:"ST31-003",scope:"self",keyword:{keyword:"Blocker",when:context=>turnPlayer(context)!==context.playerId&&totalGivenDon(context.state,context.playerId)>=3}},{cardNumber:"ST31-003",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId&&totalGivenDon(context.state,context.playerId)>=3?3e3:0}},{cardNumber:"ST31-001",scope:"self",keyword:{keyword:"Rush",when:context=>attachedDon(context)>=2}},{cardNumber:"ST31-004",scope:"self",keyword:{keyword:"Rush",when:context=>totalGivenDon(context.state,context.playerId)>=3}},{cardNumber:"ST32-005",scope:"self",keyword:{keyword:"Rush: Character",when:always}},{cardNumber:"ST32-004",scope:"self",keyword:{keyword:"Rush: Character",when:context=>cardAttributes(context.db.require(context.state.players[context.playerId].leaderCardNumber)).includes("Slash")}},{cardNumber:"ST35-004",scope:"self",cost:()=>1,keyword:{keyword:"Blocker",when:always}},{cardNumber:"ST33-004",scope:"self",costZone:"hand",cost:context=>handTrashedThisTurn(context)?-3:0}];var leaderIsSlash=context=>cardAttributes(context.db.require(context.state.players[context.playerId].leaderCardNumber)).includes("Slash");var op12StaticAbilities=[{cardNumber:"OP12-063",scope:"self",power:{kind:"add",value:context=>trashEventCountOf(context)>=4?2e3:0}},{cardNumber:"OP12-063",scope:"self",cost:context=>trashEventCountOf(context)>=4?5:0},{cardNumber:"OP12-042",scope:"self",cost:context=>twoBaseCostFiveCharacters(context)?1:0},{cardNumber:"OP12-036",scope:"self",effectPlayFromHandBarred:()=>true},{cardNumber:"OP12-036",scope:"self",battleKoImmune:(context,attacker)=>leaderIsSlash(context)&&attacker.attributes.includes("Slash")},{cardNumber:"OP12-036",scope:"self",power:{kind:"add",value:context=>leaderIsSlash(context)?1e3:0}},{cardNumber:"OP12-021",scope:"self",restImmune:context=>leaderIsSlash(context)&&context.state.players[context.playerId].restedDon.length>=6},{cardNumber:"OP12-053",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId&&leaderHasType(context,"Navy")?1e3:0}},{cardNumber:"OP12-053",scope:"self",keyword:{keyword:"Blocker",when:context=>turnPlayer(context)!==context.playerId&&leaderHasType(context,"Navy")}},{cardNumber:"OP12-065",scope:"self",keyword:{keyword:"Blocker",when:context=>trashEventCountOf(context)>=4}},{cardNumber:"OP12-066",scope:"self",keyword:{keyword:"Blocker",when:context=>trashEventCountOf(context)>=4}},{cardNumber:"OP12-070",scope:"self",power:{kind:"add",value:context=>Math.floor(trashEventCountOf(context)/5)*1e3}},{cardNumber:"OP12-085",scope:"self",cost:context=>leaderHasType(context,"Revolutionary Army")?3:0},{cardNumber:"OP12-087",scope:"self",cost:context=>robinLeader(context)?3:0},{cardNumber:"OP12-087",scope:"self",keyword:{keyword:"Blocker",when:robinLeader}},{cardNumber:"OP12-089",scope:"self",cost:context=>leaderHasType(context,"Revolutionary Army")?4:0},{cardNumber:"OP12-089",scope:"self",keyword:{keyword:"Blocker",when:context=>leaderHasType(context,"Revolutionary Army")}},{cardNumber:"OP12-095",scope:"self",cost:context=>leaderHasType(context,"Revolutionary Army")?4:0},{cardNumber:"OP12-100",scope:"self",cost:context=>lowLife(context,3)?3:0},{cardNumber:"OP12-100",scope:"self",keyword:{keyword:"Blocker",when:context=>lowLife(context,3)}},{cardNumber:"OP12-102",scope:"board-aura",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId&&hasCardType(context.card.cardNumber,"Neptunian")&&shirahoshiCount(context)===1?2e3:0}},{cardNumber:"OP12-107",scope:"self",keyword:{keyword:"Rush",when:context=>lowLife(context,2)}},{cardNumber:"OP12-015",scope:"self",power:{kind:"add",value:context=>!context.isLeader&&totalGivenDon(context.state,context.playerId)>=2?2e3:0}},{cardNumber:"OP12-043",scope:"self",cost:context=>context.state.players[context.playerId].hand.length>=5?1:0},{cardNumber:"OP12-093",scope:"self",cost:context=>leaderHasType(context,"Revolutionary Army")?4:0}];var op12RemovalImmunities=[{cardNumber:"OP12-024",from:"opponent",when:(state,ownerId,card)=>state.players[ownerId].board.some(candidate=>candidate.instanceId===card.instanceId&&!candidate.rested)}];var st21StaticAbilities=[{cardNumber:"ST21-015",scope:"self",keyword:{keyword:"Rush",when:context=>attachedDon(context)>=2}},{cardNumber:"ST21-002",scope:"self",power:{kind:"add",value:context=>!context.isLeader&&attachedDon(context)>=2&&turnPlayer(context)!==context.playerId?2e3:0}},{cardNumber:"ST21-011",scope:"board-aura",power:{kind:"add",value:context=>!context.isLeader&&turnPlayer(context)!==context.playerId&&hasCardType(context.card.cardNumber,"Straw Hat Crew")&&(context.db.require(context.card.cardNumber).power??0)<=4e3&&context.state.players[context.playerId].board.some(card=>card.cardNumber==="ST21-011"&&(card.attachedDon?.length??0)>=2)?1e3:0}}];var st13StaticAbilities=[{cardNumber:"ST13-003",scope:"self",faceUpLifeGoesToDeckBottom:context=>context.isLeader}];var st15StaticAbilities=[{cardNumber:"ST15-005",scope:"self",keyword:{keyword:"Rush",when:context=>leaderHasType(context,"Whitebeard Pirates")}}];var op09StaticAbilities=[{cardNumber:"OP09-004",scope:"opponent-board-aura",power:{kind:"add",value:context=>!context.isLeader&&context.db.require(context.card.cardNumber).category==="character"?-1e3:0}},{cardNumber:"OP09-017",scope:"self",keyword:{keyword:"Rush",when:context=>!context.isLeader&&attachedDon(context)>=1&&leaderHasType(context,"Kid Pirates")&&currentLeaderPower(context)>=7e3}},{cardNumber:"OP09-022",scope:"self",charactersPlayRested:()=>true},{cardNumber:"OP09-025",scope:"self",battleKoImmune:(context,attacker)=>attacker.isLeader&&leaderHasType(context,"ODYSSEY")},{cardNumber:"OP09-045",scope:"self",battleKoImmune:context=>context.state.players[context.playerId].board.some(card=>hasCardName(card.cardNumber,"Buggy")||hasCardName(card.cardNumber,"Mohji"))},{cardNumber:"OP09-061",scope:"controller-aura",cost:context=>!context.isLeader&&context.db.require(context.card.cardNumber).category==="character"&&context.state.players[context.playerId].leaderAttachedDon.length>=1?1:0},{cardNumber:"OP09-081",scope:"self",onPlayNegated:()=>true},{cardNumber:"OP09-118",scope:"self",winsOnOpponentBlock:context=>context.state.players.p1.life.length===0||context.state.players.p2.life.length===0},{cardNumber:"OP09-086",scope:"self",power:{kind:"add",value:context=>!context.isLeader&&leaderHasType(context,"Blackbeard Pirates")?Math.floor(context.state.players[context.playerId].trash.length/4)*1e3:0}}];var op09RemovalImmunities=[{cardNumber:"OP09-086",from:"opponent",koOnly:true}];var st25StaticAbilities=[{cardNumber:"ST25-001",scope:"self",cost:context=>twoBaseCostFiveCharacters(context)?1:0},{cardNumber:"ST25-002",scope:"self",cost:context=>twoBaseCostFiveCharacters(context)?1:0},{cardNumber:"ST25-002",scope:"self",keyword:{keyword:"Blocker",when:twoBaseCostFiveCharacters}},{cardNumber:"ST25-002",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId?5e3:0}},{cardNumber:"ST25-005",scope:"self",cost:context=>twoBaseCostFiveCharacters(context)?1:0},{cardNumber:"ST25-005",scope:"self",keyword:{keyword:"Blocker",when:twoBaseCostFiveCharacters}}];var st30StaticAbilities=[{cardNumber:"ST30-001",scope:"self",power:{kind:"add",value:context=>context.isLeader&&context.state.players[context.playerId].board.some(card=>(context.db.require(card.cardNumber).power??0)>=7e3)?-2e3:0}},{cardNumber:"ST30-001",scope:"controller-aura",power:{kind:"add",value:context=>{if(turnPlayer(context)===context.playerId)return 0;return hasCardName(context.card.cardNumber,"Portgas.D.Ace")||hasCardName(context.card.cardNumber,"Monkey.D.Luffy")?3e3:0}}},{cardNumber:"ST30-003",scope:"board-aura",power:{kind:"add",value:context=>!context.isLeader&&turnPlayer(context)===context.playerId&&context.db.require(context.card.cardNumber).power===6e3?1e3:0}}];var st28StaticAbilities=[{cardNumber:"ST28-005",scope:"self",power:{kind:"add",value:context=>!context.isLeader&&turnPlayer(context)===context.playerId&&attachedDon(context)>=2?3e3:0}},{cardNumber:"ST28-002",scope:"self",keyword:{keyword:"Blocker",when:context=>attachedDon(context)>=2}},{cardNumber:"ST28-004",scope:"board-aura",power:{kind:"add",value:context=>context.isLeader&&turnPlayer(context)===context.playerId&&lowLife(context,2)?1e3:0}}];var op06StaticAbilities=[{cardNumber:"OP06-110",scope:"self",attacksActive:context=>!context.isLeader&&attachedDon(context)>=2},{cardNumber:"OP06-002",scope:"self",keyword:{keyword:"Banish",when:context=>!context.isLeader&&boardCardPower(context.state,context.playerId,context.card,true,context.db)>=7e3}},{cardNumber:"OP06-010",scope:"self",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&leaderHasType(context,"FILM")}},{cardNumber:"OP06-012",scope:"self",battleKoImmune:context=>{if(context.isLeader)return false;const opponentId=opponentOf(context.playerId);const opponent=context.state.players[opponentId];const leaderBase=storedBasePower(opponent.leaderBasePowers,context.state.turn)??context.db.require(opponent.leaderCardNumber).power??0;if(leaderBase>=6e3)return true;return opponent.board.some(card=>(storedBasePower(card.basePowerOverrides,context.state.turn)??context.db.require(card.cardNumber).power??0)>=6e3)}},{cardNumber:"OP06-052",scope:"self",battleKoImmune:context=>!context.isLeader&&attachedDon(context)>=1&&context.state.players[context.playerId].hand.length<=4},{cardNumber:"OP06-054",scope:"self",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&context.state.players[context.playerId].hand.length<=5}},{cardNumber:"OP06-067",scope:"self",readsDon:["own-ceiling","opponent"],power:{kind:"add",value:context=>!context.isLeader&&fieldDon(context)<=fieldDonCount(context.state,opponentOf(context.playerId))?1e3:0}},{cardNumber:"OP06-072",scope:"self",readsDon:["own-ceiling","opponent"],keyword:{keyword:"Blocker",when:context=>!context.isLeader&&leaderHasType(context,"GERMA 66")&&fieldDon(context)<=fieldDonCount(context.state,opponentOf(context.playerId))-2}},{cardNumber:"OP06-085",scope:"self",power:{kind:"add",value:context=>!context.isLeader&&attachedDon(context)>=2&&turnPlayer(context)===context.playerId?Math.floor(context.state.players[context.playerId].trash.length/5)*1e3:0}},{cardNumber:"OP06-088",scope:"self",power:{kind:"add",value:context=>!context.isLeader&&leaderHasType(context,"Dressrosa")&&!context.state.players[context.playerId].leaderRested?2e3:0}},{cardNumber:"OP06-113",scope:"self",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&context.state.players[context.playerId].board.some(card=>context.db.require(card.cardNumber).category==="character"&&hasCardType(card.cardNumber,"Shandian Warrior")&&!hasCardName(card.cardNumber,"Raki"))}}];var op06RemovalImmunities=[{cardNumber:"OP06-109",from:"any",koOnly:true,when:(state,ownerId,card)=>state.players[opponentOf(ownerId)].life.length<=3&&state.players[ownerId].board.some(candidate=>candidate.instanceId===card.instanceId&&(candidate.attachedDon?.length??0)>=2)}];var opponentHasBigBase=context=>{const opponent=opponentOf(context.playerId);return context.state.players[opponent].board.some(card=>(cardBasePower(context.state,opponent,card,context.db)??0)>=8e3)};var eb05StaticAbilities=[{cardNumber:"EB05-024",scope:"self",cost:context=>leaderHasType(context,"Impel Down")?2:0,keyword:{keyword:"Blocker",when:context=>!context.isLeader&&leaderHasType(context,"Impel Down")}},{cardNumber:"EB05-046",scope:"self",keyword:{keyword:"Blocker",when:opponentHasBigBase},power:{kind:"add",value:context=>opponentHasBigBase(context)?3e3:0}},{cardNumber:"EB05-047",scope:"self",cost:()=>12}];var eb05RemovalImmunities=[];var eb04StaticAbilities=[{cardNumber:"EB04-001",scope:"self",power:{kind:"add",value:context=>context.isLeader&&turnPlayer(context)!==context.playerId&&lowLife(context,1)?2e3:0}},{cardNumber:"EB04-056",scope:"self",keyword:{keyword:"Blocker",when:context=>lowLife(context,0)&&(hasCardName(context.state.players[context.playerId].leaderCardNumber,"Jewelry Bonney")||context.state.players[context.playerId].board.some(card=>hasCardName(card.cardNumber,"Jewelry Bonney")))}},{cardNumber:"EB04-061",scope:"self",handPlayDiscount:context=>lowLife(context,1)?1:0},{cardNumber:"EB04-003",scope:"board-aura",power:{kind:"set-base",value:context=>{if(!context.isLeader)return void 0;if(turnPlayer(context)===context.playerId)return void 0;return leaderHasType(context,"Navy")?7e3:void 0}}},{cardNumber:"EB04-005",scope:"self",attackBlocked:context=>context.state.players[opponentOf(context.playerId)].board.filter(card=>(context.db.require(card.cardNumber).power??0)>=5e3).length<2},{cardNumber:"EB04-010",scope:"stage-aura",power:{kind:"add",value:context=>!context.isLeader&&turnPlayer(context)!==context.playerId&&(context.db.require(context.card.cardNumber).cost??0)===1?5e3:0}},{cardNumber:"EB04-017",scope:"opponent-board-aura",cost:context=>{if(context.isLeader)return 0;if(turnPlayer(context)===context.playerId)return 0;const source=context.state.players[opponentOf(context.playerId)];const minks=source.board.filter(card=>hasCardType(card.cardNumber,"Minks")&&context.db.require(card.cardNumber).category==="character").length;return minks>=3?-1:0}},{cardNumber:"EB04-046",scope:"board-aura",cost:context=>!context.isLeader&&turnPlayer(context)!==context.playerId&&hasCardType(context.card.cardNumber,"Navy")?2:0},{cardNumber:"EB04-048",scope:"self",power:{kind:"add",value:context=>1e3*lucciSteps(context)},cost:context=>2*lucciSteps(context)},{cardNumber:"EB04-051",scope:"self",attackBlocked:context=>!["p1","p2"].some(playerId=>context.state.players[playerId].board.some(card=>(context.db.require(card.cardNumber).power??0)>=12e3))},{cardNumber:"EB04-057",scope:"self",keyword:{keyword:"Blocker",when:context=>attachedDon(context)>=1}}];var eb04RemovalImmunities=[{cardNumber:"EB04-057",from:"opponent",protects:definition=>definition.category==="character"&&definition.colors?.includes("Yellow")===true&&definition.types.includes("Scientist"),when:(state,ownerId)=>state.players[ownerId].life.length<=2}];var eb03StaticAbilities=[{cardNumber:"EB03-004",scope:"self",power:{kind:"add",value:context=>{if(context.isLeader)return 0;if(turnPlayer(context)===context.playerId)return 0;if(!leaderMulticolored(context))return 0;const big=context.state.players[context.playerId].board.some(card=>(storedBasePower(card.basePowerOverrides,context.state.turn)??context.db.require(card.cardNumber).power??0)>=6e3);return big?0:4e3}}},{cardNumber:"EB03-018",scope:"self",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&turnPlayer(context)!==context.playerId}},{cardNumber:"EB03-041",scope:"board-aura",power:{kind:"add",value:context=>{if(context.isLeader)return 0;if(turnPlayer(context)===context.playerId)return 0;const definition=context.db.require(context.card.cardNumber);if(!definition.types.includes("SWORD"))return 0;return(definition.cost??0)<=6?2e3:0}}},{cardNumber:"EB03-042",scope:"self",cost:context=>leaderHasType(context,"Revolutionary Army")?4:0},{cardNumber:"EB03-044",scope:"self",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&leaderMulticolored(context)}}];var eb03RemovalImmunities=[{cardNumber:"EB03-018",from:"opponent",when:(state,ownerId)=>state.turnPlayerId!==ownerId}];var op08StaticAbilities=[{cardNumber:"OP08-006",scope:"self",power:{kind:"add",value:context=>!context.isLeader&&turnPlayer(context)===context.playerId&&trashHasName(context,"Kuromarimo")&&trashHasName(context,"Chess")?2e3:0}},{cardNumber:"OP08-013",scope:"self",keyword:{keyword:"Rush",when:context=>!context.isLeader&&attachedDon(context)>=2}},{cardNumber:"OP08-020",scope:"stage-aura",power:{kind:"add",value:context=>!context.isLeader&&turnPlayer(context)!==context.playerId&&context.db.require(context.card.cardNumber).types.includes("Drum Kingdom")?1e3:0}},{cardNumber:"OP08-083",scope:"opponent-board-aura",cost:context=>!context.isLeader&&turnPlayer(context)!==context.playerId&&context.state.players[opponentOf(context.playerId)].board.some(card=>card.cardNumber==="OP08-083"&&(card.attachedDon?.length??0)>=1)?-1:0},{cardNumber:"OP08-084",scope:"self",cost:context=>context.isLeader?0:4},{cardNumber:"OP08-093",scope:"self",cost:context=>!context.isLeader&&attachedDon(context)>=1?2:0},{cardNumber:"OP08-114",scope:"self",power:{kind:"add",value:context=>hawkArmed(context)?2e3:0}},{cardNumber:"OP08-114",scope:"self",battleKoImmune:(context,attacker)=>hawkArmed(context)&&attacker.attributes.includes("Slash")}];var op08RemovalImmunities=[{cardNumber:"OP08-029",from:"opponent",protects:definition=>definition.category==="character"&&definition.types.includes("Minks")&&(definition.cost??0)<=3&&!hasCardName(definition.cardNumber,"Pekoms"),when:(_state,_ownerId,source)=>!("rested"in source&&source.rested)}];var op05StaticAbilities=[{cardNumber:"OP05-066",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)!==context.playerId&&fieldDon(context)>=10?1e3:0}},{cardNumber:"OP05-070",scope:"self",keyword:{keyword:"Rush",when:context=>!context.isLeader&&attachedDon(context)>=1&&fieldDon(context)>=8}},{cardNumber:"OP05-003",scope:"self",keyword:{keyword:"Rush",when:context=>!context.isLeader&&context.state.players[context.playerId].board.some(card=>card.instanceId!==context.card.instanceId&&context.db.require(card.cardNumber).category==="character"&&boardCardPower(context.state,context.playerId,card,true,context.db)>=7e3)}},{cardNumber:"OP05-062",scope:"self",keyword:{keyword:"Blocker",when:context=>fieldDon(context)>=10}},{cardNumber:"OP05-086",scope:"self",keyword:{keyword:"Blocker",when:context=>trashAtLeastCount(context,10)}},{cardNumber:"OP05-101",scope:"self",power:{kind:"add",value:context=>lowLife(context,2)?1e3:0}},{cardNumber:"OP05-084",scope:"opponent-board-aura",cost:context=>celestialDragonsCourt(context)?-4:0},{cardNumber:"OP05-092",scope:"opponent-board-aura",cost:context=>celestialDragonsCourt(context)?-6:0},{cardNumber:"OP05-097",scope:"stage-aura",handPlayDiscount:context=>{const card=context.db.require(context.card.cardNumber);return turnPlayer(context)===context.playerId&&card.category==="character"&&(card.cost??0)>=2&&hasCardType(context.card.cardNumber,"Celestial Dragons")?1:0}},{cardNumber:"OP05-040",scope:"stage-aura",blocksRefresh:context=>birdcageHolds(context,context.playerId)},{cardNumber:"OP05-040",scope:"opponent-stage-aura",blocksRefresh:context=>birdcageHolds(context,opponentOf(context.playerId))}];var st26StaticAbilities=[{cardNumber:"ST26-001",scope:"self",costZone:"hand",cost:context=>context.state.players[context.playerId].board.some(board=>{const definition=context.db.require(board.cardNumber);return definition.category==="character"&&(storedBasePower(board.basePowerOverrides,context.state.turn)??definition.power??0)>=7e3&&(hasCardName(board.cardNumber,"San-Gorou")||hasCardName(board.cardNumber,"Sanji"))})?-5:0}];var op04StaticAbilities=[{cardNumber:"OP04-096",scope:"stage-aura",keyword:{keyword:"Rush: Character",when:context=>!context.isLeader&&hasCardType(context.card.cardNumber,"Dressrosa")&&hasCardType(context.state.players[context.playerId].leaderCardNumber,"Dressrosa")}}];var op03StaticAbilities=[{cardNumber:"OP03-008",scope:"self",battleKoImmune:(context,attacker)=>attacker.attributes.includes("Slash")}];var st23StaticAbilities=[{cardNumber:"ST23-001",scope:"self",costZone:"hand",cost:context=>context.state.players[context.playerId].board.some(board=>context.db.require(board.cardNumber).category==="character"&&boardCardPower(context.state,context.playerId,board,context.state.turnPlayerId===context.playerId,context.db)>=1e4)?-4:0},{cardNumber:"ST23-002",scope:"self",costZone:"hand",cost:context=>{const opponent=context.playerId==="p1"?"p2":"p1";return context.state.players[opponent].board.some(board=>{const definition=context.db.require(board.cardNumber);return definition.category==="character"&&(storedBasePower(board.basePowerOverrides,context.state.turn)??definition.power??0)>=8e3})?-3:0}}];var st19StaticAbilities=[{cardNumber:"ST19-004",scope:"self",cost:context=>!context.isLeader&&turnPlayer(context)!==context.playerId&&attachedDon(context)>=1?4:0}];var prb02StaticAbilities=[{cardNumber:"PRB02-014",scope:"self",costZone:"hand",cost:context=>context.state.players[context.playerId].trash.length>=15?-3:0},{cardNumber:"PRB02-001",scope:"self",power:{kind:"add",value:context=>!context.isLeader&&turnPlayer(context)!==context.playerId&&leaderHasType(context,"Navy")?1e3:0}},{cardNumber:"PRB02-015",scope:"self",cost:context=>!context.isLeader&&leaderHasType(context,"Blackbeard Pirates")?4:0},{cardNumber:"PRB02-015",scope:"self",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&leaderHasType(context,"Blackbeard Pirates")}}];var op07StaticAbilities=[{cardNumber:"OP07-023",scope:"self",power:{kind:"add",value:context=>!context.isLeader&&context.state.players[context.playerId].restedDon.length>=6?1e3:0}},{cardNumber:"OP07-029",scope:"self",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&leaderHasType(context,"Supernovas")}},{cardNumber:"OP07-030",scope:"self",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&context.state.players[context.playerId].board.some(card=>context.db.require(card.cardNumber).category==="character"&&hasCardName(card.cardNumber,"Camie"))}},{cardNumber:"OP07-032",scope:"self",keyword:{keyword:"Rush: Character",when:context=>!context.isLeader}},{cardNumber:"OP07-064",scope:"self",costZone:"hand",readsDon:["own-ceiling","opponent"],cost:context=>fieldDonCount(context.state,context.playerId)<=fieldDonCount(context.state,opponentOf(context.playerId))-2?-3:0},{cardNumber:"OP07-071",scope:"opponent-board-aura",power:{kind:"add",value:context=>!context.isLeader&&turnPlayer(context)===context.playerId&&hasCardType(context.state.players[opponentOf(context.playerId)].leaderCardNumber,"Foxy Pirates")?-1e3:0}},{cardNumber:"OP07-081",scope:"opponent-board-aura",cost:context=>!context.isLeader&&turnPlayer(context)!==context.playerId&&context.state.players[opponentOf(context.playerId)].board.some(card=>card.cardNumber==="OP07-081"&&(card.attachedDon?.length??0)>=1)?-1:0},{cardNumber:"OP07-087",scope:"self",power:{kind:"add",value:context=>{if(context.isLeader)return 0;if(turnPlayer(context)!==context.playerId)return 0;const opponentId=opponentOf(context.playerId);return context.state.players[opponentId].board.some(card=>costOf(context.state,opponentId,card,context.db)<=0)?3e3:0}}},{cardNumber:"OP07-098",scope:"self",battleKoImmune:context=>!context.isLeader&&context.state.players[context.playerId].life.length<context.state.players[opponentOf(context.playerId)].life.length}];var op07RemovalImmunities=[{cardNumber:"OP07-033",from:"opponent",koOnly:true,protects:definition=>definition.category==="character"&&(definition.cost??0)<=3&&!hasCardName(definition.cardNumber,"Monkey.D.Luffy"),when:(state,ownerId)=>state.players[ownerId].board.filter(card=>cards.require(card.cardNumber).category==="character").length>=3},{cardNumber:"OP07-069",from:"opponent",koOnly:true,readsDon:["own-ceiling","opponent"],protects:definition=>definition.category==="character"&&definition.types.includes("Foxy Pirates")&&!hasCardName(definition.cardNumber,"Pickles"),when:(state,ownerId)=>fieldDonCount(state,ownerId)<=fieldDonCount(state,opponentOf(ownerId))}];var eb02StaticAbilities=[{cardNumber:"EB02-003",scope:"self",power:{kind:"add",value:context=>attachedDon(context)>=2&&turnPlayer(context)!==context.playerId?2e3:0}},{cardNumber:"EB02-005",scope:"self",power:{kind:"add",value:context=>turnPlayer(context)===context.playerId?2e3:-2e3}},{cardNumber:"EB02-012",scope:"self",keyword:{keyword:"Blocker",when:context=>fieldHasName(context,"Sarfunkel")}},{cardNumber:"EB02-019",scope:"self",keyword:{keyword:"Rush: Character",when:context=>opponentCharacters(context)>=2}},{cardNumber:"EB02-033",scope:"self",keyword:{keyword:"Blocker",when:context=>fieldHasName(context,"Merry Go")}},{cardNumber:"EB02-052",scope:"self",keyword:{keyword:"Rush",when:context=>leaderHasType(context,"Sky Island")}},{cardNumber:"EB02-061",scope:"self",readsDon:["opponent"],keyword:{keyword:"Rush",when:context=>leaderMulticolored(context)&&fieldDonCount(context.state,opponentOf(context.playerId))>=5}}];var eb01StaticAbilities=[{cardNumber:"EB01-024",scope:"board-aura",power:{kind:"add",value:context=>!context.isLeader&&hasCardType(context.card.cardNumber,"SMILE")&&context.state.players[context.playerId].hand.length<=4?1e3:0}},{cardNumber:"EB01-014",scope:"self",power:{kind:"add",value:context=>attachedDon(context)>=1&&turnPlayer(context)===context.playerId?Math.floor(context.state.players[context.playerId].restedDon.length/3)*1e3:0}},{cardNumber:"EB01-058",scope:"self",power:{kind:"add",value:context=>attachedDon(context)>=1&&turnPlayer(context)===context.playerId&&context.state.players[context.playerId].life.length<=2?2e3:0}}];var st16StaticAbilities=[{cardNumber:"ST16-003",scope:"self",power:{kind:"add",value:context=>!context.isLeader&&leaderHasType(context,"FILM")&&restedCardCount(context)>=6?2e3:0}},{cardNumber:"ST16-005",scope:"self",power:{kind:"add",value:context=>!context.isLeader&&context.state.players[context.playerId].board.some(card=>card.rested&&hasCardName(card.cardNumber,"Uta"))?1e3:0}}];var st27StaticAbilities=[{cardNumber:"ST27-004",scope:"self",keyword:{keyword:"Blocker",when:context=>!context.isLeader&&leaderHasType(context,"Blackbeard Pirates")}},{cardNumber:"ST27-004",scope:"self",cost:context=>!context.isLeader&&leaderHasType(context,"Blackbeard Pirates")?Math.floor(context.state.players[context.playerId].trash.length/4):0}];var st29StaticAbilities=[{cardNumber:"ST29-003",scope:"self",power:{kind:"add",value:context=>!context.isLeader&&context.state.players[context.playerId].life.length<=context.state.players[opponentOf(context.playerId)].life.length?1e3:0}}];var st14StaticAbilities=[{cardNumber:"ST14-001",scope:"controller-aura",cost:context=>!context.isLeader&&context.state.players[context.playerId].leaderAttachedDon.length>=1?1:0},{cardNumber:"ST14-001",scope:"self",power:{kind:"add",value:context=>context.isLeader&&attachedDon(context)>=1&&ownCharacterWithCost(context,8)?1e3:0}},{cardNumber:"ST14-009",scope:"self",power:{kind:"add",value:context=>!context.isLeader&&attachedDon(context)>=1&&turnPlayer(context)!==context.playerId&&ownCharacterWithCost(context,6)?2e3:0}},{cardNumber:"ST14-012",scope:"self",keyword:{keyword:"Rush",when:context=>!context.isLeader&&ownCharacterWithCost(context,10)}},{cardNumber:"ST14-017",scope:"stage-aura",cost:context=>!context.isLeader&&context.db.require(context.card.cardNumber).colors?.includes("Black")===true&&hasCardType(context.card.cardNumber,"Straw Hat Crew")?1:0}];var st14RemovalImmunities=[{cardNumber:"ST14-009",from:"opponent",koOnly:true,when:(state,ownerId,card)=>state.turnPlayerId!==ownerId&&state.players[ownerId].board.some(candidate=>candidate.instanceId===card.instanceId&&(candidate.attachedDon?.length??0)>=1)&&state.players[ownerId].board.some(candidate=>costOf(state,ownerId,candidate,cards)>=6)}];var st10StaticAbilities=[{cardNumber:"ST10-003",scope:"self",power:{kind:"add",value:context=>context.isLeader&&turnPlayer(context)===context.playerId&&context.state.players[context.playerId].life.length>=4?-1e3:0}}];var eightDon={kind:"field-don",player:"self",operator:"gte",value:8};var trashOneDrawTwo={kind:"sequence",effects:[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"st18-002-trash",min:1,max:1,effect:{kind:"move",binding:"st18-002-trash",to:{player:"self",zone:"trash"}}},{kind:"draw",player:"self",count:2}]};var st18Mechanics={onPlay:[["ST18-001",{effect:{kind:"if",condition:eightDon,then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5,canRest:true},bind:"uso-hachi-target",min:0,max:1,effect:{kind:"rest",binding:"uso-hachi-target"}}}}],["ST18-002",{effect:{kind:"if",condition:eightDon,then:trashOneDrawTwo}}],["ST18-004",lookAndAdd(5,"st18-004-look",{color:"Purple",type:"Straw Hat Crew"})],["ST18-005",{effect:donMinus(1,{kind:"choose",selector:{player:"self",zone:"hand",category:"character",color:"Purple",type:"Straw Hat Crew",maxCost:5},bind:"st18-005-play",min:0,max:1,effect:{kind:"play",binding:"st18-005-play"}})}]],whenAttacking:[["ST18-003",{oncePerTurn:true,requires:{fieldDon:8},program:{effect:{kind:"draw",player:"self",count:1}}}]]};var op03Mechanics={onPlay:[["OP03-008",lookAndAdd(5,"op03-buggy-look",{color:"Red",category:"event"})],["OP03-048",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Nami"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"op03-nojiko-bounce",min:0,max:1,effect:{kind:"move",binding:"op03-nojiko-bounce",to:{player:"owner",zone:"hand"}}}}}]],counterEvent:[["OP03-072",{cost:0,trashFromHand:1,power:0,program:trashForBattlePower(3e3,"op03-jet-gatling-cost")}],["OP03-097",{cost:0,trashFromHand:1,power:0,program:trashForBattlePower(3e3,"op03-six-king-pistol-cost")}]],trigger:[["OP03-072",{effect:{kind:"add-don",player:"self",count:1,rested:false}}],["OP03-097",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:1},bind:"op03-six-king-pistol-ko",min:0,max:1,effect:{kind:"knock-out",binding:"op03-six-king-pistol-ko"}}]}}]]};var buffLeader=(bind,amount,expiresAfterTurns)=>({kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind,count:1,effect:{kind:"modify-power",binding:bind,amount,expiresAfterTurns}});var st23Mechanics={onPlay:[["ST23-002",{effect:{kind:"if",condition:{kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"Red-Haired Pirates"},{kind:"leader-has-name",player:"self",name:"Uta"}]},then:buffLeader("st23-shanks-leader",2e3,1)}}],["ST23-003",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"st23-beckman-cost",1,{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Red-Haired Pirates"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxPower:4e3},bind:"st23-beckman-ko",min:0,max:1,effect:{kind:"knock-out",binding:"st23-beckman-ko"}}})}}]],activateMain:[["ST23-004",{oncePerTurn:false,requires:{sourceActive:true,activeDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"st23-luffy-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"st23-luffy-debuff",amount:-1e3,expiresAfterTurns:0}}]}}}}],["ST23-005",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"give-rested-don",player:"self",count:1}}}]]};var st01Mechanics={onPlay:[["ST01-011",{effect:{kind:"give-rested-don",player:"self",count:2}}]]};var op02Mechanics={onPlay:[["OP02-013",{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"op02-ace-debuff",min:0,max:2,effect:{kind:"modify-power",binding:"op02-ace-debuff",amount:-3e3,expiresAfterTurns:0}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Whitebeard Pirates"},then:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}}]}}]]};var st02Mechanics={activateMain:[["ST02-007",{oncePerTurn:false,requires:{activeDon:1,sourceActive:true},program:{effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"rest",binding:SOURCE_BINDING},lookAndAdd(5,"st02-bonney-look",{type:"Supernovas"}).effect]}}}]]};var st06Mechanics={onPlay:[["ST06-008",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"st06-hina-cost",min:0,max:1,effect:{kind:"modify-cost",binding:"st06-hina-cost",amount:-4,expiresAfterTurns:0}}}]]};var rampRested2={kind:"add-don",player:"self",count:1,rested:true};var rampActive3={kind:"add-don",player:"self",count:1,rested:false};var bepoRamp={effect:{kind:"if",condition:{kind:"field-don-versus",player:"opponent",operator:"gt"},then:rampRested2}};var kidLeaderBuff={effect:donMinus(1,{kind:"choose",selector:{player:"self",zone:[],includeLeader:true},bind:"st10-kid-leader",min:0,max:1,effect:{kind:"modify-power",binding:"st10-kid-leader",amount:1e3,expiresAfterTurns:1}})};var st10BattleMechanics={whenAttacking:[["ST10-003",{oncePerTurn:false,requires:{fieldDon:1},program:{effect:donMinus(1,{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:0})}}],["ST10-005",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:powerDebuff(2e3,"st10-jinbe-debuff")}}}],["ST10-012",bepoRamp],["ST10-013",kidLeaderBuff]],counterEvent:[["ST10-015",{cost:1,power:2e3,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:2e3},bind:"st10-sumo-slap-ko",min:0,max:1,effect:{kind:"knock-out",binding:"st10-sumo-slap-ko"}}}}]]};var st10MainMechanics={activateMain:[["ST10-001",{oncePerTurn:true,requires:{fieldDon:3},program:{effect:donMinus(3,{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:3e3},bind:"st10-law-bounce",min:0,max:1,effect:{kind:"move",binding:"st10-law-bounce",to:{player:"owner",zone:"deck",position:"bottom"}}},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:4},bind:"st10-law-play",min:0,max:1,effect:{kind:"play",binding:"st10-law-play"}}]})}}],["ST10-002",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"any-of",conditions:[{kind:"field-don",player:"self",operator:"lte",value:0},{kind:"field-don",player:"self",operator:"gte",value:8}]},then:rampActive3}}}]],eventMain:[["ST10-016",{cost:5,program:{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:7e3},bind:"st10-gatling-ko",min:0,max:1,effect:{kind:"knock-out",binding:"st10-gatling-ko"}}}}],["ST10-017",{cost:3,program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2,canRest:true},bind:"st10-punk-vise-rest",min:0,max:1,effect:{kind:"rest",binding:"st10-punk-vise-rest"}},rampRested2]}}}]]};var st10OnPlayMechanics={onPlay:[["ST10-004",{effect:{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",minCurrentPower:5e3},operator:"gte",value:1},then:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}}}],["ST10-008",{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"lte",value:3},then:{kind:"add-don",player:"self",count:2,rested:true}}}],["ST10-009",{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},rampActive3]}}}}],["ST10-012",bepoRamp],["ST10-013",kidLeaderBuff]]};var st10TriggerMechanics={trigger:[["ST10-016",{effect:{kind:"choose",selector:{player:"self",zone:[],includeLeader:true},bind:"st10-gatling-buff",min:0,max:1,effect:{kind:"modify-power",binding:"st10-gatling-buff",amount:1e3,expiresAfterTurns:2}}}],["ST10-017",{effect:rampActive3}]]};var ownBodyAtCost=minimum=>({kind:"selector-count",player:"self",selector:{zone:"board",category:"character",minCost:minimum},operator:"gte",value:1});var blackStrawHat={player:"self",zone:"board",category:"character",color:"Black",type:"Straw Hat Crew"};var raiseStrawHatCost=bind=>({kind:"choose",selector:blackStrawHat,bind,min:0,max:1,effect:{kind:"modify-cost",binding:bind,amount:2,expiresAfterTurns:1}});var robinCostDrop={effect:{kind:"if",condition:ownBodyAtCost(8),then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"st14-robin-drop",min:0,max:1,effect:{kind:"modify-cost",binding:"st14-robin-drop",amount:-5,expiresAfterTurns:0}}}};var st14BattleMechanics={whenAttacking:[["ST14-002",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"source-attached-don",operator:"gte",value:1},ownBodyAtCost(8)]},then:koCostAtMost(4,"st14-usopp-ko")}}}],["ST14-007",robinCostDrop]],counterEvent:[["ST14-014",{cost:1,power:3e3,powerWhen:ownBodyAtCost(8)}]]};var restSelfFor=effect=>({kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},effect]}});var st14MainMechanics={activateMain:[["ST14-004",{oncePerTurn:true,program:{effect:raiseStrawHatCost("st14-jinbe-cost")}}],["ST14-008",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:restSelfFor({kind:"sequence",effects:[raiseStrawHatCost("st14-haredas-cost"),{kind:"if",condition:ownBodyAtCost(8),then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"st14-haredas-trash",min:1,max:1,effect:{kind:"move",binding:"st14-haredas-trash",to:{player:"self",zone:"trash"}}}]}}]})}}],["ST14-011",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:restSelfFor(raiseStrawHatCost("st14-heracles-cost"))}}]],eventMain:[["ST14-015",{cost:2,program:{effect:{kind:"sequence",effects:[buffOwnCardForTurn(3e3,"st14-phoenix-buff"),{kind:"if",condition:ownBodyAtCost(8),then:koCostAtMost(2,"st14-phoenix-ko")}]}}}],["ST14-016",{cost:1,program:{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"st14-crew-cost",min:0,max:1,effect:{kind:"modify-cost",binding:"st14-crew-cost",amount:3,expiresAfterTurns:1}}]}}}]]};var st14OnPlayMechanics={onPlay:[["ST14-003",{effect:{kind:"if",condition:ownBodyAtCost(6),then:koCostAtMost(5,"st14-sanji-ko")}}],["ST14-006",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:6},ownBodyAtCost(8)]},then:{kind:"draw",player:"self",count:1}}}],["ST14-007",robinCostDrop],["ST14-017",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"},then:{kind:"draw",player:"self",count:1}}}]]};var st14TriggerMechanics={trigger:[["ST14-014",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",maxCost:2},bind:"st14-rifle-recur",min:0,max:1,effect:{kind:"move",binding:"st14-rifle-recur",to:{player:"self",zone:"hand"}}}}],["ST14-015",{effect:{kind:"if",condition:ownBodyAtCost(8),then:koCostAtMost(5,"st14-phoenix-trigger-ko")}}],["ST14-016",{effect:koCostAtMost(3,"st14-crew-trigger-ko")}]]};var playSelfBehindLuffy={kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Monkey.D.Luffy"},then:{kind:"play",binding:SOURCE_BINDING}};var drawOneTrashOne2=bind=>({kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind,min:1,max:1,effect:{kind:"move",binding:bind,to:{player:"self",zone:"trash"}}}]});var st29TriggerMechanics={trigger:[["ST29-003",{effect:koCostAtMost(3,"st29-kaku-ko")}],["ST29-004",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"st29-sanji-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"st29-sanji-cost",to:{player:"self",zone:"trash"}},{kind:"play",binding:SOURCE_BINDING}]}}}}],["ST29-005",{effect:playSelfBehindLuffy}],["ST29-008",{effect:playSelfBehindLuffy}],["ST29-009",{effect:playSelfBehindLuffy}],["ST29-007",{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name:"Monkey.D.Luffy"},bind:"st29-chopper-buff",min:0,max:1,effect:{kind:"modify-power",binding:"st29-chopper-buff",amount:2e3,expiresAfterTurns:0}}}],["ST29-012",{effect:{kind:"play",binding:SOURCE_BINDING}}],["ST29-013",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCostFromZoneCount:{player:"either",zone:"life"}},bind:"st29-lucci-ko",min:0,max:1,effect:{kind:"knock-out",binding:"st29-lucci-ko"}}}],["ST29-015",{effect:{kind:"draw",player:"self",count:1}}],["ST29-017",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"st29-iai-trash",min:1,max:1,effect:{kind:"move",binding:"st29-iai-trash",to:{player:"self",zone:"trash"}}}]}}]]};var restByOpponentLife={effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",canRest:true,maxCostFromZoneCount:{player:"opponent",zone:"life"}},bind:"st29-usopp-rest",min:0,max:1,effect:{kind:"rest",binding:"st29-usopp-rest"}}};var st29BattleMechanics={whenAttacking:[["ST29-001",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:drawOneTrashOne2("st29-luffy-leader-trash")}}}],["ST29-002",restByOpponentLife]],counterEvent:[["ST29-015",{cost:1,power:2e3,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:1},then:{kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"st29-raw-heat-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"st29-raw-heat-debuff",amount:-2e3,expiresAfterTurns:0}}}}}],["ST29-016",{cost:1,power:3e3,target:{isLeader:true}}],["ST29-017",{cost:2,power:4e3,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:koCostAtMost(3,"st29-iai-ko")}}}]]};var st29MainMechanics={activateMain:[["ST29-012",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"give-rested-don",player:"self",count:1,name:"Monkey.D.Luffy"}}}],["ST29-014",{oncePerTurn:true,requires:{handCardsMatching:{match:{hasTrigger:true},count:1},restedDon:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",hasTrigger:true},"st29-zoro-cost",1,{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"give-rested-don",player:"self",count:1}]})}}}]],eventMain:[["ST29-016",{cost:1,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Monkey.D.Luffy"},then:{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"st29-kizaru-leader",count:1,effect:{kind:"grant-keyword",binding:"st29-kizaru-leader",keyword:"Unblockable",expiresAfterTurns:0}}}}}]]};var st29OnPlayMechanics={onPlay:[["ST29-002",restByOpponentLife],["ST29-004",lookAndAdd(4,"st29-sanji",{type:"Straw Hat Crew"})]],onKo:[["ST29-007",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"edge"},bind:"st29-chopper-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"st29-chopper-life",to:{player:"self",zone:"hand"}},paidToHand("st29-chopper-life",[{kind:"choose",selector:{player:"self",zone:"hand"},bind:"st29-chopper-bank",min:0,max:1,effect:{kind:"move",binding:"st29-chopper-bank",to:{player:"self",zone:"life",position:"top"}}}])]}}}}]]};var st29ReplacementMechanics={replacement:[["ST29-008",{opponentEffectOnly:true,oncePerTurn:false,protects:{category:"character",type:"Egghead"},label:"Turn 1 of your Life cards face-up",cost:{kind:"turn-life-face-up"}}]]};var sixThousandBody={category:"character",minPower:6e3,maxPower:6e3};var digForSixThousand=bind=>lookAndAdd(5,bind,sixThousandBody);var restDonForRush={kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}]}}};var sixThousandBodies=count2=>({kind:"selector-count",player:"self",selector:{zone:"board",...sixThousandBody},operator:"gte",value:count2});var st30BattleMechanics={whenAttacking:[["ST30-007",{effect:powerDebuff(1e3,"st30-ace-debuff")}]],counterEvent:[["ST30-015",{cost:1,power:4e3,powerWhen:sixThousandBodies(2)}],["ST30-016",{cost:1,power:3e3,program:{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"selector-count",player:"self",selector:{zone:"board",...sixThousandBody,name:"Portgas.D.Ace"},operator:"gte",value:1},{kind:"selector-count",player:"self",selector:{zone:"board",...sixThousandBody,name:"Monkey.D.Luffy"},operator:"gte",value:1}]},then:{kind:"draw",player:"self",count:1}}}}]]};var st30MainMechanics={eventMain:[["ST30-017",{cost:1,program:digForSixThousand("st30-trouble")}]]};var st30OnPlayMechanics={onPlay:[["ST30-002",digForSixThousand("st30-inazuma")],["ST30-004",{effect:{kind:"optional",effect:{kind:"choose",selector:{...sixThousandBody,player:"self",zone:"hand"},bind:"st30-ivankov-reveal",min:2,max:2,effect:{kind:"sequence",effects:[{kind:"reveal",binding:"st30-ivankov-reveal"},{kind:"draw",player:"self",count:3},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"st30-ivankov-trash",min:2,max:2,effect:{kind:"move",binding:"st30-ivankov-trash",to:{player:"self",zone:"trash"}}}]}}}}],["ST30-006",{effect:{kind:"optional",effect:payFromHand({...sixThousandBody,player:"self",zone:"hand"},"st30-jinbe-cost",1,{kind:"draw",player:"self",count:2})}}],["ST30-007",{effect:restDonForRush}],["ST30-010",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",rested:true},bind:"st30-crocodile-lock",min:0,max:1,effect:{kind:"restrict",binding:"st30-crocodile-lock",restriction:"cannot-refresh",expiresAfterTurns:1}}}]],onKo:[["ST30-008",{effect:{kind:"optional",effect:payFromHand({...sixThousandBody,player:"self",zone:"hand"},"st30-marco-cost",1,{kind:"play",binding:SOURCE_BINDING,rested:true})}}]]};var st30ReplacementMechanics={replacement:[["ST30-009",{opponentEffectOnly:true,oncePerTurn:false,removal:"off-field",protects:sixThousandBody,label:"Trash LittleOars Jr. and draw 1 card",cost:{kind:"trash-self-and-draw",draw:1}}],["ST30-011",{opponentEffectOnly:true,oncePerTurn:false,removal:"off-field",protects:sixThousandBody,label:"Rest Buggy",cost:{kind:"rest-self"}}]]};var st30TriggerMechanics={trigger:[["ST30-015",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:6e3},bind:"st30-whitebeard-ko",min:0,max:1,effect:{kind:"knock-out",binding:"st30-whitebeard-ko"}}}],["ST30-017",digForSixThousand("st30-trouble-trigger")]]};var koPowerAtMost3=(maxCurrentPower,bind)=>({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower},bind,min:0,max:1,effect:{kind:"knock-out",binding:bind}});var st21BattleMechanics={whenAttacking:[["ST21-010",{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:2},then:koPowerAtMost3(4e3,"st21-robin-ko")}}],["ST21-012",{effect:{kind:"give-rested-don",player:"self",count:2}}]]};var st21MainMechanics={activateMain:[["ST21-009",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"give-rested-don",player:"self",count:2,type:"Straw Hat Crew"}}}]],eventMain:[["ST21-016",{cost:2,program:{effect:{kind:"sequence",effects:[buffOwnCardForTurn(1e3,"st21-whip-buff"),{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:4e3},bind:"st21-whip-silence",min:0,max:1,effect:{kind:"restrict",binding:"st21-whip-silence",restriction:"cannot-block",expiresAfterTurns:0}}]}}}]]};var st21TriggerMechanics={onKo:[["ST21-004",{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:2},then:{kind:"draw",player:"self",count:1}}}]],trigger:[["ST21-016",{effect:koPowerAtMost3(4e3,"st21-whip-trigger-ko")}]]};var st21Mechanics={activateMain:[["ST21-001",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"st21-luffy-gift",min:0,max:1,effect:{kind:"attach-don",player:"self",from:"rested",count:2,target:{binding:"st21-luffy-gift"}}}}}}]],whenAttacking:[["ST21-014",{effect:{kind:"give-rested-don",player:"self",count:1}}]],onPlay:[["ST21-003",{effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Straw Hat Crew",minCurrentPower:6e3},bind:"st21-003-silencing-target",min:0,max:1,effect:{kind:"grant-keyword",binding:"st21-003-silencing-target",keyword:"Unblockable",expiresAfterTurns:0}}}]],onKo:[["ST21-015",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",color:"Red",maxPower:6e3,excludeName:"Roronoa Zoro"},bind:"st21-015-free-play",min:0,max:1,effect:{kind:"play",binding:"st21-015-free-play"}}}]]};var revealTopWhitebeard=(bind,then)=>({kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind,count:"all",effect:{kind:"reveal",binding:bind}},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"deck",binding:bind,typeIncluding:"Whitebeard Pirates"},operator:"gte",value:1},then}]});var st22BattleMechanics={onOpponentAttack:[["ST22-002",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},drawThenBottom(1,"st22-izo-bottom")]}}}}]],whenAttacking:[["ST22-012",{effect:revealTopWhitebeard("st22-marco-top",{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:1})}]],counterEvent:[["ST22-016",{cost:1,power:0,program:{effect:revealTopWhitebeard("st22-take-back-top",{kind:"battle-power",player:"self",amount:4e3})}}]]};var buffLeader2=(bind,amount,expiresAfterTurns)=>({kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind,count:1,effect:{kind:"modify-power",binding:bind,amount,expiresAfterTurns}});var st22MainMechanics={activateMain:[["ST22-001",{oncePerTurn:true,requires:{handCardsMatching:{match:{typeIncluding:"Whitebeard Pirates"},count:1}},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand",typeIncluding:"Whitebeard Pirates"},bind:"st22-leader-reveal",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"reveal",binding:"st22-leader-reveal"},{kind:"draw",player:"self",count:1},{kind:"move",binding:"st22-leader-reveal",to:{player:"self",zone:"deck",position:"top"}}]}}}}}],["ST22-005",{oncePerTurn:true,requires:{activeDon:3,sourceRested:true},program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",excludeSource:true},operator:"gte",value:1},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",excludeSource:true},bind:"st22-oden-return",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:3},{kind:"move",binding:"st22-oden-return",to:{player:"owner",zone:"hand"}},{kind:"update",binding:SOURCE_BINDING,rested:false}]}}}}}}],["ST22-007",{oncePerTurn:true,requires:{restedDon:1},program:{effect:revealTopWhitebeard("st22-squard-top",{kind:"give-rested-don",player:"self",count:1})}}]],eventMain:[["ST22-015",{cost:8,program:{effect:{kind:"sequence",effects:[{kind:"if",condition:whitebeardLeader,then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",name:"Edward.Newgate"},bind:"st22-whitebeard-play",min:0,max:1,effect:{kind:"play",binding:"st22-whitebeard-play"}}},lifeToHandCost(buffLeader2("st22-whitebeard-buff",2e3,1)).effect]}}}],["ST22-017",{cost:5,program:{effect:revealTwoWhitebeard("st22-fire-fist-reveal",{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:5},bind:"st22-fire-fist-bury",min:0,max:1,effect:{kind:"move",binding:"st22-fire-fist-bury",to:{player:"owner",zone:"deck",position:"bottom"}}}]})}}]]};var st22OnPlayMechanics={onPlay:[["ST22-002",lookAndAdd(5,"st22-izo",{typeIncluding:"Whitebeard Pirates",excludeName:"Izo"})],["ST22-003",{effect:revealTopWhitebeard("st22-newgate-top",{kind:"draw",player:"self",count:2})}],["ST22-006",{effect:revealTopWhitebeard("st22-jozu-top",{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"st22-jozu-discard",min:1,max:1,effect:{kind:"move",binding:"st22-jozu-discard",to:{player:"self",zone:"trash"}}}]})}],["ST22-011",{effect:{kind:"if",condition:{kind:"turn-player",player:"self"},then:revealTwoWhitebeard("st22-whitey-reveal",{kind:"select",selector:{player:"self",zone:[],includeLeader:true,typeIncluding:"Whitebeard Pirates"},bind:"st22-whitey-buff",count:1,effect:{kind:"modify-power",binding:"st22-whitey-buff",amount:2e3,expiresAfterTurns:0}})}}]]};var st22ReplacementMechanics={replacement:[["ST22-005",{opponentEffectOnly:true,oncePerTurn:false,removal:"off-field",label:"Trash 2 from hand",cost:{kind:"trash-from-hand",count:2}}],["ST22-012",{opponentEffectOnly:true,oncePerTurn:true,label:"Trash 1 from hand",cost:{kind:"trash-from-hand",count:1}}]]};var st22TriggerMechanics={trigger:[["ST22-016",{effect:{kind:"draw",player:"self",count:1}}],["ST22-017",{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:3},bind:"st22-fire-fist-bounce",min:0,max:1,effect:{kind:"move",binding:"st22-fire-fist-bounce",to:{player:"owner",zone:"hand"}}}}]]};var buryCost=effect=>({kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"deck",position:"bottom"}},effect]}});var sortFiveDeep=bind=>({effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind},{kind:"select",selector:{player:"self",zone:"deck",binding:bind},bind:`${bind}-order`,count:"all",effect:{kind:"order-to-bottom",binding:`${bind}-order`,to:{player:"self",zone:"deck",position:"top"},alternate:{player:"self",zone:"deck",position:"bottom"}}}]}});var silenceBlockers={kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Unblockable",expiresAfterTurns:0};var withDon2=(count2,then)=>({kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:count2},then});var promoBattleMechanics={whenAttacking:[["P-075",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",minCost:8},operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"p075-discard",min:1,max:1,effect:{kind:"move",binding:"p075-discard",to:{player:"self",zone:"trash"}}}]}}}}],["P-019",{oncePerTurn:false,program:{effect:withDon2(1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:3e3},bind:"p019-ko",min:0,max:1,effect:{kind:"knock-out",binding:"p019-ko"}})}}],["P-026",{effect:costDebuff(3,"p026-debuff")}],["P-035",{oncePerTurn:false,requires:{handCards:1},program:{effect:withDon2(1,{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"p035-cost",1,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",minCost:0,maxCost:0},bind:"p035-ko",min:0,max:1,effect:{kind:"knock-out",binding:"p035-ko"}})})}}],["P-036",{oncePerTurn:false,requires:{lifeCardsMatching:{match:{},count:1}},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"edge"},bind:"p036-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"p036-life",to:{player:"self",zone:"hand"}},paidToHand("p036-life",[{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:0},{kind:"choose",selector:{player:"self",zone:[],includeLeader:true},bind:"p036-leader",min:0,max:1,effect:{kind:"modify-power",binding:"p036-leader",amount:1e3,expiresAfterTurns:0}}])]}}}}}],["P-037",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",rested:true},operator:"gte",value:2},then:{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:0}}}],["P-047",{oncePerTurn:false,program:{effect:withDon2(1,{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:3},then:{kind:"draw",player:"self",count:1}})}}],["P-048",{oncePerTurn:false,program:{effect:withDon2(1,{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"gte",value:4},then:{kind:"choose",selector:{player:"opponent",zone:"hand"},bind:"p048-bury",chooser:"opponent",min:1,max:1,effect:{kind:"order-to-bottom",binding:"p048-bury",to:{player:"opponent",zone:"deck",position:"bottom"}}}})}}],["P-051",{oncePerTurn:false,requires:{handCards:1},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"p051-fuel",min:1,max:10,effect:{kind:"sequence",effects:[{kind:"move",binding:"p051-fuel",to:{player:"self",zone:"trash"}},{kind:"battle-power",player:"self",amount:1e3,perCard:"p051-fuel"}]}}}}}],["P-065",{effect:{kind:"if",condition:{kind:"selector-count",player:"opponent",selector:{zone:"board",category:"character",minCost:0,maxCost:0},operator:"gte",value:1},then:{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:1}}}],["P-083",{oncePerTurn:false,requires:{handCardsMatching:{match:{category:"character"},count:1}},program:{effect:withDon2(1,{kind:"optional",effect:payFromHand({player:"self",zone:"hand",category:"character"},"p083-cost",1,{kind:"sequence",effects:[powerDebuff(1e3,"p083-debuff"),{kind:"draw",player:"self",count:1}]})})}}],["P-092",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Navy"},then:{kind:"set-leader-base-power",player:"self",value:7e3,expiresAfterTurns:1}}}],["P-097",{effect:silenceBlockers}],["P-099",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:10},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:10},{kind:"update",binding:SOURCE_BINDING,rested:false}]}}}}}],["P-100",{effect:{kind:"select",selector:{player:"opponent",zone:"board",includeLeader:true},bind:"p100-negate",count:"all",effect:{kind:"negate",binding:"p100-negate",expiresAfterTurns:0}}}],["P-155",{oncePerTurn:false,requires:{handCardsMatching:{match:{hasTrigger:true},count:1}},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",hasTrigger:true},"p155-cost",1,powerDebuff(2e3,"p155-debuff"))}}}]],counterEvent:[["P-059",{cost:2,power:0,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Uta"},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"p059-return",min:1,max:10,effect:{kind:"sequence",effects:[{kind:"move",binding:"p059-return",to:{player:"owner",zone:"hand"}},{kind:"battle-power",player:"self",amount:2e3,perCard:"p059-return"}]}}}}}}]]};var ifUtaLeader=effect=>({kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Uta"},then:effect});var handRefresh={effect:{kind:"select",selector:{player:"self",zone:"hand"},bind:"p002-hand",count:"all",effect:{kind:"sequence",effects:[{kind:"move",binding:"p002-hand",to:{player:"self",zone:"deck"}},{kind:"shuffle-deck",player:"self"},{kind:"draw",player:"self",count:0,perCards:{binding:"p002-hand",each:1}}]}}};var utaRestLock={effect:ifUtaLeader(restLock(4,"p057-lock",2))};var utaRefreshAtEndOfTurn={effect:ifUtaLeader({kind:"at-end-of-turn-effect",effect:{kind:"select",selector:{player:"self",zone:"board",category:"character",type:"FILM"},bind:"p058-film",count:"all",effect:{kind:"update",binding:"p058-film",rested:false}}})};var promoMainMechanics={activateMain:[["P-073",{oncePerTurn:true,requires:{lifeCards:1},program:lifeToHandCost({kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:0})}],["P-074",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"hand"}},lookAndReplace(5,"p074-sort",true)]}}}}],["P-005",{oncePerTurn:false,requires:{fieldDon:2},program:{effect:{kind:"if",condition:{kind:"field-don",player:"self",operator:"gte",value:2},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"return-don",player:"self",count:2},{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Banish",expiresAfterTurns:0}]}}}}}],["P-008",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:2,canRest:true},bind:"p008-rest",min:1,max:1,effect:{kind:"rest",binding:"p008-rest"}}]}}}}],["P-011",{oncePerTurn:true,requires:{activeDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"board",category:"character",noBaseEffect:true},bind:"p011-buff",min:0,max:1,effect:{kind:"modify-power",binding:"p011-buff",amount:2e3,expiresAfterTurns:0}}]}}}}],["P-013",{oncePerTurn:false,program:{effect:buryCost(powerDebuff(3e3,"p013-debuff"))}}],["P-033",{oncePerTurn:false,program:{effect:buryCost({kind:"draw",player:"self",count:1})}}],["P-062",{oncePerTurn:true,requires:{lifeCards:1},program:{effect:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4,canRest:true},bind:"p062-rest",min:0,max:1,effect:{kind:"rest",binding:"p062-rest"}},{kind:"modify-power",binding:SOURCE_BINDING,amount:1e3,expiresAfterTurns:0},{kind:"select",selector:{player:"self",zone:"life",position:"top"},bind:"p062-life",count:1,effect:{kind:"move",binding:"p062-life",to:{player:"self",zone:"hand"}}}]}}}],["P-068",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},sortFiveDeep("p068-sort").effect]}}}}],["P-069",{oncePerTurn:true,requires:{restedDon:1},program:{effect:{kind:"give-rested-don",player:"self",count:1}}}],["P-076",{oncePerTurn:true,requires:{handCardsMatching:{match:{type:"Navy"},count:1}},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",type:"Navy"},"p076-cost",1,costDebuff(1,"p076-debuff"))}}}],["P-081",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"hand"}},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",color:"Blue",type:"Cross Guild"},operator:"gte",value:3},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Cross Guild",minCost:5,maxCost:5},bind:"p081-play",min:0,max:1,effect:{kind:"play",binding:"p081-play"}}}]}}}}],["P-091",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Neptunian"},bind:"p091-rush",min:0,max:1,effect:{kind:"grant-keyword",binding:"p091-rush",keyword:"Rush: Character",expiresAfterTurns:0}}]}}}}]],eventMain:[["P-002",{cost:1,program:handRefresh}],["P-024",{cost:2,program:{effect:{kind:"select",selector:{player:"self",zone:"board",category:"character"},bind:"p024-crew",count:"all",effect:{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"p024-leader",count:1,effect:{kind:"modify-power",binding:"p024-leader",amount:1e3,expiresAfterTurns:0,perCards:{binding:"p024-crew",each:1}}}}}}],["P-057",{cost:3,program:utaRestLock}],["P-058",{cost:2,program:utaRefreshAtEndOfTurn}],["P-060",{cost:2,program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,name:"Uta",rested:false},bind:"p060-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:"p060-cost"},{kind:"rest-opponent-cards",player:"opponent",count:2,donOnly:true}]}}}}}]]};var promoOnPlayMechanics={onPlay:[["P-063",{effect:restCostAtMost(1,"p063-rest")}],["P-075",{effect:{kind:"give-rested-don",player:"self",count:1}}],["P-009",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:6},then:{kind:"select",selector:{player:"opponent",zone:"life",position:"top"},bind:"p009-life",count:1,effect:{kind:"move",binding:"p009-life",to:{player:"opponent",zone:"hand"}}}}}],["P-017",{effect:powerDebuff(2e3,"p017-debuff")}],["P-020",{effect:buffOwnCardForTurn(1e3,"p020-buff")}],["P-031",{effect:{kind:"add-don",player:"self",count:1,rested:true}}],["P-043",{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:3},bind:"p043-bounce",min:0,max:1,effect:{kind:"move",binding:"p043-bounce",to:{player:"owner",zone:"hand"}}}}],["P-046",{effect:{kind:"optional",effect:{kind:"select",selector:{player:"self",zone:"hand"},bind:"p046-hand",count:"all",effect:{kind:"sequence",effects:[{kind:"order-to-bottom",binding:"p046-hand",to:{player:"self",zone:"deck",position:"bottom"}},{kind:"draw",player:"self",count:0,perCards:{binding:"p046-hand",each:1}}]}}}}],["P-049",sortFiveDeep("p049-sort")],["P-053",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:3},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:3},bind:"p053-bounce",min:0,max:1,effect:{kind:"move",binding:"p053-bounce",to:{player:"owner",zone:"hand"}}}}}],["P-055",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"p055-cost",2,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"p055-bury",chooser:"opponent",min:1,max:1,effect:{kind:"move",binding:"p055-bury",to:{player:"owner",zone:"deck",position:"bottom"}}})}}],["P-056",{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:2},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:2},{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:5},bind:"p056-bounce",min:0,max:1,effect:{kind:"move",binding:"p056-bounce",to:{player:"owner",zone:"hand"}}}]}}}}],["P-082",{effect:{kind:"if",condition:{kind:"any-of",conditions:[{kind:"leader-has-type",player:"self",type:"Cross Guild"},{kind:"leader-type-including",player:"self",text:"Baroque Works"}]},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:2e3},bind:"p082-bury",min:0,max:1,effect:{kind:"move",binding:"p082-bury",to:{player:"owner",zone:"deck",position:"bottom"}}}}}],["P-091",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:5,anyOf:[{type:"Neptunian"},{type:"Fish-Man Island"}]},bind:"p091-play",min:0,max:1,effect:{kind:"play",binding:"p091-play"}}}],["P-097",{effect:silenceBlockers}],["P-098",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",minCost:5},operator:"lte",value:4},then:{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"deck",position:"bottom"}}}}],["P-102",{effect:{kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"},then:{kind:"activate-don",player:"self",count:2}}}],["P-103",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"p103-back",min:2,max:2,effect:{kind:"order-to-bottom",binding:"p103-back",to:{player:"self",zone:"deck",position:"bottom"}}},{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"}]}}],["P-107",{effect:{kind:"if",condition:{kind:"any-of",conditions:[{kind:"field-don",player:"self",operator:"gte",value:10},{kind:"field-don",player:"opponent",operator:"gte",value:10}]},then:{kind:"select",selector:{player:"self",zone:[],includeLeader:true},bind:"p107-leader",count:1,effect:{kind:"modify-power",binding:"p107-leader",amount:2e3,expiresAfterTurns:1}}}}],["P-112",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Nami"},then:{kind:"sequence",effects:[{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:2},bind:"p112-play",min:0,max:1,effect:{kind:"play",binding:"p112-play"}}]}}}],["P-115",{effect:{kind:"give-rested-don",player:"self",count:1}}],["P-072",{effect:restCostAtMost(4,"p072-rest")}],["P-084",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Cross Guild",maxCost:6},bind:"p084-play",min:0,max:1,effect:{kind:"play",binding:"p084-play"}}}],["P-093",{effect:{kind:"if",condition:{kind:"field-don-versus",player:"self",operator:"lte"},then:{kind:"add-don",player:"self",count:1,rested:true}}}],["P-152",{effect:{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:"board",includeLeader:true},bind:"p152-team",count:"all",effect:{kind:"modify-power",binding:"p152-team",amount:2e3,expiresAfterTurns:0}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:3e3},bind:"p152-ko",min:0,max:1,effect:{kind:"knock-out",binding:"p152-ko"}}]}}],["P-153",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"p153-debuff",min:0,max:2,effect:{kind:"modify-power",binding:"p153-debuff",amount:-3e3,expiresAfterTurns:0}}}],["P-154",{effect:{kind:"if",condition:{kind:"all-of",conditions:[{kind:"leader-has-name",player:"self",name:"Portgas.D.Ace"},{kind:"active-don",player:"self",operator:"gte",value:3}]},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:3},{kind:"choose",selector:{player:"self",zone:"hand",category:"character",name:"Portgas.D.Ace",maxPower:8e3},bind:"p154-play",min:0,max:1,effect:{kind:"play",binding:"p154-play"}}]}}}}]],onKo:[["P-072",{effect:restCostAtMost(4,"p072-ko-rest")}],["P-030",{effect:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:3},bind:"p030-bury",min:0,max:1,effect:{kind:"move",binding:"p030-bury",to:{player:"owner",zone:"deck",position:"bottom"}}}}],["P-071",{effect:{kind:"optional",effect:{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"hand"}}}}]]};var promoReplacementMechanics={replacement:[["P-111",{opponentEffectOnly:true,oncePerTurn:true,removal:"off-field",protects:{category:"character",type:"Straw Hat Crew"},label:"Rest 1 DON!!",cost:{kind:"rest-don",count:1}}]]};var promoTriggerMechanics={trigger:[["P-002",handRefresh],["P-014",{effect:{kind:"play",binding:SOURCE_BINDING}}],["P-024",{effect:buffOwnCardForTurn(1e3,"p024-trigger-buff")}],["P-042",{effect:koCostAtMost(4,"p042-ko")}],["P-057",utaRestLock],["P-058",{effect:{kind:"select",selector:{player:"self",zone:"board",category:"character",type:"FILM"},bind:"p058-trigger-film",count:"all",effect:{kind:"update",binding:"p058-trigger-film",rested:false}}}],["P-106",{effect:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},koCostAtMost(2,"p106-ko")]}}],["P-113",{effect:koCostAtMost(3,"p113-ko")}],["P-115",{effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",color:"Yellow",maxPower:5e3,hasTrigger:true},bind:"p115-play",min:0,max:1,effect:{kind:"play",binding:"p115-play"}}}],["P-155",{effect:{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"lte",value:3},then:{kind:"play",binding:SOURCE_BINDING}}}]],onEndOfYourTurn:[["P-010",{effect:{kind:"add-don",player:"self",count:1,rested:false}}],["P-029",{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"FILM",excludeName:"Bartolomeo",rested:true},bind:"p029-wake",min:0,max:1,effect:{kind:"update",binding:"p029-wake",rested:false}}]}}}],["P-079",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character",type:"ODYSSEY",rested:true},operator:"gte",value:2},then:{kind:"update",binding:SOURCE_BINDING,rested:false}}}],["P-106",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"top",faceUp:false},bind:"p106-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:"p106-cost",faceUp:true},{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:"Egghead",rested:true},bind:"p106-wake",min:0,max:1,effect:{kind:"update",binding:"p106-wake",rested:false}}]}}}}]]};var utaLeader={kind:"leader-has-name",player:"self",name:"Uta"};var FILM="FILM";var restToBottom=bind=>({kind:"select",selector:{player:"self",zone:"deck",binding:bind},bind:`${bind}-rest`,count:"all",effect:{kind:"order-to-bottom",binding:`${bind}-rest`,to:{player:"self",zone:"deck",position:"bottom"}}});var st11Mechanics={whenAttacking:[["ST11-001",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:1,bind:"st11-uta-dig"},{kind:"reveal",binding:"st11-uta-dig"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"st11-uta-dig",type:FILM},bind:"st11-uta-dig-add",min:0,max:1,effect:{kind:"move",binding:"st11-uta-dig-add",to:{player:"self",zone:"hand"}}},restToBottom("st11-uta-dig")]}}}}]],onEndOfYourTurn:[["ST11-002",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"hand",category:"event"},operator:"gte",value:1},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand",category:"event"},bind:"st11-uta-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"st11-uta-cost",to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:FILM,rested:true},bind:"st11-uta-refresh",min:0,max:1,effect:{kind:"update",binding:"st11-uta-refresh",rested:false}}]}}}}}]],eventMain:[["ST11-003",{cost:2,program:{effect:{kind:"if",condition:utaLeader,then:restOrKoCostAtMost(5,"st11-backlight")}}}],["ST11-004",{cost:1,program:{effect:{kind:"if",condition:utaLeader,then:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:3,bind:"st11-genesis"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"st11-genesis",type:FILM,excludeName:"New Genesis"},bind:"st11-genesis-add",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"reveal",binding:"st11-genesis-add"},{kind:"move",binding:"st11-genesis-add",to:{player:"self",zone:"hand"}}]}},restToBottom("st11-genesis"),{kind:"activate-don",player:"self",count:1}]}}}}],["ST11-005",{cost:3,program:{effect:{kind:"choose",selector:{player:"self",zone:[],includeLeader:true,name:"Uta",rested:true},bind:"st11-invincible",min:0,max:1,effect:{kind:"update",binding:"st11-invincible",rested:false}}}}]],trigger:[["ST11-005",{effect:{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true},bind:"st11-invincible-buff",min:0,max:1,effect:{kind:"modify-power",binding:"st11-invincible-buff",amount:1e3,expiresAfterTurns:0}}}]]};var revealAndPlayCostTwo=(bind,rested=false)=>revealTopThen(bind,{kind:"choose",selector:{player:"self",zone:"deck",binding:bind,category:"character",minCost:2,maxCost:2},bind:`${bind}-play`,min:0,max:1,effect:{kind:"play",binding:`${bind}-play`,...rested?{rested}:{}}});var restLeaderOrCharacterAtFour=bind=>({kind:"choose",selector:{player:"opponent",zone:"board",includeLeader:true,maxCost:4,canRest:true},bind,min:0,max:1,effect:{kind:"rest",binding:bind}});var st12MainMechanics={activateMain:[["ST12-002",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},restCostAtMost(4,"st12-kuina-rest")]}}}}],["ST12-012",{oncePerTurn:false,program:{effect:{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"hand"}}}}]],eventMain:[["ST12-016",{cost:2,program:{effect:restLeaderOrCharacterAtFour("st12-lion-main")}}]]};var withOneDon=effect=>({kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:1},then:effect});var st12BattleMechanics={whenAttacking:[["ST12-001",{oncePerTurn:true,program:{effect:withOneDon({kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",minCost:2},bind:"st12-leader-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"st12-leader-cost",to:{player:"owner",zone:"hand"}},{kind:"choose",selector:{player:"self",zone:"board",category:"character",maxCurrentPower:7e3,rested:true},bind:"st12-leader-refresh",min:0,max:1,effect:{kind:"update",binding:"st12-leader-refresh",rested:false}}]}}})}}],["ST12-006",{oncePerTurn:false,program:{effect:withOneDon(restOrKoCostAtMost(2,"st12-yosaku"))}}],["ST12-008",{oncePerTurn:false,program:{effect:withOneDon(restCostAtMost(6,"st12-zoro-rest"))}}],["ST12-010",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:6},then:{kind:"draw",player:"self",count:1}}}}],["ST12-011",{oncePerTurn:false,program:{effect:withOneDon({kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:5},then:{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:1}})}}],["ST12-013",{oncePerTurn:false,program:{effect:revealAndPlayCostTwo("st12-zeff-reveal",true)}}]],counterEvent:[["ST12-016",{cost:2,power:0,program:{effect:restLeaderOrCharacterAtFour("st12-lion-counter")}}],["ST12-017",{cost:1,power:2e3,program:{effect:revealAndPlayCostTwo("st12-surgery-reveal")}}]]};var st12OnPlayMechanics={onPlay:[["ST12-003",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"board",category:"character"},operator:"lte",value:2},then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",maxCost:4,excludeName:"Dracule Mihawk",anyOf:[{type:"Muggy Kingdom"},{attribute:"Slash"}]},bind:"st12-mihawk-play",min:0,max:1,effect:{kind:"play",binding:"st12-mihawk-play",rested:true}}}}],["ST12-007",{effect:{kind:"if",condition:{kind:"active-don",player:"self",operator:"gte",value:2},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest-don",player:"self",count:2},{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"life",operator:"gte",value:3},then:{kind:"choose",selector:{player:"self",zone:"board",category:"character",attribute:"Slash",maxCost:4,rested:true},bind:"st12-rika-refresh",min:0,max:1,effect:{kind:"update",binding:"st12-rika-refresh",rested:false}}}]}}}}],["ST12-010",{effect:revealAndPlayCostTwo("st12-ivankov-play")}],["ST12-013",{effect:lookAndReplace(3,"st12-zeff-look",true)}],["ST12-014",{effect:lookAndReplace(3,"st12-duval-look",true)}]]};var st12TriggerMechanics={trigger:[["ST12-002",{effect:{kind:"play",binding:SOURCE_BINDING}}],["ST12-016",{effect:restLeaderOrCharacterAtFour("st12-lion-trigger")}]]};var BROTHERS=["Sabo","Portgas.D.Ace","Monkey.D.Luffy"];var hasLife={kind:"zone-count",player:"self",zone:"life",operator:"gte",value:1};var restBackIntoLife=bind=>({kind:"select",selector:{player:"self",zone:"life",binding:bind},bind:`${bind}-back`,count:"all",effect:{kind:"order-to-bottom",binding:`${bind}-back`,to:{player:"self",zone:"life",position:"bottom"}}});var readLifeAndBankOne=bind=>({kind:"sequence",effects:[{kind:"look-at",player:"self",count:"all",bind,zone:"life"},{kind:"choose",selector:{player:"self",zone:"life",binding:bind},bind:`${bind}-deck`,min:1,max:1,effect:{kind:"move",binding:`${bind}-deck`,to:{player:"self",zone:"deck",position:"top"}}},restBackIntoLife(bind)]});var revealLifeAndPlayBrother=(name,bind,sourceBinding)=>({kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:sourceBinding,to:{player:"owner",zone:"trash"}},{kind:"look-at",player:"self",count:1,bind,zone:"life"},{kind:"reveal",binding:bind},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"life",binding:bind,name,minCost:5,maxCost:5},operator:"gte",value:1},then:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"play",binding:bind},{kind:"choose",selector:{player:"self",zone:[],includeLeader:true},bind:`${bind}-buff`,min:0,max:1,effect:{kind:"modify-power",binding:`${bind}-buff`,amount:2e3,expiresAfterTurns:1}}]}}}]}});var digForABrother=bind=>({kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind},{kind:"choose",selector:{player:"self",zone:"deck",binding:bind,maxCost:5,anyOf:BROTHERS.map(name=>({name}))},bind:`${bind}-add`,min:0,max:1,effect:{kind:"sequence",effects:[{kind:"reveal",binding:`${bind}-add`},{kind:"move",binding:`${bind}-add`,to:{player:"self",zone:"hand"}}]}},{kind:"select",selector:{player:"self",zone:"deck",binding:bind},bind:`${bind}-rest`,count:"all",effect:{kind:"order-to-bottom",binding:`${bind}-rest`,to:{player:"self",zone:"deck",position:"bottom"}}}]});var trashLifeFor=(bind,payoff)=>({kind:"if",condition:hasLife,then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"edge"},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:bind,to:{player:"self",zone:"trash"}},payoff]}}}});var swapTopOfLife=bind=>({kind:"if",condition:hasLife,then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"edge"},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:bind,to:{player:"self",zone:"hand"}},{kind:"choose",selector:{player:"self",zone:"hand"},bind:`${bind}-bank`,min:0,max:1,effect:{kind:"move",binding:`${bind}-bank`,to:{player:"self",zone:"life",position:"top"}}}]}}}});var withDon3=(count2,then)=>({kind:"if",condition:{kind:"source-attached-don",operator:"gte",value:count2},then});var st13MainMechanics={activateMain:[["ST13-001",{oncePerTurn:true,program:{effect:withDon3(1,{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character",minCost:3,minCurrentPower:7e3},bind:"st13-sabo-bank",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"st13-sabo-bank",to:{player:"self",zone:"life",position:"top"},faceUp:true},{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"st13-sabo-buff",min:0,max:1,effect:{kind:"modify-power",binding:"st13-sabo-buff",amount:2e3,expiresAfterTurns:1}}]}}})}}],["ST13-002",{oncePerTurn:true,program:{effect:withDon3(2,{kind:"sequence",effects:[{kind:"look-at",player:"self",count:5,bind:"st13-ace-dig"},{kind:"choose",selector:{player:"self",zone:"deck",binding:"st13-ace-dig",category:"character",minCost:5,maxCost:5},bind:"st13-ace-dig-bank",min:0,max:1,effect:{kind:"move",binding:"st13-ace-dig-bank",to:{player:"self",zone:"life",position:"top"},faceUp:true}},{kind:"select",selector:{player:"self",zone:"deck",binding:"st13-ace-dig"},bind:"st13-ace-dig-rest",count:"all",effect:{kind:"order-to-bottom",binding:"st13-ace-dig-rest",to:{player:"self",zone:"deck",position:"bottom"}}}]})}}],["ST13-003",{oncePerTurn:true,requires:{handCards:1},program:{effect:withDon3(2,{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"st13-luffy-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"st13-luffy-cost",to:{player:"self",zone:"trash"}},{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:0},then:{kind:"choose",selector:{player:"self",zone:["hand","trash"],category:"character",minCost:5,maxCost:5},bind:"st13-luffy-bank",min:0,max:2,effect:{kind:"move",binding:"st13-luffy-bank",to:{player:"self",zone:"life",position:"top"},faceUp:true}}}]}}})}}],...BROTHERS.map((name,index)=>[["ST13-007","ST13-010","ST13-014"][index],{oncePerTurn:false,requires:{lifeCards:1},program:{effect:revealLifeAndPlayBrother(name,`st13-${name.toLowerCase().replaceAll(".","")}-reveal`,SOURCE_BINDING)}}]),["ST13-015",{oncePerTurn:true,program:{effect:{kind:"sequence",effects:[{kind:"modify-power",binding:SOURCE_BINDING,amount:2e3,expiresAfterTurns:1},{kind:"if",condition:hasLife,then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"select",selector:{player:"self",zone:"life",position:"top"},bind:"st13-luffy-burn",count:1,effect:{kind:"move",binding:"st13-luffy-burn",to:{player:"self",zone:"trash"}}}]}}]}}}]],eventMain:[["ST13-019",{cost:1,program:{effect:digForABrother("st13-bond")}}]]};var st13OnPlayMechanics={onPlay:[["ST13-004",{effect:{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:"deck",position:"top"},bind:"st13-newgate-bank",count:1,effect:{kind:"move",binding:"st13-newgate-bank",to:{player:"self",zone:"life",position:"top"}}},readLifeAndBankOne("st13-newgate-read")]}}],["ST13-005",{effect:trashLifeFor("st13-ivankov-cost",{kind:"choose",selector:{player:"self",zone:"hand",category:"character",minCost:5,maxCost:5},bind:"st13-ivankov-bank",min:0,max:1,effect:{kind:"sequence",effects:[{kind:"reveal",binding:"st13-ivankov-bank"},{kind:"move",binding:"st13-ivankov-bank",to:{player:"self",zone:"life",position:"top"}}]}})}],["ST13-006",{effect:{kind:"sequence",effects:BROTHERS.map(name=>({kind:"choose",selector:{player:"self",zone:"hand",category:"character",name,minCost:2,maxCost:2},bind:`st13-dadan-${name.toLowerCase().replaceAll(".","")}`,min:0,max:1,effect:{kind:"play",binding:`st13-dadan-${name.toLowerCase().replaceAll(".","")}`}}))}}],["ST13-008",{effect:trashLifeFor("st13-sabo-ko-cost",{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:5},bind:"st13-sabo-ko",min:0,max:1,effect:{kind:"knock-out",binding:"st13-sabo-ko"}})}],["ST13-009",{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"life",faceUp:true},operator:"gte",value:1},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",faceUp:true},bind:"st13-shanks-hide",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:"st13-shanks-hide",faceUp:false},{kind:"if",condition:{kind:"zone-count",player:"opponent",zone:"hand",operator:"gte",value:7},then:{kind:"select",selector:{player:"opponent",zone:"life",position:"top"},bind:"st13-shanks-burn",count:1,effect:{kind:"move",binding:"st13-shanks-burn",to:{player:"owner",zone:"trash"}}}}]}}}}}],["ST13-011",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:2},then:{kind:"grant-keyword",binding:SOURCE_BINDING,keyword:"Rush",expiresAfterTurns:0}}}],["ST13-012",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"edge"},bind:"st13-makino-take",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"st13-makino-take",to:{player:"self",zone:"hand"}},paidToHand("st13-makino-take",[{kind:"look-at",player:"self",count:"all",bind:"st13-makino-read",zone:"life"},{kind:"select",selector:{player:"self",zone:"life",binding:"st13-makino-read"},bind:"st13-makino-order",count:"all",effect:{kind:"order-to-bottom",binding:"st13-makino-order",to:{player:"self",zone:"life",position:"bottom"}}}])]}}}}}],["ST13-013",{effect:digForABrother("st13-garp")}],["ST13-016",{effect:readLifeAndBankOne("st13-yamato-read")}]]};var st13TriggerMechanics={onEndOfYourTurn:[["ST13-002",{effect:{kind:"select",selector:{player:"self",zone:"life",faceUp:true},bind:"st13-ace-sweep",count:"all",effect:{kind:"move",binding:"st13-ace-sweep",to:{player:"self",zone:"trash"}}}}]],counterEvent:[["ST13-017",{cost:2,power:4e3,program:{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:"all",bind:"st13-flame-read",zone:"life"},restBackIntoLife("st13-flame-read")]}}}],["ST13-018",{cost:1,power:2e3,program:{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"life",operator:"lte",value:0},then:{kind:"draw",player:"self",count:1}}}}]],trigger:[["ST13-017",{effect:swapTopOfLife("st13-flame-swap")}],["ST13-018",{effect:swapTopOfLife("st13-spear-swap")}],["ST13-019",{effect:digForABrother("st13-bond-trigger")}]]};var whitebeardLeader2={kind:"leader-type-including",player:"self",text:"Whitebeard Pirates"};var st15Mechanics={whenAttacking:[["ST15-001",{oncePerTurn:false,program:{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Edward.Newgate"},then:{kind:"restrict-player",player:"self",restriction:"cannot-life-to-hand",expiresAfterTurns:0}}}}]],onPlay:[["ST15-002",{effect:{kind:"give-rested-don",player:"self",count:1}}],["ST15-004",{effect:{kind:"if",condition:whitebeardLeader2,then:{kind:"sequence",effects:[{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"st15-thatch-debuff",min:0,max:1,effect:{kind:"modify-power",binding:"st15-thatch-debuff",amount:-2e3,expiresAfterTurns:0}},{kind:"select",selector:{player:"self",zone:"life",position:"top"},bind:"st15-thatch-life",count:1,effect:{kind:"move",binding:"st15-thatch-life",to:{player:"self",zone:"hand"}}}]}}}]],activateMain:[["ST15-002",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCurrentPower:5e3},bind:"st15-newgate-ko",min:0,max:1,effect:{kind:"knock-out",binding:"st15-newgate-ko"}}]}}}}]],onKo:[["ST15-003",{opponentEffectOnly:true,program:{effect:{kind:"choose",selector:{player:"self",zone:[],includeLeader:true},bind:"st15-kingdew-buff",min:0,max:1,effect:{kind:"modify-power",binding:"st15-kingdew-buff",amount:2e3,expiresAfterTurns:0}}}}]],replacement:[["ST15-005",{opponentEffectOnly:true,oncePerTurn:true,removal:"off-field",label:"Give it −2000 power instead",cost:{kind:"power-penalty",amount:-2e3}}]]};var musicCard={type:"Music"};var st16Mechanics={activateMain:[["ST16-001",{oncePerTurn:true,requires:{handCardsMatching:{match:{type:"FILM"},count:1},restedDon:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand",type:"FILM"},"st16-uta-cost",1,{kind:"give-rested-don",player:"self",count:1})}}}]],onOpponentAttack:[["ST16-002",{oncePerTurn:false,requires:{handCardsMatching:{match:musicCard,count:1}},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{...musicCard,player:"self",zone:"hand"},bind:"st16-gordon",min:1,max:10,effect:{kind:"sequence",effects:[{kind:"move",binding:"st16-gordon",to:{player:"self",zone:"trash"}},{kind:"battle-power",player:"self",amount:1e3,perCard:"st16-gordon"}]}}}}}]]};var WARLORDS="The Seven Warlords of the Sea";var warlordLeader2={kind:"leader-has-type",player:"self",type:WARLORDS};var st17Mechanics={onPlay:[["ST17-001",{effect:{kind:"sequence",effects:[{kind:"look-at",player:"self",count:1,bind:"st17-crocodile"},{kind:"reveal",binding:"st17-crocodile"},{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"deck",binding:"st17-crocodile",type:WARLORDS},operator:"gte",value:1},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"st17-crocodile-back",min:1,max:1,effect:{kind:"move",binding:"st17-crocodile-back",to:{player:"self",zone:"deck",position:"top"}}}]}}]}}],["ST17-002",{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"board",category:"character"},bind:"st17-law-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"st17-law-cost",to:{player:"owner",zone:"hand"}},{kind:"if",condition:warlordLeader2,then:{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:4},bind:"st17-law-bounce",min:0,max:1,effect:{kind:"move",binding:"st17-law-bounce",to:{player:"owner",zone:"hand"}}}}]}}}}],["ST17-003",{effect:lookAndReplace(3,"st17-buggy",false)}],["ST17-004",{effect:{kind:"sequence",effects:[lookAndReplace(3,"st17-hancock",true),{kind:"give-rested-don",player:"self",count:1,type:WARLORDS}]}}]],activateMain:[["ST17-005",{oncePerTurn:true,requires:{handCards:1},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"st17-teach-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"st17-teach-cost",to:{player:"self",zone:"deck",position:"top"}},{kind:"give-rested-don",player:"self",count:2}]}}}}}]]};var NAVY="Navy";var blackNavyInHand={player:"self",zone:"hand",color:"Black",type:NAVY};var blackNavyInHandAtLeast=count2=>({kind:"selector-count",player:"self",selector:{zone:"hand",color:"Black",type:NAVY},operator:"gte",value:count2});var payFromTrash2=(bind,payoff)=>({kind:"if",condition:{kind:"zone-count",player:"self",zone:"trash",operator:"gte",value:1},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"trash"},bind,min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:bind,to:{player:"self",zone:"deck",position:"bottom"}},payoff]}}}});var st19Mechanics={onPlay:[["ST19-001",{effect:{kind:"if",condition:blackNavyInHandAtLeast(1),then:{kind:"optional",effect:{kind:"choose",selector:blackNavyInHand,bind:"st19-smoker-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"st19-smoker-cost",to:{player:"self",zone:"trash"}},{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:4},bind:"st19-smoker-lock",min:0,max:2,effect:{kind:"restrict",binding:"st19-smoker-lock",restriction:"cannot-attack",expiresAfterTurns:1}}]}}}}}],["ST19-002",{effect:{kind:"if",condition:blackNavyInHandAtLeast(2),then:{kind:"optional",effect:{kind:"choose",selector:blackNavyInHand,bind:"st19-sengoku-cost",min:2,max:2,effect:{kind:"sequence",effects:[{kind:"move",binding:"st19-sengoku-cost",to:{player:"self",zone:"trash"}},{kind:"if",condition:{kind:"leader-has-type",player:"self",type:NAVY},then:{kind:"draw",player:"self",count:3}}]}}}}}],["ST19-003",{effect:{kind:"if",condition:{kind:"leader-has-name",player:"self",name:"Smoker"},then:costDebuff(4,"st19-tashigi-debuff")}}]],activateMain:[["ST19-003",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"source-played-this-turn"},then:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:0},bind:"st19-tashigi-trash",min:0,max:1,effect:{kind:"move",binding:"st19-tashigi-trash",to:{player:"owner",zone:"trash"}}}}}}],["ST19-004",{oncePerTurn:true,program:{effect:payFromTrash2("st19-hina-cost",{kind:"give-rested-don",player:"self",count:1})}}],["ST19-005",{oncePerTurn:true,program:{effect:payFromTrash2("st19-garp-cost",costDebuff(1,"st19-garp-debuff"))}}]]};var BIG_MOM="Big Mom Pirates";var topOfOwnLife={player:"self",zone:"life",position:"top"};var hasLife2={kind:"zone-count",player:"self",zone:"life",operator:"gte",value:1};var st20Mechanics={activateMain:[["ST20-001",{oncePerTurn:true,program:{effect:{kind:"if",condition:hasLife2,then:{kind:"optional",effect:{kind:"choose",selector:{...topOfOwnLife,faceUp:false},bind:"st20-katakuri-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:"st20-katakuri-cost",faceUp:true},{kind:"give-rested-don",player:"self",count:1}]}}}}}}]],onPlay:[["ST20-004",{effect:{kind:"if",condition:hasLife2,then:{kind:"optional",effect:{kind:"choose",selector:topOfOwnLife,bind:"st20-pudding-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"move",binding:"st20-pudding-cost",to:{player:"self",zone:"hand"}},{kind:"choose",selector:{player:"self",zone:"board",category:"character",type:BIG_MOM,maxCost:3,rested:true},bind:"st20-pudding-refresh",min:0,max:1,effect:{kind:"update",binding:"st20-pudding-refresh",rested:false}}]}}}}}],["ST20-005",{effect:{kind:"if",condition:{kind:"zone-count",player:"self",zone:"hand",operator:"gte",value:1},then:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"st20-linlin-cost",1,{kind:"choice",chooser:"opponent",branches:[{id:"hand",label:"Trash 2 from hand",effect:{kind:"choose",selector:{player:"opponent",zone:"hand"},chooser:"opponent",bind:"st20-linlin-hand",min:0,max:2,exhaustive:true,effect:{kind:"move",binding:"st20-linlin-hand",to:{player:"owner",zone:"trash"}}}},{id:"life",label:"Trash the top card of your Life cards",effect:{kind:"select",selector:{player:"opponent",zone:"life",position:"top"},bind:"st20-linlin-life",count:1,effect:{kind:"move",binding:"st20-linlin-life",to:{player:"owner",zone:"trash"}}}}]})}}}]],replacement:[["ST20-002",{opponentEffectOnly:false,effectOnly:true,oncePerTurn:true,removal:"ko",label:"Trash the top card of your Life cards",cost:{kind:"trash-life",count:1}}]],trigger:[["ST20-002",{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"st20-cracker-trigger",1,{kind:"play",binding:SOURCE_BINDING})}}],["ST20-003",{effect:{kind:"sequence",effects:[{kind:"choice",branches:[{id:"own-life",label:"Look at the top card of your Life cards",effect:peekLife("self","st20-brulee-own")},{id:"opponent-life",label:"Look at the top card of your opponent's Life cards",effect:peekLife("opponent","st20-brulee-theirs")}]},{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"hand"}}]}}],["ST20-004",{effect:{kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxCost:3,canRest:true},bind:"st20-pudding-trigger",min:0,max:1,effect:{kind:"rest",binding:"st20-pudding-trigger"}}}]]};var st24Mechanics={onPlay:[["ST24-001",{effect:{kind:"if",condition:{kind:"rested-cards",player:"self",operator:"gte",value:6},then:{kind:"sequence",effects:[{kind:"draw",player:"self",count:1},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"st24-bege-trash",min:1,max:1,effect:{kind:"move",binding:"st24-bege-trash",to:{player:"self",zone:"trash"}}}]}}}],["ST24-002",lookAndAdd(5,"st24-kid-killer",{type:"Supernovas"})]],onOpponentAttack:[["ST24-002",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},{kind:"activate-don",player:"self",count:1}]}}}}]],onEndOfYourTurn:[["ST24-003",{effect:{kind:"activate-don",player:"self",count:1}}]]};var buggyLeader={kind:"leader-has-name",player:"self",name:"Buggy"};var st25Mechanics={onPlay:[["ST25-001",{effect:{kind:"if",condition:buggyLeader,then:drawAndDiscard(3,2,"st25-alvida-discard")}}],["ST25-003",{effect:{kind:"sequence",effects:[drawAndDiscard(2,1,"st25-croc-mihawk-discard"),{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Cross Guild",maxCost:4},bind:"st25-croc-mihawk-play",min:0,max:1,effect:{kind:"play",binding:"st25-croc-mihawk-play"}}]}}]],activateMain:[["ST25-004",{oncePerTurn:false,requires:{handCards:1},program:{effect:{kind:"optional",effect:payFromHand({player:"self",zone:"hand"},"st25-buggy-cost",1,{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"owner",zone:"trash"}},{kind:"if",condition:buggyLeader,then:{kind:"choose",selector:{player:"self",zone:"hand",category:"character",type:"Cross Guild",maxCost:6},bind:"st25-buggy-play",min:0,max:1,effect:{kind:"play",binding:"st25-buggy-play"}}}]})}}}]],onKo:[["ST25-005",{effect:{kind:"if",condition:{kind:"all-of",conditions:[buggyLeader,{kind:"zone-count",player:"self",zone:"hand",operator:"lte",value:3}]},then:{kind:"draw",player:"self",count:1}}}]],replacement:[["ST25-003",{opponentEffectOnly:true,oncePerTurn:true,removal:"off-field",protects:{category:"character",type:"Cross Guild"},label:"Trash 1 from hand",cost:{kind:"trash-from-hand",count:1}}]]};var st26LuffyGate={kind:"all-of",conditions:[{kind:"leader-multicolored",player:"self"},{kind:"field-don",player:"opponent",operator:"gte",value:5},{kind:"leader-has-type",player:"self",type:"Straw Hat Crew"}]};var st26LuffyProgram={effect:{kind:"if",condition:st26LuffyGate,then:donMinus(2,{kind:"set-leader-base-power",player:"self",value:7e3,expiresAfterTurns:1})}};var st26Mechanics={onPlay:[["ST26-001",{effect:{kind:"select",selector:{player:"self",zone:"board",category:"character",anyOf:[{name:"San-Gorou"},{name:"Sanji"}]},bind:"st26-soba-mask-return",count:"all",effect:{kind:"move",binding:"st26-soba-mask-return",to:{player:"owner",zone:"hand"}}}}],["ST26-002",{effect:donMinus(2,{kind:"rest-opponent-cards",player:"opponent",count:1,maxCost:1})}],["ST26-003",{effect:donMinus(2,{kind:"add-don",player:"self",count:1,rested:false})}],["ST26-004",{effect:donMinus(2,{kind:"choose",selector:{player:"opponent",zone:"board",category:"character"},bind:"st26-franky-debuff",min:0,max:2,effect:{kind:"modify-power",binding:"st26-franky-debuff",amount:-2e3,expiresAfterTurns:0}})}],["ST26-005",st26LuffyProgram]],whenAttacking:[["ST26-005",{oncePerTurn:false,program:st26LuffyProgram}]]};var op04Mechanics={onPlay:[["OP04-083",{effect:{kind:"sequence",effects:[{kind:"select",selector:{player:"self",zone:"board",category:"character"},bind:"op04-sabo-protected",count:"all",effect:{kind:"restrict",binding:"op04-sabo-protected",restriction:"effect-ko-immune",expiresAfterTurns:1}},{kind:"draw",player:"self",count:2},{kind:"choose",selector:{player:"self",zone:"hand"},bind:"op04-sabo-discard",min:2,max:2,effect:{kind:"move",binding:"op04-sabo-discard",to:{player:"self",zone:"trash"}}}]}}]]};var ifBlackbeardLeader2=effect=>({kind:"if",condition:{kind:"leader-has-type",player:"self",type:"Blackbeard Pirates"},then:effect});var st27Mechanics={onPlay:[["ST27-004",{effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"st27-wolf-cost",min:1,max:1,effect:{kind:"move",binding:"st27-wolf-cost",to:{player:"self",zone:"trash"}}}}]],activateMain:[["ST27-001",{oncePerTurn:true,program:{effect:{kind:"if",condition:{kind:"selector-count",player:"self",selector:{zone:"stage",name:"Fullalead",rested:false},operator:"gte",value:1},then:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"stage",name:"Fullalead",rested:false},bind:"st27-pizarro-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"rest",binding:"st27-pizarro-cost"},ifBlackbeardLeader2({kind:"modify-power",binding:SOURCE_BINDING,amount:4e3,expiresAfterTurns:0})]}}}}}}],["ST27-002",{oncePerTurn:false,program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"}},ifBlackbeardLeader2(costDebuff(1,"st27-devon-cost"))]}}}}],["EB01-048",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},costDebuff(4,"eb01-laboon-cost")]}}}}],["ST27-005",{oncePerTurn:false,requires:{sourceActive:true},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"either",zone:"board",category:"character",maxCost:3},bind:"st27-teach-ko",min:0,max:1,effect:{kind:"knock-out",binding:"st27-teach-ko"}}]}}}}]],onKo:[["ST27-001",{effect:{kind:"draw",player:"self",count:1}}],["ST27-002",{effect:{kind:"draw",player:"self",count:1}}],["ST27-003",{effect:{kind:"choose",selector:{player:"self",zone:"trash",category:"character",type:"Blackbeard Pirates",maxCost:5},bind:"st27-kuzan-revive",min:0,max:1,effect:{kind:"play",binding:"st27-kuzan-revive",rested:true}}}],["ST27-005",{effect:{kind:"choose",selector:{player:"self",zone:"trash",color:"Black"},bind:"st27-teach-recur",min:0,max:1,effect:{kind:"move",binding:"st27-teach-recur",to:{player:"self",zone:"hand"}}}}],["PRB02-015",{effect:ifBlackbeardLeader2({kind:"choose",selector:{player:"opponent",zone:"board",category:"character",maxBaseCost:4},bind:"prb02-shiryu-ko",min:0,max:1,effect:{kind:"knock-out",binding:"prb02-shiryu-ko"}})}]]};var stMainMechanics={activateMain:[["ST30-014",{oncePerTurn:false,requires:{sourceActive:true,restedDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"choose",selector:{player:"self",zone:"board",category:"character",minPower:6e3,maxPower:6e3},bind:"st30-mr3-gift",min:0,max:2,effect:{kind:"attach-don",player:"self",from:"rested",count:2,target:{binding:"st30-mr3-gift",each:true}}}]}}}}],["ST31-005",{oncePerTurn:false,requires:{sourceActive:true,restedDon:1},program:{effect:{kind:"optional",effect:{kind:"sequence",effects:[{kind:"rest",binding:SOURCE_BINDING},{kind:"give-rested-don",player:"self",count:1,name:"Monkey.D.Luffy"}]}}}}],["ST36-005",{oncePerTurn:true,requires:{restedDon:1,lifeCardsMatching:{match:{position:"edge",faceUp:false},count:1}},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"edge",faceUp:false},bind:"st36-kid-life",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:"st36-kid-life",faceUp:true},{kind:"attach-don",player:"self",from:"rested",count:1,target:"leader"}]}}}}}]],onPlay:[["ST31-005",lookAndAdd(5,"st31-sunny-look",{type:"Straw Hat Crew"})]],onOpponentAttack:[["ST36-005",{oncePerTurn:true,requires:{lifeCardsMatching:{match:{position:"edge",faceUp:true},count:1}},program:{effect:{kind:"optional",effect:{kind:"choose",selector:{player:"self",zone:"life",position:"edge",faceUp:true},bind:"st36-kid-redirect-cost",min:1,max:1,effect:{kind:"sequence",effects:[{kind:"update",binding:"st36-kid-redirect-cost",faceUp:false},{kind:"choose",selector:{player:"self",zone:"board",includeLeader:true,excludeAttackTarget:true,name:'Eustass"Captain"Kid',minPower:5e3},bind:"st36-kid-redirect",min:1,max:1,effect:{kind:"redirect-attack",binding:"st36-kid-redirect"}}]}}}}}]]};var registries=mergeSetMechanics([{name:"format",mechanics:formatMechanics},{name:"st18",mechanics:st18Mechanics},{name:"op03",mechanics:op03Mechanics},{name:"st23",mechanics:st23Mechanics},{name:"st01",mechanics:st01Mechanics},{name:"op02",mechanics:op02Mechanics},{name:"st02",mechanics:st02Mechanics},{name:"st06",mechanics:st06Mechanics},{name:"st10-on-play",mechanics:st10OnPlayMechanics},{name:"st10-main",mechanics:st10MainMechanics},{name:"st10-battle",mechanics:st10BattleMechanics},{name:"st10-triggers",mechanics:st10TriggerMechanics},{name:"st14-on-play",mechanics:st14OnPlayMechanics},{name:"st14-main",mechanics:st14MainMechanics},{name:"st14-battle",mechanics:st14BattleMechanics},{name:"st14-triggers",mechanics:st14TriggerMechanics},{name:"st29-on-play",mechanics:st29OnPlayMechanics},{name:"st29-main",mechanics:st29MainMechanics},{name:"st29-battle",mechanics:st29BattleMechanics},{name:"st29-triggers",mechanics:st29TriggerMechanics},{name:"st29-replacements",mechanics:st29ReplacementMechanics},{name:"st30-on-play",mechanics:st30OnPlayMechanics},{name:"st30-main",mechanics:st30MainMechanics},{name:"st30-battle",mechanics:st30BattleMechanics},{name:"st30-triggers",mechanics:st30TriggerMechanics},{name:"st30-replacements",mechanics:st30ReplacementMechanics},{name:"st21",mechanics:st21Mechanics},{name:"st21-main",mechanics:st21MainMechanics},{name:"st21-battle",mechanics:st21BattleMechanics},{name:"st21-triggers",mechanics:st21TriggerMechanics},{name:"st22-on-play",mechanics:st22OnPlayMechanics},{name:"st22-main",mechanics:st22MainMechanics},{name:"st22-battle",mechanics:st22BattleMechanics},{name:"st22-triggers",mechanics:st22TriggerMechanics},{name:"st22-replacements",mechanics:st22ReplacementMechanics},{name:"promo-on-play",mechanics:promoOnPlayMechanics},{name:"promo-main",mechanics:promoMainMechanics},{name:"promo-battle",mechanics:promoBattleMechanics},{name:"promo-triggers",mechanics:promoTriggerMechanics},{name:"promo-replacements",mechanics:promoReplacementMechanics},{name:"st11",mechanics:st11Mechanics},{name:"st12-on-play",mechanics:st12OnPlayMechanics},{name:"st12-main",mechanics:st12MainMechanics},{name:"st12-battle",mechanics:st12BattleMechanics},{name:"st12-triggers",mechanics:st12TriggerMechanics},{name:"st13-on-play",mechanics:st13OnPlayMechanics},{name:"st13-main",mechanics:st13MainMechanics},{name:"st13-triggers",mechanics:st13TriggerMechanics},{name:"st15",mechanics:st15Mechanics},{name:"st16",mechanics:st16Mechanics},{name:"st17",mechanics:st17Mechanics},{name:"st19",mechanics:st19Mechanics},{name:"st20",mechanics:st20Mechanics},{name:"st24",mechanics:st24Mechanics},{name:"st25",mechanics:st25Mechanics},{name:"st26",mechanics:st26Mechanics},{name:"op04",mechanics:op04Mechanics},{name:"st27",mechanics:st27Mechanics},{name:"st-main",mechanics:stMainMechanics},{name:"op07-on-play",mechanics:op07OnPlayMechanics},{name:"op07-main",mechanics:op07MainMechanics},{name:"op07-battle",mechanics:op07BattleMechanics},{name:"op07-triggers",mechanics:op07TriggerMechanics},{name:"op07-replacements",mechanics:op07ReplacementMechanics},{name:"op08-on-play",mechanics:op08OnPlayMechanics},{name:"op08-main",mechanics:op08MainMechanics},{name:"op08-battle",mechanics:op08BattleMechanics},{name:"op08-triggers",mechanics:op08TriggerMechanics},{name:"op08-replacements",mechanics:op08ReplacementMechanics},{name:"op09-on-play",mechanics:op09OnPlayMechanics},{name:"op09-main",mechanics:op09MainMechanics},{name:"op09-battle",mechanics:op09BattleMechanics},{name:"op09-triggers",mechanics:op09TriggerMechanics},{name:"op09-replacements",mechanics:op09ReplacementMechanics},{name:"op10-on-play",mechanics:op10OnPlayMechanics},{name:"op10-main",mechanics:op10MainMechanics},{name:"op10-battle",mechanics:op10BattleMechanics},{name:"op10-triggers",mechanics:op10TriggerMechanics},{name:"op10-replacements",mechanics:op10ReplacementMechanics},{name:"op11-on-play",mechanics:op11OnPlayMechanics},{name:"op11-main",mechanics:op11MainMechanics},{name:"op11-battle",mechanics:op11BattleMechanics},{name:"op11-triggers",mechanics:op11TriggerMechanics},{name:"op11-replacements",mechanics:op11ReplacementMechanics},{name:"op12-on-play",mechanics:op12OnPlayMechanics},{name:"op12-main",mechanics:op12MainMechanics},{name:"op12-battle",mechanics:op12BattleMechanics},{name:"op12-triggers",mechanics:op12TriggerMechanics},{name:"op12-replacements",mechanics:op12ReplacementMechanics},{name:"op13-on-play",mechanics:op13OnPlayMechanics},{name:"op13-main",mechanics:op13MainMechanics},{name:"op13-battle",mechanics:op13BattleMechanics},{name:"op13-triggers",mechanics:op13TriggerMechanics},{name:"off-field-replacements",mechanics:offFieldReplacementMechanics},{name:"op12-rosinante",mechanics:op12RosinanteMechanics},{name:"op14-on-play",mechanics:op14OnPlayMechanics},{name:"op14-main",mechanics:op14MainMechanics},{name:"op14-battle",mechanics:op14BattleMechanics},{name:"op14-triggers",mechanics:op14TriggerMechanics},{name:"op14-replacements",mechanics:op14ReplacementMechanics},{name:"op14-mihawk",mechanics:op14MihawkMechanics},{name:"op15-on-play",mechanics:op15OnPlayMechanics},{name:"op15-main",mechanics:op15MainMechanics},{name:"op15-battle",mechanics:op15BattleMechanics},{name:"op15-triggers",mechanics:op15TriggerMechanics},{name:"op16-enel",mechanics:op16EnelMechanics},{name:"op16-on-play",mechanics:op16OnPlayMechanics},{name:"op16-main",mechanics:op16MainMechanics},{name:"op16-battle",mechanics:op16BattleMechanics},{name:"op16-triggers",mechanics:op16TriggerMechanics},{name:"op16-ace",mechanics:op16AceMechanics},{name:"replacements",mechanics:replacementMechanics},{name:"op16-luffy",mechanics:op16LuffyMechanics},{name:"op16-nami",mechanics:op16NamiMechanics},{name:"op16-teach",mechanics:op16TeachMechanics},{name:"op17-main",mechanics:op17MainMechanics},{name:"op17-battle",mechanics:op17BattleMechanics},{name:"op17-on-play",mechanics:op17OnPlayMechanics},{name:"op17-triggers",mechanics:op17TriggerMechanics},{name:"op17-replacements",mechanics:op17ReplacementMechanics},{name:"op17-meta",mechanics:op17MetaMechanics},{name:"op17-kaido",mechanics:op17KaidoMechanics},{name:"op17-luffy-ace",mechanics:op17LuffyAceMechanics},{name:"op05-on-play",mechanics:op05OnPlayMechanics},{name:"op05-main",mechanics:op05MainMechanics},{name:"op05-battle",mechanics:op05BattleMechanics},{name:"op05-triggers",mechanics:op05TriggerMechanics},{name:"op05-replacements",mechanics:op05ReplacementMechanics},{name:"op06-on-play",mechanics:op06OnPlayMechanics},{name:"op06-main",mechanics:op06MainMechanics},{name:"op06-battle",mechanics:op06BattleMechanics},{name:"op06-triggers",mechanics:op06TriggerMechanics},{name:"op06-yamato",mechanics:op06YamatoMechanics},{name:"eb05-on-play",mechanics:eb05OnPlayMechanics},{name:"eb05-main",mechanics:eb05MainMechanics},{name:"eb05-battle",mechanics:eb05BattleMechanics},{name:"eb05-triggers",mechanics:eb05TriggerMechanics},{name:"eb05-replacements",mechanics:eb05ReplacementMechanics},{name:"eb04-bonney",mechanics:eb04BonneyMechanics},{name:"eb04-on-play",mechanics:eb04OnPlayMechanics},{name:"eb04-main",mechanics:eb04MainMechanics},{name:"eb04-battle",mechanics:eb04BattleMechanics},{name:"eb04-triggers",mechanics:eb04TriggerMechanics},{name:"eb04-replacements",mechanics:eb04ReplacementMechanics},{name:"eb03-on-play",mechanics:eb03OnPlayMechanics},{name:"eb03-main",mechanics:eb03MainMechanics},{name:"eb03-battle",mechanics:eb03BattleMechanics},{name:"eb03-triggers",mechanics:eb03TriggerMechanics},{name:"eb03-replacements",mechanics:eb03ReplacementMechanics},{name:"eb02-on-play",mechanics:eb02OnPlayMechanics},{name:"eb02-main",mechanics:eb02MainMechanics},{name:"eb02-battle",mechanics:eb02BattleMechanics},{name:"eb02-triggers",mechanics:eb02TriggerMechanics},{name:"eb01-on-play",mechanics:eb01OnPlayMechanics},{name:"eb01-main",mechanics:eb01MainMechanics},{name:"eb01-battle",mechanics:eb01BattleMechanics},{name:"eb01-triggers",mechanics:eb01TriggerMechanics},{name:"eb01-replacements",mechanics:eb01ReplacementMechanics},{name:"prb02-on-play",mechanics:prb02OnPlayMechanics},{name:"prb02-battle",mechanics:prb02BattleMechanics},{name:"prb02-replacements",mechanics:prb02ReplacementMechanics},{name:"prb02-triggers",mechanics:prb02TriggerMechanics}]);var eventMainPrograms=registries.eventMain;var counterEventPrograms=registries.counterEvent;var onOpponentAttackPrograms=registries.onOpponentAttack;var leaderWatcherPrograms=registries.leaderWatcher;var whenAttackingPrograms=registries.whenAttacking;var whenRestedPrograms=registries.whenRested;var activateMainPrograms=registries.activateMain;var onPlayPrograms=registries.onPlay;var onBlockPrograms=registries.onBlock;var onKoPrograms=registries.onKo;var onEndOfYourTurnPrograms=registries.onEndOfYourTurn;var onStartOfYourTurnPrograms=registries.onStartOfYourTurn;var triggerPrograms=registries.trigger;var replacementPrograms=registries.replacement;var damageReplacementPrograms=registries.damageReplacement;registerReplacementPrograms(replacementPrograms);registerDamageReplacements(damageReplacementPrograms);registerEventMainPrograms(eventMainPrograms);registerWhenRestedCards(new Set(whenRestedPrograms.keys()));registerStaticAbilities([...op14StaticAbilities,...op10StaticAbilities,...op11StaticAbilities,...op17StaticAbilities,...promoStaticAbilities,...op15StaticAbilities,...op13StaticAbilities,...op16StaticAbilities,...formatStaticAbilities,...op12StaticAbilities,...st21StaticAbilities,...st13StaticAbilities,...st15StaticAbilities,...op09StaticAbilities,...st25StaticAbilities,...st30StaticAbilities,...st28StaticAbilities,...op06StaticAbilities,...eb05StaticAbilities,...eb04StaticAbilities,...eb03StaticAbilities,...op08StaticAbilities,...op05StaticAbilities,...st26StaticAbilities,...op04StaticAbilities,...op03StaticAbilities,...st23StaticAbilities,...st19StaticAbilities,...prb02StaticAbilities,...op07StaticAbilities,...eb02StaticAbilities,...eb01StaticAbilities,...st16StaticAbilities,...st27StaticAbilities,...st29StaticAbilities,...st14StaticAbilities,...st10StaticAbilities]);registerReactionRules([...op07ReactionRules,...op12ReactionRules,...op10ReactionRules,...op11ReactionRules,...op13ReactionRules,...op16ReactionRules,...op14ReactionRules,...eb05ReactionRules,...eb04ReactionRules,...op09ReactionRules,...eb03ReactionRules,...op08ReactionRules,...op06ReactionRules,...op15ReactionRules,...op05ReactionRules,...eb02ReactionRules,...eb01ReactionRules,...promoReactionRules,...st10ReactionRules]);registerRemovalImmunities([...op06RemovalImmunities,...op07RemovalImmunities,...op08RemovalImmunities,...op09RemovalImmunities,...op10RemovalImmunities,...op11RemovalImmunities,...op12RemovalImmunities,...op13RemovalImmunities,...op15RemovalImmunities,...eb03RemovalImmunities,...eb04RemovalImmunities,...eb05RemovalImmunities,...promoRemovalImmunities,...st14RemovalImmunities]);function resolveKoCharacter({state,effect,optionId,db}){if(optionId==="skip"){if(effect.kind==="rest-character"){return applyAfterRest(state,effect.playerId,effect.afterRest)}if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return[]}if(!effect.eligibleInstanceIds.includes(optionId)&&!(effect.kind==="ko-character"&&(optionId.startsWith("rosinante:")||optionId.startsWith("vergo:")||optionId.startsWith("handtrash045:")||optionId.startsWith("mechanic:")))){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const targetPlayer=state.players[effect.targetPlayerId];const targetIndex=targetPlayer.board.findIndex(card2=>card2.instanceId===optionId);if(effect.kind==="rest-character"){const card2=targetPlayer.board[targetIndex];if(!card2)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);card2.rested=true;const events=[{type:"character-rested",playerId:effect.targetPlayerId,cardInstanceId:card2.instanceId,cardNumber:card2.cardNumber,sourceCardNumber:effect.sourceCardNumber}];events.push(...triggerPerona(state,effect.playerId));const remaining2=(effect.remaining??1)-1;const eligibleInstanceIds=effect.eligibleInstanceIds.filter(instanceId=>instanceId!==optionId);if(remaining2>0&&eligibleInstanceIds.length>0){state.pendingEffect={...effect,remaining:remaining2,eligibleInstanceIds}}else{events.push(...applyAfterRest(state,effect.playerId,effect.afterRest))}return events}if(optionId.startsWith("rosinante:")){const[,protectedId]=optionId.split(":");if(!protectedId||!effect.eligibleInstanceIds.includes(protectedId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const events=applyRosinanteLifeProtection(state,effect.targetPlayerId);if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return events}if(optionId.startsWith("vergo:")){const[,protectedId,vergoId]=optionId.split(":");if(!protectedId||!vergoId){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const vergo=targetPlayer.board.find(card2=>card2.instanceId===vergoId&&card2.cardNumber==="OP14-061");if(!vergo||fieldDonCount(state,effect.targetPlayerId)<1){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const events=[];returnDonToDeck(state,effect.targetPlayerId,1,vergo,events);state.oncePerTurn.push(replacementKey(state,effect.targetPlayerId,vergo.instanceId));if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return events}if(optionId.startsWith("handtrash045:")){const[,protectedId,kyoId]=optionId.split(":");if(!protectedId||!kyoId){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}if(!targetPlayer.board.some(card2=>card2.instanceId===kyoId&&card2.cardNumber==="OP17-045")||targetPlayer.hand.length<2){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}state.pendingEffect={kind:"hand-trash-replacement",playerId:effect.targetPlayerId,sourceCardNumber:"OP17-045",sourceInstanceId:kyoId,eligibleInstanceIds:targetPlayer.hand.map(card2=>card2.instanceId),remaining:2,...effect.resumePhase?{resumePhase:effect.resumePhase}:{},...effect.resumePlayerId?{resumePlayerId:effect.resumePlayerId}:{}};state.activePlayer=effect.targetPlayerId;return[]}if(optionId.startsWith("mechanic:")){const[,threatenedId,protectorId]=optionId.split(":");if(!protectorId||!threatenedId){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const protector=replacementProtector(state,effect.targetPlayerId,protectorId);const entry=protector&&replacementPrograms.get(protector.cardNumber);if(!protector||!entry){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}if(entry.oncePerTurn){state.oncePerTurn.push(replacementKey(state,effect.targetPlayerId,protector.instanceId))}if(entry.cost.kind==="trash-self"||entry.cost.kind==="trash-self-and-draw"){const protectorIndex=targetPlayer.board.findIndex(card2=>card2.instanceId===protector.instanceId);const[trashed]=targetPlayer.board.splice(protectorIndex,1);if(!trashed)throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`);targetPlayer.restedDon.push(...trashed.attachedDon??[]);targetPlayer.trash.push({instanceId:trashed.instanceId,cardNumber:trashed.cardNumber});const drawn=entry.cost.kind==="trash-self-and-draw"?drawCards(state,effect.targetPlayerId,entry.cost.draw,protector.cardNumber):[];if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return drawn}if(entry.cost.kind==="ko-self"){const removed2=knockOut(state,effect.targetPlayerId,protector.instanceId,protector.cardNumber);if(!removed2)throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`);const koEvents=[...removed2.events];const onKo2=createOnKoResult(state,effect.targetPlayerId,removed2.card,effect.resumePlayerId??effect.playerId,db);koEvents.push(...onKo2.events);if(onKo2.pending){state.pendingEffect=onKo2.pending;state.phase="main";state.activePlayer=onKo2.pending.playerId}else if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return koEvents}if(entry.cost.kind!=="trash-from-hand"){const dispatched=dispatchMechanicInvocations(state,[{context:{sourcePlayerId:effect.targetPlayerId,source:protector},program:{effect:replacementCostEffect({protector,entry},true,`replacement-${protector.instanceId}`)},bindings:{[`replacement-${protector.instanceId}`]:[protector.instanceId],[`replacement-${protector.instanceId}-threatened`]:[threatenedId]}}],db);if(dispatched.pending&&dispatched.invocation){state.pendingEffect=mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations);if(effect.resumePhase&&effect.resumePlayerId){state.pendingEffectResume={phase:effect.resumePhase,playerId:effect.resumePlayerId}}state.activePlayer=effect.targetPlayerId}else if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return dispatched.events}const payers=replacementHandPayers(state,effect.targetPlayerId,protector,entry.cost.match,db);if(payers.length<entry.cost.count){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}state.pendingEffect={kind:"hand-trash-replacement",playerId:effect.targetPlayerId,sourceCardNumber:protector.cardNumber,sourceInstanceId:protector.instanceId,eligibleInstanceIds:payers.map(card2=>card2.instanceId),remaining:entry.cost.count,...effect.resumePhase?{resumePhase:effect.resumePhase}:{},...effect.resumePlayerId?{resumePlayerId:effect.resumePlayerId}:{}};state.activePlayer=effect.targetPlayerId;return[]}const threatened=targetPlayer.board.find(card2=>card2.instanceId===optionId);if(threatened){const replacements=[...replacementOptionsFor(state,effect.playerId,effect.targetPlayerId,threatened,optionId,db),...registeredReplacementOptions(state,effect.playerId,effect.targetPlayerId,threatened,optionId,db)];if(replacements.length>0){state.pendingEffect={kind:"replacement-choice",playerId:effect.targetPlayerId,sourcePlayerId:effect.playerId,targetInstanceId:optionId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,options:replacements,...effect.resumePhase?{resumePhase:effect.resumePhase}:{},...effect.resumePlayerId?{resumePlayerId:effect.resumePlayerId}:{}};state.activePlayer=effect.targetPlayerId;return[]}}const removed=knockOut(state,effect.targetPlayerId,optionId,effect.sourceCardNumber);if(!removed)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);const card={instanceId:removed.card.instanceId,cardNumber:removed.card.cardNumber};const onKo=createOnKoResult(state,effect.targetPlayerId,card,effect.resumePlayerId??effect.playerId,db);if(onKo.pending){state.activeAttack=null;state.pendingEffect=onKo.pending;state.phase="main";state.activePlayer=onKo.pending.playerId}else if(state.activeAttack?.targetInstanceId===card.instanceId){const attackerPlayerId=state.activeAttack.attackerPlayerId;state.activeAttack=null;state.phase="main";state.activePlayer=attackerPlayerId}else if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return[...removed.events,...onKo.events]}function resolveSt34DonMinusKo({state,effect,optionId}){if(optionId==="skip"){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId;return[]}if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const events=[];returnDonToDeck(state,effect.playerId,1,effectSource(effect),events);state.pendingEffect={kind:"ko-character",playerId:effect.playerId,targetPlayerId:effect.targetPlayerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,eligibleInstanceIds:[optionId],resumePhase:effect.resumePhase,resumePlayerId:effect.resumePlayerId};return events}function resolveSetBasePowerZero({state,effect,optionId,db}){if(optionId==="skip")return[];if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const written=addBasePowerSetter(state,optionId,{value:0,expiresAtTurn:effect.expiresAtTurn},db);if(!written)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);return[{type:"base-power-set",playerId:written.owner,targetInstanceId:optionId,basePower:0,...written.outrankedBy===void 0?{}:{outrankedBy:written.outrankedBy},expiresAtTurn:effect.expiresAtTurn,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId}]}function resolveReducePower({state,effect,optionId,db}){let changedTargetInstanceId;const amount=effect.applyAllAtOnce?effect.amount*effect.remaining:effect.amount;if(optionId==="skip"){if(effect.afterKoPowerAtMost===void 0){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId;return[]}}else{const target=state.players[effect.targetPlayerId].board.find(card=>card.instanceId===optionId);if(!target)throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`);target.powerModifiers??=[];target.powerModifiers.push({amount,expiresAtTurn:effect.expiresAtTurn,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId});changedTargetInstanceId=target.instanceId}if(!effect.applyAllAtOnce&&effect.remaining>1){state.pendingEffect={...effect,remaining:effect.remaining-1}}else if(effect.afterKoPowerAtMost!==void 0){const eligibleInstanceIds=state.players[effect.targetPlayerId].board.filter(card=>currentPower(state,effect.targetPlayerId,card.instanceId,false,db)<=effect.afterKoPowerAtMost).map(card=>card.instanceId);state.pendingEffect=eligibleInstanceIds.length>0?{kind:"ko-character",playerId:effect.playerId,targetPlayerId:effect.targetPlayerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,eligibleInstanceIds,resumePhase:effect.resumePhase,resumePlayerId:effect.resumePlayerId}:null;if(!state.pendingEffect){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}}else{state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return changedTargetInstanceId?[{type:"power-changed",playerId:effect.targetPlayerId,targetInstanceId:changedTargetInstanceId,amount,expiresAtTurn:effect.expiresAtTurn,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId}]:[]}function resolveGatlingGun({state,effect,optionId}){if(effect.stage==="give-don"){if(optionId!=="skip"&&!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const events=[];if(optionId!=="skip"){const moved=player.restedDon.splice(0,1);if(optionId===leaderInstanceId3(effect.playerId)){player.leaderAttachedDon.push(...moved)}else{const target2=player.board.find(card=>card.instanceId===optionId);if(!target2)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);target2.attachedDon??=[];target2.attachedDon.push(...moved)}events.push({type:"don-attached",playerId:effect.playerId,targetInstanceId:optionId,count:moved.length})}state.pendingEffect={...effect,stage:"reduce-power",eligibleInstanceIds:state.players[opponentOf4(effect.playerId)].board.map(card=>card.instanceId)};return events}if(optionId==="skip")return[];if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const targetPlayerId=opponentOf4(effect.playerId);const target=state.players[targetPlayerId].board.find(card=>card.instanceId===optionId);if(!target)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);target.powerModifiers??=[];target.powerModifiers.push({amount:-2e3,expiresAtTurn:state.turn,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId});return[{type:"power-changed",playerId:targetPlayerId,targetInstanceId:target.instanceId,amount:-2e3,expiresAtTurn:state.turn,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId}]}function resolveCharacterAreaReplacement({state,effect,optionId,db}){if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const boardIndex=player.board.findIndex(card=>card.instanceId===optionId);const[trashed]=player.board.splice(boardIndex,1);if(!trashed)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);player.restedDon.push(...trashed.attachedDon??[]);player.trash.push({instanceId:trashed.instanceId,cardNumber:trashed.cardNumber});const placement=placeCharacter(state,effect.playerId,effect.card,effect.rested,db);state.pendingEffect=placement.pending;return[{type:"character-trashed",playerId:effect.playerId,cardInstanceId:trashed.instanceId,cardNumber:trashed.cardNumber,reason:"character-area-limit"},...placement.events]}function resolveReplacementChoice({state,effect,optionId,db}){const resume=()=>{state.pendingEffect=null;if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}else{state.activePlayer=effect.sourcePlayerId}};if(optionId==="skip"){const removed=knockOut(state,effect.playerId,effect.targetInstanceId,effect.sourceCardNumber);resume();if(!removed)return[];const koEvents=[...removed.events];const onKo=createOnKoResult(state,effect.playerId,removed.card,effect.resumePlayerId??effect.sourcePlayerId,db);koEvents.push(...onKo.events);if(onKo.pending)state.pendingEffect=onKo.pending;return koEvents}if(!effect.options.some(option=>option.optionId===optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const planted={kind:"ko-character",playerId:effect.sourcePlayerId,targetPlayerId:effect.playerId,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId,eligibleInstanceIds:[effect.targetInstanceId],...effect.resumePhase?{resumePhase:effect.resumePhase}:{},...effect.resumePlayerId?{resumePlayerId:effect.resumePlayerId}:{}};state.pendingEffect=planted;const events=resolveEffect(state,optionId,db);if(state.pendingEffect===planted)resume();return events}function resolveHandTrashReplacement({state,effect,optionId,db}){if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];const handIndex=player.hand.findIndex(card2=>card2.instanceId===optionId);const[card]=player.hand.splice(handIndex,1);if(!card)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);player.trash.push(card);markHandTrashedByEffect(state,effect.playerId);const leaderDrawCount=(effect.leaderDrawCount??0)+navyHandTrashDraws(state,effect.playerId,effect.sourceCardNumber,db);const events=[{type:"card-moved",playerId:effect.playerId,cardInstanceId:card.instanceId,cardNumber:card.cardNumber,from:"hand",to:"trash",sourceCardNumber:effect.sourceCardNumber}];if(effect.remaining>1){state.pendingEffect={...effect,eligibleInstanceIds:player.hand.map(candidate=>candidate.instanceId),remaining:effect.remaining-1,leaderDrawCount};return events}events.push(...drawCards(state,effect.playerId,leaderDrawCount,effect.sourceCardNumber));if(effect.resumePhase&&effect.resumePlayerId){state.phase=effect.resumePhase;state.activePlayer=effect.resumePlayerId}return events}function resolveBattleKoReplacement({state,effect,optionId,db}){const mechanic=optionId.startsWith("mechanic:")?(effect.mechanicOptions??[]).find(option=>option.optionId===optionId):void 0;if(optionId!=="apply"&&optionId!=="skip"&&!mechanic){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}if(optionId==="skip")return[];const events=[];if(mechanic){const[,,protectorId]=optionId.split(":");const protector=protectorId===void 0?void 0:replacementProtector(state,effect.playerId,protectorId);const entry=protector&&replacementPrograms.get(protector.cardNumber);if(!protector||!entry){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}if(entry.oncePerTurn){state.oncePerTurn.push(replacementKey(state,effect.playerId,protector.instanceId))}const dispatched=dispatchMechanicInvocations(state,[{context:{sourcePlayerId:effect.playerId,source:protector},program:{effect:replacementCostEffect({protector,entry},true,SOURCE_BINDING)},bindings:{[`${SOURCE_BINDING}-threatened`]:[effect.targetInstanceId]}}],db);events.push(...dispatched.events);const attackerPlayerId2=state.activeAttack?.attackerPlayerId;state.activeAttack=null;state.pendingTrigger=null;if(dispatched.pending&&dispatched.invocation){state.pendingEffect=mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations);if(attackerPlayerId2){state.pendingEffectResume={phase:"main",playerId:attackerPlayerId2}}state.activePlayer=effect.playerId;return events}if(attackerPlayerId2){state.phase="main";state.activePlayer=attackerPlayerId2}return events}events.push(...applyRosinanteLifeProtection(state,effect.playerId));const attackerPlayerId=state.activeAttack?.attackerPlayerId;state.activeAttack=null;state.pendingTrigger=null;if(attackerPlayerId){state.phase="main";state.activePlayer=attackerPlayerId}return events}function resolveDamageReplacement({state,effect,optionId,db}){if(optionId==="skip")return[];const protectorId=effect.protectorInstanceIds.find(instanceId=>damageReplacementOption(instanceId)===optionId);const protector=protectorId===void 0?void 0:state.players[effect.playerId].board.find(card=>card.instanceId===protectorId);if(!protector)throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`);const dispatched=dispatchMechanicInvocations(state,[{context:{sourcePlayerId:effect.playerId,source:protector},program:{effect:{kind:"move",binding:SOURCE_BINDING,to:{player:"self",zone:"trash"},skipReplacements:true}}}],db);const events=[...dispatched.events];const attackerPlayerId=state.activeAttack?.attackerPlayerId;resumeMainAfterBattle(state);if(dispatched.pending&&dispatched.invocation){state.pendingEffect=mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations);if(attackerPlayerId){state.pendingEffectResume={phase:"main",playerId:attackerPlayerId}}state.activePlayer=effect.playerId}return events}function resolveGrantPrisonerBlocker({state,effect,optionId}){if(optionId!=="skip"){if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const player=state.players[effect.playerId];if(optionId===leaderInstanceId2(effect.playerId)){player.leaderBlockerUntilTurn=state.turn}else{const target=player.board.find(card=>card.instanceId===optionId);if(!target)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);target.blockerUntilTurn=state.turn}state.oncePerTurn.push(`${state.turn}:${effect.playerId}:${effect.sourceInstanceId}:buggy-blocker`)}state.pendingEffect=null;state.phase="block";state.activePlayer=effect.resumePlayerId;return[]}function resolveRestOpponentCard({state,effect,optionId}){if(optionId==="skip"){state.pendingEffect=null;return[]}const targetPlayer=state.players[effect.targetPlayerId];if(optionId==="don"){const moved=targetPlayer.activeDon.splice(0,1);if(moved.length===0)throw new Error("INVALID_EFFECT_OPTION: don");targetPlayer.restedDon.push(...moved)}else{if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const target=targetPlayer.board.find(card=>card.instanceId===optionId);if(!target)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);target.rested=true}const eligibleInstanceIds=effect.eligibleInstanceIds.filter(candidate=>candidate!==optionId);if(effect.remaining>1&&(eligibleInstanceIds.length>0||targetPlayer.activeDon.length>0)){state.pendingEffect={...effect,eligibleInstanceIds,remaining:effect.remaining-1}}else{state.pendingEffect=null}return[]}function resolvePreventRefresh({state,effect,optionId}){if(optionId==="skip"){state.pendingEffect=null;return[]}if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const target=state.players[effect.targetPlayerId].board.find(card=>card.instanceId===optionId);if(!target)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);target.cannotRefreshUntilTurn=effect.expiresAtTurn;const eligibleInstanceIds=effect.eligibleInstanceIds.filter(candidate=>candidate!==optionId);state.pendingEffect=effect.remaining>1&&eligibleInstanceIds.length>0?{...effect,eligibleInstanceIds,remaining:effect.remaining-1}:null;return[{type:"refresh-prevented",playerId:effect.targetPlayerId,targetInstanceId:target.instanceId,targetCardNumber:target.cardNumber,expiresAtTurn:effect.expiresAtTurn,sourceCardNumber:effect.sourceCardNumber}]}function resolvePreventRest({state,effect,optionId}){if(optionId==="skip")return[];if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}const target=state.players[effect.targetPlayerId].board.find(card=>card.instanceId===optionId);if(!target)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);target.cannotRestUntilTurn=effect.expiresAtTurn;target.cannotRestSourceCardNumber=effect.sourceCardNumber;return[{type:"rest-prevented",playerId:effect.targetPlayerId,targetInstanceId:target.instanceId,targetCardNumber:target.cardNumber,expiresAtTurn:effect.expiresAtTurn,sourceCardNumber:effect.sourceCardNumber}]}function resolveSt34PowerBoost({state,effect,optionId}){if(optionId==="skip")return[];if(!effect.eligibleInstanceIds.includes(optionId)){throw new Error(`INVALID_EFFECT_OPTION: ${optionId}`)}applyPowerModifier(state,effect.playerId,optionId,effect.amount,effect.expiresAtTurn,{instanceId:effect.sourceInstanceId,cardNumber:effect.sourceCardNumber});return[{type:"power-changed",playerId:effect.playerId,targetInstanceId:optionId,amount:effect.amount,expiresAtTurn:effect.expiresAtTurn,sourceCardNumber:effect.sourceCardNumber,sourceInstanceId:effect.sourceInstanceId}]}var EFFECT_RESOLVERS={"add-top-deck-to-life":resolveAddTopDeckToLife,"bad-manners-counter":resolveBadMannersCounter,"battle-ko-replacement":resolveBattleKoReplacement,"bege-life-swap":resolveBegeLifeSwap,"borsalino-end-turn":resolveBorsalinoEndTurn,"bottom-deck-character":resolveBottomDeckCharacter,"character-area-replacement":resolveCharacterAreaReplacement,"damage-replacement":resolveDamageReplacement,"discard-for-life":resolveDiscardForLife,"discard-supernova-draw-two":resolveDiscardForLife,"draw-trash":resolveDrawTrash,"free-play":resolveFreePlay,"free-play-rested":resolveFreePlayRested,"gatling-gun":resolveGatlingGun,"give-rested-don":resolveGiveRestedDon,"grant-prisoner-blocker":resolveGrantPrisonerBlocker,"hand-trash-replacement":resolveHandTrashReplacement,"katakuri-leader":resolveKatakuriLeader,"kid-leader-end-turn":resolveKidLeaderEndTurn,"kinemon-cost":resolveKinemonCost,"ko-character":resolveKoCharacter,"mechanic-choice":resolveMechanicChoiceEffect,"move-character-to-life":resolveMoveCharacterToLife,"nami-leader":resolveNamiLeader,"navy-discard":resolveNavyDiscard,"navy-search":resolveNavySearch,"opponent-discard":resolveOpponentDiscard,"p105-life-cost":resolveP105LifeCost,"prevent-attack":resolveBottomDeckCharacter,"prevent-refresh":resolvePreventRefresh,"prevent-rest":resolvePreventRest,"reduce-cost":resolveReduceCost,"reduce-power":resolveReducePower,"replacement-choice":resolveReplacementChoice,"rest-character":resolveKoCharacter,"rest-opponent-card":resolveRestOpponentCard,"return-don":resolveReturnDon,"return-own-for-free-play":resolveReturnOwnForFreePlay,"search-top-five":resolveSearchTopFive,"set-base-power-zero":resolveSetBasePowerZero,"slave-arrow-cost":resolveSlaveArrowCost,"st34-discard":resolveSt34Discard,"st34-don-minus-ko":resolveSt34DonMinusKo,"st34-guess-cost":resolveSt34GuessCost,"st34-power-boost":resolveSt34PowerBoost,"st35-attack-cost":resolveSt35AttackCost,"trash-opponent-life":resolveTrashOpponentLife};function orderSummary(names,destinations){const listed=names.join(", ");const inOrder=names.length>1?", in that order":"";if(!destinations){return`Place ${listed} at the bottom of your deck${inOrder}`}const{primary,alternate}=destinations;const atPrimary=destinations.atPrimary??names.length;if(alternate===void 0||atPrimary>=names.length){return`Place ${listed} at ${primary}${inOrder}`}return`Place ${listed} at ${alternate}${inOrder}`}function splitOrderId(actionId){const cut=actionId.lastIndexOf(":");if(cut<0)return void 0;const tail=actionId.slice(cut+1);const bar=tail.indexOf("|");return{head:actionId.slice(0,cut),indices:(bar<0?tail:tail.slice(0,bar)).split(","),...bar<0?{}:{split:tail.slice(bar+1)}}}function acceptedSplit(offered,requested,count2){if(offered===void 0)return{ok:requested===void 0};if(requested===void 0||!/^\d+$/.test(requested))return{ok:false};const atPrimary=Number(requested);return atPrimary===0||atPrimary===count2?{ok:true,atPrimary}:{ok:false}}function samePermutation(a,b){if(a.length!==b.length)return false;const sortedA=[...a].sort();const sortedB=[...b].sort();return sortedA.every((index,position)=>index===sortedB[position])}function restamp(offer,cards2,indices,destination,split){const payload=`${indices.join(",")}${split?`|${split.atPrimary}`:""}`;const idHead=id=>id.slice(0,id.lastIndexOf(":")+1);return{...offer,actionId:`${idHead(offer.actionId)}${payload}`,optionId:`${idHead(offer.optionId)}${payload}`,option:{kind:"order",cards:[...cards2],...destination===void 0?{}:{destination},...split?{alternate:split.alternate}:{}},summary:orderSummary(cards2.map(card=>card.name),split&&destination!==void 0?{primary:destination,...split}:destination===void 0?void 0:{primary:destination})}}function orderDestination(action){if(action.type!=="resolve-effect")return void 0;return action.option.kind==="order"?action.option.destination:void 0}function orderAlternate(action){if(action.type!=="resolve-effect")return void 0;return action.option.kind==="order"?action.option.alternate:void 0}function orderedCards(action){if(action.type!=="resolve-effect")return void 0;return action.option.kind==="order"?action.option.cards:void 0}function findOfferedAction(legalActions,actionId){const exact=legalActions.find(action=>action.actionId===actionId);if(exact)return exact;const requested=splitOrderId(actionId);if(!requested)return void 0;for(const candidate of legalActions){const cards2=orderedCards(candidate);if(!cards2)continue;const offered=splitOrderId(candidate.actionId);if(!offered||offered.head!==requested.head)continue;if(!samePermutation(offered.indices,requested.indices))continue;const split=acceptedSplit(offered.split,requested.split,cards2.length);if(!split.ok)continue;const alternate=orderAlternate(candidate);return restamp(candidate,requested.indices.map(index=>cards2[Number(index)]),requested.indices,orderDestination(candidate),split.atPrimary!==void 0&&alternate!==void 0?{alternate,atPrimary:split.atPrimary}:void 0)}return void 0}var noOnPlay=()=>({pending:null,events:[]});var searchImpelDownOnPlay=({state,playerId,source,db})=>{return{pending:searchImpelDownTopThree(state,playerId,source,db),events:[]}};var ON_PLAY_HANDLERS=new Map([["OP12-071",({state,playerId,source,db})=>{return{pending:createPuddingSearch(state,playerId,source,db),events:[]}}],["OP15-118",({state,playerId,source})=>{if(fieldDonCount(state,playerId)<1)return{pending:null,events:[]};const events=[];returnDonToDeck(state,playerId,1,source,events);return{pending:createEnelSearch(state,playerId,source),events}}],["OP16-034",searchImpelDownOnPlay],["OP16-026",searchImpelDownOnPlay],["OP16-048",({state,player,playerId,source})=>{const events=hasCardType(player.leaderCardNumber,"Impel Down")?drawCards(state,playerId,1,source.cardNumber):[];const eligibleInstanceIds=player.hand.filter(card=>card.cardNumber==="OP16-042").map(card=>card.instanceId);return{pending:eligibleInstanceIds.length>0?{kind:"free-play",playerId,sourceCardNumber:"OP16-048",sourceInstanceId:source.instanceId,eligibleInstanceIds}:null,events}}],["OP16-045",({player,playerId,source,db})=>{const eligibleInstanceIds=player.board.filter(card=>(db.require(card.cardNumber).cost??0)>=2).map(card=>card.instanceId);return{pending:eligibleInstanceIds.length>0?{kind:"return-own-for-free-play",playerId,sourceCardNumber:"OP16-045",sourceInstanceId:source.instanceId,eligibleInstanceIds}:null,events:[]}}],["EB03-032",({state,player,playerId,source,db})=>{const eligibleInstanceIds=[...db.require(player.leaderCardNumber).name==="Charlotte Katakuri"?[leaderInstanceId3(playerId)]:[],...player.board.filter(card=>db.require(card.cardNumber).name==="Charlotte Katakuri").map(card=>card.instanceId)];return{pending:eligibleInstanceIds.length>0?{kind:"st34-power-boost",playerId,sourceCardNumber:"EB03-032",sourceInstanceId:source.instanceId,eligibleInstanceIds,amount:2e3,expiresAtTurn:state.turn}:null,events:[]}}],["EB03-035",({state,playerId})=>{if(fieldDonCount(state,playerId)<=fieldDonCount(state,opponentOf4(playerId))){addDonFromDeck(state,playerId,1,"rested")}return{pending:null,events:[]}}],["ST34-002",({state,player,playerId,source})=>{const targetPlayerId=opponentOf4(playerId);if(hasCardType(player.leaderCardNumber,"Big Mom Pirates")){addDonFromDeck(state,playerId,1,"rested")}const eligibleInstanceIds=state.players[targetPlayerId].board.filter(card=>effectiveCost(state,targetPlayerId,card)<=2).map(card=>card.instanceId);return{pending:eligibleInstanceIds.length>0?{kind:"ko-character",playerId,targetPlayerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds}:null,events:[]}}],["ST34-003",({state,playerId,source,db})=>{return{pending:searchBigMomTopThree(state,playerId,source,db),events:[]}}],["ST34-004",({state,player,playerId,source})=>{const targetPlayerId=opponentOf4(playerId);return{pending:fieldDonCount(state,playerId)>=4&&player.hand.length>0?{kind:"st34-discard",playerId,targetPlayerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds:player.hand.map(card=>card.instanceId),after:"linlin"}:null,events:[]}}],["ST33-001",({player,playerId,source})=>{if(player.hand.length===0)return noOnPlay();return{pending:{kind:"navy-discard",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds:player.hand.map(card=>card.instanceId),remaining:1,optional:true,after:{kind:"draw",count:1}},events:[]}}],["ST33-003",({state,player,playerId,source})=>{if(player.hand.length===0)return noOnPlay();const targetPlayerId=opponentOf4(playerId);const eligibleInstanceIds=state.players[targetPlayerId].board.filter(card=>effectiveCost(state,targetPlayerId,card)<=2).map(card=>card.instanceId);return{pending:{kind:"navy-discard",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds:player.hand.map(card=>card.instanceId),remaining:1,optional:true,after:{kind:"bottom-deck",targetPlayerId,eligibleInstanceIds,remaining:2}},events:[]}}],["ST33-005",({player,playerId,source,db})=>{const eligibleInstanceIds=player.hand.filter(card=>{const definition=db.require(card.cardNumber);return definition.category==="character"&&definition.types.includes("Navy")&&definition.name!=="Monkey.D.Garp"&&(definition.power??99999)<=8e3}).map(card=>card.instanceId);return{pending:hasCardType(player.leaderCardNumber,"Navy")&&eligibleInstanceIds.length>0?{kind:"free-play",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds}:null,events:[]}}],["OP12-043",({state,player,playerId,source})=>{if(player.hand.length===0)return noOnPlay();const targetPlayerId=opponentOf4(playerId);const eligibleInstanceIds=state.players[targetPlayerId].board.map(card=>card.instanceId);return{pending:{kind:"navy-discard",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds:player.hand.map(card=>card.instanceId),remaining:1,optional:true,after:{kind:"prevent-attack",targetPlayerId,eligibleInstanceIds,expiresAtTurn:state.turn+1,remaining:1}},events:[]}}],["OP12-047",({player,playerId,source})=>{if(player.hand.length===0)return noOnPlay();return{pending:{kind:"navy-discard",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds:player.hand.map(card=>card.instanceId),remaining:1,optional:true,after:{kind:"none"}},events:[]}}],["OP10-103",({player,playerId,source})=>{return{pending:player.life.length>0?{kind:"bege-life-swap",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,stage:"take-life",eligibleInstanceIds:player.life.map(card=>card.instanceId)}:null,events:[]}}],["OP10-111",({state,playerId,source,db})=>{return{pending:createSupernovaSearch(state,playerId,source,false,db),events:[]}}],["P-085",({state,player,playerId,source})=>{const targetPlayerId=opponentOf4(playerId);const eligibleInstanceIds=state.players[targetPlayerId].board.filter(card=>effectiveCost(state,targetPlayerId,card)<=4).map(card=>card.instanceId);return{pending:hasCardType(player.leaderCardNumber,"Supernovas")&&player.life.length<=state.players[targetPlayerId].life.length&&eligibleInstanceIds.length>0?{kind:"move-character-to-life",playerId,targetPlayerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds}:null,events:[]}}],["ST36-004",({player,playerId,source,db})=>{const eligibleInstanceIds=player.hand.filter(card=>db.require(card.cardNumber).types.includes("Supernovas")).map(card=>card.instanceId);return{pending:eligibleInstanceIds.length>0?{kind:"discard-supernova-draw-two",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds}:null,events:[]}}],["OP01-016",({state,playerId,source,db})=>{return{pending:searchTopFive(state,playerId,source,"Nami",db),events:[]}}],["ST31-001",({state,player,playerId,source,db})=>{const events=drawCards(state,playerId,1,source.cardNumber);const eligibleInstanceIds=player.hand.filter(card=>{const definition=db.require(card.cardNumber);return definition.category==="character"&&definition.name!=="Sanji"&&definition.types.includes("Straw Hat Crew")&&definition.cost!==null&&definition.cost<=5}).map(card=>card.instanceId);return{pending:eligibleInstanceIds.length>0?{kind:"free-play",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds}:null,events}}],["ST31-002",({state,player,playerId,source,db})=>{const events=drawCards(state,playerId,1,source.cardNumber);const eligibleInstanceIds=player.hand.filter(card=>{const definition=db.require(card.cardNumber);return definition.category!=="event"&&definition.types.includes("Straw Hat Crew")&&definition.cost===1}).map(card=>card.instanceId);return{pending:eligibleInstanceIds.length>0?{kind:"free-play",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds}:null,events}}],["ST31-004",({state,playerId,source,db})=>{const remaining2=fieldStrawHatCount(state,playerId,db);const targetPlayerId=playerId==="p1"?"p2":"p1";return{pending:remaining2>0&&state.players[targetPlayerId].board.length>0?{kind:"reduce-power",playerId,targetPlayerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,amount:-1e3,expiresAtTurn:state.turn,remaining:remaining2,applyAllAtOnce:true,resumePhase:"main",resumePlayerId:playerId}:null,events:[]}}],["P-101",({player,playerId,source})=>{return{pending:player.restedDon.length>0?{kind:"give-rested-don",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds:[leaderInstanceId3(playerId)],maxCount:1,resumePhase:"main",resumePlayerId:playerId}:null,events:[]}}],["ST32-001",({player,playerId,source,db})=>{return{pending:isSlash(player.leaderCardNumber,db)&&(player.activeDon.length>0||!player.leaderRested)?{kind:"kinemon-cost",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId}:null,events:[]}}],["ST32-002",({state,playerId,source,db})=>{const events=drawCards(state,playerId,1,source.cardNumber);const targetPlayerId=opponentOf4(playerId);const eligibleInstanceIds=state.players[targetPlayerId].board.filter(card=>(db.require(card.cardNumber).cost??0)<=6).map(card=>card.instanceId);return{pending:eligibleInstanceIds.length>0?{kind:"prevent-rest",playerId,targetPlayerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds,expiresAtTurn:state.turn+1}:null,events}}],["ST32-003",({player,playerId,source,db})=>{if(!isSlash(player.leaderCardNumber,db))return{pending:null,events:[]};const eligibleInstanceIds=player.hand.filter(card=>{const definition=db.require(card.cardNumber);return definition.category==="character"&&definition.cost!==null&&definition.cost<=5&&(definition.name==="Perona"||cardAttributes(definition).includes("Slash"))}).map(card=>card.instanceId);return{pending:eligibleInstanceIds.length>0?{kind:"free-play",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds}:null,events:[]}}],["ST32-004",({state,playerId,source})=>{return{pending:restEffect(state,playerId,source,2,2),events:[]}}],["ST32-005",({state,player,playerId,source,db})=>{if(!hasCardAttribute(player.leaderCardNumber,"Slash")){return{pending:null,events:[]}}const targetPlayerId=playerId==="p1"?"p2":"p1";const eligibleInstanceIds=state.players[targetPlayerId].board.filter(card=>{const definition=db.require(card.cardNumber);return!card.rested&&(card.cannotRestUntilTurn??-1)<state.turn&&(definition.cost??0)<=2}).map(card=>card.instanceId);return{pending:eligibleInstanceIds.length===0?null:{kind:"rest-character",playerId,targetPlayerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds},events:[]}}],["OP12-031",({state,playerId,source})=>{const pending=restEffect(state,playerId,source,6,1,"give-three-don-to-leader");return{pending,events:pending?[]:applyAfterRest(state,playerId,"give-three-don-to-leader")}}],["ST24-005",({state,playerId,source})=>{const pending=restEffect(state,playerId,source,5,1,"schedule-active-don");return{pending,events:pending?[]:applyAfterRest(state,playerId,"schedule-active-don")}}],["OP15-036",({state,playerId,source})=>{const targetPlayerId=opponentOf4(playerId);const eligibleInstanceIds=state.players[targetPlayerId].board.filter(card=>card.rested&&effectiveCost(state,targetPlayerId,card)<=4).map(card=>card.instanceId);return{pending:eligibleInstanceIds.length>0?{kind:"ko-character",playerId,targetPlayerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds}:null,events:[]}}],["ST35-001",({state,playerId,source,db})=>{const targetPlayerId=playerId==="p1"?"p2":"p1";const eligibleInstanceIds=state.players[targetPlayerId].board.filter(card=>(db.require(card.cardNumber).power??0)<=2e3).map(card=>card.instanceId);return{pending:eligibleInstanceIds.length===0?null:{kind:"ko-character",playerId,targetPlayerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds},events:[]}}],["P-105",({player,playerId,source})=>{const eligibleInstanceIds=[player.life[0],player.life.at(-1)].filter(card=>Boolean(card)).map(card=>card.instanceId);return{pending:eligibleInstanceIds.length>0?{kind:"p105-life-cost",playerId,sourceCardNumber:"P-105",sourceInstanceId:source.instanceId,eligibleInstanceIds:[...new Set(eligibleInstanceIds)]}:null,events:[]}}],["ST36-002",({state,player,playerId,source})=>{if(state.turnPlayerId!==playerId||!hasCardType(player.leaderCardNumber,"Kid Pirates")||player.deck.length===0){return noOnPlay()}return{pending:{kind:"add-top-deck-to-life",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId},events:[]}}]]);var hasOnPlayHandler=cardNumber=>ON_PLAY_HANDLERS.has(cardNumber);function runOnPlayHandler(state,playerId,source,db=cards){const handler=ON_PLAY_HANDLERS.get(source.cardNumber);if(!handler)return noOnPlay();return handler({state,player:state.players[playerId],playerId,source,db})}function placeCharacter(state,playerId,card,rested=false,db=cards){const player=state.players[playerId];rested=rested||charactersArriveRested(state,playerId,db);if(player.board.length>=5){return{pending:{kind:"character-area-replacement",playerId,sourceCardNumber:card.cardNumber,sourceInstanceId:card.instanceId,eligibleInstanceIds:player.board.map(character=>character.instanceId),card,rested},events:[]}}player.board.push({...card,rested,playedTurn:state.turn,attachedDon:[],powerModifiers:[]});const onPlay=createOnPlayEffect(state,playerId,card,db);return{pending:onPlay.pending,events:[{type:"card-played",playerId,cardInstanceId:card.instanceId,cardNumber:card.cardNumber},...onPlay.events]}}function optionalEffectSummary(cardNumber,optional,db){const card=`${db.require(cardNumber).name} [${cardNumber}]`;if(onceKeyOf(optional)!==void 0)return`Apply ${card}'s optional effect`;const marker=optionalClauseMarker(cardNumber);if(optional&&!isClauseOpeningOptional(cardNumber,optional)){const clause2=marker===void 0?card:`${card} ${marker}`;return`Continue ${clause2}: ${describeOptionalStep(optional)??"apply the next step"}`}if(marker===void 0)return`Apply ${card}'s optional effect`;const clause=clauseText(cardNumber,marker);if(clause)return`Activate ${card}: ${clause}`;const cost=clauseParts(cardNumber,marker)?.cost;return cost?`Activate ${card} ${marker}: ${cost}`:`Activate ${card} ${marker}`}function describeOptionalStep(effect){if(effect.kind!=="select"||effect.count!==1)return void 0;const{selector,effect:inner}=effect;if(inner.kind!=="move"||inner.binding!==effect.bind)return void 0;const filtered=Object.keys(selector).some(key=>key!=="player"&&key!=="zone"&&key!=="position");if(filtered||selector.zone!=="deck"&&selector.zone!=="life"||selector.position!=="top"&&selector.position!=="bottom"||selector.player!=="self"&&selector.player!=="opponent"){return void 0}const whose=selector.player==="self"?"your":"their";const pile=selector.zone==="life"?"Life cards":"deck";const taken=`the ${selector.position} card of ${whose} ${pile}`;return inner.to.zone==="trash"?`trash ${taken}`:`add ${taken} to ${describeMoveDestination(inner.to)}`}function mechanicPendingEffect(invocation,choice,continuations,endOfTurn=false,activatedBy){return{kind:"mechanic-choice",playerId:(choice.kind==="cards"||choice.kind==="choice"||choice.kind==="optional"||choice.kind==="order-to-bottom"?choice.chooserPlayerId:void 0)??invocation.context.sourcePlayerId,sourceCardNumber:invocation.context.source.cardNumber,sourceInstanceId:invocation.context.source.instanceId,choice,...continuations.length>0?{continuations}:{},...endOfTurn?{endOfTurn:true}:{},...activatedBy?{activatedBy}:{}}}var leaderInstanceId3=playerId=>`${playerId}-leader`;var opponentOf4=playerId=>playerId==="p1"?"p2":"p1";var isSlash=(cardNumber,db)=>cardAttributes(db.require(cardNumber)).includes("Slash");var effectSource=effect=>({instanceId:effect.sourceInstanceId,cardNumber:effect.sourceCardNumber});function drawCards(state,playerId,count2,sourceCardNumber){const player=state.players[playerId];let drawn=0;while(drawn<count2){const card=player.deck.shift();if(!card)break;player.hand.push(card);drawn+=1}return drawn>0?[{type:"cards-drawn",playerId,count:drawn,...sourceCardNumber?{sourceCardNumber}:{}}]:[]}function applyPowerModifier(state,playerId,targetInstanceId,amount,expiresAtTurn,source){const modifier={amount,expiresAtTurn,...source?{sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId}:{}};const player=state.players[playerId];if(targetInstanceId===leaderInstanceId3(playerId)){player.leaderPowerModifiers.push(modifier);return}const target=player.board.find(card=>card.instanceId===targetInstanceId);if(!target)throw new Error(`MISSING_POWER_TARGET: ${targetInstanceId}`);target.powerModifiers??=[];target.powerModifiers.push(modifier)}function fieldStrawHatCount(state,playerId,db){const player=state.players[playerId];return(hasCardType(player.leaderCardNumber,"Straw Hat Crew")?1:0)+player.board.filter(card=>db.require(card.cardNumber).types.includes("Straw Hat Crew")).length+(player.stage&&db.require(player.stage.cardNumber).types.includes("Straw Hat Crew")?1:0)}function searchTopFive(state,playerId,source,excludeName,db){const player=state.players[playerId];const revealed=player.deck.splice(0,5);return{kind:"search-top-five",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,revealed,eligibleInstanceIds:revealed.filter(card=>{const definition=db.require(card.cardNumber);return definition.types.includes("Straw Hat Crew")&&definition.name!==excludeName}).map(card=>card.instanceId)}}function searchBigMomTopThree(state,playerId,source,db){const player=state.players[playerId];const revealed=player.deck.splice(0,3);return{kind:"search-top-five",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,revealed,eligibleInstanceIds:revealed.filter(card=>db.require(card.cardNumber).types.includes("Big Mom Pirates")).map(card=>card.instanceId)}}function searchImpelDownTopThree(state,playerId,source,db){const player=state.players[playerId];const revealed=player.deck.splice(0,3);return{kind:"search-top-five",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,revealed,eligibleInstanceIds:revealed.filter(card=>db.require(card.cardNumber).types.includes("Impel Down")).map(card=>card.instanceId)}}function createSupernovaSearch(state,playerId,source,charactersOnly,db=cards){const player=state.players[playerId];const revealed=player.deck.splice(0,5);return{kind:"search-top-five",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,revealed,eligibleInstanceIds:revealed.filter(card=>{const definition=db.require(card.cardNumber);return definition.types.includes("Supernovas")&&(!charactersOnly||definition.category==="character")&&(source.cardNumber!=="OP10-111"||definition.name!=="Monkey.D.Luffy")}).map(card=>card.instanceId)}}function createPuddingSearch(state,playerId,source,db=cards){const revealed=state.players[playerId].deck.splice(0,4);return{kind:"search-top-five",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,revealed,eligibleInstanceIds:revealed.filter(card=>{const definition=db.require(card.cardNumber);return definition.name==="Sanji"||definition.category==="event"}).map(card=>card.instanceId)}}function createEnelSearch(state,playerId,source){const revealed=state.players[playerId].deck.splice(0,5);return{kind:"search-top-five",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,revealed,eligibleInstanceIds:revealed.map(card=>card.instanceId),thenTrash:1}}function createOnKoEffect(state,playerId,source,resumePlayerId,db=cards){const player=state.players[playerId];if(source.cardNumber==="ST34-001"){const eligibleInstanceIds=player.hand.filter(card=>{const definition=db.require(card.cardNumber);return definition.category==="character"&&(definition.power??99999)<=8e3}).map(card=>card.instanceId);return eligibleInstanceIds.length>0?{kind:"free-play",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds,resumePhase:"main",resumePlayerId}:null}if(source.cardNumber==="P-090"&&fieldDonCount(state,playerId)>0&&state.turnPlayerId!==playerId){const opponentDon=fieldDonCount(state,opponentOf4(playerId));const eligibleInstanceIds=player.hand.filter(card=>{const definition=db.require(card.cardNumber);return definition.category==="character"&&definition.types.includes("Big Mom Pirates")&&(definition.cost??99)<=opponentDon}).map(card=>card.instanceId);return eligibleInstanceIds.length>0?{kind:"free-play",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds,returnDon:1,resumePhase:"main",resumePlayerId}:null}if(source.cardNumber==="ST33-002"){const eligibleInstanceIds=player.hand.filter(card=>{const definition=db.require(card.cardNumber);return definition.category==="character"&&definition.colors?.includes("Blue")===true&&definition.types.includes("Navy")&&(definition.cost??99)<=4}).map(card=>card.instanceId);return eligibleInstanceIds.length>0?{kind:"free-play",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds,resumePhase:"main",resumePlayerId}:null}if(source.cardNumber==="ST36-001"&&player.hand.length>0&&player.deck.length>0){return{kind:"discard-for-life",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds:player.hand.map(card=>card.instanceId),resumePhase:"main",resumePlayerId}}if(source.cardNumber==="OP10-109"&&state.players[opponentOf4(playerId)].life.length>0){return{kind:"trash-opponent-life",playerId,targetPlayerId:opponentOf4(playerId),sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,resumePhase:"main",resumePlayerId}}if(source.cardNumber==="OP12-113"&&hasCardType(player.leaderCardNumber,"Supernovas")){const eligibleInstanceIds=player.hand.filter(card=>{const definition=db.require(card.cardNumber);return definition.category==="character"&&definition.types.includes("Supernovas")&&(definition.cost??99)<=4}).map(card=>card.instanceId);return eligibleInstanceIds.length>0?{kind:"free-play-rested",playerId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds,resumePhase:"main",resumePlayerId}:null}return null}function createOnKoResult(state,playerId,source,resumePlayerId,db=cards,cause="effect"){if(effectsNegated(state,source.instanceId)){return{pending:null,events:[]}}const removalWatchers=getMechanicSignalInvocations(state,[{kind:"card-moved",card:source,ownerId:playerId,from:"board",to:"trash",ko:true}],false);const mechanicProgram=getOnKoMechanicProgram(source.cardNumber,cause);if(mechanicProgram){const dispatched2=dispatchMechanicInvocations(state,orderSimultaneous(state,[{context:{sourcePlayerId:playerId,source},program:mechanicProgram},...removalWatchers]),db);return{pending:dispatched2.pending&&dispatched2.invocation?mechanicPendingEffect(dispatched2.invocation,dispatched2.pending,dispatched2.continuations):null,events:dispatched2.events}}const legacy=createOnKoEffect(state,playerId,source,resumePlayerId,db);if(legacy||removalWatchers.length===0){return{pending:legacy,events:[]}}const dispatched=dispatchMechanicInvocations(state,removalWatchers,db);return{pending:dispatched.pending&&dispatched.invocation?mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations):null,events:dispatched.events}}function createOnEndOfYourTurnResult(state,playerId,source,db=cards){if(effectsNegated(state,source.instanceId)){return{pending:null,events:[]}}const mechanicProgram=getOnEndOfYourTurnMechanicProgram(source.cardNumber);if(!mechanicProgram)return{pending:null,events:[]};return runEndOfTurnProgram(state,playerId,source,mechanicProgram,db)}function runEndOfTurnProgram(state,playerId,source,mechanicProgram,db=cards,bindings={}){const invocation={context:{sourcePlayerId:playerId,source},program:mechanicProgram};const result=executeMechanicProgram(state,invocation.context,mechanicProgram,db,bindings);const continuations=getMechanicSignalInvocations(state,result.signals);if(result.pending){return{pending:mechanicPendingEffect(invocation,result.pending,continuations,true),events:result.events}}const dispatched=dispatchMechanicInvocations(state,continuations,db);return{pending:dispatched.pending&&dispatched.invocation?mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations):null,events:[...result.events,...dispatched.events]}}function createOnStartOfYourTurnResult(state,playerId,source,db=cards){const mechanicProgram=getOnStartOfYourTurnMechanicProgram(source.cardNumber);if(!mechanicProgram)return{pending:null,events:[]};const invocation={context:{sourcePlayerId:playerId,source},program:mechanicProgram};const result=executeMechanicProgram(state,invocation.context,mechanicProgram,db);const continuations=getMechanicSignalInvocations(state,result.signals);if(result.pending){return{pending:mechanicPendingEffect(invocation,result.pending,continuations),events:result.events}}const dispatched=dispatchMechanicInvocations(state,continuations,db);return{pending:dispatched.pending&&dispatched.invocation?mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations):null,events:[...result.events,...dispatched.events]}}function createTriggerResult(state,playerId,source,db=cards,reactions=[],held=[]){const mechanicProgram=getTriggerMechanicProgram(source.cardNumber);if(!mechanicProgram)return{pending:null,events:[]};if(mechanicProgram.runsOnPlay&&onPlayEffectsNegated(state,playerId,db)){const dispatched2=dispatchMechanicInvocations(state,[...reactions,...held],db);return{pending:dispatched2.pending&&dispatched2.invocation?mechanicPendingEffect(dispatched2.invocation,dispatched2.pending,dispatched2.continuations):null,events:dispatched2.events}}const invocation={context:{sourcePlayerId:playerId,source,viaTrigger:true},program:mechanicProgram};const result=executeMechanicProgram(state,invocation.context,mechanicProgram,db);const continuations=[...reactions,...orderSimultaneous(state,[...held,...getMechanicSignalInvocations(state,result.signals)])];if(result.pending){return{pending:mechanicPendingEffect(invocation,result.pending,continuations),events:result.events}}const dispatched=dispatchMechanicInvocations(state,continuations,db);return{pending:dispatched.pending&&dispatched.invocation?mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations):null,events:[...result.events,...dispatched.events]}}function activeRestTargets(state,playerId,maxCost){return state.players[opponentOf4(playerId)].board.filter(card=>!card.rested&&(card.cannotRestUntilTurn??-1)<state.turn&&!isRestImmune(state,opponentOf4(playerId),card)&&effectiveCost(state,opponentOf4(playerId),card)<=maxCost).map(card=>card.instanceId)}function restEffect(state,playerId,source,maxCost,remaining2=1,afterRest){const eligibleInstanceIds=activeRestTargets(state,playerId,maxCost);return eligibleInstanceIds.length>0?{kind:"rest-character",playerId,targetPlayerId:opponentOf4(playerId),sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,eligibleInstanceIds,remaining:remaining2,...afterRest?{afterRest}:{}}:null}function triggerPerona(state,playerId){const player=state.players[playerId];if(state.activePlayer!==playerId||player.restedDon.length===0){return[]}const perona=player.board.find(card=>card.cardNumber==="OP10-036"&&!state.oncePerTurn.includes(`${state.turn}:${playerId}:${card.instanceId}:perona`));if(!perona)return[];player.activeDon.push(...player.restedDon.splice(0,1));state.oncePerTurn.push(`${state.turn}:${playerId}:${perona.instanceId}:perona`);return[]}function applyAfterRest(state,playerId,afterRest){const player=state.players[playerId];if(afterRest==="give-three-don-to-leader"){const moved=player.restedDon.splice(0,3);player.leaderAttachedDon.push(...moved);return[{type:"don-attached",playerId,targetInstanceId:leaderInstanceId3(playerId),count:moved.length}]}if(afterRest==="schedule-active-don"){player.activateDonAtEndOfTurn+=1}return[]}function queuePendingContinuations(state,invocations){if(invocations.length===0)return;state.pendingContinuations=[...state.pendingContinuations??[],...invocations]}function releaseDamageReactions(state){const held=state.pendingDamageReactions;if(!held)return;if(state.phase==="finished"){delete state.pendingDamageReactions;return}if(state.phase==="trigger"||state.pendingTrigger||state.pendingBattleDamage||state.pendingEffect){return}delete state.pendingDamageReactions;queuePendingContinuations(state,held)}function drainPendingContinuations(state,db=cards){const events=[];while(state.pendingContinuations&&state.pendingContinuations.length>0&&!state.pendingEffect&&!state.pendingTrigger){const next=state.pendingContinuations.shift();if("program"in next||next.orderGroup!==void 0){const batch=[next];while(next.orderGroup!==void 0&&state.pendingContinuations[0]!==void 0&&state.pendingContinuations[0].orderGroup===next.orderGroup){batch.push(state.pendingContinuations.shift())}const queued=state.pendingContinuations.length;const dispatched=dispatchMechanicInvocations(state,batch,db);events.push(...dispatched.events);const parked=state.pendingContinuations.splice(queued);if(dispatched.continuations.length>0||parked.length>0){state.pendingContinuations.unshift(...parked,...dispatched.continuations)}if(dispatched.pending&&dispatched.invocation){state.pendingEffect=mechanicPendingEffect(dispatched.invocation,dispatched.pending,[])}continue}const result=runOnPlayHandler(state,next.context.sourcePlayerId,next.context.source,db);events.push(...result.events);state.pendingEffect=result.pending}if(state.pendingContinuations?.length===0){delete state.pendingContinuations}return events}function createOnPlayEffect(state,playerId,source,db=cards){if(effectsNegated(state,source.instanceId)){return noOnPlay()}const onPlayNegated=onPlayEffectsNegated(state,playerId,db);const watchers=getMechanicSignalInvocations(state,[{kind:"card-played",card:source,playerId}],true,db,false);const mechanicProgram=onPlayNegated?void 0:getOnPlayMechanicProgram(source.cardNumber);if(mechanicProgram){const dispatched2=dispatchMechanicInvocations(state,orderSimultaneous(state,[{context:{sourcePlayerId:playerId,source},program:mechanicProgram},...watchers]),db);return{pending:dispatched2.pending&&dispatched2.invocation?mechanicPendingEffect(dispatched2.invocation,dispatched2.pending,dispatched2.continuations):null,events:dispatched2.events}}const own=onPlayNegated?noOnPlay():runOnPlayHandler(state,playerId,source,db);if(own.pending){queuePendingContinuations(state,watchers);return own}if(watchers.length===0)return own;const dispatched=dispatchMechanicInvocations(state,watchers,db);return{pending:dispatched.pending&&dispatched.invocation?mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations):null,events:[...own.events,...dispatched.events]}}function findCardByInstanceId(state,instanceId){for(const playerId of["p1","p2"]){const player=state.players[playerId];if(instanceId===`${playerId}-leader`){return{instanceId,cardNumber:player.leaderCardNumber}}const zones=[...player.deck,...player.hand,...player.life.filter(card=>card.faceUp===true),...player.board,player.stage,...player.trash];const found=zones.find(card=>card?.instanceId===instanceId);if(found)return found}return null}function reactionSourceName(reactions,optionId,db){const instanceId=optionId.slice("reaction:".length);const source=reactions.find(reaction=>reaction.context.source.instanceId===instanceId)?.context.source;if(!source)throw new Error(`MISSING_EFFECT_TARGET: ${instanceId}`);return`${db.require(source.cardNumber).name} [${source.cardNumber}]`}function describeCardOption(state,instanceId,db){const visible=findCardByInstanceId(state,instanceId);if(visible)return db.require(visible.cardNumber).name;const donOwner=activeDonOwner(state,instanceId);if(donOwner)return`1 active DON!! of ${donOwner}`;for(const playerId of["p1","p2"]){const life=state.players[playerId].life;if(life[0]?.instanceId===instanceId)return"your top Life card";if(life.at(-1)?.instanceId===instanceId)return"your bottom Life card";if(life.some(card=>card.instanceId===instanceId))return"a face-down Life card"}throw new Error(`MISSING_EFFECT_TARGET: ${instanceId}`)}function rawInstanceId(optionId){return optionId.split(":").at(-1)??optionId}function getEffectOptions(state,db=cards){return computeEffectOptions(state,db).map(option=>{const optionCardNumber=option.optionCardNumber??findCardByInstanceId(state,rawInstanceId(option.optionId))?.cardNumber;return{...option,...optionCardNumber?{optionCardNumber}:{}}})}function computeEffectOptions(state,db=cards){const effect=state.pendingEffect;if(!effect)return[];if(effect.kind==="return-don"){const remaining2=effect.origins.length;const ordinal=remaining2>1?` (${remaining2} left)`:"";return donReturnPools(state,effect.playerId,effect.origins,effect.onFieldAtPayment).map(pool=>{const held=donPoolSize(state,effect.playerId,pool,effect.onFieldAtPayment);const available=held+effect.origins.filter(origin=>origin===pool).length;if(pool===DON_POOL_ACTIVE||pool===DON_POOL_RESTED){const posture=pool===DON_POOL_ACTIVE?"an active":"a rested";return{optionId:`return-don:${pool}`,summary:`Return ${posture} DON!! (${available} there)${ordinal}`}}return{optionId:`return-don:${pool}`,summary:`Return a DON!! given to ${describeCardOption(state,pool,db)} (${available} given)${ordinal}`}})}if(effect.kind==="character-area-replacement"){return effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Trash ${describeCardOption(state,optionId,db)} to make room for ${db.require(effect.card.cardNumber).name}`}))}if(effect.kind==="p105-life-cost"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Add ${describeCardOption(state,optionId,db)} to hand`})),{optionId:"skip",summary:"Skip card effect"}]}if(effect.kind==="st35-attack-cost"){return[...state.players[effect.playerId].deck.length>=2?[{optionId:"apply",summary:"Trash 2 cards from the top of your deck"}]:[],{optionId:"skip",summary:"Skip card effect"}]}if(effect.kind==="reduce-cost"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Reduce ${describeCardOption(state,optionId,db)}'s cost`})),{optionId:"skip",summary:"Choose no Character"}]}if(effect.kind==="mechanic-choice"&&effect.choice.kind==="order-to-bottom"){const choice=effect.choice;const{instanceIds}=choice;return getMechanicChoiceOptions(state,choice,db).map(optionId=>{const order=parseOrderOption(optionId,instanceIds.length)??[];const names=order.map(index=>describeCardOption(state,instanceIds[index],db));if(!choice.alternate){const destination=choice.to.zone==="deck"&&choice.to.position==="bottom"?void 0:describeMoveDestination(choice.to);return{optionId,summary:orderSummary(names,destination===void 0?void 0:{primary:destination})}}return{optionId,summary:orderSummary(names,{primary:describeMoveDestination(choice.to),alternate:describeMoveDestination(choice.alternate),atPrimary:parseOrderSplit(optionId,names.length)??names.length})}})}if(effect.kind==="mechanic-choice"&&effect.choice.kind==="blind-hand-pick"){const{instanceIds,targetPlayerId}=effect.choice;const whose=targetPlayerId===effect.playerId?"your":"your opponent's";return getMechanicChoiceOptions(state,effect.choice,db).map((optionId,index)=>({optionId,summary:`Choose face-down card ${index+1} of ${instanceIds.length} from ${whose} hand`}))}if(effect.kind==="mechanic-choice"){const choice=effect.choice;return getMechanicChoiceOptions(state,choice,db).map(optionId=>({optionId,summary:choice.kind==="choice"?choice.branches.find(branch=>branch.id===optionId)?.label??optionId:choice.kind==="area-replacement"?`Trash ${describeCardOption(state,optionId,db)} to make room for ${db.require(choice.card.cardNumber).name}`:choice.kind==="rest-opponent-cards"?optionId==="skip"?"Rest no more cards":optionId==="don"?"Rest 1 opponent DON!!":`Rest ${describeCardOption(state,optionId,db)}`:choice.kind==="return-don-choice"?`Return ${optionId.slice("return:".length)} DON!! to your DON!! deck`:choice.kind==="order-reactions"?`Resolve ${reactionSourceName(choice.reactions,optionId,db)}'s effect first`:choice.kind==="give-rested-don"?optionId==="skip"?"Give no DON!!":(()=>{const gift=parseGiftOption(state,choice,optionId);return`Give ${String(gift?.count??1)} ${choice.from==="active"?"active":"rested"} DON!! to ${describeCardOption(state,gift?.recipient??optionId,db)}`})():optionId==="apply"?optionalEffectSummary(effect.sourceCardNumber,choice.kind==="optional"?choice.effect:void 0,db):optionId==="skip"&&choice.kind==="optional"&&onceKeyOf(choice.effect)===void 0&&!isClauseOpeningOptional(effect.sourceCardNumber,choice.effect)?`Skip this step of ${db.require(effect.sourceCardNumber).name} [${effect.sourceCardNumber}]'s effect`:optionId==="skip"?`Don't apply ${db.require(effect.sourceCardNumber).name} [${effect.sourceCardNumber}]'s effect`:optionId==="done"?"Choose no more cards":`Choose ${describeCardOption(state,optionId,db)}`}))}if(effect.kind==="add-top-deck-to-life"){return[{optionId:"apply",summary:"Add the top deck card to Life"},{optionId:"skip",summary:"Skip card effect"}]}if(effect.kind==="search-top-five"){return[...effect.eligibleInstanceIds.map(optionId=>{const card=effect.revealed.find(candidate=>candidate.instanceId===optionId);if(!card)throw new Error(`MISSING_SEARCH_CARD: ${optionId}`);return{optionId:`search-select:${optionId}`,optionCardNumber:card.cardNumber,summary:`Add ${db.require(card.cardNumber).name} to hand`}}),{optionId:"search-select:skip",summary:"Add no card"}]}if(effect.kind==="free-play"){return[...effect.eligibleInstanceIds.map(optionId=>{const card=state.players[effect.playerId].hand.find(candidate=>candidate.instanceId===optionId);if(!card)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);return{optionId,summary:`Play ${db.require(card.cardNumber).name} for free`}}),{optionId:"skip",summary:"Play no card"}]}if(effect.kind==="navy-discard"){return[...effect.eligibleInstanceIds.map(optionId=>{const card=state.players[effect.playerId].hand.find(candidate=>candidate.instanceId===optionId);if(!card)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);return{optionId,summary:`Trash ${db.require(card.cardNumber).name}`}}),...effect.optional?[{optionId:"skip",summary:"Skip card effect"}]:[]]}if(effect.kind==="hand-trash-replacement"){return effect.eligibleInstanceIds.map(optionId=>{const card=state.players[effect.playerId].hand.find(candidate=>candidate.instanceId===optionId);if(!card)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);return{optionId,summary:`Trash ${db.require(card.cardNumber).name}`}})}if(effect.kind==="bottom-deck-character"||effect.kind==="prevent-attack"){return[...effect.eligibleInstanceIds.filter(optionId=>{if(effect.kind!=="bottom-deck-character")return true;const target=state.players[effect.targetPlayerId].board.find(card=>card.instanceId===optionId);return!target||!isRemovalImmune(state,effect.targetPlayerId,target,effect.playerId,void 0,db,"off-field")}).map(optionId=>({optionId,summary:effect.kind==="bottom-deck-character"?`Place ${describeCardOption(state,optionId,db)} at the bottom of its owner's deck`:`Prevent ${describeCardOption(state,optionId,db)} from attacking`})),{optionId:"skip",summary:"Choose no more Characters"}]}if(effect.kind==="damage-replacement"){return[...effect.protectorInstanceIds.map(instanceId=>({optionId:damageReplacementOption(instanceId),summary:`Trash ${describeCardOption(state,instanceId,db)} instead of taking the damage`})),{optionId:"skip",summary:"Take the damage"}]}if(effect.kind==="battle-ko-replacement"){return[...effect.lifeProtection===false?[]:[{optionId:"apply",summary:"Add the top Life card to your hand instead of losing this Character"}],...effect.mechanicOptions??[],{optionId:"skip",summary:"Let the Character be K.O.'d"}]}if(effect.kind==="opponent-discard"){return effect.eligibleInstanceIds.map(optionId=>{const card=state.players[effect.playerId].hand.find(candidate=>candidate.instanceId===optionId);if(!card)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);return{optionId,summary:`Trash ${db.require(card.cardNumber).name}`}})}if(effect.kind==="navy-search"){return[...effect.eligibleInstanceIds.map(optionId=>{const card=effect.revealed.find(candidate=>candidate.instanceId===optionId);if(!card)throw new Error(`MISSING_SEARCH_CARD: ${optionId}`);return{optionId,optionCardNumber:card.cardNumber,summary:`Add ${db.require(card.cardNumber).name} to hand`}}),{optionId:"skip",summary:"Choose no more cards"}]}if(effect.kind==="free-play-rested"){return[...effect.eligibleInstanceIds.map(optionId=>{const card=state.players[effect.playerId].hand.find(candidate=>candidate.instanceId===optionId);if(!card)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);return{optionId,summary:`Play ${db.require(card.cardNumber).name} rested`}}),{optionId:"skip",summary:"Play no card"}]}if(effect.kind==="discard-for-life"||effect.kind==="discard-supernova-draw-two"){return[...effect.eligibleInstanceIds.map(optionId=>{const card=state.players[effect.playerId].hand.find(candidate=>candidate.instanceId===optionId);if(!card)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);return{optionId,summary:`Trash ${db.require(card.cardNumber).name}`}}),{optionId:"skip",summary:"Skip card effect"}]}if(effect.kind==="bege-life-swap"){if(effect.stage==="take-life"){return[{optionId:"top",summary:"Take the top Life card"},...state.players[effect.playerId].life.length>1?[{optionId:"bottom",summary:"Take the bottom Life card"}]:[],{optionId:"skip",summary:"Skip card effect"}]}return[...effect.eligibleInstanceIds.map(optionId=>{const card=state.players[effect.playerId].hand.find(candidate=>candidate.instanceId===optionId);if(!card)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);return{optionId,summary:`Place ${db.require(card.cardNumber).name} on Life face-up`}}),{optionId:"skip",summary:"Place no card"}]}if(effect.kind==="move-character-to-life"){return[...effect.eligibleInstanceIds.filter(optionId=>{const target=state.players[effect.targetPlayerId].board.find(card=>card.instanceId===optionId);return!target||!isRemovalImmune(state,effect.targetPlayerId,target,effect.playerId,void 0,db,"off-field")}).flatMap(optionId=>[{optionId:`top:${optionId}`,summary:`Move ${describeCardOption(state,optionId,db)} to the top of Life face-up`},{optionId:`bottom:${optionId}`,summary:`Move ${describeCardOption(state,optionId,db)} to the bottom of Life face-up`}]),{optionId:"skip",summary:"Move no Character"}]}if(effect.kind==="trash-opponent-life"){return[{optionId:"apply",summary:"Trash the top Life card"},{optionId:"skip",summary:"Trash no Life card"}]}if(effect.kind==="kid-leader-end-turn"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Set ${describeCardOption(state,optionId,db)} active and give it Blocker`})),{optionId:"skip",summary:"Skip Leader effect"}]}if(effect.kind==="borsalino-end-turn"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`DON!! −2: set ${describeCardOption(state,optionId,db)} active and give it Blocker`})),{optionId:"skip",summary:"Skip Borsalino effect"}]}if(effect.kind==="reduce-power"){const amount=effect.applyAllAtOnce?effect.amount*effect.remaining:effect.amount;return[...state.players[effect.targetPlayerId].board.map(card=>({optionId:card.instanceId,summary:`Give ${db.require(card.cardNumber).name} ${amount} power`})),{optionId:"skip",summary:"Stop reducing power"}]}if(effect.kind==="give-rested-don"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Give rested DON!! to ${optionId.endsWith("-leader")?"Leader":db.require(state.players[effect.playerId].board.find(card=>card.instanceId===optionId).cardNumber).name}`})),{optionId:"skip",summary:"Give no DON!!"}]}if(effect.kind==="gatling-gun"){if(effect.stage==="give-don"){return[...effect.eligibleInstanceIds.map(optionId=>{const name=optionId===leaderInstanceId3(effect.playerId)?db.require(state.players[effect.playerId].leaderCardNumber).name:db.require(state.players[effect.playerId].board.find(card=>card.instanceId===optionId).cardNumber).name;return{optionId,summary:`Give 1 rested DON!! to ${name}`}}),{optionId:"skip",summary:"Give no DON!!"}]}return[...effect.eligibleInstanceIds.map(optionId=>{const target=state.players[opponentOf4(effect.playerId)].board.find(card=>card.instanceId===optionId);if(!target)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);return{optionId,summary:`Give ${db.require(target.cardNumber).name} -2000 power this turn`}}),{optionId:"skip",summary:"Reduce no Character's power"}]}if(effect.kind==="bad-manners-counter"){const seenCardNumbers=new Set;const discards=effect.eligibleInstanceIds.flatMap(optionId=>{const card=state.players[effect.playerId].hand.find(candidate=>candidate.instanceId===optionId);if(!card)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);if(seenCardNumbers.has(card.cardNumber))return[];seenCardNumbers.add(card.cardNumber);const definition=db.require(card.cardNumber);return[{optionId,summary:`Trash ${definition.name} [${definition.cardNumber}]`}]});return[...discards,{optionId:"skip",summary:"Trash nothing: no card gains +3000"}]}if(effect.kind==="draw-trash"){return state.players[effect.playerId].hand.map(card=>({optionId:card.instanceId,summary:`Trash ${db.require(card.cardNumber).name}`}))}if(effect.kind==="kinemon-cost"){const player=state.players[effect.playerId];return[...!player.leaderRested?[{optionId:"leader",summary:"Rest your Leader"}]:[],...player.activeDon.length>0?[{optionId:"don",summary:"Rest 1 DON!!"}]:[],{optionId:"skip",summary:"Skip card effect"}]}if(effect.kind==="prevent-rest"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Prevent ${describeCardOption(state,optionId,db)} from being rested`})),{optionId:"skip",summary:"Skip card effect"}]}if(effect.kind==="rest-opponent-card"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Rest ${db.require(state.players[effect.targetPlayerId].board.find(card=>card.instanceId===optionId).cardNumber).name}`})),...state.players[effect.targetPlayerId].activeDon.length>0?[{optionId:"don",summary:"Rest 1 opponent DON!!"}]:[],{optionId:"skip",summary:"Rest no more cards"}]}if(effect.kind==="prevent-refresh"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Prevent ${db.require(state.players[effect.targetPlayerId].board.find(card=>card.instanceId===optionId).cardNumber).name} from becoming active`})),{optionId:"skip",summary:"Choose no more Characters"}]}if(effect.kind==="st34-discard"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Trash ${db.require(state.players[effect.playerId].hand.find(card=>card.instanceId===optionId).cardNumber).name}`})),{optionId:"skip",summary:"Skip card effect"}]}if(effect.kind==="st34-guess-cost"){return Array.from({length:11},(_,cost)=>({optionId:`cost:${cost}`,summary:`Choose cost ${cost}`}))}if(effect.kind==="set-base-power-zero"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Set ${describeCardOption(state,optionId,db)}'s base power to 0`})),{optionId:"skip",summary:"Choose no Character"}]}if(effect.kind==="st34-don-minus-ko"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Return 1 DON!! and K.O. ${describeCardOption(state,optionId,db)}`})),{optionId:"skip",summary:"Skip card effect"}]}if(effect.kind==="katakuri-leader"){return[{optionId:"apply",summary:"Return 1 DON!! and gain +1000 power"},{optionId:"skip",summary:"Skip Leader effect"}]}if(effect.kind==="nami-leader"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Trash ${describeCardOption(state,optionId,db)} to give this Leader +2000 power`})),{optionId:"skip",summary:"Skip Leader effect"}]}if(effect.kind==="st34-power-boost"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Give ${describeCardOption(state,optionId,db)} +2000 power`})),{optionId:"skip",summary:"Choose no Katakuri"}]}if(effect.kind==="return-own-for-free-play"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Return ${db.require(state.players[effect.playerId].board.find(card=>card.instanceId===optionId).cardNumber).name} to hand`})),{optionId:"skip",summary:"Skip card effect"}]}if(effect.kind==="grant-prisoner-blocker"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Give ${describeCardOption(state,optionId,db)} Blocker for this turn`})),{optionId:"skip",summary:"Give no card Blocker"}]}if(effect.kind==="replacement-choice"){if(effect.options.some(option=>option.mandatory)){return effect.options.map(({optionId,summary})=>({optionId,summary}))}return[...effect.options,{optionId:"skip",summary:`Allow ${db.require(state.players[effect.playerId].board.find(card=>card.instanceId===effect.targetInstanceId)?.cardNumber??effect.sourceCardNumber).name} to be K.O.'d`}]}if(effect.kind==="slave-arrow-cost"&&effect.step==="target"){const player=state.players[effect.playerId];const attacked=state.activeAttack?.targetInstanceId;return effect.eligibleInstanceIds.map(optionId=>{const name=optionId===`${effect.playerId}-leader`?"your Leader":db.require(player.board.find(card=>card.instanceId===optionId).cardNumber).name;const aside=optionId===attacked?"":", which is not the card being attacked";return{optionId,summary:`+${effect.power} power on ${name} during this battle${aside}`}})}if(effect.kind==="slave-arrow-cost"){return[...effect.eligibleInstanceIds.map(optionId=>({optionId,summary:`Return ${db.require(state.players[effect.playerId].board.find(card=>card.instanceId===optionId).cardNumber).name} to hand for +${effect.power} power`})),{optionId:"skip",summary:"Pay no cost, so Slave Arrow adds nothing"}]}const targetPlayer=state.players[effect.targetPlayerId];return[...effect.eligibleInstanceIds.flatMap(optionId=>{const target=targetPlayer.board.find(card=>card.instanceId===optionId);if(!target)throw new Error(`MISSING_EFFECT_TARGET: ${optionId}`);if(effect.kind==="ko-character"&&isRemovalImmune(state,effect.targetPlayerId,target,effect.playerId)){return[]}return[{optionId,summary:effect.kind==="ko-character"?`K.O. ${db.require(target.cardNumber).name}`:`Rest ${db.require(target.cardNumber).name}`}]}),{optionId:"skip",summary:"Skip card effect"}]}var KEEPS_EFFECT_PENDING=new Set(["character-area-replacement","p105-life-cost","st35-attack-cost","reduce-cost","replacement-choice","mechanic-choice","return-own-for-free-play","slave-arrow-cost","grant-prisoner-blocker","rest-opponent-card","prevent-refresh"]);function resolveEffect(state,optionId,db=cards){const effect=state.pendingEffect;if(!effect)throw new Error("NO_PENDING_EFFECT");if(!KEEPS_EFFECT_PENDING.has(effect.kind))state.pendingEffect=null;const resolve=EFFECT_RESOLVERS[effect.kind];return resolve({state,effect,optionId,db})}function cloneGameData(value){if(value===null||typeof value!=="object")return value;if(Array.isArray(value)){const length=value.length;const copy2=new Array(length);for(let index=0;index<length;index+=1)copy2[index]=cloneGameData(value[index]);return copy2}const prototype=Object.getPrototypeOf(value);if(prototype!==Object.prototype&&prototype!==null)return structuredClone(value);const copy={};for(const key of Object.keys(value))copy[key]=cloneGameData(value[key]);return copy}function getCounterEventProgram(cardNumber){return counterEventPrograms.get(cardNumber)}function getOnOpponentAttackProgram(cardNumber){return onOpponentAttackPrograms.get(cardNumber)}function getLeaderWatcherProgram(cardNumber){return leaderWatcherPrograms.get(cardNumber)}function normalizeWhenAttacking(entry){return"program"in entry?entry:{oncePerTurn:false,program:entry}}function getActivateMainProgram(cardNumber){return activateMainPrograms.get(cardNumber)}function getWhenAttackingMechanicProgram(cardNumber){const entry=whenAttackingPrograms.get(cardNumber);return entry===void 0?void 0:normalizeWhenAttacking(entry)}function getWhenRestedProgram(cardNumber){return whenRestedPrograms.get(cardNumber)}function whenRestedInvocation(state,ownerId,card,restedBy){const entry=getWhenRestedProgram(card.cardNumber);if(!entry)return null;if(effectsNegated(state,card.instanceId))return null;if(entry.yourTurnOnly&&state.turnPlayerId!==ownerId)return null;if(entry.source!==void 0){if(!restedBy||restedBy.sourcePlayerId===ownerId)return null;if(entry.source==="opponent-character-effect"&&!restedBy.sourceIsCharacter){return null}}return{context:{sourcePlayerId:ownerId,source:card},program:entry.program}}function getEventMainProgram(cardNumber){return eventMainPrograms.get(cardNumber)}function onBlockInvocation(state,playerId,card){const entry=onBlockPrograms.get(card.cardNumber);if(!entry)return null;if(effectsNegated(state,card.instanceId))return null;const player=state.players[playerId];const requires=entry.requires;if(requires){if(requires.handCards!==void 0&&player.hand.length<requires.handCards||requires.activeDon!==void 0&&player.activeDon.length<requires.activeDon||requires.fieldDon!==void 0&&fieldDonCount(state,playerId)<requires.fieldDon){return null}}const oncePerTurnKey=`${state.turn}:${playerId}:${card.instanceId}:on-block`;if(entry.oncePerTurn&&state.oncePerTurn.includes(oncePerTurnKey)){return null}return{invocation:{context:{sourcePlayerId:playerId,source:card},program:entry.program},oncePerTurnKey}}function getOnEndOfYourTurnMechanicProgram(cardNumber){return onEndOfYourTurnPrograms.get(cardNumber)}function getOnStartOfYourTurnMechanicProgram(cardNumber){return onStartOfYourTurnPrograms.get(cardNumber)}var DON_COUNT_CONDITIONS=new Set(["field-don","active-don","rested-don"]);var DON_DECK_DRAWS=new Set(["add-don","add-don-at-end-of-turn","equalize-don-at-end-of-turn"]);function donCountReaders(){const reactions=new Set(donReturnedReactionCards());const ceilings=new Set(STATIC_OWN_DON_CEILING_CARDS);const ramps=new Map;const opponent=new Set(STATIC_OPPONENT_DON_READERS);const classify=(cardNumber,node,own,paid)=>{if(node===null||typeof node!=="object")return;if(Array.isArray(node)){for(const item of node)classify(cardNumber,item,own,paid);return}const record=node;const kind=record.kind;if(kind==="field-don-versus"){if(own)ceilings.add(cardNumber);opponent.add(cardNumber)}else if(typeof kind==="string"&&DON_COUNT_CONDITIONS.has(kind)){if(record.player==="opponent")opponent.add(cardNumber);else if(own&&(record.operator==="lte"||record.operator==="lt")){ceilings.add(cardNumber)}}else if(own&&!paid&&typeof kind==="string"&&DON_DECK_DRAWS.has(kind)&&record.player!=="opponent"){const count2=typeof record.count==="number"?record.count:Number.POSITIVE_INFINITY;ramps.set(cardNumber,Math.max(ramps.get(cardNumber)??0,count2))}else if(kind==="don-returned"){if(record.returnedBy==="opponent")opponent.add(cardNumber);else if(own)reactions.add(cardNumber)}if(kind==="sequence"&&Array.isArray(record.effects)){let returned=paid;for(const effect of record.effects){classify(cardNumber,effect,own,returned);const step2=effect;if(step2?.kind==="return-don"&&step2.player!=="opponent"){returned=true}}return}const paysFor=kind==="return-don-choice"&&record.player!=="opponent";for(const value of Object.values(record)){classify(cardNumber,value,own,paid||paysFor)}};for(const rule of REACTION_RULES){classify(rule.cardNumber,rule,true,rule.signal.kind==="don-returned")}for(const[cardNumber,entry]of triggerPrograms){classify(cardNumber,entry,false,false)}for(const registry2 of[onPlayPrograms,onKoPrograms,onEndOfYourTurnPrograms,onStartOfYourTurnPrograms,whenAttackingPrograms,whenRestedPrograms,activateMainPrograms,eventMainPrograms,counterEventPrograms,onOpponentAttackPrograms,onBlockPrograms,leaderWatcherPrograms,replacementPrograms]){for(const[cardNumber,entry]of registry2){classify(cardNumber,entry,true,false)}}return{reactions,ceilings,ramps,opponent}}function mechanicProgramsByClause(){return new Map([["[On Play]",new Set(onPlayPrograms.keys())],["[On Block]",new Set(onBlockPrograms.keys())],["[On K.O.]",new Set(onKoPrograms.keys())],["[End of Your Turn]",new Set(onEndOfYourTurnPrograms.keys())],["[Activate: Main]",new Set(activateMainPrograms.keys())],["[When Attacking]",new Set(whenAttackingPrograms.keys())],["[Main]",new Set(eventMainPrograms.keys())],["[Counter]",new Set(counterEventPrograms.keys())],["[Trigger]",new Set(triggerPrograms.keys())],["[On Your Opponent's Attack]",new Set(onOpponentAttackPrograms.keys())],["[On Opponent's Attack]",new Set(onOpponentAttackPrograms.keys())]])}function getOnPlayMechanicProgram(cardNumber){return onPlayPrograms.get(cardNumber)}function getOnKoMechanicProgram(cardNumber,cause="effect",byOwnEffect=false){const entry=onKoPrograms.get(cardNumber);if(!entry)return void 0;if(!("opponentEffectOnly"in entry))return entry;return entry.opponentEffectOnly&&(cause==="battle"||byOwnEffect)?void 0:entry.program}function getTriggerMechanicProgram(cardNumber){return triggerPrograms.get(cardNumber)}function triggerProgramCanAct(state,playerId,card,db=cards){const program=getTriggerMechanicProgram(card.cardNumber);if(!program)return false;if(program.effect.kind==="choose"&&program.effect.min===0)return true;return programCanAct(state,{sourcePlayerId:playerId,source:card},program,db)}function programCanAct(state,context,program,db=cards,bindings){const probe=cloneGameData(state);const before=JSON.stringify(probe);let result;try{result=executeMechanicProgram(probe,context,program,db,bindings)}catch{return false}if(result.events.length>0||result.signals.length>0)return true;if(result.pending){return getMechanicChoiceOptions(probe,result.pending,db).some(option=>option!=="done")}return JSON.stringify(probe)!==before}function leaderReactionSpent(state,playerId){const cardNumber=state.players[playerId].leaderCardNumber;const printsOne=REACTION_RULES.some(rule=>rule.cardNumber===cardNumber&&rule.controller==="leader"&&rule.oncePerTurn);if(!printsOne)return false;return state.oncePerTurn.includes(`${String(state.turn)}:${playerId}:${cardNumber}:reaction`)}function applyMechanicReactions(state,signals,db=cards){return dispatchMechanicInvocations(state,getMechanicSignalInvocations(state,signals,false),db)}function getMechanicSignalInvocations(state,signals,includeOnKo=true,db=cards,includeOnPlay=true){const invocations=[];for(const signal of signals){if("card"in signal&&effectsNegated(state,signal.card.instanceId)){continue}if(signal.kind==="card-played"){const program=includeOnPlay?getOnPlayMechanicProgram(signal.card.cardNumber):void 0;if(program){invocations.push({context:{sourcePlayerId:signal.playerId,source:signal.card},program,onField:true})}else if(includeOnPlay&&hasOnPlayHandler(signal.card.cardNumber)){invocations.push({context:{sourcePlayerId:signal.playerId,source:signal.card},onPlayHandler:true,onField:true})}}else if(signal.kind==="card-rested"){const invocation=whenRestedInvocation(state,signal.ownerId,signal.card,{sourcePlayerId:signal.sourcePlayerId,sourceIsCharacter:signal.sourceIsCharacter});if(invocation)invocations.push("program"in invocation?{...invocation,automatic:true}:invocation)}else if(includeOnKo&&signal.kind==="card-moved"&&signal.from==="board"&&signal.ko===true){const program=getOnKoMechanicProgram(signal.card.cardNumber,"effect",signal.sourcePlayerId===signal.ownerId);if(program){invocations.push({context:{sourcePlayerId:signal.ownerId,source:signal.card},program,automatic:true})}}}const turnPlayerId=state.turnPlayerId;const offeredKeys=new Set;for(const signal of signals){for(const playerId of["p1","p2"]){for(const rule of REACTION_RULES){const sources=rule.controller==="leader"?state.players[playerId].leaderCardNumber===rule.cardNumber?[{instanceId:`${playerId}-leader`,cardNumber:rule.cardNumber}]:[]:rule.controller==="stage"?state.players[playerId].stage?.cardNumber===rule.cardNumber?[state.players[playerId].stage]:[]:state.players[playerId].board.filter(card=>card.cardNumber===rule.cardNumber);const exited=rule.answersOwnExit===true&&signal.kind==="card-moved"&&signal.from==="board"&&signal.ownerId===playerId&&signal.card.cardNumber===rule.cardNumber&&!sources.some(source=>source.instanceId===signal.card.instanceId)?signal.card:void 0;if(exited)sources.push(exited);if(signal.kind!==rule.signal.kind||sources.length===0||rule.ownTurn&&turnPlayerId!==playerId||rule.opponentTurn&&turnPlayerId===playerId||rule.maxHandSize!==void 0&&state.players[playerId].hand.length>rule.maxHandSize||rule.leaderAttachedDon!==void 0&&state.players[playerId].leaderAttachedDon.length<rule.leaderAttachedDon){continue}if(signal.kind==="card-played"&&rule.signal.kind==="card-played"){const played=db.require(signal.card.cardNumber);const playedBy=rule.signal.playedBy==="self"?playerId:playerId==="p1"?"p2":"p1";if(signal.playerId!==playedBy||played.category!==rule.signal.category||rule.signal.minBaseCost!==void 0&&(played.cost??0)<rule.signal.minBaseCost||rule.signal.hasTrigger!==void 0&&played.rules.hasTrigger!==rule.signal.hasTrigger||rule.signal.bySourceCategory!==void 0&&signal.bySourceCategory!==rule.signal.bySourceCategory){continue}}else if(signal.kind==="card-moved"&&rule.signal.kind==="card-moved"){const moved=db.require(signal.card.cardNumber);if(signal.from!==rule.signal.from||signal.to===signal.from||rule.signal.to!==void 0&&signal.to!==rule.signal.to||rule.signal.ko===true&&signal.ko!==true||rule.signal.movedOwner==="self"&&signal.ownerId!==playerId||rule.signal.movedOwner==="opponent"&&signal.ownerId===playerId||rule.signal.movedType!==void 0&&!hasCardType(signal.card.cardNumber,rule.signal.movedType)||rule.signal.movedTypeIncluding!==void 0&&!hasCardTypeIncluding(signal.card.cardNumber,rule.signal.movedTypeIncluding)||rule.signal.movedAnyOfTypes!==void 0&&!rule.signal.movedAnyOfTypes.some(type=>hasCardType(signal.card.cardNumber,type))||rule.signal.movedMinPower!==void 0&&((signal.from==="board"?departedCardBasePower(state,signal.ownerId,signal.card,db):moved.power)??0)<rule.signal.movedMinPower||rule.signal.movedAttribute!==void 0&&!hasCardAttribute(signal.card.cardNumber,rule.signal.movedAttribute)||rule.signal.movedLacksKeyword!==void 0&&moved.rules.keywords.includes(rule.signal.movedLacksKeyword)||rule.signal.sourceType!==void 0&&(signal.sourceCardNumber===void 0||!hasCardType(signal.sourceCardNumber,rule.signal.sourceType))||rule.signal.bySource==="self"&&signal.sourcePlayerId!==playerId||rule.signal.bySource==="opponent"&&(signal.sourcePlayerId===void 0||signal.sourcePlayerId===playerId)||rule.signal.byLeaderAttack===true&&signal.byLeaderAttack!==true){continue}}else if(signal.kind==="event-activated"&&rule.signal.kind==="event-activated"){const activatedBy=rule.signal.activatedBy==="self"?playerId:playerId==="p1"?"p2":"p1";if(signal.playerId!==activatedBy)continue}else if(signal.kind==="blocker-activated"&&rule.signal.kind==="blocker-activated"){const activatedBy=rule.signal.activatedBy==="self"?playerId:playerId==="p1"?"p2":"p1";if(signal.playerId!==activatedBy)continue}else if(signal.kind==="card-rested"&&rule.signal.kind==="card-rested"){const restedBy=rule.signal.restedBy==="self"?playerId:playerId==="p1"?"p2":"p1";if(signal.sourcePlayerId!==restedBy)continue}else if(signal.kind==="trigger-activated"&&rule.signal.kind==="trigger-activated"){}else if(signal.kind==="don-returned"&&rule.signal.kind==="don-returned"){if(signal.playerId!==playerId)continue;if(signal.count<(rule.signal.minCount??1))continue}else if(signal.kind==="card-drawn"&&rule.signal.kind==="card-drawn"){const drawnBy=rule.signal.drawnBy==="self"?playerId:playerId==="p1"?"p2":"p1";if(signal.playerId!==drawnBy)continue}else{continue}const key=`${state.turn}:${playerId}:${rule.cardNumber}:reaction`;const copyKey=instanceId=>`${state.turn}:${playerId}:${instanceId}:reaction`;if(rule.oncePerTurn&&!rule.oncePerCopy&&state.oncePerTurn.includes(key)){continue}if(rule.condition!==void 0&&!conditionMatches(state,{sourcePlayerId:playerId,source:sources[0]},rule.condition,{},db)){continue}const armed=sources.filter(source=>{if(rule.oncePerTurn&&rule.oncePerCopy&&state.oncePerTurn.includes(copyKey(source.instanceId))){return false}if(rule.sourceAttachedDon===void 0)return true;const attached=source.attachedDon;return(attached?.length??0)>=rule.sourceAttachedDon});if(armed.length===0)continue;for(const source of armed){const useKey=rule.oncePerCopy?copyKey(source.instanceId):key;if(rule.oncePerTurn&&offeredKeys.has(useKey))continue;if(rule.oncePerTurn)offeredKeys.add(useKey);invocations.push({context:{sourcePlayerId:playerId,source},program:rule.oncePerTurn?onceProgram(rule,useKey):rule.program,automatic:true,...rule.oncePerTurn?{declinable:rule.program}:{},...source===exited?{answersOwnExit:true}:{}})}}}}return orderSimultaneous(state,invocations)}function onceKeyOf(effect){if(effect?.kind!=="sequence")return void 0;const first=effect.effects[0];return first?.kind==="spend-once-per-turn"?first.key:void 0}function onceProgram(rule,key){const{program}=rule;const spend={kind:"spend-once-per-turn",key};if(!rule.optionalActivation&&program.effect.kind!=="optional"){return{...program,effect:{kind:"sequence",effects:[spend,program.effect]}}}const body=program.effect.kind==="optional"?program.effect.effect:program.effect;return{...program,effect:{...program.effect.kind==="optional"?program.effect:{},kind:"optional",effect:{kind:"sequence",effects:[spend,body]}}}}function orderSimultaneous(state,invocations){const turnPlayer2=state.turnPlayerId;const ordered=[...invocations.filter(invocation=>invocation.context.sourcePlayerId===turnPlayer2),...invocations.filter(invocation=>invocation.context.sourcePlayerId!==turnPlayer2)];for(const playerId of[turnPlayer2,opponentOf4(turnPlayer2)]){const group=ordered.filter(invocation=>invocation.context.sourcePlayerId===playerId);const cards2=new Set(group.map(invocation=>invocation.context.source.cardNumber));if(cards2.size<2)continue;const id=`${String(state.revision)}:${playerId}:${group.map(invocation=>invocation.context.source.instanceId).join(",")}`;for(const invocation of group)invocation.orderGroup=id}return ordered}var fieldReactionPrograms;function isFieldReaction(invocation){if(fieldReactionPrograms===void 0){fieldReactionPrograms=new Map;for(const rule of REACTION_RULES){if(rule.controller==="leader")continue;const known=fieldReactionPrograms.get(rule.cardNumber)??new Set;known.add(JSON.stringify(rule.program));fieldReactionPrograms.set(rule.cardNumber,known)}}return fieldReactionPrograms.get(invocation.context.source.cardNumber)?.has(JSON.stringify(invocation.declinable??invocation.program))??false}function leftFieldBeforeActivating(state,invocation){if(invocation.onField!==true){if(!("program"in invocation)||!invocation.automatic)return false;if(invocation.answersOwnExit)return false;if(!isFieldReaction(invocation))return false}const player=state.players[invocation.context.sourcePlayerId];const{instanceId}=invocation.context.source;return!player.board.some(card=>card.instanceId===instanceId)&&player.stage?.instanceId!==instanceId}function dispatchMechanicInvocations(state,queued,db=cards){const continuations=queued.filter(invocation=>!leftFieldBeforeActivating(state,invocation)).map(withoutDuringEffect);const events=[];while(continuations.length>0){if(state.pendingTrigger?.fromEffect){queuePendingContinuations(state,continuations);return{pending:null,invocation:null,continuations:[],events}}const ordering=takeOrderGroup(continuations);if(ordering){return{pending:ordering.pending,invocation:ordering.invocation,continuations,events}}const invocation=continuations.shift();if(!("program"in invocation)){queuePendingContinuations(state,[invocation,...continuations]);return{pending:null,invocation:null,continuations:[],events}}const onceKey=invocation.declinable?onceKeyOf(invocation.program.effect.kind==="optional"?invocation.program.effect.effect:invocation.program.effect):void 0;if(onceKey!==void 0&&state.oncePerTurn.includes(onceKey))continue;if(invocation.declinable&&!programCanAct(state,invocation.context,invocation.declinable,db,invocation.bindings)){if(onceKey!==void 0&&invocation.program.effect.kind!=="optional"){state.oncePerTurn.push(onceKey)}continue}const result=executeMechanicProgram(state,invocation.context,invocation.program,db,invocation.bindings);if(invocation.automatic&&!invocation.declinable&&result.events.length>0){events.push({type:"ability-triggered",playerId:invocation.context.sourcePlayerId,sourceCardNumber:invocation.context.source.cardNumber,sourceInstanceId:invocation.context.source.instanceId})}events.push(...result.events);const raised=getMechanicSignalInvocations(state,result.signals);if(result.pending){continuations.push(...raised.map(duringEffect));return{pending:result.pending,invocation,continuations,events}}continuations.push(...raised)}return{pending:null,invocation:null,continuations:[],events}}var duringEffect=invocation=>({...invocation,duringEffect:true});function withoutDuringEffect(invocation){if(invocation.duringEffect!==true)return invocation;const released={...invocation};delete released.duringEffect;return released}function takeOrderGroup(queue){const head=queue[0];if(!head||head.orderGroup===void 0)return null;let end=1;while(end<queue.length&&queue[end].orderGroup===head.orderGroup){end+=1}const group=queue.slice(0,end);if(orderReactionOptions(group).length<2){for(const invocation of group)delete invocation.orderGroup;return null}queue.splice(0,end);return{pending:{kind:"order-reactions",execution:{context:head.context,bindings:{},queue:[]},reactions:group},invocation:head}}function dispatchMechanicSignals(state,signals,db=cards){return dispatchMechanicInvocations(state,getMechanicSignalInvocations(state,signals),db)}function optionalClauseMarker(cardNumber){if(optionalClauseMarkers===void 0){optionalClauseMarkers=buildOptionalClauseMarkers()}return optionalClauseMarkers.get(cardNumber)}var optionalClauseMarkers;function isClauseOpeningOptional(cardNumber,effect){if(openingOptionals===void 0){openingOptionals=buildOpeningOptionals()}const opening=openingOptionals.get(cardNumber);return opening===void 0||opening.has(JSON.stringify(effect))}var openingOptionals;function firstOptionalEffect(entry,depth=0){if(entry===null||typeof entry!=="object"||depth>64){return void 0}const node=entry;if(node.kind==="optional")return node.effect;for(const value of Object.values(entry)){const found=firstOptionalEffect(value,depth+1);if(found!==void 0)return found}return void 0}function buildOpeningOptionals(){const opening=new Map;for(const[,registry2]of markerRegistries()){for(const[cardNumber,entry]of registry2){const effect=firstOptionalEffect(entry);if(effect===void 0)continue;const known=opening.get(cardNumber)??new Set;known.add(JSON.stringify(effect));opening.set(cardNumber,known)}}return opening}function offersOptional(entry,depth=0){if(entry===null||typeof entry!=="object"||depth>64)return false;if(entry.kind==="optional")return true;return Object.values(entry).some(value=>offersOptional(value,depth+1))}function markerRegistries(){return[["[On Play]",onPlayPrograms],["[On Block]",onBlockPrograms],["[On K.O.]",onKoPrograms],["[End of Your Turn]",onEndOfYourTurnPrograms],["[Activate: Main]",activateMainPrograms],["[When Attacking]",whenAttackingPrograms],["[Main]",eventMainPrograms],["[Counter]",counterEventPrograms],["[Trigger]",triggerPrograms],["[On Your Opponent's Attack]",onOpponentAttackPrograms]]}function buildOptionalClauseMarkers(){const registries2=markerRegistries();const found=new Map;for(const[marker,registry2]of registries2){for(const[cardNumber,entry]of registry2){if(!offersOptional(entry))continue;const markers=found.get(cardNumber)??new Set;markers.add(marker);found.set(cardNumber,markers)}}const resolved=new Map;for(const[cardNumber,markers]of found){if(markers.size!==1)continue;const[marker]=markers;resolved.set(cardNumber,printedSpelling(cardNumber,marker))}return resolved}function printedSpelling(cardNumber,marker){if(marker!=="[On Your Opponent's Attack]")return marker;const printed=printedClauses(cardNumber);return printed.includes("[On Opponent's Attack]")?"[On Opponent's Attack]":marker}function boardPower(state,playerId,card,db){return boardCardPower(state,playerId,card,donPowerApplies(state,playerId),db)}var STATIC_HAND_DISCOUNTS=[{cardNumber:"OP17-005",amount:4,when:opponentHasHighPowerCharacter},{cardNumber:"OP17-013",amount:2,when:opponentHasHighPowerCharacter},{cardNumber:"OP16-005",amount:3,when:(state,playerId,db)=>state.players[playerId].board.some(card=>hasCardTypeIncluding(card.cardNumber,"Whitebeard Pirates")&&boardPower(state,playerId,card,db)>=8e3)},{cardNumber:"OP16-015",amount:2,when:(state,playerId,db)=>db.require(state.players[playerId].leaderCardNumber).name.includes("Ace")&&fieldDonCount(state,playerId)>=6}];function opponentHasHighPowerCharacter(state,playerId,db){const opponentId=playerId==="p1"?"p2":"p1";return state.players[opponentId].board.some(card=>boardPower(state,opponentId,card,db)>=1e4)}function staticHandDiscount(state,playerId,cardNumber,db){const entry=STATIC_HAND_DISCOUNTS.find(candidate=>candidate.cardNumber===cardNumber);const own=(entry&&entry.when(state,playerId,db)?entry.amount:0)-staticHandCostDelta(state,playerId,cardNumber,db);return own+staticHandPlayDiscount(state,playerId,cardNumber,db)}function playCostFromHand(state,playerId,cardNumber,printedCost,options={spend:false},db=cards){const player=state.players[playerId];const staticDiscount=staticHandDiscount(state,playerId,cardNumber,db);const discount=player.playDiscount;if(!discount||discount.turn!==state.turn||printedCost<discount.minCost||!hasCardName(cardNumber,discount.name)){return Math.max(0,printedCost-staticDiscount)}if(options.spend)delete player.playDiscount;return Math.max(0,printedCost-staticDiscount-discount.amount)}function eventActivationCost(state,playerId,cardNumber,programCost,db=cards){return Math.max(0,programCost-staticHandDiscount(state,playerId,cardNumber,db))}function applyActivateCounterEvent({state,events,activePlayer,offered,db}){const player=state.players[activePlayer];const eventIndex=player.hand.findIndex(card=>card.instanceId===offered.eventInstanceId);const[eventCard]=player.hand.splice(eventIndex,1);if(!eventCard||!state.activeAttack){throw new Error("INVALID_COUNTER_EVENT")}player.trash.push(eventCard);events.push({type:"event-activated",playerId:activePlayer,cardNumber:eventCard.cardNumber});if(eventCard.cardNumber==="OP12-057"){player.restedDon.push(...player.activeDon.splice(0,1));state.activeAttack.counterPower+=4e3;if(player.hand.length>0){state.pendingEffect={kind:"navy-discard",playerId:activePlayer,sourceCardNumber:eventCard.cardNumber,sourceInstanceId:eventCard.instanceId,eligibleInstanceIds:player.hand.map(card=>card.instanceId),remaining:1,optional:false,after:{kind:"none"},resumePhase:"counter",resumePlayerId:activePlayer}}}else if(eventCard.cardNumber==="OP12-098"){player.restedDon.push(...player.activeDon.splice(0,1));const power=counterEventPower(state,activePlayer,eventCard.cardNumber);state.activeAttack.counterPower+=power;events.push({type:"counter-used",playerId:activePlayer,cardNumber:eventCard.cardNumber,power})}else if(["OP15-074","OP15-075","OP15-076","OP15-078"].includes(eventCard.cardNumber)){const power=counterEventPower(state,activePlayer,eventCard.cardNumber);if(power>0){state.activeAttack.counterPower+=power;events.push({type:"counter-used",playerId:activePlayer,cardNumber:eventCard.cardNumber,power})}if(eventCard.cardNumber==="OP15-078"&&fieldDonCount(state,activePlayer)<=6){events.push(...drawCards(state,activePlayer,1,eventCard.cardNumber))}}else if(eventCard.cardNumber==="OP07-056"){player.restedDon.push(...player.activeDon.splice(0,1));state.pendingEffect={kind:"slave-arrow-cost",playerId:activePlayer,sourceCardNumber:eventCard.cardNumber,sourceInstanceId:eventCard.instanceId,step:"cost",eligibleInstanceIds:player.board.filter(card=>effectiveCost(state,activePlayer,card)>=2).map(card=>card.instanceId),power:4e3,resumePhase:"counter",resumePlayerId:activePlayer}}else if(eventCard.cardNumber==="OP11-079"){player.restedDon.push(...player.activeDon.splice(0,1));state.pendingEffect={kind:"st34-guess-cost",playerId:activePlayer,targetPlayerId:opponentOf2(activePlayer),sourceCardNumber:eventCard.cardNumber,sourceInstanceId:eventCard.instanceId,outcome:"counter-event",resumePhase:"counter",resumePlayerId:activePlayer}}else if(getCounterEventProgram(eventCard.cardNumber)){const program=getCounterEventProgram(eventCard.cardNumber);player.restedDon.push(...player.activeDon.splice(0,eventActivationCost(state,activePlayer,eventCard.cardNumber,program.cost,db)));if(program.donMinus){returnDonToDeck(state,activePlayer,program.donMinus,eventCard,events)}const power=counterEventPower(state,activePlayer,eventCard.cardNumber);if(power>0){state.activeAttack.counterPower+=power;events.push({type:"counter-used",playerId:activePlayer,cardNumber:eventCard.cardNumber,power})}if(program.program){const dispatched=dispatchMechanicInvocations(state,[{context:{sourcePlayerId:activePlayer,source:eventCard},program:program.program}]);events.push(...dispatched.events);if(dispatched.pending&&dispatched.invocation){state.pendingEffectResume={phase:"counter",playerId:activePlayer};state.pendingEffect=mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations);handOverPendingEffect(state)}}}else{state.pendingEffect={kind:"bad-manners-counter",playerId:activePlayer,sourceCardNumber:eventCard.cardNumber,sourceInstanceId:eventCard.instanceId,eligibleInstanceIds:player.hand.map(card=>card.instanceId)}}}function applyActivateMain({state,events,activePlayer,offered,db}){const player=state.players[activePlayer];const[kind,first]=offered.optionId.split(":");if(kind==="mechanic-main"&&first){const source=player.board.find(card=>card.instanceId===first)??(player.stage?.instanceId===first?player.stage:void 0)??(first===leaderInstanceId2(activePlayer)?{instanceId:first,cardNumber:player.leaderCardNumber}:void 0);if(!source)throw new Error(`MISSING_EFFECT_SOURCE: ${first}`);const activation=getActivateMainProgram(source.cardNumber);if(!activation)throw new Error(`MISSING_MAIN_PROGRAM: ${first}`);if(activation.oncePerTurn){state.oncePerTurn.push(`${state.turn}:${activePlayer}:${source.instanceId}:activate-main`)}const dispatched=dispatchMechanicInvocations(state,[{context:{sourcePlayerId:activePlayer,source},program:alreadyOptedIn(activation.program)}],db);if(!dispatched.pending&&dispatched.events.length>0){events.push({type:"ability-activated",playerId:activePlayer,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId})}events.push(...dispatched.events);state.pendingEffect=dispatched.pending&&dispatched.invocation?mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations,false,activePlayer):null;handOverPendingEffect(state)}else if(kind==="enel-leader"){const target=first?player.board.find(card=>card.instanceId===first):void 0;if(first&&!target)throw new Error(`MISSING_EFFECT_TARGET: ${first}`);const addedActive=addDonFromDeck(state,activePlayer,1,"active");const addedRested=addDonFromDeck(state,activePlayer,4,"rested");const given=target?player.restedDon.splice(0,4):[];if(target){target.attachedDon??=[];target.attachedDon.push(...given)}state.oncePerTurn.push(`${state.turn}:${activePlayer}:enel-leader`);const leader=leaderInstanceId2(activePlayer);const marker={type:"ability-activated",playerId:activePlayer,sourceCardNumber:player.leaderCardNumber,sourceInstanceId:leader};if(addedActive>0||addedRested>0)events.push(marker);for(const[count2,rested]of[[addedActive,false],[addedRested,true]]){if(count2>0){events.push({type:"don-added",playerId:activePlayer,count:count2,rested,sourceCardNumber:player.leaderCardNumber})}}if(target&&given.length>0){events.push({type:"don-attached",playerId:activePlayer,targetInstanceId:target.instanceId,count:given.length,sourceCardNumber:player.leaderCardNumber})}}else if(kind==="mechanic-event"&&first){const eventIndex=player.hand.findIndex(card=>card.instanceId===first);const[eventCard]=player.hand.splice(eventIndex,1);if(!eventCard)throw new Error(`MISSING_EFFECT_SOURCE: ${first}`);const program=getEventMainProgram(eventCard.cardNumber);if(!program)throw new Error(`MISSING_EVENT_PROGRAM: ${first}`);player.restedDon.push(...player.activeDon.splice(0,eventActivationCost(state,activePlayer,eventCard.cardNumber,program.cost,db)));player.trash.push(eventCard);events.push({type:"event-activated",playerId:activePlayer,cardNumber:eventCard.cardNumber});if(program.donMinus){returnDonToDeck(state,activePlayer,program.donMinus,eventCard,events)}if(program.restDon){player.restedDon.push(...player.activeDon.splice(0,program.restDon))}const donReactions=program.donMinus?getMechanicSignalInvocations(state,[{kind:"don-returned",playerId:activePlayer,count:program.donMinus}]):[];const dispatched=dispatchMechanicInvocations(state,[{context:{sourcePlayerId:activePlayer,source:eventCard},program:program.program},...donReactions],db);events.push(...dispatched.events);state.pendingEffect=dispatched.pending?mechanicPendingEffect({context:{sourcePlayerId:activePlayer,source:eventCard},program:program.program},dispatched.pending,dispatched.continuations):null;handOverPendingEffect(state)}else{throw new Error(`INVALID_ACTIVATION: ${offered.optionId}`)}}function alreadyOptedIn(program){return{...program,effect:optedIn(program.effect)}}function optedIn(effect){if(effect.kind==="optional"){return(effect.chooser??"self")==="self"?effect.effect:effect}if(effect.kind==="if")return{...effect,then:optedIn(effect.then)};if(effect.kind==="sequence"&&effect.effects.length>0){const[first,...rest]=effect.effects;return{...effect,effects:[optedIn(first),...rest]}}return effect}function applyAttachDon({state,events,activePlayer,offered}){const player=state.players[activePlayer];const don=player.activeDon.splice(0,1);attachDon(state,activePlayer,offered.targetInstanceId,don);events.push({type:"don-attached",playerId:activePlayer,targetInstanceId:offered.targetInstanceId,count:don.length})}function pendingDefenseBoost(state,defenderPlayerId,targetInstanceId,attackerInstanceId){const registry2=onOpponentAttackBoost(state,defenderPlayerId,targetInstanceId,attackerInstanceId);if(targetInstanceId!==leaderInstanceId2(defenderPlayerId)){return{battle:registry2,turn:0}}return{battle:(katakuriLeaderEffectAvailable(state,defenderPlayerId)?1e3:0)+registry2,turn:namiLeaderDefenseAvailable(state,defenderPlayerId)?2e3:0}}function onOpponentAttackBoost(state,defenderPlayerId,targetInstanceId,attackerInstanceId){const participant=prospectiveBattleTarget(state,defenderPlayerId,targetInstanceId);if(!participant)return 0;const attacker=attackerInstanceId===void 0?null:prospectiveBattleTarget(state,defenderPlayerId==="p1"?"p2":"p1",attackerInstanceId);return onOpponentAttackSources(state,defenderPlayerId,participant,[],attacker).reduce((total,entry)=>total+defensiveBattlePower(entry.program.program,participant,attacker),0)}function defensiveBattlePower(program,target,attacker){return programBattlePower(program,"self",target)-(attacker?programBattlePower(program,"opponent",attacker):0)}function prospectiveBattleTarget(state,defenderPlayerId,targetInstanceId){if(targetInstanceId===leaderInstanceId2(defenderPlayerId)){return{instanceId:targetInstanceId,cardNumber:state.players[defenderPlayerId].leaderCardNumber,isLeader:true}}const card=state.players[defenderPlayerId].board.find(candidate=>candidate.instanceId===targetInstanceId);if(!card)return null;return{instanceId:targetInstanceId,cardNumber:card.cardNumber,isLeader:false}}function endBattleIfTargetLeftField(state){const attack=state.activeAttack;if(!attack||state.pendingEffect||state.pendingTrigger)return;const attackerOnField=attack.attackerInstanceId===leaderInstanceId2(attack.attackerPlayerId)||state.players[attack.attackerPlayerId].board.some(card=>card.instanceId===attack.attackerInstanceId);const targetOnField=attack.targetInstanceId===leaderInstanceId2(attack.defenderPlayerId)||state.players[attack.defenderPlayerId].board.some(card=>card.instanceId===attack.targetInstanceId);if(!attackerOnField||!targetOnField)resumeMainAfterBattle(state)}function namiLeaderDefenseAvailable(state,defenderPlayerId){const defender=state.players[defenderPlayerId];const donAtDeclaration=state.activeAttack?.defenderLeaderDonAtDeclaration??defender.leaderAttachedDon.length;return defender.leaderCardNumber==="OP11-041"&&!leaderEffectsNegated(state,defenderPlayerId)&&donAtDeclaration>=1&&defender.leaderAttachedDon.length>=1&&defender.hand.length>0&&!state.oncePerTurn.includes(`${state.turn}:${defenderPlayerId}:OP11-041-def`)}function offerNamiLeaderEffect(state){const attack=state.activeAttack;if(!attack)return false;const defenderPlayerId=attack.defenderPlayerId;const defender=state.players[defenderPlayerId];if(!namiLeaderDefenseAvailable(state,defenderPlayerId))return false;state.pendingEffect={kind:"nami-leader",playerId:defenderPlayerId,sourceCardNumber:"OP11-041",sourceInstanceId:leaderInstanceId2(defenderPlayerId),eligibleInstanceIds:defender.hand.map(card=>card.instanceId),resumePhase:"block",resumePlayerId:defenderPlayerId};state.phase="block";state.activePlayer=defenderPlayerId;return true}function katakuriLeaderEffectAvailable(state,playerId){return state.players[playerId].leaderCardNumber==="OP11-062"&&!leaderEffectsNegated(state,playerId)&&fieldDonCount(state,playerId)>0&&!state.oncePerTurn.includes(`${state.turn}:${playerId}:OP11-062`)}function offerKatakuriLeaderEffect(state,allowAttacker=true){const attack=state.activeAttack;if(!attack)return false;const attackerPlayerId=attack.attackerPlayerId;const defenderPlayerId=attack.defenderPlayerId;const attackerUsesKatakuri=allowAttacker&&attack.attackerInstanceId===leaderInstanceId2(attackerPlayerId)&&katakuriLeaderEffectAvailable(state,attackerPlayerId);const defenderUsesKatakuri=katakuriLeaderEffectAvailable(state,defenderPlayerId);if(!attackerUsesKatakuri&&!defenderUsesKatakuri)return false;const effectPlayerId=attackerUsesKatakuri?attackerPlayerId:defenderPlayerId;state.pendingEffect={kind:"katakuri-leader",playerId:effectPlayerId,sourceCardNumber:"OP11-062",sourceInstanceId:leaderInstanceId2(effectPlayerId),resumePhase:"block",resumePlayerId:defenderPlayerId};state.phase="block";state.activePlayer=effectPlayerId;return true}function onOpponentAttackSources(state,defenderPlayerId,target,offered,attacker){const defender=state.players[defenderPlayerId];const candidates=[{source:{instanceId:leaderInstanceId2(defenderPlayerId),cardNumber:defender.leaderCardNumber},active:true},...defender.board.map(card=>({source:card,active:!card.rested&&!restLocked(state,card)})),...defender.stage?[{source:defender.stage,active:!defender.stage.rested}]:[]];return candidates.flatMap(({source,active})=>{const program=getOnOpponentAttackProgram(source.cardNumber);if(!program)return[];if(offered.includes(source.instanceId))return[];if(effectsNegated(state,source.instanceId))return[];const oncePerTurnKey=`${state.turn}:${defenderPlayerId}:${source.instanceId}:on-opponent-attack`;if(program.oncePerTurn&&state.oncePerTurn.includes(oncePerTurnKey)){return[]}if(programUsesBattlePower(program.program)&&(!target||defensiveBattlePower(program.program,target,attacker)===0)){return[]}const redirectSelectors=programRedirectSelectors(program.program);if(redirectSelectors.length>0&&redirectSelectors.every(selector=>selectCards(state,{sourcePlayerId:defenderPlayerId,source},selector,{}).length===0)){return[]}const requires=program.requires;if(requires){if(requires.handCards!==void 0&&defender.hand.length<requires.handCards){return[]}if(requires.fieldDon!==void 0&&fieldDonCount(state,defenderPlayerId)<requires.fieldDon){return[]}if(requires.activeDon!==void 0&&defender.activeDon.length<requires.activeDon){return[]}if(requires.sourceActive&&!active)return[];if(requires.handCardsOfCategory!==void 0&&!handHasCategory(defender,requires.handCardsOfCategory)){return[]}if(requires.handCardsMatching!==void 0&&selectCards(state,{sourcePlayerId:defenderPlayerId,source},{...requires.handCardsMatching.match,player:"self",zone:"hand"},{}).length<requires.handCardsMatching.count){return[]}if(requires.lifeCardsMatching!==void 0&&selectCards(state,{sourcePlayerId:defenderPlayerId,source},{...requires.lifeCardsMatching.match,player:"self",zone:"life"},{}).length<requires.lifeCardsMatching.count){return[]}const context={sourcePlayerId:defenderPlayerId,source};if(requires.everyCharacterMatches!==void 0&&!conditionMatches(state,context,{kind:"every-character-matches",player:"self",selector:requires.everyCharacterMatches},{})){return[]}if(requires.battleAttacker!==void 0&&!conditionMatches(state,context,{kind:"battle-attacker",filter:requires.battleAttacker.filter,...requires.battleAttacker.attribute===void 0?{}:{attribute:requires.battleAttacker.attribute}},{})){return[]}if(requires.leaderTypeIncluding!==void 0&&!conditionMatches(state,context,{kind:"leader-type-including",player:"self",text:requires.leaderTypeIncluding},{})){return[]}}return[{source,program,oncePerTurnKey}]})}function leaderWatcherSources(state,controllerPlayerId,target,offered){const controller=state.players[controllerPlayerId];const candidates=[...controller.board,...controller.stage?[controller.stage]:[]];return candidates.flatMap(source=>{const program=getLeaderWatcherProgram(source.cardNumber);if(!program)return[];if(offered.includes(source.instanceId))return[];if(effectsNegated(state,source.instanceId))return[];const oncePerTurnKey=`${state.turn}:${controllerPlayerId}:${source.instanceId}:leader-watcher`;if(program.oncePerTurn&&state.oncePerTurn.includes(oncePerTurnKey)){return[]}if(programUsesBattlePower(program.program)&&(!target||programBattlePower(program.program,"self",target)===0)){return[]}const requires=program.requires;if(requires){if(requires.handCards!==void 0&&controller.hand.length<requires.handCards){return[]}if(requires.leaderTypeIncluding!==void 0&&!hasCardTypeIncluding(controller.leaderCardNumber,requires.leaderTypeIncluding)){return[]}}return[{source,program,oncePerTurnKey}]})}function offerLeaderWatcherEffect(state,events){const attack=state.activeAttack;if(!attack)return false;const offered=attack.leaderWatcherOffered??[];const attackerIsLeader=attack.attackerInstanceId===leaderInstanceId2(attack.attackerPlayerId);const targetIsLeader=attack.targetInstanceId===leaderInstanceId2(attack.defenderPlayerId);const attempt=controllerPlayerId=>{const target=battleParticipant(state,controllerPlayerId);const[next]=leaderWatcherSources(state,controllerPlayerId,target,offered);return next?{controllerPlayerId,...next}:null};const found=(attackerIsLeader?attempt(attack.attackerPlayerId):null)??(targetIsLeader?attempt(attack.defenderPlayerId):null);if(!found)return false;attack.leaderWatcherOffered=[...offered,found.source.instanceId];const dispatched=dispatchMechanicInvocations(state,[{context:{sourcePlayerId:found.controllerPlayerId,source:found.source},program:found.program.program}]);events.push(...dispatched.events);state.pendingEffect=dispatched.pending&&dispatched.invocation?mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations):null;if(found.program.oncePerTurn){if(state.pendingEffect){attack.leaderWatcherPending={sourceInstanceId:found.source.instanceId,oncePerTurnKey:found.oncePerTurnKey}}else{state.oncePerTurn.push(found.oncePerTurnKey)}}state.phase="block";state.activePlayer=found.controllerPlayerId;return state.pendingEffect!==null}function eligibleWhenAttackingProgram(state,activePlayer,attackerCard){const program=getWhenAttackingMechanicProgram(attackerCard.cardNumber);if(!program)return void 0;const oncePerTurnKey=`${state.turn}:${activePlayer}:${attackerCard.instanceId}:on-opponent-attack`;if(program.oncePerTurn&&state.oncePerTurn.includes(oncePerTurnKey)){return void 0}const requires=program.requires;if(requires){const player=state.players[activePlayer];if(requires.handCards!==void 0&&player.hand.length<requires.handCards){return void 0}if(requires.fieldDon!==void 0&&fieldDonCount(state,activePlayer)<requires.fieldDon){return void 0}if(requires.activeDon!==void 0&&player.activeDon.length<requires.activeDon){return void 0}if(requires.handCardsOfCategory!==void 0&&!handHasCategory(player,requires.handCardsOfCategory)){return void 0}if(requires.handCardsMatching!==void 0&&selectCards(state,{sourcePlayerId:activePlayer,source:attackerCard},{...requires.handCardsMatching.match,player:"self",zone:"hand"},{}).length<requires.handCardsMatching.count){return void 0}if(requires.lifeCardsMatching!==void 0&&selectCards(state,{sourcePlayerId:activePlayer,source:attackerCard},{...requires.lifeCardsMatching.match,player:"self",zone:"life"},{}).length<requires.lifeCardsMatching.count){return void 0}}return{program,oncePerTurnKey}}function offerOnOpponentAttackEffect(state,events){const attack=state.activeAttack;if(!attack)return false;for(;;){const[next]=onOpponentAttackSources(state,attack.defenderPlayerId,battleParticipant(state,attack.defenderPlayerId),attack.onOpponentAttackOffered??[],battleParticipant(state,attack.attackerPlayerId));if(!next)return false;attack.onOpponentAttackOffered=[...attack.onOpponentAttackOffered??[],next.source.instanceId];const dispatched=dispatchMechanicInvocations(state,[{context:{sourcePlayerId:attack.defenderPlayerId,source:next.source},program:next.program.program}]);events.push(...dispatched.events);state.pendingEffect=dispatched.pending&&dispatched.invocation?mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations):null;if(next.program.oncePerTurn){if(state.pendingEffect){attack.onOpponentAttackPending={sourceInstanceId:next.source.instanceId,oncePerTurnKey:next.oncePerTurnKey}}else{state.oncePerTurn.push(next.oncePerTurnKey)}}state.phase="block";state.activePlayer=attack.defenderPlayerId;if(state.pendingEffect!==null)return true}}function offerAttackReactions(state,events,resolved=null){const attack=state.activeAttack;if(!attack)return false;if(offerBuggyBlockerEffect(state))return true;const kind=resolved?.kind;const katakuriAttackerAnswered=kind==="katakuri-leader"&&resolved.playerId===attack.attackerPlayerId;if(kind!=="nami-leader"&&(kind!=="katakuri-leader"||katakuriAttackerAnswered)){if(offerKatakuriLeaderEffect(state,!katakuriAttackerAnswered))return true}if(kind!=="nami-leader"&&!katakuriAttackerAnswered){if(offerNamiLeaderEffect(state))return true}if(offerLeaderWatcherEffect(state,events))return true;return offerOnOpponentAttackEffect(state,events)}function attackingCardNumber(state,attack){if(attack.attackerInstanceId===leaderInstanceId2(attack.attackerPlayerId)){return state.players[attack.attackerPlayerId].leaderCardNumber}return state.players[attack.attackerPlayerId].board.find(card=>card.instanceId===attack.attackerInstanceId)?.cardNumber??state.players[attack.attackerPlayerId].leaderCardNumber}function attackingCardAttributes(state,attack,db){const board=state.players[attack.attackerPlayerId].board.find(card=>card.instanceId===attack.attackerInstanceId);return board?boardCardAttributes(state,board,db):cardAttributes(db.require(attackingCardNumber(state,attack)))}function resolveBattle(state,events,db=cards){const attack=state.activeAttack;if(!attack)throw new Error("NO_ACTIVE_ATTACK");if(!attack.koReplacementOffered&&attack.attackerInstanceId===leaderInstanceId2(attack.attackerPlayerId)&&attack.targetInstanceId!==leaderInstanceId2(attack.defenderPlayerId)&&!leaderEffectsNegated(state,attack.attackerPlayerId)){state.oncePerTurn.push(leaderBattledCharacterKey(state.turn,attack.attackerPlayerId))}const defender=state.players[attack.defenderPlayerId];const defense=currentPower(state,attack.defenderPlayerId,attack.targetInstanceId,false,db)+attack.counterPower;const offense=battleAttackPower(state,db);if(offense<defense){events.push({type:"battle-resolved",attackerPlayerId:attack.attackerPlayerId,defenderPlayerId:attack.defenderPlayerId,targetInstanceId:attack.targetInstanceId,attackPower:offense,defensePower:defense,outcome:"defended"});resumeMainAfterBattle(state);return}if(attack.targetInstanceId!==leaderInstanceId2(attack.defenderPlayerId)){const threatened=defender.board.find(card=>card.instanceId===attack.targetInstanceId);if(threatened&&survivesBattleKo(state,attack.defenderPlayerId,threatened,{isLeader:attack.attackerInstanceId===leaderInstanceId2(attack.attackerPlayerId),cardNumber:attackingCardNumber(state,attack),attributes:attackingCardAttributes(state,attack,db)},db)){events.push({type:"battle-resolved",attackerPlayerId:attack.attackerPlayerId,defenderPlayerId:attack.defenderPlayerId,targetInstanceId:attack.targetInstanceId,attackPower:offense,defensePower:defense,outcome:"defended"});resumeMainAfterBattle(state);return}const lifeProtection=threatened!==void 0&&rosinanteLifeProtectionAvailable(state,attack.defenderPlayerId,threatened);const mechanicOptions=threatened===void 0?[]:registeredReplacementOptions(state,attack.attackerPlayerId,attack.defenderPlayerId,threatened,attack.targetInstanceId,db,"battle");if(threatened&&!attack.koReplacementOffered&&(lifeProtection||mechanicOptions.length>0)){attack.koReplacementOffered=true;state.pendingEffect={kind:"battle-ko-replacement",playerId:attack.defenderPlayerId,targetInstanceId:attack.targetInstanceId,sourceCardNumber:state.players[attack.attackerPlayerId].board.find(card=>card.instanceId===attack.attackerInstanceId)?.cardNumber??state.players[attack.attackerPlayerId].leaderCardNumber,sourceInstanceId:attack.attackerInstanceId,...lifeProtection?{}:{lifeProtection:false},...mechanicOptions.length>0?{mechanicOptions}:{}};state.activePlayer=attack.defenderPlayerId;return}const targetIndex=defender.board.findIndex(card=>card.instanceId===attack.targetInstanceId);const[target]=defender.board.splice(targetIndex,1);if(!target)throw new Error(`MISSING_ATTACK_TARGET: ${attack.targetInstanceId}`);defender.restedDon.push(...target.attachedDon??[]);defender.trash.push({instanceId:target.instanceId,cardNumber:target.cardNumber});state.characterKoedOnTurn={...state.characterKoedOnTurn,[attack.defenderPlayerId]:state.turn};const attackerCardNumber=attackingCardNumber(state,attack);events.push({type:"battle-resolved",attackerPlayerId:attack.attackerPlayerId,defenderPlayerId:attack.defenderPlayerId,targetInstanceId:attack.targetInstanceId,attackPower:offense,defensePower:defense,outcome:"character-ko"});events.push({type:"character-ko",playerId:attack.defenderPlayerId,cardInstanceId:target.instanceId,cardNumber:target.cardNumber,sourceCardNumber:attackerCardNumber});const onKo=createOnKoResult(state,attack.defenderPlayerId,target,attack.attackerPlayerId,db,"battle");events.push(...onKo.events);if(onKo.pending){state.activeAttack=null;state.pendingEffect=onKo.pending;state.pendingEffectResume={phase:"main",playerId:attack.attackerPlayerId};state.phase="main";state.activePlayer=onKo.pending.playerId}else{resumeMainAfterBattle(state)}return}if(!attack.damageReplacementOffered){const protectors=damageReplacementProtectors(state,attack.defenderPlayerId);if(protectors.length>0){attack.damageReplacementOffered=true;state.pendingEffect={kind:"damage-replacement",playerId:attack.defenderPlayerId,protectorInstanceIds:protectors.map(card=>card.instanceId),sourceCardNumber:attackingCardNumber(state,attack),sourceInstanceId:attack.attackerInstanceId};state.activePlayer=attack.defenderPlayerId;return}}const life=defender.life.shift();if(!life){state.activeAttack=null;state.phase="finished";state.winner=attack.attackerPlayerId;state.resultReason="life";events.push({type:"battle-resolved",attackerPlayerId:attack.attackerPlayerId,defenderPlayerId:attack.defenderPlayerId,targetInstanceId:attack.targetInstanceId,attackPower:offense,defensePower:defense,outcome:"game-win"});events.push({type:"game-ended",winner:attack.attackerPlayerId,reason:"life"});return}events.push({type:"battle-resolved",attackerPlayerId:attack.attackerPlayerId,defenderPlayerId:attack.defenderPlayerId,targetInstanceId:attack.targetInstanceId,attackPower:offense,defensePower:defense,outcome:"damage"});events.push({type:"damage-taken",playerId:attack.defenderPlayerId,lifeRemaining:defender.life.length});if(hasKeyword(state,attack.attackerPlayerId,attack.attackerInstanceId,"Double Attack",db)){state.pendingBattleDamage={playerId:attack.defenderPlayerId,remaining:1,...hasKeyword(state,attack.attackerPlayerId,attack.attackerInstanceId,"Banish",db)?{banish:true}:{}}}const lifeWatchers=getMechanicSignalInvocations(state,[{kind:"card-moved",card:life,ownerId:attack.defenderPlayerId,from:"life",to:"hand",...attack.attackerInstanceId===leaderInstanceId2(attack.attackerPlayerId)?{byLeaderAttack:true}:{}}],false);if(lifeWatchers.length>0){state.pendingDamageReactions=[...state.pendingDamageReactions??[],...lifeWatchers]}if(hasKeyword(state,attack.attackerPlayerId,attack.attackerInstanceId,"Banish",db)){defender.trash.push(life);events.push({type:"card-moved",playerId:attack.defenderPlayerId,cardInstanceId:life.instanceId,cardNumber:life.cardNumber,from:"life",to:"trash"});resumeMainAfterBattle(state);return}if(opensTriggerWindow(state,attack.defenderPlayerId,life)){events.push({type:"card-revealed",playerId:attack.defenderPlayerId,cardNumber:life.cardNumber,sourceCardNumber:life.cardNumber,...life.faceUp===true?{}:{visibleTo:attack.defenderPlayerId}});state.pendingTrigger={playerId:attack.defenderPlayerId,card:life};state.phase="trigger";state.activePlayer=attack.defenderPlayerId;return}events.push(...bankDamagedLifeCard(state,attack.defenderPlayerId,life,db));resumeMainAfterBattle(state)}function applyAttack({state,events,activePlayer,offered,db}){const defenderPlayerId=opponentOf2(activePlayer);const attackingCharacter=state.players[activePlayer].board.find(card=>card.instanceId===offered.attackerInstanceId);if(offered.attackerInstanceId===leaderInstanceId2(activePlayer)){state.players[activePlayer].leaderRested=true}else if(attackingCharacter){attackingCharacter.rested=true}const attackerCard=effectsNegated(state,offered.attackerInstanceId)?void 0:offered.attackerInstanceId===leaderInstanceId2(activePlayer)?{instanceId:offered.attackerInstanceId,cardNumber:state.players[activePlayer].leaderCardNumber}:attackingCharacter;state.activeAttack={attackerPlayerId:activePlayer,defenderPlayerId,attackerInstanceId:offered.attackerInstanceId,targetInstanceId:offered.targetInstanceId,battleAttackBonus:0,counterPower:0,defenderLeaderDonAtDeclaration:state.players[defenderPlayerId].leaderAttachedDon.length};events.push({type:"attack-declared",playerId:activePlayer,attackerInstanceId:offered.attackerInstanceId,targetInstanceId:offered.targetInstanceId,power:battleAttackPower(state,db)});const reduction=attackerCard?.cardNumber==="OP11-009"&&(attackingCharacter?.attachedDon?.length??0)>=2?{amount:-2e3,expiresAtTurn:state.turn+1}:attackerCard?.cardNumber==="OP14-015"?{amount:-1e3,expiresAtTurn:state.turn}:null;const taxedAttacker=attackingCharacter&&(attackingCharacter.attackTaxUntilTurn??-1)>=state.turn?attackingCharacter:void 0;if(taxedAttacker){const cost=taxedAttacker.attackTaxHandCards??1;const whenAttacking=attackerCard?eligibleWhenAttackingProgram(state,activePlayer,attackerCard):void 0;const dispatched=dispatchMechanicInvocations(state,[{context:{sourcePlayerId:activePlayer,source:{instanceId:taxedAttacker.instanceId,cardNumber:taxedAttacker.cardNumber}},program:{effect:{kind:"choose",selector:{player:"self",zone:"hand"},bind:"attack-tax",min:cost,max:cost,effect:{kind:"move",binding:"attack-tax",to:{player:"self",zone:"trash"}}}}},...whenAttacking&&attackerCard?[{context:{sourcePlayerId:activePlayer,source:attackerCard},program:whenAttacking.program.program}]:[]],db);events.push(...dispatched.events);if(dispatched.pending&&dispatched.invocation){state.pendingEffect=mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations);state.pendingEffectResume={phase:"block",playerId:defenderPlayerId};state.phase="main";state.activePlayer=activePlayer}if(whenAttacking?.program.oncePerTurn){state.oncePerTurn.push(whenAttacking.oncePerTurnKey)}}else if(attackerCard?.cardNumber==="ST33-002"){const attackingPlayer=state.players[activePlayer];if(attackingPlayer.hand.length>0){state.pendingEffect={kind:"navy-discard",playerId:activePlayer,sourceCardNumber:attackerCard.cardNumber,sourceInstanceId:attackerCard.instanceId,eligibleInstanceIds:attackingPlayer.hand.map(card=>card.instanceId),remaining:1,optional:true,after:{kind:"opponent-discard",targetPlayerId:defenderPlayerId},resumePhase:"block",resumePlayerId:defenderPlayerId};state.phase="block";state.activePlayer=activePlayer}}else if((attackerCard?.cardNumber==="ST35-003"||attackerCard?.cardNumber==="OP12-090")&&state.players[activePlayer].deck.length>=2){state.pendingEffect={kind:"st35-attack-cost",playerId:activePlayer,targetPlayerId:defenderPlayerId,sourceCardNumber:attackerCard.cardNumber,sourceInstanceId:attackerCard.instanceId,eligibleInstanceIds:state.players[defenderPlayerId].board.map(card=>card.instanceId),resumePlayerId:defenderPlayerId};state.phase="block";state.activePlayer=activePlayer}else if(attackerCard&&eligibleWhenAttackingProgram(state,activePlayer,attackerCard)){const{program,oncePerTurnKey}=eligibleWhenAttackingProgram(state,activePlayer,attackerCard);const dispatched=dispatchMechanicInvocations(state,[{context:{sourcePlayerId:activePlayer,source:attackerCard},program:program.program}],db);events.push(...dispatched.events);if(dispatched.pending&&dispatched.invocation){state.pendingEffect=mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations);state.pendingEffectResume={phase:"block",playerId:defenderPlayerId};state.phase="main";state.activePlayer=activePlayer;handOverPendingEffect(state);if(program.oncePerTurn){state.activeAttack.onOpponentAttackPending={sourceInstanceId:attackerCard.instanceId,oncePerTurnKey}}}else if(program.oncePerTurn){state.oncePerTurn.push(oncePerTurnKey)}}else if(attackingCharacter&&attackerCard&&whenRestedInvocation(state,activePlayer,attackingCharacter)){const dispatched=dispatchMechanicInvocations(state,[whenRestedInvocation(state,activePlayer,attackingCharacter)],db);events.push(...dispatched.events);if(dispatched.pending&&dispatched.invocation){state.pendingEffect=mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations);state.pendingEffectResume={phase:"block",playerId:defenderPlayerId};state.phase="main";state.activePlayer=activePlayer;handOverPendingEffect(state)}}else if(attackerCard?.cardNumber==="ST34-005"&&fieldDonCount(state,activePlayer)>0){const eligibleInstanceIds=state.players[defenderPlayerId].board.filter(card=>(db.require(card.cardNumber).power??99999)<=2e3).map(card=>card.instanceId);if(eligibleInstanceIds.length>0){state.pendingEffect={kind:"st34-don-minus-ko",playerId:activePlayer,targetPlayerId:defenderPlayerId,sourceCardNumber:attackerCard.cardNumber,sourceInstanceId:attackerCard.instanceId,eligibleInstanceIds,resumePhase:"block",resumePlayerId:defenderPlayerId};state.phase="block";state.activePlayer=activePlayer}}else if(attackerCard?.cardNumber==="ST32-003"||attackerCard?.cardNumber==="EB04-026"){const drawn=state.players[activePlayer].deck.shift();if(drawn){state.players[activePlayer].hand.push(drawn);events.push({type:"cards-drawn",playerId:activePlayer,count:1});state.pendingEffect={kind:"draw-trash",playerId:activePlayer,sourceCardNumber:attackerCard.cardNumber,sourceInstanceId:attackerCard.instanceId,trashCount:1,resumePhase:"block",resumePlayerId:defenderPlayerId};state.phase="block";state.activePlayer=activePlayer}}else if(attackerCard?.cardNumber==="OP15-036"){const eligibleInstanceIds=state.players[defenderPlayerId].board.filter(card=>card.rested&&effectiveBoardCost(state,card,db)<=4).map(card=>card.instanceId);if(eligibleInstanceIds.length>0){state.pendingEffect={kind:"ko-character",playerId:activePlayer,targetPlayerId:defenderPlayerId,sourceCardNumber:attackerCard.cardNumber,sourceInstanceId:attackerCard.instanceId,eligibleInstanceIds,resumePhase:"block",resumePlayerId:defenderPlayerId};state.phase="block";state.activePlayer=activePlayer}}else if(reduction&&state.players[defenderPlayerId].board.length>0){state.pendingEffect={kind:"reduce-power",playerId:activePlayer,targetPlayerId:defenderPlayerId,sourceCardNumber:attackerCard.cardNumber,sourceInstanceId:attackerCard.instanceId,amount:reduction.amount,expiresAtTurn:reduction.expiresAtTurn,remaining:1,resumePhase:"block",resumePlayerId:defenderPlayerId};state.phase="block";state.activePlayer=activePlayer}if(!state.pendingEffect){if(!offerAttackReactions(state,events)){state.phase="block";state.activePlayer=defenderPlayerId}}}function applyBlock({state,events,activePlayer,offered,db}){const attack=state.activeAttack;if(!attack)throw new Error("NO_ACTIVE_ATTACK");if(offered.blockerInstanceId===leaderInstanceId2(activePlayer)){state.players[activePlayer].leaderRested=true;retargetAttack(attack,offered.blockerInstanceId);state.phase="counter";events.push({type:"attack-blocked",playerId:activePlayer,blockerInstanceId:offered.blockerInstanceId});if(winsOnOpponentBlock(state,attack.attackerPlayerId,db)){state.phase="finished";state.winner=attack.attackerPlayerId;state.activeAttack=null;events.push({type:"game-ended",winner:attack.attackerPlayerId,reason:"card-effect"});return}const watchers=dispatchMechanicInvocations(state,getMechanicSignalInvocations(state,[{kind:"blocker-activated",playerId:activePlayer}]),db);events.push(...watchers.events);if(watchers.pending&&watchers.invocation){state.pendingEffect=mechanicPendingEffect(watchers.invocation,watchers.pending,watchers.continuations);state.pendingEffectResume={phase:"counter",playerId:activePlayer};state.phase="main";state.activePlayer=attack.attackerPlayerId}}else{const blocker=state.players[activePlayer].board.find(card=>card.instanceId===offered.blockerInstanceId);if(!blocker)throw new Error(`MISSING_BLOCKER: ${offered.blockerInstanceId}`);blocker.rested=true;retargetAttack(attack,blocker.instanceId);state.phase="counter";events.push({type:"attack-blocked",playerId:activePlayer,blockerInstanceId:blocker.instanceId});if(winsOnOpponentBlock(state,attack.attackerPlayerId,db)){state.phase="finished";state.winner=attack.attackerPlayerId;state.activeAttack=null;events.push({type:"game-ended",winner:attack.attackerPlayerId,reason:"card-effect"});return}const watchers=dispatchMechanicInvocations(state,getMechanicSignalInvocations(state,[{kind:"blocker-activated",playerId:activePlayer}]),db);events.push(...watchers.events);const onBlock=onBlockInvocation(state,activePlayer,blocker);if(watchers.pending&&watchers.invocation){state.pendingEffect=mechanicPendingEffect(watchers.invocation,watchers.pending,onBlock?[...watchers.continuations,onBlock.invocation]:watchers.continuations);state.pendingEffectResume={phase:"counter",playerId:activePlayer};state.phase="main";state.activePlayer=attack.attackerPlayerId;if(onBlock)state.oncePerTurn.push(onBlock.oncePerTurnKey);return}if(onBlock){const dispatched=dispatchMechanicInvocations(state,[onBlock.invocation],db);events.push(...dispatched.events);if(dispatched.pending&&dispatched.invocation){state.pendingEffect=mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations);state.pendingEffectResume={phase:"counter",playerId:activePlayer};state.phase="main";state.activePlayer=activePlayer}state.oncePerTurn.push(onBlock.oncePerTurnKey)}}}function applyCounter({state,events,activePlayer,offered,db}){const player=state.players[activePlayer];const handIndex=player.hand.findIndex(card2=>card2.instanceId===offered.cardInstanceId);const[card]=player.hand.splice(handIndex,1);if(!card||!state.activeAttack)throw new Error("INVALID_COUNTER");const power=(db.require(card.cardNumber).counter??0)+handCounterPower(state,activePlayer,card.cardNumber,db);const aside=offered.targetInstanceId;if(aside===void 0){state.activeAttack.counterPower+=power}else{addPowerModifier(state,activePlayer,aside,power,state.turn,card,true)}player.trash.push(card);events.push({type:"counter-used",playerId:activePlayer,cardNumber:card.cardNumber,power,...aside===void 0?{}:{targetInstanceId:aside}})}function applyMulliganDecision({state,events,activePlayer,offered,db}){const player=state.players[activePlayer];player.mulliganDecision=offered.decision;if(offered.decision==="mulligan"){const reshuffled=shuffle([...player.hand,...player.deck],state.rngState);player.hand=reshuffled.items.slice(0,5);player.deck=reshuffled.items.slice(5);state.rngState=reshuffled.state}events.push({type:"mulligan-decided",playerId:activePlayer,decision:offered.decision});const nextPlayerId=opponentOf2(activePlayer);if(state.players[nextPlayerId].mulliganDecision==="pending"){state.activePlayer=nextPlayerId}else{for(const setupPlayer of Object.values(state.players)){const lifeCount=db.facts(setupPlayer.leaderCardNumber).cost;setupPlayer.life.push(...setupPlayer.deck.splice(0,lifeCount).reverse())}state.phase="main";state.activePlayer=nextPlayerId;events.push({type:"setup-complete",activePlayer:nextPlayerId})}}function initialTimeLimit(limit){if(limit===void 0)return void 0;if(!Number.isInteger(limit.turns)||limit.turns<1){throw new Error(`INVALID_TIME_LIMIT: turns must be a positive integer, got ${String(limit.turns)}`)}return{turns:limit.turns}}function finalTurnOf(limit){return limit.turns+TIME_LIMIT_ADDITIONAL_TURNS}function noteLifeDrawn(state,events){const limit=state.timeLimit;if(!limit)return;for(const event of events){if(event.type==="card-moved"&&event.from==="life"&&event.to==="hand"){limit.lifeDrawnLast=event.playerId}}}function callTimeIfDue(state,events){const limit=state.timeLimit;if(!limit||state.turn!==limit.turns)return;events.push({type:"time-called",turn:state.turn,turnPlayerId:state.turnPlayerId,finalTurn:finalTurnOf(limit)})}function endOnTimeIfDue(state,events){const limit=state.timeLimit;if(!limit||state.turn!==finalTurnOf(limit))return false;noteLifeDrawn(state,events);const{winner,procedure}=timeLimitWinner(state);limit.decidedBy=procedure;state.phase="finished";state.winner=winner;state.resultReason="time";events.push({type:"game-ended",winner,reason:"time",procedure});return true}function timeLimitWinner(state){const{p1,p2}=state.players;const counts=[["life",p1.life.length,p2.life.length],["deck",p1.deck.length,p2.deck.length],["characters",p1.board.length,p2.board.length]];for(const[procedure,mine,theirs]of counts){if(mine!==theirs)return{winner:mine>theirs?"p1":"p2",procedure}}const drawn=state.timeLimit?.lifeDrawnLast;if(drawn)return{winner:drawn,procedure:"life-drawn"};return{winner:state.turnPlayerId==="p1"?"p2":"p1",procedure:"final-turn"}}function observeTimeLimit(state,limit){const finalTurn=finalTurnOf(limit);const called=state.turn>=limit.turns;return{calledOnTurn:limit.turns,finalTurn,called,turnsLeft:called?Math.max(0,finalTurn-state.turn):null,decidedBy:limit.decidedBy??null}}function activateRestedDonForRefresh(player){const held=player.donHeldFromRefresh??0;delete player.donHeldFromRefresh;player.activeDon.push(...player.restedDon.splice(0,player.restedDon.length-held))}function drawForTurn(state,playerId,db=cards){const player=state.players[playerId];const staysRested=card2=>(card2.cannotRefreshUntilTurn??-1)>=state.turn||refreshBlocked(state,playerId,card2,db);const refreshed=player.board.filter(card2=>card2.rested&&!staysRested(card2)).map(card2=>card2.instanceId);if((player.leaderCannotRefreshUntilTurn??-1)<state.turn){player.leaderRested=false}if(player.stage)player.stage.rested=false;player.activeDon.push(...player.leaderAttachedDon.splice(0));for(const boardCard of player.board){if(!staysRested(boardCard))boardCard.rested=false;player.activeDon.push(...(boardCard.attachedDon??[]).splice(0))}const card=player.deck.shift();if(!card){if(survivesEmptyDeck(state,playerId)){activateRestedDonForRefresh(player);const donForTurn=state.turn===2?1:2;const given2=placeDonForTurn(state,playerId,donForTurn,db);return[...refreshed.length===0?[]:[{type:"characters-refreshed",playerId,cardInstanceIds:refreshed}],...given2]}const winner=winsOnEmptyDeck(state,playerId)?playerId:opponentOf2(playerId);state.phase="finished";state.winner=winner;state.resultReason="deck-exhaustion";return[{type:"game-ended",winner,reason:"deck-exhaustion"}]}player.hand.push(card);activateRestedDonForRefresh(player);const donToDraw=state.turn===2?1:2;const given=placeDonForTurn(state,playerId,donToDraw,db);const restedAtMain=Math.min(player.donRestedAtNextMain??0,player.activeDon.length);delete player.donRestedAtNextMain;player.restedDon.push(...player.activeDon.splice(0,restedAtMain));return[...refreshed.length===0?[]:[{type:"characters-refreshed",playerId,cardInstanceIds:refreshed}],...given]}function placeDonForTurn(state,playerId,count2,db){const player=state.players[playerId];const preplaced=state.turn===2?1:0;const hadDon=fieldDonCount(state,playerId)-preplaced>0;const placed=player.donDeck.splice(0,count2);const[toLeader,...rest]=placed;if(!toLeader||!hadDon||!donPhaseGivesLeaderDon(state,playerId,db)){player.activeDon.push(...placed);return[]}player.activeDon.push(...rest);player.leaderAttachedDon.push(toLeader);return[{type:"don-attached",playerId,targetInstanceId:leaderInstanceId2(playerId),count:1,sourceCardNumber:player.leaderCardNumber}]}function completeEndTurn(state,events){const activePlayer=state.turnPlayerId;const endingPlayer=state.players[activePlayer];const barred=(endingPlayer.cannotActivateDonByCharacterUntilTurn??-1)>=state.turn;const activateCount=barred?0:Math.min(endingPlayer.activateDonAtEndOfTurn,endingPlayer.restedDon.length);endingPlayer.activeDon.push(...endingPlayer.restedDon.splice(0,activateCount));endingPlayer.activateDonAtEndOfTurn=0;if(endingPlayer.addDonAtEndOfTurn){addDonFromDeck(state,activePlayer,endingPlayer.addDonAtEndOfTurn,"active");delete endingPlayer.addDonAtEndOfTurn}for(const owed of endingPlayer.endOfTurnCardActions??[]){if(owed.turn!==state.turn)continue;const card=endingPlayer.board.find(candidate=>candidate.instanceId===owed.instanceId);if(card)card.rested=false}delete endingPlayer.endOfTurnCardActions;delete endingPlayer.endOfTurnPrograms;for(const owed of endingPlayer.endOfTurnLifeFromDeck??[]){if(owed.turn!==state.turn)continue;for(let paid=0;paid<owed.count;paid+=1){const card=endingPlayer.deck.shift();if(!card)break;endingPlayer.life.unshift({instanceId:card.instanceId,cardNumber:card.cardNumber});events.push({type:"card-moved",playerId:activePlayer,cardInstanceId:card.instanceId,cardNumber:card.cardNumber,from:"deck",to:"life",position:"top"})}}delete endingPlayer.endOfTurnLifeFromDeck;delete endingPlayer.endOfTurnDonEqualize;delete endingPlayer.playDiscount;clearExpiredNegations(state);for(const player of Object.values(state.players)){player.leaderPowerModifiers=player.leaderPowerModifiers.filter(modifier=>modifier.expiresAtTurn>state.turn);const leaderBasePowers=withoutBasePowerSetters(player.leaderBasePowers,setter=>setter.expiresAtTurn<=state.turn);if(leaderBasePowers)player.leaderBasePowers=leaderBasePowers;else delete player.leaderBasePowers;for(const card of player.board){const basePowerOverrides=withoutBasePowerSetters(card.basePowerOverrides,setter=>setter.expiresAtTurn<=state.turn);if(basePowerOverrides)card.basePowerOverrides=basePowerOverrides;else delete card.basePowerOverrides;card.powerModifiers=(card.powerModifiers??[]).filter(modifier=>modifier.expiresAtTurn>state.turn);card.costModifiers=(card.costModifiers??[]).filter(modifier=>modifier.expiresAtTurn>state.turn)}}const decked=["p1","p2"].filter(playerId=>(state.players[playerId].deck.length===0||state.players[playerId].deckEmptiedOnTurn===state.turn)&&survivesEmptyDeck(state,playerId));if(decked.length>0){const loser=decked.includes(activePlayer)?activePlayer:decked[0];const winner=opponentOf2(loser);state.phase="finished";state.winner=winner;state.resultReason="deck-exhaustion";events.push({type:"game-ended",winner,reason:"deck-exhaustion"});return}if(endOnTimeIfDue(state,events))return;const extra=endingPlayer.extraTurns??0;const nextPlayerId=extra>0?activePlayer:opponentOf2(activePlayer);if(extra>0){if(extra===1)delete endingPlayer.extraTurns;else endingPlayer.extraTurns=extra-1}state.activePlayer=nextPlayerId;state.turnPlayerId=nextPlayerId;state.turn+=1;pruneOncePerTurn(state);events.push({type:"turn-ended",playerId:activePlayer,nextPlayerId});callTimeIfDue(state,events);if(askStartOfTurn(state,nextPlayerId,events))return;events.push(...drawForTurn(state,nextPlayerId))}function askStartOfTurn(state,playerId,events){const leader=state.players[playerId].leaderCardNumber;if(!getOnStartOfYourTurnMechanicProgram(leader)||leaderEffectsNegated(state,playerId)){return false}const result=createOnStartOfYourTurnResult(state,playerId,{instanceId:leaderInstanceId2(playerId),cardNumber:leader});events.push(...result.events);state.startOfTurnSuspended=true;if(result.pending){state.pendingEffect=result.pending;state.activePlayer=result.pending.playerId}return true}function resumeStartOfTurn(state,events){if(!state.startOfTurnSuspended)return;if(state.phase!=="finished"){if(state.pendingEffect||state.pendingTrigger||state.donReturn)return;state.activePlayer=state.turnPlayerId;events.push(...drawForTurn(state,state.turnPlayerId))}delete state.startOfTurnSuspended}function pruneOncePerTurn(state){state.oncePerTurn=state.oncePerTurn.filter(key=>{const stamped=/^(\d+):/.exec(key);return stamped===null||Number(stamped[1])>=state.turn})}function payDonEqualize(state,playerId,events,db){const player=state.players[playerId];const owed=(player.endOfTurnDonEqualize??[]).filter(booking=>booking.turn===state.turn);delete player.endOfTurnDonEqualize;const signals=[];for(const booking of owed){const excess=fieldDonCount(state,playerId)-fieldDonCount(state,opponentOf2(playerId));if(excess<=0)continue;const returned=returnDonToDeck(state,playerId,excess,{cardNumber:booking.sourceCardNumber,instanceId:booking.sourceInstanceId},events);if(returned>0){signals.push({kind:"don-returned",playerId,count:returned})}}if(signals.length===0)return false;const dispatched=dispatchMechanicSignals(state,signals,db);events.push(...dispatched.events);if(!dispatched.pending||!dispatched.invocation)return false;state.pendingEffect=mechanicPendingEffect(dispatched.invocation,dispatched.pending,dispatched.continuations,true);return true}function endTurn(state,events,db=cards){const playerId=state.turnPlayerId;state.activePlayer=playerId;const player=state.players[playerId];if(payDonEqualize(state,playerId,events,db))return;if(player.leaderCardNumber==="OP10-099"&&!leaderEffectsNegated(state,playerId)&&player.life.length>0&&player.life[0]?.faceUp!==true){const eligibleInstanceIds=player.board.filter(card=>{const definition=db.require(card.cardNumber);return definition.types.includes("Supernovas")&&definition.cost!==null&&definition.cost>=3&&definition.cost<=8}).map(card=>card.instanceId);if(eligibleInstanceIds.length>0){state.pendingEffect={kind:"kid-leader-end-turn",playerId,sourceCardNumber:"OP10-099",sourceInstanceId:leaderInstanceId2(playerId),eligibleInstanceIds};return}}if(state.endOfTurnDonActivation){for(const booking of state.endOfTurnDonActivation){if(booking.turn!==state.turn||booking.playerId!==playerId)continue;const booked2=state.players[booking.playerId];booked2.activeDon.push(...booked2.restedDon.splice(0,booking.count))}delete state.endOfTurnDonActivation}const booked=player.endOfTurnPrograms?.find(booking=>booking.turn===state.turn);if(booked){player.endOfTurnPrograms=player.endOfTurnPrograms.filter(booking=>booking!==booked);const onField=instanceId=>player.board.some(card=>card.instanceId===instanceId);const bindings=Object.fromEntries(Object.entries(booked.bindings??{}).map(([name,instanceIds])=>[name,instanceIds.filter(onField)]));const result=runEndOfTurnProgram(state,playerId,booked.source,{effect:booked.effect},db,bindings);events.push(...result.events);if(result.pending){state.pendingEffect=result.pending;state.activePlayer=result.pending.playerId;return}endTurn(state,events,db);return}for(const card of[{instanceId:leaderInstanceId2(playerId),cardNumber:player.leaderCardNumber},...player.board,...player.stage?[player.stage]:[]]){if(!getOnEndOfYourTurnMechanicProgram(card.cardNumber)||state.oncePerTurn.includes(`${state.turn}:${card.instanceId}:end-of-turn`)){continue}const result=createOnEndOfYourTurnResult(state,playerId,card,db);state.oncePerTurn.push(`${state.turn}:${card.instanceId}:end-of-turn`);if(result.pending){state.pendingEffect=result.pending;state.activePlayer=result.pending.playerId;events.push(...result.events);return}if(result.events.length>0)events.push(...result.events)}if(fieldDonCount(state,playerId)>=2){const borsalinoInstanceIds=player.board.filter(card=>card.cardNumber==="OP16-073"&&!effectsNegated(state,card.instanceId)&&!state.oncePerTurn.includes(`${state.turn}:${playerId}:${card.instanceId}:borsalino-end-turn`)).map(card=>card.instanceId);if(borsalinoInstanceIds.length>0){state.pendingEffect={kind:"borsalino-end-turn",playerId,sourceCardNumber:"OP16-073",sourceInstanceId:borsalinoInstanceIds[0],eligibleInstanceIds:borsalinoInstanceIds};return}}completeEndTurn(state,events)}function offerDonReturnChoice(state){const record=state.donReturn;state.donReturn=null;if(!record||state.phase==="finished")return;const onField=fieldDonIds(state,record.playerId);const onFieldAtPayment=onField.every(don=>record.onFieldAtPayment.includes(don))?void 0:record.onFieldAtPayment;if(!donReturnHasChoice(state,record.playerId,record.origins,onFieldAtPayment)){return}state.pendingEffect={kind:"return-don",playerId:record.playerId,sourceCardNumber:record.sourceCardNumber,sourceInstanceId:record.sourceInstanceId,origins:record.origins,...onFieldAtPayment?{onFieldAtPayment}:{},resumePhase:state.phase,resumePlayerId:state.activePlayer,displaced:state.pendingEffect};state.activePlayer=record.playerId}function applyPass({state,events,db}){if(state.phase==="block"){state.phase="counter"}else if(state.phase==="counter"){resolveBattle(state,events,db)}else{endTurn(state,events,db)}}function applyPlayCard({state,events,activePlayer,offered,db}){const player=state.players[activePlayer];const handIndex=player.hand.findIndex(card2=>card2.instanceId===offered.cardInstanceId);const[card]=player.hand.splice(handIndex,1);if(!card)throw new EngineError("ILLEGAL_ACTION","The selected card is no longer in hand.");const definition=db.require(card.cardNumber);const cost=playCostFromHand(state,activePlayer,card.cardNumber,definition.cost??0,{spend:true},db);player.restedDon.push(...player.activeDon.splice(0,cost));let onPlay;if(definition.category==="stage"){if(player.stage){player.trash.push({instanceId:player.stage.instanceId,cardNumber:player.stage.cardNumber})}player.stage={...card,rested:false};events.push({type:"stage-played",playerId:activePlayer,cardInstanceId:card.instanceId,cardNumber:card.cardNumber});onPlay=createOnPlayEffect(state,activePlayer,card,db)}else{onPlay=placeCharacter(state,activePlayer,card,false,db)}state.pendingEffect=onPlay.pending;handOverPendingEffect(state);events.push(...onPlay.events)}function applyResolveEffect({state,events,offered}){const resolvedEffect=state.pendingEffect;const onOpponentAttackOffer=state.activeAttack?.onOpponentAttackPending;const leaderWatcherOffer=state.activeAttack?.leaderWatcherPending;const completesEndTurn=resolvedEffect?.kind==="kid-leader-end-turn";const continuesEndTurn=resolvedEffect?.kind==="borsalino-end-turn"||resolvedEffect?.kind==="mechanic-choice"&&resolvedEffect.endOfTurn===true;events.push(...resolveEffect(state,offered.optionId));if(onOpponentAttackOffer){if(offered.optionId!=="skip"){state.oncePerTurn.push(onOpponentAttackOffer.oncePerTurnKey)}if(state.activeAttack?.onOpponentAttackPending===onOpponentAttackOffer){delete state.activeAttack.onOpponentAttackPending}}if(leaderWatcherOffer){if(offered.optionId!=="skip"){state.oncePerTurn.push(leaderWatcherOffer.oncePerTurnKey)}if(state.activeAttack?.leaderWatcherPending===leaderWatcherOffer){delete state.activeAttack.leaderWatcherPending}}if((resolvedEffect?.kind==="battle-ko-replacement"||resolvedEffect?.kind==="damage-replacement")&&!state.pendingEffect&&state.activeAttack){resolveBattle(state,events)}if(completesEndTurn)completeEndTurn(state,events);else if(continuesEndTurn&&!state.pendingEffect)endTurn(state,events);else if(continuesEndTurn&&state.pendingEffect?.kind==="mechanic-choice"&&state.pendingEffect.endOfTurn!==true){state.pendingEffect.endOfTurn=true}handOverPendingEffect(state);if(!state.pendingEffect&&state.pendingEffectResume){const openTrigger=state.pendingTrigger&&!state.pendingTrigger.fromEffect?state.pendingTrigger:null;if(state.phase!=="finished"&&openTrigger){state.phase="trigger";state.activePlayer=openTrigger.playerId}else if(state.phase!=="finished"){state.phase=state.pendingEffectResume.phase;state.activePlayer=state.pendingEffectResume.playerId}state.pendingEffectResume=null}if(!state.pendingEffect&&state.phase==="block"&&state.activeAttack){if(!offerAttackReactions(state,events,resolvedEffect)){state.phase="block";state.activePlayer=state.activeAttack.defenderPlayerId}}}function applyResolveTrigger({state,events,offered,db}){const trigger=state.pendingTrigger;const attack=state.activeAttack;if(!trigger)throw new Error("NO_PENDING_TRIGGER");const resume=trigger.resume??(attack?{phase:"main",playerId:attack.attackerPlayerId}:void 0);if(!resume)throw new Error("NO_PENDING_TRIGGER");const opposingPlayerId=resume.playerId;const effectResumePhase=resume.phase==="counter"?"main":resume.phase;const player=state.players[trigger.playerId];let reactions=[];if(offered.optionId!=="skip"){events.push({type:"card-revealed",playerId:trigger.playerId,cardNumber:trigger.card.cardNumber,sourceCardNumber:trigger.card.cardNumber});if(getTriggerMechanicProgram(trigger.card.cardNumber)){reactions=getMechanicSignalInvocations(state,[{kind:"trigger-activated",playerId:trigger.playerId}])}else{events.push(...applyMechanicReactions(state,[{kind:"trigger-activated",playerId:trigger.playerId}]).events)}}if(offered.optionId==="skip"){events.push(...bankDamagedLifeCard(state,trigger.playerId,trigger.card,db));resumeAfterTrigger(state)}else if(getTriggerMechanicProgram(trigger.card.cardNumber)){const held=state.pendingBattleDamage?[]:state.pendingDamageReactions??[];if(held.length>0)delete state.pendingDamageReactions;const triggered=createTriggerResult(state,trigger.playerId,trigger.card,db,reactions,held);const relocated=[...player.board,...player.hand,...player.trash,...player.deck,...player.life,...player.stage?[player.stage]:[]].some(card=>card.instanceId===trigger.card.instanceId);if(!relocated){player.trash.push({instanceId:trigger.card.instanceId,cardNumber:trigger.card.cardNumber})}events.push(...triggered.events);if(!trigger.resume)state.activeAttack=null;state.pendingTrigger=null;state.phase=resume.phase;state.activePlayer=triggered.pending?.playerId??trigger.playerId;state.pendingEffect=triggered.pending;if(triggered.pending){state.pendingEffectResume={phase:effectResumePhase,playerId:opposingPlayerId}}else{state.activePlayer=opposingPlayerId}}else if(["OP02-068","OP11-061","OP06-058"].includes(trigger.card.cardNumber)){const ownerId=["p1","p2"].find(playerId=>state.players[playerId].board.some(card=>card.instanceId===offered.optionId));if(!ownerId){throw new Error(`MISSING_EFFECT_TARGET: ${offered.optionId}`)}const owner=state.players[ownerId];const targetIndex=owner.board.findIndex(card=>card.instanceId===offered.optionId);const[target]=owner.board.splice(targetIndex,1);if(!target)throw new Error(`MISSING_EFFECT_TARGET: ${offered.optionId}`);owner.restedDon.push(...target.attachedDon??[]);const moved={instanceId:target.instanceId,cardNumber:target.cardNumber};if(trigger.card.cardNumber==="OP02-068")owner.hand.push(moved);else owner.deck.push(moved);player.trash.push(trigger.card);events.push({type:"card-moved",playerId:ownerId,cardInstanceId:target.instanceId,cardNumber:target.cardNumber,from:"board",to:trigger.card.cardNumber==="OP02-068"?"hand":"deck",...trigger.card.cardNumber==="OP02-068"?{}:{position:"bottom"},sourceCardNumber:trigger.card.cardNumber});resumeAfterTrigger(state)}else if(trigger.card.cardNumber==="ST36-002"||trigger.card.cardNumber==="P-088"){const attackerPlayerId=state.activeAttack?.attackerPlayerId;const placement=placeCharacter(state,trigger.playerId,trigger.card,false,db);if(!trigger.resume)state.activeAttack=null;state.pendingTrigger=null;state.phase=resume.phase;state.activePlayer=trigger.playerId;state.pendingEffect=placement.pending;events.push(...placement.events);if(placement.pending&&attackerPlayerId){state.pendingEffectResume={phase:"main",playerId:attackerPlayerId}}else if(attackerPlayerId){state.activePlayer=attackerPlayerId}}else if(trigger.card.cardNumber==="OP11-079"){const drawn=player.deck.shift();if(drawn){player.hand.push(drawn);events.push({type:"cards-drawn",playerId:trigger.playerId,count:1})}player.trash.push(trigger.card);resumeAfterTrigger(state)}else if(trigger.card.cardNumber==="OP11-081"){player.activeDon.push(...player.donDeck.splice(0,1));player.trash.push(trigger.card);resumeAfterTrigger(state)}else if(trigger.card.cardNumber==="OP10-109"){let drawn=0;while(drawn<2){const card=player.deck.shift();if(!card)break;player.hand.push(card);drawn+=1}if(drawn>0){events.push({type:"cards-drawn",playerId:trigger.playerId,count:drawn})}player.trash.push({instanceId:trigger.card.instanceId,cardNumber:trigger.card.cardNumber});if(!trigger.resume)state.activeAttack=null;state.pendingTrigger=null;state.phase=resume.phase;state.activePlayer=trigger.playerId;if(player.hand.length>0){state.pendingEffect={kind:"draw-trash",playerId:trigger.playerId,sourceCardNumber:trigger.card.cardNumber,sourceInstanceId:trigger.card.instanceId,trashCount:1,resumePhase:"main",resumePlayerId:opposingPlayerId}}else{state.activePlayer=opposingPlayerId}}else if(trigger.card.cardNumber==="OP12-113"){const koTargetId=offered.optionId==="activate"?void 0:offered.optionId;const opponentId=opponentOf2(trigger.playerId);const opponent=state.players[opponentId];const koTarget=koTargetId?opponent.board.find(card=>card.instanceId===koTargetId):void 0;if(koTargetId&&!koTarget){throw new Error(`MISSING_EFFECT_TARGET: ${koTargetId}`)}player.hand.push({instanceId:trigger.card.instanceId,cardNumber:trigger.card.cardNumber});const replacements=koTarget&&[...replacementOptionsFor(state,trigger.playerId,opponentId,koTarget,koTarget.instanceId,db),...registeredReplacementOptions(state,trigger.playerId,opponentId,koTarget,koTarget.instanceId,db)];if(koTarget&&replacements&&replacements.length>0){if(!trigger.resume)state.activeAttack=null;state.pendingTrigger=null;state.phase=resume.phase;state.activePlayer=trigger.playerId;state.pendingEffect={kind:"ko-character",playerId:trigger.playerId,targetPlayerId:opponentId,sourceCardNumber:trigger.card.cardNumber,sourceInstanceId:trigger.card.instanceId,eligibleInstanceIds:[koTarget.instanceId],resumePhase:"main",resumePlayerId:opposingPlayerId}}else{if(koTarget){const removed=knockOut(state,opponentId,koTarget.instanceId,trigger.card.cardNumber);if(removed)events.push(...removed.events)}resumeAfterTrigger(state)}}else if(trigger.card.cardNumber==="OP13-116"){player.trash.push({instanceId:trigger.card.instanceId,cardNumber:trigger.card.cardNumber});const pending=createSupernovaSearch(state,trigger.playerId,trigger.card,true,db);pending.resumePhase="main";pending.resumePlayerId=opposingPlayerId;state.pendingEffect=pending;if(!trigger.resume)state.activeAttack=null;state.pendingTrigger=null;state.phase=resume.phase;state.activePlayer=trigger.playerId}else if(trigger.card.cardNumber==="OP12-057"){player.trash.push(trigger.card);if(!trigger.resume)state.activeAttack=null;state.pendingTrigger=null;state.phase=resume.phase;state.activePlayer=trigger.playerId;state.pendingEffect={kind:"navy-discard",playerId:trigger.playerId,sourceCardNumber:trigger.card.cardNumber,sourceInstanceId:trigger.card.instanceId,eligibleInstanceIds:player.hand.map(card=>card.instanceId),remaining:1,optional:true,after:{kind:"draw",count:1},resumePhase:"main",resumePlayerId:opposingPlayerId}}else if(trigger.card.cardNumber==="EB04-028"){const targetOwnerId=["p1","p2"].find(playerId=>state.players[playerId].board.some(card=>card.instanceId===offered.optionId));if(!targetOwnerId)throw new Error("MISSING_EFFECT_TARGET");const owner=state.players[targetOwnerId];const targetIndex=owner.board.findIndex(card=>card.instanceId===offered.optionId);const[target]=owner.board.splice(targetIndex,1);if(!target)throw new Error("MISSING_EFFECT_TARGET");owner.restedDon.push(...target.attachedDon??[]);owner.hand.push({instanceId:target.instanceId,cardNumber:target.cardNumber});player.trash.push(trigger.card);events.push({type:"event-activated",playerId:trigger.playerId,cardNumber:trigger.card.cardNumber});resumeAfterTrigger(state)}else{player.trash.push(trigger.card);const amount=trigger.card.cardNumber==="OP04-016"?-3e3:trigger.card.cardNumber==="OP13-021"?-2e3:1e3;const targetPlayerId=trigger.card.cardNumber==="OP12-039"?trigger.playerId:opposingPlayerId;addPowerModifier(state,targetPlayerId,offered.optionId,amount,state.turn,trigger.card);events.push({type:"event-activated",playerId:trigger.playerId,cardNumber:trigger.card.cardNumber},{type:"power-changed",playerId:targetPlayerId,targetInstanceId:offered.optionId,amount,expiresAtTurn:state.turn,sourceCardNumber:trigger.card.cardNumber,sourceInstanceId:trigger.card.instanceId})}if(trigger.card.cardNumber==="OP04-016"||trigger.card.cardNumber==="OP13-021"||trigger.card.cardNumber==="OP12-039"){resumeAfterTrigger(state)}}var ACTION_HANDLERS={"mulligan-decision":applyMulliganDecision,"play-card":applyPlayCard,"resolve-effect":applyResolveEffect,"attach-don":applyAttachDon,"activate-main":applyActivateMain,attack:applyAttack,block:applyBlock,counter:applyCounter,"activate-counter-event":applyActivateCounterEvent,"resolve-trigger":applyResolveTrigger,pass:applyPass};function blockActions(state,playerId,db=cards){if(isUnblockableAttack(state,db)){return[{actionId:`r${state.revision}:pass-block`,type:"pass",summary:"Attack is unblockable"}]}return[...canLeaderBlock(state,playerId,db)?[{actionId:`r${state.revision}:block:${leaderInstanceId2(playerId)}`,type:"block",blockerInstanceId:leaderInstanceId2(playerId),summary:`Block with ${actionCardLabel(state,playerId,leaderInstanceId2(playerId),true,db)}`}]:[],...state.players[playerId].board.filter(card=>canBlock(state,playerId,card,db)).map(card=>({actionId:`r${state.revision}:block:${card.instanceId}`,type:"block",blockerInstanceId:card.instanceId,summary:`Block with ${actionCardLabel(state,playerId,card.instanceId,false,db)}`})),{actionId:`r${state.revision}:pass-block`,type:"pass",summary:"Do not block"}]}function counterActions(state,playerId,db=cards){const player=state.players[playerId];const targetInstanceId=state.activeAttack?.targetInstanceId;const attackPower=battleAttackPower(state,db);const currentDefense=targetInstanceId?currentPower(state,playerId,targetInstanceId,false,db)+(state.activeAttack?.counterPower??0):0;const alreadySafe=counterShortfall(attackPower,currentDefense)===0;const counterCards=alreadySafe?[]:player.hand.filter(card=>(db.require(card.cardNumber).counter??0)>0||handCounterPower(state,playerId,card.cardNumber,db)>0);const legacyCounterEvents=targetInstanceId?player.hand.filter(eventCard=>eventCard.cardNumber==="OP12-057"&&player.activeDon.length>=1||(eventCard.cardNumber==="OP04-016"||eventCard.cardNumber==="OP02-068"||eventCard.cardNumber==="OP11-079"&&player.activeDon.length>=1||eventCard.cardNumber==="OP12-098"&&player.activeDon.length>=1||eventCard.cardNumber==="OP07-056"&&player.activeDon.length>=1&&player.board.some(card=>effectiveCost(state,playerId,card,db)>=2)||["OP15-074","OP15-075","OP15-076","OP15-078"].includes(eventCard.cardNumber)||eventCard.cardNumber==="OP13-076"&&player.hand.some(discard=>discard.instanceId!==eventCard.instanceId))&&(eventCard.cardNumber==="OP11-079"||["OP12-098","OP07-056","OP15-074","OP15-075","OP15-076","OP15-078"].includes(eventCard.cardNumber)||player.hand.some(discard=>discard.instanceId!==eventCard.instanceId))):[];const programCounterEvents=targetInstanceId?player.hand.filter(eventCard=>{const program=getCounterEventProgram(eventCard.cardNumber);return program!==void 0&&player.activeDon.length>=eventActivationCost(state,playerId,eventCard.cardNumber,program.cost,db)&&fieldDonCount(state,playerId)>=(program.donMinus??0)&&player.hand.length-1>=(program.trashFromHand??0)}):[];const counterEvents=[...legacyCounterEvents,...programCounterEvents].filter(eventCard=>{if(counterClauseParts(eventCard.cardNumber)?.hasOtherEffect===true){return true}const power=counterEventForecastPower(state,playerId,eventCard.cardNumber,db);return power===void 0?!alreadySafe:power>0&&!alreadySafe});const availableCounter=counterCards.reduce((total,card)=>total+(db.require(card.cardNumber).counter??0)+handCounterPower(state,playerId,card.cardNumber,db),0)+counterEvents.reduce((total,card)=>total+(counterEventForecastPower(state,playerId,card.cardNumber,db)??0),0);const counterOutcome=added=>{const projectedDefense=currentDefense+added;const remaining2=counterShortfall(attackPower,projectedDefense);const result=remaining2===0?"attack is stopped":availableCounter-added>=remaining2?`still hit; ${remaining2} more Counter power from other cards in hand stops it`:`still hit; ${remaining2} more Counter power needed and the hand cannot reach it`;return`defense becomes ${projectedDefense} vs ${attackPower} attack: ${result}`};const counterValue=card=>(db.require(card.cardNumber).counter??0)+handCounterPower(state,playerId,card.cardNumber,db);const asideTargets=targetInstanceId?[{instanceId:`${playerId}-leader`,label:`your Leader ${db.require(player.leaderCardNumber).name}`},...player.board.map(card=>({instanceId:card.instanceId,label:`${db.require(card.cardNumber).name} [${card.cardNumber}]`}))].filter(target=>target.instanceId!==targetInstanceId):[];const asideCounters=player.hand.filter(card=>counterValue(card)>0).flatMap(card=>{const definition=db.require(card.cardNumber);const counter=counterValue(card);return asideTargets.map(target=>({actionId:`r${state.revision}:counter:${card.instanceId}:${target.instanceId}`,type:"counter",cardInstanceId:card.instanceId,counterPower:counter,targetInstanceId:target.instanceId,summary:`Counter with ${definition.name} [${definition.cardNumber}] onto ${target.label}, not the card being attacked (+${counter} to it for this battle; ${counterOutcome(0)})`}))});return[...counterCards.map(card=>{const definition=db.require(card.cardNumber);const counter=(definition.counter??0)+handCounterPower(state,playerId,card.cardNumber,db);return{actionId:`r${state.revision}:counter:${card.instanceId}`,type:"counter",cardInstanceId:card.instanceId,counterPower:counter,summary:`Counter with ${definition.name} [${definition.cardNumber}] (+${counter}; ${counterOutcome(counter)})`}}),...counterEvents.map(eventCard=>{const power=counterEventForecastPower(state,playerId,eventCard.cardNumber,db);const arithmetic=power===void 0?"its Counter power is decided as it resolves":power===0?`adds nothing to this battle, whose target it cannot reach; ${counterOutcome(0)}`:`+${power}; ${counterOutcome(power)}`;return{actionId:`r${state.revision}:counter-event:${eventCard.instanceId}`,type:"activate-counter-event",eventInstanceId:eventCard.instanceId,sourceCardNumber:eventCard.cardNumber,...power===void 0?{}:{counterPower:power},summary:`${activationSummary(eventCard.cardNumber,"[Counter]")} (${arithmetic})`}}),{actionId:`r${state.revision}:pass-counter`,type:"pass",summary:`Resolve battle without more counters (${battleForecast(attackPower,currentDefense,targetInstanceId?battleStake(state,playerId,targetInstanceId,state.activeAttack?{playerId:state.activeAttack.attackerPlayerId,instanceId:state.activeAttack.attackerInstanceId}:void 0,db):void 0)})`},...asideCounters]}function comparison(operator,value,noun){return operator==="lte"?`${value} or fewer ${noun}`:`${value} or more ${noun}`}var ZONE_NOUNS={hand:"cards in hand",life:"Life cards",trash:"cards in the trash",deck:"cards in the deck",board:"Characters"};function describeSelector(selector){const noun=selector.category==="character"?"Characters":"cards";const filters=[];if(selector.name!==void 0)filters.push(`named [${selector.name}]`);if(selector.type!==void 0)filters.push(`of the {${selector.type}} type`);if(selector.typeIncluding!==void 0){filters.push(`with {${selector.typeIncluding}} in their type`)}if(selector.anyOf!==void 0){const alternatives=selector.anyOf.map(option=>option.type!==void 0?`{${option.type}}`:option.name!==void 0?`[${option.name}]`:null).filter(text=>text!==null);if(alternatives.length===selector.anyOf.length){filters.push(`of the ${alternatives.join(" or ")} type`)}}if(selector.minCurrentPower!==void 0){filters.push(`with ${selector.minCurrentPower} power or more`)}if(selector.maxCurrentPower!==void 0){filters.push(`with ${selector.maxCurrentPower} power or less`)}if(selector.maxCost!==void 0){filters.push(`with a cost of ${selector.maxCost} or less`)}if(selector.minCost!==void 0){filters.push(`with a cost of ${selector.minCost} or more`)}if(selector.rested===true)filters.push("that are rested");if(selector.rested===false)filters.push("that are active");return filters.length===0?noun:`${noun} ${filters.join(" ")}`}function side(player,possessive,other){return player==="opponent"?other:possessive}function describeMechanicCondition(condition){switch(condition.kind){case"source-attached-don":return comparison(condition.operator,condition.value,"DON!! attached to this card");case"field-don":return`${comparison(condition.operator,condition.value,"DON!! cards")} in ${side(condition.player,"your","your opponent's")} cost area and given out`;case"given-don":return`${comparison(condition.operator,condition.value,"given DON!! cards")} on ${side(condition.player,"your","your opponent's")} field`;case"active-don":return`${comparison(condition.operator,condition.value,"active DON!! cards")} in ${side(condition.player,"your","your opponent's")} cost area`;case"rested-don":return`${comparison(condition.operator,condition.value,"rested DON!! cards")} in ${side(condition.player,"your","your opponent's")} cost area`;case"zone-count":{const zone=Array.isArray(condition.zone)?condition.zone.join("/"):condition.zone;const noun=ZONE_NOUNS[zone]??`cards in the ${zone}`;return`${comparison(condition.operator,condition.value,noun)} on ${side(condition.player,"your","your opponent's")} side`}case"selector-count":return`${comparison(condition.operator,condition.value,describeSelector(condition.selector))} on ${condition.player==="either"?"either side":side(condition.player,"your","your opponent's")+" side"}`;case"selector-cost-total":return`${side(condition.player,"your","your opponent's")} ${describeSelector(condition.selector)} totalling ${condition.value} cost or ${condition.operator==="lte"?"less":"more"}`;case"every-character-matches":return`every one of ${side(condition.player,"your","your opponent's")} Characters to be ${describeSelector(condition.selector)}`;case"source-played-this-turn":return"this card to have been played this turn";case"source-current-power":return`this card at ${condition.value} power or ${condition.operator==="lte"?"less":"more"}`;case"source-cost":return`this card at a cost of ${condition.value} or ${condition.operator==="lte"?"less":"more"}`;case"leader-power":return`${side(condition.player,"your","your opponent's")} Leader at ${condition.value} power or ${condition.operator==="lte"?"less":"more"}`;case"leader-battled-character":return`${side(condition.player,"your","your opponent's")} Leader to have battled a Character this turn`;case"life-versus":return`${side(condition.player,"your","your opponent's")} Life at or ${condition.operator==="lte"?"below":"above"} the other side's`;case"combined-life":return comparison(condition.operator,condition.value,"Life cards between both players");case"event-activated-this-turn":return`an Event with a base cost of ${condition.minBaseCost} or more activated this turn`;default:return null}}function conditionFixedForGame(condition){switch(condition.kind){case"leader-has-type":case"leader-has-name":case"leader-has-attribute":case"leader-has-color":case"leader-type-including":case"leader-multicolored":return true;case"all-of":case"any-of":return condition.conditions.every(conditionFixedForGame);default:return false}}function count(value,singular,plural=`${singular}s`){return`${value} ${value===1?singular:plural}`}function unmetRequirement(state,playerId,source,requires,db){if(!requires)return void 0;const player=state.players[playerId];if(requires.fieldDon!==void 0&&fieldDonCount(state,playerId)<requires.fieldDon){return`${count(requires.fieldDon,"DON!! card")} in your cost area and given out`}if(requires.activeDon!==void 0&&player.activeDon.length<requires.activeDon){return count(requires.activeDon,"active DON!! card")}if(requires.handCards!==void 0&&player.hand.length<requires.handCards){return`${count(requires.handCards,"card")} in hand`}const restedDon=player.restedDon.length+(requires.restedDonCountsSourceGiven?source.attachedDon?.length??0:0);if(requires.restedDon!==void 0&&restedDon<requires.restedDon){return count(requires.restedDon,"rested DON!! card")}if(requires.lifeCards!==void 0&&player.life.length<requires.lifeCards){return count(requires.lifeCards,"Life card")}if(requires.givenDon!==void 0&&player.leaderAttachedDon.length+player.board.reduce((total,card)=>total+(card.attachedDon?.length??0),0)<requires.givenDon){return`${count(requires.givenDon,"given DON!! card")} on your field`}if(requires.donActivationAllowed&&(player.cannotActivateDonByCharacterUntilTurn??-1)>=state.turn){return"DON!! to be settable active again, which its own text has barred for this turn"}if(requires.sourceActive||requires.sourceRested){const rested=source.instanceId===leaderInstanceId2(playerId)?player.leaderRested:source.rested;if(requires.sourceActive&&rested)return"this card to be active";if(requires.sourceActive&&restLocked(state,source)){return"this card to be restable, which an effect has barred"}if(requires.sourceRested&&!rested)return"this card to be rested"}if(requires.handCardsMatching!==void 0&&selectCards(state,{sourcePlayerId:playerId,source},{...requires.handCardsMatching.match,player:"self",zone:"hand"},{},db).length<requires.handCardsMatching.count){return`${count(requires.handCardsMatching.count,"particular card")} in hand, which its text names`}if(requires.lifeCardsMatching!==void 0&&selectCards(state,{sourcePlayerId:playerId,source},{...requires.lifeCardsMatching.match,player:"self",zone:"life"},{},db).length<requires.lifeCardsMatching.count){return`${count(requires.lifeCardsMatching.count,"particular Life card")}, which its text names`}return void 0}function gateState(state,playerId,source,condition,db){const met=conditionMatches(state,{sourcePlayerId:playerId,source},condition,{[SOURCE_BINDING]:[source.instanceId]},db);if(met)return{kind:"met"};if(condition.kind==="all-of"||condition.kind==="any-of"){const parts=condition.conditions.map(inner=>gateState(state,playerId,source,inner,db));const unmet=parts.filter(part=>part.kind!=="met");if(condition.kind==="all-of"&&unmet.some(part=>part.kind==="never")){return{kind:"never"}}if(condition.kind==="any-of"&&unmet.every(part=>part.kind==="never")){return{kind:"never"}}const texts=unmet.filter(part=>part.kind==="unmet").map(part=>part.text);if(texts.length===0||texts.some(text=>text===null)){return{kind:"unmet",text:null}}return{kind:"unmet",text:texts.join(condition.kind==="all-of"?" and ":" or ")}}if(condition.kind==="source-played-this-turn"||conditionFixedForGame(condition)){return{kind:"never"}}return{kind:"unmet",text:describeMechanicCondition(condition)}}function oncePerTurnSpent(state,playerId,source,program){return program.oncePerTurn&&state.oncePerTurn.includes(`${state.turn}:${playerId}:${source.instanceId}:activate-main`)}function activateMainAvailable(state,playerId,source,program,db){if(oncePerTurnSpent(state,playerId,source,program))return false;if(unmetRequirement(state,playerId,source,program.requires,db)){return false}const gate=bareGateCondition(program.program);return gate===null||gateState(state,playerId,source,gate,db).kind==="met"}function dormantActivation(state,playerId,source,db){const program=getActivateMainProgram(source.cardNumber);if(!program)return void 0;const clause="[Activate: Main]";if(oncePerTurnSpent(state,playerId,source,program)){return{clause,reason:"its one use this turn is spent"}}const requirement=unmetRequirement(state,playerId,source,program.requires,db);if(requirement)return{clause,reason:`needs ${requirement}`};const gate=bareGateCondition(program.program);if(gate===null)return void 0;const outcome=gateState(state,playerId,source,gate,db);if(outcome.kind==="met"||outcome.kind==="never")return void 0;return{clause,reason:outcome.text===null?"needs the condition its printed text states":`needs ${outcome.text}`}}function costOfEffect(effect){const first=effect.kind==="sequence"?effect.effects[0]:effect;if(!first)return void 0;if(first.kind==="return-don"&&first.player==="self"){return{returnsDon:first.count}}if(first.kind==="rest-don"&&first.player==="self"){return{restsDon:first.count}}const payment=handPayment(first);const trashed=payment&&handCardsTrashedBy(payment);return trashed===void 0?void 0:{trashesFromHand:trashed}}function handPayment(first){if(first.kind==="choose")return first;if(first.kind==="if"&&first.then.kind==="choose"&&first.else!==void 0&&handCardsTrashedBy(first.then)!==void 0&&handCardsTrashedBy(first.else)!==void 0){return first.then}return void 0}function costOfProgram(program){let effect=program.effect;for(;;){if(effect.kind==="if"){effect=effect.then;continue}if(effect.kind==="optional"){effect=effect.effect;continue}break}return costOfEffect(effect)}function donAddedByProgram(program){const total={active:0,rested:0};const walk=effect=>{switch(effect.kind){case"add-don":if(effect.player!=="self")return;if(effect.rested)total.rested+=effect.count;else total.active+=effect.count;return;case"sequence":for(const step2 of effect.effects)walk(step2);return;case"if":walk(effect.then);return;case"optional":walk(effect.effect);return;case"choose":walk(effect.effect);return;default:return}};walk(program.effect);return total.active+total.rested>0?total:void 0}function donAddedByOptionalPayoff(effect){const paid=effect.kind==="choose"&&handCardsTrashedBy(effect)!==void 0?effect.effect:effect;const steps=paid.kind==="sequence"?paid.effects:[paid];const total={active:0,rested:0};for(const step2 of steps){if(step2.kind==="move"&&step2.to.zone==="trash")continue;if(step2.kind==="return-don"&&step2.player==="self")continue;if(step2.kind==="rest-don"&&step2.player==="self")continue;if(step2.kind!=="add-don"||step2.player!=="self")return void 0;if(step2.rested)total.rested+=step2.count;else total.active+=step2.count}return total.active+total.rested>0?total:void 0}function handCardsTrashedBy(effect){if(effect.kind!=="choose")return void 0;if(effect.selector.player!=="self"||effect.selector.zone!=="hand"){return void 0}if(effect.chooser!==void 0&&effect.chooser!=="self"){return void 0}const inner=effect.effect.kind==="sequence"?effect.effect.effects[0]:effect.effect;if(inner?.kind==="move"&&inner.binding===effect.bind&&inner.to.zone==="trash"){return effect.min}return void 0}function payoffOfEffect(effect){const kinds=new Set;for(const step2 of payoffSteps(effect))collectPayoff(step2,kinds);return kinds.size>0?PAYOFF_KINDS.filter(kind=>kinds.has(kind)):void 0}function payoffSteps(effect){const steps=effect.kind==="sequence"?effect.effects:[effect];const[first,...rest]=steps;if(!first||!costOfEffect(effect))return steps;const payment=handPayment(first);if(payment){const inner=payment.effect;return[...inner.kind==="sequence"?inner.effects.slice(1):[],...rest]}return rest}function collectPayoff(effect,kinds){const walk=inner=>{if(inner)collectPayoff(inner,kinds)};switch(effect.kind){case"sequence":for(const step2 of effect.effects)walk(step2);return;case"if":walk(effect.then);walk(effect.else);return;case"choice":for(const branch of effect.branches)walk(branch.effect);return;case"optional":case"select":case"choose":case"pick-from-hand":case"bind-battle-target":case"return-don-choice":walk(effect.effect);return;case"remember-target":case"shuffle-deck":return;case"look-at":case"reveal":case"reveal-deck-top":case"order-to-bottom":kinds.add("search");return;case"draw":kinds.add("draw");return;case"play":kinds.add("play");return;case"knock-out":kinds.add("knock-out");return;case"update":if(effect.rested===false)kinds.add("set-active");else if(effect.rested===true)kinds.add("rest");else kinds.add("other");return;case"at-end-of-turn":kinds.add(effect.action==="set-active"?"set-active":"to-deck");return;case"at-end-of-turn-effect":walk(effect.effect);return;case"rest":case"rest-opponent-cards":kinds.add("rest");return;case"move":kinds.add(effect.to.zone==="hand"?"to-hand":effect.to.zone==="life"?"to-life":effect.to.zone==="deck"?"to-deck":effect.to.zone==="trash"?"trash":"other");return;case"deck-top-to-life-at-end-of-turn":kinds.add("to-life");return;case"trash-top":case"trash-hand-down-to":case"trash-life-down-to":kinds.add("trash");return;case"modify-power":case"battle-power":case"set-base-power":case"set-leader-base-power":case"copy-power":case"swap-base-power":kinds.add("power");return;case"modify-cost":case"discount-next-play":kinds.add("cost");return;case"grant-keyword":case"grant-attribute":case"grant-attack-active":kinds.add("keyword");return;case"add-don":case"activate-don":case"attach-don":case"give-rested-don":case"hold-don-from-refresh":case"add-don-at-end-of-turn":case"activate-don-at-end-of-turn":kinds.add("don");return;case"restrict":case"restrict-player":case"negate":case"disable-blockers":kinds.add("restrict");return;case"return-don":case"return-given-don":case"rest-don":case"rest-don-at-next-main":case"equalize-don-at-end-of-turn":case"deal-damage":case"redirect-attack":case"extra-turn":case"activate-event":case"install-replacement":kinds.add("other");return;case"spend-once-per-turn":return;default:{const unclassified=effect;return unclassified}}}function mechanicActivationOffers(state,playerId,db){const player=state.players[playerId];const actions=[];for(const source of[...player.board,...player.stage?[player.stage]:[]]){const activation=getActivateMainProgram(source.cardNumber);if(!activation)continue;if(!activateMainAvailable(state,playerId,source,activation,db)){continue}const grant=programKeywordGrant(activation.program);const activationGift=programRestedDonGift({sourcePlayerId:playerId,source},activation.program);const activationCost=costOfProgram(activation.program);const activationRamps=donAddedByProgram(activation.program);const optionId=`mechanic-main:${source.instanceId}`;actions.push({actionId:`r${state.revision}:activate:${optionId}`,type:"activate-main",optionId,sourceCardNumber:source.cardNumber,sourceInstanceId:source.instanceId,...programSelectsNothing(state,{sourcePlayerId:playerId,source},activation.program,db)?{selectsNothing:true}:{},...programChangesNothing(state,{sourcePlayerId:playerId,source},activation.program,db)?{changesNothing:true}:{},...grant?{grants:grant}:{},...activationGift?{donGift:activationGift}:{},...activationCost?{cost:activationCost}:{},...activationRamps?{ramps:activationRamps}:{},summary:activationSummary(source.cardNumber,"[Activate: Main]","[Main]")})}{const leaderActivation=getActivateMainProgram(player.leaderCardNumber);if(leaderActivation){const leaderSourceInstanceId=leaderInstanceId2(playerId);const leaderSource={instanceId:leaderSourceInstanceId,cardNumber:player.leaderCardNumber};if(activateMainAvailable(state,playerId,leaderSource,leaderActivation,db)){const leaderGrant=programKeywordGrant(leaderActivation.program);const leaderGift=programRestedDonGift({sourcePlayerId:playerId,source:leaderSource},leaderActivation.program);const leaderCost=costOfProgram(leaderActivation.program);const leaderRamps=donAddedByProgram(leaderActivation.program);const optionId=`mechanic-main:${leaderSourceInstanceId}`;actions.push({actionId:`r${state.revision}:activate:${optionId}`,type:"activate-main",optionId,sourceCardNumber:player.leaderCardNumber,sourceInstanceId:leaderSourceInstanceId,...programSelectsNothing(state,{sourcePlayerId:playerId,source:leaderSource},leaderActivation.program,db)?{selectsNothing:true}:{},...programChangesNothing(state,{sourcePlayerId:playerId,source:leaderSource},leaderActivation.program,db)?{changesNothing:true}:{},...leaderGrant?{grants:leaderGrant}:{},...leaderGift?{donGift:leaderGift}:{},...leaderCost?{cost:leaderCost}:{},...leaderRamps?{ramps:leaderRamps}:{},summary:activationSummary(player.leaderCardNumber,"[Activate: Main]","[Main]")})}}}const enelBoardless=player.board.length===0;if(player.leaderCardNumber==="OP15-058"&&state.turn>=3&&(enelBoardless?player.donDeck.length>0:player.donDeck.length>0||player.restedDon.length>0)&&!state.oncePerTurn.includes(`${state.turn}:${playerId}:enel-leader`)){if(enelBoardless){actions.push({actionId:`r${state.revision}:activate:enel-leader`,type:"activate-main",optionId:"enel-leader",sourceCardNumber:player.leaderCardNumber,sourceInstanceId:leaderInstanceId2(playerId),ramps:{active:1,rested:4},summary:"Add DON!! from the DON!! deck (no Characters to give the rested DON!! to, so they stay in the cost area and become active at your next Refresh)"})}for(const target of player.board){const optionId=`enel-leader:${target.instanceId}`;const attackTiming=canAttack(state,playerId,target.instanceId,db)?"can still attack this turn":"cannot attack this turn";actions.push({actionId:`r${state.revision}:activate:${optionId}`,type:"activate-main",optionId,sourceCardNumber:player.leaderCardNumber,sourceInstanceId:leaderInstanceId2(playerId),targetInstanceId:target.instanceId,ramps:{active:1,rested:4},donGift:{count:4,from:"rested"},summary:`Add DON!! from the DON!! deck and give up to 4 rested DON!! to ${actionCardLabel(state,playerId,target.instanceId,true,db)} (${attackTiming}; given DON!! returns at your next Refresh)`})}}return actions}function donNeededToReach(state,playerId,attackerInstanceId,targetInstanceId,attackPower,targets,db){const divided=(target,from,spent2)=>spent2+Math.ceil((target-from)/1e3);const answer=(target,reached,at,spent2)=>attackPower>=target?void 0:reached??divided(target,at,spent2);const player=state.players[playerId];const isLeader=attackerInstanceId===leaderInstanceId2(playerId);const card=isLeader?void 0:player.board.find(candidate=>candidate.instanceId===attackerInstanceId);if(!isLeader&&!card){return{board:answer(targets.board,void 0,attackPower,0),effective:answer(targets.effective,void 0,attackPower,0)}}if(attackPower>=targets.effective&&attackPower>=targets.board){return{board:void 0,effective:void 0}}const activeBefore=[...player.activeDon];const attachedBefore=isLeader?[...player.leaderAttachedDon]:card?.attachedDon?[...card.attachedDon]:void 0;const attackBefore=state.activeAttack;state.activeAttack={attackerPlayerId:playerId,defenderPlayerId:opponentOf2(playerId),attackerInstanceId,targetInstanceId,battleAttackBonus:0,counterPower:0};let reachedBoard;let reachedEffective;let power=attackPower;let spent=0;try{for(let given=1;given<=activeBefore.length;given+=1){const moved=player.activeDon.pop();if(moved===void 0)break;if(isLeader)player.leaderAttachedDon.push(moved);else card.attachedDon=[...card.attachedDon??[],moved];power=currentPower(state,playerId,attackerInstanceId,true,db);spent=given;if(reachedBoard===void 0&&power>=targets.board){reachedBoard=given}if(reachedEffective===void 0&&power>=targets.effective){reachedEffective=given}if(reachedBoard!==void 0&&reachedEffective!==void 0)break}}finally{state.activeAttack=attackBefore;player.activeDon.length=0;player.activeDon.push(...activeBefore);if(isLeader){player.leaderAttachedDon.length=0;player.leaderAttachedDon.push(...attachedBefore)}else if(attachedBefore===void 0)delete card.attachedDon;else card.attachedDon=attachedBefore}return{board:answer(targets.board,reachedBoard,power,spent),effective:answer(targets.effective,reachedEffective,power,spent)}}function unspentDonNote(activeDon,attackPower,targetPower){if(activeDon===0)return"";return`; declaring now leaves ${activeDon} active DON!! unspent, and each one given to this attacker first raises the requirement by 1000, to ${counterShortfall(attackPower+activeDon*1e3,targetPower)} if all ${activeDon} go here -- DON!! spread over other attackers raises theirs instead`}function whenAttackingInert(state,playerId,attacker,db){if(effectsNegated(state,attacker.instanceId))return false;if((attacker.attackTaxUntilTurn??-1)>=state.turn)return false;const eligible=eligibleWhenAttackingProgram(state,playerId,attacker);const effect=eligible?.program.program.effect;if(effect?.kind!=="if"||effect.else!==void 0)return false;const restedBefore=attacker.rested;attacker.rested=true;try{return!conditionMatches(state,{sourcePlayerId:playerId,source:attacker},effect.condition,{[SOURCE_BINDING]:[attacker.instanceId]},db)}finally{attacker.rested=restedBefore}}function attackOffers(state,playerId,db){const player=state.players[playerId];const opponent=state.players[opponentOf2(playerId)];const actions=[];if(state.turn>2){const attackers=[...canAttack(state,playerId,leaderInstanceId2(playerId),db)?[leaderInstanceId2(playerId)]:[],...player.board.filter(card=>canAttack(state,playerId,card.instanceId,db)).map(card=>card.instanceId)];const restedTargets=[leaderInstanceId2(opponentOf2(playerId)),...opponent.board.filter(card=>card.rested).map(card=>card.instanceId)];const activeTargets=opponent.board.filter(card=>!card.rested).map(card=>card.instanceId);for(const attackerInstanceId of attackers){const attacker=player.board.find(card=>card.instanceId===attackerInstanceId);const attacksActive=attackerInstanceId===leaderInstanceId2(playerId)?(player.leaderAttacksActiveUntilTurn??-1)>=state.turn:(attacker?.attacksActiveUntilTurn??-1)>=state.turn||attacker!==void 0&&attacksActiveCharacters(state,playerId,attacker,db);const targets=attacksActive?[...restedTargets,...activeTargets]:restedTargets;const characterRushOnly=attacker?.playedTurn===state.turn&&!hasRush(state,playerId,attacker,db)&&hasRushCharacter(state,playerId,attacker,db);const leaderAttackCeiling=attackerInstanceId===leaderInstanceId2(playerId)&&(player.leaderCannotAttackCharactersUntilTurn??-1)>=state.turn?player.leaderCannotAttackCharactersMaxBaseCost??0:void 0;const captainJohns=new Set(opponent.board.filter(card=>card.cardNumber==="OP17-044"&&card.rested).map(card=>card.instanceId));const captainJohnTaunt=captainJohns.size>0&&hasCardType(opponent.leaderCardNumber,"Rocks Pirates");const leadersBarred=(player.cannotAttackLeadersUntilTurn??-1)>=state.turn;for(const targetInstanceId of targets.filter(target=>{if(leadersBarred&&target===leaderInstanceId2(opponentOf2(playerId))){return false}if(captainJohnTaunt)return captainJohns.has(target);if(characterRushOnly&&target===leaderInstanceId2(opponentOf2(playerId))){return false}if(leaderAttackCeiling===void 0||target===leaderInstanceId2(opponentOf2(playerId))){return true}const targetCard=opponent.board.find(card=>card.instanceId===target);return Boolean(targetCard&&(db.require(targetCard.cardNumber).cost??0)>leaderAttackCeiling)})){const defenderPlayerId=opponentOf2(playerId);state.activeAttack={attackerPlayerId:playerId,defenderPlayerId,attackerInstanceId,targetInstanceId,battleAttackBonus:0,counterPower:0};const attackPower=currentPower(state,playerId,attackerInstanceId,true,db);const attackerCard=player.board.find(card=>card.instanceId===attackerInstanceId);const inertWhenAttacking=attackerCard!==void 0&&whenAttackingInert(state,playerId,attackerCard,db);state.activeAttack=null;const targetPower=currentPower(state,defenderPlayerId,targetInstanceId,false,db);const attackerIsBlocker=Boolean(attackerCard&&canBlock(state,playerId,attackerCard,db));const attackerIsLeader=attackerInstanceId===leaderInstanceId2(playerId);const pendingDefense=pendingDefenseBoost(state,defenderPlayerId,targetInstanceId,attackerInstanceId);const pendingTotal=pendingDefense.battle+pendingDefense.turn;const effectiveTargetPower=targetPower+pendingTotal;const laterTargetPower=targetPower+pendingDefense.turn;const donNeeded=donNeededToReach(state,playerId,attackerInstanceId,targetInstanceId,attackPower,{board:targetPower,effective:effectiveTargetPower},db);const donToReach=donNeeded.effective;const donToWinBattle=donNeeded.board;actions.push({actionId:`r${state.revision}:attack:${attackerInstanceId}:${targetInstanceId}`,type:"attack",attackerInstanceId,targetInstanceId,attackPower,targetPower,effectiveTargetPower,counterShortfall:counterShortfall(attackPower,targetPower),...donToReach===void 0?{}:{donToReach},...donToWinBattle===void 0?{}:{donToWinBattle},unspentActiveDon:player.activeDon.length,attackerIsBlocker,attackerIsLeader,...inertWhenAttacking?{whenAttackingInert:true}:{},summary:`Attack ${actionCardLabel(state,defenderPlayerId,targetInstanceId,false,db)} with ${actionCardLabel(state,playerId,attackerInstanceId,true,db)} (${battleForecast(attackPower,targetPower,battleStake(state,defenderPlayerId,targetInstanceId,{playerId,instanceId:attackerInstanceId},db))}${pendingTotal>0?`; the defender still holds an unused once-per-turn ability that raises this target to ${effectiveTargetPower}, so ${counterShortfall(attackPower,effectiveTargetPower)===0?"this attack fails outright once it is paid, and paying it costs the defender only 1 card":`the real requirement is ${counterShortfall(attackPower,effectiveTargetPower)} Counter power${pendingDefense.turn>0?` and every later attack this turn meets ${laterTargetPower} too`:", though that ability only lasts for this battle"}`}`:""}${attackerIsBlocker?"; declaring rests this Blocker, so it cannot block on the opponent's next turn":""}${attackerIsLeader?"; the Leader can never block and is a legal target whether rested or active, so declaring here costs nothing beyond the attack itself":""}${donToReach===void 0?unspentDonNote(player.activeDon.length,attackPower,targetPower):donToReach<=player.activeDon.length?`; giving this attacker ${donToReach} of your ${player.activeDon.length} active DON!! first would raise it into range`:`; no amount of your ${player.activeDon.length} active DON!! reaches this target, which needs ${donToReach}`})`})}}}return actions}function donOffers(state,playerId,db){const player=state.players[playerId];const actions=[];if(player.activeDon.length>0){for(const targetInstanceId of[leaderInstanceId2(playerId),...player.board.map(card=>card.instanceId)]){const target=actionCardLabel(state,playerId,targetInstanceId,true,db);actions.push({actionId:`r${state.revision}:attach:${targetInstanceId}`,type:"attach-don",targetInstanceId,summary:`Attach 1 DON!! to ${target} (+1000 power during this turn only; the DON!! stays under it until your next Refresh, so it cannot pay for a [Counter] Event)`})}}return actions}function handOffers(state,playerId,db){const player=state.players[playerId];const actions=[];for(const[index,instance]of player.hand.entries()){const definition=db.require(instance.cardNumber);const cost=definition.cost===null?null:playCostFromHand(state,playerId,instance.cardNumber,definition.cost);if(cost!==null&&cost<=player.activeDon.length&&(definition.category==="character"||definition.category==="stage")&&(player.cannotPlayFromHandUntilTurn??-1)<state.turn&&!(definition.category==="character"&&(player.cannotPlayCharactersUntilTurn??-1)>=state.turn&&(definition.cost??0)>=(player.cannotPlayCharactersMinCost??0))){actions.push({actionId:`r${state.revision}:play:${index}:${instance.instanceId}`,type:"play-card",cardInstanceId:instance.instanceId,summary:`Play ${definition.name} [${definition.cardNumber}] (cost ${cost} DON!!)`})}const eventProgram=getEventMainProgram(instance.cardNumber);const eventCostInDon=eventProgram?eventActivationCost(state,playerId,instance.cardNumber,eventProgram.cost,db):0;if(eventProgram&&(player.cannotPlayFromHandUntilTurn??-1)<state.turn&&player.activeDon.length>=eventCostInDon+(eventProgram.restDon??0)&&fieldDonCount(state,playerId)>=(eventProgram.donMinus??0)&&player.hand.length-1>=(eventProgram.trashFromHand??0)){const eventGate=bareGateCondition(eventProgram.program);const eventGateMet=!eventGate||conditionMatches({...state,players:{...state.players,[playerId]:{...player,hand:player.hand.filter(card=>card!==instance),trash:[...player.trash,instance]}}},{sourcePlayerId:playerId,source:instance},eventGate,{[SOURCE_BINDING]:[instance.instanceId]},db);if(!eventGateMet)continue;const eventGrant=programKeywordGrant(eventProgram.program);const eventCost={...eventProgram.donMinus?{returnsDon:eventProgram.donMinus}:{},...eventProgram.restDon?{restsDon:eventProgram.restDon}:{},...eventProgram.trashFromHand?{trashesFromHand:eventProgram.trashFromHand}:{}};const eventRamps=donAddedByProgram(eventProgram.program);const optionId=`mechanic-event:${instance.instanceId}`;actions.push({actionId:`r${state.revision}:activate:${optionId}`,type:"activate-main",optionId,sourceCardNumber:instance.cardNumber,sourceInstanceId:instance.instanceId,...programSelectsNothing(state,{sourcePlayerId:playerId,source:instance},eventProgram.program,db)?{selectsNothing:true}:{},...eventGrant?{grants:eventGrant}:{},...Object.keys(eventCost).length>0?{cost:eventCost}:{},...eventRamps?{ramps:eventRamps}:{},summary:activationSummary(definition.cardNumber,"[Main]","[Activate: Main]")})}}return actions}function endTurnSummary(activeDon,plays,activations,attacks,connectingAttacks){const unused=[activeDon>0?`${activeDon} active DON!! (which expire unspent)`:"",plays>0?`${plays} card${plays===1?"":"s"} playable`:"",activations>0?`${activations} ability${activations===1?"":"s"} activatable`:"",attacks>0?`${attacks} attack${attacks===1?"":"s"} declarable${connectingAttacks>0?`, ${connectingAttacks} of which beat${connectingAttacks===1?"s":""} its target as the board stands`:""}`:""].filter(Boolean);return unused.length===0?"End turn (nothing left to do)":`End turn, giving up ${unused.join(", ")}`}function passOffer(state,playerId,actions){const player=state.players[playerId];return{actionId:`r${state.revision}:pass`,type:"pass",unspentActiveDon:player.activeDon.length,availablePlayCount:actions.filter(action=>action.type==="play-card").length,availableActivationCount:actions.filter(action=>action.type==="activate-main").length,eligibleAttackCount:actions.filter(action=>action.type==="attack").length,summary:endTurnSummary(player.activeDon.length,actions.filter(action=>action.type==="play-card").length,actions.filter(action=>action.type==="activate-main").length,actions.filter(action=>action.type==="attack").length,actions.filter(action=>action.type==="attack"&&(action.counterShortfall??0)>0).length)}}function mainActions(state,playerId,db=cards){const actions=[...handOffers(state,playerId,db),...mechanicActivationOffers(state,playerId,db),...donOffers(state,playerId,db),...attackOffers(state,playerId,db)];actions.push(passOffer(state,playerId,actions));return actions.filter(action=>!("sourceInstanceId"in action)||!effectsNegated(state,action.sourceInstanceId))}function mulliganActions(state){return["keep","mulligan"].map(decision=>({actionId:`r${state.revision}:mulligan:${decision}`,type:"mulligan-decision",decision,summary:decision==="keep"?"Keep opening hand":"Mulligan hand"}))}function cardRef(card,db){const definition=db.require(card.cardNumber);return{instanceId:card.instanceId,cardNumber:card.cardNumber,name:definition.name,category:definition.category,cost:definition.cost,power:definition.power,counter:definition.counter}}function locate(state,instanceId){for(const ownerId of["p1","p2"]){const player=state.players[ownerId];if(instanceId===`${ownerId}-leader`){return{card:{instanceId,cardNumber:player.leaderCardNumber},ownerId,zone:"leader"}}for(const zone of["hand","board","trash","deck","life"]){const card=player[zone].find(candidate=>candidate.instanceId===instanceId);if(card)return{card,ownerId,zone}}if(player.stage?.instanceId===instanceId){return{card:player.stage,ownerId,zone:"stage"}}}for(const pending of pendingEffectChain(state.pendingEffect)){if(!("revealed"in pending))continue;const card=pending.revealed.find(candidate=>candidate.instanceId===instanceId);if(card)return{card,ownerId:pending.playerId,zone:"revealed"}}return void 0}function describeCard(state,decidingPlayerId,located,extras,db){const viaLocated=extras.via?locate(state,extras.via):void 0;return{kind:"card",owner:located.ownerId===decidingPlayerId?"self":"opponent",zone:located.zone,card:cardRef(located.card,db),...located.zone==="board"||located.zone==="stage"?{rested:Boolean(located.card.rested)}:{},...located.zone==="board"||located.zone==="leader"?{currentPower:currentPower(state,located.ownerId,located.card.instanceId,donPowerApplies(state,located.ownerId),db)}:{},...viaLocated?{via:cardRef(viaLocated.card,db)}:{},...extras.amount===void 0?{}:{amount:extras.amount}}}function describeEffectOption(state,decidingPlayerId,optionId,db=cards){if(optionId==="skip"||optionId==="none")return{kind:"skip"};if(optionId==="apply"||optionId==="done"||optionId==="activate"){return{kind:"confirm",choice:optionId}}if(optionId==="top"||optionId==="bottom"){return{kind:"position",position:optionId}}if(optionId==="leader"||optionId==="don"){return{kind:"resource",resource:optionId}}const pendingChoice=state.pendingEffect;if(pendingChoice?.kind==="mechanic-choice"&&pendingChoice.choice.kind==="choice"&&pendingChoice.choice.branches.some(branch=>branch.id===optionId)){return{kind:"mode",mode:optionId}}if(pendingChoice?.kind==="mechanic-choice"&&pendingChoice.choice.kind==="blind-hand-pick"){const{instanceIds,targetPlayerId}=pendingChoice.choice;const position=parseFaceDownOption(optionId,instanceIds.length);if(position===void 0)return{kind:"other"};return{kind:"face-down",owner:targetPlayerId===decidingPlayerId?"self":"opponent",zone:"hand",position,of:instanceIds.length}}if(pendingChoice?.kind==="mechanic-choice"&&pendingChoice.choice.kind==="order-to-bottom"){const{instanceIds}=pendingChoice.choice;const order=parseOrderOption(optionId,instanceIds.length);if(order){const cards2=order.flatMap(index=>{const located2=locate(state,instanceIds[index]);return located2?[cardRef(located2.card,db)]:[]});if(cards2.length===order.length){const{to,alternate}=pendingChoice.choice;const destination=to.zone==="deck"&&to.position==="bottom"&&!alternate?void 0:describeMoveDestination(to);return{kind:"order",cards:cards2,...destination===void 0?{}:{destination},...alternate?{alternate:describeMoveDestination(alternate)}:{}}}}}const pending=state.pendingEffect;if(pending?.kind==="return-don"&&optionId.startsWith("return-don:")){const pool=optionId.slice("return-don:".length);const origins=pending.origins.filter(origin=>origin===pool).length;const available=donPoolSize(state,pending.playerId,pool,pending.onFieldAtPayment)+origins;if(pool==="active"||pool==="rested"){return{kind:"don-return",pool,available,remaining:pending.origins.length}}const attached=locate(state,pool);if(attached){return{kind:"don-return",pool:"attached",card:cardRef(attached.card,db),available,remaining:pending.origins.length}}}if(pendingChoice?.kind==="mechanic-choice"&&pendingChoice.choice.kind==="return-don-choice"&&optionId.startsWith("return:")){const count2=Number(optionId.slice("return:".length));if(Number.isInteger(count2))return{kind:"don-return-count",count:count2}}if(activeDonOwner(state,optionId)){return{kind:"resource",resource:"don"}}const direct=locate(state,optionId);if(direct)return describeCard(state,decidingPlayerId,direct,{},db);const segments=optionId.split(":");if(segments.length<2)return{kind:"other"};const[prefix,...rest]=segments;if(prefix==="cost"){const cost=Number(rest[0]);return Number.isInteger(cost)?{kind:"cost",cost}:{kind:"other"}}if(rest[0]==="skip"||rest[0]==="none")return{kind:"skip"};const located=locate(state,rest[0]);if(!located)return{kind:"other"};const tail=rest[1];const amount=tail===void 0?Number.NaN:Number(tail);return describeCard(state,decidingPlayerId,located,{...tail!==void 0&&Number.isNaN(amount)?{via:tail}:{},...Number.isInteger(amount)?{amount}:{}},db)}function grantedByChoice(pendingEffect){if(pendingEffect.kind!=="mechanic-choice")return void 0;const choice=pendingEffect.choice;if(choice.kind!=="cards")return void 0;const effect=choice.effect;if(effect.kind!=="grant-keyword")return void 0;return{keyword:effect.keyword,expiresThisTurn:effect.expiresAfterTurns===0}}function powerChangedByChoice(pendingEffect){if(pendingEffect.kind!=="mechanic-choice")return void 0;const choice=pendingEffect.choice;if(choice.kind!=="cards")return void 0;const effect=choice.effect;if(effect.kind!=="modify-power"||effect.binding!==choice.bind){return void 0}return{amount:effect.amount,expiresThisTurn:effect.expiresAfterTurns===0}}function donGivenByChoice(pendingEffect){const choice=pendingEffect.kind==="mechanic-choice"?pendingEffect.choice:void 0;if(choice?.kind!=="give-rested-don")return void 0;return{count:choice.count,from:choice.from??"rested"}}function destinationOfChoice(pendingEffect,decidingPlayerId){const side2=(controller,reference)=>{if(reference==="owner")return"owner";const resolved=reference==="self"?controller:opponentOf4(controller);return resolved===decidingPlayerId?"self":"opponent"};if(pendingEffect.kind==="search-top-five"||pendingEffect.kind==="navy-search"){return{zone:"hand",player:side2(pendingEffect.playerId,"self")}}if(pendingEffect.kind!=="mechanic-choice")return void 0;const choice=pendingEffect.choice;if(choice.kind!=="cards")return void 0;const effect=costPaidByChoice(choice)??choice.effect;if(effect.kind!=="move"||effect.binding!==choice.bind)return void 0;return{zone:effect.to.zone,player:side2(choice.execution.context.sourcePlayerId,effect.to.player)}}function costPaidByChoice(choice){const{effect,bind}=choice;if(effect.kind!=="sequence")return void 0;const[first,...rest]=effect.effects;if(!first||first.kind!=="move"||first.binding!==bind)return void 0;if(rest.some(step2=>payoffNamesBinding(step2,bind)))return void 0;return first}function payoffNamesBinding(node,bind){if(typeof node==="string")return node===bind;if(Array.isArray(node)){return node.some(entry=>payoffNamesBinding(entry,bind))}if(node&&typeof node==="object"){return Object.entries(node).some(([key,value])=>key!=="perCard"&&key!=="perCards"&&payoffNamesBinding(value,bind))}return false}function costOfChoice(pendingEffect){if(pendingEffect.kind!=="mechanic-choice")return void 0;const choice=pendingEffect.choice;if(choice.kind!=="optional")return void 0;return costOfEffect(choice.effect)}function payoffOfChoice(pendingEffect){if(pendingEffect.kind!=="mechanic-choice")return void 0;const choice=pendingEffect.choice;if(choice.kind!=="optional")return void 0;return payoffOfEffect(choice.effect)}function donAddedByChoice(pendingEffect){if(pendingEffect.kind!=="mechanic-choice")return void 0;const choice=pendingEffect.choice;if(choice.kind!=="optional")return void 0;return donAddedByOptionalPayoff(choice.effect)}function effectKindOf(pendingEffect){if(pendingEffect.kind==="mechanic-choice"&&pendingEffect.choice.kind==="area-replacement"){return"area-replacement"}return pendingEffect.kind}function pendingEffectActions(state,playerId,db=cards){const pendingEffect=state.pendingEffect;if(!pendingEffect)return[];const grants=grantedByChoice(pendingEffect);const donGift=donGivenByChoice(pendingEffect);const destination=destinationOfChoice(pendingEffect,playerId);const cost=costOfChoice(pendingEffect);const payoff=payoffOfChoice(pendingEffect);const ramps=donAddedByChoice(pendingEffect);const modifiesPower=powerChangedByChoice(pendingEffect);return getEffectOptions(state,db).map(({optionId,summary,...optionMetadata})=>{const option=describeEffectOption(state,playerId,optionId,db);return{actionId:`r${state.revision}:effect:${optionId}`,type:"resolve-effect",optionId,...optionMetadata,effectKind:effectKindOf(pendingEffect),sourceCardNumber:pendingEffect.sourceCardNumber,option,...grants?{grants}:{},...donGift?{donGift:option.kind==="card"&&option.amount!==void 0?{...donGift,count:option.amount}:donGift}:{},...destination&&option.kind==="card"?{destination}:{},...modifiesPower&&option.kind==="card"?{modifiesPower}:{},...cost&&option.kind==="confirm"?{cost}:{},...payoff&&option.kind==="confirm"?{payoff}:{},...ramps&&option.kind==="confirm"?{ramps}:{},summary}})}var POWER_FOR_THE_TURN_TRIGGERS=new Set(["OP04-016","OP13-021"]);var SELF_POWER_FOR_THE_TURN_TRIGGERS=new Set(["OP12-039"]);function ownerOf(state,instanceId){if(instanceId===leaderInstanceId2("p1"))return"p1";if(instanceId===leaderInstanceId2("p2"))return"p2";return state.players.p1.board.some(card=>card.instanceId===instanceId)?"p1":"p2"}function triggerTargetSummary(state,resolvingPlayerId,cardNumber,target){const owner=ownerOf(state,target);const side2=owner===resolvingPlayerId?"your":"the opponent's";const label=actionCardLabel(state,owner,target,true);const timing=POWER_FOR_THE_TURN_TRIGGERS.has(cardNumber)?couldAttackThisTurn(state,owner,target)?"; it can still attack this turn":"; it cannot attack this turn":"";return`Activate Trigger targeting ${side2} ${label}${timing}`}function triggerSelectsNothing(state,playerId,card){const program=getTriggerMechanicProgram(card.cardNumber);if(!program)return false;return programSelectsNothing(state,{sourcePlayerId:playerId,source:card},program)}function donAddedByTrigger(cardNumber){const program=getTriggerMechanicProgram(cardNumber);if(!program)return void 0;const effect=program.effect.kind==="optional"?program.effect.effect:program.effect;return donAddedByOptionalPayoff(effect)}function triggerActions(state){const trigger=state.pendingTrigger;if(!trigger)return[];const attacker=state.activeAttack?.attackerPlayerId;const opposingTargets=attacker?[leaderInstanceId2(attacker),...state.players[attacker].board.map(card=>card.instanceId)]:[];const triggerTargets=trigger.card.cardNumber==="OP13-021"?opposingTargets.filter(target=>!target.endsWith("-leader")):trigger.card.cardNumber==="OP04-016"?opposingTargets:trigger.card.cardNumber==="OP12-039"?[leaderInstanceId2(trigger.playerId),...state.players[trigger.playerId].board.map(card=>card.instanceId)]:trigger.card.cardNumber==="EB04-028"?[...state.players.p1.board,...state.players.p2.board].filter(card=>effectiveBoardCost(state,card)<=5).map(card=>card.instanceId):trigger.card.cardNumber==="OP02-068"?[...state.players.p1.board,...state.players.p2.board].filter(card=>effectiveBoardCost(state,card)<=2).map(card=>card.instanceId):trigger.card.cardNumber==="OP11-061"?[...state.players.p1.board,...state.players.p2.board].filter(card=>effectiveBoardCost(state,card)<=1).map(card=>card.instanceId):trigger.card.cardNumber==="OP06-058"?[...state.players.p1.board,...state.players.p2.board].filter(card=>effectiveBoardCost(state,card)<=5).map(card=>card.instanceId):[];const player=state.players[trigger.playerId];const attackerLife=attacker?state.players[attacker].life.length:99;const st36Targets=trigger.card.cardNumber==="OP12-113"?state.players[opponentOf2(trigger.playerId)].board.filter(card=>effectiveBoardCost(state,card)<=1).map(card=>card.instanceId):[];const canActivateWithoutTarget=trigger.card.cardNumber==="OP10-109"||trigger.card.cardNumber==="OP13-116"||trigger.card.cardNumber==="OP12-057"&&player.hand.length>0||trigger.card.cardNumber==="OP11-079"||trigger.card.cardNumber==="OP11-081"||triggerProgramCanAct(state,trigger.playerId,trigger.card)||trigger.card.cardNumber==="ST36-002"&&attackerLife<=3||trigger.card.cardNumber==="P-088"&&hasCardType(player.leaderCardNumber,"Supernovas")&&player.life.length+attackerLife<=5;const sourceCardNumber=trigger.card.cardNumber;const selectsNothing=canActivateWithoutTarget&&triggerSelectsNothing(state,trigger.playerId,trigger.card);const triggerProgram=getTriggerMechanicProgram(sourceCardNumber);const selfPowerForTheTurn=SELF_POWER_FOR_THE_TURN_TRIGGERS.has(sourceCardNumber)||triggerProgram!==void 0&&programBuffsOwnPowerForTheTurn(triggerProgram);const ramps=donAddedByTrigger(sourceCardNumber);return[...[...triggerTargets,...st36Targets].map(target=>({actionId:`r${state.revision}:trigger:${target}`,type:"resolve-trigger",optionId:target,sourceCardNumber,targetInstanceId:target,...selfPowerForTheTurn?{selfPowerForTheTurn:true}:{},summary:triggerTargetSummary(state,trigger.playerId,sourceCardNumber,target)})),...trigger.card.cardNumber==="OP12-113"?[{actionId:`r${state.revision}:trigger:activate`,type:"resolve-trigger",optionId:"activate",sourceCardNumber,summary:"Activate Trigger without K.O.ing a Character"}]:[],...canActivateWithoutTarget?[{actionId:`r${state.revision}:trigger:activate`,type:"resolve-trigger",optionId:"activate",sourceCardNumber,...selectsNothing?{selectsNothing:true}:{},...selfPowerForTheTurn?{selfPowerForTheTurn:true}:{},...ramps?{ramps}:{},summary:"Activate Trigger"}]:[],{actionId:`r${state.revision}:trigger:skip`,type:"resolve-trigger",optionId:"skip",sourceCardNumber,summary:"Add Life card to hand"}]}var MAX_ARRAY_INDEX=4294967294;function isArrayIndexKey(key){if(key.length===0||key.length>10)return false;if(key==="0")return true;if(key.charCodeAt(0)===48)return false;for(let index=0;index<key.length;index+=1){const code=key.charCodeAt(index);if(code<48||code>57)return false}return Number(key)<=MAX_ARRAY_INDEX}var keyOrders=new Map;function orderedKeys(record){const enumerated=Object.keys(record);const signature=enumerated.join("\0");const cached2=keyOrders.get(signature);if(cached2)return cached2;const keys=[...enumerated].sort((left,right)=>left.localeCompare(right));const indexKeys=[];const namedKeys=[];for(const key of keys){(isArrayIndexKey(key)?indexKeys:namedKeys).push(key)}indexKeys.sort((left,right)=>Number(left)-Number(right));const ordered=[...indexKeys,...namedKeys].map(key=>({key,prefix:JSON.stringify(key)+":"}));keyOrders.set(signature,ordered);return ordered}function serialize(value){switch(typeof value){case"string":return JSON.stringify(value);case"number":return Number.isFinite(value)?String(value):"null";case"boolean":return value?"true":"false";case"object":break;default:return JSON.stringify(value)}if(value===null)return"null";if(Array.isArray(value)){let text2="[";for(let index=0;index<value.length;index+=1){if(index>0)text2+=",";text2+=serialize(value[index])??"null"}return text2+"]"}let text="{";let first=true;const record=value;for(const{key,prefix}of orderedKeys(record)){const childText=serialize(record[key]);if(childText===void 0)continue;if(!first)text+=",";first=false;text+=prefix+childText}return text+"}"}function canonicalJson(value){return serialize(value)}function hashState(value){return sha256Hex(canonicalJson(value))}var RULES_VERSION="st31-st32-st33-st34-st35-st36-1.16";var cached;function rulesStamp(){if(cached)return cached;const cards2=[...cardRegistry.values()].map(card=>({cardNumber:card.cardNumber,category:card.category,cost:card.cost,power:card.power,counter:card.counter,colors:card.colors,types:card.types,attribute:card.attribute,rules:card.rules,officialTextHash:card.officialTextHash??null})).sort((left,right)=>left.cardNumber.localeCompare(right.cardNumber));const programs=[...mechanicProgramsByClause()].map(([clause,claimed])=>[clause,[...claimed].sort()]).sort((left,right)=>left[0].localeCompare(right[0]));const statics=STATIC_ABILITIES.map(ability=>ability.cardNumber).sort();cached={rulesVersion:RULES_VERSION,cardDataHash:sha256Hex(canonicalJson(cards2)),programHash:sha256Hex(canonicalJson({programs,statics}))};return cached}function describeStampMismatch(recorded,current=rulesStamp()){if(!recorded)return null;if(recorded.rulesVersion!==current.rulesVersion){return`This recording was made under rules ${recorded.rulesVersion}; this build implements ${current.rulesVersion}.`}if(recorded.cardDataHash!==current.cardDataHash){return"This recording was made under different card data (text or stats changed since), so its actions may no longer be legal."}if(recorded.programHash!==current.programHash){return"This recording was made before a card-implementation change, so its actions may no longer be legal."}return null}var GameInvariantError=class extends Error{constructor(message){super(`GAME_INVARIANT: ${message}`)}};function fail(message){throw new GameInvariantError(message)}function pendingCards(state,playerId){const cards2=[];for(const pending of pendingEffectChain(state.pendingEffect)){if((pending.kind==="search-top-five"||pending.kind==="navy-search")&&pending.playerId===playerId){cards2.push(...pending.revealed)}if(pending.kind==="character-area-replacement"&&pending.playerId===playerId){cards2.push(pending.card)}}if(state.pendingTrigger?.playerId===playerId){cards2.push(state.pendingTrigger.card)}return cards2}function ownedCards(state,playerId){const player=state.players[playerId];const heldPendingCards=pendingCards(state,playerId);return[...player.deck,...player.hand,...player.life,...player.board,...player.stage?[player.stage]:[],...player.trash,...heldPendingCards]}function ownedDon(player){return[...player.donDeck,...player.activeDon,...player.restedDon,...player.leaderAttachedDon,...player.board.flatMap(card=>card.attachedDon??[])]}function assertUnique(values,label){if(new Set(values).size!==values.length)fail(`${label} contains duplicates`)}function assertSameIdentities(before,after,label){const left=[...before].sort();const right=[...after].sort();if(left.length!==right.length||left.some((value,index)=>value!==right[index])){fail(`${label} identities changed`)}}function assertGameStateInvariants(state,options={},db=cards){if(!Number.isInteger(state.turn)||state.turn<1)fail("turn must be positive");if(!Number.isInteger(state.revision)||state.revision<0){fail("revision must be non-negative")}if(state.eventSequence!==state.events.length){fail("event sequence must equal the public event count")}if(state.phase==="finished"&&!state.winner){fail("finished games must have a winner")}if(state.phase!=="finished"&&state.winner){fail("unfinished games cannot have a winner")}const allCardIds=[];for(const playerId of["p1","p2"]){const player=state.players[playerId];if(player.board.length>5)fail(`${playerId} board exceeds five cards`);const cardIds=ownedCards(state,playerId).map(card=>card.instanceId);const donIds=ownedDon(player);if(options.uniqueIdentities??true){assertUnique(cardIds,`${playerId} cards`);assertUnique(donIds,`${playerId} DON!!`)}const donTotal=db.facts(player.leaderCardNumber).donDeckSize;if((options.exactDonCount??true)&&donIds.length!==donTotal){fail(`${playerId} must own exactly ${donTotal} DON!!`)}allCardIds.push(...cardIds,`${playerId}-leader`);const modifiers=[...player.leaderPowerModifiers,...player.board.flatMap(card=>card.powerModifiers??[])];if(modifiers.some(modifier=>modifier.expiresAtTurn<state.turn)){fail(`${playerId} has an expired power modifier`)}if(player.board.flatMap(card=>card.costModifiers??[]).some(modifier=>modifier.expiresAtTurn<state.turn)){fail(`${playerId} has an expired cost modifier`)}}if(options.uniqueIdentities??true)assertUnique(allCardIds,"game cards")}function assertTransitionInvariants(previous,next){assertGameStateInvariants(next,{exactDonCount:false,uniqueIdentities:false});for(const playerId of["p1","p2"]){assertSameIdentities(ownedCards(previous,playerId).map(card=>card.instanceId),ownedCards(next,playerId).map(card=>card.instanceId),`${playerId} card`);assertSameIdentities(ownedDon(previous.players[playerId]),ownedDon(next.players[playerId]),`${playerId} DON!!`)}}function notifyCallbacks(callbacks,event,clone=structuredClone){const errors=[];for(const callback of callbacks){try{callback.handle(callback.readOnly?event:clone(event))}catch(error){errors.push(error)}}return errors}function cloneTransitionEvent(event){return{previousState:cloneStateSharingLog(event.previousState),action:cloneGameData(event.action),legalAction:cloneGameData(event.legalAction),result:{state:cloneStateSharingLog(event.result.state),events:cloneGameData(event.result.events)}}}function cloneStateSharingLog(state){const{events,...position}=state;return{...cloneGameData(position),events:[...events]}}function makePlayer(deck,playerId,seed,seedSlot,db){const instances=deck.cards.map((cardNumber,index)=>({instanceId:`${playerId}-card-${index+1}`,cardNumber}));const openingStage=openingStageOf(deck.leader,instances,db);const shuffled=shuffle(instances.filter(card=>card!==openingStage),seedRng(`${seed}:${seedSlot}`));return{player:{leaderCardNumber:deck.leader,deck:shuffled.items.slice(5),hand:shuffled.items.slice(0,5),life:[],board:[],stage:openingStage?{...openingStage,rested:false}:null,trash:[],donDeck:Array.from({length:Math.max(0,db.facts(deck.leader).donDeckSize-1)},(_,index)=>`${playerId}-don-${index+2}`),activeDon:[`${playerId}-don-1`],restedDon:[],leaderAttachedDon:[],leaderPowerModifiers:[],leaderRested:false,activateDonAtEndOfTurn:0,mulliganDecision:"pending"},rngValue:shuffled.state.value}}function openingStageOf(leader,instances,db){const type=db.facts(leader).rules.openingStageType;if(!type)return void 0;let best;for(const card of instances){const facts=db.facts(card.cardNumber);if(facts.category!=="stage"||!facts.types.includes(type))continue;if(!best||facts.cost>db.facts(best.cardNumber).cost)best=card}return best}function seedKeyOf(deck){return deck.seedKey??`${deck.leader}:${deck.cards.join(",")}`}function createGame(input){const db=input.cards??cards;const timeLimit=initialTimeLimit(input.timeLimit);const swapSeedSlots=input.seedMode==="matchup"&&seedKeyOf(input.p1)>seedKeyOf(input.p2);const p1SeedSlot=swapSeedSlots?"p2":"p1";const p2SeedSlot=swapSeedSlots?"p1":"p2";const p1=makePlayer(input.p1,"p1",input.seed,p1SeedSlot,db);const p2=makePlayer(input.p2,"p2",input.seed,p2SeedSlot,db);const randomStartingSlot=nextInt(seedRng(`${input.seed}:starting-player`),2).value===0?"p1":"p2";const startingPlayer=input.startingPlayer==="random"?input.seedMode==="matchup"?p1SeedSlot===randomStartingSlot?"p1":"p2":randomStartingSlot:input.startingPlayer??"p1";const seats={p1:p1.player,p2:p2.player};const secondPlayer=startingPlayer==="p1"?"p2":"p1";const events=[{type:"game-created",activePlayer:startingPlayer},...openingStageEvents(seats[startingPlayer],startingPlayer),...openingStageEvents(seats[secondPlayer],secondPlayer)];const state={protocolVersion:PROTOCOL_VERSION,rulesVersion:RULES_VERSION,gameId:input.gameId,revision:0,seed:input.seed,rngState:{value:p1.rngValue^p2.rngValue},turn:1,activePlayer:startingPlayer,turnPlayerId:startingPlayer,phase:"mulligan",players:{p1:p1.player,p2:p2.player},winner:null,resultReason:null,...timeLimit?{timeLimit}:{},pendingEffect:null,pendingEffectResume:null,donReturn:null,activeAttack:null,pendingTrigger:null,oncePerTurn:[],eventSequence:0,events};callTimeIfDue(state,events);state.eventSequence=events.length;return state}function openingStageEvents(player,playerId){if(!player.stage)return[];return[{type:"card-played",playerId,cardInstanceId:player.stage.instanceId,cardNumber:player.stage.cardNumber}]}function getLegalActions(state,playerId,db=cards){if(state.phase==="finished"||playerId!==state.activePlayer)return[];if(state.phase==="mulligan")return mulliganActions(state);if(state.pendingEffect)return pendingEffectActions(state,playerId,db);if(state.phase==="block")return blockActions(state,playerId,db);if(state.phase==="counter")return counterActions(state,playerId,db);if(state.phase==="trigger")return triggerActions(state);return mainActions(state,playerId,db)}function applyAction(current,action,db=cards){assertActionable(current,action);const offered=findOfferedAction(getLegalActions(current,current.activePlayer,db),action.actionId);return applyOfferedAction(current,action,offered,db)}function assertActionable(current,action){if(current.phase==="finished")throw new EngineError("GAME_FINISHED","The game has already ended.");if(action.revision!==current.revision)throw new EngineError("STALE_ACTION","The action was generated for an older revision.")}function applyOfferedAction(current,action,offered,db=cards){assertActionable(current,action);if(!offered||offered.type!==action.type)throw new EngineError("ILLEGAL_ACTION","The action is not currently legal.");const{events:history,...position}=current;const state={...cloneGameData(position),events:history};const events=[];const activePlayer=state.activePlayer;const handler=ACTION_HANDLERS[action.type];const triggeredEvent=action.type==="resolve-trigger"?state.pendingTrigger?.card.cardNumber:void 0;handler({state,events,activePlayer,action,offered,db});for(const playerId of["p1","p2"]){const player=state.players[playerId];if(player.deck.length===0&&survivesEmptyDeck(state,playerId,db)){player.deckEmptiedOnTurn=state.turn}}const activations=[];for(const event of events){if(event.type!=="event-activated")continue;if(event.mainOnly===true)continue;if(event.cardNumber===triggeredEvent)continue;recordEventActivation(state,event.playerId,db.require(event.cardNumber).cost??0);activations.push({playerId:event.playerId})}const activationSignals=activations.map(activation=>({kind:"event-activated",playerId:activation.playerId}));if(activations.length>0&&state.pendingEffect){queuePendingContinuations(state,getMechanicSignalInvocations(state,activationSignals))}else if(activations.length>0){const reacted=applyMechanicReactions(state,activationSignals,db);events.push(...reacted.events);if(reacted.pending){state.pendingEffect=mechanicPendingEffect({context:reacted.pending.execution.context,program:{effect:{kind:"sequence",effects:[]}}},reacted.pending,[]);handOverPendingEffect(state)}}settleDoubleAttackDamage(state,events);settleEffectDamage(state,events);endBattleIfTargetLeftField(state);clearBattleScopedPower(state);releaseDamageReactions(state);const pendingBeforeDrain=state.pendingEffect;events.push(...drainPendingContinuations(state,db));if(state.pendingEffect&&state.pendingEffect!==pendingBeforeDrain){handOverPendingEffect(state)}offerDonReturnChoice(state);resumeStartOfTurn(state,events);noteLifeDrawn(state,events);state.revision+=1;state.eventSequence+=events.length;state.events=[...history,...events];assertTransitionInvariants(current,state);return{state,events}}function grantedKeywords(state,card){const grants=[["Rush",card.rushUntilTurn],["Rush: Character",card.rushCharacterUntilTurn],["Blocker",card.blockerUntilTurn],["Unblockable",card.unblockableUntilTurn],["Double Attack",card.doubleAttackUntilTurn],["Banish",card.banishUntilTurn]];return grants.filter(([,until])=>(until??-1)>=state.turn).map(([keyword,until])=>({keyword,expiresAtTurn:until}))}var ALL_KEYWORDS=Object.keys({Blocker:null,Rush:null,"Rush: Character":null,Unblockable:null,"Double Attack":null,Banish:null});function effectiveKeywords(state,playerId,instanceId,db){return ALL_KEYWORDS.filter(keyword=>hasKeyword(state,playerId,instanceId,keyword,db))}function visibleBoard(state,playerId,includeAttachedDon,db,reportDormant){return state.players[playerId].board.map(instance=>{const definition=db.require(instance.cardNumber);const summoningSick=(instance.playedTurn??0)>=state.turn&&!hasRush(state,playerId,instance,db)&&!hasRushCharacter(state,playerId,instance,db);const grants=grantedKeywords(state,instance);const storedBase=storedBasePower(instance.basePowerOverrides,state.turn);const basePower=storedBase??definition.power??0;return{instanceId:instance.instanceId,cardNumber:instance.cardNumber,name:definition.name,cost:definition.cost??0,currentCost:effectiveCost(state,playerId,instance,db),power:definition.power??0,rested:instance.rested,blocker:canBlock(state,playerId,instance,db),couldAttack:couldAttackThisTurn(state,playerId,instance.instanceId,db),playedTurn:instance.playedTurn??0,...summoningSick?{summoningSick:true}:{},...instance.cannotAttackUntilTurn===void 0?{}:{cannotAttackUntilTurn:instance.cannotAttackUntilTurn},...instance.cannotAttackSourceCardNumber===void 0?{}:{cannotAttackSourceCardNumber:instance.cannotAttackSourceCardNumber},...instance.cannotRestUntilTurn===void 0?{}:{cannotRestUntilTurn:instance.cannotRestUntilTurn},...instance.cannotRestSourceCardNumber===void 0?{}:{cannotRestSourceCardNumber:instance.cannotRestSourceCardNumber},...instance.cannotRefreshUntilTurn===void 0?{}:{cannotRefreshUntilTurn:instance.cannotRefreshUntilTurn},...effectsNegated(state,instance.instanceId)?{negated:true}:{},...grants.length?{grantedKeywords:grants}:{},...(instance.attacksActiveUntilTurn??-1)>=state.turn?{attacksActiveUntilTurn:instance.attacksActiveUntilTurn}:{},effectiveKeywords:effectiveKeywords(state,playerId,instance.instanceId,db),...conditionalSelfKeywords(instance.cardNumber).length?{conditionalKeywords:conditionalSelfKeywords(instance.cardNumber)}:{},...reportDormant?(()=>{const dormant=dormantActivation(state,playerId,instance,db);return dormant?{dormantAbility:dormant}:{}})():{},attachedDon:instance.attachedDon?.length??0,currentPower:currentPower(state,playerId,instance.instanceId,includeAttachedDon,db),...basePower===(definition.power??0)?{}:{basePower},powerModifiers:(instance.powerModifiers??[]).filter(modifier=>modifier.expiresAtTurn>=state.turn).map(modifier=>({...modifier})),staticPowerModifiers:staticPowerContributions(state,playerId,instance,false,basePower,db,storedBase!==void 0).map(({cardNumber,amount})=>({sourceCardNumber:cardNumber,amount}))}})}function visibleStage(state,playerId,stage,db,reportDormant){if(!stage)return null;const definition=db.require(stage.cardNumber);const dormant=reportDormant?dormantActivation(state,playerId,stage,db):void 0;return{instanceId:stage.instanceId,cardNumber:stage.cardNumber,name:definition.name,cost:definition.cost??0,rested:stage.rested,...dormant?{dormantAbility:dormant}:{}}}function installedReplacementsView(state,player){const live=(player.installedReplacements??[]).filter(entry=>entry.expiresAtTurn>=state.turn).map(entry=>entry.cardNumber);return live.length>0?{installedReplacements:live}:{}}function visibleLeader(state,playerId,includeAttachedDon,db,reportDormant){const player=state.players[playerId];const definition=db.require(player.leaderCardNumber);const storedBase=storedBasePower(player.leaderBasePowers,state.turn);const printed=storedBase??definition.power??0;const leaderGrants=[["Unblockable",player.leaderUnblockableUntilTurn],["Double Attack",player.leaderDoubleAttackUntilTurn],["Blocker",player.leaderBlockerUntilTurn]].filter(([,until])=>(until??-1)>=state.turn).map(([keyword,until])=>({keyword,expiresAtTurn:until}));return{cardNumber:player.leaderCardNumber,name:definition.name,power:definition.power??0,rested:player.leaderRested,couldAttack:couldAttackThisTurn(state,playerId,leaderInstanceId2(playerId),db),...(player.leaderCannotRefreshUntilTurn??-1)>=state.turn?{cannotRefreshUntilTurn:player.leaderCannotRefreshUntilTurn}:{},attachedDon:player.leaderAttachedDon.length,currentPower:currentPower(state,playerId,leaderInstanceId2(playerId),includeAttachedDon,db),...printed===(definition.power??0)?{}:{basePower:printed},leaderReactionSpent:leaderReactionSpent(state,playerId),powerModifiers:structuredClone(player.leaderPowerModifiers.filter(modifier=>modifier.expiresAtTurn>=state.turn)),staticPowerModifiers:staticPowerContributions(state,playerId,{instanceId:leaderInstanceId2(playerId),cardNumber:player.leaderCardNumber},true,printed,db,storedBase!==void 0).map(({cardNumber,amount})=>({sourceCardNumber:cardNumber,amount})),...leaderGrants.length?{grantedKeywords:leaderGrants}:{},...(player.leaderAttacksActiveUntilTurn??-1)>=state.turn?{attacksActiveUntilTurn:player.leaderAttacksActiveUntilTurn}:{},effectiveKeywords:effectiveKeywords(state,playerId,leaderInstanceId2(playerId),db),...conditionalSelfKeywords(player.leaderCardNumber).length?{conditionalKeywords:conditionalSelfKeywords(player.leaderCardNumber)}:{},...reportDormant?(()=>{const dormant=dormantActivation(state,playerId,{instanceId:leaderInstanceId2(playerId),cardNumber:player.leaderCardNumber},db);return dormant?{dormantAbility:dormant}:{}})():{}}}function visibleCardNumbers(state,viewer,actions){const numbers=new Set;for(const playerId of["p1","p2"]){const player=state.players[playerId];numbers.add(player.leaderCardNumber);for(const card of player.board)numbers.add(card.cardNumber);for(const card of player.trash)numbers.add(card.cardNumber);if(player.stage)numbers.add(player.stage.cardNumber);for(const card of player.life)if(card.faceUp)numbers.add(card.cardNumber);if(playerId===viewer)for(const card of player.hand)numbers.add(card.cardNumber)}const knowledge=[state.players[viewer].knownOwnDeckTop,state.players[viewer].knownOpponentDeckTop];for(const known of knowledge)if(known)numbers.add(known.cardNumber);if(state.pendingTrigger&&(state.pendingTrigger.playerId===viewer||state.pendingTrigger.card.faceUp===true)){numbers.add(state.pendingTrigger.card.cardNumber)}for(const action of actions){if(action.type==="resolve-effect"){numbers.add(action.sourceCardNumber);if(action.optionCardNumber)numbers.add(action.optionCardNumber);if(action.option.kind==="card"){numbers.add(action.option.card.cardNumber);if(action.option.via)numbers.add(action.option.via.cardNumber)}}}return numbers}function observe(state,viewer,db=cards,legalActions=getLegalActions(state,viewer,db)){const self=state.players[viewer];const opponent=state.players[opponentOf2(viewer)];const turnPlayer2=state.turnPlayerId;let stateHash;const visibleLife=player=>player.life.map(instance=>instance.faceUp?{instanceId:instance.instanceId,faceUp:true,cardNumber:instance.cardNumber,name:db.require(instance.cardNumber).name}:{faceUp:false});return{gameId:state.gameId,revision:state.revision,viewer,turn:state.turn,activePlayer:state.activePlayer,turnPlayer:turnPlayer2,phase:state.phase,winner:state.winner,resultReason:state.resultReason,...state.timeLimit?{timeLimit:observeTimeLimit(state,state.timeLimit)}:{},self:{hand:self.hand.map(instance=>{const card=db.require(instance.cardNumber);const printedCost=card.cost??0;return{instanceId:instance.instanceId,cardNumber:instance.cardNumber,name:card.name,cost:printedCost,currentCost:playCostFromHand(state,viewer,instance.cardNumber,printedCost,{spend:false},db),counter:card.counter??0,currentCounter:(card.counter??0)+handCounterPower(state,viewer,instance.cardNumber,db)}}),onPlayNegated:onPlayEffectsNegated(state,viewer,db),deckCount:self.deck.length,lifeCount:self.life.length,life:visibleLife(self),activeDon:self.activeDon.length,restedDon:self.restedDon.length,donDeckCount:self.donDeck.length,...self.donHeldFromRefresh?{donHeldFromRefresh:self.donHeldFromRefresh}:{},...self.donRestedAtNextMain?{donRestedAtNextMain:self.donRestedAtNextMain}:{},...self.extraTurns?{extraTurns:self.extraTurns}:{},...installedReplacementsView(state,self),trash:self.trash.map(instance=>({cardNumber:instance.cardNumber,name:db.require(instance.cardNumber).name})),leader:visibleLeader(state,viewer,viewer===turnPlayer2,db,true),board:visibleBoard(state,viewer,viewer===turnPlayer2,db,true),stage:visibleStage(state,viewer,self.stage,db,true),knowledge:{ownDeckTop:resolveDeckTopKnowledge(state,viewer,self.knownOwnDeckTop),opponentDeckTop:resolveDeckTopKnowledge(state,opponentOf2(viewer),self.knownOpponentDeckTop)}},opponent:{handCount:opponent.hand.length,onPlayNegated:onPlayEffectsNegated(state,opponentOf2(viewer),db),deckCount:opponent.deck.length,lifeCount:opponent.life.length,life:visibleLife(opponent),activeDon:opponent.activeDon.length,restedDon:opponent.restedDon.length,donDeckCount:opponent.donDeck.length,...opponent.donHeldFromRefresh?{donHeldFromRefresh:opponent.donHeldFromRefresh}:{},...opponent.donRestedAtNextMain?{donRestedAtNextMain:opponent.donRestedAtNextMain}:{},...opponent.extraTurns?{extraTurns:opponent.extraTurns}:{},...installedReplacementsView(state,opponent),trash:opponent.trash.map(instance=>({cardNumber:instance.cardNumber,name:db.require(instance.cardNumber).name})),leader:visibleLeader(state,opponentOf2(viewer),opponentOf2(viewer)===turnPlayer2,db,false),board:visibleBoard(state,opponentOf2(viewer),opponentOf2(viewer)===turnPlayer2,db,false),stage:visibleStage(state,opponentOf2(viewer),opponent.stage,db,false)},activeBattle:state.activeAttack?(()=>{const attack=state.activeAttack;const targetIsLeader=attack.targetInstanceId===leaderInstanceId2(attack.defenderPlayerId);const targetStillOnField=targetIsLeader||state.players[attack.defenderPlayerId].board.some(card=>card.instanceId===attack.targetInstanceId);const targetPower=targetStillOnField?currentPower(state,attack.defenderPlayerId,attack.targetInstanceId,false,db):0;const offense=battleAttackPower(state,db);return{attackerInstanceId:attack.attackerInstanceId,targetInstanceId:attack.targetInstanceId,attackPower:offense,targetPower,counterPower:attack.counterPower,counterShortfall:counterShortfall(offense,targetPower+attack.counterPower),lifeCost:targetIsLeader?Math.min(hasKeyword(state,attack.attackerPlayerId,attack.attackerInstanceId,"Double Attack",db)?2:1,state.players[attack.defenderPlayerId].life.length):0}})():null,pendingTriggerCardNumber:state.pendingTrigger&&(state.pendingTrigger.playerId===viewer||state.pendingTrigger.card.faceUp===true)?state.pendingTrigger.card.cardNumber:null,cardFacts:Object.fromEntries([...visibleCardNumbers(state,viewer,legalActions)].sort().map(cardNumber=>[cardNumber,db.facts(cardNumber)])),legalActions,publicEvents:state.events.filter(event=>event.type!=="card-revealed"||event.visibleTo===void 0||event.visibleTo===viewer).map(event=>event.type==="card-moved"&&event.identityVisibleTo!==void 0&&event.identityVisibleTo!==viewer?{...event,cardInstanceId:null,cardNumber:null}:event),get stateHash(){return stateHash??=hashState(hashedPosition(state))}}}function hashedPosition(state){const position={...state};delete position.events;return position}function toGameAction(legal,revision){const{actionId}=legal;switch(legal.type){case"mulligan-decision":return{type:"mulligan-decision",actionId,revision,decision:legal.decision};case"play-card":return{type:"play-card",actionId,revision,cardInstanceId:legal.cardInstanceId};case"resolve-effect":return{type:"resolve-effect",actionId,revision,optionId:legal.optionId};case"attach-don":return{type:"attach-don",actionId,revision,targetInstanceId:legal.targetInstanceId};case"activate-main":return{type:"activate-main",actionId,revision,optionId:legal.optionId};case"attack":return{type:"attack",actionId,revision,attackerInstanceId:legal.attackerInstanceId,targetInstanceId:legal.targetInstanceId};case"block":return{type:"block",actionId,revision,blockerInstanceId:legal.blockerInstanceId};case"counter":return{type:"counter",actionId,revision,cardInstanceId:legal.cardInstanceId};case"activate-counter-event":return{type:"activate-counter-event",actionId,revision,eventInstanceId:legal.eventInstanceId};case"resolve-trigger":return{type:"resolve-trigger",actionId,revision,optionId:legal.optionId};case"pass":return{type:"pass",actionId,revision}}}function simulateAction(state,actionId,viewer,legalActions=getLegalActions(state,state.activePlayer)){const legal=findOfferedAction(legalActions,actionId);if(!legal)return void 0;try{const result=applyOfferedAction(state,toGameAction(legal,state.revision),legal);return observe(result.state,viewer)}catch{return void 0}}function lineFrom(state,viewer){return{observation:observe(state,viewer),viewer,decidingPlayer:state.activePlayer,advance(actionId){const next=step(state,actionId);return next?lineFrom(next,viewer):void 0},advanceDefault(){const legal=getLegalActions(state,state.activePlayer);const chosen=legal.find(action=>action.type==="pass")??legal[0];if(!chosen)return void 0;const next=step(state,chosen.actionId);return next?lineFrom(next,viewer):void 0}}}function step(state,actionId){const legal=findOfferedAction(getLegalActions(state,state.activePlayer),actionId);if(!legal)return void 0;try{return applyOfferedAction(state,toGameAction(legal,state.revision),legal).state}catch{return void 0}}function simulateLine(state,actionId,viewer){const next=step(state,actionId);return next?lineFrom(next,viewer):void 0}var GameService=class{#games=new Map;#legal=new Map;#callbacks;#sequence=0;constructor(options){this.#callbacks=options?.callbacks??[]}create(params){const gameId=`g-${++this.#sequence}`;const state=createGame({gameId,...params});this.#games.set(gameId,state);return this.observeActive(gameId,state)}observe(gameId,playerId){const state=this.requireGame(gameId);return playerId===state.activePlayer?this.observeActive(gameId,state):observe(state,playerId)}simulate(gameId,playerId,actionId){const state=this.requireGame(gameId);return simulateAction(state,actionId,playerId,this.legalActions(gameId,state))}simulatorFor(gameId,playerId){return actionId=>this.simulate(gameId,playerId,actionId)}plannerFor(gameId,playerId){return actionId=>simulateLine(this.requireGame(gameId),actionId,playerId)}act(gameId,revision,actionId){const state=this.requireGame(gameId);const legal=findOfferedAction(this.legalActions(gameId,state),actionId);if(!legal){throw new EngineError("ILLEGAL_ACTION",`Unknown action: ${actionId}`)}const action=toGameAction(legal,revision);const result=applyOfferedAction(state,action,legal);this.#games.set(gameId,result.state);notifyCallbacks(this.#callbacks,{previousState:state,action,legalAction:legal,result},cloneTransitionEvent);return this.observeActive(gameId,result.state)}observeActive(gameId,state){return observe(state,state.activePlayer,void 0,this.legalActions(gameId,state))}legalActions(gameId,state){const cached2=this.#legal.get(gameId);if(cached2&&cached2.state===state)return cached2.actions;const actions=getLegalActions(state,state.activePlayer);this.#legal.set(gameId,{state,actions});return actions}requireGame(gameId){const state=this.#games.get(gameId);if(!state)throw new EngineError("ILLEGAL_ACTION",`Unknown game: ${gameId}`);return state}};function replayActions(fixture,resolveDeck){if(fixture.version!==1)throw new Error("UNSUPPORTED_REPLAY_VERSION");const mismatch=describeStampMismatch(fixture.rules);if(mismatch){throw new Error(`REPLAY_RULES_MISMATCH: ${mismatch} Re-record it with \`pnpm fixtures:record\`.`)}const service=new GameService;let observation=service.create({p1:resolveDeck(fixture.decks.p1),p2:resolveDeck(fixture.decks.p2),seed:fixture.seed,...fixture.timeLimit?{timeLimit:fixture.timeLimit}:{}});const checkpoints=[];for(const actionId of fixture.actions){if(!findOfferedAction(observation.legalActions,actionId)){throw new Error(fixture.rules?`REPLAY_ILLEGAL_ACTION: ${actionId}`:`REPLAY_ILLEGAL_ACTION: ${actionId} (this recording carries no rules stamp, so it may predate a rules change; re-record it with \`pnpm fixtures:record\`)`)}observation=service.act(observation.gameId,observation.revision,actionId);checkpoints.push({revision:observation.revision,events:structuredClone(observation.publicEvents),stateHash:observation.stateHash,winner:observation.winner,resultReason:observation.resultReason})}return checkpoints}export{EngineError,GameService,RULES_VERSION,applyAction,createGame,describeStampMismatch,donCountReaders,getLegalActions,hashState,observe,replayActions,rulesStamp};