|
103 | 103 | :this-card-run true |
104 | 104 | :ability (drain-credits :runner :corp 5 2 2)})]}) |
105 | 105 |
|
| 106 | +(defcard "Aircheck" |
| 107 | + {:makes-run true |
| 108 | + :data {:counter {:credit 4}} |
| 109 | + :interactions {:pay-credits {:req (req run) :type :credit}} |
| 110 | + :static-abilities [{:type :cannot-pay-credits-from-pool |
| 111 | + :req (req (= :runner side)) |
| 112 | + :value true} |
| 113 | + {:type :cannot-lose-credits |
| 114 | + :req (req (= :runner side)) |
| 115 | + :value true}] |
| 116 | + :on-play (run-server-from-choices-ability |
| 117 | + ["HQ" "R&D"] |
| 118 | + {:events [{:event :run-ends |
| 119 | + :unregister-once-resolved true |
| 120 | + :req (req (and (:successful context) |
| 121 | + this-card-run |
| 122 | + (or (= [:hq] (:server context)) |
| 123 | + (= [:rd] (:server context))))) |
| 124 | + :prompt "Choose a remote server to run" |
| 125 | + :choices (req (cancellable |
| 126 | + (->> runnable-servers |
| 127 | + (map unknown->kw) |
| 128 | + (filter is-remote?) |
| 129 | + (map remote->name)))) |
| 130 | + :msg (msg "make a run on " target) |
| 131 | + :async true |
| 132 | + :effect (effect (make-run eid target card))}]})}) |
| 133 | + |
106 | 134 | (defcard "Always Have a Backup Plan" |
107 | 135 | {:makes-run true |
108 | 136 | :on-play {:prompt "Choose a server" |
|
264 | 292 | (move state :corp c :deck)) |
265 | 293 | (shuffle! state :corp :deck))}})]}) |
266 | 294 |
|
| 295 | +(defcard "Beta Build" |
| 296 | + {:makes-run true |
| 297 | + :on-play {:async true |
| 298 | + :effect (req (wait-for |
| 299 | + (resolve-ability |
| 300 | + state side |
| 301 | + {:prompt "Install a non-virus program" |
| 302 | + :choices (req (cancellable (filter #(and (program? %) |
| 303 | + (runner-can-install? state side eid % {:no-toast true})) |
| 304 | + (:deck runner)))) |
| 305 | + :async true |
| 306 | + :effect (req (wait-for |
| 307 | + (runner-install state side target {:ignore-all-cost :true :msg-keys {:display-origin true :source-card card}}) |
| 308 | + (complete-with-result state side eid async-result)))} |
| 309 | + card nil) |
| 310 | + (let [installed-card async-result] |
| 311 | + (resolve-ability state side eid |
| 312 | + (run-any-server-ability {:events [{:event :run-ends |
| 313 | + :unregister-once-resolved true |
| 314 | + :duration :end-of-run |
| 315 | + :interactive (req true) |
| 316 | + :automatic :last |
| 317 | + :change-in-game-state {:silent true |
| 318 | + :req (req (get-card state installed-card))} |
| 319 | + :msg (msg "add " (:title installed-card) " to the top of the stack") |
| 320 | + :effect (req (move state side installed-card :deck {:front true}))}]}) |
| 321 | + card nil))))}}) |
| 322 | + |
267 | 323 | (defcard "Black Hat" |
268 | 324 | {:on-play |
269 | 325 | {:trace |
|
561 | 617 | (cbi-choice from '() (count from) from))) |
562 | 618 | card nil))}})]})) |
563 | 619 |
|
| 620 | +(defcard "Chain Reaction" |
| 621 | + (let [corp-choice {:player :corp |
| 622 | + :prompt "Choose a Runner card to trash" |
| 623 | + :async true |
| 624 | + :req (req (seq (all-installed state :runner))) |
| 625 | + :choices {:card (every-pred runner? installed?)} |
| 626 | + :waiting-prompt true |
| 627 | + :display-side :corp |
| 628 | + :msg (msg "trash " (:title target)) |
| 629 | + :effect (req (trash state :corp eid target))} |
| 630 | + cards-to-trash (fn [state] (min 2 (count (all-installed state :corp)))) |
| 631 | + runner-choice {:prompt (msg "choose " (quantify (cards-to-trash state) "card") " to trash") |
| 632 | + :async true |
| 633 | + :choices {:card (every-pred corp? installed?) |
| 634 | + :max (req (cards-to-trash state)) |
| 635 | + :all true} |
| 636 | + :waiting-prompt true |
| 637 | + :msg (msg "trash " (enumerate-str (map #(card-str state %) targets))) |
| 638 | + :effect (req (wait-for (trash-cards state side targets) |
| 639 | + (continue-ability |
| 640 | + state :corp |
| 641 | + corp-choice |
| 642 | + card nil)))}] |
| 643 | + {:on-play {:async true |
| 644 | + :change-in-game-state {:req (req (or (seq (all-installed state :corp)) |
| 645 | + (seq (all-installed state :runner))))} |
| 646 | + :req (req (and (some #{:hq} (:successful-run runner-reg)) |
| 647 | + (some #{:rd} (:successful-run runner-reg)) |
| 648 | + (some #{:archives} (:successful-run runner-reg)))) |
| 649 | + :effect (req (if (seq (all-installed state :corp)) |
| 650 | + (continue-ability state side runner-choice card nil) |
| 651 | + (continue-ability state :corp corp-choice card nil)))}})) |
| 652 | + |
564 | 653 | (defcard "Charm Offensive" |
565 | 654 | (letfn [(trash-x-opt [t] |
566 | 655 | {:option (str "Trash a rezzed copy of " t) |
|
2180 | 2269 | (defcard "Knifed" |
2181 | 2270 | (cutlery "Barrier")) |
2182 | 2271 |
|
| 2272 | +(defcard "Kompromat" |
| 2273 | + (letfn [(iced-servers [state side eid card] |
| 2274 | + (filter #(-> (get-in @state (cons :corp (server->zone state %))) :ices count pos?) |
| 2275 | + (zones->sorted-names (get-runnable-zones state side eid card nil))))] |
| 2276 | + {:makes-run true |
| 2277 | + :on-play {:async true |
| 2278 | + :rfg-instead-of-trashing true |
| 2279 | + :change-in-game-state {:req (req (seq (iced-servers state side eid card)))} |
| 2280 | + :prompt "Choose an iced server" |
| 2281 | + :choices (req (iced-servers state side eid card)) |
| 2282 | + :effect (req (make-run state side eid target card))} |
| 2283 | + :events [{:event :run-ends |
| 2284 | + :req (req (and this-card-run (:successful context))) |
| 2285 | + :async true |
| 2286 | + :interactive (req true) |
| 2287 | + :effect (req (let [valid-ice (filter #(and (ice? %) |
| 2288 | + (rezzed? %) |
| 2289 | + (= (first (:server context)) (second (get-zone %)))) |
| 2290 | + (all-installed state :corp))] |
| 2291 | + (continue-ability |
| 2292 | + state side |
| 2293 | + (if (seq valid-ice) |
| 2294 | + {:prompt "Derez an ice? (if you click done, you take a bad publicity)" |
| 2295 | + :player :corp |
| 2296 | + :waiting-prompt true |
| 2297 | + :choices {:req (req (some #(same-card? % target) valid-ice))} |
| 2298 | + :cancel {:display-side :runner |
| 2299 | + :msg "give the Corp 1 bad publicity" |
| 2300 | + :async true |
| 2301 | + :effect (req (gain-bad-publicity state :runner eid 1))} |
| 2302 | + :msg (msg "derez " (card-str state target)) |
| 2303 | + :display-side :corp |
| 2304 | + :async true |
| 2305 | + :effect (req (derez state side eid target {:no-msg true}))} |
| 2306 | + {:msg "give the Corp 1 bad publicity" |
| 2307 | + :async true |
| 2308 | + :effect (req (gain-bad-publicity state :runner eid 1))}) |
| 2309 | + card nil)))}]})) |
| 2310 | + |
2183 | 2311 | (defcard "Kraken" |
2184 | 2312 | {:on-play |
2185 | 2313 | {:req (req (:stole-agenda runner-reg)) |
|
3459 | 3587 | (:label (:ability context))))) |
3460 | 3588 | :value (->c :credit 1)}]}) |
3461 | 3589 |
|
| 3590 | +(defcard "Sell Out" |
| 3591 | + {:on-play {:additional-cost [(->c :resource 1)] |
| 3592 | + :async true |
| 3593 | + :msg "gain 4 [Credits] and draw 2 cards" |
| 3594 | + :effect (req (wait-for (gain-credits state side 4 {:suppress-checkpoint true}) |
| 3595 | + (draw state side eid 2)))}}) |
| 3596 | + |
3462 | 3597 | (defcard "Shred" |
3463 | 3598 | {:on-play (run-any-server-ability) |
3464 | 3599 | :makes-run true |
|
3761 | 3896 | (assoc ability :event :corp-turn-ends) |
3762 | 3897 | (assoc ability :event :runner-turn-ends)]})) |
3763 | 3898 |
|
| 3899 | +(defcard "Tailgate" |
| 3900 | + {:makes-run true |
| 3901 | + :on-play (run-server-ability |
| 3902 | + :hq |
| 3903 | + {:play-cost-bonus (req (- (count (get-in @state [:corp :servers :hq :ices]))))}) |
| 3904 | + :events [{:event :successful-run |
| 3905 | + :silent (req true) |
| 3906 | + :req (req (and (= :hq (target-server context)) this-card-run)) |
| 3907 | + :effect (effect (register-events |
| 3908 | + card [(breach-access-bonus :hq 2 {:duration :end-of-run})]))}]}) |
| 3909 | + |
| 3910 | +(defcard "Take a Dive" |
| 3911 | + {:on-play (run-server-from-choices-ability ["HQ" "R&D"] {:rfg-instead-of-trashing true}) |
| 3912 | + :events [{:event :successful-run |
| 3913 | + :req (req (letfn [(valid-ctx? [[ctx]] (pos? (or (:subroutines-fired ctx) 0)))] |
| 3914 | + (valid-ctx? [context]))) |
| 3915 | + :msg "force the Corp to take 1 Bad Publicity" |
| 3916 | + :async true |
| 3917 | + :effect (req (gain-bad-publicity state :corp eid 1 {:card card}))}]}) |
| 3918 | + |
3764 | 3919 | (defcard "Test Run" |
3765 | 3920 | {:on-play |
3766 | 3921 | {:prompt (req (if (not (zone-locked? state :runner :discard)) |
|
0 commit comments