[{"commit":"a6073a09ec4b584b506adacf9c7e280788bde584","timestamp":"2026-03-07T14:23:29-05:00","author":"TerribleTurtles","message":"feat: v0.2.0 \u2014 March 2026 patch balance and schema additions","changes":[{"entity_id":"swamp_witch","file":"data/heroes/swamp_witch.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics","damage_modifiers"],"new_value":[{"target_types":["Spellcaster"],"multiplier":0.88}]},{"path":["abilities","primary","damage"],"old_value":21,"new_value":15}]},{"entity_id":"astral_shot","file":"data/spells/astral_shot.json","category":"spells","change_type":"edit","diffs":[{"path":["damage"],"old_value":32,"new_value":28}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":500,"new_value":300}]},{"entity_id":"fire_ball","file":"data/spells/fire_ball.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":50,"new_value":0}]},{"entity_id":"fire_rain","file":"data/spells/fire_rain.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":500,"new_value":300}]},{"entity_id":"holy_arrow","file":"data/spells/holy_arrow.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":200,"new_value":100}]},{"entity_id":"ice_ray","file":"data/spells/ice_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":200,"new_value":50}]},{"entity_id":"metamorphosis","file":"data/spells/metamorphosis.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":800,"new_value":500}]},{"entity_id":"poison_breath","file":"data/spells/poison_breath.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":50,"new_value":0}]},{"entity_id":"resurrection","file":"data/spells/resurrection.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":800,"new_value":500}]},{"entity_id":"thunder_ray","file":"data/spells/thunder_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":50,"new_value":0}]},{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":300,"new_value":200}]},{"entity_id":"ballista","file":"data/units/ballista.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":200,"new_value":0}]},{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":300,"new_value":0},{"path":["mechanics","spawner",1],"old_value":{"unit_id":"skeleton_warrior","count":10,"trigger":"Death"},"new_value":{"unit_id":"skeleton_warrior","count":6,"trigger":"Death"}},{"path":["mechanics","spawner",0],"old_value":{"unit_id":"skeleton_warrior","count":5,"interval":10,"trigger":"Interval"},"new_value":{"unit_id":"skeleton_warrior","count":3,"interval":10,"max_active":12,"trigger":"Interval"}}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":50,"new_value":0}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":300,"new_value":200}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",1,"multiplier"],"old_value":0.65,"new_value":0.85},{"path":["health"],"old_value":100,"new_value":80},{"path":["knowledge_cost"],"old_value":50,"new_value":0},{"path":["mechanics","damage_modifiers",2],"new_value":{"multiplier":0.85,"target_types":["Lifestone"]}}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":300,"new_value":200},{"path":["mechanics","spawner",1],"old_value":{"unit_id":"harpy","count":10,"trigger":"Death"},"new_value":{"unit_id":"harpy","count":6,"trigger":"Death"}},{"path":["mechanics","spawner",0],"old_value":{"unit_id":"harpy","count":5,"interval":10,"trigger":"Interval"},"new_value":{"unit_id":"harpy","count":3,"interval":10,"max_active":12,"trigger":"Interval"}}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":800,"new_value":500}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":500,"new_value":300}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":50,"new_value":0}]},{"entity_id":"rhino_rider","file":"data/units/rhino_rider.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":0,"new_value":550},{"path":["knowledge_cost"],"old_value":500,"new_value":300}]},{"entity_id":"rocket_soldier_factory","file":"data/units/rocket_soldier_factory.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":500,"new_value":300},{"path":["mechanics","spawner",1],"old_value":{"unit_id":"rocket_soldier","count":10,"trigger":"Death"},"new_value":{"unit_id":"rocket_soldier","count":6,"trigger":"Death"}},{"path":["mechanics","spawner",0],"old_value":{"unit_id":"rocket_soldier","count":5,"interval":10,"trigger":"Interval"},"new_value":{"unit_id":"rocket_soldier","count":3,"interval":10,"max_active":12,"trigger":"Interval"}}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":50,"new_value":0}]},{"entity_id":"siren","file":"data/units/siren.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"old_value":800,"new_value":500}]}]},{"commit":"ee2d68b33369fe214570000ea172738770ec5228","timestamp":"2026-03-05T22:56:35-05:00","author":"TerribleTurtles","message":"feat(maps): add map image serving for Mausoleum and Nordic Shore","changes":[{"entity_id":"mausoleum","file":"data/map_chests/mausoleum.json","category":"map_chests","change_type":"edit","diffs":[{"path":["image_required"],"old_value":false,"new_value":true}]},{"entity_id":"nordic_shore","file":"data/map_chests/nordic_shore.json","category":"map_chests","change_type":"add","diffs":[{"path":["chests"],"new_value":[{"location":"Beach Left","rarity":"Common","tier":"T1","reward_entity_id":"faerie","reward_type":"Unit"},{"location":"Beach Right","rarity":"Common","tier":"T1","reward_entity_id":"fire_ray","reward_type":"Spell"},{"location":"Dockside","rarity":"Common","tier":"T1","reward_entity_id":"harpy","reward_type":"Unit"},{"location":"Cliffside Left","rarity":"Epic","tier":"T2","reward_entity_id":"poison_breath","reward_type":"Spell"},{"location":"Cliffside Right","rarity":"Epic","tier":"T2","reward_entity_id":"rampart","reward_type":"Unit"},{"location":"Longship Bow","rarity":"Epic","tier":"T3","reward_entity_id":"fire_ball","reward_type":"Spell"},{"location":"Longship Stern","rarity":"Epic","tier":"T3","reward_entity_id":"wolven_hunter","reward_type":"Unit"},{"location":"Frozen Falls","rarity":"Legendary","tier":"T4","reward_entity_id":"astral_nova","reward_type":"Spell"},{"location":"Jarl's Hall","rarity":"Legendary","tier":"T4","reward_entity_id":"juggernaut","reward_type":"Unit"}]},{"path":["image_required"],"new_value":true},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Nordic Shore"},{"path":["description"],"new_value":"Chest spawn locations for the Nordic Shore arena."},{"path":["$schema"],"new_value":"../../schemas/v2/map_chests.schema.json"},{"path":["entity_id"],"new_value":"nordic_shore"}]}]},{"commit":"40ee1417c21ecd3aea301ab917650b3767b3c783","timestamp":"2026-03-01T19:56:21-05:00","author":"TerribleTurtles","message":"feat(data): add map_chests entity with Mausoleum arena data","changes":[{"entity_id":"mausoleum","file":"data/map_chests/mausoleum.json","category":"map_chests","change_type":"add","diffs":[{"path":["chests"],"new_value":[{"location":"Inner Side","rarity":"Common","tier":"T1","reward_entity_id":"harpy","reward_type":"Unit"},{"location":"Inner Mid","rarity":"Common","tier":"T1","reward_entity_id":"faerie","reward_type":"Unit"},{"location":"1st Tower Right","rarity":"Common","tier":"T1","reward_entity_id":"fire_ray","reward_type":"Spell"},{"location":"1st Tower Left","rarity":"Common","tier":"T1","reward_entity_id":"poison_breath","reward_type":"Spell"},{"location":"1st Tower Left Lower","rarity":"Common","tier":"T1","reward_entity_id":"fire_ray","reward_type":"Spell"},{"location":"1st Tower Left","rarity":"Epic","tier":"T2","reward_entity_id":"fire_ball","reward_type":"Spell"},{"location":"1st Tower Left Upper","rarity":"Epic","tier":"T3","reward_entity_id":"astral_tower","reward_type":"Unit"},{"location":"1st Tower Right","rarity":"Epic","tier":"T2","reward_entity_id":"rampart","reward_type":"Unit"},{"location":"1st Tower Right Lower","rarity":"Epic","tier":"T2","reward_entity_id":"wolven_hunter","reward_type":"Unit"},{"location":"Mid Left (Leftside)","rarity":"Legendary","tier":"T4","reward_entity_id":"juggernaut","reward_type":"Unit"},{"location":"Mid Left (Rightside)","rarity":"Legendary","tier":"T4","reward_entity_id":"astral_nova","reward_type":"Spell"}]},{"path":["image_required"],"new_value":false},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Mausoleum"},{"path":["description"],"new_value":"Chest spawn locations for the Mausoleum arena."},{"path":["$schema"],"new_value":"../../schemas/v2/map_chests.schema.json"},{"path":["entity_id"],"new_value":"mausoleum"}]}]},{"commit":"2ea847e17fe11175dfe9481406217af8182adb9c","timestamp":"2026-02-26T19:20:02-05:00","author":"TerribleTurtles","message":"fix(data): purge hallucinated mechanics and fix typos","changes":[{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["description"],"old_value":"Long-range unit that deals heavy damage to a target.","new_value":"Seig."}]},{"entity_id":"conqueror","file":"data/upgrades/conqueror.json","category":"upgrades","change_type":"edit","diffs":[{"path":["population_scaling",1],"removed":true,"old_value":{"level":5,"population_cap":14}},{"path":["population_scaling",2],"removed":true,"old_value":{"level":10,"population_cap":18}},{"path":["population_scaling",3],"removed":true,"old_value":{"level":15,"population_cap":22}},{"path":["population_scaling",4],"removed":true,"old_value":{"level":20,"population_cap":26}},{"path":["population_scaling",5],"removed":true,"old_value":{"level":25,"population_cap":30}},{"path":["incantation_upgrades",0],"removed":true,"old_value":{"incantation_id":"fire_ball","upgrades":[{"name":"Searing Impact","description":"Increases fire_ball damage by 15%.","effect":{"damage":1.15}},{"name":"Wide Blaze","description":"Increases fire_ball radius by 20%.","effect":{"radius":1.2}},{"name":"Rapid Ignition","description":"Reduces fire_ball recharge time by 10%.","effect":{"recharge_time":0.9}}]}},{"path":["incantation_upgrades",1],"removed":true,"old_value":{"incantation_id":"ogre","upgrades":[{"name":"Ironhide","description":"Increases ogre health by 20%.","effect":{"health":1.2}},{"name":"Crushing Blow","description":"Increases ogre damage by 15%.","effect":{"damage":1.15}},{"name":"War Cry","description":"Ogre gains an attack speed buff on spawn.","effect":{"attack_interval":0.85}}]}},{"path":["incantation_upgrades",2],"removed":true,"old_value":{"incantation_id":"earth_golem","upgrades":[{"name":"Stone Fortification","description":"Increases earth_golem health by 25%.","effect":{"health":1.25}},{"name":"Seismic Slam","description":"Increases earth_golem damage by 20%.","effect":{"damage":1.2}},{"name":"Living Wall","description":"Reduces earth_golem movement speed but greatly increases armor.","effect":{"armor":1.5,"movement_speed":0.8}}]}}]},{"entity_id":"duelist","file":"data/upgrades/duelist.json","category":"upgrades","change_type":"edit","diffs":[{"path":["population_scaling",1],"removed":true,"old_value":{"level":5,"population_cap":13}},{"path":["population_scaling",2],"removed":true,"old_value":{"level":10,"population_cap":16}},{"path":["population_scaling",3],"removed":true,"old_value":{"level":15,"population_cap":19}},{"path":["population_scaling",4],"removed":true,"old_value":{"level":20,"population_cap":22}},{"path":["population_scaling",5],"removed":true,"old_value":{"level":25,"population_cap":25}},{"path":["incantation_upgrades",0],"removed":true,"old_value":{"incantation_id":"frost_surge","upgrades":[{"name":"Bitter Cold","description":"Increases frost_surge damage by 15%.","effect":{"damage":1.15}},{"name":"Frostbite Spread","description":"Increases frost_surge range by 20%.","effect":{"range":1.2}},{"name":"Flash Freeze","description":"Reduces frost_surge recharge time by 12%.","effect":{"recharge_time":0.88}}]}},{"path":["incantation_upgrades",1],"removed":true,"old_value":{"incantation_id":"wolven_hunter","upgrades":[{"name":"Pack Tactics","description":"Increases wolven_hunter damage by 15%.","effect":{"damage":1.15}},{"name":"Thick Fur","description":"Increases wolven_hunter health by 20%.","effect":{"health":1.2}},{"name":"Swift Pounce","description":"Increases wolven_hunter movement speed by 15%.","effect":{"movement_speed":1.15}}]}},{"path":["incantation_upgrades",2],"removed":true,"old_value":{"incantation_id":"harpy","upgrades":[{"name":"Razor Talons","description":"Increases harpy damage by 20%.","effect":{"damage":1.2}},{"name":"Evasive Flight","description":"Increases harpy movement speed by 10%.","effect":{"movement_speed":1.1}},{"name":"Shriek","description":"Reduces harpy attack interval by 15%.","effect":{"attack_interval":0.85}}]}}]},{"entity_id":"enchanter","file":"data/upgrades/enchanter.json","category":"upgrades","change_type":"edit","diffs":[{"path":["population_scaling",1],"removed":true,"old_value":{"level":5,"population_cap":12}},{"path":["population_scaling",2],"removed":true,"old_value":{"level":10,"population_cap":15}},{"path":["population_scaling",3],"removed":true,"old_value":{"level":15,"population_cap":18}},{"path":["population_scaling",4],"removed":true,"old_value":{"level":20,"population_cap":21}},{"path":["population_scaling",5],"removed":true,"old_value":{"level":25,"population_cap":24}},{"path":["incantation_upgrades",0],"removed":true,"old_value":{"incantation_id":"heal_ray","upgrades":[{"name":"Restorative Surge","description":"Increases heal_ray value by 20%.","effect":{"value":1.2}},{"name":"Extended Reach","description":"Increases heal_ray range by 15%.","effect":{"range":1.15}},{"name":"Quick Mend","description":"Reduces heal_ray recharge time by 10%.","effect":{"recharge_time":0.9}}]}},{"path":["incantation_upgrades",1],"removed":true,"old_value":{"incantation_id":"faerie","upgrades":[{"name":"Fey Vitality","description":"Increases faerie health by 25%.","effect":{"health":1.25}},{"name":"Enchanted Glow","description":"Increases faerie heal aura range.","effect":{"aura_range":1.2}},{"name":"Spirit Link","description":"Faerie heals more per tick.","effect":{"heal_per_tick":1.15}}]}},{"path":["incantation_upgrades",2],"removed":true,"old_value":{"incantation_id":"dryad","upgrades":[{"name":"Nature's Bounty","description":"Increases dryad health by 20%.","effect":{"health":1.2}},{"name":"Thorned Roots","description":"Increases dryad damage by 15%.","effect":{"damage":1.15}},{"name":"Verdant Growth","description":"Reduces dryad spawn time by 10%.","effect":{"recharge_time":0.9}}]}}]}]},{"commit":"edf174d1487033df78715dbd41a6b39d108135bc","timestamp":"2026-02-26T15:43:35-05:00","author":"TerribleTurtles","message":"feat(data): apply EA balance patch stat updates","changes":[{"entity_id":"fire_rain","file":"data/spells/fire_rain.json","category":"spells","change_type":"edit","diffs":[{"path":["damage"],"old_value":450,"new_value":600},{"path":["duration"],"old_value":12,"new_value":15},{"path":["mechanics","damage_modifiers",1],"new_value":{"multiplier":0.5,"target_types":["Building"]}}]},{"entity_id":"fire_ray","file":"data/spells/fire_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["damage"],"old_value":14,"new_value":70}]},{"entity_id":"flame_surge","file":"data/spells/flame_surge.json","category":"spells","change_type":"edit","diffs":[{"path":["range"],"old_value":24,"new_value":48}]},{"entity_id":"poison_grenade","file":"data/spells/poison_grenade.json","category":"spells","change_type":"edit","diffs":[{"path":["damage"],"old_value":25,"new_value":35}]},{"entity_id":"resurrection","file":"data/spells/resurrection.json","category":"spells","change_type":"edit","diffs":[{"path":["description"],"old_value":"Magic circle that resurrects creatures with partial health.","new_value":"Magic circle that resurrects creatures at 100% HP (up to 5,000 HP). Limited to once per creature."}]},{"entity_id":"sacrifice","file":"data/spells/sacrifice.json","category":"spells","change_type":"edit","diffs":[{"path":["description"],"old_value":"Dark ritual that recalls allies to recharge summons.","new_value":"Dark ritual that damager enemies and curses units. Units killed by the curse recharge all your incantations."}]},{"entity_id":"thunder_ray","file":"data/spells/thunder_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["damage"],"old_value":10,"new_value":70}]},{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"edit","diffs":[{"path":["description"],"old_value":"A heavy defensive tower that targets enemies inside allied territory and can defend itself when attacked.","new_value":"A heavy defensive tower that targets enemies at medium range."},{"path":["health"],"old_value":3500,"new_value":3000}]},{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":1000,"new_value":750}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","aura",0,"value"],"old_value":13,"new_value":150}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":1800,"new_value":2500}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":150,"new_value":100}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["damage"],"old_value":100,"new_value":50},{"path":["health"],"old_value":4000,"new_value":10000},{"path":["dps"],"old_value":100,"new_value":50}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"old_value":"Flying","new_value":"Hover"}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["range"],"old_value":36,"new_value":35}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["description"],"old_value":"Medium-range soldier that deals bonus damage to structures.","new_value":"Medium-range soldier that deals bonus damage to buildings."},{"path":["range"],"old_value":22,"new_value":15},{"path":["movement_speed"],"old_value":3,"new_value":4}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["description"],"old_value":"Fast creature that explodes on contact, dealing bonus damage to structures.","new_value":"Fast creature that explodes on contact, dealing bonus damage to buildings."}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["range"],"old_value":36,"new_value":35}]}]},{"commit":"4368617f4833a19ad85e84a9b374b62093c4ef40","timestamp":"2026-02-26T14:42:36-05:00","author":"TerribleTurtles","message":"feat(data): add game systems, upgrades, cast stones","changes":[{"entity_id":"cast_stone_fire_ball","file":"data/consumables/cast_stone_fire_ball.json","category":"consumables","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.1.1"},{"path":["category"],"new_value":"Consumable"},{"path":["value"],"new_value":0},{"path":["stack_size"],"new_value":1},{"path":["image_required"],"new_value":true},{"path":["drop_time_seconds"],"new_value":[300,600]},{"path":["effect_type"],"new_value":"Cast_Stone"},{"path":["tags"],"new_value":["cast_stone","fire"]},{"path":["name"],"new_value":"Cast Stone: Fire Ball"},{"path":["description"],"new_value":"A Cast Stone that grants Fire Ball as a 5th incantation slot."},{"path":["grants_incantation"],"new_value":"fire_ball"},{"path":["$schema"],"new_value":"../../schemas/v2/consumables.schema.json"},{"path":["entity_id"],"new_value":"cast_stone_fire_ball"}]},{"entity_id":"cast_stone_heal_ray","file":"data/consumables/cast_stone_heal_ray.json","category":"consumables","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.1.1"},{"path":["category"],"new_value":"Consumable"},{"path":["value"],"new_value":0},{"path":["stack_size"],"new_value":1},{"path":["image_required"],"new_value":true},{"path":["drop_time_seconds"],"new_value":[300,600]},{"path":["effect_type"],"new_value":"Cast_Stone"},{"path":["tags"],"new_value":["cast_stone","healing"]},{"path":["name"],"new_value":"Cast Stone: Heal Ray"},{"path":["description"],"new_value":"A Cast Stone that grants Heal Ray as a 5th incantation slot."},{"path":["grants_incantation"],"new_value":"heal_ray"},{"path":["$schema"],"new_value":"../../schemas/v2/consumables.schema.json"},{"path":["entity_id"],"new_value":"cast_stone_heal_ray"}]},{"entity_id":"conqueror","file":"data/upgrades/conqueror.json","category":"upgrades","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.1.1"},{"path":["level_cap"],"new_value":25},{"path":["name"],"new_value":"Conqueror Upgrades"},{"path":["population_scaling"],"new_value":[{"level":1,"population_cap":10},{"level":5,"population_cap":14},{"level":10,"population_cap":18},{"level":15,"population_cap":22},{"level":20,"population_cap":26},{"level":25,"population_cap":30}]},{"path":["archetype"],"new_value":"Conqueror"},{"path":["$schema"],"new_value":"../schemas/v2/upgrades.schema.json"},{"path":["entity_id"],"new_value":"upgrades_conqueror"},{"path":["incantation_upgrades"],"new_value":[{"incantation_id":"fire_ball","upgrades":[{"name":"Searing Impact","description":"Increases fire_ball damage by 15%.","effect":{"damage":1.15}},{"name":"Wide Blaze","description":"Increases fire_ball radius by 20%.","effect":{"radius":1.2}},{"name":"Rapid Ignition","description":"Reduces fire_ball recharge time by 10%.","effect":{"recharge_time":0.9}}]},{"incantation_id":"ogre","upgrades":[{"name":"Ironhide","description":"Increases ogre health by 20%.","effect":{"health":1.2}},{"name":"Crushing Blow","description":"Increases ogre damage by 15%.","effect":{"damage":1.15}},{"name":"War Cry","description":"Ogre gains an attack speed buff on spawn.","effect":{"attack_interval":0.85}}]},{"incantation_id":"earth_golem","upgrades":[{"name":"Stone Fortification","description":"Increases earth_golem health by 25%.","effect":{"health":1.25}},{"name":"Seismic Slam","description":"Increases earth_golem damage by 20%.","effect":{"damage":1.2}},{"name":"Living Wall","description":"Reduces earth_golem movement speed but greatly increases armor.","effect":{"armor":1.5,"movement_speed":0.8}}]}]}]},{"entity_id":"duelist","file":"data/upgrades/duelist.json","category":"upgrades","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.1.1"},{"path":["level_cap"],"new_value":25},{"path":["name"],"new_value":"Duelist Upgrades"},{"path":["population_scaling"],"new_value":[{"level":1,"population_cap":10},{"level":5,"population_cap":13},{"level":10,"population_cap":16},{"level":15,"population_cap":19},{"level":20,"population_cap":22},{"level":25,"population_cap":25}]},{"path":["archetype"],"new_value":"Duelist"},{"path":["$schema"],"new_value":"../schemas/v2/upgrades.schema.json"},{"path":["entity_id"],"new_value":"upgrades_duelist"},{"path":["incantation_upgrades"],"new_value":[{"incantation_id":"frost_surge","upgrades":[{"name":"Bitter Cold","description":"Increases frost_surge damage by 15%.","effect":{"damage":1.15}},{"name":"Frostbite Spread","description":"Increases frost_surge range by 20%.","effect":{"range":1.2}},{"name":"Flash Freeze","description":"Reduces frost_surge recharge time by 12%.","effect":{"recharge_time":0.88}}]},{"incantation_id":"wolven_hunter","upgrades":[{"name":"Pack Tactics","description":"Increases wolven_hunter damage by 15%.","effect":{"damage":1.15}},{"name":"Thick Fur","description":"Increases wolven_hunter health by 20%.","effect":{"health":1.2}},{"name":"Swift Pounce","description":"Increases wolven_hunter movement speed by 15%.","effect":{"movement_speed":1.15}}]},{"incantation_id":"harpy","upgrades":[{"name":"Razor Talons","description":"Increases harpy damage by 20%.","effect":{"damage":1.2}},{"name":"Evasive Flight","description":"Increases harpy movement speed by 10%.","effect":{"movement_speed":1.1}},{"name":"Shriek","description":"Reduces harpy attack interval by 15%.","effect":{"attack_interval":0.85}}]}]}]},{"entity_id":"enchanter","file":"data/upgrades/enchanter.json","category":"upgrades","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.1.1"},{"path":["level_cap"],"new_value":25},{"path":["name"],"new_value":"Enchanter Upgrades"},{"path":["population_scaling"],"new_value":[{"level":1,"population_cap":10},{"level":5,"population_cap":12},{"level":10,"population_cap":15},{"level":15,"population_cap":18},{"level":20,"population_cap":21},{"level":25,"population_cap":24}]},{"path":["archetype"],"new_value":"Enchanter"},{"path":["$schema"],"new_value":"../schemas/v2/upgrades.schema.json"},{"path":["entity_id"],"new_value":"upgrades_enchanter"},{"path":["incantation_upgrades"],"new_value":[{"incantation_id":"heal_ray","upgrades":[{"name":"Restorative Surge","description":"Increases heal_ray value by 20%.","effect":{"value":1.2}},{"name":"Extended Reach","description":"Increases heal_ray range by 15%.","effect":{"range":1.15}},{"name":"Quick Mend","description":"Reduces heal_ray recharge time by 10%.","effect":{"recharge_time":0.9}}]},{"incantation_id":"faerie","upgrades":[{"name":"Fey Vitality","description":"Increases faerie health by 25%.","effect":{"health":1.25}},{"name":"Enchanted Glow","description":"Increases faerie heal aura range.","effect":{"aura_range":1.2}},{"name":"Spirit Link","description":"Faerie heals more per tick.","effect":{"heal_per_tick":1.15}}]},{"incantation_id":"dryad","upgrades":[{"name":"Nature's Bounty","description":"Increases dryad health by 20%.","effect":{"health":1.2}},{"name":"Thorned Roots","description":"Increases dryad damage by 15%.","effect":{"damage":1.15}},{"name":"Verdant Growth","description":"Reduces dryad spawn time by 10%.","effect":{"recharge_time":0.9}}]}]}]},{"entity_id":"placeholder","file":"data/upgrades/placeholder.json","category":"upgrades","change_type":"delete","diffs":[{"path":["upgrade_id"],"removed":true},{"path":["name"],"removed":true},{"path":["effect"],"removed":true},{"path":["description"],"removed":true},{"path":["$schema"],"removed":true},{"path":["target_tags"],"removed":true}]}]},{"commit":"5e16aebb69e5ac4dc687f671fd6ae745ea1f08d8","timestamp":"2026-02-26T14:12:59-05:00","author":"TerribleTurtles","message":"feat(data): add mechanics to new units and spells","changes":[{"entity_id":"holy_arrow","file":"data/spells/holy_arrow.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","aura"],"new_value":[{"name":"Holy Healing","description":"Heals allies hit by the arrow.","radius":0,"value":0,"interval":0,"effect":"Heal","target_types":["Ally"]}]},{"path":["mechanics","features"],"new_value":[{"name":"Dual Effect","description":"Damages enemies and heals allies in the path."}]}]},{"entity_id":"metamorphosis","file":"data/spells/metamorphosis.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","features"],"new_value":[{"name":"Transform","description":"Transforms Rank I creatures into harmless critters."}]}]},{"entity_id":"rhino_rider","file":"data/units/rhino_rider.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","features"],"new_value":[{"name":"Charge","description":"Charges at buildings, dealing bonus damage on impact."}]}]},{"entity_id":"rocket_soldier_factory","file":"data/units/rocket_soldier_factory.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","spawner"],"new_value":[{"unit_id":"rocket_soldier","count":5,"interval":10,"trigger":"Interval"},{"unit_id":"rocket_soldier","count":10,"trigger":"Death"}]}]},{"entity_id":"siren","file":"data/units/siren.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","aura"],"new_value":[{"name":"Siren Song","description":"Charms nearby enemies, causing them to attack their own allies.","radius":0,"value":0,"interval":0,"effect":"Debuff","target_types":["Enemy"]}]},{"path":["mechanics","features"],"new_value":[{"name":"Friendly Fire","description":"Affected enemies deal damage to their own allies."}]}]}]},{"commit":"2b1663670bade223b2ed9b05ed5c3490e42606a2","timestamp":"2026-02-26T11:38:21-05:00","author":"TerribleTurtles","message":"feat(data): add knowledge cost system and new entities","changes":[{"entity_id":"astral_nova","file":"data/spells/astral_nova.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":200}]},{"entity_id":"astral_shot","file":"data/spells/astral_shot.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":0}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":500}]},{"entity_id":"fire_ball","file":"data/spells/fire_ball.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":50}]},{"entity_id":"fire_rain","file":"data/spells/fire_rain.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":500}]},{"entity_id":"fire_ray","file":"data/spells/fire_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":0}]},{"entity_id":"flame_surge","file":"data/spells/flame_surge.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":50}]},{"entity_id":"frost_surge","file":"data/spells/frost_surge.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":50}]},{"entity_id":"grand_lightning","file":"data/spells/grand_lightning.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":0}]},{"entity_id":"heal_ray","file":"data/spells/heal_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":0}]},{"entity_id":"holy_arrow","file":"data/spells/holy_arrow.json","category":"spells","change_type":"add","diffs":[{"path":["cast_time"],"new_value":0},{"path":["rank"],"new_value":"II"},{"path":["name"],"new_value":"Holy Arrow"},{"path":["recharge_time"],"new_value":10},{"path":["charges"],"new_value":1},{"path":["damage"],"new_value":0},{"path":["tags"],"new_value":[]},{"path":["description"],"new_value":"Piercing arrow that damages enemies and heals allies."},{"path":["range"],"new_value":0},{"path":["category"],"new_value":"Spell"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Holy"},{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}},{"path":["knowledge_cost"],"new_value":200},{"path":["entity_id"],"new_value":"holy_arrow"},{"path":["game_version"],"new_value":"0.1.0"},{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}},{"path":["$schema"],"new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"ice_ray","file":"data/spells/ice_ray.json","category":"spells","change_type":"add","diffs":[{"path":["cast_time"],"new_value":0},{"path":["rank"],"new_value":"I"},{"path":["name"],"new_value":"Ice Ray"},{"path":["recharge_time"],"new_value":10},{"path":["charges"],"new_value":1},{"path":["damage"],"new_value":70},{"path":["tags"],"new_value":[]},{"path":["description"],"new_value":"Focused beam that deals sustained Frost damage."},{"path":["range"],"new_value":45},{"path":["category"],"new_value":"Spell"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Elemental"},{"path":["mechanics"],"new_value":{"infusion":{"id":"ice_infusion"},"damage_modifiers":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}},{"path":["knowledge_cost"],"new_value":200},{"path":["entity_id"],"new_value":"ice_ray"},{"path":["game_version"],"new_value":"0.1.0"},{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}},{"path":["$schema"],"new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"metamorphosis","file":"data/spells/metamorphosis.json","category":"spells","change_type":"add","diffs":[{"path":["cast_time"],"new_value":0},{"path":["rank"],"new_value":"III"},{"path":["name"],"new_value":"Metamorphosis"},{"path":["recharge_time"],"new_value":10},{"path":["charges"],"new_value":1},{"path":["damage"],"new_value":0},{"path":["tags"],"new_value":[]},{"path":["description"],"new_value":"Ritual that transforms Rank I creatures into harmless critters."},{"path":["range"],"new_value":0},{"path":["category"],"new_value":"Spell"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Astral"},{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}},{"path":["knowledge_cost"],"new_value":800},{"path":["entity_id"],"new_value":"metamorphosis"},{"path":["game_version"],"new_value":"0.1.0"},{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}},{"path":["$schema"],"new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"poison_breath","file":"data/spells/poison_breath.json","category":"spells","change_type":"add","diffs":[{"path":["cast_time"],"new_value":0},{"path":["rank"],"new_value":"I"},{"path":["name"],"new_value":"Poison Breath"},{"path":["recharge_time"],"new_value":10},{"path":["charges"],"new_value":1},{"path":["damage"],"new_value":70},{"path":["tags"],"new_value":[]},{"path":["description"],"new_value":"Focused beam that deals low Poison damage."},{"path":["range"],"new_value":45},{"path":["category"],"new_value":"Spell"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Necromancy"},{"path":["mechanics"],"new_value":{"infusion":{"id":"poison_infusion"},"damage_modifiers":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}},{"path":["knowledge_cost"],"new_value":50},{"path":["entity_id"],"new_value":"poison_breath"},{"path":["game_version"],"new_value":"0.1.0"},{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}},{"path":["$schema"],"new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"poison_grenade","file":"data/spells/poison_grenade.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":200}]},{"entity_id":"resurrection","file":"data/spells/resurrection.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":800}]},{"entity_id":"sacrifice","file":"data/spells/sacrifice.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":50}]},{"entity_id":"thunder_ray","file":"data/spells/thunder_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":50}]},{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":300}]},{"entity_id":"ballista","file":"data/units/ballista.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":200}]},{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":300}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":50}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":50}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":50}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":300}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":50}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":300}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":800}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":500}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":50}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":0}]},{"entity_id":"rampart","file":"data/units/rampart.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":50}]},{"entity_id":"rhino_rider","file":"data/units/rhino_rider.json","category":"units","change_type":"add","diffs":[{"path":["cast_time"],"new_value":0},{"path":["rank"],"new_value":"II"},{"path":["name"],"new_value":"Rhino Rider"},{"path":["recharge_time"],"new_value":10},{"path":["charges"],"new_value":1},{"path":["health"],"new_value":0},{"path":["damage"],"new_value":0},{"path":["tags"],"new_value":[]},{"path":["description"],"new_value":"Mounted unit that charges and destroys enemy structures."},{"path":["range"],"new_value":1},{"path":["movement_type"],"new_value":"Ground"},{"path":["category"],"new_value":"Creature"},{"path":["attack_interval"],"new_value":1},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"War"},{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}},{"path":["knowledge_cost"],"new_value":500},{"path":["entity_id"],"new_value":"rhino_rider"},{"path":["game_version"],"new_value":"0.1.0"},{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}},{"path":["population"],"new_value":0},{"path":["dps"],"new_value":0},{"path":["movement_speed"],"new_value":0},{"path":["$schema"],"new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":50}]},{"entity_id":"rocket_soldier_factory","file":"data/units/rocket_soldier_factory.json","category":"units","change_type":"add","diffs":[{"path":["cast_time"],"new_value":0},{"path":["rank"],"new_value":"III"},{"path":["name"],"new_value":"Rocket Soldier Factory"},{"path":["recharge_time"],"new_value":10},{"path":["charges"],"new_value":1},{"path":["health"],"new_value":0},{"path":["damage"],"new_value":0},{"path":["tags"],"new_value":[]},{"path":["description"],"new_value":"Factory that continuously produces Rocket Soldiers."},{"path":["range"],"new_value":0},{"path":["category"],"new_value":"Building"},{"path":["attack_interval"],"new_value":1},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Technomancy"},{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}},{"path":["knowledge_cost"],"new_value":500},{"path":["entity_id"],"new_value":"rocket_soldier_factory"},{"path":["game_version"],"new_value":"0.1.0"},{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}},{"path":["population"],"new_value":0},{"path":["dps"],"new_value":0},{"path":["movement_speed"],"new_value":0},{"path":["$schema"],"new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":50}]},{"entity_id":"siren","file":"data/units/siren.json","category":"units","change_type":"add","diffs":[{"path":["cast_time"],"new_value":0},{"path":["rank"],"new_value":"II"},{"path":["name"],"new_value":"Siren"},{"path":["recharge_time"],"new_value":10},{"path":["charges"],"new_value":1},{"path":["health"],"new_value":0},{"path":["damage"],"new_value":0},{"path":["tags"],"new_value":[]},{"path":["description"],"new_value":"Disruptive creature that makes enemies fight each other."},{"path":["range"],"new_value":1},{"path":["movement_type"],"new_value":"Ground"},{"path":["category"],"new_value":"Creature"},{"path":["attack_interval"],"new_value":1},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Wild"},{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}},{"path":["knowledge_cost"],"new_value":800},{"path":["entity_id"],"new_value":"siren"},{"path":["game_version"],"new_value":"0.1.0"},{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}},{"path":["population"],"new_value":0},{"path":["dps"],"new_value":0},{"path":["movement_speed"],"new_value":0},{"path":["$schema"],"new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":0}]},{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":300}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":300}]},{"entity_id":"wolven_hunter","file":"data/units/wolven_hunter.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":200}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["knowledge_cost"],"new_value":0}]}]},{"commit":"9999f7b1c5129c1575e1ee2a87215fde9cca02bd","timestamp":"2026-02-25T21:13:37-05:00","author":"TerribleTurtles","message":"fix(titans): remove multiplier values from weak point descriptions","changes":[{"entity_id":"gaia_beast","file":"data/titans/gaia_beast.json","category":"titans","change_type":"edit","diffs":[{"path":["weak_points",0,"description"],"old_value":"Gaia Beast takes +100% extra damage on its chest.","new_value":"Gaia Beast takes extra damage on its chest."}]},{"entity_id":"thanatos","file":"data/titans/thanatos.json","category":"titans","change_type":"edit","diffs":[{"path":["weak_points",0,"description"],"old_value":"Thanatos takes +25% extra damage from behind.","new_value":"Thanatos takes extra damage from behind."}]}]},{"commit":"add753043d365502ce18374cc5ef20199d32aa6d","timestamp":"2026-02-25T20:55:58-05:00","author":"TerribleTurtles","message":"feat(titans): add weak points to schema and entities","changes":[{"entity_id":"gaia_beast","file":"data/titans/gaia_beast.json","category":"titans","change_type":"edit","diffs":[{"path":["weak_points"],"new_value":[{"location":"chest","multiplier":2.0,"description":"Gaia Beast takes +100% extra damage on its chest."}]}]},{"entity_id":"thanatos","file":"data/titans/thanatos.json","category":"titans","change_type":"edit","diffs":[{"path":["weak_points"],"new_value":[{"location":"back","multiplier":1.25,"description":"Thanatos takes +25% extra damage from behind."}]}]}]},{"commit":"2c5112d942798108492fbbdcce66d66023316679","timestamp":"2026-02-25T20:17:27-05:00","author":"TerribleTurtles","message":"feat(templates): add damage_modifiers to all units and spells","changes":[{"entity_id":"astral_shot","file":"data/spells/astral_shot.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers"],"new_value":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}]},{"entity_id":"fire_ball","file":"data/spells/fire_ball.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers"],"new_value":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}]},{"entity_id":"fire_ray","file":"data/spells/fire_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers"],"new_value":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}]},{"entity_id":"grand_lightning","file":"data/spells/grand_lightning.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers"],"new_value":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}]},{"entity_id":"sacrifice","file":"data/spells/sacrifice.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers"],"new_value":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}]},{"entity_id":"thunder_ray","file":"data/spells/thunder_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers"],"new_value":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}]},{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}}]},{"entity_id":"ballista","file":"data/units/ballista.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}}]},{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers"],"new_value":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers"],"new_value":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers"],"new_value":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers"],"new_value":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers"],"new_value":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}]},{"entity_id":"rampart","file":"data/units/rampart.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}}]},{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}}]},{"entity_id":"wolven_hunter","file":"data/units/wolven_hunter.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_types":["Building"],"multiplier":1.0},{"target_types":["Lifestone"],"multiplier":1.0},{"target_types":["Creature"],"multiplier":1.0},{"target_types":["Spellcaster"],"multiplier":1.0}]}}]}]},{"commit":"6281f5e5f96444536e6065eedd77e3686296b84c","timestamp":"2026-02-25T20:01:31-05:00","author":"TerribleTurtles","message":"feat(templates): inject empty damage_overrides into all units and spells","changes":[{"entity_id":"astral_nova","file":"data/spells/astral_nova.json","category":"spells","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"astral_shot","file":"data/spells/astral_shot.json","category":"spells","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"fire_ball","file":"data/spells/fire_ball.json","category":"spells","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"fire_rain","file":"data/spells/fire_rain.json","category":"spells","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"fire_ray","file":"data/spells/fire_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"grand_lightning","file":"data/spells/grand_lightning.json","category":"spells","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"poison_grenade","file":"data/spells/poison_grenade.json","category":"spells","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"sacrifice","file":"data/spells/sacrifice.json","category":"spells","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"thunder_ray","file":"data/spells/thunder_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"ballista","file":"data/units/ballista.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"rampart","file":"data/units/rampart.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"wolven_hunter","file":"data/units/wolven_hunter.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["damage_overrides"],"new_value":{"Building":0,"Lifestone":0,"Creature":0,"Spellcaster":0}}]}]},{"commit":"ac020cfc1c543f4e671c1f0220bad04eb0bf944b","timestamp":"2026-02-24T18:13:41-05:00","author":"TerribleTurtles","message":"feat(data): redesign infusions schema and fix entity data","changes":[{"entity_id":"astral_monk","file":"data/heroes/astral_monk.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics","features"],"removed":true}]},{"entity_id":"heal_ray","file":"data/spells/heal_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"aura":[{"name":"AoE Heal","description":"Heals allies in the targeted area.","radius":0,"value":0,"interval":0,"effect":"Heal","target_types":["Ally"]}]}}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","aura",0],"old_value":{"name":"Cursed Wounds","description":"Curses enemies when dealing damage, increasing the damage they take (1.32x) and reducing their movement speed (0.4x). Lingers for 1s.","radius":3,"value":0,"interval":1,"effect":"Debuff","target_types":["Enemy"]},"new_value":{"name":"Cursed Wounds (Slow)","description":"Reduces movement speed of nearby enemies by 60%. Lingers for 1s.","radius":3,"value":0.4,"interval":1,"effect":"Debuff","target_types":["Enemy"]}},{"path":["mechanics","aura",1],"new_value":{"name":"Cursed Wounds (Vulnerability)","description":"Increases damage taken by nearby enemies by 32%. Lingers for 1s.","radius":3,"value":1.32,"interval":1,"effect":"Debuff","target_types":["Enemy"]}}]}]},{"commit":"5299f0ab76012fe7d4a1dc7c02282d3e598a58d2","timestamp":"2026-02-24T11:56:29-05:00","author":"TerribleTurtles","message":"feat(infusions): implement centralized infusion data system","changes":[{"entity_id":"fire_elementalist","file":"data/heroes/fire_elementalist.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics","infusion"],"new_value":{"id":"fire_infusion"}},{"path":["abilities","ultimate","mechanics"],"new_value":{"infusion":{"id":"fire_infusion"}}}]},{"entity_id":"swamp_witch","file":"data/heroes/swamp_witch.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics","infusion"],"new_value":{"id":"poison_infusion"}}]},{"entity_id":"fire_ball","file":"data/spells/fire_ball.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","infusion"],"new_value":{"id":"fire_infusion"}}]},{"entity_id":"fire_rain","file":"data/spells/fire_rain.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","infusion"],"new_value":{"id":"fire_infusion"}}]},{"entity_id":"fire_ray","file":"data/spells/fire_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","infusion"],"new_value":{"id":"fire_infusion"}}]},{"entity_id":"flame_surge","file":"data/spells/flame_surge.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"infusion":{"id":"fire_infusion"}}}]},{"entity_id":"frost_surge","file":"data/spells/frost_surge.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"infusion":{"id":"ice_infusion"}}}]},{"entity_id":"grand_lightning","file":"data/spells/grand_lightning.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"infusion":{"id":"lightning_infusion"}}}]},{"entity_id":"poison_grenade","file":"data/spells/poison_grenade.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","infusion"],"new_value":{"id":"poison_infusion"}}]},{"entity_id":"thunder_ray","file":"data/spells/thunder_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","infusion"],"new_value":{"id":"lightning_infusion"}}]}]},{"commit":"a1c1a8605901076247e615985a7c004eb0a617ee","timestamp":"2026-02-24T10:38:50-05:00","author":"TerribleTurtles","message":"feat(heroes): add ultimate damage placeholder","changes":[{"entity_id":"fire_elementalist","file":"data/heroes/fire_elementalist.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","ultimate","damage"],"new_value":67}]},{"entity_id":"iron_sorcerer","file":"data/heroes/iron_sorcerer.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","ultimate","damage"],"new_value":67}]},{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","ultimate","damage"],"new_value":67}]}]},{"commit":"0c576a19a84091ceb44701b415bb6031d0f394bd","timestamp":"2026-02-24T02:22:30-05:00","author":"TerribleTurtles","message":"fix(data): enforce stricter aura validation and apply missing fields","changes":[{"entity_id":"mystic_scribe","file":"data/heroes/mystic_scribe.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",0,"mechanics","aura",0,"description"],"new_value":"Heals nearby allies."}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","aura",0,"value"],"new_value":0},{"path":["mechanics","aura",0,"interval"],"new_value":1}]}]},{"commit":"4a46b07ae196dc458ac1ffb06c9e167165a6a576","timestamp":"2026-02-24T00:52:09-05:00","author":"TerribleTurtles","message":"fix(data): resolve PR schema errors and update index.html","changes":[{"entity_id":"astral_monk","file":"data/heroes/astral_monk.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",1,"description"],"old_value":"All damage dealt is increased against targets below half health.","new_value":"All damage dealt is increased by 47% against targets below half health."},{"path":["abilities","defense","duration"],"old_value":1.5,"new_value":3},{"path":["abilities","defense","mechanics","stealth","duration"],"old_value":1.5,"new_value":3}]},{"entity_id":"mystic_scribe","file":"data/heroes/mystic_scribe.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",0,"mechanics"],"new_value":{"aura":[{"name":"Echo of Mercy Aura","radius":5,"value":10,"effect":"Heal","target_types":["Ally"],"interval":1}]}},{"path":["abilities","ultimate","heal_amount"],"new_value":70},{"path":["abilities","ultimate","radius"],"new_value":30},{"path":["abilities","ultimate","interval"],"new_value":1},{"path":["abilities","passive",1,"description"],"old_value":"All Holy incantations recharge faster.","new_value":"All Holy incantations recharge 16.7% faster."},{"path":["abilities","ultimate","description"],"old_value":"Mark the ground with a massive healing seal.","new_value":"Mark the ground with a massive healing seal (70 + 1.37% target Max HP)."}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"aura":[{"name":"Cursed Wounds","description":"Curses enemies when dealing damage, increasing the damage they take (1.32x) and reducing their movement speed (0.4x). Lingers for 1s.","radius":3,"effect":"Debuff","target_types":["Enemy"]}]}}]}]},{"commit":"de68612075199e0e17004f11dc2630665dde55ac","timestamp":"2026-02-24T01:32:21Z","author":"TerribleTurtle","message":"change damage to creature from 1.75 to 0.75","changes":[{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",1,"multiplier"],"old_value":1.75,"new_value":0.75}]}]},{"commit":"bda3a4324feea93d9dc2e9d6e1297c71e9e1a30a","timestamp":"2026-02-23T08:01:50-05:00","author":"AnonJoker-cloud","message":"Update fire_elementalist.json (#46)","changes":[{"entity_id":"fire_elementalist","file":"data/heroes/fire_elementalist.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",0,"description"],"old_value":"Allied creatures near the Fire Elementalist capture Altar faster.","new_value":"Allied creatures near the Fire Elementalist capture Altar +58% faster."},{"path":["abilities","passive",1,"description"],"old_value":"Damaging burning enemies heals the Fire Elementalist.","new_value":"Damaging burning enemies heals the Fire Elementalist for 10 Health."}]}]},{"commit":"90e65dbe393ff1cc21876c6cdbc5b4889b3ba113","timestamp":"2026-02-23T08:01:05-05:00","author":"AnonJoker-cloud","message":"Update lizard_archer.json (#44)","changes":[{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":5,"new_value":9}]}]},{"commit":"ce38ef4af4c9610795eb7e01362be6d4227e21a3","timestamp":"2026-02-23T08:00:47-05:00","author":"AnonJoker-cloud","message":"Update harpy.json (#43)","changes":[{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":5,"new_value":7}]}]},{"commit":"286ac11092848a74866b1dc4a664dd411c139b33","timestamp":"2026-02-23T08:00:25-05:00","author":"AnonJoker-cloud","message":"Update stone_shaman.json (#42)","changes":[{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",2,"description"],"old_value":"While on the ground, the Shaman recharges Wild spells and creatures much faster.","new_value":"While on the ground, the Shaman recharges Wild spells and creatures +58% faster."}]}]},{"commit":"447d7488ea69f211d9d4db1444850588a5c43945","timestamp":"2026-02-23T07:59:56-05:00","author":"AnonJoker-cloud","message":"Update astral_nova.json (#40)","changes":[{"entity_id":"astral_nova","file":"data/spells/astral_nova.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"multiplier":0.27,"target_types":["Building"]}]}}]}]},{"commit":"a3b8299fc09df13e50be08bef85f1e8bb4c217c0","timestamp":"2026-02-22T20:15:02-05:00","author":"AnonJoker-cloud","message":"Update stone_shaman.json (#34)","changes":[{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",1,"description"],"old_value":"Increases Rank II and Rank III population while reducing Rank I population.","new_value":"Increases Rank II population by 5 and Rank III population by 1 while reducing Rank I population by 15."}]}]},{"commit":"bca5200494455320c4a91ec28b11c64a8fe99cb2","timestamp":"2026-02-22T20:11:48-05:00","author":"AnonJoker-cloud","message":"Update iron_sorcerer.json (#33)","changes":[{"entity_id":"iron_sorcerer","file":"data/heroes/iron_sorcerer.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",0,"description"],"old_value":"Increases Rank III population, reduces Rank II population.","new_value":"Increases Rank III population by 1, reduces Rank II population by 2."}]}]},{"commit":"70efde36870c1620b48d4d4ca801dd27aa9f7c37","timestamp":"2026-02-22T20:10:15-05:00","author":"AnonJoker-cloud","message":"Update swamp_witch.json (#35)","changes":[{"entity_id":"swamp_witch","file":"data/heroes/swamp_witch.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",2,"description"],"old_value":"The Swamp Witch has more Rank I population, but less Rank II and Rank III population.  ","new_value":"The Swamp Witch increases Rank I population by 5, while reducing Rank II and Rank III population by 2."}]}]},{"commit":"4aa2d5435bfd63cf7cee0b248a0ddad5e1370118","timestamp":"2026-02-22T20:09:40-05:00","author":"AnonJoker-cloud","message":"Update harpy.json (#36)","changes":[{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":100,"new_value":150}]}]},{"commit":"666c5f5a9e24760a8042dd017b48f52e15d13a0b","timestamp":"2026-02-22T18:03:41-05:00","author":"AnonJoker-cloud","message":"Update swamp_witch.json (#32)","changes":[{"entity_id":"swamp_witch","file":"data/heroes/swamp_witch.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","ultimate","description"],"old_value":"Unleashes a demonic form that boosts all spell damage by 150%. Poison Strike fires 2 extra projectiles that deal +285% damage.","new_value":"Unleashes a demonic form that boosts all spell damage by +50%. Poison Strike fires 2 extra projectiles that deal +185% damage."},{"path":["abilities","ultimate","mechanics","damage_modifiers",0,"multiplier"],"old_value":2.5,"new_value":1.5},{"path":["abilities","ultimate","mechanics","features",0,"description"],"old_value":"Poison Strike gains 2 extra projectiles dealing +285% damage.","new_value":"Poison Strike gains 2 extra projectiles dealing +185% damage."}]}]},{"commit":"89dc960b5915421ff870bf8a9a95d66ed3bd27a3","timestamp":"2026-02-22T17:40:49-05:00","author":"AnonJoker-cloud","message":"Update ogre.json (#16)","changes":[{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":50,"new_value":60}]}]},{"commit":"43bd843935770004c1d2b3f51b4a5b4138fe37af","timestamp":"2026-02-22T17:40:37-05:00","author":"AnonJoker-cloud","message":"Update harpy_nest.json (#17)","changes":[{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":50,"new_value":60}]}]},{"commit":"befaa1ca6f1d5bd347cccaf979cea001b1e0f68d","timestamp":"2026-02-22T17:40:25-05:00","author":"AnonJoker-cloud","message":"Update astral_tower.json (#18)","changes":[{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":50,"new_value":60}]}]},{"commit":"a89859ad086b86b561a2b030724033c218cd8a78","timestamp":"2026-02-22T17:40:12-05:00","author":"AnonJoker-cloud","message":"Update crypt.json (#19)","changes":[{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":50,"new_value":60}]}]},{"commit":"353f1118b4235b9320dbad79ed6295896d5c9daa","timestamp":"2026-02-22T17:39:57-05:00","author":"AnonJoker-cloud","message":"Update dryad.json (#20)","changes":[{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","aura",0,"value"],"old_value":30,"new_value":13}]}]},{"commit":"5a47e8eee41489eab08dff1e6eec0e43c49554e3","timestamp":"2026-02-22T17:39:41-05:00","author":"AnonJoker-cloud","message":"Update giant_shielder.json (#21)","changes":[{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":50,"new_value":60}]}]},{"commit":"b8f455c1d85a92e2436c88686ecd4967d708fd9b","timestamp":"2026-02-22T17:39:30-05:00","author":"AnonJoker-cloud","message":"Update steam_tank.json (#22)","changes":[{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":50,"new_value":60}]}]},{"commit":"c6dd9ee8f0a0f968b81b7bb4705420b610feafe1","timestamp":"2026-02-22T17:39:21-05:00","author":"AnonJoker-cloud","message":"Update stone_behemoth.json (#23)","changes":[{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":50,"new_value":60}]}]},{"commit":"d6dfc00ceee46bcab119143e6bfb89f3e5c81432","timestamp":"2026-02-22T17:39:13-05:00","author":"AnonJoker-cloud","message":"Update fire_ball.json (#24)","changes":[{"entity_id":"fire_ball","file":"data/spells/fire_ball.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":50,"new_value":60}]}]},{"commit":"d7dcd755e4c567e605ebfc14e2146699c69d3895","timestamp":"2026-02-22T17:39:01-05:00","author":"AnonJoker-cloud","message":"Update frost_surge.json (#25)","changes":[{"entity_id":"frost_surge","file":"data/spells/frost_surge.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":50,"new_value":60}]}]},{"commit":"ca5b0ebff850b36c432c2b5439baec68189f0c36","timestamp":"2026-02-22T17:07:47-05:00","author":"AnonJoker-cloud","message":"Update poison_grenade.json (#26)","changes":[{"entity_id":"poison_grenade","file":"data/spells/poison_grenade.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":50,"new_value":60}]}]},{"commit":"2016c951b65b8dd50cb7beda0a7dd864dd2af881","timestamp":"2026-02-22T16:49:31-05:00","author":"AnonJoker-cloud","message":"Update astral_monk.json (#28)","changes":[{"entity_id":"astral_monk","file":"data/heroes/astral_monk.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",0,"description"],"old_value":"All Astral spells recharge faster.","new_value":"All Astral spells recharge 32% faster."}]}]},{"commit":"725dab88a701ec4eede0bbd8c3b055b4b51df98a","timestamp":"2026-02-19T00:11:56-05:00","author":"TerribleTurtles","message":"[HOTFIX] Hotfix 0.0.3 (0.0.3)","changes":[{"entity_id":"astral_nova","file":"data/spells/astral_nova.json","category":"spells","change_type":"edit","diffs":[{"path":["description"],"old_value":"Massive projectile that deals heavy damage on impact.","new_value":"Massive projectile emitting a damaging aura that deals heavy damage on impact."}]},{"entity_id":"fire_ball","file":"data/spells/fire_ball.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{}},{"path":["description"],"old_value":"Fast projectile that deals medium Fire damage to a target.","new_value":"Fast projectile emitting a burning aura that deals medium Fire damage to a target."},{"path":["cast_time"],"old_value":0,"new_value":0.5}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",1],"new_value":{"multiplier":1.75,"target_types":["Creature"]}}]}]},{"commit":"85b4f83e39e6034597368de31d6c868ab1d77f3d","timestamp":"2026-02-18T21:15:53-05:00","author":"TerribleTurtles","message":"[HOTFIX] Hotfix 0.0.2 (0.0.2)","changes":[{"entity_id":"iron_sorcerer","file":"data/heroes/iron_sorcerer.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","defense","cooldown"],"new_value":5}]},{"entity_id":"mystic_scribe","file":"data/heroes/mystic_scribe.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","defense","description"],"old_value":"Creates a barrier that absorbs projectiles and reduces all damage. Absorbing Spellcaster projectiles refreshes Holy incantations.","new_value":"Creates a barrier that absorbs projectiles and reduces all damage. Absorbing Spellcaster projectiles partially refresh Holy incantations."},{"path":["abilities","passive",1,"description"],"old_value":"All Holy spells recharge faster.","new_value":"All Holy incantations recharge faster."},{"path":["abilities","primary","damage"],"old_value":23,"new_value":25}]},{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",2,"description"],"old_value":"While on the ground, the Shaman recharges Wild incantations much faster.","new_value":"While on the ground, the Shaman recharges Wild spells and creatures much faster."}]},{"entity_id":"astral_shot","file":"data/spells/astral_shot.json","category":"spells","change_type":"edit","diffs":[{"path":["damage"],"old_value":40,"new_value":32}]},{"entity_id":"thunder_ray","file":"data/spells/thunder_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["damage"],"old_value":14,"new_value":10},{"path":["mechanics","waves"],"old_value":5,"new_value":7}]}]},{"commit":"a5b9a0e6fd14e8e2cd7bc5005e32eca1e2e39a54","timestamp":"2026-02-18T19:42:15-05:00","author":"TerribleTurtles","message":"[UPDATE] Hotfix 0.0.1 (0.0.1)","changes":[{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","bonus_damage",0,"value"],"old_value":0.3,"new_value":1.3}]}]},{"commit":"c4bffb76025b64d19a8f246de9e7f0b177237d45","timestamp":"2026-02-18T18:16:59-05:00","author":"TerribleTurtles","message":"[UPDATE] Hotfix 0.0.1 (0.0.1)","changes":[{"entity_id":"astral_monk","file":"data/heroes/astral_monk.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",0,"description"],"old_value":"All Astral incantations recharge faster.","new_value":"All Astral spells recharge faster."}]}]},{"commit":"bb4b946d55e7eef62c17af0e7b29fd242dcd7a5d","timestamp":"2026-02-18T09:40:03-05:00","author":"TerribleTurtles","message":"chore: deploy verification - fix strictness test, rebuild API v2 artifacts","changes":[{"entity_id":"charge_orb_1","file":"data/consumables/charge_orb_1.json","category":"consumables","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"charge_orb_2","file":"data/consumables/charge_orb_2.json","category":"consumables","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"conquest_banner","file":"data/consumables/conquest_banner.json","category":"consumables","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"healing_grimoire_1","file":"data/consumables/healing_grimoire_1.json","category":"consumables","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"healing_grimoire_2","file":"data/consumables/healing_grimoire_2.json","category":"consumables","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"healing_grimoire_3","file":"data/consumables/healing_grimoire_3.json","category":"consumables","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"power_grimoire","file":"data/consumables/power_grimoire.json","category":"consumables","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"protection_grimoire","file":"data/consumables/protection_grimoire.json","category":"consumables","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"astral_monk","file":"data/heroes/astral_monk.json","category":"heroes","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"fire_elementalist","file":"data/heroes/fire_elementalist.json","category":"heroes","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"iron_sorcerer","file":"data/heroes/iron_sorcerer.json","category":"heroes","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"mystic_scribe","file":"data/heroes/mystic_scribe.json","category":"heroes","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"swamp_witch","file":"data/heroes/swamp_witch.json","category":"heroes","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"astral_nova","file":"data/spells/astral_nova.json","category":"spells","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"astral_shot","file":"data/spells/astral_shot.json","category":"spells","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"fire_ball","file":"data/spells/fire_ball.json","category":"spells","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"fire_rain","file":"data/spells/fire_rain.json","category":"spells","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"fire_ray","file":"data/spells/fire_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"flame_surge","file":"data/spells/flame_surge.json","category":"spells","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"frost_surge","file":"data/spells/frost_surge.json","category":"spells","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"grand_lightning","file":"data/spells/grand_lightning.json","category":"spells","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"heal_ray","file":"data/spells/heal_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"poison_grenade","file":"data/spells/poison_grenade.json","category":"spells","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"resurrection","file":"data/spells/resurrection.json","category":"spells","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"sacrifice","file":"data/spells/sacrifice.json","category":"spells","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"thunder_ray","file":"data/spells/thunder_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"gaia_beast","file":"data/titans/gaia_beast.json","category":"titans","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1}]},{"entity_id":"thanatos","file":"data/titans/thanatos.json","category":"titans","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1}]},{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"ballista","file":"data/units/ballista.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1}]},{"entity_id":"rampart","file":"data/units/rampart.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1}]},{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"wolven_hunter","file":"data/units/wolven_hunter.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1},{"path":["cast_time"],"old_value":0.0,"new_value":0}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["changelog"],"removed":true},{"path":["attack_interval"],"old_value":1.0,"new_value":1}]},{"entity_id":"placeholder","file":"data/upgrades/placeholder.json","category":"upgrades","change_type":"edit","diffs":[{"path":["changelog"],"removed":true}]}]},{"commit":"f5dd85a577b5616cde3cf087ed955a25b49ffa15","timestamp":"2026-02-18T03:10:58-05:00","author":"TerribleTurtles","message":"[HOTFIX] Hotfix 0.0.1 (0.0.1)","changes":[{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["range"],"new_value":25},{"path":["attack_interval"],"old_value":1.0,"new_value":1},{"path":["cast_time"],"old_value":0.0,"new_value":0}]}]},{"commit":"18bccfacc87d9a7c09b1a5f087dccb5e7bf7ce53","timestamp":"2026-02-18T02:22:18-05:00","author":"TerribleTurtles","message":"[HOTFIX] Hotfix 0.0.1 (0.0.1)","changes":[{"entity_id":"astral_monk","file":"data/heroes/astral_monk.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",0,"description"],"old_value":"All Astral spells recharge faster.","new_value":"All Astral incantations recharge faster."},{"path":["abilities","defense","cooldown"],"old_value":8,"new_value":10}]},{"entity_id":"fire_elementalist","file":"data/heroes/fire_elementalist.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","defense","cooldown"],"new_value":10},{"path":["abilities","passive",2,"description"],"old_value":"When you or your creatures kill a Burning enemy, recharge Elemental spells.","new_value":"When you or your creatures kill a Burning enemy, recharge Elemental incantations."}]},{"entity_id":"mystic_scribe","file":"data/heroes/mystic_scribe.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","defense","cooldown"],"new_value":10},{"path":["abilities","defense","description"],"old_value":"Creates a barrier that absorbs projectiles and reduces all damage. Absorbing Spellcaster projectiles refreshes Holy spells.","new_value":"Creates a barrier that absorbs projectiles and reduces all damage. Absorbing Spellcaster projectiles refreshes Holy incantations."}]},{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","defense","cooldown"],"new_value":13},{"path":["abilities","passive",2,"description"],"old_value":"While on the ground, the Shaman recharges Wild spells much faster.","new_value":"While on the ground, the Shaman recharges Wild incantations much faster."}]},{"entity_id":"swamp_witch","file":"data/heroes/swamp_witch.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","defense","cooldown"],"new_value":10},{"path":["abilities","passive",1,"description"],"old_value":"When a Swamp Witch\u2019s creature is destroyed, her spells and abilities recharge faster.","new_value":"When a Swamp Witch\u2019s creature is destroyed, her incantations and abilities recharge faster."}]},{"entity_id":"astral_shot","file":"data/spells/astral_shot.json","category":"spells","change_type":"edit","diffs":[{"path":["cast_time"],"old_value":0.0,"new_value":0},{"path":["tags",0],"new_value":"homing"}]},{"entity_id":"fire_ball","file":"data/spells/fire_ball.json","category":"spells","change_type":"edit","diffs":[{"path":["cast_time"],"old_value":0.0,"new_value":0},{"path":["tags",0],"new_value":"homing"}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":250,"new_value":220},{"path":["attack_interval"],"old_value":1.0,"new_value":1}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",2,"multiplier"],"old_value":2.5,"new_value":1.5},{"path":["attack_interval"],"old_value":1.0,"new_value":1}]}]},{"commit":"1cb3cecd35a402768347d4eceff34ca437d03f0e","timestamp":"2026-02-15T04:51:06-05:00","author":"TerribleTurtles","message":"feat: remove movement_speed from heroes (v1.3)","changes":[{"entity_id":"astral_monk","file":"data/heroes/astral_monk.json","category":"heroes","change_type":"edit","diffs":[{"path":["movement_speed"],"removed":true}]},{"entity_id":"fire_elementalist","file":"data/heroes/fire_elementalist.json","category":"heroes","change_type":"edit","diffs":[{"path":["movement_speed"],"removed":true}]},{"entity_id":"iron_sorcerer","file":"data/heroes/iron_sorcerer.json","category":"heroes","change_type":"edit","diffs":[{"path":["movement_speed"],"removed":true}]},{"entity_id":"mystic_scribe","file":"data/heroes/mystic_scribe.json","category":"heroes","change_type":"edit","diffs":[{"path":["movement_speed"],"removed":true}]},{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"edit","diffs":[{"path":["movement_speed"],"removed":true}]},{"entity_id":"swamp_witch","file":"data/heroes/swamp_witch.json","category":"heroes","change_type":"edit","diffs":[{"path":["movement_speed"],"removed":true}]}]},{"commit":"7ed12cec208aa84a1bf0b31ddda6d3e6a227e4ec","timestamp":"2026-02-15T04:03:35-05:00","author":"TerribleTurtles","message":"updated spellcaster health","changes":[{"entity_id":"astral_monk","file":"data/heroes/astral_monk.json","category":"heroes","change_type":"edit","diffs":[{"path":["health"],"old_value":1000,"new_value":300}]},{"entity_id":"fire_elementalist","file":"data/heroes/fire_elementalist.json","category":"heroes","change_type":"edit","diffs":[{"path":["health"],"old_value":800,"new_value":340}]},{"entity_id":"iron_sorcerer","file":"data/heroes/iron_sorcerer.json","category":"heroes","change_type":"edit","diffs":[{"path":["health"],"old_value":1200,"new_value":450}]},{"entity_id":"mystic_scribe","file":"data/heroes/mystic_scribe.json","category":"heroes","change_type":"edit","diffs":[{"path":["health"],"old_value":900,"new_value":440}]},{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"edit","diffs":[{"path":["health"],"old_value":1300,"new_value":600}]},{"entity_id":"swamp_witch","file":"data/heroes/swamp_witch.json","category":"heroes","change_type":"edit","diffs":[{"path":["health"],"old_value":750,"new_value":350}]}]},{"commit":"23d4e588d5ffe244b5b2a283affb80f740ac4cbb","timestamp":"2026-02-15T03:54:40-05:00","author":"TerribleTurtles","message":"Update recharge_time for units and spells based on Rank","changes":[{"entity_id":"astral_nova","file":"data/spells/astral_nova.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":120}]},{"entity_id":"astral_shot","file":"data/spells/astral_shot.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":25}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10,"new_value":50}]},{"entity_id":"fire_ball","file":"data/spells/fire_ball.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":50}]},{"entity_id":"fire_rain","file":"data/spells/fire_rain.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10,"new_value":120}]},{"entity_id":"fire_ray","file":"data/spells/fire_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":5}]},{"entity_id":"flame_surge","file":"data/spells/flame_surge.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":50}]},{"entity_id":"frost_surge","file":"data/spells/frost_surge.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":50}]},{"entity_id":"grand_lightning","file":"data/spells/grand_lightning.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":120}]},{"entity_id":"heal_ray","file":"data/spells/heal_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":5}]},{"entity_id":"poison_grenade","file":"data/spells/poison_grenade.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10,"new_value":50}]},{"entity_id":"resurrection","file":"data/spells/resurrection.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":120}]},{"entity_id":"sacrifice","file":"data/spells/sacrifice.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":5}]},{"entity_id":"thunder_ray","file":"data/spells/thunder_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":5}]},{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":50}]},{"entity_id":"ballista","file":"data/units/ballista.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":25}]},{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":50}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10,"new_value":25}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10,"new_value":25}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":5}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10,"new_value":50}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10,"new_value":5}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":50}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10,"new_value":120}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":25}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10,"new_value":5}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10,"new_value":50}]},{"entity_id":"rampart","file":"data/units/rampart.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":25}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10,"new_value":5}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10,"new_value":5}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10,"new_value":5}]},{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":50}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":50}]},{"entity_id":"wolven_hunter","file":"data/units/wolven_hunter.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10.0,"new_value":25}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["recharge_time"],"old_value":10,"new_value":25}]}]},{"commit":"33fe2aa9c186ba8be44c2457800da20d22e64a6e","timestamp":"2026-02-15T03:15:38-05:00","author":"TerribleTurtles","message":"updasted health on steam tank and stone behemoth","changes":[{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":130,"new_value":1300}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":210,"new_value":2100}]}]},{"commit":"f52140a427e3bf9a4c824530f2222e2c80911ffa","timestamp":"2026-02-15T00:17:47-05:00","author":"TerribleTurtles","message":"feat: Finalize CI/CD Remediation (Security & Performance) & API Enhancements","changes":[{"entity_id":"fire_elementalist","file":"data/heroes/fire_elementalist.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics","cleave"],"old_value":{"damage_percent":0.5,"radius":2.5,"arc":120},"new_value":true}]},{"entity_id":"iron_sorcerer","file":"data/heroes/iron_sorcerer.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics","cleave"],"old_value":{"damage_percent":0.5,"radius":2.5,"arc":120},"new_value":true}]},{"entity_id":"mystic_scribe","file":"data/heroes/mystic_scribe.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics","cleave"],"old_value":{"damage_percent":0.5,"radius":2.5,"arc":120},"new_value":true}]},{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics","cleave"],"old_value":{"damage_percent":0.5,"radius":2.5,"arc":120},"new_value":true}]}]},{"commit":"ead640257fc512f2266a395630883ed5d65554c0","timestamp":"2026-02-14T21:28:43-05:00","author":"TerribleTurtles","message":"chore: finalize cleanup, schema validation, and deck removal","changes":[{"entity_id":"astral_monk","file":"data/heroes/astral_monk.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics","pierce"],"new_value":true},{"path":["abilities","defense","mechanics"],"new_value":{"stealth":{"duration":1.5,"break_on_attack":true}}},{"path":["abilities","primary","mechanics","features",1],"removed":true,"old_value":{"name":"Pierce","description":"Attacks pierce through enemies."}}]},{"entity_id":"fire_elementalist","file":"data/heroes/fire_elementalist.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics"],"old_value":{"features":[{"name":"Cleave","description":"Attacks hit multiple enemies in an arc."}]},"new_value":{"cleave":{"damage_percent":0.5,"radius":2.5,"arc":120}}}]},{"entity_id":"iron_sorcerer","file":"data/heroes/iron_sorcerer.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics"],"old_value":{"features":[{"name":"Cleave","description":"Attacks hit multiple enemies in an arc."}]},"new_value":{"cleave":{"damage_percent":0.5,"radius":2.5,"arc":120}}}]},{"entity_id":"mystic_scribe","file":"data/heroes/mystic_scribe.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics","cleave"],"new_value":{"damage_percent":0.5,"radius":2.5,"arc":120}},{"path":["abilities","primary","mechanics","features",0],"removed":true,"old_value":{"name":"Cleave","description":"Attacks hit multiple enemies in an arc."}}]},{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics","cleave"],"new_value":{"damage_percent":0.5,"radius":2.5,"arc":120}},{"path":["abilities","primary","mechanics","features",1],"removed":true,"old_value":{"name":"Cleave","description":"Attacks hit multiple enemies in an arc."}}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0],"old_value":{"multiplier":0,"condition":"Always","target_types":["Flying"]},"new_value":{"multiplier":0,"target_types":["Flying"]}},{"path":["mechanics","damage_modifiers",1],"old_value":{"multiplier":1.3,"condition":"Always","target_types":["Building"]},"new_value":{"multiplier":1.3,"target_types":["Building"]}}]},{"entity_id":"fire_rain","file":"data/spells/fire_rain.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0,"condition"],"removed":true}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_reduction",0,"_comment"],"new_value":"UNCONFIRMED - Logic assumes Rank >= 3 based on text"},{"path":["mechanics","damage_modifiers",0,"condition"],"old_value":"Rank >= 3","new_value":{"field":"target.rank","operator":">=","value":3}},{"path":["mechanics","damage_reduction",0,"condition"],"old_value":"Rank >= 3  THIS INFORMATION IS UNCONFIRMED","new_value":{"field":"target.rank","operator":">=","value":3}}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"stealth":{"duration":-1,"break_on_attack":true}}}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0,"condition"],"removed":true}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0],"old_value":{"multiplier":1.19,"condition":"Always","target_types":["Ground","Hover"]},"new_value":{"multiplier":1.19,"target_types":["Ground","Hover"]}},{"path":["mechanics","damage_modifiers",1],"old_value":{"multiplier":0.65,"condition":"Always","target_types":["Building"]},"new_value":{"multiplier":0.65,"target_types":["Building"]}}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0],"old_value":{"multiplier":1.5,"condition":"Always","target_types":["Lifestone"]},"new_value":{"multiplier":1.5,"target_types":["Lifestone"]}},{"path":["mechanics","damage_modifiers",1],"old_value":{"multiplier":2.0,"condition":"Always","target_types":["Building"]},"new_value":{"multiplier":2.0,"target_types":["Building"]}}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0],"old_value":{"multiplier":1.375,"condition":"Always","target_types":["Flying"]},"new_value":{"multiplier":1.375,"target_types":["Flying"]}},{"path":["mechanics","damage_modifiers",1],"old_value":{"multiplier":0.9,"condition":"Always","target_types":["Building"]},"new_value":{"multiplier":0.9,"target_types":["Building"]}}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0,"condition"],"removed":true}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0],"old_value":{"multiplier":0.5,"condition":"Always","target_types":["Creature"]},"new_value":{"multiplier":0.5,"target_types":["Creature"]}},{"path":["mechanics","damage_modifiers",1],"old_value":{"multiplier":0.5,"condition":"Always","target_types":["Spellcaster"]},"new_value":{"multiplier":0.5,"target_types":["Spellcaster"]}}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",2],"old_value":{"multiplier":2.5,"condition":"Always","target_types":["Building"]},"new_value":{"multiplier":2.5,"target_types":["Building"]}},{"path":["mechanics","damage_modifiers",0],"old_value":{"multiplier":0.5,"condition":"Always","target_types":["Creature"]},"new_value":{"multiplier":0.5,"target_types":["Creature"]}},{"path":["mechanics","damage_modifiers",1],"old_value":{"multiplier":0.5,"condition":"Always","target_types":["Spellcaster"]},"new_value":{"multiplier":0.5,"target_types":["Spellcaster"]}}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0],"old_value":{"multiplier":1.6,"condition":"Always","target_types":["Creature"]},"new_value":{"multiplier":1.6,"target_types":["Creature"]}},{"path":["mechanics","damage_modifiers",1],"old_value":{"multiplier":0.9,"condition":"Always","target_types":["Building"]},"new_value":{"multiplier":0.9,"target_types":["Building"]}}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0,"condition"],"removed":true}]}]},{"commit":"d8359e8a2f6dfc1646cc0dc49f0f4e7f69f5bb46","timestamp":"2026-02-14T11:56:10-05:00","author":"TerribleTurtles","message":"fix: remove invalid image_required from placeholder upgrade","changes":[{"entity_id":"placeholder","file":"data/upgrades/placeholder.json","category":"upgrades","change_type":"edit","diffs":[{"path":["image_required"],"removed":true}]}]},{"commit":"cd42cdc9e6812247f25543f14729c82e7f5ddaa4","timestamp":"2026-02-14T11:55:47-05:00","author":"TerribleTurtles","message":"feat: add placeholder upgrade to prevent empty endpoint","changes":[{"entity_id":"placeholder","file":"data/upgrades/placeholder.json","category":"upgrades","change_type":"add","diffs":[{"path":["upgrade_id"],"new_value":"dev_placeholder"},{"path":["image_required"],"new_value":false},{"path":["name"],"new_value":"Dev Placeholder"},{"path":["effect"],"new_value":{"dev_mode":1}},{"path":["description"],"new_value":"Placeholder content to prevent 404s on the upgrades endpoint."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-14T12:00:00Z","description":"Initial placeholder"}]},{"path":["$schema"],"new_value":"../../schemas/v2/upgrades.schema.json"},{"path":["target_tags"],"new_value":[]}]}]},{"commit":"3afa5b64b449279f11bc0b5c8b7a16122b3de86b","timestamp":"2026-02-12T00:43:11-05:00","author":"TerribleTurtles","message":"feat: implement new consumables and update dependencies","changes":[{"entity_id":"charge_orb_1","file":"data/consumables/charge_orb_1.json","category":"consumables","change_type":"add","diffs":[{"path":["category"],"new_value":"Consumable"},{"path":["value"],"new_value":5},{"path":["stack_size"],"new_value":1},{"path":["image_required"],"new_value":true},{"path":["effect_type"],"new_value":"Charge_Refill"},{"path":["tags"],"new_value":["charge","orb"]},{"path":["name"],"new_value":"Charge Orb I"},{"path":["description"],"new_value":"Small Recharge. Restores 5 Energy (5x Rank I, 1x Rank II)."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-11T00:00:00Z","description":"Created new consumable"}]},{"path":["$schema"],"new_value":"../../schemas/v2/consumables.schema.json"},{"path":["entity_id"],"new_value":"charge_orb_1"}]},{"entity_id":"charge_orb_2","file":"data/consumables/charge_orb_2.json","category":"consumables","change_type":"add","diffs":[{"path":["category"],"new_value":"Consumable"},{"path":["value"],"new_value":15},{"path":["stack_size"],"new_value":1},{"path":["image_required"],"new_value":true},{"path":["effect_type"],"new_value":"Charge_Refill"},{"path":["tags"],"new_value":["charge","orb"]},{"path":["name"],"new_value":"Charge Orb II"},{"path":["description"],"new_value":"Medium Recharge. Restores 15 Energy (15x Rank I, 3x Rank II, 1x Rank III)."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-11T00:00:00Z","description":"Created new consumable"}]},{"path":["$schema"],"new_value":"../../schemas/v2/consumables.schema.json"},{"path":["entity_id"],"new_value":"charge_orb_2"}]},{"entity_id":"conquest_banner","file":"data/consumables/conquest_banner.json","category":"consumables","change_type":"add","diffs":[{"path":["category"],"new_value":"Consumable"},{"path":["value"],"new_value":0},{"path":["stack_size"],"new_value":1},{"path":["duration"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["effect_type"],"new_value":"Capture"},{"path":["tags"],"new_value":["capture","banner"]},{"path":["name"],"new_value":"Conquest Banner"},{"path":["mechanics"],"new_value":{"auto_capture_altars":true}},{"path":["description"],"new_value":"Captures an enemy territory and refill all charges."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-11T00:00:00Z","description":"Created new consumable"}]},{"path":["$schema"],"new_value":"../../schemas/v2/consumables.schema.json"},{"path":["entity_id"],"new_value":"conquest_banner"}]},{"entity_id":"healing_grimoire_1","file":"data/consumables/healing_grimoire_1.json","category":"consumables","change_type":"add","diffs":[{"path":["category"],"new_value":"Consumable"},{"path":["value"],"new_value":25},{"path":["stack_size"],"new_value":1},{"path":["duration"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["effect_type"],"new_value":"Heal"},{"path":["tags"],"new_value":["heal","grimoire"]},{"path":["name"],"new_value":"Healing Grimoire I"},{"path":["description"],"new_value":"Light Heal. Restores 25 Health to the Spellcaster."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-11T00:00:00Z","description":"Renamed from light_heal and updated"}]},{"path":["$schema"],"new_value":"../../schemas/v2/consumables.schema.json"},{"path":["entity_id"],"new_value":"healing_grimoire_1"}]},{"entity_id":"healing_grimoire_2","file":"data/consumables/healing_grimoire_2.json","category":"consumables","change_type":"add","diffs":[{"path":["category"],"new_value":"Consumable"},{"path":["value"],"new_value":75},{"path":["stack_size"],"new_value":1},{"path":["duration"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["effect_type"],"new_value":"Heal"},{"path":["tags"],"new_value":["heal","grimoire"]},{"path":["name"],"new_value":"Healing Grimoire II"},{"path":["description"],"new_value":"Medium Heal. Restores 75 Health to the Spellcaster."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-11T00:00:00Z","description":"Renamed from medium_heal and updated"}]},{"path":["$schema"],"new_value":"../../schemas/v2/consumables.schema.json"},{"path":["entity_id"],"new_value":"healing_grimoire_2"}]},{"entity_id":"healing_grimoire_3","file":"data/consumables/healing_grimoire_3.json","category":"consumables","change_type":"add","diffs":[{"path":["category"],"new_value":"Consumable"},{"path":["value"],"new_value":150},{"path":["stack_size"],"new_value":1},{"path":["duration"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["effect_type"],"new_value":"Heal"},{"path":["tags"],"new_value":["heal","grimoire"]},{"path":["name"],"new_value":"Healing Grimoire III"},{"path":["description"],"new_value":"Major Heal. Restores 150 Health to the Spellcaster."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-11T00:00:00Z","description":"Created new consumable"}]},{"path":["$schema"],"new_value":"../../schemas/v2/consumables.schema.json"},{"path":["entity_id"],"new_value":"healing_grimoire_3"}]},{"entity_id":"light_heal","file":"data/consumables/light_heal.json","category":"consumables","change_type":"delete","diffs":[{"path":["category"],"removed":true},{"path":["value"],"removed":true},{"path":["image_required"],"removed":true},{"path":["duration"],"removed":true},{"path":["effect_type"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["description"],"removed":true},{"path":["changelog"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"medium_heal","file":"data/consumables/medium_heal.json","category":"consumables","change_type":"delete","diffs":[{"path":["category"],"removed":true},{"path":["value"],"removed":true},{"path":["image_required"],"removed":true},{"path":["duration"],"removed":true},{"path":["effect_type"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["description"],"removed":true},{"path":["changelog"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"medium_recharge","file":"data/consumables/medium_recharge.json","category":"consumables","change_type":"delete","diffs":[{"path":["category"],"removed":true},{"path":["value"],"removed":true},{"path":["image_required"],"removed":true},{"path":["duration"],"removed":true},{"path":["effect_type"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["description"],"removed":true},{"path":["changelog"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"power_grimoire","file":"data/consumables/power_grimoire.json","category":"consumables","change_type":"add","diffs":[{"path":["category"],"new_value":"Consumable"},{"path":["value"],"new_value":10},{"path":["stack_size"],"new_value":1},{"path":["duration"],"new_value":30},{"path":["buff_target"],"new_value":"Damage"},{"path":["effect_type"],"new_value":"Buff"},{"path":["image_required"],"new_value":true},{"path":["name"],"new_value":"Power Grimoire"},{"path":["tags"],"new_value":["buff","damage","grimoire"]},{"path":["description"],"new_value":"Increases Damage by 10%."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-11T00:00:00Z","description":"Created new consumable"}]},{"path":["$schema"],"new_value":"../../schemas/v2/consumables.schema.json"},{"path":["entity_id"],"new_value":"power_grimoire"}]},{"entity_id":"protection_grimoire","file":"data/consumables/protection_grimoire.json","category":"consumables","change_type":"add","diffs":[{"path":["category"],"new_value":"Consumable"},{"path":["value"],"new_value":10},{"path":["stack_size"],"new_value":1},{"path":["duration"],"new_value":30},{"path":["buff_target"],"new_value":"Defense"},{"path":["effect_type"],"new_value":"Buff"},{"path":["image_required"],"new_value":true},{"path":["name"],"new_value":"Protection Grimoire"},{"path":["tags"],"new_value":["buff","defense","grimoire"]},{"path":["description"],"new_value":"Increases Defense by 10%."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-11T00:00:00Z","description":"Created new consumable"}]},{"path":["$schema"],"new_value":"../../schemas/v2/consumables.schema.json"},{"path":["entity_id"],"new_value":"protection_grimoire"}]},{"entity_id":"small_recharge","file":"data/consumables/small_recharge.json","category":"consumables","change_type":"delete","diffs":[{"path":["category"],"removed":true},{"path":["value"],"removed":true},{"path":["image_required"],"removed":true},{"path":["duration"],"removed":true},{"path":["effect_type"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["description"],"removed":true},{"path":["changelog"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]}]},{"commit":"e021d1726908815e15951f4699c57a4e77f494f5","timestamp":"2026-02-11T11:59:51-05:00","author":"TerribleTurtles","message":"feat(data): add Pierce mechanic to Astral Monk","changes":[{"entity_id":"astral_monk","file":"data/heroes/astral_monk.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics","features",1],"new_value":{"name":"Pierce","description":"Attacks pierce through enemies."}}]}]},{"commit":"23ec37814f7adabbea0c51d9198eccd27fa80e31","timestamp":"2026-02-11T10:35:46-05:00","author":"TerribleTurtles","message":"feat(v2): complete v2 schema migration and cleanup legacy artifacts","changes":[{"entity_id":"light_heal","file":"data/consumables/light_heal.json","category":"consumables","change_type":"edit","diffs":[{"path":["description"],"new_value":"Restores 25 Health to the Spellcaster."},{"path":["tags"],"new_value":[]},{"path":["$schema"],"old_value":"../../schemas/v1/consumable.schema.json","new_value":"../../schemas/v2/consumables.schema.json"}]},{"entity_id":"medium_heal","file":"data/consumables/medium_heal.json","category":"consumables","change_type":"edit","diffs":[{"path":["description"],"new_value":"Restores 50 Health to the Spellcaster."},{"path":["tags"],"new_value":[]},{"path":["$schema"],"old_value":"../../schemas/v1/consumable.schema.json","new_value":"../../schemas/v2/consumables.schema.json"}]},{"entity_id":"medium_recharge","file":"data/consumables/medium_recharge.json","category":"consumables","change_type":"edit","diffs":[{"path":["description"],"new_value":"Restores 50 Charges to the Spellcaster."},{"path":["tags"],"new_value":[]},{"path":["$schema"],"old_value":"../../schemas/v1/consumable.schema.json","new_value":"../../schemas/v2/consumables.schema.json"}]},{"entity_id":"small_recharge","file":"data/consumables/small_recharge.json","category":"consumables","change_type":"edit","diffs":[{"path":["description"],"new_value":"Restores 25 Charges to the Spellcaster."},{"path":["tags"],"new_value":[]},{"path":["$schema"],"old_value":"../../schemas/v1/consumable.schema.json","new_value":"../../schemas/v2/consumables.schema.json"}]},{"entity_id":"astral_monk","file":"data/heroes/astral_monk.json","category":"heroes","change_type":"rename","diffs":[{"path":["difficulty"],"new_value":2},{"path":["category"],"new_value":"Spellcaster"},{"path":["abilities"],"new_value":{"passive":[{"name":"Arcane Alignment","description":"All Astral spells recharge faster."},{"name":"Last Light","description":"All damage dealt is increased against targets below half health."},{"name":"Cosmic Air","description":"All flying creatures summoned by the Astral Monk are invisible."}],"primary":{"name":"Astral Fists","description":"Pierces through enemies with colossal astral fists.","damage":32,"mechanics":{"features":[{"name":"Combo Sequence","description":"Alternates between Palm Strike (32) and Power Punch (47)."}]}},"defense":{"name":"Veil Shift","description":"Turns invisible and move faster.","charges":2,"duration":1.5,"cooldown":8},"ultimate":{"name":"Dimension of Varani","description":"Conjures a time bubble that freezes enemy projectiles and creatures inside it. The Ultimate is destroyed by Lifestone Large Shots (3 hits)."}}},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":1000},{"path":["population"],"new_value":0},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Astral Monk"},{"path":["movement_speed"],"new_value":6},{"path":["description"],"new_value":"A Duelist who strikes from the shadows with fast astral fists and time-bending abilities."},{"path":["class"],"new_value":"Duelist"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-05T18:34:05.939129Z","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"new_value":"../../schemas/v2/heroes.schema.json"},{"path":["entity_id"],"new_value":"astral_monk"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"fire_elementalist","file":"data/heroes/fire_elementalist.json","category":"heroes","change_type":"rename","diffs":[{"path":["difficulty"],"new_value":1},{"path":["category"],"new_value":"Spellcaster"},{"path":["abilities"],"new_value":{"passive":[{"name":"Ignition Spark","description":"Allied creatures near the Fire Elementalist capture Altar faster."},{"name":"Enduring Flame","description":"Damaging burning enemies heals the Fire Elementalist."},{"name":"Blazing Momentum","description":"When you or your creatures kill a Burning enemy, recharge Elemental spells."}],"primary":{"name":"Flame Strikes","description":"Burns enemies with powerful Fire attacks.","damage":28,"mechanics":{"features":[{"name":"Cleave","description":"Attacks hit multiple enemies in an arc."}]}},"defense":{"name":"Fiery Dash","description":"Performs an invincible dash in a chosen direction.","duration":5,"damage":10,"interval":0.5,"charges":2},"ultimate":{"name":"Burning Conquest","description":"Captures a territory, inflicts Fire damage and fully infuses allied units and Titans with Fire."}}},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":800},{"path":["population"],"new_value":0},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Fire Elementalist"},{"path":["movement_speed"],"new_value":7},{"path":["description"],"new_value":"A Conqueror who burns enemies with powerful fire attacks, cleaving through ranks and empowering allies."},{"path":["class"],"new_value":"Conqueror"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-05T17:05:01.971147Z","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"new_value":"../../schemas/v2/heroes.schema.json"},{"path":["entity_id"],"new_value":"fire_elementalist"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"iron_sorcerer","file":"data/heroes/iron_sorcerer.json","category":"heroes","change_type":"rename","diffs":[{"path":["difficulty"],"new_value":1},{"path":["category"],"new_value":"Spellcaster"},{"path":["abilities"],"new_value":{"passive":[{"name":"Scourge of War","description":"Increases Rank III population, reduces Rank II population."},{"name":"Forges of Valm","description":"Creatures spawned from Buildings have significantly more health."},{"name":"Field Commander","description":"While on the ground, nearby creatures gain a strong defensive buff."}],"primary":{"name":"Twin Strike","description":"Strike with powerful mid-range attacks that interrupt enemies.","damage":35,"mechanics":{"features":[{"name":"Cleave","description":"Attacks hit multiple enemies in an arc."}]}},"defense":{"name":"Rune Shield","description":"Raise a shield that protects allies and reflects attacks.","charges":4,"duration":0.5},"ultimate":{"name":"Iron Tempest","description":"Unleash a metal vortex that deals heavy damage, staggers/knocks back all creatures inside.","duration":3}}},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":1200},{"path":["population"],"new_value":0},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Iron Sorcerer"},{"path":["movement_speed"],"new_value":5},{"path":["description"],"new_value":"A Conqueror who dominates the battlefield with heavy melee strikes, protective runes, and a metal vortex."},{"path":["class"],"new_value":"Conqueror"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-05T18:35:34.217480Z","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"new_value":"../../schemas/v2/heroes.schema.json"},{"path":["entity_id"],"new_value":"iron_sorcerer"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"mystic_scribe","file":"data/heroes/mystic_scribe.json","category":"heroes","change_type":"rename","diffs":[{"path":["difficulty"],"new_value":2},{"path":["category"],"new_value":"Spellcaster"},{"path":["abilities"],"new_value":{"passive":[{"name":"Echo of Mercy","description":"While on the ground, the Mystic Scribe emits a healing aura."},{"name":"Holy Magic Mastery","description":"All Holy spells recharge faster."},{"name":"Thousand Favors","description":"Healing recharges Rank I and II creatures."}],"primary":{"name":"Brush Strike","description":"Strike with enchanted ink to damage enemies and boost allies\u2019 Max HP.","damage":23,"mechanics":{"features":[{"name":"Cleave","description":"Attacks hit multiple enemies in an arc."},{"name":"Knockback","description":"Knocks back small units."}]}},"defense":{"name":"Scroll Barrier","description":"Creates a barrier that absorbs projectiles and reduces all damage. Absorbing Spellcaster projectiles refreshes Holy spells.","charges":1,"duration":2},"ultimate":{"name":"Seal of Immortality","description":"Mark the ground with a massive healing seal.","duration":30}}},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":900},{"path":["population"],"new_value":0},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Mystic Scribe"},{"path":["movement_speed"],"new_value":6},{"path":["description"],"new_value":"An Enchanter who uses magical ink to damage enemies, heal allies, and create protective barriers."},{"path":["class"],"new_value":"Enchanter"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-05T18:33:10.223377Z","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"new_value":"../../schemas/v2/heroes.schema.json"},{"path":["entity_id"],"new_value":"mystic_scribe"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"rename","diffs":[{"path":["difficulty"],"new_value":2},{"path":["category"],"new_value":"Spellcaster"},{"path":["abilities"],"new_value":{"passive":[{"name":"Mountain\u2019s Favor","description":"The Stone Shaman\u2019s attacks deal double damage to buildings."},{"name":"Child of the Titans","description":"Increases Rank II and Rank III population while reducing Rank I population."},{"name":"Pathfinder","description":"While on the ground, the Shaman recharges Wild spells much faster."}],"primary":{"name":"Mountain Staff","description":"Swing your catalyst to deal heavy melee damage and interrupt enemies.","damage":42,"mechanics":{"features":[{"name":"Interruption","description":"Successfully hitting a Spellcaster twice interrupts their actions."},{"name":"Cleave","description":"Attacks hit multiple enemies in an arc."}],"aura":[{"name":"Building Enchant","description":"Attacks enchant ally buildings, enabling them to emit a healing aura.","radius":8,"value":7,"effect":"Heal","interval":1.0,"target_types":["Ally"]}]}},"defense":{"name":"Wind Shield","description":"Conjure a protective wind barrier that deals damage on contact.","charges":1,"duration":3},"ultimate":{"name":"Wall of Kamazad","description":"Deploys a colossal wall capable of blocking Titans. The wall has 15000 Health and deals % damage to enemies in its path.","health":15000}}},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":1300},{"path":["population"],"new_value":0},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Stone Shaman"},{"path":["movement_speed"],"new_value":5},{"path":["description"],"new_value":"An Enchanter who channels the power of earth to deal heavy damage, interrupt spellcasters, and fortify buildings."},{"path":["class"],"new_value":"Enchanter"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-05T18:35:34.217480Z","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"new_value":"../../schemas/v2/heroes.schema.json"},{"path":["entity_id"],"new_value":"stone_shaman"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"swamp_witch","file":"data/heroes/swamp_witch.json","category":"heroes","change_type":"rename","diffs":[{"path":["difficulty"],"new_value":3},{"path":["category"],"new_value":"Spellcaster"},{"path":["abilities"],"new_value":{"passive":[{"name":"Pact of Sacrifice","description":"Killing Poisoned Creatures recharges Necromancy spells."},{"name":"Brood Rite","description":"When a Swamp Witch\u2019s creature is destroyed, her spells and abilities recharge faster."},{"name":"Swarm Dominance","description":"The Swamp Witch has more Rank I population, but less Rank II and Rank III population.  "}],"primary":{"name":"Poison Strike","description":"Fire a barrage of projectiles that deal Poison damage.","damage":21,"projectiles":2,"mechanics":{"features":[{"name":"Homing","description":"Projectiles seek targets."}]}},"defense":{"name":"Witchslip","description":"Performs an invincible dash in a chosen direction.","charges":2},"ultimate":{"name":"Dark Ascension","description":"Unleashes a demonic form that boosts all spell damage by 150%. Poison Strike fires 2 extra projectiles that deal +285% damage.","mechanics":{"damage_modifiers":[{"multiplier":2.5,"target_types":["All"]}],"features":[{"name":"Empowered Poison Strike","description":"Poison Strike gains 2 extra projectiles dealing +285% damage."}]},"duration":15}}},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":750},{"path":["population"],"new_value":0},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Swamp Witch"},{"path":["movement_speed"],"new_value":6},{"path":["description"],"new_value":"A Duelist who commands poison and swarms, sacrificing minions to fuel powerful necromancy spells."},{"path":["class"],"new_value":"Duelist"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-05T17:05:01.972347Z","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"new_value":"../../schemas/v2/heroes.schema.json"},{"path":["entity_id"],"new_value":"swamp_witch"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"astral_nova","file":"data/spells/astral_nova.json","category":"spells","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["$schema"],"old_value":"../../schemas/v1/spell.schema.json","new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"astral_shot","file":"data/spells/astral_shot.json","category":"spells","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["$schema"],"old_value":"../../schemas/v1/spell.schema.json","new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["mechanics","bonus_damage",0,"target_types"],"new_value":["Building"]},{"path":["mechanics","bonus_damage",0,"target_type"],"removed":true},{"path":["$schema"],"old_value":"../../schemas/v1/spell.schema.json","new_value":"../../schemas/v2/spells.schema.json"},{"path":["mechanics","damage_modifiers",0],"old_value":{"target_type":"Flying","multiplier":0,"condition":"Always"},"new_value":{"multiplier":0,"condition":"Always","target_types":["Flying"]}},{"path":["mechanics","damage_modifiers",1],"old_value":{"target_type":"Building","multiplier":1.3,"condition":"Always"},"new_value":{"multiplier":1.3,"condition":"Always","target_types":["Building"]}},{"path":["mechanics","stagger_modifier"],"old_value":"High","new_value":true}]},{"entity_id":"fire_ball","file":"data/spells/fire_ball.json","category":"spells","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["$schema"],"old_value":"../../schemas/v1/spell.schema.json","new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"fire_rain","file":"data/spells/fire_rain.json","category":"spells","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["mechanics","damage_modifiers",0,"target_types"],"new_value":["Creature"]},{"path":["mechanics","damage_modifiers",0,"target_type"],"removed":true},{"path":["$schema"],"old_value":"../../schemas/v1/spell.schema.json","new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"fire_ray","file":"data/spells/fire_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["$schema"],"old_value":"../../schemas/v1/spell.schema.json","new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"flame_surge","file":"data/spells/flame_surge.json","category":"spells","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["$schema"],"old_value":"../../schemas/v1/spell.schema.json","new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"frost_surge","file":"data/spells/frost_surge.json","category":"spells","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["$schema"],"old_value":"../../schemas/v1/spell.schema.json","new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"grand_lightning","file":"data/spells/grand_lightning.json","category":"spells","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["$schema"],"old_value":"../../schemas/v1/spell.schema.json","new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"heal_ray","file":"data/spells/heal_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["value"],"new_value":300},{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["heal_amount"],"removed":true},{"path":["$schema"],"old_value":"../../schemas/v1/spell.schema.json","new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"poison_grenade","file":"data/spells/poison_grenade.json","category":"spells","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["mechanics","damage_modifiers",0,"target_types"],"new_value":["Building"]},{"path":["mechanics","damage_modifiers",0,"target_type"],"removed":true},{"path":["$schema"],"old_value":"../../schemas/v1/spell.schema.json","new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"resurrection","file":"data/spells/resurrection.json","category":"spells","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["$schema"],"old_value":"../../schemas/v1/spell.schema.json","new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"sacrifice","file":"data/spells/sacrifice.json","category":"spells","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["$schema"],"old_value":"../../schemas/v1/spell.schema.json","new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"thunder_ray","file":"data/spells/thunder_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["$schema"],"old_value":"../../schemas/v1/spell.schema.json","new_value":"../../schemas/v2/spells.schema.json"}]},{"entity_id":"gaia_beast","file":"data/titans/gaia_beast.json","category":"titans","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["population"],"new_value":0},{"path":["mechanics","aura",0,"target_types"],"new_value":["Enemy"]},{"path":["mechanics","aura",0,"target_type"],"removed":true},{"path":["$schema"],"old_value":"../../schemas/v1/titan.schema.json","new_value":"../../schemas/v2/titans.schema.json"}]},{"entity_id":"thanatos","file":"data/titans/thanatos.json","category":"titans","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/titan.schema.json","new_value":"../../schemas/v2/titans.schema.json"},{"path":["mechanics","aura",0],"old_value":{"name":"Aura of Decay","description":"Reduces damage of nearby spellcasters.","radius":15,"value":0.5,"interval":1.0,"effect":"Debuff","target_type":"Enemy"},"new_value":{"name":"Aura of Decay","description":"Reduces damage of nearby spellcasters.","radius":15,"value":0.5,"interval":1.0,"effect":"Debuff","target_types":["Enemy"]}},{"path":["mechanics","aura",1],"old_value":{"name":"Death's Retaliation","description":"Retaliates against Spellcasters after receiving >4000 damage.","radius":100,"value":0,"interval":0,"effect":"Damage","target_type":"Enemy"},"new_value":{"name":"Death's Retaliation","description":"Retaliates against Spellcasters after receiving >4000 damage.","radius":100,"value":0,"interval":0,"effect":"Damage","target_types":["Enemy"]}}]},{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"ballista","file":"data/units/ballista.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["population"],"new_value":0},{"path":["mechanics","aura",0,"target_types"],"new_value":["Ally"]},{"path":["mechanics","aura",0,"target_type"],"removed":true},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["population"],"new_value":0},{"path":["mechanics","damage_modifiers",0,"target_types"],"new_value":["Unit"]},{"path":["mechanics","damage_modifiers",0,"target_type"],"removed":true},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["population"],"new_value":0},{"path":["mechanics","damage_modifiers",0,"target_types"],"new_value":["Creature"]},{"path":["mechanics","damage_modifiers",0,"target_type"],"removed":true},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"},{"path":["mechanics","damage_modifiers",0],"old_value":{"target_type":["Ground","Hover"],"multiplier":1.19,"condition":"Always"},"new_value":{"multiplier":1.19,"condition":"Always","target_types":["Ground","Hover"]}},{"path":["mechanics","damage_modifiers",1],"old_value":{"target_type":"Building","multiplier":0.65,"condition":"Always"},"new_value":{"multiplier":0.65,"condition":"Always","target_types":["Building"]}}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"},{"path":["mechanics","damage_modifiers",0],"old_value":{"target_type":"Lifestone","multiplier":1.5,"condition":"Always"},"new_value":{"multiplier":1.5,"condition":"Always","target_types":["Lifestone"]}},{"path":["mechanics","damage_modifiers",1],"old_value":{"target_type":"Building","multiplier":2.0,"condition":"Always"},"new_value":{"multiplier":2.0,"condition":"Always","target_types":["Building"]}}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"},{"path":["mechanics","damage_modifiers",0],"old_value":{"target_type":"Flying","multiplier":1.375,"condition":"Always"},"new_value":{"multiplier":1.375,"condition":"Always","target_types":["Flying"]}},{"path":["mechanics","damage_modifiers",1],"old_value":{"target_type":"Building","multiplier":0.9,"condition":"Always"},"new_value":{"multiplier":0.9,"condition":"Always","target_types":["Building"]}}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["population"],"new_value":0},{"path":["mechanics","damage_modifiers",0,"target_types"],"new_value":["Building"]},{"path":["mechanics","damage_modifiers",0,"target_type"],"removed":true},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"rampart","file":"data/units/rampart.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"},{"path":["mechanics","damage_modifiers",0],"old_value":{"target_type":"Creature","multiplier":0.5,"condition":"Always"},"new_value":{"multiplier":0.5,"condition":"Always","target_types":["Creature"]}},{"path":["mechanics","damage_modifiers",1],"old_value":{"target_type":"Spellcaster","multiplier":0.5,"condition":"Always"},"new_value":{"multiplier":0.5,"condition":"Always","target_types":["Spellcaster"]}}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"},{"path":["mechanics","damage_modifiers",2],"old_value":{"target_type":"Building","multiplier":2.5,"condition":"Always"},"new_value":{"multiplier":2.5,"condition":"Always","target_types":["Building"]}},{"path":["mechanics","damage_modifiers",0],"old_value":{"target_type":"Creature","multiplier":0.5,"condition":"Always"},"new_value":{"multiplier":0.5,"condition":"Always","target_types":["Creature"]}},{"path":["mechanics","damage_modifiers",1],"old_value":{"target_type":"Spellcaster","multiplier":0.5,"condition":"Always"},"new_value":{"multiplier":0.5,"condition":"Always","target_types":["Spellcaster"]}}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"},{"path":["mechanics","damage_modifiers",0],"old_value":{"target_type":"Creature","multiplier":1.6,"condition":"Always"},"new_value":{"multiplier":1.6,"condition":"Always","target_types":["Creature"]}},{"path":["mechanics","damage_modifiers",1],"old_value":{"target_type":"Building","multiplier":0.9,"condition":"Always"},"new_value":{"multiplier":0.9,"condition":"Always","target_types":["Building"]}}]},{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"wolven_hunter","file":"data/units/wolven_hunter.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10.0},{"path":["cast_time"],"new_value":0.0},{"path":["population"],"new_value":0},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["charges"],"new_value":1},{"path":["recharge_time"],"new_value":10},{"path":["cast_time"],"new_value":0},{"path":["population"],"new_value":0},{"path":["mechanics","damage_modifiers",0,"target_types"],"new_value":["Building"]},{"path":["mechanics","damage_modifiers",0,"target_type"],"removed":true},{"path":["$schema"],"old_value":"../../schemas/v1/unit.schema.json","new_value":"../../schemas/v2/units.schema.json"}]}]},{"commit":"64ad94fee9e10abe3c601dc63349c5cfb6a9313f","timestamp":"2026-02-10T20:13:16-05:00","author":"TerribleTurtles","message":"refactor: apply schema layout changes and data updates","changes":[{"entity_id":"astral_monk","file":"data/spellcasters/astral_monk.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["tags"],"new_value":[]},{"path":["abilities","primary","stats","interval"],"removed":true},{"path":["difficulty"],"old_value":3,"new_value":2}]},{"entity_id":"fire_elementalist","file":"data/spellcasters/fire_elementalist.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["tags"],"new_value":[]},{"path":["abilities","primary","stats","interval"],"removed":true},{"path":["abilities","passive",2,"description"],"old_value":"When you or your creatures kill a Burning enemy, recharge Elemental incantations.","new_value":"When you or your creatures kill a Burning enemy, recharge Elemental spells."}]},{"entity_id":"iron_sorcerer","file":"data/spellcasters/iron_sorcerer.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["tags"],"new_value":[]},{"path":["abilities","primary","stats","interval"],"removed":true}]},{"entity_id":"mystic_scribe","file":"data/spellcasters/mystic_scribe.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["tags"],"new_value":[]},{"path":["abilities","primary","stats","interval"],"removed":true},{"path":["abilities","passive",1,"description"],"old_value":"All Holy incantations recharge faster.","new_value":"All Holy spells recharge faster."}]},{"entity_id":"stone_shaman","file":"data/spellcasters/stone_shaman.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["tags"],"new_value":[]},{"path":["abilities","primary","stats","interval"],"removed":true},{"path":["abilities","ultimate","stats","duration"],"removed":true},{"path":["abilities","ultimate","stats","damage"],"removed":true},{"path":["abilities","passive",2,"description"],"old_value":"While on the ground, the Shaman recharges Wild incantations much faster.","new_value":"While on the ground, the Shaman recharges Wild spells much faster."}]},{"entity_id":"swamp_witch","file":"data/spellcasters/swamp_witch.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["tags"],"new_value":[]},{"path":["abilities","primary","stats","interval"],"removed":true},{"path":["abilities","passive",1,"description"],"old_value":"When a Swamp Witch\u2019s creature is destroyed, her incantations and abilities recharge faster.","new_value":"When a Swamp Witch\u2019s creature is destroyed, her spells and abilities recharge faster."}]},{"entity_id":"gaia_beast","file":"data/titans/gaia_beast.json","category":"titans","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/titan.schema.json"}]},{"entity_id":"thanatos","file":"data/titans/thanatos.json","category":"titans","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/titan.schema.json"}]}]},{"commit":"38580a723dd4a7dad8a54e905cf6dc0d5c0c8243","timestamp":"2026-02-10T19:25:56-05:00","author":"TerribleTurtles","message":"feat(schema): normalize architecture, split units/spells, normalize data","changes":[{"entity_id":"astral_nova","file":"data/spells/astral_nova.json","category":"spells","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]},{"entity_id":"astral_shot","file":"data/spells/astral_shot.json","category":"spells","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]},{"entity_id":"fire_ball","file":"data/spells/fire_ball.json","category":"spells","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]},{"entity_id":"fire_rain","file":"data/spells/fire_rain.json","category":"spells","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]},{"entity_id":"fire_ray","file":"data/spells/fire_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]},{"entity_id":"flame_surge","file":"data/spells/flame_surge.json","category":"spells","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]},{"entity_id":"frost_surge","file":"data/spells/frost_surge.json","category":"spells","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]},{"entity_id":"grand_lightning","file":"data/spells/grand_lightning.json","category":"spells","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]},{"entity_id":"heal_ray","file":"data/spells/heal_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]},{"entity_id":"poison_grenade","file":"data/spells/poison_grenade.json","category":"spells","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]},{"entity_id":"resurrection","file":"data/spells/resurrection.json","category":"spells","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]},{"entity_id":"sacrifice","file":"data/spells/sacrifice.json","category":"spells","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]},{"entity_id":"thunder_ray","file":"data/spells/thunder_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]},{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"ballista","file":"data/units/ballista.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"rampart","file":"data/units/rampart.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"wolven_hunter","file":"data/units/wolven_hunter.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"}]}]},{"commit":"3b90a3e3c77f96703714f587aedc92f1b24acf95","timestamp":"2026-02-10T18:43:41-05:00","author":"TerribleTurtles","message":"feat(data): refactor damage to dps and add attack_interval","changes":[{"entity_id":"gaia_beast","file":"data/titans/gaia_beast.json","category":"titans","change_type":"edit","diffs":[{"path":["dps"],"new_value":100},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"thanatos","file":"data/titans/thanatos.json","category":"titans","change_type":"edit","diffs":[{"path":["dps"],"new_value":125},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":50},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"ballista","file":"data/units/ballista.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":25},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":12},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":25},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":9},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":30},{"path":["attack_interval"],"new_value":1.0},{"path":["mechanics","damage_modifiers",0,"condition"],"old_value":"Always - DATA NOT CONFIRMED","new_value":"Always"}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":12},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":100},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":5},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":8},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":70},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":10},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":20},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":15},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":40},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":40},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"wolven_hunter","file":"data/units/wolven_hunter.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":16},{"path":["attack_interval"],"new_value":1.0}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["dps"],"new_value":19},{"path":["attack_interval"],"new_value":1.0}]}]},{"commit":"f12f972d5c6d79fb2f299f8eaa4e19a7c1fef5ba","timestamp":"2026-02-10T18:06:58-05:00","author":"TerribleTurtles","message":"feat: update spellcaster primary attack stats and schema","changes":[{"entity_id":"astral_monk","file":"data/spellcasters/astral_monk.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","primary","stats"],"new_value":{"damage":32,"interval":null}},{"path":["abilities","primary","mechanics"],"new_value":{"features":[{"name":"Combo Sequence","description":"Alternates between Palm Strike (32) and Power Punch (47)."}]}}]},{"entity_id":"fire_elementalist","file":"data/spellcasters/fire_elementalist.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","primary","stats"],"new_value":{"damage":28,"interval":null}},{"path":["abilities","primary","mechanics"],"new_value":{"features":[{"name":"Cleave","description":"Attacks hit multiple enemies in an arc."}]}}]},{"entity_id":"iron_sorcerer","file":"data/spellcasters/iron_sorcerer.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","primary","stats"],"new_value":{"damage":35,"interval":null}},{"path":["abilities","primary","mechanics"],"new_value":{"features":[{"name":"Cleave","description":"Attacks hit multiple enemies in an arc."}]}}]},{"entity_id":"mystic_scribe","file":"data/spellcasters/mystic_scribe.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","primary","stats"],"new_value":{"damage":23,"interval":null}},{"path":["abilities","primary","mechanics"],"new_value":{"features":[{"name":"Cleave","description":"Attacks hit multiple enemies in an arc."},{"name":"Knockback","description":"Knocks back small units."}]}}]},{"entity_id":"stone_shaman","file":"data/spellcasters/stone_shaman.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","primary","stats"],"new_value":{"damage":42,"interval":null}},{"path":["abilities","primary","mechanics","features",1],"new_value":{"name":"Cleave","description":"Attacks hit multiple enemies in an arc."}}]},{"entity_id":"swamp_witch","file":"data/spellcasters/swamp_witch.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","primary","stats"],"new_value":{"damage":21,"projectiles":2,"interval":null}},{"path":["abilities","primary","mechanics"],"new_value":{"features":[{"name":"Homing","description":"Projectiles seek targets."}]}}]}]},{"commit":"d1ca8b19f693a00201e0ff3684b44fad9fa93613","timestamp":"2026-02-10T13:44:46-05:00","author":"TerribleTurtles","message":"Update spellcaster defensive stats, ultimates, and poison grenade logic","changes":[{"entity_id":"astral_monk","file":"data/spellcasters/astral_monk.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","defense","stats"],"new_value":{"charges":2}}]},{"entity_id":"fire_elementalist","file":"data/spellcasters/fire_elementalist.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","defense","stats"],"new_value":{"charges":2}}]},{"entity_id":"iron_sorcerer","file":"data/spellcasters/iron_sorcerer.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","defense","stats"],"new_value":{"charges":4,"duration":0.5}}]},{"entity_id":"mystic_scribe","file":"data/spellcasters/mystic_scribe.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","defense","stats"],"new_value":{"charges":1,"duration":2}},{"path":["abilities","ultimate","stats"],"new_value":{"duration":30}},{"path":["abilities","defense","description"],"old_value":"Creates a barrier that absorbs projectiles and reduces all damage. Absorbing projectiles refreshes Holy spells.","new_value":"Creates a barrier that absorbs projectiles and reduces all damage. Absorbing Spellcaster projectiles refreshes Holy spells."}]},{"entity_id":"stone_shaman","file":"data/spellcasters/stone_shaman.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","ultimate","stats","health"],"new_value":15000},{"path":["abilities","ultimate","description"],"old_value":"Deploys a colossal wall capable of blocking Titans.","new_value":"Deploys a colossal wall capable of blocking Titans. The wall has 15000 Health and deals % damage to enemies in its path."},{"path":["abilities","defense","stats","charges"],"old_value":null,"new_value":1},{"path":["abilities","defense","stats","duration"],"old_value":null,"new_value":3}]},{"entity_id":"swamp_witch","file":"data/spellcasters/swamp_witch.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","ultimate","mechanics"],"new_value":{"damage_modifiers":[{"target_type":"All","multiplier":2.5}],"features":[{"name":"Empowered Poison Strike","description":"Poison Strike gains 2 extra projectiles dealing +285% damage."}]}},{"path":["abilities","ultimate","description"],"old_value":"Unleashes a demonic form that boosts all spell damage.","new_value":"Unleashes a demonic form that boosts all spell damage by 150%. Poison Strike fires 2 extra projectiles that deal +285% damage."}]},{"entity_id":"poison_grenade","file":"data/spells/poison_grenade.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_type":"Building","multiplier":0.0}]}}]}]},{"commit":"9411c516bf87fd1b0d871fdf536adf1591baa965","timestamp":"2026-02-10T00:18:43-05:00","author":"TerribleTurtles","message":"Update unit data: Juggernaut, Rocket Soldier, Wyvern","changes":[{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["damage"],"old_value":220,"new_value":100},{"path":["movement_speed"],"old_value":2,"new_value":3}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["damage"],"old_value":35,"new_value":10}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["damage"],"old_value":45,"new_value":19},{"path":["health"],"old_value":350,"new_value":220},{"path":["movement_speed"],"old_value":4,"new_value":7}]}]},{"commit":"cfdfdb0dc4774ee7171e94095d5b3ed6846beaed","timestamp":"2026-02-10T00:17:01-05:00","author":"TerribleTurtles","message":"Update Ruin Spider damage to 20","changes":[{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["damage"],"old_value":50,"new_value":20}]}]},{"commit":"1d5548c0b2455ea7826ffdde68085f00ff35f7e2","timestamp":"2026-02-09T23:44:21-05:00","author":"TerribleTurtles","message":"Update Giant Shielder HP to 1800","changes":[{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":1500,"new_value":1800}]}]},{"commit":"498bdbf90ff427e5de6c2de1c8a333faf89b8235","timestamp":"2026-02-09T23:27:55-05:00","author":"TerribleTurtles","message":"Update Thunder Ray and Sacrifice mechanics to match Fire Ray (5 waves)","changes":[{"entity_id":"sacrifice","file":"data/spells/sacrifice.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"waves":5,"interval":1}},{"path":["damage"],"old_value":90,"new_value":18}]},{"entity_id":"thunder_ray","file":"data/spells/thunder_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"waves":5,"interval":1}},{"path":["damage"],"old_value":70,"new_value":14}]}]},{"commit":"f6c790cd964f9c7280808fb3544f5d24a08785ab","timestamp":"2026-02-09T22:12:03-05:00","author":"TerribleTurtles","message":"chore: code cleanup, centralize config, optimize harpy data","changes":[{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["damage"],"old_value":18,"new_value":30},{"path":["health"],"old_value":900,"new_value":1500}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","initial_attack"],"new_value":{"damage_flat":30,"target_types":["Ground","Hover"],"description":"Deals 30 increased damage on pouncing initial attack on grounded and hovering units."}},{"path":["mechanics","damage_modifiers",0],"old_value":{"target_type":"Ground","multiplier":1.5,"condition":"Always"},"new_value":{"target_type":["Ground","Hover"],"multiplier":1.19,"condition":"Always"}},{"path":["mechanics","damage_modifiers",1],"new_value":{"target_type":"Building","multiplier":0.65,"condition":"Always"}}]}]},{"commit":"137f0f995572b5f46c7c8714395c0e6c873ba565","timestamp":"2026-02-09T21:13:02-05:00","author":"TerribleTurtles","message":"update: game data balance (wyvern, spellcasters, fire_ray)","changes":[{"entity_id":"astral_monk","file":"data/spellcasters/astral_monk.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","ultimate","description"],"old_value":"Conjures a time bubble that freezes enemy projectiles and creatures inside it.","new_value":"Conjures a time bubble that freezes enemy projectiles and creatures inside it. The Ultimate is destroyed by Lifestone Large Shots (3 hits)."}]},{"entity_id":"fire_elementalist","file":"data/spellcasters/fire_elementalist.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","ultimate","description"],"old_value":"Captures a territory, inflicts Fire damage and imbues allied units with Fire.","new_value":"Captures a territory, inflicts Fire damage and fully infuses allied units and Titans with Fire."}]},{"entity_id":"iron_sorcerer","file":"data/spellcasters/iron_sorcerer.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","ultimate","stats"],"new_value":{"duration":3}},{"path":["abilities","ultimate","description"],"old_value":"Unleash a metal vortex that deals heavy damage and knocks back enemies along its path.","new_value":"Unleash a metal vortex that deals heavy damage, staggers/knocks back all creatures inside."}]},{"entity_id":"mystic_scribe","file":"data/spellcasters/mystic_scribe.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","defense","description"],"old_value":"Creates a barrier that absorbs projectiles and reduces all damage.","new_value":"Creates a barrier that absorbs projectiles and reduces all damage. Absorbing projectiles refreshes Holy spells."}]},{"entity_id":"swamp_witch","file":"data/spellcasters/swamp_witch.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","defense","stats"],"new_value":{"charges":2}},{"path":["abilities","ultimate","stats"],"new_value":{"duration":15}}]},{"entity_id":"fire_ray","file":"data/spells/fire_ray.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"waves":5,"interval":1}},{"path":["damage"],"old_value":70,"new_value":14}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0,"condition"],"old_value":"Always","new_value":"Always - DATA NOT CONFIRMED"}]},{"entity_id":"rampart","file":"data/units/rampart.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":250,"new_value":2500}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["range"],"new_value":36}]}]},{"commit":"a9484ec43dd31e21f484d6954425a98ec15090c1","timestamp":"2026-02-09T20:01:30-05:00","author":"TerribleTurtles","message":"feat(balance): update game data based on beta feedback","changes":[{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","stagger_modifier"],"new_value":"High"},{"path":["mechanics","damage_modifiers",1],"new_value":{"target_type":"Building","multiplier":1.3,"condition":"Always"}}]},{"entity_id":"fire_rain","file":"data/spells/fire_rain.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0,"multiplier"],"old_value":2.2,"new_value":1.2}]},{"entity_id":"gaia_beast","file":"data/titans/gaia_beast.json","category":"titans","change_type":"edit","diffs":[{"path":["mechanics","auto_capture_altars"],"new_value":true}]},{"entity_id":"thanatos","file":"data/titans/thanatos.json","category":"titans","change_type":"edit","diffs":[{"path":["mechanics","aura",1],"new_value":{"name":"Death's Retaliation","description":"Retaliates against Spellcasters after receiving >4000 damage.","radius":100,"value":0,"interval":0,"effect":"Damage","target_type":"Enemy"}}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","aura",0,"description"],"old_value":"Heals nearby allies.","new_value":"Heals nearby allies. Healing is reduced when multiple Dryads stack."}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_reduction",0,"condition"],"old_value":"Rank >= 3","new_value":"Rank >= 3  THIS INFORMATION IS UNCONFIRMED"}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",1],"new_value":{"target_type":"Building","multiplier":0.9,"condition":"Always"}}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0,"condition"],"old_value":"Always","new_value":"Always - UNCONFIRMED NUMBER"}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0,"target_type"],"old_value":"Unit","new_value":"Creature"}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers",0,"multiplier"],"old_value":2.6,"new_value":1.6}]}]},{"commit":"fddcaad67559386582e5e144795351b478b0fa82","timestamp":"2026-02-09T19:28:14-05:00","author":"TerribleTurtles","message":"feat(schema): standardize mechanics v1.1 and add features system","changes":[{"entity_id":"astral_monk","file":"data/spellcasters/astral_monk.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"fire_elementalist","file":"data/spellcasters/fire_elementalist.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"iron_sorcerer","file":"data/spellcasters/iron_sorcerer.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"mystic_scribe","file":"data/spellcasters/mystic_scribe.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"stone_shaman","file":"data/spellcasters/stone_shaman.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"},{"path":["abilities","primary","mechanics"],"old_value":[{"name":"Interruption","description":"Successfully hitting a Spellcaster twice interrupts their actions."},{"name":"Building Enchant","description":"Attacks enchant ally buildings, enabling them to emit a healing aura.","aura":{"name":"Stone Mending","description":"Heals nearby allies.","radius":8,"value":7,"interval":1.0,"effect":"Heal","target_type":"Ally"}}],"new_value":{"features":[{"name":"Interruption","description":"Successfully hitting a Spellcaster twice interrupts their actions."}],"aura":[{"name":"Building Enchant","description":"Attacks enchant ally buildings, enabling them to emit a healing aura.","radius":8,"value":7,"effect":"Heal","target_type":"Ally","interval":1.0}]}}]},{"entity_id":"swamp_witch","file":"data/spellcasters/swamp_witch.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics","damage_modifiers"],"new_value":[{"target_type":"Flying","multiplier":0,"condition":"Always"}]}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_type":"Ground","multiplier":1.5,"condition":"Always"}]}}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_type":"Flying","multiplier":1.375,"condition":"Always"}]}}]}]},{"commit":"826a1ff1a3104bb914c504f1f99f1e9f4dafe75c","timestamp":"2026-02-09T16:39:29-05:00","author":"TerribleTurtles","message":"chore: update schemas and data to v1.1, add dev guide","changes":[{"entity_id":"iron_sorcerer","file":"data/spellcasters/iron_sorcerer.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","passive",2,"description"],"old_value":"While on the ground, nearby WAR creatures gain a strong defensive buff.","new_value":"While on the ground, nearby creatures gain a strong defensive buff."},{"path":["changelog",0,"date"],"old_value":"2026-02-05T18:34:58.970266Z","new_value":"2026-02-05T18:35:34.217480Z"}]},{"entity_id":"stone_shaman","file":"data/spellcasters/stone_shaman.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics",1],"old_value":{"name":"Building Enchant","description":"Attacks enchant ally buildings, enabling them to emit a healing aura"},"new_value":{"name":"Building Enchant","description":"Attacks enchant ally buildings, enabling them to emit a healing aura.","aura":{"name":"Stone Mending","description":"Heals nearby allies.","radius":8,"value":7,"interval":1.0,"effect":"Heal","target_type":"Ally"}}}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"edit","diffs":[{"path":["description"],"old_value":"Ground shockwave that damages structures and staggers creatures. Damage is split into 3 waves.","new_value":"Ground shockwave that damages structures and staggers creatures significantly. Damage is split into 3 waves."}]},{"entity_id":"fire_rain","file":"data/spells/fire_rain.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_type":"Creature","multiplier":2.2,"condition":"Always"}]}}]},{"entity_id":"gaia_beast","file":"data/titans/gaia_beast.json","category":"titans","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"aura":[{"name":"Thorn Retaliation","description":"Retaliates against Spellcasters after receiving >4000 damage.","radius":100,"value":0,"interval":0,"effect":"Damage","target_type":"Enemy"}]}},{"path":["passive_health_regen"],"new_value":50},{"path":["magic_school"],"old_value":"Wild","new_value":"Titan"},{"path":["description"],"old_value":"The Wild Titan. Crushes all structures as it marches toward the Lifestones.","new_value":"The Wild Titan. Crushes all structures as it marches toward the Lifestones. Destroys and captures altars instantly."},{"path":["heal_amount"],"old_value":50,"new_value":0}]},{"entity_id":"thanatos","file":"data/titans/thanatos.json","category":"titans","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"aura":[{"name":"Aura of Decay","description":"Reduces damage of nearby spellcasters.","radius":15,"value":0.5,"interval":1.0,"effect":"Debuff","target_type":"Enemy"}]}},{"path":["magic_school"],"old_value":"Necromancy","new_value":"Titan"},{"path":["description"],"old_value":"The Titan of Death. Weakens all nearby enemies as it advances.","new_value":"The Titan of Death. Weakens all nearby enemies and retaliates against Spellcasters."}]},{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"edit","diffs":[{"path":["description"],"old_value":"Heavy defensive tower that targets enemies at medium range.","new_value":"A heavy defensive tower that targets enemies inside allied territory and can defend itself when attacked."}]},{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"spawner":[{"unit_id":"skeleton_warrior","count":5,"interval":10.0,"trigger":"Interval"},{"unit_id":"skeleton_warrior","count":10,"trigger":"Death"}]}}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"aura":[{"name":"Healing Aura","description":"Heals nearby allies.","radius":8,"value":30,"interval":1.0,"effect":"Heal","target_type":"Ally"}]}},{"path":["heal_amount"],"removed":true}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_type":"Unit","multiplier":1.75,"condition":"Rank >= 3"}],"damage_reduction":[{"source_type":"Unit","multiplier":0.75,"condition":"Rank >= 3"}]}}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_type":"Creature","multiplier":0.35,"condition":"Always"}]}},{"path":["damage"],"old_value":30,"new_value":18},{"path":["health"],"old_value":1800,"new_value":900}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"spawner":[{"unit_id":"harpy","count":5,"interval":10.0,"trigger":"Interval"},{"unit_id":"harpy","count":10,"trigger":"Death"}]}}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_type":"Lifestone","multiplier":1.5,"condition":"Always"},{"target_type":"Building","multiplier":2.0,"condition":"Always"}]}},{"path":["damage"],"old_value":100,"new_value":220},{"path":["health"],"old_value":10000,"new_value":4000},{"path":["movement_speed"],"old_value":3,"new_value":2}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_type":"Building","multiplier":5.0,"condition":"Always"}]}}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_type":"Unit","multiplier":0.5,"condition":"Always"},{"target_type":"Spellcaster","multiplier":0.5,"condition":"Always"}]}},{"path":["damage"],"old_value":10,"new_value":35},{"path":["health"],"old_value":220,"new_value":250},{"path":["range"],"old_value":16,"new_value":22},{"path":["movement_speed"],"old_value":4,"new_value":3}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_type":"Creature","multiplier":0.5,"condition":"Always"},{"target_type":"Spellcaster","multiplier":0.5,"condition":"Always"},{"target_type":"Building","multiplier":2.5,"condition":"Always"}]}},{"path":["damage"],"old_value":20,"new_value":50}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"capture_speed_modifier":1.25,"damage_modifiers":[{"target_type":"Creature","multiplier":2.6,"condition":"Always"},{"target_type":"Building","multiplier":0.9,"condition":"Always"}]}}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"damage_modifiers":[{"target_type":"Building","multiplier":0.9,"condition":"Always"}]}},{"path":["range"],"removed":true},{"path":["damage"],"old_value":19,"new_value":45},{"path":["health"],"old_value":220,"new_value":350},{"path":["movement_speed"],"old_value":7,"new_value":4}]}]},{"commit":"505c79a908d3a9fdf86b63e416182c4aa048f441","timestamp":"2026-02-08T22:05:54-05:00","author":"TerribleTurtles","message":"fixed typo in stone shaman abilty","changes":[{"entity_id":"stone_shaman","file":"data/spellcasters/stone_shaman.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics",1,"description"],"old_value":"Attacks now enchant ally buildings, enabling them to emit a healing aura","new_value":"Attacks enchant ally buildings, enabling them to emit a healing aura"}]}]},{"commit":"be20fdd2bcaeb4ae7cc5a6b7fa64f820bc3b0e72","timestamp":"2026-02-08T22:03:15-05:00","author":"TerribleTurtles","message":"Update Astral Shot and Stone Shaman data","changes":[{"entity_id":"stone_shaman","file":"data/spellcasters/stone_shaman.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics",1],"new_value":{"name":"Building Enchant","description":"Attacks now enchant ally buildings, enabling them to emit a healing aura"}}]},{"entity_id":"astral_shot","file":"data/spells/astral_shot.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"waves":4}},{"path":["damage"],"old_value":160,"new_value":40}]}]},{"commit":"5cc121799e2d01be1e5f25745c9fcca63a529cc0","timestamp":"2026-02-08T19:34:55-05:00","author":"TerribleTurtles","message":"feat(schema): add Earthquake mechanics and Spellcaster ability stats","changes":[{"entity_id":"stone_shaman","file":"data/spellcasters/stone_shaman.json","category":"spellcasters","change_type":"edit","diffs":[{"path":["abilities","primary","mechanics"],"new_value":[{"name":"Interruption","description":"Successfully hitting a Spellcaster twice interrupts their actions."}]},{"path":["abilities","defense","stats"],"new_value":{"charges":null,"duration":null}},{"path":["abilities","ultimate","stats"],"new_value":{"duration":null,"damage":null}},{"path":["abilities","passive",3],"removed":true,"old_value":{"name":"Spellcaster Interruption","description":"Successfully hitting a Spellcaster twice interrupts their actions."}}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"edit","diffs":[{"path":["mechanics"],"new_value":{"waves":3,"bonus_damage":[{"target_type":"Building","unit":"percent_max_hp","value":0.3}]}},{"path":["description"],"old_value":"Ground shockwave that damages structures and staggers creatures.","new_value":"Ground shockwave that damages structures and staggers creatures. Damage is split into 3 waves."},{"path":["damage"],"old_value":230,"new_value":76}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Flying"}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Flying"}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Flying"}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Hover"}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"wolven_hunter","file":"data/units/wolven_hunter.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["movement_type"],"new_value":"Flying"}]}]},{"commit":"49b99eb6428d197ca351046838f600fd29f39a8f","timestamp":"2026-02-08T09:52:06-05:00","author":"TerribleTurtles","message":"Refactor schemas: Separate Spellcasters, Titans, and Incantations","changes":[{"entity_id":"light_heal","file":"data/consumables/light_heal.json","category":"consumables","change_type":"edit","diffs":[{"path":["entity_id"],"new_value":"light_heal"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-04T15:27:05.217337Z","description":"Initial Closed Beta 2 Data"}]},{"path":["category"],"new_value":"Consumable"},{"path":["image_required"],"new_value":false},{"path":["duration"],"new_value":30},{"path":["game_version"],"removed":true},{"path":["consumable_id"],"removed":true},{"path":["ttl"],"removed":true}]},{"entity_id":"medium_heal","file":"data/consumables/medium_heal.json","category":"consumables","change_type":"edit","diffs":[{"path":["entity_id"],"new_value":"medium_heal"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-04T15:27:05.217803Z","description":"Initial Closed Beta 2 Data"}]},{"path":["category"],"new_value":"Consumable"},{"path":["image_required"],"new_value":false},{"path":["duration"],"new_value":30},{"path":["game_version"],"removed":true},{"path":["consumable_id"],"removed":true},{"path":["ttl"],"removed":true}]},{"entity_id":"medium_recharge","file":"data/consumables/medium_recharge.json","category":"consumables","change_type":"edit","diffs":[{"path":["entity_id"],"new_value":"medium_recharge"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-04T15:27:05.217979Z","description":"Initial Closed Beta 2 Data"}]},{"path":["category"],"new_value":"Consumable"},{"path":["image_required"],"new_value":false},{"path":["duration"],"new_value":30},{"path":["game_version"],"removed":true},{"path":["consumable_id"],"removed":true},{"path":["ttl"],"removed":true}]},{"entity_id":"small_recharge","file":"data/consumables/small_recharge.json","category":"consumables","change_type":"edit","diffs":[{"path":["entity_id"],"new_value":"small_recharge"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-05T03:28:27.274024Z","description":"Initial Closed Beta 2 Data"}]},{"path":["category"],"new_value":"Consumable"},{"path":["image_required"],"new_value":false},{"path":["duration"],"new_value":30},{"path":["game_version"],"removed":true},{"path":["consumable_id"],"removed":true},{"path":["ttl"],"removed":true}]},{"entity_id":"astral_monk","file":"data/spellcasters/astral_monk.json","category":"spellcasters","change_type":"rename","diffs":[{"path":["difficulty"],"new_value":3},{"path":["spellcaster_id"],"new_value":"astral_monk"},{"path":["category"],"new_value":"Spellcaster"},{"path":["abilities"],"new_value":{"passive":[{"name":"Arcane Alignment","description":"All Astral spells recharge faster."},{"name":"Last Light","description":"All damage dealt is increased against targets below half health."},{"name":"Cosmic Air","description":"All flying creatures summoned by the Astral Monk are invisible."}],"primary":{"name":"Astral Fists","description":"Pierces through enemies with colossal astral fists."},"defense":{"name":"Veil Shift","description":"Turns invisible and move faster."},"ultimate":{"name":"Dimension of Varani","description":"Conjures a time bubble that freezes enemy projectiles and creatures inside it."}}},{"path":["image_required"],"new_value":true},{"path":["name"],"new_value":"Astral Monk"},{"path":["class"],"new_value":"Duelist"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-05T18:34:05.939129Z","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"new_value":"../../schemas/v1/spellcaster.schema.json"}]},{"entity_id":"fire_elementalist","file":"data/spellcasters/fire_elementalist.json","category":"spellcasters","change_type":"rename","diffs":[{"path":["difficulty"],"new_value":1},{"path":["spellcaster_id"],"new_value":"fire_elementalist"},{"path":["category"],"new_value":"Spellcaster"},{"path":["abilities"],"new_value":{"passive":[{"name":"Ignition Spark","description":"Allied creatures near the Fire Elementalist capture Altar faster."},{"name":"Enduring Flame","description":"Damaging burning enemies heals the Fire Elementalist."},{"name":"Blazing Momentum","description":"When you or your creatures kill a Burning enemy, recharge Elemental incantations."}],"primary":{"name":"Flame Strikes","description":"Burns enemies with powerful Fire attacks."},"defense":{"name":"Fiery Dash","description":"Performs an invincible dash in a chosen direction."},"ultimate":{"name":"Burning Conquest","description":"Captures a territory, inflicts Fire damage and imbues allied units with Fire."}}},{"path":["image_required"],"new_value":true},{"path":["name"],"new_value":"Fire Elementalist"},{"path":["class"],"new_value":"Conqueror"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-05T17:05:01.971147Z","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"new_value":"../../schemas/v1/spellcaster.schema.json"}]},{"entity_id":"iron_sorcerer","file":"data/spellcasters/iron_sorcerer.json","category":"spellcasters","change_type":"rename","diffs":[{"path":["difficulty"],"new_value":1},{"path":["spellcaster_id"],"new_value":"iron_sorcerer"},{"path":["category"],"new_value":"Spellcaster"},{"path":["abilities"],"new_value":{"passive":[{"name":"Scourge of War","description":"Increases Rank III population, reduces Rank II population."},{"name":"Forges of Valm","description":"Creatures spawned from Buildings have significantly more health."},{"name":"Field Commander","description":"While on the ground, nearby WAR creatures gain a strong defensive buff."}],"primary":{"name":"Twin Strike","description":"Strike with powerful mid-range attacks that interrupt enemies."},"defense":{"name":"Rune Shield","description":"Raise a shield that protects allies and reflects attacks."},"ultimate":{"name":"Iron Tempest","description":"Unleash a metal vortex that deals heavy damage and knocks back enemies along its path."}}},{"path":["image_required"],"new_value":true},{"path":["name"],"new_value":"Iron Sorcerer"},{"path":["class"],"new_value":"Conqueror"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-05T18:34:58.970266Z","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"new_value":"../../schemas/v1/spellcaster.schema.json"}]},{"entity_id":"mystic_scribe","file":"data/spellcasters/mystic_scribe.json","category":"spellcasters","change_type":"rename","diffs":[{"path":["difficulty"],"new_value":2},{"path":["spellcaster_id"],"new_value":"mystic_scribe"},{"path":["category"],"new_value":"Spellcaster"},{"path":["abilities"],"new_value":{"passive":[{"name":"Echo of Mercy","description":"While on the ground, the Mystic Scribe emits a healing aura."},{"name":"Holy Magic Mastery","description":"All Holy incantations recharge faster."},{"name":"Thousand Favors","description":"Healing recharges Rank I and II creatures."}],"primary":{"name":"Brush Strike","description":"Strike with enchanted ink to damage enemies and boost allies\u2019 Max HP."},"defense":{"name":"Scroll Barrier","description":"Creates a barrier that absorbs projectiles and reduces all damage."},"ultimate":{"name":"Seal of Immortality","description":"Mark the ground with a massive healing seal."}}},{"path":["image_required"],"new_value":true},{"path":["name"],"new_value":"Mystic Scribe"},{"path":["class"],"new_value":"Enchanter"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-05T18:33:10.223377Z","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"new_value":"../../schemas/v1/spellcaster.schema.json"}]},{"entity_id":"stone_shaman","file":"data/spellcasters/stone_shaman.json","category":"spellcasters","change_type":"rename","diffs":[{"path":["difficulty"],"new_value":2},{"path":["spellcaster_id"],"new_value":"stone_shaman"},{"path":["category"],"new_value":"Spellcaster"},{"path":["abilities"],"new_value":{"passive":[{"name":"Mountain\u2019s Favor","description":"The Stone Shaman\u2019s attacks deal double damage to buildings."},{"name":"Child of the Titans","description":"Increases Rank II and Rank III population while reducing Rank I population."},{"name":"Pathfinder","description":"While on the ground, the Shaman recharges Wild incantations much faster."},{"name":"Spellcaster Interruption","description":"Successfully hitting a Spellcaster twice interrupts their actions."}],"primary":{"name":"Mountain Staff","description":"Swing your catalyst to deal heavy melee damage and interrupt enemies."},"defense":{"name":"Wind Shield","description":"Conjure a protective wind barrier that deals damage on contact."},"ultimate":{"name":"Wall of Kamazad","description":"Deploys a colossal wall capable of blocking Titans."}}},{"path":["image_required"],"new_value":true},{"path":["name"],"new_value":"Stone Shaman"},{"path":["class"],"new_value":"Enchanter"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-05T18:35:34.217480Z","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"new_value":"../../schemas/v1/spellcaster.schema.json"}]},{"entity_id":"swamp_witch","file":"data/spellcasters/swamp_witch.json","category":"spellcasters","change_type":"rename","diffs":[{"path":["difficulty"],"new_value":3},{"path":["spellcaster_id"],"new_value":"swamp_witch"},{"path":["category"],"new_value":"Spellcaster"},{"path":["abilities"],"new_value":{"passive":[{"name":"Pact of Sacrifice","description":"Killing Poisoned Creatures recharges Necromancy spells."},{"name":"Brood Rite","description":"When a Swamp Witch\u2019s creature is destroyed, her incantations and abilities recharge faster."},{"name":"Swarm Dominance","description":"The Swamp Witch has more Rank I population, but less Rank II and Rank III population.  "}],"primary":{"name":"Poison Strike","description":"Fire a barrage of projectiles that deal Poison damage."},"defense":{"name":"Witchslip","description":"Performs an invincible dash in a chosen direction."},"ultimate":{"name":"Dark Ascension","description":"Unleashes a demonic form that boosts all spell damage."}}},{"path":["image_required"],"new_value":true},{"path":["name"],"new_value":"Swamp Witch"},{"path":["class"],"new_value":"Duelist"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-05T17:05:01.972347Z","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"new_value":"../../schemas/v1/spellcaster.schema.json"}]},{"entity_id":"astral_nova","file":"data/spells/astral_nova.json","category":"spells","change_type":"add","diffs":[{"path":["category"],"new_value":"Spell"},{"path":["rank"],"new_value":"IV"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Astral"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Astral Nova"},{"path":["damage"],"new_value":4200},{"path":["description"],"new_value":"Massive projectile that deals heavy damage on impact."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.846742+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["range"],"new_value":80},{"path":["entity_id"],"new_value":"astral_nova"}]},{"entity_id":"astral_shot","file":"data/spells/astral_shot.json","category":"spells","change_type":"add","diffs":[{"path":["category"],"new_value":"Spell"},{"path":["rank"],"new_value":"II"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Astral"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Astral Shot"},{"path":["damage"],"new_value":160},{"path":["description"],"new_value":"Rapid burst of projectiles."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.839777+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["range"],"new_value":80},{"path":["entity_id"],"new_value":"astral_shot"}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"add","diffs":[{"path":["category"],"new_value":"Spell"},{"path":["rank"],"new_value":"III"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Wild"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Earthquake"},{"path":["damage"],"new_value":230},{"path":["description"],"new_value":"Ground shockwave that damages structures and staggers creatures."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.843317+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["range"],"new_value":35},{"path":["entity_id"],"new_value":"earthquake"}]},{"entity_id":"fire_ball","file":"data/spells/fire_ball.json","category":"spells","change_type":"add","diffs":[{"path":["category"],"new_value":"Spell"},{"path":["rank"],"new_value":"III"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Elemental"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Fire Ball"},{"path":["damage"],"new_value":530},{"path":["description"],"new_value":"Fast projectile that deals medium Fire damage to a target."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.843620+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["range"],"new_value":80},{"path":["entity_id"],"new_value":"fire_ball"}]},{"entity_id":"fire_rain","file":"data/spells/fire_rain.json","category":"spells","change_type":"add","diffs":[{"path":["category"],"new_value":"Spell"},{"path":["rank"],"new_value":"IV"},{"path":["image_required"],"new_value":true},{"path":["duration"],"new_value":12},{"path":["magic_school"],"new_value":"Elemental"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Fire Rain"},{"path":["damage"],"new_value":450},{"path":["description"],"new_value":"Fire projectiles that deal continuous damage over a wide area."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.847017+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["range"],"new_value":45},{"path":["entity_id"],"new_value":"fire_rain"}]},{"entity_id":"fire_ray","file":"data/spells/fire_ray.json","category":"spells","change_type":"add","diffs":[{"path":["category"],"new_value":"Spell"},{"path":["rank"],"new_value":"I"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Elemental"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Fire Ray"},{"path":["damage"],"new_value":70},{"path":["description"],"new_value":"Focused beam that deals low Fire damage."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.836670+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["range"],"new_value":45},{"path":["entity_id"],"new_value":"fire_ray"}]},{"entity_id":"flame_surge","file":"data/spells/flame_surge.json","category":"spells","change_type":"add","diffs":[{"path":["category"],"new_value":"Spell"},{"path":["rank"],"new_value":"III"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"War"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Flame Surge"},{"path":["description"],"new_value":"Fire pulse that burns enemies and infuses nearby allies."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.843934+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["range"],"new_value":24},{"path":["entity_id"],"new_value":"flame_surge"}]},{"entity_id":"frost_surge","file":"data/spells/frost_surge.json","category":"spells","change_type":"add","diffs":[{"path":["category"],"new_value":"Spell"},{"path":["rank"],"new_value":"III"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Wild"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Frost Surge"},{"path":["description"],"new_value":"Ice pulse that freezes enemies and infuses nearby allies."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.844303+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["range"],"new_value":24},{"path":["entity_id"],"new_value":"frost_surge"}]},{"entity_id":"grand_lightning","file":"data/spells/grand_lightning.json","category":"spells","change_type":"add","diffs":[{"path":["category"],"new_value":"Spell"},{"path":["rank"],"new_value":"IV"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Technomancy"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Grand Lightning"},{"path":["damage"],"new_value":3675},{"path":["description"],"new_value":"Thunderstrike that deals extreme Lightning damage to a target."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.847345+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["range"],"new_value":36},{"path":["entity_id"],"new_value":"grand_lightning"}]},{"entity_id":"heal_ray","file":"data/spells/heal_ray.json","category":"spells","change_type":"add","diffs":[{"path":["category"],"new_value":"Spell"},{"path":["rank"],"new_value":"I"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Holy"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Heal Ray"},{"path":["heal_amount"],"new_value":300},{"path":["description"],"new_value":"Healing ray that can be aimed at the ground to restore allies in the area."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.837289+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["range"],"new_value":45},{"path":["entity_id"],"new_value":"heal_ray"}]},{"entity_id":"poison_grenade","file":"data/spells/poison_grenade.json","category":"spells","change_type":"add","diffs":[{"path":["category"],"new_value":"Spell"},{"path":["rank"],"new_value":"III"},{"path":["image_required"],"new_value":true},{"path":["duration"],"new_value":12},{"path":["magic_school"],"new_value":"Necromancy"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Poison Grenade"},{"path":["damage"],"new_value":25},{"path":["description"],"new_value":"Grenade that creates a Poison cloud over the target area."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.845763+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["range"],"new_value":40},{"path":["entity_id"],"new_value":"poison_grenade"}]},{"entity_id":"resurrection","file":"data/spells/resurrection.json","category":"spells","change_type":"add","diffs":[{"path":["category"],"new_value":"Spell"},{"path":["rank"],"new_value":"IV"},{"path":["image_required"],"new_value":true},{"path":["duration"],"new_value":12},{"path":["magic_school"],"new_value":"Holy"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Resurrection"},{"path":["description"],"new_value":"Magic circle that resurrects creatures with partial health."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.848165+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["entity_id"],"new_value":"resurrection"}]},{"entity_id":"sacrifice","file":"data/spells/sacrifice.json","category":"spells","change_type":"add","diffs":[{"path":["category"],"new_value":"Spell"},{"path":["rank"],"new_value":"I"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Astral"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Sacrifice"},{"path":["damage"],"new_value":90},{"path":["description"],"new_value":"Dark ritual that recalls allies to recharge summons."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.838616+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["entity_id"],"new_value":"sacrifice"}]},{"entity_id":"thunder_ray","file":"data/spells/thunder_ray.json","category":"spells","change_type":"add","diffs":[{"path":["category"],"new_value":"Spell"},{"path":["rank"],"new_value":"I"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Technomancy"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Thunder Ray"},{"path":["damage"],"new_value":70},{"path":["description"],"new_value":"Focused beam that deals low Lightning damage."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.839433+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["range"],"new_value":45},{"path":["entity_id"],"new_value":"thunder_ray"}]},{"entity_id":"gaia_beast","file":"data/titans/gaia_beast.json","category":"titans","change_type":"add","diffs":[{"path":["category"],"new_value":"Titan"},{"path":["rank"],"new_value":"V"},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":20000},{"path":["magic_school"],"new_value":"Wild"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Gaia Beast"},{"path":["damage"],"new_value":100},{"path":["movement_speed"],"new_value":4},{"path":["heal_amount"],"new_value":50},{"path":["description"],"new_value":"The Wild Titan. Crushes all structures as it marches toward the Lifestones."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.848523+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["entity_id"],"new_value":"gaia_beast"}]},{"entity_id":"thanatos","file":"data/titans/thanatos.json","category":"titans","change_type":"add","diffs":[{"path":["category"],"new_value":"Titan"},{"path":["rank"],"new_value":"V"},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":15000},{"path":["magic_school"],"new_value":"Necromancy"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Thanatos"},{"path":["damage"],"new_value":125},{"path":["movement_speed"],"new_value":4},{"path":["description"],"new_value":"The Titan of Death. Weakens all nearby enemies as it advances."},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.848821+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["entity_id"],"new_value":"thanatos"}]},{"entity_id":"astral_nova","file":"data/units/astral_nova.json","category":"units","change_type":"delete","diffs":[{"path":["game_version"],"removed":true},{"path":["category"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["image_required"],"removed":true},{"path":["health"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["damage"],"removed":true},{"path":["name"],"removed":true},{"path":["tags"],"removed":true},{"path":["card_config"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["description"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["range"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["radius"],"removed":true}]},{"entity_id":"astral_shot","file":"data/units/astral_shot.json","category":"units","change_type":"delete","diffs":[{"path":["game_version"],"removed":true},{"path":["category"],"removed":true},{"path":["max_targets"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["image_required"],"removed":true},{"path":["health"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["damage"],"removed":true},{"path":["name"],"removed":true},{"path":["tags"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["description"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["range"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["card_config"],"removed":true}]},{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"III"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.842699+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["range"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["collision_radius"],"removed":true},{"path":["card_config"],"removed":true},{"path":["damage"],"old_value":90,"new_value":50},{"path":["health"],"old_value":1800,"new_value":3500},{"path":["tags",0],"removed":true,"old_value":"defensive"},{"path":["tags",1],"removed":true,"old_value":"magic"},{"path":["tags",2],"removed":true,"old_value":"energy"}]},{"entity_id":"ballista","file":"data/units/ballista.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"II"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.840179+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["collision_radius"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"A stationary siege engine that launches massive bolts at distant targets.","new_value":"Static weapon that targets enemies at long range."},{"path":["damage"],"old_value":250,"new_value":25},{"path":["health"],"old_value":1200,"new_value":300},{"path":["range"],"old_value":30,"new_value":80},{"path":["tags",0],"removed":true,"old_value":"defensive"},{"path":["tags",1],"removed":true,"old_value":"siege"},{"path":["tags",2],"removed":true,"old_value":"piercing"}]},{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"III"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.843010+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["damage"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["range"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["collision_radius"],"removed":true},{"path":["card_config"],"removed":true},{"path":["health"],"old_value":2000,"new_value":1000},{"path":["tags",0],"removed":true,"old_value":"undead"},{"path":["tags",1],"removed":true,"old_value":"spawner"},{"path":["tags",2],"removed":true,"old_value":"structure"}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"II"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.840490+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["range"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Support creature that heals allies. Uses elemental attacks when infused","new_value":"Support creature that heals allies. Uses elemental attacks when infused."},{"path":["health"],"old_value":2250,"new_value":225}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"II"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.840800+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["range"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Strong melee unit that resists damage from large enemies","new_value":"Strong melee unit that resists damage from large enemies."},{"path":["health"],"old_value":6500,"new_value":650}]},{"entity_id":"earthquake","file":"data/units/earthquake.json","category":"units","change_type":"delete","diffs":[{"path":["game_version"],"removed":true},{"path":["category"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["image_required"],"removed":true},{"path":["health"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["damage"],"removed":true},{"path":["name"],"removed":true},{"path":["tags"],"removed":true},{"path":["card_config"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["description"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["range"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["radius"],"removed":true}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"I"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.836151+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Stealthy flying ranged creature that turns invisible out of combat","new_value":"Stealthy flying ranged creature that turns invisible out of combat."},{"path":["health"],"old_value":1000,"new_value":100}]},{"entity_id":"fire_rain","file":"data/units/fire_rain.json","category":"units","change_type":"delete","diffs":[{"path":["duration"],"removed":true},{"path":["name"],"removed":true},{"path":["card_config"],"removed":true},{"path":["health"],"removed":true},{"path":["damage"],"removed":true},{"path":["tags"],"removed":true},{"path":["description"],"removed":true},{"path":["range"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["category"],"removed":true},{"path":["image_required"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["tick_rate"],"removed":true},{"path":["radius"],"removed":true}]},{"entity_id":"fire_ray","file":"data/units/fire_ray.json","category":"units","change_type":"delete","diffs":[{"path":["duration"],"removed":true},{"path":["name"],"removed":true},{"path":["card_config"],"removed":true},{"path":["health"],"removed":true},{"path":["damage"],"removed":true},{"path":["tags"],"removed":true},{"path":["description"],"removed":true},{"path":["range"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["category"],"removed":true},{"path":["image_required"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["tick_rate"],"removed":true},{"path":["radius"],"removed":true}]},{"entity_id":"fireball","file":"data/units/fireball.json","category":"units","change_type":"delete","diffs":[{"path":["game_version"],"removed":true},{"path":["category"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["image_required"],"removed":true},{"path":["health"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["damage"],"removed":true},{"path":["name"],"removed":true},{"path":["tags"],"removed":true},{"path":["card_config"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["description"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["range"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["radius"],"removed":true}]},{"entity_id":"flame_surge","file":"data/units/flame_surge.json","category":"units","change_type":"delete","diffs":[{"path":["game_version"],"removed":true},{"path":["category"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["image_required"],"removed":true},{"path":["health"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["damage"],"removed":true},{"path":["name"],"removed":true},{"path":["tags"],"removed":true},{"path":["card_config"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["description"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["range"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["radius"],"removed":true}]},{"entity_id":"frost_surge","file":"data/units/frost_surge.json","category":"units","change_type":"delete","diffs":[{"path":["game_version"],"removed":true},{"path":["category"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["image_required"],"removed":true},{"path":["health"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["damage"],"removed":true},{"path":["name"],"removed":true},{"path":["tags"],"removed":true},{"path":["card_config"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["description"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["range"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["radius"],"removed":true}]},{"entity_id":"gaia_beast","file":"data/units/gaia_beast.json","category":"units","change_type":"delete","diffs":[{"path":["game_version"],"removed":true},{"path":["category"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["passive_health_regen"],"removed":true},{"path":["health"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["damage"],"removed":true},{"path":["name"],"removed":true},{"path":["tags"],"removed":true},{"path":["card_config"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["description"],"removed":true},{"path":["range"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["movement_type"],"removed":true}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"III"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.844628+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["range"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Slow giant that protects allies with a massive shield","new_value":"Slow giant that protects allies with a massive shield."},{"path":["health"],"old_value":1500,"new_value":1800}]},{"entity_id":"grand_lightning","file":"data/units/grand_lightning.json","category":"units","change_type":"delete","diffs":[{"path":["game_version"],"removed":true},{"path":["category"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["image_required"],"removed":true},{"path":["health"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["damage"],"removed":true},{"path":["name"],"removed":true},{"path":["tags"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["description"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["range"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["card_config"],"removed":true}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"I"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.837000+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["range"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Agile flying creature that excels at defeating ground units","new_value":"Agile flying creature that excels at defeating ground units."},{"path":["health"],"old_value":1000,"new_value":100}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"III"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.844994+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["damage"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["range"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["collision_radius"],"removed":true},{"path":["card_config"],"removed":true},{"path":["health"],"old_value":1500,"new_value":750}]},{"entity_id":"heal_ray","file":"data/units/heal_ray.json","category":"units","change_type":"delete","diffs":[{"path":["duration"],"removed":true},{"path":["name"],"removed":true},{"path":["card_config"],"removed":true},{"path":["health"],"removed":true},{"path":["damage"],"removed":true},{"path":["tags"],"removed":true},{"path":["description"],"removed":true},{"path":["range"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["category"],"removed":true},{"path":["image_required"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["heal_amount"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["tick_rate"],"removed":true},{"path":["radius"],"removed":true}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"IV"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.847802+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["range"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Colossal creature that deals massive damage to structures","new_value":"Colossal creature that deals massive damage to structures."},{"path":["damage"],"old_value":50,"new_value":100}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"II"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.841271+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["range"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Undead caster that inflict curses to enemies, increasing the damage they take and reducing their movement speed.","new_value":"Undead caster that inflicts curses to enemies, increasing the damage they take and reducing their movement speed."}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"I"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.837714+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Long-range fighter that deals bonus damage to flying enemies","new_value":"Long-range fighter that deals bonus damage to flying enemies."},{"path":["health"],"old_value":850,"new_value":85},{"path":["range"],"old_value":35,"new_value":36}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"III"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.845391+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["range"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Mighty warrior that crushes target areas with a hammer","new_value":"Mighty warrior that crushes target areas with a hammer."}]},{"entity_id":"poison_grenade","file":"data/units/poison_grenade.json","category":"units","change_type":"delete","diffs":[{"path":["duration"],"removed":true},{"path":["name"],"removed":true},{"path":["card_config"],"removed":true},{"path":["health"],"removed":true},{"path":["damage"],"removed":true},{"path":["tags"],"removed":true},{"path":["description"],"removed":true},{"path":["range"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["category"],"removed":true},{"path":["image_required"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["tick_rate"],"removed":true},{"path":["radius"],"removed":true}]},{"entity_id":"rampart","file":"data/units/rampart.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"II"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.841572+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["damage"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["range"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["collision_radius"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"A reinforced wall section designed to hold back enemy waves.","new_value":"Defensive wall that blocks enemy paths."},{"path":["health"],"old_value":5000,"new_value":250},{"path":["tags",0],"removed":true,"old_value":"defensive"},{"path":["tags",1],"removed":true,"old_value":"structure"},{"path":["tags",2],"removed":true,"old_value":"fortification"}]},{"entity_id":"resurrection","file":"data/units/resurrection.json","category":"units","change_type":"delete","diffs":[{"path":["game_version"],"removed":true},{"path":["category"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["image_required"],"removed":true},{"path":["health"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["damage"],"removed":true},{"path":["name"],"removed":true},{"path":["tags"],"removed":true},{"path":["card_config"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["description"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["range"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["radius"],"removed":true}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"I"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.838054+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Medium-range soldier that deals bonus damage to buildings","new_value":"Medium-range soldier that deals bonus damage to structures."},{"path":["health"],"old_value":2200,"new_value":220},{"path":["range"],"old_value":15,"new_value":16}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"I"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.838362+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["range"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Fast creature that explodes on contact, dealing bonus damage to buildings","new_value":"Fast creature that explodes on contact, dealing bonus damage to structures."},{"path":["health"],"old_value":850,"new_value":85}]},{"entity_id":"sacrifice","file":"data/units/sacrifice.json","category":"units","change_type":"delete","diffs":[{"path":["game_version"],"removed":true},{"path":["category"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["image_required"],"removed":true},{"path":["health"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["damage"],"removed":true},{"path":["name"],"removed":true},{"path":["tags"],"removed":true},{"path":["card_config"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["description"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["range"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["radius"],"removed":true}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"I"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.838860+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["range"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Undead soldier that captures altars quickly in large groups","new_value":"Undead soldier that captures altars quickly in large groups."},{"path":["health"],"old_value":2000,"new_value":200}]},{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"III"},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.846123+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["collision_radius"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"A heavily armored steam-powered war machine capable of crushing infantry and breaching walls.","new_value":"Long-range unit that deals heavy damage to a target."},{"path":["damage"],"old_value":120,"new_value":40},{"path":["health"],"old_value":2500,"new_value":130},{"path":["range"],"old_value":22,"new_value":75},{"path":["movement_speed"],"old_value":180,"new_value":3},{"path":["tags",0],"removed":true,"old_value":"mechanical"},{"path":["tags",1],"removed":true,"old_value":"siege"},{"path":["tags",2],"removed":true,"old_value":"ranged"}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"III"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.846434+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Siege unit that hurls long-range boulders for heavy area damage","new_value":"Siege unit that hurls long-range boulders for heavy area damage."},{"path":["health"],"old_value":2100,"new_value":210}]},{"entity_id":"thanatos","file":"data/units/thanatos.json","category":"units","change_type":"delete","diffs":[{"path":["game_version"],"removed":true},{"path":["category"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["health"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["damage"],"removed":true},{"path":["name"],"removed":true},{"path":["tags"],"removed":true},{"path":["card_config"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["description"],"removed":true},{"path":["range"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["movement_type"],"removed":true}]},{"entity_id":"thunder_ray","file":"data/units/thunder_ray.json","category":"units","change_type":"delete","diffs":[{"path":["duration"],"removed":true},{"path":["name"],"removed":true},{"path":["card_config"],"removed":true},{"path":["health"],"removed":true},{"path":["damage"],"removed":true},{"path":["tags"],"removed":true},{"path":["description"],"removed":true},{"path":["range"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["category"],"removed":true},{"path":["image_required"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["tick_rate"],"removed":true},{"path":["radius"],"removed":true}]},{"entity_id":"wolven_hunter","file":"data/units/wolven_hunter.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"II"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.841893+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Hunter unit that fires powerful long-range bolts","new_value":"Hunter unit that fires powerful long-range bolts."},{"path":["range"],"old_value":750,"new_value":75}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["rank"],"new_value":"II"},{"path":["image_required"],"new_value":true},{"path":["changelog"],"new_value":[{"version":"0.0.1","date":"2026-02-08T09:49:16.842389+00:00","description":"Initial Closed Beta 2 Data"}]},{"path":["$schema"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_type"],"removed":true},{"path":["card_config"],"removed":true},{"path":["description"],"old_value":"Flying dragonkin that attacks with mid-range projectiles","new_value":"Flying dragonkin that attacks with mid-range projectiles."},{"path":["health"],"old_value":2200,"new_value":220},{"path":["range"],"old_value":35,"new_value":36}]}]},{"commit":"bb1d5414093311913a029a93c7fff3db0a2025e0","timestamp":"2026-02-06T04:15:13-05:00","author":"TerribleTurtles","message":"added correct schools of magic, removed incorrect ones.  Assinged each Creature, Building, and Spell to the correct school.","changes":[{"entity_id":"ballista","file":"data/units/ballista.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"War","new_value":"Technomancy"}]},{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Dark","new_value":"Necromancy"}]},{"entity_id":"earthquake","file":"data/units/earthquake.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Elemental","new_value":"Wild"}]},{"entity_id":"frost_surge","file":"data/units/frost_surge.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Frost","new_value":"Wild"}]},{"entity_id":"gaia_beast","file":"data/units/gaia_beast.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Elemental","new_value":"Titan"}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"War","new_value":"Holy"}]},{"entity_id":"grand_lightning","file":"data/units/grand_lightning.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Lightning","new_value":"Technomancy"}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Frost","new_value":"Wild"}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Frost","new_value":"Wild"}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Dark","new_value":"Necromancy"}]},{"entity_id":"poison_grenade","file":"data/units/poison_grenade.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Dark","new_value":"Necromancy"}]},{"entity_id":"rampart","file":"data/units/rampart.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"War","new_value":"Holy"}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"War","new_value":"Technomancy"}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Dark","new_value":"Necromancy"}]},{"entity_id":"sacrifice","file":"data/units/sacrifice.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Dark","new_value":"Astral"}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Dark","new_value":"Necromancy"}]},{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"War","new_value":"Technomancy"}]},{"entity_id":"thanatos","file":"data/units/thanatos.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Dark","new_value":"Titan"}]},{"entity_id":"thunder_ray","file":"data/units/thunder_ray.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Lightning","new_value":"Technomancy"}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"old_value":"Elemental","new_value":"Wild"}]}]},{"commit":"ff41b47ac229a4f364b876d3fb53403f6b287cc3","timestamp":"2026-02-06T04:09:03-05:00","author":"TerribleTurtles","message":"added correct schools of magic, removed incorrect ones.  Assinged each Creature, Building, and Spell to the correct school.","changes":[{"entity_id":"test_invalid_deck","file":"data/decks/test_invalid_deck.json","category":"decks","change_type":"delete","diffs":[{"path":["cards"],"removed":true},{"path":["titan_id"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["hero_id"],"removed":true},{"path":["description"],"removed":true},{"path":["version"],"removed":true}]},{"entity_id":"test_valid_deck","file":"data/decks/test_valid_deck.json","category":"decks","change_type":"delete","diffs":[{"path":["cards"],"removed":true},{"path":["titan_id"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["hero_id"],"removed":true},{"path":["description"],"removed":true},{"path":["version"],"removed":true}]}]},{"commit":"f366eb68c02090cd58f2f7bb40ee5e1d1196e27f","timestamp":"2026-02-05T17:25:59-05:00","author":"TerribleTurtles","message":"corrected harpy nest from rank I to rank III","changes":[{"entity_id":"test_invalid_deck","file":"data/decks/test_invalid_deck.json","category":"decks","change_type":"add","diffs":[{"path":["cards"],"new_value":["astral_shot","astral_nova","fire_rain","fireball"]},{"path":["titan_id"],"new_value":"gaia_beast"},{"path":["name"],"new_value":"Invalid Deck"},{"path":["id"],"new_value":"test_invalid"},{"path":["hero_id"],"new_value":"astral_monk"},{"path":["description"],"new_value":"A deck with no Rank I/II creatures."},{"path":["version"],"new_value":"1.0.0"}]},{"entity_id":"test_valid_deck","file":"data/decks/test_valid_deck.json","category":"decks","change_type":"add","diffs":[{"path":["cards"],"new_value":["skeleton_warrior","astral_nova","fire_rain","fireball"]},{"path":["titan_id"],"new_value":"gaia_beast"},{"path":["name"],"new_value":"Valid Deck"},{"path":["id"],"new_value":"test_valid"},{"path":["hero_id"],"new_value":"astral_monk"},{"path":["description"],"new_value":"A deck with a Rank I creature."},{"path":["version"],"new_value":"1.0.0"}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["card_config","rank"],"old_value":"I","new_value":"III"}]}]},{"commit":"a9276416b3e20b9924ca3703511b868fb59e998a","timestamp":"2026-02-05T13:13:27-05:00","author":"TerribleTurtles","message":"fix: restore missing rank field to titans to pass validation","changes":[{"entity_id":"gaia_beast","file":"data/units/gaia_beast.json","category":"units","change_type":"edit","diffs":[{"path":["card_config","rank"],"new_value":"III"}]},{"entity_id":"thanatos","file":"data/units/thanatos.json","category":"units","change_type":"edit","diffs":[{"path":["card_config","rank"],"new_value":"III"}]}]},{"commit":"751256ba75c8267b5ec68a285653fbab3ce7ab7e","timestamp":"2026-02-05T17:48:27Z","author":"Wenedi","message":"Update mystic_scribe.json","changes":[{"entity_id":"mystic_scribe","file":"data/heroes/mystic_scribe.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",2,"description"],"old_value":"When the Mystic Scribe heals an ally, she is healed for the same amount.","new_value":"While on the ground, the Mystic Scribe emits a healing aura."},{"path":["abilities","passive",0,"description"],"old_value":"All Holy spells recharge faster.","new_value":"All Holy incantations recharge faster."}]}]},{"commit":"5aa414c2b772e9671c8d21f9434bf373f87b437a","timestamp":"2026-02-05T17:46:45Z","author":"Wenedi","message":"Update astral_monk.json","changes":[{"entity_id":"astral_monk","file":"data/heroes/astral_monk.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",2],"old_value":{"name":"Arcane Alignment","description":"All Rank III Spells start with +1 Max Charge."},"new_value":{"name":"Cosmic Air","description":"All flying creatures summoned by the Astral Monk are invisible."}},{"path":["abilities","passive",1],"old_value":{"name":"Last Light","description":"Spells deal increased damage when the target is under half health."},"new_value":{"name":"Last Light","description":"All damage dealt is increased against targets below half health."}},{"path":["abilities","passive",0],"old_value":{"name":"Mantra of Power","description":"When the Astral Monk kills a Spellcaster with a spell, she gains a charge of that spell."},"new_value":{"name":"Arcane Alignment","description":"All Astral spells recharge faster."}}]}]},{"commit":"160c6b2f28df2661431c8ba1e8f4aba8a014388f","timestamp":"2026-02-05T17:45:07Z","author":"Wenedi","message":"Update iron_sorcerer.json","changes":[{"entity_id":"iron_sorcerer","file":"data/heroes/iron_sorcerer.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",1,"description"],"old_value":"All Rank III Buildings start with +1 Max Charge.","new_value":"Increases Rank III population, reduces Rank II population."},{"path":["abilities","ultimate","description"],"old_value":"Unleash a metal vortex that deals heavy damage along its path.","new_value":"Unleash a metal vortex that deals heavy damage and knocks back enemies along its path."},{"path":["abilities","passive",2],"new_value":{"name":"Field Commander","description":"While on the ground, nearby WAR creatures gain a strong defensive buff."}}]}]},{"commit":"1883fa0592cf0c7db397d2302c2d1f2aa90b4048","timestamp":"2026-02-05T17:43:14Z","author":"Wenedi","message":"Update fire_elementalist.json","changes":[{"entity_id":"fire_elementalist","file":"data/heroes/fire_elementalist.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","ultimate","description"],"old_value":"Captures a territory and inflicts Fire damage to any enemies in range.","new_value":"Captures a territory, inflicts Fire damage and imbues allied units with Fire."},{"path":["abilities","passive",2],"old_value":{"name":"Blazing Momentum","description":"After destroying an enemy with an Fire spell, all Fire spells recharge faster."},"new_value":{"name":"Blazing Momentum","description":"When you or your creatures kill a Burning enemy, recharge Elemental incantations."}},{"path":["abilities","passive",1],"old_value":{"name":"Fire Magic Mastery","description":"All Fire spells and Fire-infused creatures deal more damage."},"new_value":{"name":"Enduring Flame","description":"Damaging burning enemies heals the Fire Elementalist."}},{"path":["abilities","passive",0],"old_value":{"name":"Ignition Spark","description":"All Rank I Spells start with +1 Max Charge."},"new_value":{"name":"Ignition Spark","description":"Allied creatures near the Fire Elementalist capture Altar faster."}}]}]},{"commit":"baed37e32830c20f136feefe2f17e0b495f6e6f8","timestamp":"2026-02-05T17:39:16Z","author":"Wenedi","message":"Update swamp_witch.json","changes":[{"entity_id":"swamp_witch","file":"data/heroes/swamp_witch.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","passive",1],"old_value":{"name":"Brood Rite","description":"All Rank I Creatures start with +5 Max Charge."},"new_value":{"name":"Brood Rite","description":"When a Swamp Witch\u2019s creature is destroyed, her incantations and abilities recharge faster."}},{"path":["abilities","passive",0],"old_value":{"name":"Pact of Sacrifice","description":"When a Witch's creature is destroyed, her spell and ability recharge faster."},"new_value":{"name":"Pact of Sacrifice","description":"Killing Poisoned Creatures recharges Necromancy spells."}},{"path":["abilities","passive",2],"new_value":{"name":"Swarm Dominance","description":"The Swamp Witch has more Rank I population, but less Rank II and Rank III population.  "}}]}]},{"commit":"55bc3065f3264f4f27dd6ceee7fc32842cda12dc","timestamp":"2026-02-05T17:33:02Z","author":"Wenedi","message":"Update stone_shaman.json","changes":[{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"edit","diffs":[{"path":["abilities","primary","name"],"old_value":"Boulder Throw","new_value":"Mountain Staff"},{"path":["abilities","primary","description"],"old_value":"Hurls a massive boulder dealing 30 damage.","new_value":"Swing your catalyst to deal heavy melee damage and interrupt enemies."},{"path":["abilities","defense","name"],"old_value":"Wall of Stone","new_value":"Wind Shield"},{"path":["abilities","defense","description"],"old_value":"Creates a temporary wall blocking movement.","new_value":"Conjure a protective wind barrier that deals damage on contact."},{"path":["abilities","ultimate","name"],"old_value":"Earthquake","new_value":"Wall of Kamazad"},{"path":["abilities","ultimate","description"],"old_value":"Shakes the ground, slowing enemies and dealing area damage.","new_value":"Deploys a colossal wall capable of blocking Titans."},{"path":["abilities","passive",2],"old_value":{"name":"Rock Solid","description":"Cannot be knocked back by minor explosions."},"new_value":{"name":"Pathfinder","description":"While on the ground, the Shaman recharges Wild incantations much faster."}},{"path":["abilities","passive",1],"old_value":{"name":"Earth Attunement","description":"Regenerates health faster while standing on ground."},"new_value":{"name":"Child of the Titans","description":"Increases Rank II and Rank III population while reducing Rank I population."}},{"path":["abilities","passive",0],"old_value":{"name":"Stone Skin","description":"Reduces incoming physical damage by 5%."},"new_value":{"name":"Mountain\u2019s Favor","description":"The Stone Shaman\u2019s attacks deal double damage to buildings."}},{"path":["abilities","passive",3],"new_value":{"name":"Spellcaster Interruption","description":"Successfully hitting a Spellcaster twice interrupts their actions."}}]}]},{"commit":"e4fe5e1ecbc316c53e57767237b9b39e5c8270fe","timestamp":"2026-02-05T12:03:46-05:00","author":"TerribleTurtles","message":"feat: add intrinsic class field to heroes and updated assignments","changes":[{"entity_id":"astral_monk","file":"data/heroes/astral_monk.json","category":"heroes","change_type":"edit","diffs":[{"path":["class"],"new_value":"Duelist"}]},{"entity_id":"fire_elementalist","file":"data/heroes/fire_elementalist.json","category":"heroes","change_type":"edit","diffs":[{"path":["class"],"new_value":"Conqueror"}]},{"entity_id":"iron_sorcerer","file":"data/heroes/iron_sorcerer.json","category":"heroes","change_type":"edit","diffs":[{"path":["class"],"new_value":"Conqueror"}]},{"entity_id":"mystic_scribe","file":"data/heroes/mystic_scribe.json","category":"heroes","change_type":"edit","diffs":[{"path":["class"],"new_value":"Enchanter"}]},{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"edit","diffs":[{"path":["class"],"new_value":"Enchanter"}]},{"entity_id":"swamp_witch","file":"data/heroes/swamp_witch.json","category":"heroes","change_type":"edit","diffs":[{"path":["class"],"new_value":"Duelist"}]}]},{"commit":"e98cf8aa31b145d94cf3312cde1decc2192cdf99","timestamp":"2026-02-04T23:03:01-05:00","author":"TerribleTurtle","message":"Update gaia_beast.json","changes":[{"entity_id":"gaia_beast","file":"data/units/gaia_beast.json","category":"units","change_type":"edit","diffs":[{"path":["card_config","rank"],"removed":true}]}]},{"commit":"5c0ecf31a0a807c34983089e76326afc1970fcf4","timestamp":"2026-02-04T23:02:41-05:00","author":"TerribleTurtle","message":"Update thanatos.json","changes":[{"entity_id":"thanatos","file":"data/units/thanatos.json","category":"units","change_type":"edit","diffs":[{"path":["card_config","rank"],"removed":true}]}]},{"commit":"7f743e9c7d990efc7830a6c5041fa0419c847727","timestamp":"2026-02-04T22:28:19-05:00","author":"TerribleTurtle","message":"Update and rename light_recharge.json to small_recharge.json","changes":[{"entity_id":"small_recharge","file":"data/consumables/small_recharge.json","category":"consumables","change_type":"rename","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["value"],"new_value":25},{"path":["effect_type"],"new_value":"Charge_Refill"},{"path":["name"],"new_value":"Small Recharge"},{"path":["consumable_id"],"new_value":"small_recharge"},{"path":["ttl"],"new_value":30},{"path":["$schema"],"new_value":"../../schemas/v1/consumable.schema.json"}]}]},{"commit":"ee4eeed24ee131acf237e66d5463b4c67e7d59e2","timestamp":"2026-02-04T19:40:44-05:00","author":"TerribleTurtles","message":"removed chain lightning","changes":[{"entity_id":"chain_lightning","file":"data/units/chain_lightning.json","category":"units","change_type":"delete","diffs":[{"path":["game_version"],"removed":true},{"path":["category"],"removed":true},{"path":["max_targets"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["image_required"],"removed":true},{"path":["health"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["damage"],"removed":true},{"path":["name"],"removed":true},{"path":["tags"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["description"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["range"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["card_config"],"removed":true}]}]},{"commit":"5a687ddc5297d77fca3bdc1b8839c536d76b3a9a","timestamp":"2026-02-04T19:39:34-05:00","author":"TerribleTurtles","message":"removed healing rain","changes":[{"entity_id":"healing_rain","file":"data/units/healing_rain.json","category":"units","change_type":"delete","diffs":[{"path":["duration"],"removed":true},{"path":["name"],"removed":true},{"path":["card_config"],"removed":true},{"path":["health"],"removed":true},{"path":["damage"],"removed":true},{"path":["tags"],"removed":true},{"path":["description"],"removed":true},{"path":["range"],"removed":true},{"path":["target_mask"],"removed":true},{"path":["category"],"removed":true},{"path":["image_required"],"removed":true},{"path":["magic_school"],"removed":true},{"path":["heal_amount"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["game_version"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["tick_rate"],"removed":true},{"path":["radius"],"removed":true}]}]},{"commit":"9818edfc69efcf6cc86b37a06d3b25d391c48237","timestamp":"2026-02-04T03:24:56-05:00","author":"TerribleTurtles","message":"feat: normalize costs and implement initial charge mechanics","changes":[{"entity_id":"astral_nova","file":"data/units/astral_nova.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":0},{"path":["magic_school"],"new_value":"Astral"},{"path":["damage"],"new_value":600},{"path":["name"],"new_value":"Astral Nova"},{"path":["tags"],"new_value":["Astral","Nuke","AoE"]},{"path":["card_config"],"new_value":{"rank":"IV","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":60,"cast_time":3.0}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"Massive projectile that deals heavy damage on impact."},{"path":["target_mask"],"new_value":["Ground","Air","Enemy","Structure"]},{"path":["range"],"new_value":15},{"path":["entity_id"],"new_value":"astral_nova"},{"path":["radius"],"new_value":5.0}]},{"entity_id":"astral_shot","file":"data/units/astral_shot.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["max_targets"],"new_value":3},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":0},{"path":["magic_school"],"new_value":"Astral"},{"path":["damage"],"new_value":80},{"path":["name"],"new_value":"Astral Shot"},{"path":["tags"],"new_value":["Astral","Burst"]},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"Rapid burst of projectiles."},{"path":["target_mask"],"new_value":["Ground","Air","Enemy"]},{"path":["range"],"new_value":14},{"path":["entity_id"],"new_value":"astral_shot"},{"path":["card_config"],"new_value":{"rank":"II","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":20,"cast_time":0.8}}]},{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"Astral"},{"path":["card_config","initial_charges"],"new_value":3},{"path":["card_config","charge_time"],"new_value":40},{"path":["movement_type"],"old_value":"Ground","new_value":"Stationary"},{"path":["description"],"old_value":"A mystical tower that channels astral energy to zap nearby enemies.","new_value":"Heavy defensive tower that targets enemies at medium range."},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"ballista","file":"data/units/ballista.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"War"},{"path":["card_config","initial_charges"],"new_value":5},{"path":["card_config","charge_time"],"new_value":20},{"path":["movement_type"],"old_value":"Ground","new_value":"Stationary"},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"chain_lightning","file":"data/units/chain_lightning.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["max_targets"],"new_value":3},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":0},{"path":["magic_school"],"new_value":"Lightning"},{"path":["damage"],"new_value":150},{"path":["name"],"new_value":"Chain Lightning"},{"path":["tags"],"new_value":["Lightning","Chain"]},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"Arcs between enemies, prioritizing those closest to the primary target."},{"path":["target_mask"],"new_value":["Ground","Air","Enemy"]},{"path":["range"],"new_value":7},{"path":["entity_id"],"new_value":"chain_lightning"},{"path":["card_config"],"new_value":{"rank":"II","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":20,"cast_time":0.5}}]},{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"Dark"},{"path":["card_config","initial_charges"],"new_value":3},{"path":["card_config","charge_time"],"new_value":40},{"path":["movement_type"],"old_value":"Ground","new_value":"Stationary"},{"path":["description"],"old_value":"A dark mausoleum from which the restless dead emerge.","new_value":"Shrine that continuously summons new Skeleton Warriors."},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"Holy"},{"path":["card_config","initial_charges"],"new_value":5},{"path":["card_config","charge_time"],"new_value":20},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"Elemental"},{"path":["card_config","initial_charges"],"new_value":5},{"path":["card_config","charge_time"],"new_value":20},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"earthquake","file":"data/units/earthquake.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":0},{"path":["magic_school"],"new_value":"Elemental"},{"path":["damage"],"new_value":300},{"path":["name"],"new_value":"Earthquake"},{"path":["tags"],"new_value":["Earth","AoE","Siege"]},{"path":["card_config"],"new_value":{"rank":"III","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":40,"cast_time":2.0}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"Ground shockwave that damages structures and staggers creatures."},{"path":["target_mask"],"new_value":["Ground","Enemy","Structure"]},{"path":["range"],"new_value":0},{"path":["entity_id"],"new_value":"earthquake"},{"path":["radius"],"new_value":10.0}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"Astral"},{"path":["card_config","initial_charges"],"new_value":10},{"path":["card_config","charge_time"],"new_value":10},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"fire_rain","file":"data/units/fire_rain.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["duration"],"new_value":5.0},{"path":["health"],"new_value":0},{"path":["magic_school"],"new_value":"Elemental"},{"path":["damage"],"new_value":100},{"path":["name"],"new_value":"Fire Rain"},{"path":["tags"],"new_value":["Fire","AoE","DoT"]},{"path":["card_config"],"new_value":{"rank":"IV","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":60,"cast_time":2.5}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"Fire projectiles that deal continuous damage over a wide area."},{"path":["target_mask"],"new_value":["Ground","Enemy","Structure"]},{"path":["tick_rate"],"new_value":0.5},{"path":["range"],"new_value":20},{"path":["entity_id"],"new_value":"fire_rain"},{"path":["radius"],"new_value":8.0}]},{"entity_id":"fire_ray","file":"data/units/fire_ray.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["duration"],"new_value":2.0},{"path":["health"],"new_value":0},{"path":["magic_school"],"new_value":"Elemental"},{"path":["damage"],"new_value":100},{"path":["name"],"new_value":"Fire Ray"},{"path":["tags"],"new_value":["Fire","Beam","SingleTarget"]},{"path":["card_config"],"new_value":{"rank":"I","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":10,"cast_time":0.5}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"Focused beam that deals low Fire Damage."},{"path":["target_mask"],"new_value":["Ground","Air","Enemy"]},{"path":["tick_rate"],"new_value":0.2},{"path":["range"],"new_value":12},{"path":["entity_id"],"new_value":"fire_ray"},{"path":["radius"],"new_value":1.0}]},{"entity_id":"fireball","file":"data/units/fireball.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":0},{"path":["magic_school"],"new_value":"Elemental"},{"path":["damage"],"new_value":250},{"path":["name"],"new_value":"Fireball"},{"path":["tags"],"new_value":["Fire","AoE","Destruction"]},{"path":["card_config"],"new_value":{"rank":"III","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":40,"cast_time":1.0}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"Explodes in a fiery ball, dealing damage to all enemies in the area."},{"path":["target_mask"],"new_value":["Ground","Air","Structure","Enemy"]},{"path":["range"],"new_value":8},{"path":["entity_id"],"new_value":"fireball"},{"path":["radius"],"new_value":3.0}]},{"entity_id":"flame_surge","file":"data/units/flame_surge.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":0},{"path":["magic_school"],"new_value":"War"},{"path":["damage"],"new_value":200},{"path":["name"],"new_value":"Flame Surge"},{"path":["tags"],"new_value":["Fire","Buff","AoE"]},{"path":["card_config"],"new_value":{"rank":"III","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":40,"cast_time":1.0}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"Fire pulse that burns enemies and infuses allies."},{"path":["target_mask"],"new_value":["Ground","Enemy","Ally"]},{"path":["range"],"new_value":0},{"path":["entity_id"],"new_value":"flame_surge"},{"path":["radius"],"new_value":5.0}]},{"entity_id":"frost_surge","file":"data/units/frost_surge.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":0},{"path":["magic_school"],"new_value":"Frost"},{"path":["damage"],"new_value":150},{"path":["name"],"new_value":"Frost Surge"},{"path":["tags"],"new_value":["Frost","Control","Buff"]},{"path":["card_config"],"new_value":{"rank":"III","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":40,"cast_time":1.0}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"Ice pulse that freezes enemies and infuses nearby allies."},{"path":["target_mask"],"new_value":["Ground","Enemy","Ally"]},{"path":["range"],"new_value":0},{"path":["entity_id"],"new_value":"frost_surge"},{"path":["radius"],"new_value":6.0}]},{"entity_id":"gaia_beast","file":"data/units/gaia_beast.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"Elemental"},{"path":["card_config","initial_charges"],"new_value":0},{"path":["card_config","charge_time"],"new_value":120},{"path":["card_config","cost_charges"],"old_value":100,"new_value":1}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"War"},{"path":["card_config","initial_charges"],"new_value":3},{"path":["card_config","charge_time"],"new_value":40},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"grand_lightning","file":"data/units/grand_lightning.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":0},{"path":["magic_school"],"new_value":"Lightning"},{"path":["damage"],"new_value":800},{"path":["name"],"new_value":"Grand Lightning"},{"path":["tags"],"new_value":["Lightning","Nuke","SingleTarget"]},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"Thunderstrike that deals extreme Lightning damage to a target."},{"path":["target_mask"],"new_value":["Ground","Air","Enemy","Structure"]},{"path":["range"],"new_value":18},{"path":["entity_id"],"new_value":"grand_lightning"},{"path":["card_config"],"new_value":{"rank":"IV","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":60,"cast_time":2.0}}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"Frost"},{"path":["card_config","initial_charges"],"new_value":10},{"path":["card_config","charge_time"],"new_value":10},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"Frost"},{"path":["card_config","initial_charges"],"new_value":10},{"path":["card_config","charge_time"],"new_value":10},{"path":["movement_speed"],"old_value":3,"new_value":0},{"path":["movement_type"],"old_value":"Ground","new_value":"Stationary"},{"path":["description"],"old_value":"A high crag where harpies roost and train.","new_value":"Nest that continuously spawns new Harpies."},{"path":["card_config","cost_population"],"old_value":0,"new_value":1},{"path":["tags",0],"removed":true,"old_value":"military"}]},{"entity_id":"heal_ray","file":"data/units/heal_ray.json","category":"units","change_type":"add","diffs":[{"path":["duration"],"new_value":3.0},{"path":["name"],"new_value":"Heal Ray"},{"path":["card_config"],"new_value":{"rank":"I","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":10,"cast_time":0.5}},{"path":["health"],"new_value":0},{"path":["damage"],"new_value":0},{"path":["tags"],"new_value":["Holy","Heal","Beam"]},{"path":["description"],"new_value":"Healing ray can be aimed at the ground to restore allies in the area."},{"path":["range"],"new_value":12},{"path":["target_mask"],"new_value":["Ground","Ally"]},{"path":["category"],"new_value":"Spell"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Holy"},{"path":["heal_amount"],"new_value":50},{"path":["entity_id"],"new_value":"heal_ray"},{"path":["game_version"],"new_value":"0.0.1"},{"path":["attack_speed"],"new_value":0},{"path":["movement_speed"],"new_value":0},{"path":["tick_rate"],"new_value":0.5},{"path":["radius"],"new_value":2.0}]},{"entity_id":"healing_rain","file":"data/units/healing_rain.json","category":"units","change_type":"add","diffs":[{"path":["duration"],"new_value":6.0},{"path":["name"],"new_value":"Healing Rain"},{"path":["card_config"],"new_value":{"rank":"II","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":20,"cast_time":1.5}},{"path":["health"],"new_value":0},{"path":["damage"],"new_value":0},{"path":["tags"],"new_value":["Water","Healing","AoE"]},{"path":["description"],"new_value":"Calls down soothing rain that heals allies over time."},{"path":["range"],"new_value":10},{"path":["target_mask"],"new_value":["Ground","Ally"]},{"path":["category"],"new_value":"Spell"},{"path":["image_required"],"new_value":true},{"path":["magic_school"],"new_value":"Holy"},{"path":["heal_amount"],"new_value":20},{"path":["entity_id"],"new_value":"healing_rain"},{"path":["game_version"],"new_value":"0.0.1"},{"path":["attack_speed"],"new_value":0},{"path":["movement_speed"],"new_value":0},{"path":["tick_rate"],"new_value":1.0},{"path":["radius"],"new_value":5.0}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"War"},{"path":["card_config","initial_charges"],"new_value":1},{"path":["card_config","charge_time"],"new_value":60},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"Dark"},{"path":["card_config","initial_charges"],"new_value":5},{"path":["card_config","charge_time"],"new_value":20},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"War"},{"path":["card_config","initial_charges"],"new_value":10},{"path":["card_config","charge_time"],"new_value":10},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"War"},{"path":["card_config","initial_charges"],"new_value":3},{"path":["card_config","charge_time"],"new_value":40},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"poison_grenade","file":"data/units/poison_grenade.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["duration"],"new_value":8.0},{"path":["health"],"new_value":0},{"path":["magic_school"],"new_value":"Dark"},{"path":["damage"],"new_value":50},{"path":["name"],"new_value":"Poison Grenade"},{"path":["tags"],"new_value":["Poison","AoE","DoT"]},{"path":["card_config"],"new_value":{"rank":"III","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":40,"cast_time":1.0}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"Grenade that creates a Poison cloud over the target area."},{"path":["target_mask"],"new_value":["Ground","Enemy"]},{"path":["tick_rate"],"new_value":1.0},{"path":["range"],"new_value":10},{"path":["entity_id"],"new_value":"poison_grenade"},{"path":["radius"],"new_value":4.0}]},{"entity_id":"rampart","file":"data/units/rampart.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"War"},{"path":["card_config","initial_charges"],"new_value":5},{"path":["card_config","charge_time"],"new_value":20},{"path":["movement_type"],"old_value":"Ground","new_value":"Stationary"},{"path":["card_config","cost_population"],"old_value":0,"new_value":1},{"path":["card_config","cost_charges"],"old_value":2,"new_value":1}]},{"entity_id":"resurrection","file":"data/units/resurrection.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":0},{"path":["magic_school"],"new_value":"Holy"},{"path":["damage"],"new_value":0},{"path":["name"],"new_value":"Resurrection"},{"path":["tags"],"new_value":["Holy","Revive"]},{"path":["card_config"],"new_value":{"rank":"IV","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":60,"cast_time":4.0}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"Magic circle that resurrects creatures with partial health."},{"path":["target_mask"],"new_value":["Ground","Ally","Deceased"]},{"path":["range"],"new_value":15},{"path":["entity_id"],"new_value":"resurrection"},{"path":["radius"],"new_value":6.0}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"War"},{"path":["card_config","initial_charges"],"new_value":10},{"path":["card_config","charge_time"],"new_value":10},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"Dark"},{"path":["card_config","initial_charges"],"new_value":10},{"path":["card_config","charge_time"],"new_value":10},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"sacrifice","file":"data/units/sacrifice.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":0},{"path":["magic_school"],"new_value":"Dark"},{"path":["damage"],"new_value":9999},{"path":["name"],"new_value":"Sacrifice"},{"path":["tags"],"new_value":["Dark","Ritual","Recall"]},{"path":["card_config"],"new_value":{"rank":"I","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":10,"cast_time":1.0}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"Dark ritual that recalls allies to recharge summons."},{"path":["target_mask"],"new_value":["Ground","Ally"]},{"path":["range"],"new_value":5},{"path":["entity_id"],"new_value":"sacrifice"},{"path":["radius"],"new_value":4.0}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"Dark"},{"path":["card_config","initial_charges"],"new_value":10},{"path":["card_config","charge_time"],"new_value":10},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"War"},{"path":["card_config","initial_charges"],"new_value":3},{"path":["card_config","charge_time"],"new_value":40},{"path":["card_config","cost_population"],"old_value":4,"new_value":1}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"Elemental"},{"path":["card_config","initial_charges"],"new_value":3},{"path":["card_config","charge_time"],"new_value":40},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"thanatos","file":"data/units/thanatos.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"Dark"},{"path":["card_config","initial_charges"],"new_value":0},{"path":["card_config","charge_time"],"new_value":120},{"path":["card_config","cost_charges"],"old_value":100,"new_value":1}]},{"entity_id":"thunder_ray","file":"data/units/thunder_ray.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["duration"],"new_value":2.0},{"path":["health"],"new_value":0},{"path":["magic_school"],"new_value":"Lightning"},{"path":["damage"],"new_value":100},{"path":["name"],"new_value":"Thunder Ray"},{"path":["tags"],"new_value":["Lightning","Beam","SingleTarget"]},{"path":["card_config"],"new_value":{"rank":"I","cost_population":0,"cost_charges":1,"initial_charges":1,"charge_time":10,"cast_time":0.5}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"Focused beam that deals low Lightning Damage."},{"path":["target_mask"],"new_value":["Ground","Air","Enemy"]},{"path":["tick_rate"],"new_value":0.2},{"path":["range"],"new_value":12},{"path":["entity_id"],"new_value":"thunder_ray"},{"path":["radius"],"new_value":1.0}]},{"entity_id":"wolven_hunter","file":"data/units/wolven_hunter.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"War"},{"path":["card_config","initial_charges"],"new_value":5},{"path":["card_config","charge_time"],"new_value":20},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["magic_school"],"new_value":"Elemental"},{"path":["card_config","initial_charges"],"new_value":5},{"path":["card_config","charge_time"],"new_value":20},{"path":["card_config","cost_population"],"old_value":0,"new_value":1}]}]},{"commit":"8bff6b02e40d36ccef6140f76bfd5f0268dc35d4","timestamp":"2026-02-04T01:18:19-05:00","author":"TerribleTurtles","message":"moveed and added context to the discord links, added beta warning to readme","changes":[{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"edit","diffs":[{"path":["card_config","rank"],"old_value":"II","new_value":"III"}]},{"entity_id":"rampart","file":"data/units/rampart.json","category":"units","change_type":"edit","diffs":[{"path":["card_config","rank"],"old_value":"I","new_value":"II"}]}]},{"commit":"1240160624b688df0cf9020980f7134c6fa895b0","timestamp":"2026-02-04T01:09:37-05:00","author":"TerribleTurtles","message":"feat: add entity stubs for Steam Tank, Ballista, Rampart, Astral Tower, and Crypt","changes":[{"entity_id":"astral_tower","file":"data/units/astral_tower.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Building"},{"path":["attack_speed"],"new_value":1.2},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":1800},{"path":["damage"],"new_value":90},{"path":["tags"],"new_value":["defensive","magic","energy"]},{"path":["name"],"new_value":"Astral Tower"},{"path":["collision_radius"],"new_value":35},{"path":["card_config"],"new_value":{"rank":"III","cost_population":0,"cost_charges":1,"cast_time":3.5}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"A mystical tower that channels astral energy to zap nearby enemies."},{"path":["range"],"new_value":18},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"astral_tower"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"ballista","file":"data/units/ballista.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Building"},{"path":["attack_speed"],"new_value":0.4},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":1200},{"path":["damage"],"new_value":250},{"path":["tags"],"new_value":["defensive","siege","piercing"]},{"path":["name"],"new_value":"Ballista"},{"path":["collision_radius"],"new_value":30},{"path":["card_config"],"new_value":{"rank":"II","cost_population":0,"cost_charges":1,"cast_time":3.0}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"A stationary siege engine that launches massive bolts at distant targets."},{"path":["range"],"new_value":30},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"ballista"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"crypt","file":"data/units/crypt.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Building"},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":2000},{"path":["damage"],"new_value":0},{"path":["tags"],"new_value":["undead","spawner","structure"]},{"path":["name"],"new_value":"Crypt"},{"path":["collision_radius"],"new_value":40},{"path":["card_config"],"new_value":{"rank":"II","cost_population":0,"cost_charges":1,"cast_time":2.5}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"A dark mausoleum from which the restless dead emerge."},{"path":["range"],"new_value":0},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"crypt"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"rampart","file":"data/units/rampart.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Building"},{"path":["attack_speed"],"new_value":0},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":5000},{"path":["damage"],"new_value":0},{"path":["tags"],"new_value":["defensive","structure","fortification"]},{"path":["name"],"new_value":"Rampart"},{"path":["collision_radius"],"new_value":50},{"path":["card_config"],"new_value":{"rank":"I","cost_population":0,"cost_charges":2,"cast_time":1.0}},{"path":["movement_speed"],"new_value":0},{"path":["description"],"new_value":"A reinforced wall section designed to hold back enemy waves."},{"path":["range"],"new_value":0},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"rampart"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"steam_tank","file":"data/units/steam_tank.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":0.6},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":2500},{"path":["damage"],"new_value":120},{"path":["tags"],"new_value":["mechanical","siege","ranged"]},{"path":["name"],"new_value":"Steam Tank"},{"path":["collision_radius"],"new_value":45},{"path":["card_config"],"new_value":{"rank":"III","cost_population":4,"cost_charges":1,"cast_time":4.0}},{"path":["movement_speed"],"new_value":180},{"path":["description"],"new_value":"A heavily armored steam-powered war machine capable of crushing infantry and breaching walls."},{"path":["range"],"new_value":22},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"steam_tank"},{"path":["movement_type"],"new_value":"Ground"}]}]},{"commit":"4cc1d2a28831a41b4fa4f9c721afcace26db15f6","timestamp":"2026-02-04T00:03:09-05:00","author":"TerribleTurtles","message":"feat: add consumable stubs and update units/schemas","changes":[{"entity_id":"light_heal","file":"data/consumables/light_heal.json","category":"consumables","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["value"],"new_value":25},{"path":["effect_type"],"new_value":"Heal"},{"path":["name"],"new_value":"Light Heal"},{"path":["consumable_id"],"new_value":"light_heal"},{"path":["ttl"],"new_value":30},{"path":["$schema"],"new_value":"../../schemas/v1/consumable.schema.json"}]},{"entity_id":"light_recharge","file":"data/consumables/light_recharge.json","category":"consumables","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["value"],"new_value":25},{"path":["effect_type"],"new_value":"Charge_Refill"},{"path":["name"],"new_value":"Light Recharge"},{"path":["consumable_id"],"new_value":"light_recharge"},{"path":["ttl"],"new_value":30},{"path":["$schema"],"new_value":"../../schemas/v1/consumable.schema.json"}]},{"entity_id":"medium_heal","file":"data/consumables/medium_heal.json","category":"consumables","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["value"],"new_value":50},{"path":["effect_type"],"new_value":"Heal"},{"path":["name"],"new_value":"Medium Heal"},{"path":["consumable_id"],"new_value":"medium_heal"},{"path":["ttl"],"new_value":30},{"path":["$schema"],"new_value":"../../schemas/v1/consumable.schema.json"}]},{"entity_id":"medium_recharge","file":"data/consumables/medium_recharge.json","category":"consumables","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["value"],"new_value":50},{"path":["effect_type"],"new_value":"Charge_Refill"},{"path":["name"],"new_value":"Medium Recharge"},{"path":["consumable_id"],"new_value":"medium_recharge"},{"path":["ttl"],"new_value":30},{"path":["$schema"],"new_value":"../../schemas/v1/consumable.schema.json"}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["heal_amount"],"new_value":150},{"path":["health"],"old_value":225,"new_value":2250}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":650,"new_value":6500}]},{"entity_id":"earthquake","file":"data/units/earthquake.json","category":"units","change_type":"delete","diffs":[{"path":["game_version"],"removed":true},{"path":["category"],"removed":true},{"path":["attack_speed"],"removed":true},{"path":["health"],"removed":true},{"path":["damage"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["card_config"],"removed":true},{"path":["movement_speed"],"removed":true},{"path":["description"],"removed":true},{"path":["range"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true},{"path":["movement_type"],"removed":true}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":100,"new_value":1000},{"path":["range"],"old_value":1,"new_value":25},{"path":["movement_type"],"old_value":"Ground","new_value":"Fly"}]},{"entity_id":"gaia_beast","file":"data/units/gaia_beast.json","category":"units","change_type":"edit","diffs":[{"path":["passive_health_regen"],"new_value":50},{"path":["health"],"old_value":1000,"new_value":20000}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":150,"new_value":1500}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":100,"new_value":1000},{"path":["movement_type"],"old_value":"Ground","new_value":"Fly"}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":100,"new_value":10000}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":85,"new_value":850},{"path":["range"],"old_value":1,"new_value":35}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":230,"new_value":2300}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":220,"new_value":2200},{"path":["range"],"old_value":1,"new_value":15}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":85,"new_value":850}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":200,"new_value":2000}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":210,"new_value":2100},{"path":["range"],"old_value":1,"new_value":55}]},{"entity_id":"thanatos","file":"data/units/thanatos.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":1000,"new_value":15000}]},{"entity_id":"wolven_hunter","file":"data/units/wolven_hunter.json","category":"units","change_type":"edit","diffs":[{"path":["range"],"old_value":1,"new_value":750}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["health"],"old_value":220,"new_value":2200},{"path":["range"],"old_value":1,"new_value":35},{"path":["movement_type"],"old_value":"Ground","new_value":"Fly"}]}]},{"commit":"0c37196ca573c594de07491e9c20aa4fa28e5aac","timestamp":"2026-02-03T23:41:33-05:00","author":"TerribleTurtles","message":"feat(hero): update hero schema structure and add 5 heroes","changes":[{"entity_id":"astral_monk","file":"data/heroes/astral_monk.json","category":"heroes","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["flight_speed"],"new_value":0},{"path":["abilities"],"new_value":{"passive":[{"name":"Mantra of Power","description":"When the Astral Monk kills a Spellcaster with a spell, she gains a charge of that spell."},{"name":"Last Light","description":"Spells deal increased damage when the target is under half health."},{"name":"Arcane Alignment","description":"All Rank III Spells start with +1 Max Charge."}],"primary":{"name":"Astral Fists","description":"Pierces through enemies with colossal astral fists."},"defense":{"name":"Veil Shift","description":"Turns invisible and move faster."},"ultimate":{"name":"Dimension of Varani","description":"Conjures a time bubble that freezes enemy projectiles and creatures inside it."}}},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":600},{"path":["health_regen_rate"],"new_value":1.0},{"path":["attack_damage_summoner"],"new_value":40},{"path":["name"],"new_value":"Astral Monk"},{"path":["hero_id"],"new_value":"astral_monk"},{"path":["movement_speed"],"new_value":3},{"path":["attack_damage_minion"],"new_value":40},{"path":["regen_delay"],"new_value":5.0},{"path":["$schema"],"new_value":"../../schemas/v1/hero.schema.json"}]},{"entity_id":"fire_elementalist","file":"data/heroes/fire_elementalist.json","category":"heroes","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["flight_speed"],"new_value":0},{"path":["abilities"],"new_value":{"passive":[{"name":"Ignition Spark","description":"All Rank I Spells start with +1 Max Charge."},{"name":"Fire Magic Mastery","description":"All Fire spells and Fire-infused creatures deal more damage."},{"name":"Blazing Momentum","description":"After destroying an enemy with an Fire spell, all Fire spells recharge faster."}],"primary":{"name":"Flame Strikes","description":"Burns enemies with powerful Fire attacks."},"defense":{"name":"Fiery Dash","description":"Performs an invincible dash in a chosen direction."},"ultimate":{"name":"Burning Conquest","description":"Captures a territory and inflicts Fire damage to any enemies in range."}}},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":600},{"path":["health_regen_rate"],"new_value":1.0},{"path":["attack_damage_summoner"],"new_value":40},{"path":["name"],"new_value":"Fire Elementalist"},{"path":["hero_id"],"new_value":"fire_elementalist"},{"path":["movement_speed"],"new_value":3},{"path":["attack_damage_minion"],"new_value":40},{"path":["regen_delay"],"new_value":5.0},{"path":["$schema"],"new_value":"../../schemas/v1/hero.schema.json"}]},{"entity_id":"iron_sorcerer","file":"data/heroes/iron_sorcerer.json","category":"heroes","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["flight_speed"],"new_value":0},{"path":["abilities"],"new_value":{"passive":[{"name":"Forges of Valm","description":"Creatures spawned from Buildings have significantly more health."},{"name":"Scourge of War","description":"All Rank III Buildings start with +1 Max Charge."}],"primary":{"name":"Twin Strike","description":"Strike with powerful mid-range attacks that interrupt enemies."},"defense":{"name":"Rune Shield","description":"Raise a shield that protects allies and reflects attacks."},"ultimate":{"name":"Iron Tempest","description":"Unleash a metal vortex that deals heavy damage along its path."}}},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":600},{"path":["health_regen_rate"],"new_value":1.0},{"path":["attack_damage_summoner"],"new_value":40},{"path":["name"],"new_value":"Iron Sorcerer"},{"path":["hero_id"],"new_value":"iron_sorcerer"},{"path":["movement_speed"],"new_value":3},{"path":["attack_damage_minion"],"new_value":40},{"path":["regen_delay"],"new_value":5.0},{"path":["$schema"],"new_value":"../../schemas/v1/hero.schema.json"}]},{"entity_id":"mystic_scribe","file":"data/heroes/mystic_scribe.json","category":"heroes","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["flight_speed"],"new_value":0},{"path":["abilities"],"new_value":{"passive":[{"name":"Holy Magic Mastery","description":"All Holy spells recharge faster."},{"name":"Thousand Favors","description":"Healing recharges Rank I and II creatures."},{"name":"Echo of Mercy","description":"When the Mystic Scribe heals an ally, she is healed for the same amount."}],"primary":{"name":"Brush Strike","description":"Strike with enchanted ink to damage enemies and boost allies\u2019 Max HP."},"defense":{"name":"Scroll Barrier","description":"Creates a barrier that absorbs projectiles and reduces all damage."},"ultimate":{"name":"Seal of Immortality","description":"Mark the ground with a massive healing seal."}}},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":600},{"path":["health_regen_rate"],"new_value":1.0},{"path":["attack_damage_summoner"],"new_value":40},{"path":["name"],"new_value":"Mystic Scribe"},{"path":["hero_id"],"new_value":"mystic_scribe"},{"path":["movement_speed"],"new_value":3},{"path":["attack_damage_minion"],"new_value":40},{"path":["regen_delay"],"new_value":5.0},{"path":["$schema"],"new_value":"../../schemas/v1/hero.schema.json"}]},{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"edit","diffs":[{"path":["image_required"],"new_value":true},{"path":["abilities","passive"],"old_value":"stone_skin","new_value":[{"name":"Stone Skin","description":"Reduces incoming physical damage by 5%."},{"name":"Earth Attunement","description":"Regenerates health faster while standing on ground."},{"name":"Rock Solid","description":"Cannot be knocked back by minor explosions."}]},{"path":["abilities","primary"],"old_value":"Unknown Primary","new_value":{"name":"Boulder Throw","description":"Hurls a massive boulder dealing 30 damage."}},{"path":["abilities","defense"],"old_value":"Unknown Defense","new_value":{"name":"Wall of Stone","description":"Creates a temporary wall blocking movement."}},{"path":["abilities","ultimate"],"old_value":"Unknown Ultimate","new_value":{"name":"Earthquake","description":"Shakes the ground, slowing enemies and dealing area damage."}}]},{"entity_id":"swamp_witch","file":"data/heroes/swamp_witch.json","category":"heroes","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["flight_speed"],"new_value":0},{"path":["abilities"],"new_value":{"passive":[{"name":"Pact of Sacrifice","description":"When a Witch's creature is destroyed, her spell and ability recharge faster."},{"name":"Brood Rite","description":"All Rank I Creatures start with +5 Max Charge."}],"primary":{"name":"Poison Strike","description":"Fire a barrage of projectiles that deal Poison damage."},"defense":{"name":"Witchslip","description":"Performs an invincible dash in a chosen direction."},"ultimate":{"name":"Dark Ascension","description":"Unleashes a demonic form that boosts all spell damage."}}},{"path":["image_required"],"new_value":true},{"path":["health"],"new_value":600},{"path":["health_regen_rate"],"new_value":1.0},{"path":["attack_damage_summoner"],"new_value":40},{"path":["name"],"new_value":"Swamp Witch"},{"path":["hero_id"],"new_value":"swamp_witch"},{"path":["movement_speed"],"new_value":3},{"path":["attack_damage_minion"],"new_value":40},{"path":["regen_delay"],"new_value":5.0},{"path":["$schema"],"new_value":"../../schemas/v1/hero.schema.json"}]}]},{"commit":"086977e5a80399519c7b7a8f43a08c91ca003037","timestamp":"2026-02-03T20:59:02-05:00","author":"TerribleTurtles","message":"Refactor: Unified Entity Model - Merged Cards into Units, updated schemas and scripts","changes":[{"entity_id":"card_dryad_II","file":"data/cards/card_dryad_II.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_earth_golem_II","file":"data/cards/card_earth_golem_II.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_earthquake_I","file":"data/cards/card_earthquake_I.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_faerie_I","file":"data/cards/card_faerie_I.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_gaia_beast_III","file":"data/cards/card_gaia_beast_III.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_giant_shielder_III","file":"data/cards/card_giant_shielder_III.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_harpy_I","file":"data/cards/card_harpy_I.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_harpy_nest_I","file":"data/cards/card_harpy_nest_I.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_juggernaut_IV","file":"data/cards/card_juggernaut_IV.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_lich_II","file":"data/cards/card_lich_II.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_lizard_archer_I","file":"data/cards/card_lizard_archer_I.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_ogre_III","file":"data/cards/card_ogre_III.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_rocket_soldier_I","file":"data/cards/card_rocket_soldier_I.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_ruin_spider_I","file":"data/cards/card_ruin_spider_I.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_skeleton_warrior_I","file":"data/cards/card_skeleton_warrior_I.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_stone_behemoth_III","file":"data/cards/card_stone_behemoth_III.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_thanatos_III","file":"data/cards/card_thanatos_III.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_wolven_hunter_II","file":"data/cards/card_wolven_hunter_II.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"card_wyvern_II","file":"data/cards/card_wyvern_II.json","category":"cards","change_type":"delete","diffs":[{"path":["cast_time"],"removed":true},{"path":["game_version"],"removed":true},{"path":["card_id"],"removed":true},{"path":["rank"],"removed":true},{"path":["cost_population"],"removed":true},{"path":["name"],"removed":true},{"path":["cost_charges"],"removed":true},{"path":["$schema"],"removed":true},{"path":["entity_id"],"removed":true}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"II","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"II","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"earthquake","file":"data/units/earthquake.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"I","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"I","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"gaia_beast","file":"data/units/gaia_beast.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"III","cost_population":0,"cost_charges":100,"cast_time":2.0}}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"III","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"I","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"I","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"IV","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"II","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"I","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"III","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"I","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"I","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"I","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"III","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"thanatos","file":"data/units/thanatos.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"III","cost_population":0,"cost_charges":100,"cast_time":2.0}}]},{"entity_id":"wolven_hunter","file":"data/units/wolven_hunter.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"II","cost_population":0,"cost_charges":1,"cast_time":2.0}}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"edit","diffs":[{"path":["card_config"],"new_value":{"rank":"II","cost_population":0,"cost_charges":1,"cast_time":2.0}}]}]},{"commit":"6310e1870b42dbaacd4e5a497ecf944e01f86239","timestamp":"2026-02-03T20:40:12-05:00","author":"TerribleTurtles","message":"feat: v1.1 Architecture Overhaul - Consolidated Schemas & Migrated Data","changes":[{"entity_id":"harpy_nest","file":"data/buildings/harpy_nest.json","category":"buildings","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["build_time"],"removed":true},{"path":["meta"],"removed":true},{"path":["image_required"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["size"],"removed":true},{"path":["classification"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"card_dryad_II","file":"data/cards/card_dryad_II.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_dryad_II"},{"path":["rank"],"new_value":"II"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Dryad Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"dryad"}]},{"entity_id":"card_earth_golem_II","file":"data/cards/card_earth_golem_II.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_earth_golem_II"},{"path":["rank"],"new_value":"II"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Earth Golem Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"earth_golem"}]},{"entity_id":"card_earthquake_I","file":"data/cards/card_earthquake_I.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_earthquake_I"},{"path":["rank"],"new_value":"I"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Earthquake Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"earthquake"}]},{"entity_id":"card_faerie_I","file":"data/cards/card_faerie_I.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_faerie_I"},{"path":["rank"],"new_value":"I"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Faerie Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"faerie"}]},{"entity_id":"card_gaia_beast_III","file":"data/cards/card_gaia_beast_III.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_gaia_beast_III"},{"path":["rank"],"new_value":"III"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Gaia Beast Card"},{"path":["cost_charges"],"new_value":100},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"gaia_beast"}]},{"entity_id":"card_giant_shielder_III","file":"data/cards/card_giant_shielder_III.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_giant_shielder_III"},{"path":["rank"],"new_value":"III"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Giant Shielder Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"giant_shielder"}]},{"entity_id":"card_harpy_I","file":"data/cards/card_harpy_I.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_harpy_I"},{"path":["rank"],"new_value":"I"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Harpy Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"harpy"}]},{"entity_id":"card_harpy_nest_I","file":"data/cards/card_harpy_nest_I.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_harpy_nest_I"},{"path":["rank"],"new_value":"I"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Harpy Nest Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"harpy_nest"}]},{"entity_id":"card_juggernaut_IV","file":"data/cards/card_juggernaut_IV.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_juggernaut_IV"},{"path":["rank"],"new_value":"IV"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Juggernaut Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"juggernaut"}]},{"entity_id":"card_lich_II","file":"data/cards/card_lich_II.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_lich_II"},{"path":["rank"],"new_value":"II"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Lich Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"lich"}]},{"entity_id":"card_lizard_archer_I","file":"data/cards/card_lizard_archer_I.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_lizard_archer_I"},{"path":["rank"],"new_value":"I"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Lizard Archer Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"lizard_archer"}]},{"entity_id":"card_ogre_III","file":"data/cards/card_ogre_III.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_ogre_III"},{"path":["rank"],"new_value":"III"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Ogre Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"ogre"}]},{"entity_id":"card_rocket_soldier_I","file":"data/cards/card_rocket_soldier_I.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_rocket_soldier_I"},{"path":["rank"],"new_value":"I"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Rocket Soldier Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"rocket_soldier"}]},{"entity_id":"card_ruin_spider_I","file":"data/cards/card_ruin_spider_I.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_ruin_spider_I"},{"path":["rank"],"new_value":"I"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Ruin Spider Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"ruin_spider"}]},{"entity_id":"card_skeleton_warrior_I","file":"data/cards/card_skeleton_warrior_I.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_skeleton_warrior_I"},{"path":["rank"],"new_value":"I"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Skeleton Warrior Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"skeleton_warrior"}]},{"entity_id":"card_stone_behemoth_III","file":"data/cards/card_stone_behemoth_III.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_stone_behemoth_III"},{"path":["rank"],"new_value":"III"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Stone Behemoth Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"stone_behemoth"}]},{"entity_id":"card_thanatos_III","file":"data/cards/card_thanatos_III.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_thanatos_III"},{"path":["rank"],"new_value":"III"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Thanatos Card"},{"path":["cost_charges"],"new_value":100},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"thanatos"}]},{"entity_id":"card_wolven_hunter_II","file":"data/cards/card_wolven_hunter_II.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_wolven_hunter_II"},{"path":["rank"],"new_value":"II"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Wolven Hunter Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"wolven_hunter"}]},{"entity_id":"card_wyvern_II","file":"data/cards/card_wyvern_II.json","category":"cards","change_type":"add","diffs":[{"path":["cast_time"],"new_value":2.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["card_id"],"new_value":"card_wyvern_II"},{"path":["rank"],"new_value":"II"},{"path":["cost_population"],"new_value":0},{"path":["name"],"new_value":"Wyvern Card"},{"path":["cost_charges"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/card.schema.json"},{"path":["entity_id"],"new_value":"wyvern"}]},{"entity_id":"dryad","file":"data/creatures/dryad.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"earth_golem","file":"data/creatures/earth_golem.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"faerie","file":"data/creatures/faerie.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"giant_shielder","file":"data/creatures/giant_shielder.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"harpy","file":"data/creatures/harpy.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"juggernaut","file":"data/creatures/juggernaut.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"lich","file":"data/creatures/lich.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"lizard_archer","file":"data/creatures/lizard_archer.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"ogre","file":"data/creatures/ogre.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"rocket_soldier","file":"data/creatures/rocket_soldier.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"ruin_spider","file":"data/creatures/ruin_spider.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"skeleton_warrior","file":"data/creatures/skeleton_warrior.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"stone_behemoth","file":"data/creatures/stone_behemoth.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"wolven_hunter","file":"data/creatures/wolven_hunter.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"wyvern","file":"data/creatures/wyvern.json","category":"creatures","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["type"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"edit","diffs":[{"path":["date_modified"],"removed":true},{"path":["id"],"removed":true},{"path":["class"],"removed":true},{"path":["meta"],"removed":true},{"path":["health"],"new_value":600},{"path":["health_regen_rate"],"new_value":1.0},{"path":["hero_id"],"new_value":"stone_shaman"},{"path":["description"],"removed":true},{"path":["population_caps"],"removed":true},{"path":["rank_unlock_levels"],"removed":true},{"path":["image_required"],"removed":true},{"path":["attack_damage_summoner"],"new_value":40},{"path":["version"],"removed":true},{"path":["regen_delay"],"new_value":5.0},{"path":["game_version"],"new_value":"0.0.1"},{"path":["flight_speed"],"new_value":0},{"path":["abilities"],"old_value":[],"new_value":{"passive":"stone_skin","primary":"Unknown Primary","defense":"Unknown Defense","ultimate":"Unknown Ultimate"}},{"path":["movement_speed"],"new_value":3},{"path":["passive_skills"],"removed":true},{"path":["attack_damage_minion"],"new_value":40},{"path":["starting_stats"],"removed":true},{"path":["max_level"],"removed":true}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"delete","diffs":[{"path":["school"],"removed":true},{"path":["date_modified"],"removed":true},{"path":["cast_time"],"removed":true},{"path":["effects"],"removed":true},{"path":["image_required"],"removed":true},{"path":["meta"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["upgrades"],"removed":true},{"path":["description"],"removed":true},{"path":["cost"],"removed":true},{"path":["cooldown"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"gaia_beast","file":"data/titans/gaia_beast.json","category":"titans","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"thanatos","file":"data/titans/thanatos.json","category":"titans","change_type":"delete","diffs":[{"path":["date_modified"],"removed":true},{"path":["stats"],"removed":true},{"path":["meta"],"removed":true},{"path":["rank"],"removed":true},{"path":["tags"],"removed":true},{"path":["name"],"removed":true},{"path":["id"],"removed":true},{"path":["description"],"removed":true},{"path":["version"],"removed":true},{"path":["$schema"],"removed":true}]},{"entity_id":"dryad","file":"data/units/dryad.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":225},{"path":["damage"],"new_value":12},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Dryad"},{"path":["movement_speed"],"new_value":3},{"path":["description"],"new_value":"Support creature that heals allies. Uses elemental attacks when infused"},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"dryad"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"earth_golem","file":"data/units/earth_golem.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":650},{"path":["damage"],"new_value":25},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Earth Golem"},{"path":["movement_speed"],"new_value":2},{"path":["description"],"new_value":"Strong melee unit that resists damage from large enemies"},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"earth_golem"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"earthquake","file":"data/units/earthquake.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Spell"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":0},{"path":["damage"],"new_value":150},{"path":["tags"],"new_value":["Earth","damage","slow"]},{"path":["name"],"new_value":"Earthquake"},{"path":["movement_speed"],"new_value":3},{"path":["description"],"new_value":"Shakes the ground, dealing damage and slowing enemies in a large area."},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"earthquake"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"faerie","file":"data/units/faerie.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":100},{"path":["damage"],"new_value":9},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Faerie"},{"path":["movement_speed"],"new_value":3},{"path":["description"],"new_value":"Stealthy flying ranged creature that turns invisible out of combat"},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"faerie"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"gaia_beast","file":"data/units/gaia_beast.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Titan"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":1000},{"path":["damage"],"new_value":80},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Gaia Beast"},{"path":["movement_speed"],"new_value":4},{"path":["description"],"new_value":"The Wild Titan. Crushes all structures as it marches toward the Lifestones."},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"gaia_beast"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"giant_shielder","file":"data/units/giant_shielder.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":150},{"path":["damage"],"new_value":30},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Giant Shielder"},{"path":["movement_speed"],"new_value":3},{"path":["description"],"new_value":"Slow giant that protects allies with a massive shield"},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"giant_shielder"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"harpy","file":"data/units/harpy.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":100},{"path":["damage"],"new_value":12},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Harpy"},{"path":["movement_speed"],"new_value":8},{"path":["description"],"new_value":"Agile flying creature that excels at defeating ground units"},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"harpy"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"harpy_nest","file":"data/units/harpy_nest.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Building"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":1500},{"path":["damage"],"new_value":0},{"path":["tags"],"new_value":["military"]},{"path":["name"],"new_value":"Harpy Nest"},{"path":["collision_radius"],"new_value":2},{"path":["movement_speed"],"new_value":3},{"path":["description"],"new_value":"A high crag where harpies roost and train."},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"harpy_nest"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"juggernaut","file":"data/units/juggernaut.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":100},{"path":["damage"],"new_value":50},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Juggernaut"},{"path":["movement_speed"],"new_value":3},{"path":["description"],"new_value":"Colossal creature that deals massive damage to structures"},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"juggernaut"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"lich","file":"data/units/lich.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":500},{"path":["damage"],"new_value":5},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Lich"},{"path":["movement_speed"],"new_value":5},{"path":["description"],"new_value":"Undead caster that inflict curses to enemies, increasing the damage they take and reducing their movement speed."},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"lich"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"lizard_archer","file":"data/units/lizard_archer.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":85},{"path":["damage"],"new_value":8},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Lizard Archer"},{"path":["movement_speed"],"new_value":3},{"path":["description"],"new_value":"Long-range fighter that deals bonus damage to flying enemies"},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"lizard_archer"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"ogre","file":"data/units/ogre.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":230},{"path":["damage"],"new_value":70},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Ogre"},{"path":["movement_speed"],"new_value":3},{"path":["description"],"new_value":"Mighty warrior that crushes target areas with a hammer"},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"ogre"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"rocket_soldier","file":"data/units/rocket_soldier.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":220},{"path":["damage"],"new_value":10},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Rocket Soldier"},{"path":["movement_speed"],"new_value":4},{"path":["description"],"new_value":"Medium-range soldier that deals bonus damage to buildings"},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"rocket_soldier"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"ruin_spider","file":"data/units/ruin_spider.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":85},{"path":["damage"],"new_value":20},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Ruin Spider"},{"path":["movement_speed"],"new_value":7},{"path":["description"],"new_value":"Fast creature that explodes on contact, dealing bonus damage to buildings"},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"ruin_spider"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"skeleton_warrior","file":"data/units/skeleton_warrior.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":200},{"path":["damage"],"new_value":15},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Skeleton Warrior"},{"path":["movement_speed"],"new_value":3},{"path":["description"],"new_value":"Undead soldier that captures altars quickly in large groups"},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"skeleton_warrior"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"stone_behemoth","file":"data/units/stone_behemoth.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":210},{"path":["damage"],"new_value":40},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Stone Behemoth"},{"path":["movement_speed"],"new_value":2},{"path":["description"],"new_value":"Siege unit that hurls long-range boulders for heavy area damage"},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"stone_behemoth"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"thanatos","file":"data/units/thanatos.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Titan"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":1000},{"path":["damage"],"new_value":40},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Thanatos"},{"path":["movement_speed"],"new_value":4},{"path":["description"],"new_value":"The Titan of Death inflict curses to enemies, increasing the damage they take and reducing their movement speed."},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"thanatos"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"wolven_hunter","file":"data/units/wolven_hunter.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":340},{"path":["damage"],"new_value":16},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Wolven Hunter"},{"path":["movement_speed"],"new_value":3},{"path":["description"],"new_value":"Hunter unit that fires powerful long-range bolts"},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"wolven_hunter"},{"path":["movement_type"],"new_value":"Ground"}]},{"entity_id":"wyvern","file":"data/units/wyvern.json","category":"units","change_type":"add","diffs":[{"path":["game_version"],"new_value":"0.0.1"},{"path":["category"],"new_value":"Creature"},{"path":["attack_speed"],"new_value":1.0},{"path":["health"],"new_value":220},{"path":["damage"],"new_value":19},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Wyvern"},{"path":["movement_speed"],"new_value":7},{"path":["description"],"new_value":"Flying dragonkin that attacks with mid-range projectiles"},{"path":["range"],"new_value":1},{"path":["$schema"],"new_value":"../../schemas/v1/unit.schema.json"},{"path":["entity_id"],"new_value":"wyvern"},{"path":["movement_type"],"new_value":"Ground"}]}]},{"commit":"aa4565851c3295bbf3e67a47be7ebdd73e3e3a19","timestamp":"2026-02-03T13:43:43-05:00","author":"TerribleTurtles","message":"Refactor schemas: Roman Numeral Ranks, Pop/Charge Costs (v1.1)","changes":[{"entity_id":"harpy_nest","file":"data/buildings/harpy_nest.json","category":"buildings","change_type":"edit","diffs":[{"path":["cost"],"old_value":{"gold":400,"stone":500,"wood":300},"new_value":{"population":0,"charges":1}}]},{"entity_id":"dryad","file":"data/creatures/dryad.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.596517Z","new_value":"2026-02-03T18:39:01.861073Z"},{"path":["rank"],"old_value":2,"new_value":"II"}]},{"entity_id":"earth_golem","file":"data/creatures/earth_golem.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.597035Z","new_value":"2026-02-03T18:39:01.861621Z"},{"path":["rank"],"old_value":2,"new_value":"II"}]},{"entity_id":"faerie","file":"data/creatures/faerie.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.597372Z","new_value":"2026-02-03T18:39:01.862028Z"},{"path":["rank"],"old_value":1,"new_value":"I"}]},{"entity_id":"giant_shielder","file":"data/creatures/giant_shielder.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.597690Z","new_value":"2026-02-03T18:39:01.862385Z"},{"path":["rank"],"old_value":3,"new_value":"III"}]},{"entity_id":"harpy","file":"data/creatures/harpy.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.598040Z","new_value":"2026-02-03T18:39:01.862856Z"},{"path":["rank"],"old_value":1,"new_value":"I"}]},{"entity_id":"juggernaut","file":"data/creatures/juggernaut.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.598425Z","new_value":"2026-02-03T18:39:01.863194Z"},{"path":["rank"],"old_value":4,"new_value":"IV"}]},{"entity_id":"lich","file":"data/creatures/lich.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.598766Z","new_value":"2026-02-03T18:39:01.863541Z"},{"path":["rank"],"old_value":2,"new_value":"II"}]},{"entity_id":"lizard_archer","file":"data/creatures/lizard_archer.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.599150Z","new_value":"2026-02-03T18:39:01.863866Z"},{"path":["rank"],"old_value":1,"new_value":"I"}]},{"entity_id":"ogre","file":"data/creatures/ogre.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.599554Z","new_value":"2026-02-03T18:39:01.864234Z"},{"path":["rank"],"old_value":3,"new_value":"III"}]},{"entity_id":"rocket_soldier","file":"data/creatures/rocket_soldier.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.599902Z","new_value":"2026-02-03T18:39:01.864521Z"},{"path":["rank"],"old_value":1,"new_value":"I"}]},{"entity_id":"ruin_spider","file":"data/creatures/ruin_spider.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.600253Z","new_value":"2026-02-03T18:39:01.864901Z"},{"path":["rank"],"old_value":1,"new_value":"I"}]},{"entity_id":"skeleton_warrior","file":"data/creatures/skeleton_warrior.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.600568Z","new_value":"2026-02-03T18:39:01.865252Z"},{"path":["rank"],"old_value":1,"new_value":"I"}]},{"entity_id":"stone_behemoth","file":"data/creatures/stone_behemoth.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.600868Z","new_value":"2026-02-03T18:39:01.865600Z"},{"path":["rank"],"old_value":3,"new_value":"III"}]},{"entity_id":"wolven_hunter","file":"data/creatures/wolven_hunter.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.601146Z","new_value":"2026-02-03T18:39:01.865936Z"},{"path":["rank"],"old_value":2,"new_value":"II"}]},{"entity_id":"wyvern","file":"data/creatures/wyvern.json","category":"creatures","change_type":"edit","diffs":[{"path":["cost"],"new_value":{"population":0,"charges":1}},{"path":["date_modified"],"old_value":"2026-02-03T01:54:09.601457Z","new_value":"2026-02-03T18:39:01.866313Z"},{"path":["rank"],"old_value":2,"new_value":"II"}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"edit","diffs":[{"path":["cost","population"],"new_value":0},{"path":["cost","mana"],"removed":true},{"path":["date_modified"],"old_value":"2026-02-03T12:00:00Z","new_value":"2026-02-03T18:39:01.866791Z"}]}]},{"commit":"60e97b387635b867188508bcc2d38f2496c9774b","timestamp":"2026-02-03T13:02:06-05:00","author":"TerribleTurtles","message":"Add data stubs and beta warning to landing page","changes":[{"entity_id":"harpy_nest","file":"data/buildings/harpy_nest.json","category":"buildings","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T12:00:00Z"},{"path":["stats"],"new_value":{"health":1500}},{"path":["build_time"],"new_value":450},{"path":["meta"],"new_value":{"note":"Stub with real name, fake data."}},{"path":["image_required"],"new_value":false},{"path":["name"],"new_value":"Harpy Nest"},{"path":["id"],"new_value":"harpy_nest"},{"path":["description"],"new_value":"A high crag where harpies roost and train."},{"path":["cost"],"new_value":{"gold":400,"stone":500,"wood":300}},{"path":["version"],"new_value":"1.0.0"},{"path":["size"],"new_value":"3x3"},{"path":["classification"],"new_value":"military"},{"path":["$schema"],"new_value":"../../schemas/v1/building.schema.json"}]},{"entity_id":"stone_shaman","file":"data/heroes/stone_shaman.json","category":"heroes","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T12:00:00Z"},{"path":["abilities"],"new_value":[]},{"path":["rank_unlock_levels"],"new_value":{"10":"II","20":"III","40":"IV"}},{"path":["image_required"],"new_value":false},{"path":["meta"],"new_value":{"note":"Stub with real name, fake data."}},{"path":["name"],"new_value":"Stone Shaman"},{"path":["id"],"new_value":"stone_shaman"},{"path":["passive_skills"],"new_value":["stone_skin"]},{"path":["description"],"new_value":"A wise elder who communes with the earth spirits."},{"path":["population_caps"],"new_value":{"I":100,"II":250,"III":500,"IV":800}},{"path":["class"],"new_value":"Shaman"},{"path":["version"],"new_value":"1.0.0"},{"path":["starting_stats"],"new_value":{"health":600,"mana":300,"power":40,"population":50}},{"path":["max_level"],"new_value":50},{"path":["$schema"],"new_value":"../../schemas/v1/hero.schema.json"}]},{"entity_id":"earthquake","file":"data/spells/earthquake.json","category":"spells","change_type":"add","diffs":[{"path":["school"],"new_value":"Earth"},{"path":["date_modified"],"new_value":"2026-02-03T12:00:00Z"},{"path":["cast_time"],"new_value":2.0},{"path":["effects"],"new_value":[{"type":"damage","value":150,"element":"earth","area":"AoE"},{"type":"slow","value":30,"duration":4.0}]},{"path":["image_required"],"new_value":false},{"path":["meta"],"new_value":{"note":"Stub with real name, fake data."}},{"path":["name"],"new_value":"Earthquake"},{"path":["id"],"new_value":"earthquake"},{"path":["upgrades"],"new_value":[{"level":2,"description":"Increases area of effect by 20%.","effect":{"aoe_bonus":20}}]},{"path":["description"],"new_value":"Shakes the ground, dealing damage and slowing enemies in a large area."},{"path":["cost"],"new_value":{"mana":80,"charges":1}},{"path":["cooldown"],"new_value":12.0},{"path":["version"],"new_value":"1.0.0"},{"path":["$schema"],"new_value":"../../schemas/v1/spell.schema.json"}]}]},{"commit":"52cad890243662b41f3746735f1b3550ebd5e7c3","timestamp":"2026-02-03T10:28:33-05:00","author":"TerribleTurtles","message":"Initial commit: Spellcasters Community API v1.0","changes":[{"entity_id":"dryad","file":"data/creatures/dryad.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.596517Z"},{"path":["stats"],"new_value":{"health":225,"speed":3,"dps":12,"hps":150}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":2},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Dryad"},{"path":["id"],"new_value":"dryad"},{"path":["description"],"new_value":"Support creature that heals allies. Uses elemental attacks when infused"},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"earth_golem","file":"data/creatures/earth_golem.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.597035Z"},{"path":["stats"],"new_value":{"health":650,"speed":2,"dps":25,"hps":0}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":2},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"EARTH GOLEM"},{"path":["id"],"new_value":"earth_golem"},{"path":["description"],"new_value":"Strong melee unit that resists damage from large enemies"},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"faerie","file":"data/creatures/faerie.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.597372Z"},{"path":["stats"],"new_value":{"health":100,"speed":3,"dps":9,"range":25,"hps":0}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":1},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Faerie"},{"path":["id"],"new_value":"faerie"},{"path":["description"],"new_value":"Stealthy flying ranged creature that turns invisible out of combat"},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"giant_shielder","file":"data/creatures/giant_shielder.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.597690Z"},{"path":["stats"],"new_value":{"health":150,"speed":3,"dps":30,"hps":0}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":3},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Giant Shielder"},{"path":["id"],"new_value":"giant_shielder"},{"path":["description"],"new_value":"Slow giant that protects allies with a massive shield"},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"harpy","file":"data/creatures/harpy.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.598040Z"},{"path":["stats"],"new_value":{"health":100,"speed":8,"dps":12,"hps":0}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":1},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"HARPY"},{"path":["id"],"new_value":"harpy"},{"path":["description"],"new_value":"Agile flying creature that excels at defeating ground units"},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"juggernaut","file":"data/creatures/juggernaut.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.598425Z"},{"path":["stats"],"new_value":{"health":100,"speed":3,"dps":50,"hps":0}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":4},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Juggernaut"},{"path":["id"],"new_value":"juggernaut"},{"path":["description"],"new_value":"Colossal creature that deals massive damage to structures"},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"lich","file":"data/creatures/lich.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.598766Z"},{"path":["stats"],"new_value":{"health":500,"speed":5,"dps":5,"hps":0}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":2},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Lich"},{"path":["id"],"new_value":"lich"},{"path":["description"],"new_value":"Undead caster that inflict curses to enemies, increasing the damage they take and reducing their movement speed."},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"lizard_archer","file":"data/creatures/lizard_archer.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.599150Z"},{"path":["stats"],"new_value":{"health":85,"speed":3,"dps":8,"range":35,"hps":0}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":1},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Lizard Archer"},{"path":["id"],"new_value":"lizard_archer"},{"path":["description"],"new_value":"Long-range fighter that deals bonus damage to flying enemies"},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"ogre","file":"data/creatures/ogre.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.599554Z"},{"path":["stats"],"new_value":{"health":230,"speed":3,"dps":70,"hps":0}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":3},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Ogre"},{"path":["id"],"new_value":"ogre"},{"path":["description"],"new_value":"Mighty warrior that crushes target areas with a hammer"},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"rocket_soldier","file":"data/creatures/rocket_soldier.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.599902Z"},{"path":["stats"],"new_value":{"health":220,"speed":4,"dps":10,"range":15,"hps":0}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":1},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Rocket Soldier"},{"path":["id"],"new_value":"rocket_soldier"},{"path":["description"],"new_value":"Medium-range soldier that deals bonus damage to buildings"},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"ruin_spider","file":"data/creatures/ruin_spider.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.600253Z"},{"path":["stats"],"new_value":{"health":85,"speed":7,"dps":20,"hps":0}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":1},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"RUIN SPIDER"},{"path":["id"],"new_value":"ruin_spider"},{"path":["description"],"new_value":"Fast creature that explodes on contact, dealing bonus damage to buildings"},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"skeleton_warrior","file":"data/creatures/skeleton_warrior.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.600568Z"},{"path":["stats"],"new_value":{"health":200,"speed":3,"dps":15,"hps":0}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":1},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"SKELETON WARRIOR"},{"path":["id"],"new_value":"skeleton_warrior"},{"path":["description"],"new_value":"Undead soldier that captures altars quickly in large groups"},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"stone_behemoth","file":"data/creatures/stone_behemoth.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.600868Z"},{"path":["stats"],"new_value":{"health":210,"speed":2,"dps":40,"range":55,"hps":0}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":3},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"STONE BEHEMOTH"},{"path":["id"],"new_value":"stone_behemoth"},{"path":["description"],"new_value":"Siege unit that hurls long-range boulders for heavy area damage"},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"wolven_hunter","file":"data/creatures/wolven_hunter.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.601146Z"},{"path":["stats"],"new_value":{"health":340,"speed":3,"dps":16,"range":75,"hps":0}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":2},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Wolven Hunter"},{"path":["id"],"new_value":"wolven_hunter"},{"path":["description"],"new_value":"Hunter unit that fires powerful long-range bolts"},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"wyvern","file":"data/creatures/wyvern.json","category":"creatures","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:54:09.601457Z"},{"path":["stats"],"new_value":{"health":220,"speed":7,"dps":19,"range":35,"hps":0}},{"path":["type"],"new_value":"Unknown"},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":2},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"WYVERN"},{"path":["id"],"new_value":"wyvern"},{"path":["description"],"new_value":"Flying dragonkin that attacks with mid-range projectiles"},{"path":["version"],"new_value":"1.0.1"},{"path":["$schema"],"new_value":"../../schemas/v1/creature.schema.json"}]},{"entity_id":"gaia_beast","file":"data/titans/gaia_beast.json","category":"titans","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:16:56.467799Z"},{"path":["stats"],"new_value":{"health":1000,"speed":4,"hps":50,"damage":80}},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":"III"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"Gaia Beast"},{"path":["id"],"new_value":"gaia_beast"},{"path":["description"],"new_value":"The Wild Titan. Crushes all structures as it marches toward the Lifestones."},{"path":["version"],"new_value":"1.0.0"},{"path":["$schema"],"new_value":"../../schemas/v1/titan.schema.json"}]},{"entity_id":"thanatos","file":"data/titans/thanatos.json","category":"titans","change_type":"add","diffs":[{"path":["date_modified"],"new_value":"2026-02-03T01:16:56.468387Z"},{"path":["stats"],"new_value":{"health":1000,"speed":4,"damage":40}},{"path":["meta"],"new_value":{"source":"Spellcasters.md migration"}},{"path":["rank"],"new_value":"III"},{"path":["tags"],"new_value":[]},{"path":["name"],"new_value":"THANATOS"},{"path":["id"],"new_value":"thanatos"},{"path":["description"],"new_value":"The Titan of Death inflict curses to enemies, increasing the damage they take and reducing their movement speed."},{"path":["version"],"new_value":"1.0.0"},{"path":["$schema"],"new_value":"../../schemas/v1/titan.schema.json"}]}]}]