public void RegisterTurnTaker(ITurnTaker turnTaker)
 {
     if (!turnTakers.Contains(turnTaker))
     {
         turnTakers.Add(turnTaker);
     }
 }
    public void StartBattle()
    {
        this.playerSquads = new List <Squad>();
        this.aiSquads     = new List <Squad>();

        List <Squad> allSquads = FindObjectsOfType <Squad>().ToList();

        foreach (Squad squad in allSquads)
        {
            if (squad.gameObject.tag == "AI")
            {
                squad.SetBannerColor(Color.cyan);
                this.aiSquads.Add(squad);
            }

            if (squad.gameObject.tag == "Player")
            {
                this.playerSquads.Add(squad);

                if (squad.GetSquadType() == ESquadType.King)
                {
                    squad.GetComponent <SquadCollisions>().EventSquadCapturedFlag.AddListener(this);
                }
            }

            squad.EventSquadDefeated.AddListener(this);
        }

        this.playerController = new PlayerController(this.attackDirectionArrow);
        this.aiController     = new AIController(this.aiSquads);
    }
Exemple #3
0
        public IEnumerator PerformNextTurn()
        {
            ITurnTaker nextTurnTaker = GetFastestAndReorder(turnInfo).turnTaker;

            yield return(nextTurnTaker.PrepareOnTurn());

            Turn turn = nextTurnTaker.OnTurn();

            int timeTaken = 0;

            foreach (Step step in turn.steps)
            {
                //Perform the next step if enough time remains
                if (step.MinTimeRequiredToStart + timeTaken > turn.maxTime)
                {
                    break;
                }
                yield return(step.Action());

                timeTaken += step.TimeTaken();

                foreach (var reaction in reactions)
                {
                    //TODO: Add some sort of indicator that what's occurring is a reaction
                    yield return(reaction.Action());
                }
                reactions.Clear();
            }
        }
        /// <summary>
        /// Initialize all registered TurnTakers to begin ticking.
        /// </summary>
        private void InitializeTickingEntities()
        {
            tickingEntities = new Queue <ITurnTaker>(turnTakers.Count);

            for (int i = 0; i < turnTakers.Count; i++)
            {
                ITurnTaker turnTaker = turnTakers[i];
                turnTaker.SetTickState(TurnTakerState.WAITING);
                tickingEntities.Enqueue(turnTaker);
            }
        }
        public void UnregisterTurnTaker(ITurnTaker turnTaker)
        {
            if (turnTakers.Contains(turnTaker))
            {
                turnTakers.Remove(turnTaker);

                if (tickingEntities != null && tickingEntities.Contains(turnTaker))
                {
                    RemoveEntity(turnTaker);
                }
            }
        }
        /// <summary>
        /// If the removed entity (probably died, is currently ticking, we need to remove it to avoid holding a reference
        /// to a freed entity
        /// </summary>
        private void RemoveEntity(ITurnTaker turnTaker)
        {
            Queue <ITurnTaker> tempQueue = new Queue <ITurnTaker>(tickingEntities.Count - 1);

            while (tickingEntities.Count > 0)
            {
                ITurnTaker tempEntity = tickingEntities.Dequeue();
                if (tempEntity != turnTaker)
                {
                    tempQueue.Enqueue(tempEntity);
                }
            }

            tickingEntities = tempQueue;
        }
        /// <summary>
        /// Process all the currently registered TurnTakers.
        /// </summary>
        private void ProcessTickingEntities(float delta)
        {
            Queue <ITurnTaker> tickedEntities = new Queue <ITurnTaker>();

            while (tickingEntities.Count > 0)
            {
                ITurnTaker turnTaker = tickingEntities.Dequeue();
                if (turnTaker.GetTickState() == TurnTakerState.WAITING)
                {
                    turnTaker.InitTick();
                    turnTaker.SetTickState(TurnTakerState.TICKING);
                    tickedEntities.Enqueue(turnTaker);
                }
                else if (turnTaker.GetTickState() == TurnTakerState.TICKING)
                {
                    turnTaker.Tick(delta);
                    tickedEntities.Enqueue(turnTaker);
                }
            }

            tickingEntities = tickedEntities;
        }
Exemple #8
0
 public void Unregister(ITurnTaker turnTaker)
 {
     turnInfo.RemoveAll(info => info.turnTaker == turnTaker);
 }
Exemple #9
0
 public void Register(ITurnTaker turnTaker)
 {
     turnInfo.Add(new TurnTakerInfo(turnTaker));
 }
Exemple #10
0
 public TurnTakerInfo(ITurnTaker turnTaker)
 {
     this.turnTaker     = turnTaker;
     additionalPriority = 0;
 }
 public bool UnregisterTurnTaker(ITurnTaker turnTaker)
 {
     return(toRemove.Add(turnTaker));
 }
 public bool RegisterTurnTaker(ITurnTaker turnTaker)
 {
     return(toAdd.Add(turnTaker));
 }
 public static void UnregisterForTurn(ITurnTaker turnTaker)
 {
     turns.Unregister(turnTaker);
 }
Exemple #14
0
 public GameRunner(IRandomizer randomizer, IGameValidator gameValidator, ITurnTaker turnTaker)
 {
     this.randomizer    = randomizer;
     this.gameValidator = gameValidator;
     this.turnTaker     = turnTaker;
 }