Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

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