Skip to content

Commit 387c100

Browse files
authored
Merge pull request #8532 from NBKelly/vantage-point-spoilers-2
Vantage Point release
2 parents da2dc79 + f741c97 commit 387c100

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+2982
-307
lines changed

src/clj/game/cards/agendas.clj

Lines changed: 214 additions & 47 deletions
Large diffs are not rendered by default.

src/clj/game/cards/assets.clj

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
[game.core.set-aside :refer [swap-set-aside-cards]]
5555
[game.core.shuffling :refer [shuffle! shuffle-into-deck shuffle-my-deck!
5656
shuffle-into-rd-effect]]
57-
[game.core.tags :refer [gain-tags]]
57+
[game.core.tags :refer [gain-tags lose-tags]]
5858
[game.core.threat :refer [threat-level]]
5959
[game.core.to-string :refer [card-str]]
6060
[game.core.toasts :refer [toast]]
@@ -1071,6 +1071,20 @@
10711071
:req (req (installed? target))
10721072
:value 1}]})
10731073

1074+
(defcard "Esca"
1075+
{:flags {:rd-reveal (req true)}
1076+
:poison true
1077+
:on-access {:msg "force the Runner to lose 1 [Credits]"
1078+
:async true
1079+
:effect (req (wait-for (lose-credits state :runner 1)
1080+
(continue-ability
1081+
state side
1082+
{:req (req tagged)
1083+
:msg "do 1 net damage"
1084+
:async true
1085+
:effect (req (damage state side eid :net 1))}
1086+
card nil)))}})
1087+
10741088
(defcard "Estelle Moon"
10751089
{:events [{:event :corp-install
10761090
:req (req (and (or (asset? (:card context))
@@ -1843,6 +1857,41 @@
18431857
:effect (req (access-bonus state :runner target -1))}
18441858
card targets))}]})
18451859

1860+
(defcard "Luana Campos"
1861+
{:uninstall (req (continue-ability
1862+
state side
1863+
{:req (req (and (rezzed? (:old-card context))
1864+
(pos? (get-counters (:old-card context) :bad-publicity))))
1865+
:msg (msg "take " (get-counters (:old-card context) :bad-publicity)
1866+
" bad publicity")
1867+
:async true
1868+
:effect (req
1869+
(gain-bad-publicity
1870+
state side eid
1871+
(get-counters (:old-card context) :bad-publicity)))}
1872+
card targets))
1873+
:events [{:event :corp-turn-begins
1874+
:interactive (req true)
1875+
:change-in-game-state {:req (req (pos? (count-bad-pub state))) :silent true}
1876+
:optional {:interactive (req true)
1877+
:prompt "Host a bad publicity counter to gain 3 [Credits] and draw a card?"
1878+
:yes-ability {:msg (msg "gain 3 [Credits] and draw 1 card")
1879+
:cost [(->c :host-bad-pub 1)]
1880+
:async true
1881+
:effect (req (wait-for
1882+
(gain-credits state side 3 {:suppress-checkpoint true})
1883+
(draw state side eid 1)))}}}]})
1884+
1885+
(defcard "Magistrate Revontulet"
1886+
{:static-abilities [{:type :steal-additional-cost
1887+
:req (req (agenda? target))
1888+
:value (req [(->c :credit 3)])}]
1889+
:events [{:event :agenda-scored
1890+
:async true
1891+
:interactive (req true)
1892+
:msg "force the Runner to lose 3 [Credits]"
1893+
:effect (req (lose-credits state :runner eid 3))}]})
1894+
18461895
(defcard "Malia Z0L0K4"
18471896
(let [unmark
18481897
(req (when-let [malia-target (get-in card [:special :malia-target])]
@@ -2240,6 +2289,25 @@
22402289
(do (as-agenda state :runner card -1)
22412290
(effect-completed state side eid))))}})
22422291

2292+
(defcard "Nihilo Agent"
2293+
{:data {:counter {:power 3}}
2294+
:events [(trash-on-empty :power)
2295+
{:event :corp-turn-ends
2296+
:msg "take 1 bad publicity and give the Runner 1 tag"
2297+
:async true
2298+
:effect (req (wait-for
2299+
(gain-bad-publicity state :corp 1 {:suppress-checkpoint true})
2300+
(wait-for
2301+
(add-counter state side card :power -1 {:suppress-checkpoint true})
2302+
(gain-tags state side eid 1))))}
2303+
{:event :corp-turn-begins
2304+
:change-in-game-state {:silent true
2305+
:req (req (or tagged (pos? (count-bad-pub state))))}
2306+
:msg "remove 1 bad publicity and 1 tag"
2307+
:async true
2308+
:effect (req (wait-for (lose-bad-publicity state :corp 1 {:suppress-checkpoint true})
2309+
(lose-tags state side eid 1)))}]})
2310+
22432311
(defcard "Open Forum"
22442312
{:events [{:event :corp-mandatory-draw
22452313
:interactive (req true)

src/clj/game/cards/events.clj

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,34 @@
103103
:this-card-run true
104104
:ability (drain-credits :runner :corp 5 2 2)})]})
105105

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+
106134
(defcard "Always Have a Backup Plan"
107135
{:makes-run true
108136
:on-play {:prompt "Choose a server"
@@ -264,6 +292,34 @@
264292
(move state :corp c :deck))
265293
(shuffle! state :corp :deck))}})]})
266294

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+
267323
(defcard "Black Hat"
268324
{:on-play
269325
{:trace
@@ -561,6 +617,39 @@
561617
(cbi-choice from '() (count from) from)))
562618
card nil))}})]}))
563619

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+
564653
(defcard "Charm Offensive"
565654
(letfn [(trash-x-opt [t]
566655
{:option (str "Trash a rezzed copy of " t)
@@ -2180,6 +2269,45 @@
21802269
(defcard "Knifed"
21812270
(cutlery "Barrier"))
21822271

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+
21832311
(defcard "Kraken"
21842312
{:on-play
21852313
{:req (req (:stole-agenda runner-reg))
@@ -3459,6 +3587,13 @@
34593587
(:label (:ability context)))))
34603588
:value (->c :credit 1)}]})
34613589

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+
34623597
(defcard "Shred"
34633598
{:on-play (run-any-server-ability)
34643599
:makes-run true
@@ -3761,6 +3896,26 @@
37613896
(assoc ability :event :corp-turn-ends)
37623897
(assoc ability :event :runner-turn-ends)]}))
37633898

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+
37643919
(defcard "Test Run"
37653920
{:on-play
37663921
{:prompt (req (if (not (zone-locked? state :runner :discard))

0 commit comments

Comments
 (0)