Skip to content

Commit 77faa8d

Browse files
authored
Merge pull request #7776 from NBKelly/terminal-directive-campaign-cards
Terminal directive campaign cards
2 parents 0ac4430 + e3aff3f commit 77faa8d

File tree

18 files changed

+349
-34
lines changed

18 files changed

+349
-34
lines changed

resources/public/i18n/en.ftl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,8 @@ game_current = Current
465465
466466
game_current-phase = Current phase
467467
468+
game_destroyed = Destroyed
469+
468470
game_draw = Draw
469471
470472
game_encounter-ice = Encounter ice

src/clj/game/cards/agendas.clj

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -834,6 +834,24 @@
834834
:async true
835835
:effect (effect (gain-credits :corp eid 5))}}}})
836836

837+
(defcard "Evidence Collection"
838+
{:events [{:event :win
839+
:req (req (= :corp (:winner context)))
840+
:msg "reveal set 2"}]})
841+
842+
(defcard "Evidence Collection 2"
843+
{:events [{:event :win
844+
:req (req (= :corp (:winner context)))
845+
:msg "reveal set 5"}]})
846+
847+
(defcard "Evidence Collection 3"
848+
{:events [{:event :win
849+
:req (req (= :corp (:winner context)))
850+
:msg "reveal set 8"}]})
851+
852+
(defcard "Evidence Collection 4"
853+
{:agendapoints-runner (req 1)})
854+
837855
(defcard "False Lead"
838856
{:abilities [{:req (req (<= 2 (:click runner)))
839857
:label "runner loses [Click][Click]"

src/clj/game/cards/assets.clj

Lines changed: 95 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
[clojure.pprint :as pprint]
44
[clojure.set :as set]
55
[clojure.string :as str]
6-
[game.core.access :refer [access-card installed-access-trigger]]
6+
[game.core.access :refer [access-bonus access-card get-only-card-to-access installed-access-trigger num-cards-to-access]]
77
[game.core.actions :refer [score]]
88
[game.core.agendas :refer [update-all-advancement-requirements
99
update-all-agenda-points]]
@@ -26,9 +26,9 @@
2626
[game.core.eid :refer [complete-with-result effect-completed is-basic-advance-action? make-eid get-ability-targets]]
2727
[game.core.engine :refer [not-used-once? pay register-events resolve-ability trigger-event-sync]]
2828
[game.core.events :refer [first-event? no-event? turn-events event-count]]
29-
[game.core.flags :refer [lock-zone prevent-current
29+
[game.core.flags :refer [in-corp-scored? in-runner-scored? lock-zone prevent-current
3030
prevent-draw
31-
register-turn-flag! release-zone]]
31+
register-turn-flag! release-zone when-scored?]]
3232
[game.core.gaining :refer [gain gain-clicks gain-credits lose lose-clicks
3333
lose-credits]]
3434
[game.core.hand-size :refer [corp-hand-size+ runner-hand-size+]]
@@ -37,7 +37,7 @@
3737
[game.core.initializing :refer [card-init]]
3838
[game.core.installing :refer [corp-install corp-install-msg]]
3939
[game.core.moving :refer [as-agenda mill move remove-from-currently-drawing
40-
swap-cards swap-installed trash trash-cards]]
40+
swap-agendas swap-cards swap-installed trash trash-cards]]
4141
[game.core.optional :refer [get-autoresolve set-autoresolve]]
4242
[game.core.payment :refer [can-pay? cost-value ->c]]
4343
[game.core.play-instants :refer [play-instant]]
@@ -1430,6 +1430,61 @@
14301430
:async true
14311431
:effect (effect (gain-credits eid 1))}]})
14321432

