Skip to content

Commit

Permalink
Merge pull request #7950 from NBKelly/load-trash-changes
Browse files Browse the repository at this point in the history
cursed assimilator interactions
  • Loading branch information
NoahTheDuke authored Feb 7, 2025
2 parents 1558d1d + 8750f86 commit d4b4482
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 20 deletions.
6 changes: 4 additions & 2 deletions src/clj/game/cards/hardware.clj
Original file line number Diff line number Diff line change
Expand Up @@ -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])
Expand Down Expand Up @@ -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
Expand Down
36 changes: 19 additions & 17 deletions src/clj/game/cards/resources.clj
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
Expand Down Expand Up @@ -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))]
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/clj/game/core/def_helpers.clj
Original file line number Diff line number Diff line change
Expand Up @@ -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))})
Expand All @@ -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)))
Expand Down
1 change: 1 addition & 0 deletions src/clj/game/core/initializing.clj
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/clj/game/core/moving.clj
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
70 changes: 70 additions & 0 deletions test/clj/game/cards/resources_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit d4b4482

Please sign in to comment.