Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RWR bugfixes #7314

Merged
merged 20 commits into from
Mar 23, 2024
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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))}
: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
Loading