1433+
(defcard "Investigator Inez Delgado A"
1434+
{:events [{:event :agenda-scored
1435+
:interactive (req true)
1436+
:req (req (seq (:scored runner)))
1437+
:async true
1438+
:effect (req
1439+
(let [scored (:card context)]
1440+
(continue-ability
1441+
state side
1442+
{:optional
1443+
{:prompt (msg "Swap " (:title scored) " for an agenda in the Runner's score area?")
1444+
:waiting-prompt true
1445+
:req (req (seq (get-in @state [:runner :scored])))
1446+
:yes-ability
1447+
{:prompt (str "Choose a scored Runner agenda to swap with " (:title scored))
1448+
:choices {:req (req (and (in-runner-scored? state side target)
1449+
(:agendapoints target)
1450+
(pos? (:agendapoints target))))}
1451+
:msg (msg "swap " (card-str state scored) " for " (card-str state target))
1452+
:async true
1453+
:effect (req (let [new-scored (second (swap-agendas state side scored target))]
1454+
(continue-ability
1455+
state side
1456+
(:on-score (card-def new-scored))
1457+
new-scored nil)))}}}
1458+
card targets)))}]})
1459+
1460+
(defcard "Investigator Inez Delgado A 2"
1461+
(letfn [(swap-abi [stolen]
1462+
{:prompt (str "Swap " (:title stolen) " with an agenda in your score area?")
1463+
:req (req (seq (:scored corp)))
1464+
:choices {:req (req (in-corp-scored? state side target))}
1465+
:msg (msg "swap " (card-str state stolen) " for " (card-str state target))
1466+
:effect (req (swap-agendas state side target stolen))})]
1467+
{:events [{:event :agenda-stolen
1468+
:interactive (req true)
1469+
:skippable true
1470+
:async true
1471+
:effect (req (let [stolen (:card context)]
1472+
(if (:on-score (card-def stolen))
1473+
(continue-ability
1474+
state side
1475+
{:optional {:prompt (str "Resolve the when-scored ability on " (:title stolen))
1476+
:waiting-prompt true
1477+
:yes-ability {:async true
1478+
:msg (msg "resolve the when-scored ability on " (:title stolen))
1479+
:effect (req (wait-for
1480+
(resolve-ability state side (:on-score (card-def stolen)) stolen nil)
1481+
(if (get-card state stolen)
1482+
(continue-ability state side (swap-abi stolen) card nil)
1483+
(effect-completed state side eid))))}
1484+
:no-ability (swap-abi stolen)}}
1485+
card nil)
1486+
(continue-ability state side (swap-abi stolen) card nil))))}]}))
1487+
14331488
(defcard "Isabel McGuire"
14341489
{:abilities [{:action true
14351490
:label "Add an installed card to HQ"
@@ -1682,6 +1737,28 @@
16821737
:msg "give the Runner 1 tag"
16831738
:effect (req (gain-tags state :runner eid 1))}]})
16841739

1740+
(defcard "Lt. Todachine 2"
1741+
{:events [{:event :rez
1742+
:req (req (ice? (:card context)))
1743+
:async true
1744+
:msg "give the Runner 1 tag"
1745+
:effect (req (gain-tags state :runner eid 1))}
1746+
{:event :breach-server
1747+
:interactive (req true)
1748+
:player :corp
1749+
:req (req tagged)
1750+
:async true
1751+
;; the random-access check needs to be dereffed to work correctly
1752+
:effect (req (continue-ability
1753+
state side
1754+
{:req (req
1755+
(and tagged
1756+
(> (:random-access-limit (num-cards-to-access state :runner target nil)) 1)
1757+
(not (get-only-card-to-access state))))
1758+
:msg (msg "make the runner access 1 card fewer")
1759+
:effect (req (access-bonus state :runner target -1))}
1760+
card targets))}]})
1761+
16851762
(defcard "Malia Z0L0K4"
16861763
(let [unmark
16871764
(req (when-let [malia-target (get-in card [:special :malia-target])]
@@ -3045,6 +3122,20 @@
30453122
(contains? break-ability :break-cost)))))
30463123
:value true}]})
30473124

