package model type EnemyType string const ( EnemyWolf EnemyType = "wolf" EnemyBoar EnemyType = "boar" EnemyZombie EnemyType = "zombie" EnemySpider EnemyType = "spider" EnemyOrc EnemyType = "orc" EnemySkeletonArcher EnemyType = "skeleton_archer" EnemyBattleLizard EnemyType = "battle_lizard" EnemyFireDemon EnemyType = "fire_demon" EnemyIceGuardian EnemyType = "ice_guardian" EnemySkeletonKing EnemyType = "skeleton_king" EnemyWaterElement EnemyType = "water_element" EnemyForestWarden EnemyType = "forest_warden" EnemyLightningTitan EnemyType = "lightning_titan" ) type SpecialAbility string const ( AbilityBurn SpecialAbility = "burn" // DoT fire damage AbilitySlow SpecialAbility = "slow" // -40% movement speed (Water Element) AbilityCritical SpecialAbility = "critical" // chance for double damage AbilityPoison SpecialAbility = "poison" // DoT poison damage AbilityFreeze SpecialAbility = "freeze" // -50% attack speed (generic) AbilityIceSlow SpecialAbility = "ice_slow" // -20% attack speed (Ice Guardian per spec) AbilityStun SpecialAbility = "stun" // no attacks for 2 sec AbilityDodge SpecialAbility = "dodge" // chance to avoid incoming damage AbilityRegen SpecialAbility = "regen" // regenerate HP over time AbilityBurst SpecialAbility = "burst" // every Nth attack deals multiplied damage AbilityChainLightning SpecialAbility = "chain_lightning" // 3x damage after 5 attacks AbilitySummon SpecialAbility = "summon" // summons minions ) type Enemy struct { ID int64 `json:"id"` Type EnemyType `json:"type"` Name string `json:"name"` HP int `json:"hp"` MaxHP int `json:"maxHp"` Attack int `json:"attack"` Defense int `json:"defense"` Speed float64 `json:"speed"` // attacks per second CritChance float64 `json:"critChance"` // 0.0 to 1.0 MinLevel int `json:"minLevel"` MaxLevel int `json:"maxLevel"` BaseLevel int `json:"baseLevel"` LevelVariance float64 `json:"levelVariance"` // 0.30 => +/-30% MaxHeroLevelDiff int `json:"maxHeroLevelDiff"` HPPerLevel float64 `json:"hpPerLevel"` AttackPerLevel float64 `json:"attackPerLevel"` DefensePerLevel float64 `json:"defensePerLevel"` XPPerLevel float64 `json:"xpPerLevel"` GoldPerLevel float64 `json:"goldPerLevel"` Level int `json:"level,omitempty"` // runtime instance level XPReward int64 `json:"xpReward"` GoldReward int64 `json:"goldReward"` SpecialAbilities []SpecialAbility `json:"specialAbilities,omitempty"` IsElite bool `json:"isElite"` AttackCount int `json:"-"` // tracks attacks for burst/chain abilities } // IsAlive returns true if the enemy has HP remaining. func (e *Enemy) IsAlive() bool { return e.HP > 0 } // HasAbility checks if the enemy possesses a given special ability. func (e *Enemy) HasAbility(a SpecialAbility) bool { for _, ab := range e.SpecialAbilities { if ab == a { return true } } return false } // EnemyTemplates is loaded from DB at startup/reload. // It intentionally has no hardcoded fallback templates in code. var EnemyTemplates = map[EnemyType]Enemy{} func SetEnemyTemplates(next map[EnemyType]Enemy) { EnemyTemplates = next }