private static CombatantModel Update(this CombatantModel combatant, World world, DateTime when)
        {
            // check for activating skills
            if (combatant.ActivatingSkill != EnumSkill.None
                && combatant.ActivatingSkillTimestamp + combatant.ActivatingSkillLeadTime <= when)
                world.UseSkillNow(
                    combatant,
                    // TODO: avoid looking it up?
                    Global.Schema.EnumSkill.FindByEnumSkillID((int)combatant.ActivatingSkill),
                    combatant.Target);

            // TODO: check for queued skills
            //else if (c.SkillQueue.Length > 0)
            //c.ActivatingSkill = c.SkillQueue.Head;

            if (combatant.Target != null)
                combatant.CheckAttack(world, when);
            else if ((when - combatant.LastMoveUpdate).TotalSeconds > 1
                && (combatant.MobileState == EnumMobileState.Running
                    || combatant.MobileState == EnumMobileState.Walking))
                // TODO: where to check if changed?, also can remove cast with generics
                combatant = (CombatantModel)combatant.WithState(EnumMobileState.Standing);

            combatant = combatant.HealUpdate(when);
            return combatant;
        }
 public static void CheckAttack(this CombatantModel combatant, World world, DateTime when)
 {
     if ((when - combatant.LastAttackUpdate).TotalSeconds > 3)
     {
         // TODO: don't look it up every time
         var esr = Global.Schema.EnumSkill.FindByEnumSkillID((int)EnumSkill.Kill);
         world.UseSkillNow(combatant, esr, combatant.Target);
     }
 }