Skip to content

Commit

Permalink
Merge pull request #7314 from NBKelly/rwr-fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
NoahTheDuke authored Mar 23, 2024
2 parents cb6f588 + 86ab6b6 commit 6276eae
Show file tree
Hide file tree
Showing 15 changed files with 187 additions and 101 deletions.
63 changes: 32 additions & 31 deletions src/clj/game/cards/agendas.clj
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
[game.core.damage :refer [damage damage-bonus]]
[game.core.def-helpers :refer [corp-recur defcard do-net-damage
offer-jack-out reorder-choice get-x-fn]]
[game.core.drawing :refer [draw]]
[game.core.drawing :refer [draw draw-up-to]]
[game.core.effects :refer [register-lingering-effect]]
[game.core.eid :refer [effect-completed make-eid]]
[game.core.engine :refer [pay register-events resolve-ability
Expand Down Expand Up @@ -732,7 +732,7 @@
(corp-installable-type? %))}
:msg "install and rez 1 card from HQ, paying 5 [Credits] less"
:async true
:effect (req (corp-install state side (make-eid state eid) target nil
:effect (req (corp-install state side eid target nil
{:install-state :rezzed
:combined-credit-discount 5}))}
score-abi {:interactive (req true)
Expand Down Expand Up @@ -1129,10 +1129,11 @@
(update-all-agenda-points state)
(check-win-by-agenda state side)
(effect-completed state side eid))
:cancel-effect (effect (system-msg (str "declines to use " (:title card))))}]
:cancel-effect (effect (system-msg (str "declines to use " (:title card)))
(effect-completed eid))}]
{:on-score {:async true
:effect (req (wait-for
(draw state side 3)
(draw-up-to state side card 3)
(continue-ability state side add-abi card nil)))}}))

