From 48759c8fe5056b0779d159833d2e08e7558c073c Mon Sep 17 00:00:00 2001 From: Karlos Martins Date: Mon, 9 Dec 2019 19:53:44 +0000 Subject: [PATCH] Metamagic Builder --- src/clj/orcpub/routes.clj | 1 + src/cljc/orcpub/dnd/e5/classes.cljc | 26 ++++++++++---- src/cljc/orcpub/route_map.cljc | 3 ++ src/cljs/orcpub/dnd/e5/db.cljs | 8 +++++ src/cljs/orcpub/dnd/e5/events.cljs | 48 ++++++++++++++++++++++++++ src/cljs/orcpub/dnd/e5/spell_subs.cljs | 29 +++++++++++++--- src/cljs/orcpub/dnd/e5/views.cljs | 41 ++++++++++++++++++++++ web/cljs/orcpub/core.cljs | 1 + 8 files changed, 146 insertions(+), 11 deletions(-) diff --git a/src/clj/orcpub/routes.clj b/src/clj/orcpub/routes.clj index 4dd1a334f..4eaef173b 100644 --- a/src/clj/orcpub/routes.clj +++ b/src/clj/orcpub/routes.clj @@ -933,6 +933,7 @@ [route-map/dnd-e5-subclass-builder-page-route] [route-map/dnd-e5-class-builder-page-route] [route-map/dnd-e5-language-builder-page-route] + [route-map/dnd-e5-metamagic-builder-page-route] [route-map/dnd-e5-invocation-builder-page-route] [route-map/dnd-e5-boon-builder-page-route] [route-map/dnd-e5-feat-builder-page-route] diff --git a/src/cljc/orcpub/dnd/e5/classes.cljc b/src/cljc/orcpub/dnd/e5/classes.cljc index d3889fd6b..95661f7c3 100644 --- a/src/cljc/orcpub/dnd/e5/classes.cljc +++ b/src/cljc/orcpub/dnd/e5/classes.cljc @@ -28,6 +28,8 @@ (spec/def ::homebrew-boon (spec/keys :req-un [::name ::key ::option-pack])) +(spec/def ::homebrew-metamagic (spec/keys :req-un [::name ::key ::option-pack])) + (defn class-level [levels class-kw] (get-in levels [class-kw :class-level])) @@ -2121,14 +2123,24 @@ :page 98 :summary "creatures have disadvantage on saves against your spells (only on the turn you cast them) if you are hidden from them"}]}]})) -(defn metamagic-selection [num] +(defn metamagic-selection [num plugin-metamagic] (t/selection-cfg {:name "Metamagic" :tags #{:class} :min num :max num :ref [:class :sorcerer :metamagic] - :options [(t/option-cfg + :options (concat + (map + (fn [{:keys [name description edit-event]}] + (t/option-cfg + {:name name + :modifiers [(mod5e/trait-cfg + {:name name + :description description})] + :edit-event edit-event})) + plugin-metamagic) + [(t/option-cfg {:name "Careful Spell" :modifiers [(mod5e/dependent-trait {:name "Careful Spell" @@ -2176,9 +2188,9 @@ :modifiers [(mod5e/trait-cfg {:name "Twinned Spell" :page 102 - :summary "spend X sorcery pts. (min 1) to target two creatures with a single target spell, where X is the spell level"})]})]})) + :summary "spend X sorcery pts. (min 1) to target two creatures with a single target spell, where X is the spell level"})]})])})) -(defn sorcerer-option [spells spells-map plugin-subclasses-map language-map weapon-map] +(defn sorcerer-option [spells spells-map plugin-subclasses-map language-map weapon-map metamagic] (opt5e/class-option spells spells-map @@ -2226,9 +2238,9 @@ :level 2 :page 101 :summary "you can convert sorcery points into spell slots (level - point cost: 1st - 2, 2nd - 3, 3rd - 5, 4th - 6, 5th - 7). You can also convert spell slots into sorcery points equal to the slot's level"})]} - 3 {:selections [(metamagic-selection 2)]} - 10 {:selections [(metamagic-selection 1)]} - 17 {:selections [(metamagic-selection 1)]}} + 3 {:selections [(metamagic-selection 2 metamagic)]} + 10 {:selections [(metamagic-selection 1 metamagic)]} + 17 {:selections [(metamagic-selection 1 metamagic)]}} :equipment-choices [{:name "Equipment Pack" :options {:dungeoneers-pack 1 :explorers-pack 1}} diff --git a/src/cljc/orcpub/route_map.cljc b/src/cljc/orcpub/route_map.cljc index 9ba0b7f83..7e2457f30 100644 --- a/src/cljc/orcpub/route_map.cljc +++ b/src/cljc/orcpub/route_map.cljc @@ -41,6 +41,7 @@ (def dnd-e5-subclass-builder-page-route :subclass-builder-5e-page) (def dnd-e5-class-builder-page-route :class-builder-5e-page) (def dnd-e5-language-builder-page-route :language-builder-5e-page) +(def dnd-e5-metamagic-builder-page-route :metamagic-builder-5e-page) (def dnd-e5-invocation-builder-page-route :invocation-builder-5e-page) (def dnd-e5-boon-builder-page-route :boon-builder-5e-page) (def dnd-e5-feat-builder-page-route :feat-builder-5e-page) @@ -71,6 +72,7 @@ dnd-e5-subclass-builder-page-route dnd-e5-class-builder-page-route dnd-e5-language-builder-page-route + dnd-e5-metamagic-builder-page-route dnd-e5-invocation-builder-page-route dnd-e5-boon-builder-page-route dnd-e5-selection-builder-page-route}) @@ -176,6 +178,7 @@ "subclass-builder" dnd-e5-subclass-builder-page-route "class-builder" dnd-e5-class-builder-page-route "language-builder" dnd-e5-language-builder-page-route + "metamagic-builder" dnd-e5-metamagic-builder-page-route "invocation-builder" dnd-e5-invocation-builder-page-route "boon-builder" dnd-e5-boon-builder-page-route "feat-builder" dnd-e5-feat-builder-page-route diff --git a/src/cljs/orcpub/dnd/e5/db.cljs b/src/cljs/orcpub/dnd/e5/db.cljs index 100df7c1a..29baf3662 100644 --- a/src/cljs/orcpub/dnd/e5/db.cljs +++ b/src/cljs/orcpub/dnd/e5/db.cljs @@ -34,6 +34,7 @@ (def local-storage-combat-key "combat") (def local-storage-background-key "background") (def local-storage-language-key "language") +(def local-storage-metamagic-key "metamagic") (def local-storage-invocation-key "invocation") (def local-storage-boon-key "boon") (def local-storage-selection-key "selection") @@ -88,6 +89,8 @@ (def default-language {}) +(def default-metamagic {}) + (def default-invocation {}) (def default-boon {}) @@ -132,6 +135,7 @@ ::combat5e/tracker-item default-combat ::bg5e/builder-item default-background ::langs5e/builder-item default-language + ::class5e/metamagic-builder-item default-metamagic ::class5e/invocation-builder-item default-invocation ::class5e/boon-builder-item default-boon ::selections5e/builder-item default-selection @@ -191,6 +195,10 @@ (if js/window.localStorage (set-item local-storage-invocation-key (str invocation)))) +(defn metamagic->local-store [metamagic] + (if js/window.localStorage + (set-item local-storage-metamagic-key (str metamagic)))) + (defn boon->local-store [boon] (if js/window.localStorage (set-item local-storage-boon-key (str boon)))) diff --git a/src/cljs/orcpub/dnd/e5/events.cljs b/src/cljs/orcpub/dnd/e5/events.cljs index 4d7f1e651..d9f9cc04b 100644 --- a/src/cljs/orcpub/dnd/e5/events.cljs +++ b/src/cljs/orcpub/dnd/e5/events.cljs @@ -37,6 +37,7 @@ combat->local-store background->local-store language->local-store + metamagic->local-store invocation->local-store boon->local-store selection->local-store @@ -54,6 +55,7 @@ default-combat default-background default-language + default-metamagic default-invocation default-boon default-selection @@ -107,6 +109,8 @@ (def language->local-store-interceptor (after language->local-store)) +(def metamagic->local-store-interceptor (after metamagic->local-store)) + (def invocation->local-store-interceptor (after invocation->local-store)) (def boon->local-store-interceptor (after boon->local-store)) @@ -157,6 +161,9 @@ (def language-interceptors [(path ::langs5e/builder-item) language->local-store-interceptor]) +(def metamagic-interceptors [(path ::class5e/metamagic-builder-item) + metamagic->local-store-interceptor]) + (def invocation-interceptors [(path ::class5e/invocation-builder-item) invocation->local-store-interceptor]) @@ -502,6 +509,14 @@ ::e5/languages "You must specify 'Name', 'Option Source Name'") +(reg-save-homebrew + "Metamagic" + ::class5e/save-metamagic + ::class5e/metamagic-builder-item + ::class5e/homebrew-metamagic + ::e5/metamagic + "You must specify 'Name', 'Option Source Name'") + (reg-save-homebrew "Invocation" ::class5e/save-invocation @@ -592,6 +607,10 @@ ::langs5e/delete-language ::e5/languages) +(reg-delete-homebrew + ::class5e/delete-metamagic + ::e5/metamagic) + (reg-delete-homebrew ::class5e/delete-invocation ::e5/invocations) @@ -1719,6 +1738,11 @@ ::class5e/set-invocation routes/dnd-e5-invocation-builder-page-route) +(reg-edit-homebrew + ::class5e/edit-metamagic + ::class5e/set-metamagic + routes/dnd-e5-metamagic-builder-page-route) + (reg-edit-homebrew ::class5e/edit-boon ::class5e/set-boon @@ -2558,6 +2582,12 @@ (fn [language [_ prop-key prop-value]] (assoc language prop-key prop-value))) +(reg-event-db + ::class5e/set-metamagic-prop + metamagic-interceptors + (fn [metamagic [_ prop-key prop-value]] + (assoc metamagic prop-key prop-value))) + (reg-event-db ::class5e/set-invocation-prop invocation-interceptors @@ -3271,6 +3301,12 @@ (fn [_ [_ invocation]] invocation)) +(reg-event-db + ::class5e/set-metamagic + metamagic-interceptors + (fn [_ [_ metamagic]] + metamagic)) + (reg-event-db ::class5e/set-boon boon-interceptors @@ -3362,6 +3398,12 @@ {:dispatch [::class5e/set-invocation default-invocation]})) +(reg-event-fx + ::class5e/reset-metamagic + (fn [_ _] + {:dispatch [::class5e/set-metamagic + default-metamagic]})) + (reg-event-fx ::class5e/reset-boon (fn [_ _] @@ -3620,6 +3662,12 @@ default-invocation routes/dnd-e5-invocation-builder-page-route) +(reg-new-homebrew + ::class5e/new-metamagic + ::class5e/set-metamagic + default-metamagic + routes/dnd-e5-metamagic-builder-page-route) + (reg-new-homebrew ::selections5e/new-selection ::selections5e/set-selection diff --git a/src/cljs/orcpub/dnd/e5/spell_subs.cljs b/src/cljs/orcpub/dnd/e5/spell_subs.cljs index ff91bcf1d..f4cdab997 100644 --- a/src/cljs/orcpub/dnd/e5/spell_subs.cljs +++ b/src/cljs/orcpub/dnd/e5/spell_subs.cljs @@ -431,6 +431,12 @@ (fn [plugins _] (apply concat (map (comp vals ::e5/feats) plugins)))) +(reg-sub + ::classes5e/plugin-metamagic + :<- [::e5/plugin-vals] + (fn [plugins _] + (apply concat (map (comp vals ::e5/metamagic) plugins)))) + (reg-sub ::classes5e/plugin-invocations :<- [::e5/plugin-vals] @@ -860,7 +866,7 @@ tiefling-option-cfg])))))) -(defn base-class-options [spell-lists spells-map plugin-subclasses-map language-map weapons-map invocations boons] +(defn base-class-options [spell-lists spells-map plugin-subclasses-map language-map weapons-map invocations boons metamagic] [(classes5e/barbarian-option spell-lists spells-map plugin-subclasses-map language-map weapons-map) (classes5e/bard-option spell-lists spells-map plugin-subclasses-map language-map weapons-map) (classes5e/cleric-option spell-lists spells-map plugin-subclasses-map language-map weapons-map) @@ -870,7 +876,7 @@ (classes5e/paladin-option spell-lists spells-map plugin-subclasses-map language-map weapons-map) (classes5e/ranger-option spell-lists spells-map plugin-subclasses-map language-map weapons-map) (classes5e/rogue-option spell-lists spells-map plugin-subclasses-map language-map weapons-map) - (classes5e/sorcerer-option spell-lists spells-map plugin-subclasses-map language-map weapons-map) + (classes5e/sorcerer-option spell-lists spells-map plugin-subclasses-map language-map weapons-map metamagic) (classes5e/warlock-option spell-lists spells-map plugin-subclasses-map language-map weapons-map invocations boons) (classes5e/wizard-option spell-lists spells-map plugin-subclasses-map language-map weapons-map)]) @@ -881,10 +887,11 @@ :<- [::classes5e/plugin-subclasses-map] :<- [::langs5e/language-map] :<- [::classes5e/plugin-classes] + :<- [::classes5e/metamagic] :<- [::classes5e/invocations] :<- [::classes5e/boons] :<- [::mi5e/custom-and-standard-weapons-map] - (fn [[spell-lists spells-map plugin-subclasses-map language-map plugin-classes invocations boons weapons-map] _] + (fn [[spell-lists spells-map plugin-subclasses-map language-map plugin-classes metamagic invocations boons weapons-map] _] (vec (into (sorted-set-by #(compare (::t/key %1) (::t/key %2))) @@ -900,7 +907,7 @@ weapons-map plugin-class)) plugin-classes)) - (base-class-options spell-lists spells-map plugin-subclasses-map language-map weapons-map invocations boons)))))) + (base-class-options spell-lists spells-map plugin-subclasses-map language-map weapons-map invocations boons metamagic)))))) (reg-sub ::classes5e/class-map @@ -935,6 +942,15 @@ (assoc feat :edit-event [::feats5e/edit-feat feat])) plugin-feats))) +(reg-sub + ::classes5e/metamagic + :<- [::classes5e/plugin-metamagic] + (fn [plugin-metamagic] + (map + (fn [metamagic] + (assoc metamagic :edit-event [::classes5e/edit-metamagic metamagic])) + plugin-metamagic))) + (reg-sub ::classes5e/invocations :<- [::classes5e/plugin-invocations] @@ -1227,6 +1243,11 @@ (fn [db _] (::classes5e/subclass-builder-item db))) +(reg-sub + ::classes5e/metamagic-builder-item + (fn [db _] + (::classes5e/metamagic-builder-item db))) + (reg-sub ::classes5e/invocation-builder-item (fn [db _] diff --git a/src/cljs/orcpub/dnd/e5/views.cljs b/src/cljs/orcpub/dnd/e5/views.cljs index 1ee61619a..ca1dc2f60 100644 --- a/src/cljs/orcpub/dnd/e5/views.cljs +++ b/src/cljs/orcpub/dnd/e5/views.cljs @@ -529,6 +529,8 @@ :route routes/dnd-e5-class-builder-page-route} {:name "Subclass Builder" :route routes/dnd-e5-subclass-builder-page-route} + {:name "Metamagic Builder" + :route routes/dnd-e5-metamagic-builder-page-route} {:name "Eldritch Invocation Builder" :route routes/dnd-e5-invocation-builder-page-route} {:name "Pact Boon Builder" @@ -4072,6 +4074,9 @@ (defn language-input-field [title prop language & [class-names]] (builder-input-field title prop language ::langs/set-language-prop class-names)) +(defn metamagic-input-field [title prop metamagic & [class-names]] + (builder-input-field title prop metamagic ::classes/set-metamagic-prop class-names)) + (defn invocation-input-field [title prop invocation & [class-names]] (builder-input-field title prop invocation ::classes/set-invocation-prop class-names)) @@ -6093,6 +6098,27 @@ {:value (get language :description) :on-change #(dispatch [::langs/set-language-prop :description %])}]]])) +(defn metamagic-builder [] + (let [metamagic @(subscribe [::classes/metamagic-builder-item])] + [:div.p-20.main-text-color + [:div.flex.w-100-p.flex-wrap + [metamagic-input-field + "Name" + :name + metamagic + "m-b-20"] + [metamagic-input-field + option-source-name-label + :option-pack + metamagic + "m-l-5 m-b-20"]] + [:div.w-100-p + [:div.f-s-24.f-w-b + "Description"] + [textarea-field + {:value (get metamagic :description) + :on-change #(dispatch [::classes/set-metamagic-prop :description %])}]]])) + (defn boon-builder [] (let [boon @(subscribe [::classes/boon-builder-item])] [:div.p-20.main-text-color @@ -7183,6 +7209,17 @@ ::classes/delete-subclass "subclasses"]) +(defn my-metamagic [name plugin] + [my-content-type + name + plugin + "metamagic" + ::e5/metamagic + "magic-swirl" + ::classes/new-metamagic + ::classes/edit-metamagic + ::classes/delete-metamagic]) + (defn my-invocations [name plugin] [my-content-type name @@ -7262,6 +7299,7 @@ [my-subraces name plugin] [my-classes name plugin] [my-subclasses name plugin] + [my-metamagic name plugin] [my-invocations name plugin] [my-boons name plugin] [my-feats name plugin] @@ -7389,6 +7427,9 @@ (defn language-builder-page [] (builder-page "Language" ::langs/reset-language ::langs/save-language language-builder)) +(defn metamagic-builder-page [] + (builder-page "Metamagic" ::classes/reset-metamagic ::classes/save-metamagic metamagic-builder)) + (defn invocation-builder-page [] (builder-page "Eldritch Invocation" ::classes/reset-invocation ::classes/save-invocation invocation-builder)) diff --git a/web/cljs/orcpub/core.cljs b/web/cljs/orcpub/core.cljs index 43568d3f7..c4af73e35 100644 --- a/web/cljs/orcpub/core.cljs +++ b/web/cljs/orcpub/core.cljs @@ -45,6 +45,7 @@ routes/dnd-e5-class-builder-page-route views/class-builder-page routes/dnd-e5-feat-builder-page-route views/feat-builder-page routes/dnd-e5-language-builder-page-route views/language-builder-page + routes/dnd-e5-metamagic-builder-page-route views/metamagic-builder-page routes/dnd-e5-invocation-builder-page-route views/invocation-builder-page routes/dnd-e5-boon-builder-page-route views/boon-builder-page routes/dnd-e5-selection-builder-page-route views/selection-builder-page