3125+
(defcard "Trojan"
3126+
{:flags {:rd-reveal (req true)}
3127+
:poison true
3128+
:on-access {:async true
3129+
:req (req (not (in-discard? card)))
3130+
:msg (msg "lose 2 [Credits], destroy itself, and trash 1 card from HQ at random")
3131+
:effect (req (wait-for
3132+
(lose-credits state :corp 2)
3133+
(move state side card :destroyed)
3134+
(let [trash-target (first (shuffle (get-in @state [:corp :hand])))]
3135+
(if trash-target
3136+
(trash state :corp eid trash-target {:cause-card card})
3137+
(effect-completed state side eid)))))}})
3138+
30483139
(defcard "Turtlebacks"
30493140
{:events [{:event :server-created
30503141
:msg "gain 1 [Credits]"

src/clj/game/cards/ice.clj

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2753,7 +2753,9 @@
27532753
trash-program-sub
27542754
trash-hardware-sub
27552755
{:label "Runner loses 3 [Credits], if able. End the run"
2756-
:msg "make the Runner lose 3 [Credits] and end the run"
2756+
:msg (msg (if (>= (:credit runner) 3)
2757+
"make the Runner lose 3 [Credits] and end the run"
2758+
"end the run"))
27572759
:async true
27582760
:effect (req (if (>= (:credit runner) 3)
27592761
(wait-for (lose-credits state :runner (make-eid state eid) 3)
@@ -2765,9 +2767,12 @@
27652767
trash-resource-sub
27662768
(do-net-damage 1)
27672769
{:label "Runner loses [click], if able. End the run"
2768-
:msg "make the Runner lose [click] and end the run"
2770+
:msg (msg (if (pos? (:click runner))
2771+
"make the Runner lose [click] and end the run"
2772+
"end the run"))
27692773
:async true
2770-
:effect (req (lose-clicks state :runner 1)
2774+
:effect (req (when (pos? (:click runner))
2775+
(lose-clicks state :runner 1))
27712776
(end-run state :corp eid card))}]})
27722777

27732778
(defcard "Macrophage"

src/clj/game/cards/operations.clj

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1849,6 +1849,16 @@
18491849
[{:type :steal-additional-cost
18501850
:value (req (->c :credit (+ 4 (* 2 (get-counters target :advancement)))))}]}))
18511851

1852+
(defcard "Net Watchlist"
1853+
{:implementation "Only modifies ability costs, does not adjust non-ability uses"
1854+
:static-abilities [{:type :card-ability-additional-cost
1855+
:req (req (and (has-subtype? (:card context) "Icebreaker")
1856+
(not (get-in context [:ability :break]))))
1857+
:value (->c :credit 2)}
1858+
{:type :break-sub-additional-cost
1859+
:req (req (has-subtype? (:card context) "Icebreaker"))
1860+
:value (->c :credit 2)}]})
1861+
18521862
(defcard "Neural EMP"
18531863
{:on-play
18541864
{:req (req (last-turn? state :runner :made-run))

src/clj/game/cards/programs.clj

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3209,6 +3209,22 @@
32093209
:events [{:event :corp-click-draw
32103210
:msg (msg "reveal that they drew " (:title (:card context)))}]})
32113211

3212+
(defcard "Surveillance Network Key 2"
3213+
(letfn [(ttw-ab [name server]
3214+
{:label (str "Access an additional card in " name)
3215+
:cost [(->c :credit 2)]
3216+
:req (req run)
3217+
:once :per-turn
3218+
:keep-menu-open :while-2-power-tokens-left
3219+
:msg (msg "access 1 additional card from " name " for the remainder of the run")
3220+
:effect (effect (register-events
3221+
card [(breach-access-bonus server 1 {:duration :end-of-run})]))})]
3222+
{:implementation "Only implemented for click to draw"
3223+
:abilities [(ttw-ab "R&D" :rd)
3224+
(ttw-ab "HQ" :hq)]
3225+
:events [{:event :corp-click-draw
3226+
:msg (msg "reveal that they drew " (:title (:card context)))}]}))
3227+
32123228
(defcard "Switchblade"
32133229
(auto-icebreaker {:abilities [(break-sub (->c :credit 1 {:stealth 1}) 0 "Sentry")
32143230
(strength-pump (->c :credit 1 {:stealth 1}) 7 :end-of-encounter)]}))

src/clj/game/cards/resources.clj

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
[game.core.card :refer [agenda? asset? assoc-host-zones card-index corp? condition-counter?
1313
event? facedown? get-agenda-points get-card get-counters
1414
get-title get-zone hardware? has-subtype? has-any-subtype? ice? identity?
15-
in-discard? in-hand? in-scored? installed? is-type? program? resource? rezzed?
15+
in-discard? in-hand? in-set-aside? in-scored? installed? is-type? program? resource? rezzed?
1616
runner? upgrade? virus-program?]]
1717
[game.core.card-defs :refer [card-def]]
1818
[game.core.charge :refer [can-charge charge-ability]]
@@ -1812,14 +1812,58 @@
18121812
:prompt "Choose a server"
18131813
:choices (req remotes)
18141814
:req (req (:stole-agenda runner-reg))
1815-
:effect (req (as-agenda state :runner card 0)
1816-
(let [zone (server->zone state target)
1815+
:effect (req (let [moved-card (as-agenda state :runner card 0)
1816+
zone (server->zone state target)
18171817
path (conj (into [(->c :corp)] zone) :content)
1818-
cards (enumerate-str (map :title (get-in @state path)))]
1819-
(wait-for
1820-
(reveal state :corp (make-eid state eid) targets)
1821-
(system-msg state side
1822-
(str "uses " (:title card) " to reveal " cards " from " target))
1818+
cards (get-in @state path)]
1819+
(register-events
1820+
state side moved-card
1821+
[{:event :win
1822+
:req (req (= :runner (:winner context)))
1823+
:unregister-once-resolved true
1824+
:msg "reveal set 2"}])
1825+
(expose state :runner eid (get-in @state [:corp :servers (unknown->kw target) :content]))))}]})
1826+
1827+
(defcard "Investigator Inez Delgado 2"
1828+
{:abilities [{:msg (msg "add itself to [their] score area as an agenda worth 0 agenda points")
1829+
:label "Add to score area and reveal the top 3 cards of R&D"
1830+
:async true
1831+
:req (req (:stole-agenda runner-reg))
1832+
:effect (req (let [moved-card (as-agenda state :runner card 0)]
1833+
(register-events
1834+
state side moved-card
1835+
[{:event :win
1836+
:req (req (= :runner (:winner context)))
1837+
:unregister-once-resolved true
1838+
:msg "reveal set 5"}])
1839+
(if (seq (:deck corp))
1840+
(reveal-loud state side eid card nil (take 3 (:deck corp)))
1841+
(effect-completed state side eid))))}]})
1842+
1843+
(defcard "Investigator Inez Delgado 3"
1844+
{:abilities [{:msg (msg "add itself to [their] score area as an agenda worth 0 agenda points")
1845+
:label "Add to score area and reveal the top 3 cards of R&D"
1846+
:async true
1847+
:req (req (:stole-agenda runner-reg))
1848+
:effect (req (let [moved-card (as-agenda state :runner card 0)]
1849+
(register-events
1850+
state side moved-card
1851+
[{:event :win
1852+
:req (req (= :runner (:winner context)))
1853+
:unregister-once-resolved true
1854+
:msg "reveal set 8"}])
1855+
(if (seq (:hand corp))
1856+
(reveal-loud state side eid card nil (:hand corp))
1857+
(effect-completed state side eid))))}]})
1858+
1859+
(defcard "Investigator Inez Delgado 4"
1860+
{:abilities [{:msg (msg "add itself to [their] score area as an agenda worth 0 agenda points")
1861+
:label "Add to score area and reveal the top 3 cards of R&D"
1862+
:async true
1863+
:req (req (:stole-agenda runner-reg))
1864+
:effect (req (let [moved-card (as-agenda state :runner card 0)]
1865+
(if (seq (concat (:hand corp) [(first (:deck corp))]))
1866+
(reveal-loud state side eid card nil (concat (:hand corp) [(first (:deck corp))]))
18231867
(effect-completed state side eid))))}]})
18241868

18251869
(defcard "Jackpot!"
@@ -3061,6 +3105,21 @@
30613105
:effect (effect (update! (dissoc card :card-target)))}]
30623106
:abilities [ability]}))
30633107

