static public void compute(Creature creature, GameTime time, Environment.Map map) { // time for creatur to act and none HQcreature? if (creature.ActionTimeCounter >= 1000 / creature.Speed && creature.getThingTyp() != Vars_Func.ThingTyp.HQCreature) { Vector2 nearestEnemy = computeNearestEnemy(creature, map); if (creature.Path == null) { creature.Path = new Stack <Vector2>(); } // neutral creatures only randomwalk if (creature.getThingTyp() == Vars_Func.ThingTyp.NeutralCreature) { randomwalk(creature, map); } // walk to nearest Enemy and attack if there is one else if (nearestEnemy.X != map.getPlanelength()) { if (map.getHexagonAt(creature.Position).Neighbors.Contains(nearestEnemy)) { if (creature.ActionTimeCounter >= 1000 / creature.Speed) { // attack creature if (map.getHexagonAt(nearestEnemy).Obj != null) { creature.State = Vars_Func.CreatureState.Fighting; creature.TargetHexagon = map.getHexagonAt(nearestEnemy); Creature target = (Creature)map.getHexagonAt(nearestEnemy).Obj; creature.TargetPosition = target.TempDrawPositon; target.takeDamage(creature.Damage); if (target.DamageTaken >= target.HP) { map.DyingCreatures.Add(target); } creature.ActionTimeCounter = 0; } //// attack imp //else //{ // Imp target = map.getHexagonAt(nearestEnemy).Imps[0]; // target.takeDamage(creature.Damage); // if (target.DamageTaken >= target.HP) map.remove(target); // creature.ActionTimeCounter = 0; //} } } // serach path else { creature.Path = determinePath(creature.Position, map.getHexagonAt(nearestEnemy).Neighbors, map, false); } } // calculate path if creature has none else if (creature.Path.Count == 0) { if (Logic.Vars_Func.computeDistance(creature.Home.TargetPosition, creature.Position, map) < 5) { randomwalk(creature, map); } else { creature.Path = determinePath(creature.Position, creature.Home.TargetPosition, map); } //// herocreature found no path and so burrow throug walls //if (creature.Path == null && creature.getThingTyp() == Vars_Func.ThingTyp.HeroCreature) // creature.Path = determinePath(creature.Position, creature.Home.TargetPosition, map, true, true); } // time left for action? if (creature.ActionTimeCounter >= 1000 / creature.Speed) { creature.State = Vars_Func.CreatureState.Walking; map.move(creature); if (creature.Path == null) { foreach (Vector2 v in map.getHexagonAt(creature.Position).Neighbors) { if (map.getHexagonAt(v).Obj == null) { creature.Path = new Stack <Vector2>(); creature.Path.Push(v); map.move(creature); break; } } } } creature.ActionTimeCounter = 0; } creature.ActionTimeCounter += time.ElapsedGameTime.Milliseconds; }
static public void compute(Imp imp, GameTime time, Environment.Map map) { if (imp.ActionTimeCounter >= 500) { //20 trys for jobsearch for (int i = 0; i < 20; ++i) { if (imp.Path == null) { imp.Path = new Stack <Vector2>(); } // search Job if (imp.CurrentJob.JobTyp == Vars_Func.ImpJob.Idle) { //jobs there? if (map.JobsWaiting.Count != 0) { imp.CurrentJob = map.JobsWaiting.Dequeue(); map.JobsInProgress.Add(imp.CurrentJob); } } // search path to workplace if (imp.Path.Count == 0 && imp.CurrentJob.JobTyp != Vars_Func.ImpJob.Idle) { imp.Path = determinePath(imp.Position, imp.CurrentJob.Destination, map); } //job not reachable enque job if (imp.Path == null) { map.JobsInProgress.Remove(imp.CurrentJob); map.JobsWaiting.Enqueue(imp.CurrentJob); imp.CurrentJob = new Job(Vars_Func.ImpJob.Idle); } else { break; } } // working if (imp.CurrentJob.JobTyp != Vars_Func.ImpJob.Idle && map.getHexagonAt(imp.Position).Neighbors.Contains(imp.CurrentJob.Destination)) { imp.CurrentJob.updateJob(map, imp); imp.CurrentJob.Worktime -= time.ElapsedGameTime.Milliseconds; switch (imp.CurrentJob.JobTyp) { case Vars_Func.ImpJob.Mine: case Vars_Func.ImpJob.MineDiamonds: case Vars_Func.ImpJob.MineGold: //imp.ExternalTarget = imp.State = Vars_Func.ImpState.Digging; imp.TargetHexagon = map.getHexagonAt(imp.CurrentJob.Destination); break; case Vars_Func.ImpJob.Harvest: imp.State = Vars_Func.ImpState.Harvesting; imp.TargetHexagon = map.getHexagonAt(imp.CurrentJob.Destination); break; } if (imp.CurrentJob.Worktime <= 0) { imp.CurrentJob.Worktime = 5000; map.JobsInProgress.Remove(imp.CurrentJob); map.JobsWaiting.Enqueue(imp.CurrentJob); imp.CurrentJob = new Job(Vars_Func.ImpJob.Idle); } } // nothing to do? if (imp.Path == null || imp.Path.Count == 0) { randomwalk(imp, map); } // time left for action? if (imp.ActionTimeCounter >= 500) { imp.State = Vars_Func.ImpState.Walking; map.move(imp); } imp.ActionTimeCounter = 0; } imp.ActionTimeCounter += time.ElapsedGameTime.Milliseconds; }