示例#1
0
        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;
        }
示例#2
0
        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;
        }