private void UpdateUnit(GameUnit unit, Level level) { if (!unit.Exists) return; // Infection vitality update if (unit.Lost) { unit.InfectionVitality -= INFECTION_RECOVER_SPEED; unit.InfectionVitality = MathHelper.Clamp( unit.InfectionVitality, 0, unit.max_infection_vitality); } else { unit.InfectionVitality += INFECTION_RECOVER_SPEED; unit.InfectionVitality = MathHelper.Clamp( unit.InfectionVitality, 0, unit.max_infection_vitality); } // If infection vitality is 0, convert the unit, or defeat the boss if (unit.InfectionVitality == 0) { if (unit.Type == UnitType.BOSS) { level.BossesDefeated++; unit.Exists = false; } else { ConvertedUnits.Add(unit); } } // Attack cooldown unit.AttackCoolDown = (int)MathHelper.Clamp( --unit.AttackCoolDown, 0, ATTACK_COOLDOWN); // Apply ally attrition if they are outside of range if (unit.Faction == UnitFaction.ALLY && Player != null && !unit.inRange(Player, ALLY_FOLLOW_RANGE)) { unit.Health -= ALLY_ATTRITION; } // Check health if (unit.Health <= 0) { DeadUnits.Add(unit); } }
/* * Process combat between two units */ private void ProcessCombat(GameUnit unit) { if (unit.AttackCoolDown > 0) return; if (unit.Attacking != null && unit.inRange(unit.Attacking, unit.AttackRange + unit.Size/2 + unit.Attacking.Size/2)) { Attack(unit, unit.Attacking); unit.Attacking = null; } // Attack other unit. If no other, attack player /* if(closest != null) { Attack(unit, closest); } else if (Player.Exists && unit.AttackCoolDown == 0 && unit.Faction == UnitFaction.ENEMY && unit.inRange(Player, unit.AttackRange+Player.Size/2)) { Attack(unit, Player); }*/ }