diff --git a/README.md b/README.md index 55b7337..1500606 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,14 @@ Requires `pillow` and `numpy`. and lore rather than by kind, so those are generated from a table with shared stat bands per tier. What actually tells them apart in game is the palette, and that still comes from each gem's own texture. +- Arcane essence gives max mana per slot: 1300 on a helmet, 900 chest, 800 + legs, 700 boots, 900 held in the main hand, 400 offhand. Separate per-slot + modifiers rather than one `armor`-wide one, so a weapon reads as a held bonus + instead of claiming something "when worn". They stack per module - a piece + built out of arcane essence that also carries an arcane gem counts twice. +- Cinder essence uses slot `any`, so one gem grants fire immunity wherever it + sits, worn or held. The attribute caps at 1 and the handler treats anything at + or above 1 as immune, so extra pieces neither add nor dilute. - Material properties belong under the `default` key, not `armor` or `handheld`. A gem socketed into armour is not tagged `armor`: gem modules declare which material properties they accept and list only `default` plus their own gem diff --git a/src/main/resources/packs/irons_spellbooks/data/cmmodular/miapi/materials/crystal/arcane_essence.json b/src/main/resources/packs/irons_spellbooks/data/cmmodular/miapi/materials/crystal/arcane_essence.json index 777be6d..d4b993c 100644 --- a/src/main/resources/packs/irons_spellbooks/data/cmmodular/miapi/materials/crystal/arcane_essence.json +++ b/src/main/resources/packs/irons_spellbooks/data/cmmodular/miapi/materials/crystal/arcane_essence.json @@ -48,15 +48,45 @@ "attributes": [ { "attribute": "irons_spellbooks:max_mana", - "value": "100", + "value": "1300", "operation": "+", - "slot": "armor" + "slot": "head" + }, + { + "attribute": "irons_spellbooks:max_mana", + "value": "900", + "operation": "+", + "slot": "chest" + }, + { + "attribute": "irons_spellbooks:max_mana", + "value": "800", + "operation": "+", + "slot": "legs" + }, + { + "attribute": "irons_spellbooks:max_mana", + "value": "700", + "operation": "+", + "slot": "feet" + }, + { + "attribute": "irons_spellbooks:max_mana", + "value": "900", + "operation": "+", + "slot": "mainhand" + }, + { + "attribute": "irons_spellbooks:max_mana", + "value": "400", + "operation": "+", + "slot": "offhand" }, { "attribute": "irons_spellbooks:mana_regen", "value": "0.15", "operation": "*", - "slot": "armor" + "slot": "any" }, { "attribute": "irons_spellbooks:spell_power", diff --git a/src/main/resources/packs/irons_spellbooks/data/cmmodular/miapi/materials/crystal/cinder_essence.json b/src/main/resources/packs/irons_spellbooks/data/cmmodular/miapi/materials/crystal/cinder_essence.json index 1a896d9..5cbbb5d 100644 --- a/src/main/resources/packs/irons_spellbooks/data/cmmodular/miapi/materials/crystal/cinder_essence.json +++ b/src/main/resources/packs/irons_spellbooks/data/cmmodular/miapi/materials/crystal/cinder_essence.json @@ -52,13 +52,13 @@ "attribute": "cmmodular:fire_immunity", "value": "1", "operation": "+", - "slot": "armor" + "slot": "any" }, { "attribute": "irons_spellbooks:fire_magic_resist", "value": "0.2", "operation": "*", - "slot": "armor" + "slot": "any" }, { "attribute": "irons_spellbooks:fire_spell_power", diff --git a/tools/materials.py b/tools/materials.py index 6f0cc8e..c8197d1 100644 --- a/tools/materials.py +++ b/tools/materials.py @@ -511,23 +511,33 @@ MATERIALS = [ enchantability=32, mining_speed=11, toughness=3, armor_durability=38, armor_toughness=2.5, groups=("crystal", "gem"), textures=("crystal", "bright"), # Everything hangs off `default`. A gem socketed into armour is not - # tagged `armor` - the gem modules declare which material properties they - # accept and both list only `default` plus their own gem tags - so - # anything filed under `armor` or `handheld` silently never applied. The - # attribute's own slot decides where it counts instead. + # tagged `armor` or `handheld` - the gem modules declare which material + # properties they accept and both list only `default` plus their own gem + # tags - so anything filed elsewhere silently never applied. + # + # Each slot gets its own modifier rather than one `armor`-wide one. That + # is what lets a helmet be worth more than boots, and it stops a sword + # from advertising a bonus "when worn", which is what a slot of `armor` + # on a weapon reads as. properties={ "default": { "emissive": {"sky": 6, "block": 6}, "attributes": [ - # Per armour piece, so a full set is roughly +400 on top of - # the 100 base pool Iron's Spells gives a player. - attribute("irons_spellbooks:max_mana", 100, "armor"), - attribute("irons_spellbooks:mana_regen", 0.15, "armor", "*"), + attribute("irons_spellbooks:max_mana", 1300, "head"), + attribute("irons_spellbooks:max_mana", 900, "chest"), + attribute("irons_spellbooks:max_mana", 800, "legs"), + attribute("irons_spellbooks:max_mana", 700, "feet"), + # Held, not worn. + attribute("irons_spellbooks:max_mana", 900, "mainhand"), + attribute("irons_spellbooks:max_mana", 400, "offhand"), + attribute("irons_spellbooks:mana_regen", 0.15, "any", "*"), attribute("irons_spellbooks:spell_power", 0.10, "mainhand", "*"), attribute("irons_spellbooks:cooldown_reduction", 0.05, "mainhand", "*"), ], }, }), + # These stack per module: a piece built out of arcane essence that also + # carries an arcane gem counts twice. M("cinder_essence", "irons_spellbooks", "crystal", "Cinder", "irons_spellbooks:cinder_essence", @@ -546,8 +556,12 @@ MATERIALS = [ # above 1 as immune, so this is genuine immunity rather than a # resistance that stacks up to it. "attributes": [ - attribute(FIRE_IMMUNITY, 1, "armor"), - attribute("irons_spellbooks:fire_magic_resist", 0.20, "armor", "*"), + # Slot `any`, so a single gem grants immunity wherever it + # sits - worn or held. The handler treats anything at or + # above 1 as immune, and the attribute is capped at 1, so + # extra pieces add nothing and nothing can dilute it. + attribute(FIRE_IMMUNITY, 1, "any"), + attribute("irons_spellbooks:fire_magic_resist", 0.20, "any", "*"), attribute("irons_spellbooks:fire_spell_power", 0.20, "mainhand", "*"), ], },