From a3cd2a3a7ef44f8424cc1c1207aea46db37b53c7 Mon Sep 17 00:00:00 2001 From: Noah Bogart Date: Wed, 3 Apr 2024 21:54:46 -0400 Subject: [PATCH 1/4] Make actions in `pay` explicit --- src/clj/game/cards/agendas.clj | 2 +- src/clj/game/cards/assets.clj | 28 +++++----- src/clj/game/cards/basic.clj | 9 ++-- src/clj/game/cards/events.clj | 4 +- src/clj/game/cards/ice.clj | 22 ++++---- src/clj/game/cards/identities.clj | 11 ++-- src/clj/game/cards/operations.clj | 10 ++-- src/clj/game/cards/resources.clj | 10 ++-- src/clj/game/cards/upgrades.clj | 10 ++-- src/clj/game/core/access.clj | 8 +-- src/clj/game/core/actions.clj | 13 +++-- src/clj/game/core/costs.clj | 84 ++++++++++++++--------------- src/clj/game/core/engine.clj | 48 ++++++++--------- src/clj/game/core/installing.clj | 2 +- src/clj/game/core/play_instants.clj | 2 +- src/clj/game/core/psi.clj | 2 +- 16 files changed, 134 insertions(+), 131 deletions(-) diff --git a/src/clj/game/cards/agendas.clj b/src/clj/game/cards/agendas.clj index 1bd3de9f50..7bc46c5ff6 100644 --- a/src/clj/game/cards/agendas.clj +++ b/src/clj/game/cards/agendas.clj @@ -414,7 +414,7 @@ :async true :effect (req (if (pos? target) (wait-for - (pay state :corp (make-eid state eid) card (->c :credit target)) + (pay state :corp (make-eid state eid) card [(->c :credit target)]) (let [from (take target (shuffle (:hand runner)))] (doseq [c from] (move state :runner c :deck)) diff --git a/src/clj/game/cards/assets.clj b/src/clj/game/cards/assets.clj index 5acdaf1d85..38a755ff74 100644 --- a/src/clj/game/cards/assets.clj +++ b/src/clj/game/cards/assets.clj @@ -549,7 +549,7 @@ (str "force the runner to " (decapitalize target)))) :async true :effect (req (if (= target "Pay 1 [Credits]") - (wait-for (pay state :runner (make-eid state eid) card (->c :credit 1)) + (wait-for (pay state :runner (make-eid state eid) card [(->c :credit 1)]) (system-msg state :runner (:msg async-result)) (effect-completed state side eid)) (gain-tags state :corp eid 1)))}]}) @@ -605,7 +605,7 @@ :label "make the Runner pay 1 [Credits] or trash the top card of the stack (start of turn)" :msg (msg "force the Runner to " (decapitalize target)) :effect (req (if (= target "Pay 1 [Credits]") - (wait-for (pay state side (make-eid state eid) card (->c :credit 1)) + (wait-for (pay state side (make-eid state eid) card [(->c :credit 1)]) (system-msg state side (:msg async-result)) (effect-completed state side eid)) (mill state :runner eid :runner 1)))}] @@ -1434,19 +1434,20 @@ {:abilities [ability] :leave-play cleanup :events [{:event :corp-spent-click - :effect (req (let [cid (first target) - ability-idx (:ability-idx (:source-info eid)) + :effect (req (let [[cid value ability-idx] targets bac-cid (get-in @state [:corp :basic-action-card :cid]) - cause (if (keyword? (first target)) - (case (first target) + cause (if (keyword? cid) + (case cid :play-instant [bac-cid 3] :corp-click-install [bac-cid 2] - (first target)) ; in clojure there's: (= [1 2 3] '(1 2 3)) + ; else + [cid ability-idx]) [cid ability-idx]) - clicks-spent (+ (get-in card [:seen-this-turn cause] 0) (second targets))] - (update! state side (assoc-in card [:seen-this-turn cause] clicks-spent)) - (when (>= clicks-spent 3) ; can be >= 3 because :once :per-turn on ability - (resolve-ability state side ability (get-card state card) nil))))} + clicks-spent (+ (get-in card [:seen-this-turn cause] 0) value)] + (let [card (update! state side (assoc-in card [:seen-this-turn cause] clicks-spent))] + ; can be >= 3 because :once :per-turn on ability + (when (>= clicks-spent 3) + (resolve-ability state side ability card nil)))))} {:event :corp-turn-ends :effect cleanup}]})) @@ -2989,13 +2990,12 @@ card nil))}) all-events (fn [state side] (turn-events state side :corp-spent-click)) three-of (fn [cid idx state side] - (= 3 (count (filter #(and (= (first (first %)) cid) + (= 3 (count (filter #(and (= (first %) cid) (= (last %) idx)) (all-events state side)))))] {:events [{:event :corp-spent-click :async true - :effect (req (let [cid (first target) - ability-idx (:ability-idx (:source-info eid))] + :effect (req (let [[cid _value ability-idx] targets] (if (three-of cid ability-idx state side) (continue-ability state side payoff card nil) (effect-completed state side eid))))}]})) diff --git a/src/clj/game/cards/basic.clj b/src/clj/game/cards/basic.clj index fa2a782cc1..45b62547b0 100644 --- a/src/clj/game/cards/basic.clj +++ b/src/clj/game/cards/basic.clj @@ -114,7 +114,7 @@ can-pay (can-pay? state side (make-eid state (assoc eid :additional-costs additional-costs)) target (:title target) additional-costs)] (or (empty? additional-costs) can-pay))))} :effect (req - (let [additional-costs (merge-costs (into [] (get-effects state side :basic-ability-additional-trash-cost target))) + (let [additional-costs (merge-costs (get-effects state side :basic-ability-additional-trash-cost target)) cost-strs (build-cost-string additional-costs) can-pay (can-pay? state side (make-eid state (assoc eid :additional-costs additional-costs)) target (:title target) additional-costs)] (if (empty? additional-costs) @@ -129,8 +129,11 @@ (do (system-msg state side (str "declines to pay the additional cost to trash " (:title target-card))) (effect-completed state side eid)) (wait-for (pay state side (make-eid state - (assoc eid :additional-costs additional-costs :source card :source-type :trash-card)) - nil additional-costs 0) + (assoc eid + :additional-costs additional-costs + :source card + :source-type :trash-card)) + nil additional-costs) (system-msg state side (str (:msg async-result) " as an additional cost to trash " (:title target-card))) (complete-with-result state side eid target-card))))} card nil) diff --git a/src/clj/game/cards/events.clj b/src/clj/game/cards/events.clj index eaab323a5f..486f0318bd 100644 --- a/src/clj/game/cards/events.clj +++ b/src/clj/game/cards/events.clj @@ -2506,7 +2506,7 @@ "Take 1 bad publicity"]) :async true :effect (req (if (= target "Pay 5 [Credits]") - (wait-for (pay state :corp (make-eid state eid) card (->c :credit 5)) + (wait-for (pay state :corp (make-eid state eid) card [(->c :credit 5)]) (system-msg state :corp (:msg async-result)) (effect-completed state side eid)) (do (gain-bad-publicity state :corp 1) @@ -4048,7 +4048,7 @@ :choices (req (map str (range 0 (inc (:click runner))))) :async true :effect (req (let [n (str->int target)] - (wait-for (pay state :runner (make-eid state eid) card (->c :click n)) + (wait-for (pay state :runner (make-eid state eid) card [(->c :click n)]) (system-msg state :runner (:msg async-result)) (trash-cards state :corp eid (take n (shuffle (:hand corp))) {:cause-card card}))))}})]}) diff --git a/src/clj/game/cards/ice.clj b/src/clj/game/cards/ice.clj index acf8b3f0b9..a43a828355 100644 --- a/src/clj/game/cards/ice.clj +++ b/src/clj/game/cards/ice.clj @@ -813,7 +813,7 @@ :effect (req (if (= "Take 1 net damage" target) (damage state side eid :net 1 {:card card}) - (pay state :runner eid card (->c :credit 2)))) + (pay state :runner eid card [(->c :credit 2)]))) :msg (msg (if (= "Take 1 net damage" target) "do 1 net damage" (str "force the runner to " (decapitalize target))))} @@ -1388,7 +1388,7 @@ "Take 1 tag"]) :async true :effect (req (if (= target "Pay 3 [Credits]") - (wait-for (pay state :runner (make-eid state eid) card (->c :credit 3)) + (wait-for (pay state :runner (make-eid state eid) card [(->c :credit 3)]) (system-msg state :runner (:msg async-result)) (effect-completed state side eid)) (gain-tags state :runner eid 1)))} @@ -1399,7 +1399,7 @@ (defcard "Datapike" {:subroutines [{:async true - :effect (req (wait-for (pay state :runner (make-eid state eid) card (->c :credit 2)) + :effect (req (wait-for (pay state :runner (make-eid state eid) card [(->c :credit 2)]) (if (:cost-paid async-result) (do (system-msg state :runner (:msg async-result)) (effect-completed state side eid)) @@ -1628,7 +1628,7 @@ "Trash an installed card")]) :async true :effect (req (if (= target "Pay 1 [Credits]") - (wait-for (pay state side (make-eid state eid) card (->c :credit 1)) + (wait-for (pay state side (make-eid state eid) card [(->c :credit 1)]) (system-msg state side (:msg async-result)) (effect-completed state side eid)) (continue-ability state :runner runner-trash-installed-sub card nil)))}] @@ -1649,7 +1649,7 @@ "Trash an installed card")]) :async true :effect (req (if (= target "Pay 2 [Credits]") - (wait-for (pay state side (make-eid state eid) card :credit 2) + (wait-for (pay state side (make-eid state eid) card [(->c :credit 2)]) (system-msg state side (:msg async-result)) (effect-completed state side eid)) (continue-ability state :runner runner-trash-installed-sub card nil)))}] @@ -1671,7 +1671,7 @@ "Trash an installed card")]) :async true :effect (req (if (= target "Pay 3 [Credits]") - (wait-for (pay state side (make-eid state eid) card :credit 3) + (wait-for (pay state side (make-eid state eid) card [(->c :credit 3)]) (system-msg state side (:msg async-result)) (effect-completed state side eid)) (continue-ability state :runner runner-trash-installed-sub card nil)))}] @@ -1792,7 +1792,7 @@ "give the runner 1 tag")) :effect (req (if (= "Take 1 tag" target) (gain-tags state :corp eid 1) - (wait-for (pay state side (make-eid state eid) card (->c :credit 4)) + (wait-for (pay state side (make-eid state eid) card [(->c :credit 4)]) (system-msg state side (:msg async-result)) (effect-completed state side eid))))}]}) @@ -2095,7 +2095,7 @@ :effect (req (let [c (str->int target)] (if (can-pay? state side (assoc eid :source card :source-type :subroutine) card (:title card) (->c :credit c)) (let [new-eid (make-eid state {:source card :source-type :subroutine})] - (wait-for (pay state :corp new-eid card (->c :credit c)) + (wait-for (pay state :corp new-eid card [(->c :credit c)]) (system-msg state :corp (:msg async-result)) (continue-ability state side @@ -2383,7 +2383,7 @@ (str "force the runner to " (decapitalize target) " on encountering it"))) :effect (req (if (= target "Take 1 tag") (gain-tags state :runner eid 1) - (wait-for (pay state :runner (make-eid state eid) card (->c :click 1)) + (wait-for (pay state :runner (make-eid state eid) card [(->c :click 1)]) (system-msg state side (:msg async-result)) (effect-completed state :runner eid))))} card nil))} @@ -3310,7 +3310,7 @@ "Pay 3 [Credits]")] :msg (msg "force the Runner to " (decapitalize target)) :effect (req (if (= target "Pay 3 [Credits]") - (wait-for (pay state :runner (make-eid state eid) card (->c :credit 3)) + (wait-for (pay state :runner (make-eid state eid) card [(->c :credit 3)]) (system-msg state :runner (:msg async-result)) (effect-completed state side eid)) (access-card state :runner eid c)))} @@ -4182,7 +4182,7 @@ :async true :effect (req (if (and (= target "Spend [Click]") (can-pay? state :runner eid card nil [(->c :click 1)])) - (wait-for (pay state side (make-eid state eid) card (->c :click 1)) + (wait-for (pay state side (make-eid state eid) card [(->c :click 1)]) (system-msg state side (:msg async-result)) (effect-completed state :runner eid)) (end-run state :corp eid card)))})}) diff --git a/src/clj/game/cards/identities.clj b/src/clj/game/cards/identities.clj index 44535fb664..f021beaaa9 100644 --- a/src/clj/game/cards/identities.clj +++ b/src/clj/game/cards/identities.clj @@ -1298,14 +1298,13 @@ :abilities [mm-ability mm-clear] :events [{:event :corp-spent-click :async true - :effect (req (let [cid (first target) - ability-idx (:ability-idx (:source-info eid)) + :effect (req (let [[cid _value ability-idx] targets bac-cid (get-in @state [:corp :basic-action-card :cid]) - cause (if (keyword? (first target)) - (case (first target) + cause (if (keyword? cid) + (case cid :play-instant [bac-cid 3] :corp-click-install [bac-cid 2] - (first target)) ; in clojure there's: (= [1 2 3] '(1 2 3)) + [cid ability-idx]) [cid ability-idx]) prev-actions (get-in card [:special :mm-actions] []) actions (conj prev-actions cause)] @@ -2162,7 +2161,7 @@ (str "force the runner to " (decapitalize target)))) :effect (req (if (= "End the run" target) (end-run state :corp eid card) - (wait-for (pay state :runner (make-eid state eid) card (->c :trash-installed 1)) + (wait-for (pay state :runner (make-eid state eid) card [(->c :trash-installed 1)]) (when-let [payment-str (:msg async-result)] (system-msg state :runner (str payment-str diff --git a/src/clj/game/cards/operations.clj b/src/clj/game/cards/operations.clj index e3d26a3888..6dc3125c57 100644 --- a/src/clj/game/cards/operations.clj +++ b/src/clj/game/cards/operations.clj @@ -1020,7 +1020,7 @@ :effect (req (let [c target] (if (can-pay? state side (assoc eid :source card :source-type :ability) card (:title card) (->c :credit c)) (let [new-eid (make-eid state {:source card :source-type :ability})] - (wait-for (pay state :corp new-eid card (->c :credit c)) + (wait-for (pay state :corp new-eid card [(->c :credit c)]) (when-let [payment-str (:msg async-result)] (system-msg state :corp payment-str)) (continue-ability @@ -1127,7 +1127,7 @@ :card #(and (installed? %) (is-type? % card-type) (not (has-subtype? % "Icebreaker")))} - :effect (req (wait-for (pay state :runner (make-eid state eid) card (->c :credit (* 3 (count targets)))) + :effect (req (wait-for (pay state :runner (make-eid state eid) card [(->c :credit (* 3 (count targets)))]) (system-msg state :runner (str (:msg async-result) " to prevent the trashing of " @@ -2091,7 +2091,7 @@ :effect (req (let [c target] (if (can-pay? state side (assoc eid :source card :source-type :ability) card (:title card) (->c :credit c)) (let [new-eid (make-eid state {:source card :source-type :ability})] - (wait-for (pay state :corp new-eid card (->c :credit c)) + (wait-for (pay state :corp new-eid card [(->c :credit c)]) (when-let [payment-str (:msg async-result)] (system-msg state :corp payment-str)) (continue-ability @@ -2153,7 +2153,7 @@ "Pay 8 [Credits]")]) :async true :effect (req (if (= target "Pay 8 [Credits]") - (wait-for (pay state :runner (make-eid state eid) card (->c :credit 8)) + (wait-for (pay state :runner (make-eid state eid) card [(->c :credit 8)]) (system-msg state :runner (:msg async-result)) (effect-completed state side eid)) (gain-tags state :corp eid 1)))}}) @@ -2927,7 +2927,7 @@ "Pay 4 [Credits]") "Take 1 tag"]) :effect (req (if (= target "Pay 4 [Credits]") - (wait-for (pay state :runner (make-eid state eid) card (->c :credit 4)) + (wait-for (pay state :runner (make-eid state eid) card [(->c :credit 4)]) (system-msg state :runner (:msg async-result)) (effect-completed state side eid)) (gain-tags state :corp eid 1 nil)))}]})) diff --git a/src/clj/game/cards/resources.clj b/src/clj/game/cards/resources.clj index 750010936e..cf50181437 100644 --- a/src/clj/game/cards/resources.clj +++ b/src/clj/game/cards/resources.clj @@ -1370,7 +1370,7 @@ :async true :effect (req (if (= target "Trash Fencer Fueno") (trash state :runner eid card {:cause-card card}) - (pay state :runner eid card (->c :credit 1))))} + (pay state :runner eid card [(->c :credit 1)])))} ;; companion-builder: ability {:req (req (and (pos? (get-counters (get-card state card) :credit)) (:successful run))) @@ -1559,7 +1559,7 @@ "Trash Guru Davinder"]) :effect (req (if (= target "Trash Guru Davinder") (trash state :runner eid card {:cause :runner-ability :cause-card card}) - (pay state :runner eid card (->c :credit 4))))}]))}]}) + (pay state :runner eid card [(->c :credit 4)])))}]))}]}) (defcard "Hades Shard" @@ -1842,10 +1842,10 @@ ;; and having it trashed (all-cards wont find it) ;; also asset that the first-event? fn actually works right... ;; -nbk, mar '24 - (and (resource? (find-cid (first target) all-cards)) + (and (resource? (find-cid target all-cards)) (first-event? state side :runner-spent-click #(resource? - (find-cid (first (first %)) all-cards)))))) + (find-cid (first %) all-cards)))))) :msg "gain [Click]" :effect (effect (add-counter card :power -1) (gain-clicks 1))}]}) @@ -1957,7 +1957,7 @@ (decapitalize target))) :effect (req (if (= target "Trash Lewi Guilherme") (trash state :runner eid card {:cause-card card}) - (pay state :runner eid card (->c :credit 1))))}] + (pay state :runner eid card [(->c :credit 1)])))}] {:flags {:drip-economy true} :static-abilities [(corp-hand-size+ -1)] :events [(assoc ability :event :runner-turn-begins)]})) diff --git a/src/clj/game/cards/upgrades.clj b/src/clj/game/cards/upgrades.clj index 65a63e972f..244ad67207 100644 --- a/src/clj/game/cards/upgrades.clj +++ b/src/clj/game/cards/upgrades.clj @@ -437,7 +437,7 @@ (str "force the Runner to " (decapitalize target)))) :effect (req (if (= target "End the run") (end-run state side eid card) - (wait-for (pay state :runner (make-eid state eid) card (->c :credit cost)) + (wait-for (pay state :runner (make-eid state eid) card [(->c :credit cost)]) (system-msg state :runner (:msg async-result)) (effect-completed state side eid))))}) card nil))}] @@ -779,7 +779,7 @@ (str "force the runner to " (decapitalize target)))) :effect (req (if (= "End the run" target) (end-run state :corp eid card) - (wait-for (pay state :runner (make-eid state eid) card (->c :credit credit-cost)) + (wait-for (pay state :runner (make-eid state eid) card [(->c :credit credit-cost)]) (system-msg state :runner (:msg async-result)) (effect-completed state side eid))))}) card nil))}]}) @@ -1077,12 +1077,12 @@ :effect (req (cond+ [(and (= target "Spend [Click][Click]") (can-pay? state :runner eid card nil [(->c :click 2)])) - (wait-for (pay state side (make-eid state eid) card (->c :click 2)) + (wait-for (pay state side (make-eid state eid) card [(->c :click 2)]) (system-msg state side (:msg async-result)) (effect-completed state :runner eid))] [(and (= target "Pay 5 [Credits]") (can-pay? state :runner eid card nil [(->c :credit 5)])) - (wait-for (pay state side (make-eid state eid) card (->c :credit 5)) + (wait-for (pay state side (make-eid state eid) card [(->c :credit 5)]) (system-msg state side (:msg async-result)) (effect-completed state :runner eid))] [:else @@ -1716,7 +1716,7 @@ {:async true :msg "do 1 core damage instead of net damage" :effect (req (swap! state update :damage dissoc :damage-replace :defer-damage) - (wait-for (pay state :corp (make-eid state eid) card (->c :credit 2)) + (wait-for (pay state :corp (make-eid state eid) card [(->c :credit 2)]) (system-msg state side (:msg async-result)) (wait-for (damage state side :brain 1 {:card card}) (swap! state assoc-in [:damage :damage-replace] true) diff --git a/src/clj/game/core/access.clj b/src/clj/game/core/access.clj index 3ebbb1c299..9ecee4a2c7 100644 --- a/src/clj/game/core/access.clj +++ b/src/clj/game/core/access.clj @@ -247,10 +247,10 @@ ;; Pay additiional costs to steal (= target "Pay to steal") (wait-for (pay state side (make-eid state - (assoc eid :additional-costs cost - :source card - :source-type :runner-steal)) - nil cost {:action :steal-cost}) + (assoc eid :additional-costs cost + :source card + :source-type :runner-steal)) + nil {:action :steal-cost} cost) (system-msg state side (str (:msg async-result) " to steal " (:title card) " from " (name-zone :corp (get-zone card)))) diff --git a/src/clj/game/core/actions.clj b/src/clj/game/core/actions.clj index 701e75ee2c..140aa7faf3 100644 --- a/src/clj/game/core/actions.clj +++ b/src/clj/game/core/actions.clj @@ -136,7 +136,7 @@ (defn- maybe-pay [state side eid card choices choice] (if (= choices :credit) - (pay state side eid card (->c :credit (min choice (get-in @state [side :credit])))) + (pay state side eid card [(->c :credit (min choice (get-in @state [side :credit])))]) (effect-completed state side eid))) (defn resolve-prompt @@ -565,9 +565,9 @@ eid (eid-set-defaults eid :source nil :source-type :advance)] (if (can-advance? state side card) (wait-for (pay state side (make-eid state eid) card - (->c :click (if-not no-cost 1 0)) - (->c :credit (if-not no-cost 1 0)) - {:action :corp-advance}) + {:action :corp-advance} + [(->c :click (if-not no-cost 1 0)) + (->c :credit (if-not no-cost 1 0))]) (if-let [payment-str (:msg async-result)] (do (system-msg state side (str (build-spend-msg payment-str "advance") (card-str state card))) (update-advancement-requirement state card) @@ -612,7 +612,10 @@ (string/blank? cost-strs) (resolve-score state side eid card) (not can-pay) (effect-completed state side eid) :else (wait-for (pay state side (make-eid state - (assoc eid :additional-costs cost :source card :source-type :corp-score)) + (assoc eid + :additional-costs cost + :source card + :source-type :corp-score)) nil cost) (let [payment-result async-result] (if (string/blank? (:msg payment-result)) diff --git a/src/clj/game/core/costs.clj b/src/clj/game/core/costs.clj index ebcfc10306..e781ff42e3 100644 --- a/src/clj/game/core/costs.clj +++ b/src/clj/game/core/costs.clj @@ -32,9 +32,9 @@ [cost state side _ _] (<= 0 (- (get-in @state [side :click]) (value cost)))) (defmethod handler :click - [cost state side eid card actions] - (let [a (keep :action actions)] - (when (not (some #{:steal-cost} a)) + [cost state side eid card action] + (let [a (:action action)] + (when (not (#{:steal-cost} a)) (swap! state update :click-states (fn [click-states] (vec (take-last 4 (conj click-states (dissoc @state :log :history))))))) (swap! state update-in [:stats side :lose :click] (fnil + 0) (value cost)) @@ -63,7 +63,7 @@ [cost state side _ _] (<= 0 (- (get-in @state [side :click]) (value cost)))) (defmethod handler :lose-click - [cost state side eid card actions] + [cost state side eid card action] (swap! state update-in [:stats side :lose :click] (fnil + 0) (value cost)) (deduct state side [:click (value cost)]) (wait-for (trigger-event-sync state side (make-eid state eid) @@ -131,7 +131,7 @@ (or (<= 0 (- (get-in @state [side :credit]) (value cost))) (<= 0 (- (total-available-credits state side eid card) (value cost)))))) (defmethod handler :credit - [cost state side eid card actions] + [cost state side eid card action] (let [provider-func #(eligible-pay-credit-cards state side eid card)] (cond (and (pos? (value cost)) @@ -173,7 +173,7 @@ (and (pos? (total-available-credits state side eid card)) (<= (stealth-value cost) (total-available-stealth-credits state side eid card)))) (defmethod handler :x-credits - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:async true @@ -216,7 +216,7 @@ [cost state side eid card] (in-hand? (get-card state card))) (defmethod handler :expend - [cost state side eid card actions] + [cost state side eid card action] (wait-for (reveal state :corp (make-eid state eid) [card]) (wait-for (trash state :corp (make-eid state eid) (assoc (get-card state card) :seen true)) @@ -233,7 +233,7 @@ [cost state side eid card] (installed? (get-card state card))) (defmethod handler :trash-can - [cost state side eid card actions] + [cost state side eid card action] (wait-for (trash state side card {:cause :ability-cost :unpreventable true}) (complete-with-result state side eid {:msg (str "trashes " (:title card)) @@ -299,7 +299,7 @@ [_ _ _ _ _] true) (defmethod handler :gain-tag - [cost state side eid card actions] + [cost state side eid card action] (wait-for (gain-tags state side (value cost)) (complete-with-result state side eid {:msg (str "takes " (quantify (value cost) "tag")) :type :gain-tag @@ -312,7 +312,7 @@ [cost state side eid card] (<= 0 (- (get-in @state [:runner :tag :base] 0) (value cost)))) (defmethod handler :tag - [cost state side eid card actions] + [cost state side eid card action] (wait-for (lose-tags state side (value cost)) (complete-with-result state side eid {:msg (str "removes " (quantify (value cost) "tag")) :type :tag @@ -325,7 +325,7 @@ [cost state side eid card] true) (defmethod handler :tag-or-bad-pub - [cost state side eid card actions] + [cost state side eid card action] (if-not (<= 0 (- (get-in @state [:runner :tag :base] 0) (value cost))) (wait-for (gain-bad-publicity state side (make-eid state eid) (value cost) nil) (complete-with-result state side eid {:msg (str "gains " (value cost) " bad publicity") @@ -355,7 +355,7 @@ [cost state side eid card] (active? (get-card state card))) (defmethod handler :return-to-hand - [cost state side eid card actions] + [cost state side eid card action] (move state side card :hand) (complete-with-result state side eid @@ -372,7 +372,7 @@ [cost state side eid card] (active? (get-card state card))) (defmethod handler :remove-from-game - [cost state side eid card actions] + [cost state side eid card action] (move state side card :rfg) (complete-with-result state side eid @@ -390,7 +390,7 @@ [cost state side eid card] (<= 0 (- (count (all-installed-runner-type state :program)) (value cost)))) (defmethod handler :rfg-program - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "program") @@ -419,7 +419,7 @@ [cost state side eid card] (<= 0 (- (count (filter #(not (same-card? card %)) (all-installed state side))) (value cost)))) (defmethod handler :trash-other-installed - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "installed card") " to trash") @@ -450,7 +450,7 @@ [cost state side eid card] (<= 0 (- (count (all-installed state side)) (value cost)))) (defmethod handler :trash-installed - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "installed card") " to trash") @@ -480,7 +480,7 @@ [cost state side eid card] (<= 0 (- (count (all-installed-runner-type state :hardware)) (value cost)))) (defmethod handler :hardware - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "installed piece") " of hardware to trash") @@ -511,7 +511,7 @@ (not (same-card? card %))) (all-active-installed state :corp))) (value cost)))) (defmethod handler :derez-other-harmonic - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:prompt (str "Choose " (value cost) " Harmonic ice to derez") @@ -540,7 +540,7 @@ [cost state side eid card] (<= 0 (- (count (all-installed-runner-type state :program)) (value cost)))) (defmethod handler :program - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "installed program") " to trash") @@ -567,7 +567,7 @@ [cost state side eid card] (<= 0 (- (count (all-installed-runner-type state :resource)) (value cost)))) (defmethod handler :resource - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "installed resource") " to trash") @@ -594,7 +594,7 @@ [cost state side eid card] (<= 0 (- (count (filter #(has-subtype? % "Connection") (all-active-installed state :runner))) (value cost)))) (defmethod handler :connection - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "installed connection resource") " to trash") @@ -624,7 +624,7 @@ [cost state side eid card] (<= 0 (- (count (filter (every-pred installed? rezzed? ice?) (all-installed state :corp))) (value cost)))) (defmethod handler :ice - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "installed rezzed ice" "") " to trash") @@ -651,7 +651,7 @@ [cost state side eid card] (<= 0 (- (count (get-in @state [side :deck])) (value cost)))) (defmethod handler :trash-from-deck - [cost state side eid card actions] + [cost state side eid card action] (wait-for (mill state side side (value cost)) (complete-with-result state side eid @@ -670,7 +670,7 @@ [cost state side eid card] (<= 0 (- (count (get-in @state [side :hand])) (value cost)))) (defmethod handler :trash-from-hand - [cost state side eid card actions] + [cost state side eid card action] (let [select-fn #(and ((if (= :corp side) corp? runner?) %) (in-hand? %)) prompt-hand (if (= :corp side) "HQ" "the grip") @@ -703,7 +703,7 @@ [cost state side eid card] (<= 0 (- (count (get-in @state [side :hand])) (value cost)))) (defmethod handler :randomly-trash-from-hand - [cost state side eid card actions] + [cost state side eid card action] (wait-for (discard-from-hand state side side (value cost)) (complete-with-result state side eid @@ -720,7 +720,7 @@ (defmethod payable? :trash-entire-hand [cost state side eid card] true) (defmethod handler :trash-entire-hand - [cost state side eid card actions] + [cost state side eid card action] (let [cards (get-in @state [side :hand])] (wait-for (trash-cards state side cards {:unpreventable true}) (complete-with-result @@ -742,7 +742,7 @@ [cost state side eid card] (<= 0 (- (count (filter hardware? (get-in @state [:runner :hand]))) (value cost)))) (defmethod handler :trash-hardware-from-hand - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "piece") " of hardware to trash") @@ -770,7 +770,7 @@ [cost state side eid card] (<= 0 (- (count (filter program? (get-in @state [:runner :hand]))) (value cost)))) (defmethod handler :trash-program-from-hand - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "program") " to trash") @@ -797,7 +797,7 @@ [cost state side eid card] (<= 0 (- (count (filter resource? (get-in @state [:runner :hand]))) (value cost)))) (defmethod handler :trash-resource-from-hand - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "resource") " to trash") @@ -823,7 +823,7 @@ [cost state side eid card] (<= (value cost) (count (get-in @state [:runner :hand])))) (defmethod handler :net - [cost state side eid card actions] + [cost state side eid card action] (wait-for (damage state side :net (value cost) {:unpreventable true :card card}) (complete-with-result state side eid @@ -839,7 +839,7 @@ [cost state side eid card] (<= (value cost) (count (get-in @state [:runner :hand])))) (defmethod handler :meat - [cost state side eid card actions] + [cost state side eid card action] (wait-for (damage state side :meat (value cost) {:unpreventable true :card card}) (complete-with-result state side eid @@ -855,7 +855,7 @@ [cost state side eid card] (<= (value cost) (count (get-in @state [:runner :hand])))) (defmethod handler :brain - [cost state side eid card actions] + [cost state side eid card action] (wait-for (damage state side :brain (value cost) {:unpreventable true :card card}) (complete-with-result state side eid @@ -872,7 +872,7 @@ [cost state side eid card] (<= 0 (- (count (all-installed state side)) (value cost)))) (defmethod handler :shuffle-installed-to-stack - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state :runner {:prompt (str "Choose " (quantify (value cost) "installed card") @@ -901,7 +901,7 @@ [cost state side eid card] (<= 0 (- (count (all-installed state side)) (value cost)))) (defmethod handler :add-installed-to-bottom-of-deck - [cost state side eid card actions] + [cost state side eid card action] (let [deck (if (= :corp side) "R&D" "the stack")] (continue-ability state side @@ -930,7 +930,7 @@ [cost state side eid card] (<= (value cost) (count (get-in @state [side :hand])))) (defmethod handler :add-random-from-hand-to-bottom-of-deck - [cost state side eid card actions] + [cost state side eid card action] (let [deck (if (= :corp side) "R&D" "the stack") hand (get-in @state [side :hand]) chosen (take (value cost) (shuffle hand))] @@ -951,7 +951,7 @@ [cost state side eid card] (<= 0 (- (reduce + (map #(get-counters % :agenda) (get-in @state [:corp :scored]))) (value cost)))) (defmethod handler :any-agenda-counter - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:prompt "Choose an agenda with a counter" @@ -979,7 +979,7 @@ [cost state side eid card] (<= 0 (- (number-of-virus-counters state) (value cost)))) (defmethod handler :any-virus-counter - [cost state side eid card actions] + [cost state side eid card action] (wait-for (resolve-ability state side (pick-virus-counters-to-spend (value cost)) card nil) (complete-with-result state side eid @@ -998,7 +998,7 @@ [cost state side eid card] (<= 0 (- (get-counters card :advancement) (value cost)))) (defmethod handler :advancement - [cost state side eid card actions] + [cost state side eid card action] (let [title (:title card) card (update! state side (update card :advance-counter - (value cost)))] (wait-for (trigger-event-sync state side :counter-added card) @@ -1020,7 +1020,7 @@ [cost state side eid card] (<= 0 (- (get-counters card :agenda) (value cost)))) (defmethod handler :agenda - [cost state side eid card actions] + [cost state side eid card action] (let [title (:title card) card (update! state side (update-in card [:counter :agenda] - (value cost)))] (wait-for (trigger-event-sync state side :agenda-counter-spent card) @@ -1042,7 +1042,7 @@ [cost state side eid card] (<= 0 (- (get-counters card :power) (value cost)))) (defmethod handler :power - [cost state side eid card actions] + [cost state side eid card action] (let [title (:title card) card (update! state side (update-in card [:counter :power] - (value cost)))] (wait-for (trigger-event-sync state side :counter-added card) @@ -1061,7 +1061,7 @@ [cost state side eid card] (pos? (get-counters card :power))) (defmethod handler :x-power - [cost state side eid card actions] + [cost state side eid card action] (continue-ability state side {:async true @@ -1096,7 +1096,7 @@ (reduce +))) (value cost)))) (defmethod handler :virus - [cost state side eid card actions] + [cost state side eid card action] (if (pos? (->> (all-active-installed state :runner) (filter #(= "Hivemind" (:title %))) (keep #(get-counters % :virus)) diff --git a/src/clj/game/core/engine.clj b/src/clj/game/core/engine.clj index 2908e6b58c..be5a7888e1 100644 --- a/src/clj/game/core/engine.clj +++ b/src/clj/game/core/engine.clj @@ -396,7 +396,7 @@ waiting-prompt))})) (if (seq cost) ;; Ensure that any costs can be paid - (wait-for (pay state side (make-eid state eid) card cost {:action (:cid card)}) + (wait-for (pay state side (make-eid state eid) card {:action (:cid card)} cost) (if (:cost-paid async-result) ;; If the cost can be and is paid, perform the ablity (do-paid-ability state side ability card targets async-result) @@ -1146,27 +1146,25 @@ (pay-next state side eid (rest costs) card actions (conj msgs async-result))))) (defn pay - "Same as pay, but awaitable." - [state side eid card & args] - (let [args (flatten args) - raw-costs (filter :cost/type args) - actions (remove :cost/type args) - costs (can-pay? state side eid card (:title card) raw-costs)] - (when (some keyword? args) - (throw (ex-info "Please convert to wrapped cost" {:args args}))) - (if (nil? costs) - (complete-with-result state side eid nil) - (wait-for (pay-next state side (make-eid state eid) costs card actions []) - (let [payment-result async-result] - (wait-for (checkpoint state nil (make-eid state eid) nil) - (complete-with-result - state side eid - {:msg (->> payment-result - (keep :msg) - enumerate-str) - :cost-paid (->> payment-result - (keep #(not-empty (select-keys % [:type :targets :value]))) - (reduce - (fn [acc cost] - (assoc acc (:type cost) cost)) - {}))}))))))) + ([state side eid card costs] (pay state side eid card nil costs)) + ([state side eid card actions costs] + (let [costs (flatten [costs]) + costs (can-pay? state side eid card (:title card) costs)] + (when (some keyword? costs) + (throw (ex-info "Please convert to wrapped cost" {:args costs}))) + (if (nil? costs) + (complete-with-result state side eid nil) + (wait-for (pay-next state side (make-eid state eid) costs card actions []) + (let [payment-result async-result] + (wait-for (checkpoint state nil (make-eid state eid) nil) + (complete-with-result + state side eid + {:msg (->> payment-result + (keep :msg) + enumerate-str) + :cost-paid (->> payment-result + (keep #(not-empty (select-keys % [:type :targets :value]))) + (reduce + (fn [acc cost] + (assoc acc (:type cost) cost)) + {}))})))))))) diff --git a/src/clj/game/core/installing.clj b/src/clj/game/core/installing.clj index 658771556e..58873a9df6 100644 --- a/src/clj/game/core/installing.clj +++ b/src/clj/game/core/installing.clj @@ -248,7 +248,7 @@ costs (conj costs (->c :credit (- 0 appldisc)))] ;; get a functional discount and apply it to (if (corp-can-pay-and-install? state side eid card server (assoc args :cached-costs costs)) - (wait-for (pay state side (make-eid state eid) card costs {:action action}) + (wait-for (pay state side (make-eid state eid) card {:action action} costs) (if-let [payment-str (:msg async-result)] (if (= server "New remote") (wait-for (trigger-event-simult state side :server-created nil card) diff --git a/src/clj/game/core/play_instants.clj b/src/clj/game/core/play_instants.clj index 5090b6407a..4da79e723e 100644 --- a/src/clj/game/core/play_instants.clj +++ b/src/clj/game/core/play_instants.clj @@ -134,7 +134,7 @@ ;; Only mark the register once costs have been paid and card has been moved (when (has-subtype? card "Run") (swap! state assoc-in [:runner :register :click-type] :run)) - (wait-for (pay state side (make-eid state eid) moved-card costs {:action :play-instant}) + (wait-for (pay state side (make-eid state eid) moved-card {:action :play-instant} costs) (let [payment-str (:msg async-result) cost-paid (merge-costs-paid (:cost-paid eid) (:cost-paid async-result))] (if payment-str diff --git a/src/clj/game/core/psi.clj b/src/clj/game/core/psi.clj index 1b90fce875..5120905bbc 100644 --- a/src/clj/game/core/psi.clj +++ b/src/clj/game/core/psi.clj @@ -23,7 +23,7 @@ (pay state opponent (make-eid state eid) card [(->c :credit opponent-bet)]) (system-msg state opponent (:msg async-result)) (wait-for - (pay state side (make-eid state eid) card (->c :credit bet)) + (pay state side (make-eid state eid) card [(->c :credit bet)]) (system-msg state side (:msg async-result)) (clear-wait-prompt state opponent) (wait-for (trigger-event-simult state side (make-eid state eid) :reveal-spent-credits nil (get-in @state [:psi :corp]) (get-in @state [:psi :runner])) From dadc0218023028e2c008bff1d67d11a240b30524 Mon Sep 17 00:00:00 2001 From: Noah Bogart Date: Wed, 3 Apr 2024 21:58:47 -0400 Subject: [PATCH 2/4] Update clj-kondo config --- .clj-kondo/config.edn | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.clj-kondo/config.edn b/.clj-kondo/config.edn index d1be9c79fd..5ee520e29e 100644 --- a/.clj-kondo/config.edn +++ b/.clj-kondo/config.edn @@ -1,5 +1,7 @@ {:linters - {:unresolved-symbol + {:unused-binding {:exclude-defmulti-args true + :exclude-destructured-as true} + :unresolved-symbol {:exclude [(game.macros/req [state side eid card targets target context runner corp run run-server run-ices run-position current-ice corp-reg corp-reg-last runner-reg From a6aec16fe0a2ea66f31a0744d4552d34f78db7c9 Mon Sep 17 00:00:00 2001 From: Noah Bogart Date: Wed, 3 Apr 2024 22:37:25 -0400 Subject: [PATCH 3/4] Move pay :action to eid --- src/clj/game/core/access.clj | 12 ++-- src/clj/game/core/actions.clj | 5 +- src/clj/game/core/costs.clj | 86 ++++++++++++++--------------- src/clj/game/core/engine.clj | 51 +++++++++-------- src/clj/game/core/installing.clj | 2 +- src/clj/game/core/payment.clj | 6 +- src/clj/game/core/play_instants.clj | 2 +- 7 files changed, 84 insertions(+), 80 deletions(-) diff --git a/src/clj/game/core/access.clj b/src/clj/game/core/access.clj index 9ecee4a2c7..d4ab8be290 100644 --- a/src/clj/game/core/access.clj +++ b/src/clj/game/core/access.clj @@ -246,11 +246,13 @@ ;; Pay additiional costs to steal (= target "Pay to steal") - (wait-for (pay state side (make-eid state - (assoc eid :additional-costs cost - :source card - :source-type :runner-steal)) - nil {:action :steal-cost} cost) + (wait-for (pay state side + (make-eid state + (assoc eid :additional-costs cost + :source card + :source-type :runner-steal + :action :steal-cost)) + nil cost) (system-msg state side (str (:msg async-result) " to steal " (:title card) " from " (name-zone :corp (get-zone card)))) diff --git a/src/clj/game/core/actions.clj b/src/clj/game/core/actions.clj index 140aa7faf3..586968292b 100644 --- a/src/clj/game/core/actions.clj +++ b/src/clj/game/core/actions.clj @@ -564,8 +564,9 @@ (let [card (get-card state card) eid (eid-set-defaults eid :source nil :source-type :advance)] (if (can-advance? state side card) - (wait-for (pay state side (make-eid state eid) card - {:action :corp-advance} + (wait-for (pay state side + (make-eid state (assoc eid :action :corp-advance)) + card [(->c :click (if-not no-cost 1 0)) (->c :credit (if-not no-cost 1 0))]) (if-let [payment-str (:msg async-result)] diff --git a/src/clj/game/core/costs.clj b/src/clj/game/core/costs.clj index e781ff42e3..64178e9111 100644 --- a/src/clj/game/core/costs.clj +++ b/src/clj/game/core/costs.clj @@ -32,8 +32,8 @@ [cost state side _ _] (<= 0 (- (get-in @state [side :click]) (value cost)))) (defmethod handler :click - [cost state side eid card action] - (let [a (:action action)] + [cost state side eid _card] + (let [a (:action eid)] (when (not (#{:steal-cost} a)) (swap! state update :click-states (fn [click-states] (vec (take-last 4 (conj click-states (dissoc @state :log :history))))))) @@ -63,7 +63,7 @@ [cost state side _ _] (<= 0 (- (get-in @state [side :click]) (value cost)))) (defmethod handler :lose-click - [cost state side eid card action] + [cost state side eid card] (swap! state update-in [:stats side :lose :click] (fnil + 0) (value cost)) (deduct state side [:click (value cost)]) (wait-for (trigger-event-sync state side (make-eid state eid) @@ -131,7 +131,7 @@ (or (<= 0 (- (get-in @state [side :credit]) (value cost))) (<= 0 (- (total-available-credits state side eid card) (value cost)))))) (defmethod handler :credit - [cost state side eid card action] + [cost state side eid card] (let [provider-func #(eligible-pay-credit-cards state side eid card)] (cond (and (pos? (value cost)) @@ -173,7 +173,7 @@ (and (pos? (total-available-credits state side eid card)) (<= (stealth-value cost) (total-available-stealth-credits state side eid card)))) (defmethod handler :x-credits - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:async true @@ -216,7 +216,7 @@ [cost state side eid card] (in-hand? (get-card state card))) (defmethod handler :expend - [cost state side eid card action] + [cost state side eid card] (wait-for (reveal state :corp (make-eid state eid) [card]) (wait-for (trash state :corp (make-eid state eid) (assoc (get-card state card) :seen true)) @@ -233,7 +233,7 @@ [cost state side eid card] (installed? (get-card state card))) (defmethod handler :trash-can - [cost state side eid card action] + [cost state side eid card] (wait-for (trash state side card {:cause :ability-cost :unpreventable true}) (complete-with-result state side eid {:msg (str "trashes " (:title card)) @@ -248,7 +248,7 @@ [cost state side _eid _card] (<= 0 (- (count (get-in @state [side :scored])) (value cost)))) (defmethod handler :forfeit - [cost state side eid card _actions] + [cost state side eid card] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "Agenda") " to forfeit") @@ -280,7 +280,7 @@ [_cost state side _eid card] (is-scored? state side (get-card state card))) (defmethod handler :forfeit-self - [_cost state side eid card _actions] + [_cost state side eid card] (wait-for (forfeit state side (make-eid state eid) card {:msg false}) (complete-with-result state side eid @@ -299,7 +299,7 @@ [_ _ _ _ _] true) (defmethod handler :gain-tag - [cost state side eid card action] + [cost state side eid card] (wait-for (gain-tags state side (value cost)) (complete-with-result state side eid {:msg (str "takes " (quantify (value cost) "tag")) :type :gain-tag @@ -312,7 +312,7 @@ [cost state side eid card] (<= 0 (- (get-in @state [:runner :tag :base] 0) (value cost)))) (defmethod handler :tag - [cost state side eid card action] + [cost state side eid card] (wait-for (lose-tags state side (value cost)) (complete-with-result state side eid {:msg (str "removes " (quantify (value cost) "tag")) :type :tag @@ -325,7 +325,7 @@ [cost state side eid card] true) (defmethod handler :tag-or-bad-pub - [cost state side eid card action] + [cost state side eid card] (if-not (<= 0 (- (get-in @state [:runner :tag :base] 0) (value cost))) (wait-for (gain-bad-publicity state side (make-eid state eid) (value cost) nil) (complete-with-result state side eid {:msg (str "gains " (value cost) " bad publicity") @@ -355,7 +355,7 @@ [cost state side eid card] (active? (get-card state card))) (defmethod handler :return-to-hand - [cost state side eid card action] + [cost state side eid card] (move state side card :hand) (complete-with-result state side eid @@ -372,7 +372,7 @@ [cost state side eid card] (active? (get-card state card))) (defmethod handler :remove-from-game - [cost state side eid card action] + [cost state side eid card] (move state side card :rfg) (complete-with-result state side eid @@ -390,7 +390,7 @@ [cost state side eid card] (<= 0 (- (count (all-installed-runner-type state :program)) (value cost)))) (defmethod handler :rfg-program - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "program") @@ -419,7 +419,7 @@ [cost state side eid card] (<= 0 (- (count (filter #(not (same-card? card %)) (all-installed state side))) (value cost)))) (defmethod handler :trash-other-installed - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "installed card") " to trash") @@ -450,7 +450,7 @@ [cost state side eid card] (<= 0 (- (count (all-installed state side)) (value cost)))) (defmethod handler :trash-installed - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "installed card") " to trash") @@ -480,7 +480,7 @@ [cost state side eid card] (<= 0 (- (count (all-installed-runner-type state :hardware)) (value cost)))) (defmethod handler :hardware - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "installed piece") " of hardware to trash") @@ -511,7 +511,7 @@ (not (same-card? card %))) (all-active-installed state :corp))) (value cost)))) (defmethod handler :derez-other-harmonic - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:prompt (str "Choose " (value cost) " Harmonic ice to derez") @@ -540,7 +540,7 @@ [cost state side eid card] (<= 0 (- (count (all-installed-runner-type state :program)) (value cost)))) (defmethod handler :program - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "installed program") " to trash") @@ -567,7 +567,7 @@ [cost state side eid card] (<= 0 (- (count (all-installed-runner-type state :resource)) (value cost)))) (defmethod handler :resource - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "installed resource") " to trash") @@ -594,7 +594,7 @@ [cost state side eid card] (<= 0 (- (count (filter #(has-subtype? % "Connection") (all-active-installed state :runner))) (value cost)))) (defmethod handler :connection - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "installed connection resource") " to trash") @@ -624,7 +624,7 @@ [cost state side eid card] (<= 0 (- (count (filter (every-pred installed? rezzed? ice?) (all-installed state :corp))) (value cost)))) (defmethod handler :ice - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "installed rezzed ice" "") " to trash") @@ -651,7 +651,7 @@ [cost state side eid card] (<= 0 (- (count (get-in @state [side :deck])) (value cost)))) (defmethod handler :trash-from-deck - [cost state side eid card action] + [cost state side eid card] (wait-for (mill state side side (value cost)) (complete-with-result state side eid @@ -670,7 +670,7 @@ [cost state side eid card] (<= 0 (- (count (get-in @state [side :hand])) (value cost)))) (defmethod handler :trash-from-hand - [cost state side eid card action] + [cost state side eid card] (let [select-fn #(and ((if (= :corp side) corp? runner?) %) (in-hand? %)) prompt-hand (if (= :corp side) "HQ" "the grip") @@ -703,7 +703,7 @@ [cost state side eid card] (<= 0 (- (count (get-in @state [side :hand])) (value cost)))) (defmethod handler :randomly-trash-from-hand - [cost state side eid card action] + [cost state side eid card] (wait-for (discard-from-hand state side side (value cost)) (complete-with-result state side eid @@ -720,7 +720,7 @@ (defmethod payable? :trash-entire-hand [cost state side eid card] true) (defmethod handler :trash-entire-hand - [cost state side eid card action] + [cost state side eid card] (let [cards (get-in @state [side :hand])] (wait-for (trash-cards state side cards {:unpreventable true}) (complete-with-result @@ -742,7 +742,7 @@ [cost state side eid card] (<= 0 (- (count (filter hardware? (get-in @state [:runner :hand]))) (value cost)))) (defmethod handler :trash-hardware-from-hand - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "piece") " of hardware to trash") @@ -770,7 +770,7 @@ [cost state side eid card] (<= 0 (- (count (filter program? (get-in @state [:runner :hand]))) (value cost)))) (defmethod handler :trash-program-from-hand - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "program") " to trash") @@ -797,7 +797,7 @@ [cost state side eid card] (<= 0 (- (count (filter resource? (get-in @state [:runner :hand]))) (value cost)))) (defmethod handler :trash-resource-from-hand - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:prompt (str "Choose " (quantify (value cost) "resource") " to trash") @@ -823,7 +823,7 @@ [cost state side eid card] (<= (value cost) (count (get-in @state [:runner :hand])))) (defmethod handler :net - [cost state side eid card action] + [cost state side eid card] (wait-for (damage state side :net (value cost) {:unpreventable true :card card}) (complete-with-result state side eid @@ -839,7 +839,7 @@ [cost state side eid card] (<= (value cost) (count (get-in @state [:runner :hand])))) (defmethod handler :meat - [cost state side eid card action] + [cost state side eid card] (wait-for (damage state side :meat (value cost) {:unpreventable true :card card}) (complete-with-result state side eid @@ -855,7 +855,7 @@ [cost state side eid card] (<= (value cost) (count (get-in @state [:runner :hand])))) (defmethod handler :brain - [cost state side eid card action] + [cost state side eid card] (wait-for (damage state side :brain (value cost) {:unpreventable true :card card}) (complete-with-result state side eid @@ -872,7 +872,7 @@ [cost state side eid card] (<= 0 (- (count (all-installed state side)) (value cost)))) (defmethod handler :shuffle-installed-to-stack - [cost state side eid card action] + [cost state side eid card] (continue-ability state :runner {:prompt (str "Choose " (quantify (value cost) "installed card") @@ -901,7 +901,7 @@ [cost state side eid card] (<= 0 (- (count (all-installed state side)) (value cost)))) (defmethod handler :add-installed-to-bottom-of-deck - [cost state side eid card action] + [cost state side eid card] (let [deck (if (= :corp side) "R&D" "the stack")] (continue-ability state side @@ -930,7 +930,7 @@ [cost state side eid card] (<= (value cost) (count (get-in @state [side :hand])))) (defmethod handler :add-random-from-hand-to-bottom-of-deck - [cost state side eid card action] + [cost state side eid card] (let [deck (if (= :corp side) "R&D" "the stack") hand (get-in @state [side :hand]) chosen (take (value cost) (shuffle hand))] @@ -951,7 +951,7 @@ [cost state side eid card] (<= 0 (- (reduce + (map #(get-counters % :agenda) (get-in @state [:corp :scored]))) (value cost)))) (defmethod handler :any-agenda-counter - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:prompt "Choose an agenda with a counter" @@ -979,7 +979,7 @@ [cost state side eid card] (<= 0 (- (number-of-virus-counters state) (value cost)))) (defmethod handler :any-virus-counter - [cost state side eid card action] + [cost state side eid card] (wait-for (resolve-ability state side (pick-virus-counters-to-spend (value cost)) card nil) (complete-with-result state side eid @@ -998,7 +998,7 @@ [cost state side eid card] (<= 0 (- (get-counters card :advancement) (value cost)))) (defmethod handler :advancement - [cost state side eid card action] + [cost state side eid card] (let [title (:title card) card (update! state side (update card :advance-counter - (value cost)))] (wait-for (trigger-event-sync state side :counter-added card) @@ -1020,7 +1020,7 @@ [cost state side eid card] (<= 0 (- (get-counters card :agenda) (value cost)))) (defmethod handler :agenda - [cost state side eid card action] + [cost state side eid card] (let [title (:title card) card (update! state side (update-in card [:counter :agenda] - (value cost)))] (wait-for (trigger-event-sync state side :agenda-counter-spent card) @@ -1042,7 +1042,7 @@ [cost state side eid card] (<= 0 (- (get-counters card :power) (value cost)))) (defmethod handler :power - [cost state side eid card action] + [cost state side eid card] (let [title (:title card) card (update! state side (update-in card [:counter :power] - (value cost)))] (wait-for (trigger-event-sync state side :counter-added card) @@ -1061,7 +1061,7 @@ [cost state side eid card] (pos? (get-counters card :power))) (defmethod handler :x-power - [cost state side eid card action] + [cost state side eid card] (continue-ability state side {:async true @@ -1096,7 +1096,7 @@ (reduce +))) (value cost)))) (defmethod handler :virus - [cost state side eid card action] + [cost state side eid card] (if (pos? (->> (all-active-installed state :runner) (filter #(= "Hivemind" (:title %))) (keep #(get-counters % :virus)) diff --git a/src/clj/game/core/engine.clj b/src/clj/game/core/engine.clj index be5a7888e1..bbf418d43b 100644 --- a/src/clj/game/core/engine.clj +++ b/src/clj/game/core/engine.clj @@ -396,7 +396,7 @@ waiting-prompt))})) (if (seq cost) ;; Ensure that any costs can be paid - (wait-for (pay state side (make-eid state eid) card {:action (:cid card)} cost) + (wait-for (pay state side (make-eid state (assoc eid :action (:cid card))) card cost) (if (:cost-paid async-result) ;; If the cost can be and is paid, perform the ablity (do-paid-ability state side ability card targets async-result) @@ -1139,32 +1139,31 @@ ;; PAYMENT (defn- pay-next - [state side eid costs card actions msgs] + [state side eid costs card msgs] (if (empty? costs) (complete-with-result state side eid msgs) - (wait-for (handler (first costs) state side (make-eid state eid) card actions) - (pay-next state side eid (rest costs) card actions (conj msgs async-result))))) + (wait-for (handler (first costs) state side (make-eid state eid) card) + (pay-next state side eid (rest costs) card (conj msgs async-result))))) (defn pay - ([state side eid card costs] (pay state side eid card nil costs)) - ([state side eid card actions costs] - (let [costs (flatten [costs]) - costs (can-pay? state side eid card (:title card) costs)] - (when (some keyword? costs) - (throw (ex-info "Please convert to wrapped cost" {:args costs}))) - (if (nil? costs) - (complete-with-result state side eid nil) - (wait-for (pay-next state side (make-eid state eid) costs card actions []) - (let [payment-result async-result] - (wait-for (checkpoint state nil (make-eid state eid) nil) - (complete-with-result - state side eid - {:msg (->> payment-result - (keep :msg) - enumerate-str) - :cost-paid (->> payment-result - (keep #(not-empty (select-keys % [:type :targets :value]))) - (reduce - (fn [acc cost] - (assoc acc (:type cost) cost)) - {}))})))))))) + [state side eid card costs] + (let [costs (flatten [costs]) + costs (can-pay? state side eid card (:title card) costs)] + (when (some keyword? costs) + (throw (ex-info "Please convert to wrapped cost" {:args costs}))) + (if (nil? costs) + (complete-with-result state side eid nil) + (wait-for (pay-next state side (make-eid state eid) costs card []) + (let [payment-result async-result] + (wait-for (checkpoint state nil (make-eid state eid) nil) + (complete-with-result + state side eid + {:msg (->> payment-result + (keep :msg) + enumerate-str) + :cost-paid (->> payment-result + (keep #(not-empty (select-keys % [:type :targets :value]))) + (reduce + (fn [acc cost] + (assoc acc (:type cost) cost)) + {}))}))))))) diff --git a/src/clj/game/core/installing.clj b/src/clj/game/core/installing.clj index 58873a9df6..83a91ce275 100644 --- a/src/clj/game/core/installing.clj +++ b/src/clj/game/core/installing.clj @@ -248,7 +248,7 @@ costs (conj costs (->c :credit (- 0 appldisc)))] ;; get a functional discount and apply it to (if (corp-can-pay-and-install? state side eid card server (assoc args :cached-costs costs)) - (wait-for (pay state side (make-eid state eid) card {:action action} costs) + (wait-for (pay state side (make-eid state (assoc eid :action action)) card costs) (if-let [payment-str (:msg async-result)] (if (= server "New remote") (wait-for (trigger-event-simult state side :server-created nil card) diff --git a/src/clj/game/core/payment.clj b/src/clj/game/core/payment.clj index a349d7847f..c326660b4b 100644 --- a/src/clj/game/core/payment.clj +++ b/src/clj/game/core/payment.clj @@ -23,8 +23,10 @@ (defmulti stealth-value :cost/type) (defmethod stealth-value :default [_] 0) (defmulti label :cost/type) -(defmulti payable? (fn [cost _state _side _eid _card] (:cost/type cost))) -(defmulti handler (fn [cost _state _side _eid _card _actions] (:cost/type cost))) +(defn- payable-dispatch [cost _state _side _eid _card] (:cost/type cost)) +(defmulti payable? #'payable-dispatch) +(defn- handler-dispatch [cost _state _side _eid _card] (:cost/type cost)) +(defmulti handler #'handler-dispatch) (defn group-costs [costs] diff --git a/src/clj/game/core/play_instants.clj b/src/clj/game/core/play_instants.clj index 4da79e723e..c87c037615 100644 --- a/src/clj/game/core/play_instants.clj +++ b/src/clj/game/core/play_instants.clj @@ -134,7 +134,7 @@ ;; Only mark the register once costs have been paid and card has been moved (when (has-subtype? card "Run") (swap! state assoc-in [:runner :register :click-type] :run)) - (wait-for (pay state side (make-eid state eid) moved-card {:action :play-instant} costs) + (wait-for (pay state side (make-eid state (assoc eid :action :play-instant)) moved-card costs) (let [payment-str (:msg async-result) cost-paid (merge-costs-paid (:cost-paid eid) (:cost-paid async-result))] (if payment-str From 4b33d53df57b3d6f368b95c13999fa165a950f76 Mon Sep 17 00:00:00 2001 From: Noah Bogart Date: Wed, 3 Apr 2024 22:51:36 -0400 Subject: [PATCH 4/4] Undo specific cost changes --- src/clj/game/cards/agendas.clj | 2 +- src/clj/game/cards/assets.clj | 4 ++-- src/clj/game/cards/events.clj | 4 ++-- src/clj/game/cards/ice.clj | 22 +++++++++++----------- src/clj/game/cards/identities.clj | 2 +- src/clj/game/cards/operations.clj | 10 +++++----- src/clj/game/cards/resources.clj | 6 +++--- src/clj/game/cards/upgrades.clj | 10 +++++----- src/clj/game/core/actions.clj | 6 +++--- src/clj/game/core/engine.clj | 4 ++-- src/clj/game/core/psi.clj | 2 +- 11 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/clj/game/cards/agendas.clj b/src/clj/game/cards/agendas.clj index 7bc46c5ff6..1bd3de9f50 100644 --- a/src/clj/game/cards/agendas.clj +++ b/src/clj/game/cards/agendas.clj @@ -414,7 +414,7 @@ :async true :effect (req (if (pos? target) (wait-for - (pay state :corp (make-eid state eid) card [(->c :credit target)]) + (pay state :corp (make-eid state eid) card (->c :credit target)) (let [from (take target (shuffle (:hand runner)))] (doseq [c from] (move state :runner c :deck)) diff --git a/src/clj/game/cards/assets.clj b/src/clj/game/cards/assets.clj index 38a755ff74..3d0fbec10b 100644 --- a/src/clj/game/cards/assets.clj +++ b/src/clj/game/cards/assets.clj @@ -549,7 +549,7 @@ (str "force the runner to " (decapitalize target)))) :async true :effect (req (if (= target "Pay 1 [Credits]") - (wait-for (pay state :runner (make-eid state eid) card [(->c :credit 1)]) + (wait-for (pay state :runner (make-eid state eid) card (->c :credit 1)) (system-msg state :runner (:msg async-result)) (effect-completed state side eid)) (gain-tags state :corp eid 1)))}]}) @@ -605,7 +605,7 @@ :label "make the Runner pay 1 [Credits] or trash the top card of the stack (start of turn)" :msg (msg "force the Runner to " (decapitalize target)) :effect (req (if (= target "Pay 1 [Credits]") - (wait-for (pay state side (make-eid state eid) card [(->c :credit 1)]) + (wait-for (pay state side (make-eid state eid) card (->c :credit 1)) (system-msg state side (:msg async-result)) (effect-completed state side eid)) (mill state :runner eid :runner 1)))}] diff --git a/src/clj/game/cards/events.clj b/src/clj/game/cards/events.clj index 486f0318bd..eaab323a5f 100644 --- a/src/clj/game/cards/events.clj +++ b/src/clj/game/cards/events.clj @@ -2506,7 +2506,7 @@ "Take 1 bad publicity"]) :async true :effect (req (if (= target "Pay 5 [Credits]") - (wait-for (pay state :corp (make-eid state eid) card [(->c :credit 5)]) + (wait-for (pay state :corp (make-eid state eid) card (->c :credit 5)) (system-msg state :corp (:msg async-result)) (effect-completed state side eid)) (do (gain-bad-publicity state :corp 1) @@ -4048,7 +4048,7 @@ :choices (req (map str (range 0 (inc (:click runner))))) :async true :effect (req (let [n (str->int target)] - (wait-for (pay state :runner (make-eid state eid) card [(->c :click n)]) + (wait-for (pay state :runner (make-eid state eid) card (->c :click n)) (system-msg state :runner (:msg async-result)) (trash-cards state :corp eid (take n (shuffle (:hand corp))) {:cause-card card}))))}})]}) diff --git a/src/clj/game/cards/ice.clj b/src/clj/game/cards/ice.clj index a43a828355..f95bc6eebb 100644 --- a/src/clj/game/cards/ice.clj +++ b/src/clj/game/cards/ice.clj @@ -813,7 +813,7 @@ :effect (req (if (= "Take 1 net damage" target) (damage state side eid :net 1 {:card card}) - (pay state :runner eid card [(->c :credit 2)]))) + (pay state :runner eid card (->c :credit 2)))) :msg (msg (if (= "Take 1 net damage" target) "do 1 net damage" (str "force the runner to " (decapitalize target))))} @@ -1388,7 +1388,7 @@ "Take 1 tag"]) :async true :effect (req (if (= target "Pay 3 [Credits]") - (wait-for (pay state :runner (make-eid state eid) card [(->c :credit 3)]) + (wait-for (pay state :runner (make-eid state eid) card (->c :credit 3)) (system-msg state :runner (:msg async-result)) (effect-completed state side eid)) (gain-tags state :runner eid 1)))} @@ -1399,7 +1399,7 @@ (defcard "Datapike" {:subroutines [{:async true - :effect (req (wait-for (pay state :runner (make-eid state eid) card [(->c :credit 2)]) + :effect (req (wait-for (pay state :runner (make-eid state eid) card (->c :credit 2)) (if (:cost-paid async-result) (do (system-msg state :runner (:msg async-result)) (effect-completed state side eid)) @@ -1628,7 +1628,7 @@ "Trash an installed card")]) :async true :effect (req (if (= target "Pay 1 [Credits]") - (wait-for (pay state side (make-eid state eid) card [(->c :credit 1)]) + (wait-for (pay state side (make-eid state eid) card (->c :credit 1)) (system-msg state side (:msg async-result)) (effect-completed state side eid)) (continue-ability state :runner runner-trash-installed-sub card nil)))}] @@ -1649,7 +1649,7 @@ "Trash an installed card")]) :async true :effect (req (if (= target "Pay 2 [Credits]") - (wait-for (pay state side (make-eid state eid) card [(->c :credit 2)]) + (wait-for (pay state side (make-eid state eid) card (->c :credit 2)) (system-msg state side (:msg async-result)) (effect-completed state side eid)) (continue-ability state :runner runner-trash-installed-sub card nil)))}] @@ -1671,7 +1671,7 @@ "Trash an installed card")]) :async true :effect (req (if (= target "Pay 3 [Credits]") - (wait-for (pay state side (make-eid state eid) card [(->c :credit 3)]) + (wait-for (pay state side (make-eid state eid) card (->c :credit 3)) (system-msg state side (:msg async-result)) (effect-completed state side eid)) (continue-ability state :runner runner-trash-installed-sub card nil)))}] @@ -1792,7 +1792,7 @@ "give the runner 1 tag")) :effect (req (if (= "Take 1 tag" target) (gain-tags state :corp eid 1) - (wait-for (pay state side (make-eid state eid) card [(->c :credit 4)]) + (wait-for (pay state side (make-eid state eid) card (->c :credit 4)) (system-msg state side (:msg async-result)) (effect-completed state side eid))))}]}) @@ -2095,7 +2095,7 @@ :effect (req (let [c (str->int target)] (if (can-pay? state side (assoc eid :source card :source-type :subroutine) card (:title card) (->c :credit c)) (let [new-eid (make-eid state {:source card :source-type :subroutine})] - (wait-for (pay state :corp new-eid card [(->c :credit c)]) + (wait-for (pay state :corp new-eid card (->c :credit c)) (system-msg state :corp (:msg async-result)) (continue-ability state side @@ -2383,7 +2383,7 @@ (str "force the runner to " (decapitalize target) " on encountering it"))) :effect (req (if (= target "Take 1 tag") (gain-tags state :runner eid 1) - (wait-for (pay state :runner (make-eid state eid) card [(->c :click 1)]) + (wait-for (pay state :runner (make-eid state eid) card (->c :click 1)) (system-msg state side (:msg async-result)) (effect-completed state :runner eid))))} card nil))} @@ -3310,7 +3310,7 @@ "Pay 3 [Credits]")] :msg (msg "force the Runner to " (decapitalize target)) :effect (req (if (= target "Pay 3 [Credits]") - (wait-for (pay state :runner (make-eid state eid) card [(->c :credit 3)]) + (wait-for (pay state :runner (make-eid state eid) card (->c :credit 3)) (system-msg state :runner (:msg async-result)) (effect-completed state side eid)) (access-card state :runner eid c)))} @@ -4182,7 +4182,7 @@ :async true :effect (req (if (and (= target "Spend [Click]") (can-pay? state :runner eid card nil [(->c :click 1)])) - (wait-for (pay state side (make-eid state eid) card [(->c :click 1)]) + (wait-for (pay state side (make-eid state eid) card (->c :click 1)) (system-msg state side (:msg async-result)) (effect-completed state :runner eid)) (end-run state :corp eid card)))})}) diff --git a/src/clj/game/cards/identities.clj b/src/clj/game/cards/identities.clj index f021beaaa9..bc44baeece 100644 --- a/src/clj/game/cards/identities.clj +++ b/src/clj/game/cards/identities.clj @@ -2161,7 +2161,7 @@ (str "force the runner to " (decapitalize target)))) :effect (req (if (= "End the run" target) (end-run state :corp eid card) - (wait-for (pay state :runner (make-eid state eid) card [(->c :trash-installed 1)]) + (wait-for (pay state :runner (make-eid state eid) card (->c :trash-installed 1)) (when-let [payment-str (:msg async-result)] (system-msg state :runner (str payment-str diff --git a/src/clj/game/cards/operations.clj b/src/clj/game/cards/operations.clj index 6dc3125c57..e3d26a3888 100644 --- a/src/clj/game/cards/operations.clj +++ b/src/clj/game/cards/operations.clj @@ -1020,7 +1020,7 @@ :effect (req (let [c target] (if (can-pay? state side (assoc eid :source card :source-type :ability) card (:title card) (->c :credit c)) (let [new-eid (make-eid state {:source card :source-type :ability})] - (wait-for (pay state :corp new-eid card [(->c :credit c)]) + (wait-for (pay state :corp new-eid card (->c :credit c)) (when-let [payment-str (:msg async-result)] (system-msg state :corp payment-str)) (continue-ability @@ -1127,7 +1127,7 @@ :card #(and (installed? %) (is-type? % card-type) (not (has-subtype? % "Icebreaker")))} - :effect (req (wait-for (pay state :runner (make-eid state eid) card [(->c :credit (* 3 (count targets)))]) + :effect (req (wait-for (pay state :runner (make-eid state eid) card (->c :credit (* 3 (count targets)))) (system-msg state :runner (str (:msg async-result) " to prevent the trashing of " @@ -2091,7 +2091,7 @@ :effect (req (let [c target] (if (can-pay? state side (assoc eid :source card :source-type :ability) card (:title card) (->c :credit c)) (let [new-eid (make-eid state {:source card :source-type :ability})] - (wait-for (pay state :corp new-eid card [(->c :credit c)]) + (wait-for (pay state :corp new-eid card (->c :credit c)) (when-let [payment-str (:msg async-result)] (system-msg state :corp payment-str)) (continue-ability @@ -2153,7 +2153,7 @@ "Pay 8 [Credits]")]) :async true :effect (req (if (= target "Pay 8 [Credits]") - (wait-for (pay state :runner (make-eid state eid) card [(->c :credit 8)]) + (wait-for (pay state :runner (make-eid state eid) card (->c :credit 8)) (system-msg state :runner (:msg async-result)) (effect-completed state side eid)) (gain-tags state :corp eid 1)))}}) @@ -2927,7 +2927,7 @@ "Pay 4 [Credits]") "Take 1 tag"]) :effect (req (if (= target "Pay 4 [Credits]") - (wait-for (pay state :runner (make-eid state eid) card [(->c :credit 4)]) + (wait-for (pay state :runner (make-eid state eid) card (->c :credit 4)) (system-msg state :runner (:msg async-result)) (effect-completed state side eid)) (gain-tags state :corp eid 1 nil)))}]})) diff --git a/src/clj/game/cards/resources.clj b/src/clj/game/cards/resources.clj index cf50181437..28375e1649 100644 --- a/src/clj/game/cards/resources.clj +++ b/src/clj/game/cards/resources.clj @@ -1370,7 +1370,7 @@ :async true :effect (req (if (= target "Trash Fencer Fueno") (trash state :runner eid card {:cause-card card}) - (pay state :runner eid card [(->c :credit 1)])))} + (pay state :runner eid card (->c :credit 1))))} ;; companion-builder: ability {:req (req (and (pos? (get-counters (get-card state card) :credit)) (:successful run))) @@ -1559,7 +1559,7 @@ "Trash Guru Davinder"]) :effect (req (if (= target "Trash Guru Davinder") (trash state :runner eid card {:cause :runner-ability :cause-card card}) - (pay state :runner eid card [(->c :credit 4)])))}]))}]}) + (pay state :runner eid card (->c :credit 4))))}]))}]}) (defcard "Hades Shard" @@ -1957,7 +1957,7 @@ (decapitalize target))) :effect (req (if (= target "Trash Lewi Guilherme") (trash state :runner eid card {:cause-card card}) - (pay state :runner eid card [(->c :credit 1)])))}] + (pay state :runner eid card (->c :credit 1))))}] {:flags {:drip-economy true} :static-abilities [(corp-hand-size+ -1)] :events [(assoc ability :event :runner-turn-begins)]})) diff --git a/src/clj/game/cards/upgrades.clj b/src/clj/game/cards/upgrades.clj index 244ad67207..65a63e972f 100644 --- a/src/clj/game/cards/upgrades.clj +++ b/src/clj/game/cards/upgrades.clj @@ -437,7 +437,7 @@ (str "force the Runner to " (decapitalize target)))) :effect (req (if (= target "End the run") (end-run state side eid card) - (wait-for (pay state :runner (make-eid state eid) card [(->c :credit cost)]) + (wait-for (pay state :runner (make-eid state eid) card (->c :credit cost)) (system-msg state :runner (:msg async-result)) (effect-completed state side eid))))}) card nil))}] @@ -779,7 +779,7 @@ (str "force the runner to " (decapitalize target)))) :effect (req (if (= "End the run" target) (end-run state :corp eid card) - (wait-for (pay state :runner (make-eid state eid) card [(->c :credit credit-cost)]) + (wait-for (pay state :runner (make-eid state eid) card (->c :credit credit-cost)) (system-msg state :runner (:msg async-result)) (effect-completed state side eid))))}) card nil))}]}) @@ -1077,12 +1077,12 @@ :effect (req (cond+ [(and (= target "Spend [Click][Click]") (can-pay? state :runner eid card nil [(->c :click 2)])) - (wait-for (pay state side (make-eid state eid) card [(->c :click 2)]) + (wait-for (pay state side (make-eid state eid) card (->c :click 2)) (system-msg state side (:msg async-result)) (effect-completed state :runner eid))] [(and (= target "Pay 5 [Credits]") (can-pay? state :runner eid card nil [(->c :credit 5)])) - (wait-for (pay state side (make-eid state eid) card [(->c :credit 5)]) + (wait-for (pay state side (make-eid state eid) card (->c :credit 5)) (system-msg state side (:msg async-result)) (effect-completed state :runner eid))] [:else @@ -1716,7 +1716,7 @@ {:async true :msg "do 1 core damage instead of net damage" :effect (req (swap! state update :damage dissoc :damage-replace :defer-damage) - (wait-for (pay state :corp (make-eid state eid) card [(->c :credit 2)]) + (wait-for (pay state :corp (make-eid state eid) card (->c :credit 2)) (system-msg state side (:msg async-result)) (wait-for (damage state side :brain 1 {:card card}) (swap! state assoc-in [:damage :damage-replace] true) diff --git a/src/clj/game/core/actions.clj b/src/clj/game/core/actions.clj index 586968292b..c57f515ccf 100644 --- a/src/clj/game/core/actions.clj +++ b/src/clj/game/core/actions.clj @@ -136,7 +136,7 @@ (defn- maybe-pay [state side eid card choices choice] (if (= choices :credit) - (pay state side eid card [(->c :credit (min choice (get-in @state [side :credit])))]) + (pay state side eid card (->c :credit (min choice (get-in @state [side :credit])))) (effect-completed state side eid))) (defn resolve-prompt @@ -567,8 +567,8 @@ (wait-for (pay state side (make-eid state (assoc eid :action :corp-advance)) card - [(->c :click (if-not no-cost 1 0)) - (->c :credit (if-not no-cost 1 0))]) + (->c :click (if-not no-cost 1 0)) + (->c :credit (if-not no-cost 1 0))) (if-let [payment-str (:msg async-result)] (do (system-msg state side (str (build-spend-msg payment-str "advance") (card-str state card))) (update-advancement-requirement state card) diff --git a/src/clj/game/core/engine.clj b/src/clj/game/core/engine.clj index bbf418d43b..3ed5371a85 100644 --- a/src/clj/game/core/engine.clj +++ b/src/clj/game/core/engine.clj @@ -1146,8 +1146,8 @@ (pay-next state side eid (rest costs) card (conj msgs async-result))))) (defn pay - [state side eid card costs] - (let [costs (flatten [costs]) + [state side eid card & costs] + (let [costs (flatten costs) costs (can-pay? state side eid card (:title card) costs)] (when (some keyword? costs) (throw (ex-info "Please convert to wrapped cost" {:args costs}))) diff --git a/src/clj/game/core/psi.clj b/src/clj/game/core/psi.clj index 5120905bbc..1b90fce875 100644 --- a/src/clj/game/core/psi.clj +++ b/src/clj/game/core/psi.clj @@ -23,7 +23,7 @@ (pay state opponent (make-eid state eid) card [(->c :credit opponent-bet)]) (system-msg state opponent (:msg async-result)) (wait-for - (pay state side (make-eid state eid) card [(->c :credit bet)]) + (pay state side (make-eid state eid) card (->c :credit bet)) (system-msg state side (:msg async-result)) (clear-wait-prompt state opponent) (wait-for (trigger-event-simult state side (make-eid state eid) :reveal-spent-credits nil (get-in @state [:psi :corp]) (get-in @state [:psi :runner]))