diff --git a/project.clj b/project.clj index e149ead8ed..a634638bcb 100644 --- a/project.clj +++ b/project.clj @@ -31,7 +31,6 @@ [throttler "1.0.0"] [clj-http "3.7.0"] [reagent "0.8.1"] - [eftest "0.1.4"] [cljsjs/react "16.5.2-0"] [cljsjs/react-dom "16.5.2-0"] [org.clojure/tools.analyzer "0.7.0"] @@ -43,7 +42,7 @@ [lein-figwheel "0.5.16"] [com.gfredericks/lein-sha-version "0.1.1-p1"] [lein-ring "0.9.7"] - [lein-eftest "0.5.2"] + [lein-eftest "0.5.8"] [lein-exec "0.3.7"]] :profiles {:dev {:dependencies [[figwheel-sidecar "0.5.16"] diff --git a/src/clj/game/cards.clj b/src/clj/game/cards.clj index fa1771f060..ea70136f6d 100644 --- a/src/clj/game/cards.clj +++ b/src/clj/game/cards.clj @@ -320,38 +320,3 @@ (->> (-> card :title server-card :text split-lines) (filter #(starts-with? % "[subroutine]")) count)) - -;; Load all card definitions into the current namespace -(defn load-all-cards - "Load all card definitions into their own namespaces" - ([] (load-all-cards nil)) - ([path] - (doall (pmap load-file - (->> (io/file (str "src/clj/game/cards" (when path (str "/" path ".clj")))) - (file-seq) - (filter #(and (.isFile %) - (string/ends-with? % ".clj"))) - (map str)))))) - -(defn get-card-defs - ([] (get-card-defs nil)) - ([path] - (->> (all-ns) - (filter #(starts-with? % (str "game.cards" (when path (str "." path))))) - (map #(ns-resolve % 'card-definitions)) - (map var-get) - (apply merge)))) - -(def cards {}) - -(defn reset-card-defs - "Performs any once only initialization that should be performed on startup" - ([] (reset-card-defs nil)) - ([path] - (let [cards-var #'game.core/cards] - (alter-var-root cards-var - (constantly - (merge cards - (do (load-all-cards path) - (get-card-defs path)))))) - 'loaded)) diff --git a/src/clj/game/cards/agendas.clj b/src/clj/game/cards/agendas.clj index 80acfb94e1..1dec5de94d 100644 --- a/src/clj/game/cards/agendas.clj +++ b/src/clj/game/cards/agendas.clj @@ -1,6 +1,7 @@ (ns game.cards.agendas (:require [game.core :refer :all] [game.core.eid :refer [effect-completed]] + [game.core.card-defs :refer [card-def]] [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 024084ced8..5743b53ae5 100644 --- a/src/clj/game/cards/assets.clj +++ b/src/clj/game/cards/assets.clj @@ -1,6 +1,7 @@ (ns game.cards.assets (:require [game.core :refer :all] [game.core.eid :refer [effect-completed]] + [game.core.card-defs :refer [card-def]] [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 a7b839dc7a..6698534322 100644 --- a/src/clj/game/cards/events.clj +++ b/src/clj/game/cards/events.clj @@ -1,6 +1,7 @@ (ns game.cards.events (:require [game.core :refer :all] [game.core.eid :refer [make-eid make-result effect-completed]] + [game.core.card-defs :refer [card-def]] [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 82f46434ff..317940ef9c 100644 --- a/src/clj/game/cards/hardware.clj +++ b/src/clj/game/cards/hardware.clj @@ -1,6 +1,7 @@ (ns game.cards.hardware (:require [game.core :refer :all] [game.core.eid :refer [make-eid make-result effect-completed]] + [game.core.card-defs :refer [card-def]] [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 5fb81f1414..76244ce9a8 100644 --- a/src/clj/game/cards/ice.clj +++ b/src/clj/game/cards/ice.clj @@ -1,6 +1,7 @@ (ns game.cards.ice (:require [game.core :refer :all] [game.core.eid :refer [make-eid effect-completed]] + [game.core.card-defs :refer [card-def]] [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 e6b913293f..cf9d47c7b0 100644 --- a/src/clj/game/cards/identities.clj +++ b/src/clj/game/cards/identities.clj @@ -1,6 +1,7 @@ (ns game.cards.identities (:require [game.core :refer :all] [game.core.eid :refer [effect-completed make-eid]] + [game.core.card-defs :refer [card-def]] [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 81493cf45a..8b55dab574 100644 --- a/src/clj/game/cards/operations.clj +++ b/src/clj/game/cards/operations.clj @@ -1,6 +1,7 @@ (ns game.cards.operations (:require [game.core :refer :all] [game.core.eid :refer [make-eid make-result effect-completed]] + [game.core.card-defs :refer [card-def]] [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 b155851418..f0582e1441 100644 --- a/src/clj/game/cards/programs.clj +++ b/src/clj/game/cards/programs.clj @@ -1,6 +1,7 @@ (ns game.cards.programs (:require [game.core :refer :all] [game.core.eid :refer [effect-completed make-eid]] + [game.core.card-defs :refer [card-def]] [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 a06dbad3fd..c07c0f43db 100644 --- a/src/clj/game/cards/resources.clj +++ b/src/clj/game/cards/resources.clj @@ -1,6 +1,7 @@ (ns game.cards.resources (:require [game.core :refer :all] [game.core.eid :refer [make-eid effect-completed]] + [game.core.card-defs :refer [card-def]] [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 94074a9073..d7273bd011 100644 --- a/src/clj/game/cards/upgrades.clj +++ b/src/clj/game/cards/upgrades.clj @@ -1,6 +1,7 @@ (ns game.cards.upgrades (:require [game.core :refer :all] [game.core.eid :refer [effect-completed]] + [game.core.card-defs :refer [card-def]] [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 8dffdf23c5..40598b3a9e 100644 --- a/src/clj/game/core.clj +++ b/src/clj/game/core.clj @@ -1,5 +1,6 @@ (ns game.core (:require [game.utils :refer :all] + [game.core.card-defs :refer [card-def]] [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] diff --git a/src/clj/game/core/actions.clj b/src/clj/game/core/actions.clj index 541a82c0ed..eac52e4890 100644 --- a/src/clj/game/core/actions.clj +++ b/src/clj/game/core/actions.clj @@ -339,7 +339,7 @@ "Play an ability from another card's definition." [state side {:keys [card source index] :as args}] (let [card (get-card state card) - source-abis (:abilities (cards (.replace source "'" ""))) + source-abis (:abilities (card-def source)) abi (when (< -1 index (count source-abis)) (nth source-abis index))] (when abi diff --git a/src/clj/game/core/card_defs.clj b/src/clj/game/core/card_defs.clj new file mode 100644 index 0000000000..79b10db2db --- /dev/null +++ b/src/clj/game/core/card_defs.clj @@ -0,0 +1,48 @@ +(ns game.core.card-defs + (:require [clojure.string :refer [starts-with? ends-with?]] + [clojure.java.io :refer [file]] + [clojure.stacktrace :refer [print-stack-trace]])) + +(defn- load-all-cards + "Load all card definitions into their own namespaces" + ([] (load-all-cards nil)) + ([path] + (doall (pmap load-file + (->> (file (str "src/clj/game/cards" (when path (str "/" path ".clj")))) + (file-seq) + (filter #(and (.isFile %) + (ends-with? % ".clj"))) + (map str)))))) + +(defn- get-card-defs + ([] (get-card-defs nil)) + ([path] + (->> (all-ns) + (filter #(starts-with? % (str "game.cards" (when path (str "." path))))) + (map #(ns-resolve % 'card-definitions)) + (map var-get) + (apply merge)))) + +(def card-defs {}) + +(defn reset-card-defs + "Performs any once only initialization that should be performed on startup" + ([] (reset-card-defs nil)) + ([path] + (let [cards-var #'game.core.card-defs/card-defs] + (alter-var-root cards-var + (constantly + (merge card-defs + (do (load-all-cards path) + (get-card-defs path)))))) + 'loaded)) + +(defn card-def + "Retrieves a card's abilities definition map." + [card] + (if-let [title (:title card)] + (get card-defs title) + (.println *err* (with-out-str + (print-stack-trace + (Exception. (str "Tried to select card def for non-existent card: " card)) + 25))))) diff --git a/src/clj/game/core/cards.clj b/src/clj/game/core/cards.clj index 8115b5f8ef..58f68a51d6 100644 --- a/src/clj/game/core/cards.clj +++ b/src/clj/game/core/cards.clj @@ -8,16 +8,6 @@ use-mu) ;;; Functions for loading card information. -(defn card-def - "Retrieves a card's abilities definition map." - [card] - (if-let [title (:title card)] - (get cards title) - (.println *err* (with-out-str - (clojure.stacktrace/print-stack-trace - (Exception. (str "Tried to select card def for non-existent card: " card)) - 25))))) - (defn find-cid "Return a card with specific :cid from given sequence" [cid from] diff --git a/src/clj/game/core/events.clj b/src/clj/game/core/events.clj index 987b492692..09914cfde0 100644 --- a/src/clj/game/core/events.clj +++ b/src/clj/game/core/events.clj @@ -1,6 +1,6 @@ (in-ns 'game.core) -(declare can-trigger? card-def clear-wait-prompt event-title get-card +(declare can-trigger? clear-wait-prompt event-title get-card get-nested-host get-remote-names get-runnable-zones get-zones installed? register-suppress resolve-ability show-wait-prompt trigger-suppress unregister-suppress) diff --git a/src/clj/web/admin.clj b/src/clj/web/admin.clj index b7b4bd356f..72c9ba1559 100644 --- a/src/clj/web/admin.clj +++ b/src/clj/web/admin.clj @@ -2,7 +2,7 @@ (:require [web.db :refer [db object-id]] [web.lobby :refer [all-games]] [game.main :as main] - [game.core :refer [reset-card-defs]] + [game.core.card-defs :refer [reset-card-defs]] [tasks.fetch :refer [fetch-with-db]] [web.utils :refer [response]] [monger.collection :as mc] diff --git a/src/clj/web/core.clj b/src/clj/web/core.clj index 061982a1cd..1e68231cc7 100644 --- a/src/clj/web/core.clj +++ b/src/clj/web/core.clj @@ -6,6 +6,7 @@ [hawk.core :as hawk] [monger.collection :as mc] [game.core :as core] + [game.core.card-defs :refer [reset-card-defs]] [game.quotes :as quotes] [jinteki.cards :as cards] [jinteki.nav :as nav] @@ -56,7 +57,7 @@ (reset! cards/mwl latest-mwl)) ;; Reset all of the card implementation definitions - (core/reset-card-defs) + (reset-card-defs) (when (#{"dev" "prod"} (first args)) (reset! server-mode (first args))) diff --git a/test/clj/game_test/cards/identities.clj b/test/clj/game_test/cards/identities.clj index c2b9fa8786..b448b2c2c3 100644 --- a/test/clj/game_test/cards/identities.clj +++ b/test/clj/game_test/cards/identities.clj @@ -2044,8 +2044,7 @@ (run-on state "HQ") (let [q (get-in @state [:runner :identity]) iwall (get-ice state :hq 0) - qdef (core/card-def (get-in @state [:runner :identity])) - qmsg (get-in qdef [:abilities 0 :msg])] + qmsg "break 1 Barrier subroutine"] (core/rez state :corp iwall) (card-ability state :runner q 0) (is (last-log-contains? state qmsg) "Quetzal ability did trigger") diff --git a/test/clj/game_test/core.clj b/test/clj/game_test/core.clj index 6cee736f50..6c08e2292d 100644 --- a/test/clj/game_test/core.clj +++ b/test/clj/game_test/core.clj @@ -5,6 +5,7 @@ [clojure.test :refer :all] [hawk.core :as hawk] [game.core :as core] + [game.core.card-defs :refer [reset-card-defs]] [game.utils :as utils :refer [make-cid server-card]] [jinteki.cards :refer [all-cards]] [jinteki.utils :as jutils])) @@ -23,13 +24,13 @@ (map (juxt :title identity)) (into {}) (reset! all-cards)) - (core/reset-card-defs))) + (reset-card-defs))) (load-all-cards) (hawk/watch! [{:paths ["src/clj/game/cards"] :filter hawk/file? :handler (fn [ctx e] - (core/reset-card-defs + (reset-card-defs (-> e :file io/file .getName (string/split #"\.") first)))}]) ;; General utilities necessary for starting a new game