diff --git a/src/clj/game/cards/agendas.clj b/src/clj/game/cards/agendas.clj index 5f7a316b47..84a8d9ab37 100644 --- a/src/clj/game/cards/agendas.clj +++ b/src/clj/game/cards/agendas.clj @@ -1,5 +1,6 @@ (ns game.cards.agendas (:require [game.core :refer :all] + [game.core.eid :refer [effect-completed]] [game.utils :refer :all] [game.macros :refer [effect req msg wait-for continue-ability]] [clojure.string :refer [split-lines split join lower-case includes? starts-with?]] diff --git a/src/clj/game/cards/assets.clj b/src/clj/game/cards/assets.clj index c03ffa2585..e5260c483f 100644 --- a/src/clj/game/cards/assets.clj +++ b/src/clj/game/cards/assets.clj @@ -1,5 +1,6 @@ (ns game.cards.assets (:require [game.core :refer :all] + [game.core.eid :refer [effect-completed]] [game.utils :refer :all] [game.macros :refer [effect req msg wait-for continue-ability]] [clojure.string :refer [split-lines split join lower-case includes? starts-with?]] diff --git a/src/clj/game/cards/events.clj b/src/clj/game/cards/events.clj index 31aed5b4b2..a63b8511ad 100644 --- a/src/clj/game/cards/events.clj +++ b/src/clj/game/cards/events.clj @@ -1,5 +1,6 @@ (ns game.cards.events (:require [game.core :refer :all] + [game.core.eid :refer [make-eid make-result effect-completed]] [game.utils :refer :all] [game.macros :refer [effect req msg wait-for continue-ability]] [clojure.string :refer [split-lines split join lower-case includes? starts-with?]] diff --git a/src/clj/game/cards/hardware.clj b/src/clj/game/cards/hardware.clj index 0a4485418f..8db0950463 100644 --- a/src/clj/game/cards/hardware.clj +++ b/src/clj/game/cards/hardware.clj @@ -1,5 +1,6 @@ (ns game.cards.hardware (:require [game.core :refer :all] + [game.core.eid :refer [make-eid make-result effect-completed]] [game.utils :refer :all] [game.macros :refer [effect req msg wait-for continue-ability]] [clojure.string :refer [split-lines split join lower-case includes? starts-with?]] diff --git a/src/clj/game/cards/ice.clj b/src/clj/game/cards/ice.clj index 47c0eb083c..91ca46316e 100644 --- a/src/clj/game/cards/ice.clj +++ b/src/clj/game/cards/ice.clj @@ -1,5 +1,6 @@ (ns game.cards.ice (:require [game.core :refer :all] + [game.core.eid :refer [make-eid effect-completed]] [game.utils :refer :all] [game.macros :refer [effect req msg wait-for continue-ability when-let*]] [clojure.string :refer [split-lines split join lower-case includes? starts-with?]] diff --git a/src/clj/game/cards/identities.clj b/src/clj/game/cards/identities.clj index f37ec3365f..c2e81e6c2a 100644 --- a/src/clj/game/cards/identities.clj +++ b/src/clj/game/cards/identities.clj @@ -1,5 +1,6 @@ (ns game.cards.identities (:require [game.core :refer :all] + [game.core.eid :refer [effect-completed]] [game.utils :refer :all] [game.macros :refer [effect req msg wait-for continue-ability]] [clojure.string :refer [split-lines split join lower-case includes? starts-with?]] diff --git a/src/clj/game/cards/operations.clj b/src/clj/game/cards/operations.clj index 549d85440f..9d1a6b7977 100644 --- a/src/clj/game/cards/operations.clj +++ b/src/clj/game/cards/operations.clj @@ -1,5 +1,6 @@ (ns game.cards.operations (:require [game.core :refer :all] + [game.core.eid :refer [make-eid make-result effect-completed]] [game.utils :refer :all] [game.macros :refer [effect req msg wait-for continue-ability when-let*]] [clojure.string :refer [split-lines split join lower-case includes? starts-with?]] diff --git a/src/clj/game/cards/programs.clj b/src/clj/game/cards/programs.clj index deb414e141..894ea67fb0 100644 --- a/src/clj/game/cards/programs.clj +++ b/src/clj/game/cards/programs.clj @@ -1,5 +1,6 @@ (ns game.cards.programs (:require [game.core :refer :all] + [game.core.eid :refer [effect-completed]] [game.utils :refer :all] [game.macros :refer [effect req msg wait-for continue-ability when-let*]] [clojure.string :refer [split-lines split join lower-case includes? starts-with?]] diff --git a/src/clj/game/cards/resources.clj b/src/clj/game/cards/resources.clj index c1e6b9859a..e7bbefb59c 100644 --- a/src/clj/game/cards/resources.clj +++ b/src/clj/game/cards/resources.clj @@ -1,5 +1,6 @@ (ns game.cards.resources (:require [game.core :refer :all] + [game.core.eid :refer [make-eid effect-completed]] [game.utils :refer :all] [game.macros :refer [effect req msg wait-for continue-ability]] [clojure.string :refer [split-lines split join lower-case includes? starts-with?]] diff --git a/src/clj/game/cards/upgrades.clj b/src/clj/game/cards/upgrades.clj index 9bf77ad967..7c113b08b6 100644 --- a/src/clj/game/cards/upgrades.clj +++ b/src/clj/game/cards/upgrades.clj @@ -1,5 +1,6 @@ (ns game.cards.upgrades (:require [game.core :refer :all] + [game.core.eid :refer [effect-completed]] [game.utils :refer :all] [game.macros :refer [effect req msg wait-for continue-ability]] [clojure.string :refer [split-lines split join lower-case includes? starts-with?]] diff --git a/src/clj/game/core.clj b/src/clj/game/core.clj index be1f3c0530..5d92ea2055 100644 --- a/src/clj/game/core.clj +++ b/src/clj/game/core.clj @@ -1,6 +1,7 @@ (ns game.core (:require [game.utils :refer :all] [game.macros :refer [effect req msg wait-for continue-ability]] + [game.core.eid :refer [make-eid make-result register-effect-completed effect-completed complete-with-result]] [clj-time.core :as t] [clojure.string :as string :refer [split-lines split join lower-case includes? starts-with?]] [clojure.java.io :as io] diff --git a/src/clj/game/core/cards.clj b/src/clj/game/core/cards.clj index b174b00986..8115b5f8ef 100644 --- a/src/clj/game/core/cards.clj +++ b/src/clj/game/core/cards.clj @@ -2,7 +2,7 @@ (declare active? all-installed all-active-installed cards card-init deactivate card-flag? gain lose get-card-hosted handle-end-run hardware? ice? is-type? - make-eid program? register-events remove-from-host remove-icon make-card + program? register-events remove-from-host remove-icon make-card resource? rezzed? toast toast-check-mu trash trigger-event update-breaker-strength update-hosted! update-ice-strength unregister-events use-mu) diff --git a/src/clj/game/core/costs.clj b/src/clj/game/core/costs.clj index 9a538f64cf..afef8cd304 100644 --- a/src/clj/game/core/costs.clj +++ b/src/clj/game/core/costs.clj @@ -1,8 +1,8 @@ (in-ns 'game.core) (declare forfeit prompt! toast damage mill installed? is-type? is-scored? system-msg - facedown? make-result unknown->kw discard-from-hand card-str trash trash-cards - complete-with-result all-installed-runner-type pick-credit-providing-cards all-active + facedown? unknown->kw discard-from-hand card-str trash trash-cards + all-installed-runner-type pick-credit-providing-cards all-active eligible-pay-credit-cards corp? runner? in-hand?) (defn deduct @@ -139,13 +139,6 @@ costs (when title (toast state side (str cost-msg " for " title ".")) false))))) -(defn- complete-with-result - "Calls `effect-complete` with `make-result` and also returns the argument. - Helper function for cost-handler" - [state side eid result] - (effect-completed state side (make-result eid result)) - result) - (defn cost-names "Converts a cost (value attribute pair) to a string for printing" [attr value] diff --git a/src/clj/game/core/eid.clj b/src/clj/game/core/eid.clj new file mode 100644 index 0000000000..12b9d73997 --- /dev/null +++ b/src/clj/game/core/eid.clj @@ -0,0 +1,29 @@ +(ns game.core.eid) + +(defn make-eid + ([state] (make-eid state nil)) + ([state {:keys [source source-type]}] + (merge {:eid (:eid (swap! state update-in [:eid] inc))} + (when source {:source source}) + (when source-type {:source-type source-type})))) + +(defn register-effect-completed + [state side eid effect] + (swap! state update-in [:effect-completed (:eid eid)] #(conj % effect))) + +(defn effect-completed + [state side eid] + (doseq [handler (get-in @state [:effect-completed (:eid eid)])] + (handler state side eid)) + (swap! state update-in [:effect-completed] dissoc (:eid eid))) + +(defn make-result + [eid result] + (assoc eid :result result)) + +(defn complete-with-result + "Calls `effect-complete` with `make-result` and also returns the argument. + Helper function for cost-handler" + [state side eid result] + (effect-completed state side (make-result eid result)) + result) diff --git a/src/clj/game/core/events.clj b/src/clj/game/core/events.clj index a1aa5d7140..987b492692 100644 --- a/src/clj/game/core/events.clj +++ b/src/clj/game/core/events.clj @@ -1,8 +1,8 @@ (in-ns 'game.core) -(declare can-trigger? card-def clear-wait-prompt effect-completed event-title get-card +(declare can-trigger? card-def clear-wait-prompt event-title get-card get-nested-host get-remote-names get-runnable-zones get-zones installed? - make-eid register-effect-completed register-suppress resolve-ability + register-suppress resolve-ability show-wait-prompt trigger-suppress unregister-suppress) ; Functions for registering and dispatching events. @@ -298,14 +298,3 @@ "Returns true if this is the first trash of an owned installed card this turn by this side" [state side] (= 1 (count (filter #(= (:side (first %)) (side-str side)) (get-installed-trashed state side))))) - -;;; Effect completion triggers -(defn register-effect-completed - [state side eid effect] - (swap! state update-in [:effect-completed (:eid eid)] #(conj % effect))) - -(defn effect-completed - [state side eid] - (doseq [handler (get-in @state [:effect-completed (:eid eid)])] - (handler state side eid)) - (swap! state update-in [:effect-completed] dissoc (:eid eid))) diff --git a/src/clj/game/core/rules.clj b/src/clj/game/core/rules.clj index 586c52c30e..7361aeaf90 100644 --- a/src/clj/game/core/rules.clj +++ b/src/clj/game/core/rules.clj @@ -2,7 +2,7 @@ (declare can-run? can-trash? card-init card-str cards-can-prevent? close-access-prompt enforce-msg gain-agenda-point get-prevent-list get-agenda-points in-corp-scored? installed? is-type? play-sfx - prevent-draw make-result remove-old-current show-prompt system-say system-msg steal-trigger-events + prevent-draw remove-old-current show-prompt system-say system-msg steal-trigger-events trash-cards untrashable-while-rezzed? update-all-ice untrashable-while-resources? win win-decked) ;;;; Functions for applying core Netrunner game rules. diff --git a/src/clj/game/core/turns.clj b/src/clj/game/core/turns.clj index e97e310eaf..cfdec79efd 100644 --- a/src/clj/game/core/turns.clj +++ b/src/clj/game/core/turns.clj @@ -147,17 +147,6 @@ [state] (get-in (swap! state update-in [:rid] inc) [:rid])) -(defn make-eid - ([state] (make-eid state nil)) - ([state {:keys [source source-type]}] - (merge {:eid (:eid (swap! state update-in [:eid] inc))} - (when source {:source source}) - (when source-type {:source-type source-type})))) - -(defn make-result - [eid result] - (assoc eid :result result)) - (defn mulligan "Mulligan starting hand." [state side args] diff --git a/src/clj/game/macros.clj b/src/clj/game/macros.clj index 6bac77727f..2d89dc7ffc 100644 --- a/src/clj/game/macros.clj +++ b/src/clj/game/macros.clj @@ -93,8 +93,8 @@ totake (if (= 'apply (first action)) 4 3) th (nth action totake)] `(let [~'use-eid# (and (map? ~th) (:eid ~th)) - ~'new-eid# (if ~'use-eid# ~th (game.core/make-eid ~'state))] - (~'register-effect-completed ~'state ~'side ~'new-eid# ~reqmac) + ~'new-eid# (if ~'use-eid# ~th (game.core.eid/make-eid ~'state))] + (~'game.core.eid/register-effect-completed ~'state ~'side ~'new-eid# ~reqmac) (if ~'use-eid# ~(concat (take totake action) (list 'new-eid#) (drop (inc totake) action)) ~(concat (take totake action) (list 'new-eid#) (drop totake action)))))))