From aed6c41e723a972db65170a402fd71c2bd36305f Mon Sep 17 00:00:00 2001 From: codeGlaze Date: Tue, 23 Feb 2021 23:16:43 -0500 Subject: [PATCH 1/7] Fixes issue #508 WARNING: breaks existing name keys for the various Wands of the War Mage + Introduce new generic function for creating + Added some missing "action" blurbs + Fixes possible typo in `from-internal-item` properties + Automatic EOL changes to fit file format --- src/cljc/orcpub/dnd/e5/magic_items.cljc | 114 ++++++++++++++---------- 1 file changed, 67 insertions(+), 47 deletions(-) diff --git a/src/cljc/orcpub/dnd/e5/magic_items.cljc b/src/cljc/orcpub/dnd/e5/magic_items.cljc index c2553fcdb..0d874eb0b 100644 --- a/src/cljc/orcpub/dnd/e5/magic_items.cljc +++ b/src/cljc/orcpub/dnd/e5/magic_items.cljc @@ -215,7 +215,8 @@ ::subtypes ::rarity ::description - ::attunementb + ;::attunementb ;typo? + ::attunement ::magical-damage-bonus ::magical-attack-bonus ::magical-ac-bonus @@ -260,8 +261,8 @@ (def weapon-not-ammunition? (complement ammunition?)) -(defn heavy-metal-armor? [a] - (and (#{:medium :heavy} (:type a)) +(defn heavy-metal-armor? [a] + (and (#{:medium :heavy} (:type a)) (not= :hide (:key a)))) (defn not-shield? [a] (#{:light :medium :heavy} (:type a))) @@ -285,7 +286,7 @@ They return to Valhalla after 1 hour or when they drop to 0 hit points. Once you (str " You must have proficiency with all " requirement - ". If you blow the horn without meeting this requirement, the summoned berserkers attack you. If you meet the requirement, they are friendly to you and your companions and follow your commands."))) + ". If you blow the horn without meeting this requirement, the summoned berserkers attack you. If you meet the requirement, they are friendly to you and your companions and follow your commands."))) }) (defn potion-of-giant-strength [name strength rarity] @@ -333,6 +334,25 @@ Additionally, you can focus your senses as an action to magically discern the di direction to the closest dragon within 30 miles of you that is of the same type as the armor. This special action can’t be used again until the next dawn." )}) +(defn + ^{:doc "Generic function for creating magic items with + bonuses. + Use :sp-atk-mod for spell-attack-modifier bonuses. + Use :sp-dc-mod for spell DC bonuses" + ; :test (fn [] ()) + ; :arglists ([name ]) + :user/comment "This 'cleans' up item definitions... but could make them harder to read if it was applied all the way around."} + + caster-bonus-item [name bonus type rarity attunement modv description] + (let [full-name (str name " +" bonus)] + {name-key full-name + ::type type + ::rarity rarity + ::attunement (if (vector? attunement) attunement [attunement]) ;array should be passed not just one keyword + ::modifiers [(for [i modv] + (cond (= i :sp-atk-mod) (mod5e/spell-attack-modifier-bonus bonus) + (= i :sp-dc-mod) (mod5e/spell-save-dc-bonus bonus)))] + ::decription description})) + (defn rod-of-the-pact-keeper [bonus] {name-key (str "Rod of the Pact Keeper +" bonus) ::type :rod @@ -347,7 +367,8 @@ direction to the closest dragon within 30 miles of you that is of the same type :frequency units5e/long-rests-1 :summary "Regain a warlock spell slot"})] ::summary (str (common/bonus-str bonus) - " to spell attack rolls and saving throw DCs for your warlock spells")}) + " to spell attack rolls and saving throw DCs for your warlock spells") + }) (defn ioun-stone [name rarity description & modifiers] (let [full-name (str "Ioun Stone (" name ")")] @@ -425,7 +446,7 @@ Curse. This armor is cursed, a fact that is revealed only when an identify spell ::description (str "You have resistance to " (name damage-type) " damage.") }) damage-types5e/damage-types)) - + (def raw-magic-items (concat armors-of-resistance @@ -658,7 +679,7 @@ If you aren’t a dwarf, you gain the following additional benefits while wearin ::attunement [:any] ::modifiers [(belt-of-giant-strength-mod 23)] - + ::description "While wearing this belt, your Strength score changes to 23. If your Strength is already equal to or greater than 23, the item has no effect on you." } { @@ -825,7 +846,7 @@ Alternatively, when you light the candle for the first time, you can cast the ga name-key "Cape of the Mountebank" ::type :wondrous-item ::rarity :rare - ::modifiers [(mod5e/action + ::modifiers [(mod5e/action {:name "Cape of the Mountebank" :page 157 :source :dmg @@ -857,7 +878,7 @@ The chime can be used ten times. After the tenth time, it cracks and becomes use name-key "Circlet of Blasting" ::type :wondrous-item ::rarity :uncommon - ::modifiers [(mod5e/action + ::modifiers [(mod5e/action {:name "Circlet of Blasting" :page 158 :source :dmg @@ -872,7 +893,7 @@ The chime can be used ten times. After the tenth time, it cracks and becomes use ::attunement [:any] ::modifiers [(mod5e/damage-resistance :poison) - (mod5e/action + (mod5e/action {:name "Cloak of Arachnidia" :page 158 :source :dmg @@ -939,7 +960,7 @@ shifts to camouflage you. Pulling the hood up or down requires an action."} ::rarity :rare ::attunement [:any] - ::modifiers [(mod5e/action + ::modifiers [(mod5e/action {:name "Cloak of the Bat" :page 159 :source :dmg @@ -2107,7 +2128,7 @@ If you die while wearing the ring, your soul enters it, unless it already houses ::type :ring ::rarity :very-rare ::attunement [:any] - ::attunement-details "requires attunement outdoors at night" + ::attunement-details "requires attunement outdoors at night" ::description "While wearing this ring in dim light or darkness, you can cast dancing lights and light from the ring at will. Casting either spell from the ring requires an action. The ring has 6 charges for the following other properties. The ring regains 1d6 expended charges daily at dawn. Faerie Fire. You can expend 1 charge as an action to cast faerie fire from the ring. @@ -2497,20 +2518,20 @@ Retributive Strike. You can use an action to break the staff over your knee or a You have a 50 percent chance to instantly travel to a random plane of existence, avoiding the explosion. If you fail to avoid the effect, you take force damage equal to 16 × the number of charges in the staff. Every other creature in the area must make a DC 17 Dexterity saving throw. On a failed save, a creature takes an amount of damage based on how far away it is from the point of origin, as shown in the following table. On a successful save, a creature takes half as much damage." }{ name-key "Staff of Striking" - ::type :weapon - ::item-subtype :staff - ::rarity :very-rare + ::type :weapon + ::item-subtype :staff + ::rarity :very-rare - ::attunement [:any] - ::magical-attack-bonus 3 - ::magical-damage-bonus 3 - ::description "This staff can be wielded as a magic quarterstaff that grants a +3 bonus to attack and damage rolls made with it. + ::attunement [:any] + ::magical-attack-bonus 3 + ::magical-damage-bonus 3 + ::description "This staff can be wielded as a magic quarterstaff that grants a +3 bonus to attack and damage rolls made with it. The staff has 10 charges. When you hit with a melee attack using it, you can expend up to 3 of its charges. For each charge you expend, the target takes an extra 1d6 force damage. The staff regains 1d6 + 4 expended charges daily at dawn. If you expend the last charge, roll a d20. On a 1, the staff becomes a nonmagical quarterstaff." }{ name-key "Staff of Swarming Insects" ::type :weapon ::item-subtype :staff - ::rarity :rare + ::rarity :rare ::attunement [:bard, :cleric, :druid, :sorcerer, :warlock, :wizard] ::description "This staff has 10 charges and regains 1d6 + 4 expended charges daily at dawn. If you expend the last charge, roll a d20. On a 1, a swarm of insects consumes and destroys the staff, then disperses. @@ -2525,7 +2546,14 @@ Insect Cloud. While holding the staff, you can use an action and expend 1 charge ::attunement [:sorcerer, :warlock, :wizard] ::magical-attack-bonus 2 ::magical-damage-bonus 2 - ::modifiers [(mod5e/spell-attack-modifier-bonus 2)] + ::modifiers [(mod5e/spell-attack-modifier-bonus 2) + (mod5e/saving-throw-advantage ["spells"]) + (mod5e/reaction + {:name "Staff of the Magi" + :page 203 + :source :dmg + :frequency units5e/long-rests-1 + :summary "Absorb spell cast by another creature, targetting only you. Cancel its effect and gain charges equal to absorbed spell's level. Staff explodes, as per Retributive Strike, if brought over 50 charges."})] ::description "This staff can be wielded as a magic quarterstaff that grants a +2 bonus to attack and damage rolls made with it. While you hold it, you gain a +2 bonus to spell attack rolls. The staff has 50 charges for the following properties. It regains 4d6 + 2 expended charges daily at dawn. If you expend the last charge, roll a d20. On a 20, the staff regains 1d12 + 1 charges. Spell Absorption. While holding the staff, you have advantage on saving throws against spells. In addition, you can use your reaction when another creature casts a spell that targets only you. If you do, the staff absorbs the magic of the spell, canceling its effect and gaining a number of charges equal to the absorbed spell’s level. However, if doing so brings the staff’s total number of charges above 50, the staff explodes as if you activated its retributive strike (see below). @@ -2612,7 +2640,7 @@ The staff can be wielded as a magic quarterstaff. On a hit, it deals damage as a ::magical-damage-bonus 2 ::magical-damage-type :radiant ::magical-finesse? true - + ::description "This item appears to be a longsword hilt. While grasping the hilt, you can use a bonus action to cause a blade of pure radiance to spring into existence, or make the blade disappear. While the blade exists, this magic longsword has the finesse property. If you are proficient with shortswords or longswords, you are proficient with the sun blade. You gain a +2 bonus to attack and damage rolls made with this weapon, which deals radiant damage instead of slashing damage. When you hit an undead with it, that target takes an extra 1d8 radiant damage. The sword’s luminous blade emits bright light in a 15-foot radius and dim light for an additional 15 feet. The light is sunlight. While the blade persists, you can use an action to expand or reduce its radius of bright and dim light by 5 feet each, to a maximum of 30 feet each or a minimum of 10 feet each." @@ -2646,12 +2674,12 @@ foot radius and dim light for an additional 10 feet. Speaking the command word a Once per turn, when you hit a creature with an attack using this magic weapon, you can wound the target. At the start of each of the wounded creature’s turns, it takes 1d4 necrotic damage for each time you’ve wounded it, and it can then make a DC 15 Constitution saving throw, ending the effect of all such wounds on itself on a success. Alternatively, the wounded creature, or a creature within 5 feet of it, can use an action to make a DC 15 Wisdom (Medicine) check, ending the effect of such wounds on it on a success." }{ name-key "Talisman of Pure Good" - ::type :wondrous-item + ::type :wondrous-item - ::rarity :legendary + ::rarity :legendary - ::attunement [:good] - ::description "This talisman is a mighty symbol of goodness. A creature that is neither good nor evil in alignment takes 6d6 radiant damage upon touching the talisman. An evil creature takes 8d6 radiant damage upon touching the talisman. Either sort of creature takes the damage again each time it ends its turn holding or carrying the talisman. + ::attunement [:good] + ::description "This talisman is a mighty symbol of goodness. A creature that is neither good nor evil in alignment takes 6d6 radiant damage upon touching the talisman. An evil creature takes 8d6 radiant damage upon touching the talisman. Either sort of creature takes the damage again each time it ends its turn holding or carrying the talisman. If you are a good cleric or paladin, you can use the talisman as a holy symbol, and you gain a +2 bonus to spell attack rolls while you wear or hold it. The talisman has 7 charges. If you are wearing or holding it, you can use an action to expend 1 charge from it and choose one creature you can see on the ground within 120 feet of you. If the target is of evil alignment, a flaming fissure opens under it. The target must succeed on a DC 20 Dexterity saving throw or fall into the fissure and be destroyed, leaving no remains. The fissure then closes, leaving no trace of its existence. When you expend the last charge, the talisman disperses into motes of golden light and is destroyed." }{ @@ -2816,25 +2844,17 @@ The wand regains 1d6 + 1 expended charges daily at dawn. If you expend the wand ::type :wand ::rarity :uncommon ::description "The wand has 3 charges. While holding it, you can use an action to expend 1 of its charges, and if a secret door or trap is within 30 feet of you, the wand pulses and points at the one nearest to you. The wand regains 1d3 expended charges daily at dawn." - }{ - name-key "Wand of the War Mage, +1" - ::type :wand - ::rarity :uncommon - ::attunement [:spellcaster] - ::description "While holding this wand, you gain a +1 bonus to spell attack rolls. In addition, you ignore half cover when making a spell attack." - }{ - name-key "Wand of the War Mage, +2" - ::type :wand - ::rarity :rare - ::attunement [:spellcaster] - ::description "While holding this wand, you gain a +2 bonus to spell attack rolls. In addition, you ignore half cover when making a spell attack." - }{ - name-key "Wand of the War Mage, +3" - ::type :wand - ::rarity :very-rare - ::attunement [:spellcaster] - ::description "While holding this wand, you gain a +3 bonus to spell attack rolls. In addition, you ignore half cover when making a spell attack." - }{ + } + (caster-bonus-item "Wand of the War Mage" 1 :wand :rare [:spellcaster] + [:sp-atk-mod] + "While holding this wand, you gain a +1 bonus to spell attack rolls. In addition, you ignore half cover when making a spell attack.") + (caster-bonus-item "Wand of the War Mage" 2 :wand :rare [:spellcaster] + [:sp-atk-mod] + "While holding this wand, you gain a +2 bonus to spell attack rolls. In addition, you ignore half cover when making a spell attack.") + (caster-bonus-item "Wand of the War Mage" 3 :wand :rare [:spellcaster] + [:sp-atk-mod] + "While holding this wand, you gain a +3 bonus to spell attack rolls. In addition, you ignore half cover when making a spell attack.") + { name-key "Wand of Web" ::type :wand ::rarity :uncommon @@ -2966,7 +2986,7 @@ The boots regain 2 hours of flying capability for every 12 hours they aren’t i (throw (IllegalArgumentException. (str "No base types matched for weapon item!: " (::name item)))))) (map (fn [weapon] - (let [name (if name-fn + (let [name (if name-fn (name-fn weapon) (if (> (count of-type) 1) (str (name-key item) ", " (:name weapon)) @@ -3014,7 +3034,7 @@ The boots regain 2 hours of flying capability for every 12 hours they aren’t i (map (fn [armor] (let [name (if (> (count of-type) 1) - (if name-fn + (if name-fn (name-fn armor) (str (name-key item) ", " (:name armor))) (name-key item)) From db48dc8a3f7e9d128ef9f7809db3fceb5677e8fd Mon Sep 17 00:00:00 2001 From: codeGlaze Date: Sat, 27 Feb 2021 18:04:05 -0500 Subject: [PATCH 2/7] Begin adding groundwork for select damage mods * Added `?melee-damage-bonus-fns` and `?ranged-damage-bonus-fns`to damage modifier calculation * Added checking for one-handedness to apply Dueling Fighting Style Bonus + Correctly applies only to melee - TODO filter application of bonus to only one handed weapons * Added new method `melee-damage-bonus-fn` to handle generic, conditional, damage bonuses * Added boolean method `bow?` for checking if (long|short) bow, basically. Matches other weapon boolean checks. * Incidental EOL change in `weapons.cljc` to LF --- src/cljc/orcpub/dnd/e5/magic_items.cljc | 41 ++++++++++++++--------- src/cljc/orcpub/dnd/e5/modifiers.cljc | 14 ++++++++ src/cljc/orcpub/dnd/e5/options.cljc | 23 ++++++++++++- src/cljc/orcpub/dnd/e5/template_base.cljc | 13 +++++-- src/cljc/orcpub/dnd/e5/weapons.cljc | 2 +- 5 files changed, 73 insertions(+), 20 deletions(-) diff --git a/src/cljc/orcpub/dnd/e5/magic_items.cljc b/src/cljc/orcpub/dnd/e5/magic_items.cljc index c2553fcdb..a250b5aed 100644 --- a/src/cljc/orcpub/dnd/e5/magic_items.cljc +++ b/src/cljc/orcpub/dnd/e5/magic_items.cljc @@ -246,6 +246,11 @@ (defn axe? [w] (= :axe (::weapons5e/subtype w))) +(defn bow? [w] + (or (= :longbow (::weapons5e/subtype w)) + (= :shortbow (::weapons5e/subtype w))) + ) + (defn slashing-sword? [w] (and (= :slashing (::weapons5e/damage-type w)) (sword? w))) @@ -260,8 +265,8 @@ (def weapon-not-ammunition? (complement ammunition?)) -(defn heavy-metal-armor? [a] - (and (#{:medium :heavy} (:type a)) +(defn heavy-metal-armor? [a] + (and (#{:medium :heavy} (:type a)) (not= :hide (:key a)))) (defn not-shield? [a] (#{:light :medium :heavy} (:type a))) @@ -285,7 +290,7 @@ They return to Valhalla after 1 hour or when they drop to 0 hit points. Once you (str " You must have proficiency with all " requirement - ". If you blow the horn without meeting this requirement, the summoned berserkers attack you. If you meet the requirement, they are friendly to you and your companions and follow your commands."))) + ". If you blow the horn without meeting this requirement, the summoned berserkers attack you. If you meet the requirement, they are friendly to you and your companions and follow your commands."))) }) (defn potion-of-giant-strength [name strength rarity] @@ -308,7 +313,9 @@ The creature exists for a duration specific to each figurine. At the end of the " description)}) (defn belt-of-giant-strength-mod [value] - (mod/vec-mod ?ability-overrides {:ability :orcpub.dnd.e5.character/str :value (min 30 (+ value (if (and ?giants-bane-gauntlet ?giants-bane-hammer) 4 0)))})) + (mod/vec-mod ?ability-overrides + {:ability :orcpub.dnd.e5.character/str :value + (min 30 (+ value (if (and ?giants-bane-gauntlet ?giants-bane-hammer) 4 0)))})) (defn dragon-scale-mail [color-nm resistance-kw] {name-key (str "Dragon Scale Mail, " color-nm) @@ -425,7 +432,7 @@ Curse. This armor is cursed, a fact that is revealed only when an identify spell ::description (str "You have resistance to " (name damage-type) " damage.") }) damage-types5e/damage-types)) - + (def raw-magic-items (concat armors-of-resistance @@ -658,7 +665,7 @@ If you aren’t a dwarf, you gain the following additional benefits while wearin ::attunement [:any] ::modifiers [(belt-of-giant-strength-mod 23)] - + ::description "While wearing this belt, your Strength score changes to 23. If your Strength is already equal to or greater than 23, the item has no effect on you." } { @@ -770,6 +777,9 @@ The bowl is about 1 foot in diameter and half as deep. It weighs 3 pounds and ho ::rarity :uncommon ::attunement [:any] + ::modifiers [(mod5e/weapon-proficiency :longbow) + (mod5e/weapon-proficiency :shortbow) + (mod5e/weapon-attack-bonus-mod #{:longbow :shortbow} 2)] ::description "While wearing these bracers, you have proficiency with the longbow and shortbow, and you gain a +2 bonus to damage rolls on ranged attacks made with such weapons." }{ name-key "Bracers of Defense" @@ -825,7 +835,7 @@ Alternatively, when you light the candle for the first time, you can cast the ga name-key "Cape of the Mountebank" ::type :wondrous-item ::rarity :rare - ::modifiers [(mod5e/action + ::modifiers [(mod5e/action {:name "Cape of the Mountebank" :page 157 :source :dmg @@ -857,7 +867,7 @@ The chime can be used ten times. After the tenth time, it cracks and becomes use name-key "Circlet of Blasting" ::type :wondrous-item ::rarity :uncommon - ::modifiers [(mod5e/action + ::modifiers [(mod5e/action {:name "Circlet of Blasting" :page 158 :source :dmg @@ -872,7 +882,7 @@ The chime can be used ten times. After the tenth time, it cracks and becomes use ::attunement [:any] ::modifiers [(mod5e/damage-resistance :poison) - (mod5e/action + (mod5e/action {:name "Cloak of Arachnidia" :page 158 :source :dmg @@ -939,7 +949,7 @@ shifts to camouflage you. Pulling the hood up or down requires an action."} ::rarity :rare ::attunement [:any] - ::modifiers [(mod5e/action + ::modifiers [(mod5e/action {:name "Cloak of the Bat" :page 159 :source :dmg @@ -1519,7 +1529,6 @@ While focusing on a creature with detect thoughts, you can use an action to cast ::magical-attack-bonus 3 ::magical-damage-bonus 3 ::description "You gain a +3 bonus to attack and damage rolls made with this magic weapon. When you hit a fiend or an undead with it, that creature takes an extra 2d10 radiant damage. ->>>>>>> master While you hold the drawn sword, it creates an aura in a 10-foot radius around you. You and all creatures friendly to you in the aura have advantage on saving throws against spells and other magical effects. If you have 17 or more levels in the paladin class, the radius of the aura increases to 30 feet." }{ @@ -2107,7 +2116,7 @@ If you die while wearing the ring, your soul enters it, unless it already houses ::type :ring ::rarity :very-rare ::attunement [:any] - ::attunement-details "requires attunement outdoors at night" + ::attunement-details "requires attunement outdoors at night" ::description "While wearing this ring in dim light or darkness, you can cast dancing lights and light from the ring at will. Casting either spell from the ring requires an action. The ring has 6 charges for the following other properties. The ring regains 1d6 expended charges daily at dawn. Faerie Fire. You can expend 1 charge as an action to cast faerie fire from the ring. @@ -2510,7 +2519,7 @@ The staff has 10 charges. When you hit with a melee attack using it, you can exp name-key "Staff of Swarming Insects" ::type :weapon ::item-subtype :staff - ::rarity :rare + ::rarity :rare ::attunement [:bard, :cleric, :druid, :sorcerer, :warlock, :wizard] ::description "This staff has 10 charges and regains 1d6 + 4 expended charges daily at dawn. If you expend the last charge, roll a d20. On a 1, a swarm of insects consumes and destroys the staff, then disperses. @@ -2612,7 +2621,7 @@ The staff can be wielded as a magic quarterstaff. On a hit, it deals damage as a ::magical-damage-bonus 2 ::magical-damage-type :radiant ::magical-finesse? true - + ::description "This item appears to be a longsword hilt. While grasping the hilt, you can use a bonus action to cause a blade of pure radiance to spring into existence, or make the blade disappear. While the blade exists, this magic longsword has the finesse property. If you are proficient with shortswords or longswords, you are proficient with the sun blade. You gain a +2 bonus to attack and damage rolls made with this weapon, which deals radiant damage instead of slashing damage. When you hit an undead with it, that target takes an extra 1d8 radiant damage. The sword’s luminous blade emits bright light in a 15-foot radius and dim light for an additional 15 feet. The light is sunlight. While the blade persists, you can use an action to expand or reduce its radius of bright and dim light by 5 feet each, to a maximum of 30 feet each or a minimum of 10 feet each." @@ -2966,7 +2975,7 @@ The boots regain 2 hours of flying capability for every 12 hours they aren’t i (throw (IllegalArgumentException. (str "No base types matched for weapon item!: " (::name item)))))) (map (fn [weapon] - (let [name (if name-fn + (let [name (if name-fn (name-fn weapon) (if (> (count of-type) 1) (str (name-key item) ", " (:name weapon)) @@ -3014,7 +3023,7 @@ The boots regain 2 hours of flying capability for every 12 hours they aren’t i (map (fn [armor] (let [name (if (> (count of-type) 1) - (if name-fn + (if name-fn (name-fn armor) (str (name-key item) ", " (:name armor))) (name-key item)) diff --git a/src/cljc/orcpub/dnd/e5/modifiers.cljc b/src/cljc/orcpub/dnd/e5/modifiers.cljc index 73a5fabf3..977475480 100644 --- a/src/cljc/orcpub/dnd/e5/modifiers.cljc +++ b/src/cljc/orcpub/dnd/e5/modifiers.cljc @@ -545,6 +545,9 @@ (defn attack-modifier-fn [bonus-fn] (mods/vec-mod ?attack-modifier-fns bonus-fn)) +(defn melee-damage-bonus-fn [bonus-fn] + (mods/vec-mod ?melee-damage-bonus-fns bonus-fn)) + (defn armored-ac-bonus [bonus] (mods/cum-sum-mod ?armored-ac-bonus bonus)) @@ -586,6 +589,17 @@ (let [flat-mappings (conj (vec (apply concat (sort-by first > (dissoc mappings :default)))) (:default mappings))] `(condp <= ~level ~@flat-mappings))) +(defn + ^{:doc "Function that allows application of bonuses to specific weapons." + :user/comment "Moved from commented-out UA namespace."} + + weapon-attack-bonus-mod [weapons bonus] + (attack-modifier-fn + (fn [{kw :key base-kw :base-key}] + (if (weapons kw) + bonus + 0)))) + (def mods-map {:ability ability :ability-override ability-override diff --git a/src/cljc/orcpub/dnd/e5/options.cljc b/src/cljc/orcpub/dnd/e5/options.cljc index 527a7f716..ced9cd78d 100644 --- a/src/cljc/orcpub/dnd/e5/options.cljc +++ b/src/cljc/orcpub/dnd/e5/options.cljc @@ -1705,7 +1705,28 @@ :modifiers [(modifiers/trait-cfg {:name "Dueling Fighting Style" :page 72 - :description "When you are wielding a melee weapon in one hand and no other weapons, you gain a +2 bonus to damage rolls with that weapon."})]}) + :description "When you are wielding a melee weapon in one hand and no other weapons, you gain a +2 bonus to damage rolls with that weapon."}) + ;(mods/vec-mod ?ac-bonus-fns + ;(mods/vec-mod ?attack-modifier-fns + (mods/vec-mod ?melee-damage-bonus-fns ;vec-mod prop + (fn [_ _] 5) ;vec-mod val ... maybe? + nil ;vec-mod nm + nil ;vec-mod value ... maybe? + [(let [main-hand-weapon ?orcpub.dnd.e5.character/main-hand-weapon + off-hand-weapon ?orcpub.dnd.e5.character/off-hand-weapon + all-weapons-map @(subscribe [::mi/all-weapons-map])] + (and (and main-hand-weapon + (-> all-weapons-map + main-hand-weapon + ::weapons/melee?) + (not (-> all-weapons-map + main-hand-weapon + ::weapons/two-handed?))) + (and off-hand-weapon + (not (-> all-weapons-map ;ensure no weapons in off hand + off-hand-weapon + ::weapons/type)))))]) + ]}) (t/option-cfg {:name "Great Weapon Fighting" :modifiers [(modifiers/trait-cfg diff --git a/src/cljc/orcpub/dnd/e5/template_base.cljc b/src/cljc/orcpub/dnd/e5/template_base.cljc index e080ff2f3..34ddda715 100644 --- a/src/cljc/orcpub/dnd/e5/template_base.cljc +++ b/src/cljc/orcpub/dnd/e5/template_base.cljc @@ -224,8 +224,17 @@ (let [definitely-finesse? (and finesse? (::weapon5e/finesse? weapon)) melee? (::weapon5e/melee? weapon)] - (+ (or (::mi5e/magical-damage-bonus weapon) 0) - (?weapon-ability-damage-modifier weapon definitely-finesse? off-hand?)))) + (apply + + (+ (or (::mi5e/magical-damage-bonus weapon) 0) + (?weapon-ability-damage-modifier weapon definitely-finesse? off-hand?)) + (if melee? + (map + #(% weapon) + ?melee-damage-bonus-fns) + (map + #(% weapon) + ?ranged-damage-bonus-fns)) ;any non-melee is assumed to be ranged/finesse/dex + ))) ?best-weapon-damage-modifier (fn [weapon & [off-hand?]] (max (?weapon-damage-modifier weapon false off-hand?) (?weapon-damage-modifier weapon true off-hand?))) diff --git a/src/cljc/orcpub/dnd/e5/weapons.cljc b/src/cljc/orcpub/dnd/e5/weapons.cljc index c0006cd8e..55d953370 100644 --- a/src/cljc/orcpub/dnd/e5/weapons.cljc +++ b/src/cljc/orcpub/dnd/e5/weapons.cljc @@ -226,7 +226,7 @@ ::melee? true ::finesse? false :key :longsword - ::link "https://en.wikipedia.org/wiki/Sword"} + ::link "https://en.wikipedia.org/wiki/Sword"} {:name "Maul", ::damage-type :bludgeoning, ::damage-die 6, From 8a7ccce4019c54d872686433fddaabeb90e2a6a4 Mon Sep 17 00:00:00 2001 From: codeGlaze Date: Sun, 28 Feb 2021 00:17:37 -0500 Subject: [PATCH 3/7] Fixes Issue #249, Fixes #514; * Fixed Dueling style not applying +2 bonus to one handed melee weapons. + Properly checks for weapons in only one hand + Properly only applies to non-two handed melee weapons * Commented out melee- and ranged- specific damage bonus methods. Weird front end issues occurred when `apply` was... applied to those maps plus the map for the generic `damage-bonus-fns` * Properly utilizing the passed functions and conditions should eliminate the need for those other two methods. * Fixed Bracers of Archery applying attack bonus instead of damage bonus * Added new method `weapon-damage-bonus-mod` which duplicates almost all the code from `weapon-attack-bonus-mod`. Combining them may be worthwhile, using a third parameter to set which bonus we want, or even both. --- src/cljc/orcpub/dnd/e5/magic_items.cljc | 2 +- src/cljc/orcpub/dnd/e5/modifiers.cljc | 22 ++++++++++++++++++++-- src/cljc/orcpub/dnd/e5/options.cljc | 7 +++---- src/cljc/orcpub/dnd/e5/template_base.cljc | 18 ++++++++++-------- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/cljc/orcpub/dnd/e5/magic_items.cljc b/src/cljc/orcpub/dnd/e5/magic_items.cljc index a250b5aed..79bedd0c7 100644 --- a/src/cljc/orcpub/dnd/e5/magic_items.cljc +++ b/src/cljc/orcpub/dnd/e5/magic_items.cljc @@ -779,7 +779,7 @@ The bowl is about 1 foot in diameter and half as deep. It weighs 3 pounds and ho ::attunement [:any] ::modifiers [(mod5e/weapon-proficiency :longbow) (mod5e/weapon-proficiency :shortbow) - (mod5e/weapon-attack-bonus-mod #{:longbow :shortbow} 2)] + (mod5e/weapon-damage-bonus-mod #{:longbow :shortbow} 2)] ::description "While wearing these bracers, you have proficiency with the longbow and shortbow, and you gain a +2 bonus to damage rolls on ranged attacks made with such weapons." }{ name-key "Bracers of Defense" diff --git a/src/cljc/orcpub/dnd/e5/modifiers.cljc b/src/cljc/orcpub/dnd/e5/modifiers.cljc index 977475480..5854aa61c 100644 --- a/src/cljc/orcpub/dnd/e5/modifiers.cljc +++ b/src/cljc/orcpub/dnd/e5/modifiers.cljc @@ -545,6 +545,13 @@ (defn attack-modifier-fn [bonus-fn] (mods/vec-mod ?attack-modifier-fns bonus-fn)) +(defn + ^{:doc "For applying generic damage bonuses from various sources, to various sources. Controlled by functions to filter or specify conditions" + :user/comment "May be best to keep this and remove melee-damage-bonus-fn (and never add the ranged-damage-bonus-fn). Undecided."} + + damage-bonus-fn [bonus-fn] + (mods/vec-mod ?damage-bonus-fns bonus-fn)) + (defn melee-damage-bonus-fn [bonus-fn] (mods/vec-mod ?melee-damage-bonus-fns bonus-fn)) @@ -590,8 +597,8 @@ `(condp <= ~level ~@flat-mappings))) (defn - ^{:doc "Function that allows application of bonuses to specific weapons." - :user/comment "Moved from commented-out UA namespace."} + ^{:doc "Function that allows application of attack modifiers to specific weapons." + :user/comment "Moved from a disused, soon to be trimmed, namespace."} weapon-attack-bonus-mod [weapons bonus] (attack-modifier-fn @@ -600,6 +607,17 @@ bonus 0)))) +(defn + ^{:doc "Function that allows application of damage bonuses to specific weapons." + :user/comment "Duplicated from weapon-attack-bonus-mod. May be better to combine the two with a third arg to differentiate"} + + weapon-damage-bonus-mod [weapons bonus] + (damage-bonus-fn + (fn [{kw :key base-kw :base-key}] + (if (weapons kw) + bonus + 0)))) + (def mods-map {:ability ability :ability-override ability-override diff --git a/src/cljc/orcpub/dnd/e5/options.cljc b/src/cljc/orcpub/dnd/e5/options.cljc index ced9cd78d..cd4bcbe7f 100644 --- a/src/cljc/orcpub/dnd/e5/options.cljc +++ b/src/cljc/orcpub/dnd/e5/options.cljc @@ -1706,10 +1706,9 @@ {:name "Dueling Fighting Style" :page 72 :description "When you are wielding a melee weapon in one hand and no other weapons, you gain a +2 bonus to damage rolls with that weapon."}) - ;(mods/vec-mod ?ac-bonus-fns - ;(mods/vec-mod ?attack-modifier-fns - (mods/vec-mod ?melee-damage-bonus-fns ;vec-mod prop - (fn [_ _] 5) ;vec-mod val ... maybe? + (mods/vec-mod ?damage-bonus-fns ;vec-mod prop + (fn [weapon _] (if (or (weapon ::weapons/two-handed?) + (weapon ::weapons/ranged?)) 0 2)) ;vec-mod val ... maybe? nil ;vec-mod nm nil ;vec-mod value ... maybe? [(let [main-hand-weapon ?orcpub.dnd.e5.character/main-hand-weapon diff --git a/src/cljc/orcpub/dnd/e5/template_base.cljc b/src/cljc/orcpub/dnd/e5/template_base.cljc index 34ddda715..362f6760e 100644 --- a/src/cljc/orcpub/dnd/e5/template_base.cljc +++ b/src/cljc/orcpub/dnd/e5/template_base.cljc @@ -227,14 +227,16 @@ (apply + (+ (or (::mi5e/magical-damage-bonus weapon) 0) (?weapon-ability-damage-modifier weapon definitely-finesse? off-hand?)) - (if melee? - (map - #(% weapon) - ?melee-damage-bonus-fns) - (map - #(% weapon) - ?ranged-damage-bonus-fns)) ;any non-melee is assumed to be ranged/finesse/dex - ))) + ;(if melee? + ; (map + ; #(% weapon) + ; ?melee-damage-bonus-fns) + ; (map + ; #(% weapon) + ; ?ranged-damage-bonus-fns)) ;any non-melee is assumed to be ranged/finesse/dex + (map + #(% weapon) + ?damage-bonus-fns)))) ?best-weapon-damage-modifier (fn [weapon & [off-hand?]] (max (?weapon-damage-modifier weapon false off-hand?) (?weapon-damage-modifier weapon true off-hand?))) From 07401d333e4a58cc8c38fa1648f9fcc28d11fd67 Mon Sep 17 00:00:00 2001 From: Jesse Date: Wed, 17 Mar 2021 12:27:05 -0400 Subject: [PATCH 4/7] Fix for Issue #517 --- .../fillable-char-sheetstyle-1-2-spells.pdf | Bin 1351524 -> 1305041 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/fillable-char-sheetstyle-1-2-spells.pdf b/resources/fillable-char-sheetstyle-1-2-spells.pdf index 1850a8f18ef99193c3f4a02d6a721ccd312b733c..58992cdc490fdbabbc7495f2a88b783b6646dce7 100644 GIT binary patch delta 35464 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%0DH2h`!e{-t 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 From e9310c46ec17dc5382255bebc1ec8f3530d0a118 Mon Sep 17 00:00:00 2001 From: DatDamnZotz Date: Thu, 18 Mar 2021 09:29:33 -0600 Subject: [PATCH 5/7] Added option to Print Spell DC/Mod or not. --- .../{orcpub-card-logo.png => card-logo.png} | Bin src/clj/orcpub/pdf.clj | 11 ++++----- src/clj/orcpub/routes.clj | 11 ++++----- src/cljc/orcpub/pdf_spec.cljc | 8 +++++-- src/cljs/orcpub/dnd/e5/events.cljs | 10 +++++++++ src/cljs/orcpub/dnd/e5/subs.cljs | 6 +++++ src/cljs/orcpub/dnd/e5/views.cljs | 21 ++++++++++++++---- 7 files changed, 51 insertions(+), 16 deletions(-) rename resources/public/image/{orcpub-card-logo.png => card-logo.png} (100%) diff --git a/resources/public/image/orcpub-card-logo.png b/resources/public/image/card-logo.png similarity index 100% rename from resources/public/image/orcpub-card-logo.png rename to resources/public/image/card-logo.png diff --git a/src/clj/orcpub/pdf.clj b/src/clj/orcpub/pdf.clj index 22363019b..50788de24 100644 --- a/src/clj/orcpub/pdf.clj +++ b/src/clj/orcpub/pdf.clj @@ -219,9 +219,10 @@ (+ margin-x total-width) y))) (.setStrokingColor cs 0 0 0))) + (defn spell-school-level [{:keys [level school]} class-nm] (if (zero? level) - (str class-nm " - "(s/capitalize school) " cantrip") + (str class-nm " Cantrip " (s/capitalize school)) (str class-nm " Level " level " " (str (s/capitalize school))))) (defn draw-spell-field [cs document title value x y] @@ -282,7 +283,7 @@ remaining-height (- 11.0 total-height) margin-y (/ remaining-height 2) fonts (load-fonts document)] - (with-open [img-stream (io/input-stream (io/resource "public/image/orcpub-card-logo.png")) + (with-open [img-stream (io/input-stream (io/resource "public/image/card-logo.png")) over-img-stream (io/input-stream (io/resource "public/image/clockwise-rotation.png"))] (let [img (LosslessFactory/createFromImage document (ImageIO/read img-stream)) over-img (LosslessFactory/createFromImage document (ImageIO/read over-img-stream))] @@ -326,7 +327,7 @@ (- box-width 0.3) (- box-height 0.2)))))))))) -(defn print-spells [cs document box-width box-height spells page-number] +(defn print-spells [cs document box-width box-height spells page-number print-spell-card-dc-mod?] (let [num-boxes-x (int (/ 8.5 box-width)) num-boxes-y (int (/ 11.0 box-height)) total-width (* num-boxes-x box-width) @@ -336,7 +337,7 @@ remaining-height (- 11.0 total-height) margin-y (/ remaining-height 2) fonts (load-fonts document)] - (with-open [card-logo-img-stream (io/input-stream (io/resource "public/image/orcpub-card-logo.png")) + (with-open [card-logo-img-stream (io/input-stream (io/resource "public/image/card-logo.png")) over-img-stream (io/input-stream (io/resource "public/image/clockwise-rotation.png"))] (let [card-logo-img (LosslessFactory/createFromImage document (ImageIO/read card-logo-img-stream)) over-img (LosslessFactory/createFromImage document (ImageIO/read over-img-stream))] @@ -417,7 +418,7 @@ 0.2) (draw-text-to-box cs (if (not= class-nm "Homebrew") - (str (spell-school-level spell class-nm) " " dc-str (str " Spell Mod " (common/bonus-str attack-bonus))) + (str (spell-school-level spell class-nm) (when print-spell-card-dc-mod? (str " " dc-str (str " Spell Mod " (common/bonus-str attack-bonus))))) (spell-school-level spell class-nm)) (:italic fonts) 8 diff --git a/src/clj/orcpub/routes.clj b/src/clj/orcpub/routes.clj index 6ad49d245..8196e92b9 100644 --- a/src/clj/orcpub/routes.clj +++ b/src/clj/orcpub/routes.clj @@ -410,7 +410,7 @@ :weapon-name-2 8 :weapon-name-3 8})) -(defn add-spell-cards! [doc spells-known spell-save-dcs spell-attack-mods custom-spells] (try +(defn add-spell-cards! [doc spells-known spell-save-dcs spell-attack-mods custom-spells print-spell-card-dc-mod?] (try (let [custom-spells-map (common/map-by-key custom-spells) spells-map (merge spells/spell-map custom-spells-map) flat-spells (-> spells-known vals flatten) @@ -421,7 +421,7 @@ class) key]) flat-spells) - parts (vec (partition-all 9 sorted-spells))] + parts (vec (partition-all 9 flat-spells))] (doseq [i (range (count parts)) :let [part (parts i)]] (let [page (PDPage.)] @@ -444,7 +444,8 @@ 2.5 3.5 spells - i)) + i + print-spell-card-dc-mod?)) back-page (PDPage.)] (with-open [back-page-cs (PDPageContentStream. doc back-page)] (.addPage doc back-page) @@ -453,7 +454,7 @@ (defn character-pdf-2 [req] (let [fields (-> req :form-params :body edn/read-string) - {:keys [image-url image-url-failed faction-image-url faction-image-url-failed spells-known custom-spells spell-save-dcs spell-attack-mods print-spell-cards? print-character-sheet-style?]} fields + {:keys [image-url image-url-failed faction-image-url faction-image-url-failed spells-known custom-spells spell-save-dcs spell-attack-mods print-spell-cards? print-character-sheet-style? print-spell-card-dc-mod?]} fields sheet6 (str "fillable-char-sheetstyle-" print-character-sheet-style? "-6-spells.pdf") sheet5 (str "fillable-char-sheetstyle-" print-character-sheet-style? "-5-spells.pdf") @@ -476,7 +477,7 @@ (with-open [doc (PDDocument/load input)] (pdf/write-fields! doc fields (not chrome?) font-sizes) (if (and print-spell-cards? (seq spells-known)) - (add-spell-cards! doc spells-known spell-save-dcs spell-attack-mods custom-spells)) + (add-spell-cards! doc spells-known spell-save-dcs spell-attack-mods custom-spells print-spell-card-dc-mod?)) (if (and image-url (re-matches #"^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]" image-url) (not image-url-failed)) diff --git a/src/cljc/orcpub/pdf_spec.cljc b/src/cljc/orcpub/pdf_spec.cljc index 46ed91045..9ac71fd37 100644 --- a/src/cljc/orcpub/pdf_spec.cljc +++ b/src/cljc/orcpub/pdf_spec.cljc @@ -292,6 +292,7 @@ print-prepared-spells? prepares-spells prepared-spells-by-class] + (let [flat-spells (char5e/flat-spells spells-known) spells-map @(subscribe [::spells/spells-map]) plugin-spells-map @(subscribe [::spells/plugin-spells-map]) @@ -498,7 +499,8 @@ print-spell-cards? print-prepared-spells? print-large-abilities? - print-character-sheet-style?] :as options}] + print-character-sheet-style? + print-spell-card-dc-mod?] :as options}] (let [race (char5e/race built-char) subrace (char5e/subrace built-char) abilities (abilities-spec @@ -572,7 +574,9 @@ :faction-name (char5e/faction-name built-char) :print-character-sheet? print-character-sheet? :print-spell-cards? print-spell-cards? - :print-character-sheet-style? print-character-sheet-style?} + :print-character-sheet-style? print-character-sheet-style? + :print-spell-card-dc-mod? print-spell-card-dc-mod? + } (attacks-and-spellcasting-fields built-char) (skill-fields built-char) abilities diff --git a/src/cljs/orcpub/dnd/e5/events.cljs b/src/cljs/orcpub/dnd/e5/events.cljs index 2908cbcd7..58d48455a 100644 --- a/src/cljs/orcpub/dnd/e5/events.cljs +++ b/src/cljs/orcpub/dnd/e5/events.cljs @@ -3791,6 +3791,16 @@ (fn [db _] (update db ::char5e/exclude-spell-cards-print? not))) +(reg-event-db + ::char5e/toggle-spell-cards-by-level + (fn [db _] + (update db ::char5e/exclude-spell-cards-by-level? not))) + +(reg-event-db + ::char5e/toggle-spell-cards-by-dc-mod + (fn [db _] + (update db ::char5e/exclude-spell-cards-by-dc-mod? not))) + (reg-event-db ::char5e/toggle-large-abilities-print (fn [db _] diff --git a/src/cljs/orcpub/dnd/e5/subs.cljs b/src/cljs/orcpub/dnd/e5/subs.cljs index 0f7068658..daa40bf05 100644 --- a/src/cljs/orcpub/dnd/e5/subs.cljs +++ b/src/cljs/orcpub/dnd/e5/subs.cljs @@ -1196,6 +1196,12 @@ (fn [db _] (-> db ::char5e/exclude-spell-cards-print? not))) +(reg-sub + ::char5e/print-spell-card-dc-mod? + (fn [db _] + (-> db ::char5e/exclude-spell-cards-by-dc-mod? not))) + + (reg-sub ::char5e/print-character-sheet? (fn [db _] diff --git a/src/cljs/orcpub/dnd/e5/views.cljs b/src/cljs/orcpub/dnd/e5/views.cljs index 0dbd30d9d..4793c6d05 100644 --- a/src/cljs/orcpub/dnd/e5/views.cljs +++ b/src/cljs/orcpub/dnd/e5/views.cljs @@ -3476,14 +3476,16 @@ print-spell-cards? print-prepared-spells? print-large-abilities? - print-character-sheet-style?] + print-character-sheet-style? + print-spell-card-dc-mod?] #(let [export-fn (export-pdf built-char id {:print-character-sheet? print-character-sheet? :print-spell-cards? print-spell-cards? :print-prepared-spells? print-prepared-spells? :print-large-abilities? print-large-abilities? - :print-character-sheet-style? print-character-sheet-style?})] + :print-character-sheet-style? print-character-sheet-style? + :print-spell-card-dc-mod? print-spell-card-dc-mod?})] (export-fn) (dispatch [::char/hide-options]))) @@ -3508,6 +3510,7 @@ print-prepared-spells? @(subscribe [::char/print-prepared-spells?]) print-large-abilities? @(subscribe [::char/print-large-abilities?]) print-character-sheet-style? @(subscribe [::char/print-character-sheet-style?]) + print-spell-card-dc-mod? @(subscribe [::char/print-spell-card-dc-mod?]) has-spells? (seq (char/spells-known built-char)) print-button-enabled (if (or (= print-character-sheet-style? nil) (= (str print-character-sheet-style?) "NaN")) @@ -3539,6 +3542,14 @@ [labeled-checkbox "Print Spell Cards" print-spell-cards?]]]]) + (if print-spell-cards? + [:div.m-b-2 + [:div.flex + [:div + {:on-click (make-event-handler ::char/toggle-spell-cards-by-dc-mod)} + [labeled-checkbox + "Print Spell DC and MOD" + print-spell-card-dc-mod?]]]]) (if has-spells? [:div.m-b-10 [:div.m-b-10 @@ -3565,7 +3576,8 @@ print-spell-cards? print-prepared-spells? print-large-abilities? - print-character-sheet-style?)} + print-character-sheet-style? + print-spell-card-dc-mod?)} "Print"]]])) (defn make-print-handler [id built-char] @@ -7522,7 +7534,8 @@ {:print-character-sheet? true :print-spell-cards? true :print-prepared-spells? false - :print-character-sheet-style? 1})} + :print-character-sheet-style? 1 + :print-spell-card-dc-mod? true})} "print"] (if (= username owner) [:button.form-button.m-l-5 From 90e3dbe45ae361fbe49d78c4a3383bec026bd81d Mon Sep 17 00:00:00 2001 From: DatDamnZotz Date: Tue, 23 Mar 2021 11:23:37 -0600 Subject: [PATCH 6/7] Sort by Level - Class - Name --- src/cljc/orcpub/pdf_spec.cljc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/cljc/orcpub/pdf_spec.cljc b/src/cljc/orcpub/pdf_spec.cljc index 9ac71fd37..181282106 100644 --- a/src/cljc/orcpub/pdf_spec.cljc +++ b/src/cljc/orcpub/pdf_spec.cljc @@ -380,14 +380,17 @@ spell-pages))))) (defn spellcasting-fields [built-char print-prepared-spells?] - (let [spells-known (char5e/spells-known built-char) - spell-attack-modifier-fn (char5e/spell-attack-modifier-fn built-char) + (let [spell-attack-modifier-fn (char5e/spell-attack-modifier-fn built-char) spell-save-dc-fn (char5e/spell-save-dc-fn built-char) spell-slots (char5e/spell-slots built-char) prepares-spells (char5e/prepares-spells built-char) - prepared-spells-by-class (char5e/prepared-spells-by-class built-char)] + prepared-spells-by-class (char5e/prepared-spells-by-class built-char) + sorted-spells-known (into {} + (map (fn [[id datum]] + [id (into (sorted-map) datum)])) + (char5e/spells-known built-char))] - (spell-page-fields spells-known + (spell-page-fields sorted-spells-known spell-slots spell-save-dc-fn spell-attack-modifier-fn From f71a828e7a06eeb1543352f69bcf460207b5533c Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 28 Mar 2021 20:57:21 +0000 Subject: [PATCH 7/7] Github Actions --- src/cljs/orcpub/ver.cljc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cljs/orcpub/ver.cljc b/src/cljs/orcpub/ver.cljc index 2df36b6ae..f02402555 100644 --- a/src/cljs/orcpub/ver.cljc +++ b/src/cljs/orcpub/ver.cljc @@ -1,5 +1,5 @@ (ns orcpub.ver) ; To be updated by build server -(defn version [] "v2.5.0.20") -(defn date [] "12-28-2020") +(defn version [] "v2.5.0.21") +(defn date [] "03-28-2021") (defn description [] "") \ No newline at end of file