From 568c2058c3f41b253e8e0ea8aeff74a50d9a346b Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Fri, 16 Jan 2026 03:21:40 -0500 Subject: [PATCH 1/7] Only apply cost modifier for PlayerBasedCastEnv --- .../hexcasting/api/casting/eval/CastingEnvironment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java index 2345eb426..bcfe119ce 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java @@ -2,6 +2,7 @@ import at.petrak.hexcasting.api.casting.ParticleSpray; import at.petrak.hexcasting.api.casting.PatternShapeMatch; +import at.petrak.hexcasting.api.casting.eval.env.PlayerBasedCastEnv; import at.petrak.hexcasting.api.casting.eval.vm.CastingImage; import at.petrak.hexcasting.api.casting.mishaps.Mishap; import at.petrak.hexcasting.api.casting.mishaps.MishapBadLocation; @@ -248,7 +249,8 @@ public boolean isEnlightened() { * positive. */ public long extractMedia(long cost, boolean simulate) { - if (this.getCastingEntity() != null){ + if (this instanceof PlayerBasedCastEnv + && this.getCastingEntity() != null) { cost = (long) (cost * this.getCastingEntity().getAttributeValue(HexAttributes.MEDIA_CONSUMPTION_MODIFIER)); } for (var extractMediaComponent : preMediaExtract) From 57d851843b2680caf3eefbf086ceb6b6e717efbf Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Fri, 16 Jan 2026 04:28:27 -0500 Subject: [PATCH 2/7] Tag for patterns that should ignore any cost modifier --- .../api/casting/eval/CastingEnvironment.java | 5 ++- .../api/casting/iota/PatternIota.java | 7 ++++ .../at/petrak/hexcasting/api/mod/HexTags.java | 5 +++ .../datagen/tag/HexActionTagProvider.java | 8 ++++ .../tags/action/cannot_modify_cost.json | 37 +++++++++++++++++++ .../hexcasting/action/cannot_modify_cost.json | 36 ++++++++++++++++++ 6 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 Fabric/src/generated/resources/data/hexcasting/tags/action/cannot_modify_cost.json create mode 100644 Forge/src/generated/resources/data/hexcasting/tags/hexcasting/action/cannot_modify_cost.json diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java index bcfe119ce..d92d3e736 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java @@ -242,6 +242,8 @@ public boolean isEnlightened() { return false; } + public boolean costModifierAllowed = true; + /** * Attempt to extract the given amount of media. Returns the amount of media left in the cost. *

@@ -250,7 +252,8 @@ public boolean isEnlightened() { */ public long extractMedia(long cost, boolean simulate) { if (this instanceof PlayerBasedCastEnv - && this.getCastingEntity() != null) { + && this.getCastingEntity() != null + && costModifierAllowed) { cost = (long) (cost * this.getCastingEntity().getAttributeValue(HexAttributes.MEDIA_CONSUMPTION_MODIFIER)); } for (var extractMediaComponent : preMediaExtract) diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/PatternIota.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/PatternIota.java index 74db0a95f..6602b21fc 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/PatternIota.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/PatternIota.java @@ -94,9 +94,16 @@ public boolean toleratesOther(Iota that) { // this gets caught down below throw new MishapUnenlightened(); } + + if (isOfTag(IXplatAbstractions.INSTANCE.getActionRegistry(), key, HexTags.Actions.CANNOT_MODIFY_COST)) { + vm.getEnv().costModifierAllowed = false; + } else { + vm.getEnv().costModifierAllowed = true; + } } else if (lookup instanceof PatternShapeMatch.Special special) { castedName = special.handler::getName; action = special.handler.act(); + vm.getEnv().costModifierAllowed = true; } else if (lookup instanceof PatternShapeMatch.Nothing) { throw new MishapInvalidPattern(this.getPattern()); } else throw new IllegalStateException(); diff --git a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexTags.java b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexTags.java index 3317bdbc8..34992378a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexTags.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexTags.java @@ -86,6 +86,11 @@ public static final class Actions { */ public static final TagKey CAN_START_ENLIGHTEN = create("can_start_enlighten"); + /** + * Actions that should not be affected by the media_consumption attribute + */ + public static final TagKey CANNOT_MODIFY_COST = create("cannot_modify_cost"); + public static TagKey create(String name) { return TagKey.create(IXplatAbstractions.INSTANCE.getActionRegistry().key(), modLoc(name)); } diff --git a/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexActionTagProvider.java b/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexActionTagProvider.java index 4b083c573..91b31d4d2 100644 --- a/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexActionTagProvider.java +++ b/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexActionTagProvider.java @@ -35,6 +35,14 @@ protected void addTags(HolderLookup.Provider provider) { tag(ersatzActionTag(HexTags.Actions.PER_WORLD_PATTERN)).add(key); } // deciding that akashic write can be just a normal spell (as a treat) + + for (var actionID : new String[]{ + "hexal:wisp/summon/projectile", "hexal:wisp/summon/ticking", "hexical:conjure_gummy", "hexical:charm", + "hexical:recharge_lamp", "lapisworks:deposit", "lapisworks:imbue_lap", "yaha:time_bomb" + }) { + var loc = ResourceLocation.tryParse(actionID); + tag(ersatzActionTag(HexTags.Actions.CANNOT_MODIFY_COST)).addOptional(loc); + } } private static TagKey ersatzActionTag(TagKey real) { diff --git a/Fabric/src/generated/resources/data/hexcasting/tags/action/cannot_modify_cost.json b/Fabric/src/generated/resources/data/hexcasting/tags/action/cannot_modify_cost.json new file mode 100644 index 000000000..e5eb4b181 --- /dev/null +++ b/Fabric/src/generated/resources/data/hexcasting/tags/action/cannot_modify_cost.json @@ -0,0 +1,37 @@ +{ + "replace": false, + "values": [ + { + "id": "hexal:wisp/summon/projectile", + "required": false + }, + { + "id": "hexal:wisp/summon/ticking", + "required": false + }, + { + "id": "hexical:conjure_gummy", + "required": false + }, + { + "id": "hexical:charm", + "required": false + }, + { + "id": "hexical:recharge_lamp", + "required": false + }, + { + "id": "lapisworks:deposit", + "required": false + }, + { + "id": "lapisworks:imbue_lap", + "required": false + }, + { + "id": "yaha:time_bomb", + "required": false + } + ] +} \ No newline at end of file diff --git a/Forge/src/generated/resources/data/hexcasting/tags/hexcasting/action/cannot_modify_cost.json b/Forge/src/generated/resources/data/hexcasting/tags/hexcasting/action/cannot_modify_cost.json new file mode 100644 index 000000000..1622e45a4 --- /dev/null +++ b/Forge/src/generated/resources/data/hexcasting/tags/hexcasting/action/cannot_modify_cost.json @@ -0,0 +1,36 @@ +{ + "values": [ + { + "id": "hexal:wisp/summon/projectile", + "required": false + }, + { + "id": "hexal:wisp/summon/ticking", + "required": false + }, + { + "id": "hexical:conjure_gummy", + "required": false + }, + { + "id": "hexical:charm", + "required": false + }, + { + "id": "hexical:recharge_lamp", + "required": false + }, + { + "id": "lapisworks:deposit", + "required": false + }, + { + "id": "lapisworks:imbue_lap", + "required": false + }, + { + "id": "yaha:time_bomb", + "required": false + } + ] +} \ No newline at end of file From 97c3be7b61fdfc2d184689e80e1ace8cfd87f03b Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Fri, 16 Jan 2026 04:28:57 -0500 Subject: [PATCH 3/7] Update changelog --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eea7f3358..13ac76274 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). +## `0.11.4` - ??? + +### Added + +- Added the `cannot_modify_cost` tag for patterns that should ignore the `media_consumption` attribute when calculating cost, by Robotgiggle in [987](https://github.com/FallingColors/HexMod/pull/987) + +### Changed + +- Changed the `media_consumption` attribute to only apply to player-based casting, by Robotgiggle in [987](https://github.com/FallingColors/HexMod/pull/987) + ## `0.11.3` - 2025-11-22 ### Added From 437caf21e20292fd9acb5270948b3903aacf0dba Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Sat, 17 Jan 2026 17:29:23 -0500 Subject: [PATCH 4/7] Refactor cost modifier check --- CHANGELOG.md | 2 +- .../api/casting/eval/CastingEnvironment.java | 23 +++++++++++-------- .../casting/eval/env/PlayerBasedCastEnv.java | 11 +++++++++ .../api/casting/iota/PatternIota.java | 7 ------ 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13ac76274..8aa89d88f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). -## `0.11.4` - ??? +## [UNRELEASED] ### Added diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java index d92d3e736..d5e541156 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java @@ -187,11 +187,20 @@ public T getExtension(@NotNull CastingEn public void precheckAction(PatternShapeMatch match) throws Mishap { // TODO: this doesn't let you select special handlers. // Might be worth making a "no casting" tag on each thing - ResourceLocation key = actionKey(match); + ResourceLocation loc = actionKey(match); - if (!HexConfig.server().isActionAllowed(key)) { - throw new MishapDisallowedSpell("disallowed", key); + if (!HexConfig.server().isActionAllowed(loc)) { + throw new MishapDisallowedSpell("disallowed", loc); } + + costModifier = this.checkCostModifier(loc); + } + + /** + * Casting env subclasses can override this to modify the cost for a given action + */ + protected double checkCostModifier(ResourceLocation loc) { + return 1.0; } @Nullable @@ -242,7 +251,7 @@ public boolean isEnlightened() { return false; } - public boolean costModifierAllowed = true; + protected double costModifier = 1.0; /** * Attempt to extract the given amount of media. Returns the amount of media left in the cost. @@ -251,11 +260,7 @@ public boolean isEnlightened() { * positive. */ public long extractMedia(long cost, boolean simulate) { - if (this instanceof PlayerBasedCastEnv - && this.getCastingEntity() != null - && costModifierAllowed) { - cost = (long) (cost * this.getCastingEntity().getAttributeValue(HexAttributes.MEDIA_CONSUMPTION_MODIFIER)); - } + cost = (long) (cost * costModifier); for (var extractMediaComponent : preMediaExtract) cost = extractMediaComponent.onExtractMedia(cost, simulate); cost = extractMediaEnvironment(cost, simulate); diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java index 83e58a818..1d0e640f8 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java @@ -11,6 +11,7 @@ import at.petrak.hexcasting.api.casting.mishaps.Mishap; import at.petrak.hexcasting.api.mod.HexConfig; import at.petrak.hexcasting.api.mod.HexStatistics; +import at.petrak.hexcasting.api.mod.HexTags; import at.petrak.hexcasting.api.pigment.FrozenPigment; import at.petrak.hexcasting.api.utils.HexUtils; import at.petrak.hexcasting.api.utils.MediaHelper; @@ -21,6 +22,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Inventory; @@ -34,6 +36,7 @@ import java.util.function.Predicate; import static at.petrak.hexcasting.api.HexAPI.modLoc; +import static at.petrak.hexcasting.api.utils.HexUtils.isOfTag; public abstract class PlayerBasedCastEnv extends CastingEnvironment { public static final double DEFAULT_AMBIT_RADIUS = 32.0; @@ -62,6 +65,14 @@ public ServerPlayer getCaster() { return this.caster; } + @Override + protected double checkCostModifier(ResourceLocation loc) { + if (this.getCastingEntity() != null && !isOfTag(IXplatAbstractions.INSTANCE.getActionRegistry(), loc, HexTags.Actions.CANNOT_MODIFY_COST)) { + return this.getCastingEntity().getAttributeValue(HexAttributes.MEDIA_CONSUMPTION_MODIFIER); + } + return 1.0; + } + @Override public void postExecution(CastResult result) { super.postExecution(result); diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/PatternIota.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/PatternIota.java index 6602b21fc..74db0a95f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/PatternIota.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/iota/PatternIota.java @@ -94,16 +94,9 @@ public boolean toleratesOther(Iota that) { // this gets caught down below throw new MishapUnenlightened(); } - - if (isOfTag(IXplatAbstractions.INSTANCE.getActionRegistry(), key, HexTags.Actions.CANNOT_MODIFY_COST)) { - vm.getEnv().costModifierAllowed = false; - } else { - vm.getEnv().costModifierAllowed = true; - } } else if (lookup instanceof PatternShapeMatch.Special special) { castedName = special.handler::getName; action = special.handler.act(); - vm.getEnv().costModifierAllowed = true; } else if (lookup instanceof PatternShapeMatch.Nothing) { throw new MishapInvalidPattern(this.getPattern()); } else throw new IllegalStateException(); From 9ae4613ef96570710c4d1704fb7b041420dcc581 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Sat, 17 Jan 2026 17:39:27 -0500 Subject: [PATCH 5/7] Remove default values for cost modifier blacklist tag --- .../datagen/tag/HexActionTagProvider.java | 8 ----- .../tags/action/cannot_modify_cost.json | 35 +------------------ .../hexcasting/action/cannot_modify_cost.json | 35 +------------------ 3 files changed, 2 insertions(+), 76 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexActionTagProvider.java b/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexActionTagProvider.java index 91b31d4d2..4b083c573 100644 --- a/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexActionTagProvider.java +++ b/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexActionTagProvider.java @@ -35,14 +35,6 @@ protected void addTags(HolderLookup.Provider provider) { tag(ersatzActionTag(HexTags.Actions.PER_WORLD_PATTERN)).add(key); } // deciding that akashic write can be just a normal spell (as a treat) - - for (var actionID : new String[]{ - "hexal:wisp/summon/projectile", "hexal:wisp/summon/ticking", "hexical:conjure_gummy", "hexical:charm", - "hexical:recharge_lamp", "lapisworks:deposit", "lapisworks:imbue_lap", "yaha:time_bomb" - }) { - var loc = ResourceLocation.tryParse(actionID); - tag(ersatzActionTag(HexTags.Actions.CANNOT_MODIFY_COST)).addOptional(loc); - } } private static TagKey ersatzActionTag(TagKey real) { diff --git a/Fabric/src/generated/resources/data/hexcasting/tags/action/cannot_modify_cost.json b/Fabric/src/generated/resources/data/hexcasting/tags/action/cannot_modify_cost.json index e5eb4b181..5e8aecc98 100644 --- a/Fabric/src/generated/resources/data/hexcasting/tags/action/cannot_modify_cost.json +++ b/Fabric/src/generated/resources/data/hexcasting/tags/action/cannot_modify_cost.json @@ -1,37 +1,4 @@ { "replace": false, - "values": [ - { - "id": "hexal:wisp/summon/projectile", - "required": false - }, - { - "id": "hexal:wisp/summon/ticking", - "required": false - }, - { - "id": "hexical:conjure_gummy", - "required": false - }, - { - "id": "hexical:charm", - "required": false - }, - { - "id": "hexical:recharge_lamp", - "required": false - }, - { - "id": "lapisworks:deposit", - "required": false - }, - { - "id": "lapisworks:imbue_lap", - "required": false - }, - { - "id": "yaha:time_bomb", - "required": false - } - ] + "values": [] } \ No newline at end of file diff --git a/Forge/src/generated/resources/data/hexcasting/tags/hexcasting/action/cannot_modify_cost.json b/Forge/src/generated/resources/data/hexcasting/tags/hexcasting/action/cannot_modify_cost.json index 1622e45a4..f72d209df 100644 --- a/Forge/src/generated/resources/data/hexcasting/tags/hexcasting/action/cannot_modify_cost.json +++ b/Forge/src/generated/resources/data/hexcasting/tags/hexcasting/action/cannot_modify_cost.json @@ -1,36 +1,3 @@ { - "values": [ - { - "id": "hexal:wisp/summon/projectile", - "required": false - }, - { - "id": "hexal:wisp/summon/ticking", - "required": false - }, - { - "id": "hexical:conjure_gummy", - "required": false - }, - { - "id": "hexical:charm", - "required": false - }, - { - "id": "hexical:recharge_lamp", - "required": false - }, - { - "id": "lapisworks:deposit", - "required": false - }, - { - "id": "lapisworks:imbue_lap", - "required": false - }, - { - "id": "yaha:time_bomb", - "required": false - } - ] + "values": [] } \ No newline at end of file From 34094359f0f31ad1a1e538fb450aaedafcda2351 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Sat, 17 Jan 2026 18:05:49 -0500 Subject: [PATCH 6/7] Cleanup --- .../api/casting/eval/CastingEnvironment.java | 6 +++--- .../api/casting/eval/env/PlayerBasedCastEnv.java | 11 +++++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java index d5e541156..54e033b01 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java @@ -193,13 +193,13 @@ public void precheckAction(PatternShapeMatch match) throws Mishap { throw new MishapDisallowedSpell("disallowed", loc); } - costModifier = this.checkCostModifier(loc); + costModifier = this.getCostModifier(match); } /** * Casting env subclasses can override this to modify the cost for a given action */ - protected double checkCostModifier(ResourceLocation loc) { + protected double getCostModifier(PatternShapeMatch match) { return 1.0; } @@ -251,7 +251,7 @@ public boolean isEnlightened() { return false; } - protected double costModifier = 1.0; + private double costModifier = 1.0; /** * Attempt to extract the given amount of media. Returns the amount of media left in the cost. diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java index 1d0e640f8..1f5b6703f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java @@ -3,6 +3,7 @@ import at.petrak.hexcasting.api.HexAPI; import at.petrak.hexcasting.api.addldata.ADMediaHolder; import at.petrak.hexcasting.api.advancements.HexAdvancementTriggers; +import at.petrak.hexcasting.api.casting.PatternShapeMatch; import at.petrak.hexcasting.api.casting.ParticleSpray; import at.petrak.hexcasting.api.casting.eval.CastResult; import at.petrak.hexcasting.api.casting.eval.CastingEnvironment; @@ -66,11 +67,13 @@ public ServerPlayer getCaster() { } @Override - protected double checkCostModifier(ResourceLocation loc) { - if (this.getCastingEntity() != null && !isOfTag(IXplatAbstractions.INSTANCE.getActionRegistry(), loc, HexTags.Actions.CANNOT_MODIFY_COST)) { - return this.getCastingEntity().getAttributeValue(HexAttributes.MEDIA_CONSUMPTION_MODIFIER); + protected double getCostModifier(PatternShapeMatch match) { + ResourceLocation loc = actionKey(match); + if (isOfTag(IXplatAbstractions.INSTANCE.getActionRegistry(), loc, HexTags.Actions.CANNOT_MODIFY_COST)) { + return 1.0; + } else { + return this.caster.getAttributeValue(HexAttributes.MEDIA_CONSUMPTION_MODIFIER); } - return 1.0; } @Override From 417869f29706182e0a2e9f32ba36bcd29df8220e Mon Sep 17 00:00:00 2001 From: "[object Object]" Date: Sat, 17 Jan 2026 19:20:34 -0500 Subject: [PATCH 7/7] Fix changelog formatting --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f76aad7c..f4498b275 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,11 +8,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ### Added -- Added the `cannot_modify_cost` tag for patterns that should ignore the `media_consumption` attribute when calculating cost, by Robotgiggle in [987](https://github.com/FallingColors/HexMod/pull/987) +- Added the `cannot_modify_cost` tag for patterns that should ignore the `media_consumption` attribute when calculating cost, by Robotgiggle in [987](https://github.com/FallingColors/HexMod/pull/987). ### Changed -- Changed the `media_consumption` attribute to only apply to player-based casting, by Robotgiggle in [987](https://github.com/FallingColors/HexMod/pull/987) +- Changed the `media_consumption` attribute to only apply to player-based casting, by Robotgiggle in [987](https://github.com/FallingColors/HexMod/pull/987). ### Fixed