diff --git a/src/clj/game/cards/hardware.clj b/src/clj/game/cards/hardware.clj index f65ce108d0..f465efa40a 100644 --- a/src/clj/game/cards/hardware.clj +++ b/src/clj/game/cards/hardware.clj @@ -98,11 +98,12 @@ (defcard "AirbladeX (JSRF Ed.)" {:data {:counter {:power 3}} :interactions {:prevent [{:type #{:net} - :req (req run)}]} + :req (req (and run (pos? (get-counters card :power))))}]} :events [(trash-on-empty :power) {:event :prevent-encounter-ability :interactive (req true) - :req (req (not (get-in @state [:run :prevent-encounter-ability]))) + :req (req (and (not (get-in @state [:run :prevent-encounter-ability])) + (pos? (get-counters card :power)))) :async true :effect (req (if (get-in @state [:run :prevent-encounter-ability]) @@ -488,6 +489,7 @@ {:async true :msg "rearrange the top 4 cards of R&D" :cost [(->c :power 1)] + :req (req (pos? (get-counters card :power))) :waiting-prompt true :effect (req (continue-ability state side diff --git a/src/clj/game/cards/resources.clj b/src/clj/game/cards/resources.clj index d04f0a55ab..dd3dc8bd44 100644 --- a/src/clj/game/cards/resources.clj +++ b/src/clj/game/cards/resources.clj @@ -921,7 +921,8 @@ :once :per-turn :label "Take 1 [Credits] (start of turn)" :msg "gain 1 [Credits]" - :req (req (:runner-phase-12 @state)) + :req (req (and (:runner-phase-12 @state) + (pos? (get-counters card :credit)))) :effect (req (add-counter state side card :credit -1) (wait-for (gain-credits state :runner 1) (if (not (pos? (get-counters (get-card state card) :credit))) @@ -1016,7 +1017,8 @@ (defcard "Daily Casts" (let [ability {:once :per-turn :label "Take 2 [Credits] (start of turn)" - :req (req (:runner-phase-12 @state)) + :req (req (and (:runner-phase-12 @state) + (pos? (get-counters card :credit)))) :msg (msg "gain " (min 2 (get-counters card :credit)) " [Credits]") :async true :effect (req (let [credits (min 2 (get-counters card :credit))] @@ -1307,20 +1309,19 @@ (defcard "Earthrise Hotel" (let [ability {:msg "draw 2 cards" :once :per-turn - :cost [(->c :power 1)] :req (req (:runner-phase-12 @state)) :async true :interactive (req true) - :effect (req (wait-for (draw state :runner 2) - (if (not (pos? (get-counters (get-card state card) :power))) - (trash state :runner eid card {:unpreventable true :cause-card card}) - (effect-completed state side eid))))}] + :effect (req (when (pos? (get-counters card :power)) + (add-counter state side card :power -1)) + (draw state side eid 2))}] {:flags {:runner-turn-draw true :runner-phase-12 (req (< 1 (count (filter #(card-flag? % :runner-turn-draw true) (cons (get-in @state [:runner :identity]) (all-active-installed state :runner))))))} :data {:counter {:power 3}} - :events [(assoc ability :event :runner-turn-begins)] + :events [(assoc ability :event :runner-turn-begins) + (trash-on-empty :power)] :abilities [ability]})) (defcard "Eden Shard" @@ -1884,17 +1885,16 @@ (defcard "Juli Moreira Lee" {:data {:counter {:power 4}} :events [(trash-on-empty :power) - {:event :runner-spent-click + {:event :action-played :once :per-turn - :req (req (let [all-cards (get-all-cards state) - pred #(and (:is-game-action? %) - (resource? (:stripped-source-card %)))] - (and (pred context) - (first-event? state side :runner-spent-click - #(pred (first %)))))) - :cost [(->c :power 1)] + :req (req (let [valid-ctx? (fn [[ctx]] (resource? (:card ctx)))] + (and (valid-ctx? targets) + (= :runner side) + (first-event? state side :action-played valid-ctx?)))) :msg "gain [Click]" - :effect (effect (gain-clicks 1))}]}) + :effect (req (when (pos? (get-counters card :power)) + (add-counter state side card :power -1)) + (gain-clicks state side 1))}]}) (defcard "Kasi String" {:events [{:event :run-ends @@ -2017,6 +2017,7 @@ :abilities [{:action true :cost [(->c :click 1)] :keep-menu-open :while-clicks-left + :change-in-game-state (req (pos? (get-counters card :credit))) :label "gain 4 [Credits]" :msg (msg "gain " (min 4 (get-counters card :credit)) " [Credits]") :async true @@ -3204,6 +3205,7 @@ :abilities [{:action true :label "Take 3 [Credits] from this resource" :cost [(->c :click 1)] + :change-in-game-state (req (pos? (get-counters card :credit))) :once :per-turn :msg "gain 3 [Credits]" :async true diff --git a/src/clj/game/core/def_helpers.clj b/src/clj/game/core/def_helpers.clj index af0737ac3a..0a092d1b9e 100644 --- a/src/clj/game/core/def_helpers.clj +++ b/src/clj/game/core/def_helpers.clj @@ -150,6 +150,7 @@ [counter-type] {:event :counter-added :req (req (and (same-card? card target) + (not (get-in card [:special :skipped-loading])) (not (pos? (get-counters card counter-type))))) :effect (effect (system-msg (str "removes " (:title card) " from the game")) (move card :rfg))}) @@ -159,6 +160,7 @@ [counter-type] {:event :counter-added :req (req (and (same-card? card target) + (not (get-in card [:special :skipped-loading])) (not (pos? (get-counters card counter-type))))) :async true :effect (effect (system-msg (str "trashes " (:title card))) diff --git a/src/clj/game/core/initializing.clj b/src/clj/game/core/initializing.clj index 5b8e0a6e5c..1cb422d2cf 100644 --- a/src/clj/game/core/initializing.clj +++ b/src/clj/game/core/initializing.clj @@ -103,6 +103,7 @@ c (update! state side (merge card {:runner-abilities run-abs :corp-abilities corp-abs})) + c (if init-data c (assoc-in c [:special :skipped-loading] true)) data (merge (when init-data (:counter (:data cdef))) (when recurring diff --git a/src/clj/game/core/moving.clj b/src/clj/game/core/moving.clj index d2f0f33fa0..4f5c34ec50 100644 --- a/src/clj/game/core/moving.clj +++ b/src/clj/game/core/moving.clj @@ -669,7 +669,7 @@ (move state side card [:rig :facedown]))) (defn flip-faceup - "Flips a runner card facedown, either manually (if it's hosted) or by calling move to correct area. + "Flips a runner card faceup, either manually (if it's hosted) or by calling move to correct area. Wires events without calling effect/init-data" [state side {:keys [host] :as card}] (let [card (if host diff --git a/test/clj/game/cards/resources_test.clj b/test/clj/game/cards/resources_test.clj index abdfe79a1d..66e0789af2 100644 --- a/test/clj/game/cards/resources_test.clj +++ b/test/clj/game/cards/resources_test.clj @@ -380,6 +380,75 @@ (is (not (refresh kat1)) "old kati trashed") (is (= 0 (get-counters (get-resource state 1) :credit)) "0 credits on new kati")))) +(deftest assimilator-load-and-trash-on-empty + (doseq [[scenario deck] [[:airblade ["AirbladeX (JSRF Ed.)"]] + [:bank-job ["Bank Job"]] + [:cataloguer ["Cataloguer"]] + [:crowdfunding ["Crowdfunding"]] + [:casts ["Daily Casts"]] + [:nuka ["Dr. Nuka Vrolyck"]] + [:hotel ["Earthrise Hotel" (qty "Earthrise Hotel" 14)]] + [:juli ["Juli Moreira Lee"]] + [:liberated ["Liberated Account"]] + [:malandragem ["Malandragem"]] + [:nga ["Nga"]] + [:penumbral ["Penumbral Toolkit"]] + [:telework ["Telework Contract"]]]] + (do-game + (new-game {:corp {:hand []} + :runner {:hand ["Assimilator" "Hunting Grounds" "Kati Jones"] + :credits 25 + :deck deck}}) + (take-credits state :corp) + (play-from-hand state :runner "Assimilator") + (play-from-hand state :runner "Hunting Grounds") + (core/gain state :runner :click 10) + (card-ability state :runner (get-resource state 1) 0) + (card-ability state :runner (get-resource state 0) 0) + (click-card state :runner (get-runner-facedown state 0)) + ;; kati + (case scenario + :airblade (is (= (first deck) (:title (get-hardware state 0))) "Airblades exists") + :bank-job (is (= (first deck) (:title (get-resource state 1))) "Bank Job exists") + :cataloguer (is (= (first deck) (:title (get-hardware state 0))) "Cataloguer exists") + :crowdfunding (is (= (first deck) (:title (get-resource state 1))) "CF exists") + :casts (do (is (= (first deck) (:title (get-resource state 1))) "Casts exists") + (take-credits state :runner) + (is (changed? [(:credit (get-runner)) 0] + (take-credits state :corp)) + "gained 0 from casts") + (is (= (first deck) (:title (get-resource state 1))) "But Casts exists")) + :nuka (is (= (first deck) (:title (get-resource state 1))) "Doc. Nuka") + :hotel (do (is (= (first deck) (:title (get-resource state 1))) "Earthrise Exists") + (take-credits state :runner) + (is (changed? [(count (:hand (get-runner))) 2] + (take-credits state :corp)) + "Hotel still draws 2") + (is (= (first deck) (:title (get-resource state 1))) "Earthrise still Exists")) + :juli (do (is (= (first deck) (:title (get-resource state 1))) "Juli exists") + (take-credits state :runner) + (take-credits state :corp) + (play-from-hand state :runner "Kati Jones") + (is (changed? [(:click (get-runner)) 0] + (card-ability state :runner (get-resource state 2) 0)) + "gained click when using kati") + (is (= (first deck) (:title (get-resource state 1))) "But juli still exists")) + :liberated (do (is (= (first deck) (:title (get-resource state 1))) "Lib exists") + (is (changed? [(:click (get-runner)) -1 + (:credit (get-runner)) 0] + (card-ability state :runner (get-resource state 1) 0)) + "Gained 0, wasted a click") + (is (= (first deck) (:title (get-resource state 1))) "Lib still exists")) + :malandragem (is (= (first deck) (:title (get-program state 0))) "Malandragem Exists") + :nga (is (= (first deck) (:title (get-program state 0))) "Nga Exists") + :penumbral (is (= (first deck) (:title (get-resource state 1))) "Penumbral Exists") + :telework (do (is (= (first deck) (:title (get-resource state 1))) "Telework exists") + (is (changed? [(:click (get-runner)) -1 + (:credit (get-runner)) 0] + (card-ability state :runner (get-resource state 1) 0)) + "Gained 0, wasted a click") + (is (= (first deck) (:title (get-resource state 1))) "Telework still exists")))))) + (deftest avgustina-ivanovskaya ;; First time each turn you install a virus program, resist 1 (do-game @@ -3584,6 +3653,7 @@ (new-game {:runner {:hand [(qty "Juli Moreira Lee" 2) (qty "Telework Contract" 2)] :credits 10}}) (take-credits state :corp) + (core/gain state :runner :click 1) (play-from-hand state :runner "Juli Moreira Lee") (play-from-hand state :runner "Telework Contract") (is (changed? [(get-counters (get-resource state 0) :power) -1