3108+
(defcard "Shadow Team"
3109+
{:on-draw {:req (req (and (runner-can-pay-and-install? state side eid card)
3110+
(in-set-aside? card)))
3111+
:msg (msg "install itself")
3112+
:async true
3113+
:effect (req (runner-install state side eid card))}
3114+
:events [{:event :run
3115+
:req (req (seq (:hand runner)))
3116+
:msg :cost
3117+
:cost [(->c :trash-from-hand 1)]}
3118+
{:event :successful-run
3119+
:req (req (#{:hq :rd :archives} (target-server context)))
3120+
:msg (msg "destroy itself")
3121+
:effect (req (move state side card :destroyed))}]})
3122+
30643123
(defcard "Smartware Distributor"
30653124
(let [start-of-turn-ability {:once :per-turn
30663125
:automatic :gain-credits

src/clj/game/core/damage.clj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
(swap! state update-in [:stats :corp :damage dmg-type] (fnil + 0) n)
8282
(if (< (count hand) n)
8383
(do (flatline state)
84+
(trigger-event state side :win {:winner :corp})
8485
(trash-cards state side eid cards-trashed {:unpreventable true}))
8586
(wait-for (trash-cards state side cards-trashed {:unpreventable true
8687
:cause dmg-type

src/clj/game/core/diffs.clj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@
252252
:play-area
253253
:current
254254
:set-aside
255+
:destroyed
255256
:click
256257
:credit
257258
:toast

0 commit comments

Comments
 (0)