(defcard "Labyrinthine Servers"
Expand Down Expand Up @@ -1163,6 +1164,7 @@
{:event :runner-turn-ends
:req (req (seq (filter #(= (:zone %) [:servers zone :ices])
(all-active-installed state :corp))))
:duration :end-of-turn
:effect (req (let [derez-count
(min 2 (count (filter #(= (:zone %) [:servers zone :ices])
(all-active-installed state :corp))))]
Expand Down Expand Up @@ -1920,33 +1922,32 @@
:effect (effect (damage eid :meat 2 {:card card}))}})

(defcard "Sisyphus Protocol"
{:events [{:event :pass-ice
:req (req (and (rezzed? (:ice context))
(or (has-subtype? (:ice context) "Code Gate")
(has-subtype? (:ice context) "Sentry"))
(first-event? state side :pass-ice
(fn [targets]
(let [context (first targets)]
(and (rezzed? (:ice context))
(or (has-subtype? (:ice context) "Code Gate")
(has-subtype? (:ice context) "Sentry"))))))))
:prompt (msg "Make the runner encounter " (:title (:ice context)) " again?")
:choices (req [(when (can-pay? state :corp (assoc eid :source card :source-type :ability) card nil [:credit 1]) "Pay 1 [Credit]")
(when (can-pay? state :corp (assoc eid :source card :source-type :ability) card nil [:trash-from-hand 1]) "Trash 1 card from HQ")
"Done"])
:async true
:effect (req (if (= target "Done")
(effect-completed state side eid)
(let [enc-ice current-ice]
(continue-ability
state side
(assoc {:msg (msg "make the runner encounter " (card-str state enc-ice) " again")
:async true
:effect (req (force-ice-encounter state side eid enc-ice))}
:cost (if (= target "Pay 1 [Credit]")
[:credit 1]
[:trash-from-hand 1]))
card nil))))}]})
(letfn [(rezzed-gate-or-sentry [context]
(and (rezzed? (:ice context))
(or (has-subtype? (:ice context) "Code Gate")
(has-subtype? (:ice context) "Sentry"))))]
{:events [{:event :pass-ice
:req (req (and (rezzed-gate-or-sentry context)
(first-event? state side :pass-ice
#(rezzed-gate-or-sentry (first %)))))
:prompt (msg "Make the runner encounter " (:title (:ice context)) " again?")
:choices (req [(when (can-pay? state :corp (assoc eid :source card :source-type :ability) card nil [:credit 1]) "Pay 1 [Credit]")
(when (can-pay? state :corp (assoc eid :source card :source-type :ability) card nil [:trash-from-hand 1]) "Trash 1 card from HQ")
"Done"])
:async true
:effect (req (if (= target "Done")
(effect-completed state side eid)
(let [enc-ice current-ice]
(continue-ability
state side
(assoc {:msg (msg "make the runner encounter " (card-str state enc-ice) " again")
:async true
:effect (req
(force-ice-encounter state side eid enc-ice :encounter-ice))}
:cost (if (= target "Pay 1 [Credit]")
[:credit 1]
[:trash-from-hand 1]))
card nil))))}]}))

(defcard "Slash and Burn Agriculture"
{:expend {:req (req (some #(can-be-advanced? %) (all-installed state :corp)))
Expand Down
55 changes: 32 additions & 23 deletions src/clj/game/cards/events.clj
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
[game.core.effects :refer [register-lingering-effect]]
[game.core.eid :refer [complete-with-result effect-completed make-eid
make-result]]
[game.core.engine :refer [not-used-once? pay register-events
[game.core.engine :refer [not-used-once? pay register-events register-pending-event
resolve-ability trigger-event trigger-event-simult
unregister-events unregister-floating-events]]
[game.core.events :refer [first-event? first-run-event? run-events
Expand Down Expand Up @@ -2854,13 +2854,13 @@
{:prompt "Choose a program to install"
:waiting-prompt true
:async true
:req (req (and (not (zone-locked? state :runner :discard))
(not (install-locked? state side))
(threat-level 3 state)))
:req (req (and
(not (get-in card [:special :maybe-a-bonus-tag]))
(not (zone-locked? state :runner :discard))
(not (install-locked? state side))
(threat-level 3 state)))
:interactive (req true)
:ability-name "Privileged Access (program)"
:once :per-run
:once-key :install-program-from-heap
:choices (req (concat
(->> (:discard runner)
(filter
Expand All @@ -2872,20 +2872,23 @@
(seq))
["Done"]))
:effect (req (if (= target "Done")
(effect-completed state side eid)
(wait-for (runner-install state side (make-eid state (assoc eid :source card :source-type :runner-install)) target)
(system-msg state side (str "uses " (:title card) " to install " (:title target) " from the heap"))
(effect-completed state side eid))))}
(effect-completed state side eid)
(do (update! state side (assoc-in card [:special :maybe-a-bonus-tag] true))
(wait-for
(runner-install state side (make-eid state (assoc eid :source card :source-type :runner-install)) target)
(update! state side (dissoc-in card [:special :maybe-a-bonus-tag]))
(system-msg state side (str "uses " (:title card) " to install " (:title target) " from the heap"))
(effect-completed state side eid)))))}
install-resource-from-heap
{:prompt "Choose a resource to install, paying 2 [Credits] less"
:waiting-prompt true
:req (req (and (not (zone-locked? state :runner :discard))
:req (req (and
(not (get-in card [:special :maybe-a-bonus-tag]))
(not (zone-locked? state :runner :discard))
(not (install-locked? state side))))
:async true
:interactive (req true)
:ability-name "Privileged Access (resource)"
:once :per-run
:once-key :install-resource-from-heap
:choices (req (concat
(->> (:discard runner)
(filter
Expand All @@ -2898,24 +2901,30 @@
["Done"]))
:effect (req (if (= target "Done")
(effect-completed state side eid)
(wait-for (runner-install state side (make-eid state (assoc eid :source card :source-type :runner-install)) target {:cost-bonus -2})
(system-msg state side (str "uses " (:title card) " to install " (:title target) " from the heap, paying 2 [Credits] less"))
(effect-completed state side eid))))}]
(do (update! state side (assoc-in card [:special :maybe-a-bonus-tag] true))
(wait-for
(runner-install state side (make-eid state (assoc eid :source card :source-type :runner-install)) target {:cost-bonus -2})
(update! state side (dissoc-in card [:special :maybe-a-bonus-tag]))
(system-msg state side (str "uses " (:title card) " to install " (:title target) " from the heap, paying 2 [Credits] less"))
(effect-completed state side eid)))))}]
{:makes-run true
:on-play {:req (req (and archives-runnable (not tagged)))
:async true
:effect (effect (make-run eid :archives card))}
:events [(assoc install-resource-from-heap
:event :runner-gain-tag)
(assoc install-program-from-heap
:event :runner-gain-tag)
(successful-run-replace-breach
:events [(successful-run-replace-breach
{:target-server :archives
:this-card-run true
:mandatory true
:ability {:async true
:msg "take 1 tag"
:effect (effect (gain-tags :runner eid 1))}})]}))
:effect (req
(register-pending-event state :runner-gain-tag
card install-resource-from-heap)
(register-pending-event state :runner-gain-tag
card install-program-from-heap)
(wait-for (gain-tags state :runner 1)
(unregister-events state side card)
(effect-completed state side eid)))}})]}))

(defcard "Process Automation"
{:on-play
Expand Down Expand Up @@ -4131,7 +4140,7 @@
(if (seq targets-in-the-grip)
{:prompt "Choose 1 program or piece of hardware"
:waiting-prompt true
:choices (req targets-in-the-grip)
:choices (req (cancellable targets-in-the-grip))
:async true
:effect (effect (runner-install (assoc eid :source card :source-type :runner-install) target))
:msg (msg "install " (:title target) " from the grip")}
Expand Down
2 changes: 1 addition & 1 deletion src/clj/game/cards/hardware.clj
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,8 @@
(defcard "Amanuensis"
{:static-abilities [(mu+ 1)]
:events [{:event :runner-lose-tag
:req (req (= :runner side))
:optional {:prompt "Remove 1 power counter to draw 2 cards?"
:req (req (= :runner (second targets)))
:yes-ability {:cost [:power 1]
:msg "draw 2 cards"
:async true
Expand Down
8 changes: 5 additions & 3 deletions src/clj/game/cards/ice.clj
Original file line number Diff line number Diff line change
Expand Up @@ -1199,18 +1199,18 @@
:events [{:event :end-of-encounter
:req (req (and (= :this-turn (:rezzed card))
(same-card? (:ice context) card)))
:msg "force the Runner to choose a subroutine to resolve"
:msg "force the Runner to choose an effect"
:effect (effect (continue-ability
{:prompt "Choose one"
:player :runner
:choices (req [(when (seq (all-installed-runner state)) "Corp trashes 1 Runner card")
:choices (req ["Corp trashes 1 Runner card"
(when-not (forced-to-avoid-tags? state side) "Take 2 tags")
(when (can-pay? state :runner eid card nil :net 3)
"Suffer 3 net damage")])
:async true
:effect (req
(continue-ability
state :runner
state (if (= target "Corp trashes 1 Runner card") :corp :runner)
(cond
(= target "Corp trashes 1 Runner card")
trash-installed-sub
Expand Down Expand Up @@ -2005,6 +2005,8 @@
(let [shuffle-ab
{:label "Draw 1 card and shuffle 2 agendas in HQ and/or Archives into R&D"
:msg "draw 1 card"
:async true
:cost [:credit 1]
:effect
(req (wait-for
(draw state side 1)
Expand Down
35 changes: 20 additions & 15 deletions src/clj/game/cards/programs.clj
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
[game.core.flags :refer [can-host? can-trash? card-flag? lock-zone release-zone zone-locked?]]
[game.core.gaining :refer [gain-clicks gain-credits lose-credits]]
[game.core.hosting :refer [host]]
[game.core.identities :refer [disable-card enable-card]]
[game.core.ice :refer [all-subs-broken-by-card? all-subs-broken?
any-subs-broken-by-card? auto-icebreaker break-sub
break-subroutine! break-subroutines-msg breaker-strength-bonus dont-resolve-subroutine!
Expand Down Expand Up @@ -684,11 +685,11 @@
(letfn [(was-a-runner-card?
[target]
(runner? (:card (first target))))]
(auto-icebreaker {:implementation "Effect only applies for printed abilities"
:abilities [(break-sub 1 2 "Sentry" (cond-breaker :runner-trash was-a-runner-card?))
(break-sub 2 2 "Sentry")
(strength-pump 2 3 :end-of-encounter (cond-breaker :runner-trash was-a-runner-card?))
(strength-pump 3 3)]})))
{:implementation "Effect only applies for printed abilities"
:abilities [(break-sub 1 2 "Sentry" (cond-breaker :runner-trash was-a-runner-card?))
(break-sub 2 2 "Sentry")
(strength-pump 2 3 :end-of-encounter (cond-breaker :runner-trash was-a-runner-card?))
(strength-pump 3 3)]}))

(defcard "Botulus"
{:implementation "[Erratum] Program: Virus - Trojan"
Expand Down Expand Up @@ -1044,12 +1045,13 @@
:sorted))
:cost [:credit 1]
:msg (msg "host " (:title target) " on itself")
:effect (req (host state side (assoc card :seen true) target)
:effect (req (disable-card state side (get-card state target))
(host state side (assoc card :seen true) target)
(effect-completed state side eid))}
{:event :breach-server
:async true
:optional {:req (req (= :hq target)
(seq (filter corp? (:hosted card))))
:optional {:req (req (and (= :hq target)
(seq (filter corp? (:hosted card)))))
:prompt "Trash this program to access 2 additional cards from HQ?"
:yes-ability {:async true
:effect (effect (access-bonus :hq 2)
Expand All @@ -1062,9 +1064,12 @@
:cost [:credit 1]
:msg (msg "host " (:title target) " on itself")
:async true
:effect (req (host state side (assoc card :seen true) target)
(swap! state dissoc :access)
(effect-completed state side eid))}}})
:effect (req
(disable-card state side (get-card state target))
(host state side (assoc card :seen true)
(get-card state target))
(swap! state dissoc :access)
(effect-completed state side eid))}}})

(defcard "Curupira"
(auto-icebreaker {:abilities [(break-sub 1 1 "Barrier")
Expand Down Expand Up @@ -2741,10 +2746,10 @@
:effect (effect (add-counter :runner card :virus 2))}]})

(defcard "Pressure Spike"
(auto-icebreaker {:implementation "Once per run restriction not enforced"
:abilities [(break-sub 1 1 "Barrier")
(strength-pump 2 3)
(strength-pump 2 9 :end-of-encounter {:req (req (threat-level 4 state))})]}))
{:implementation "Once per run restriction not enforced. Auto-breaking disabled for this card."
:abilities [(break-sub 1 1 "Barrier")
(strength-pump 2 3)
(strength-pump 2 9 :end-of-encounter {:req (req (threat-level 4 state))})]})

(defcard "Progenitor"
{:abilities [{:label "Install and host a virus program"
Expand Down
Loading

0 comments on commit 6276eae

Please sign in to comment.