public void UpdateSituation()
        {
            for (int t = 0; t < Constants.TANK_COUNT; t++)
            {
                Tank          tank          = Game.Current.Elements[t] as Tank;
                TankSituation tankSituation = new TankSituation(this);
                tankSituation.Tank      = tank;
                tankSituation.TankState = GameState.GetMobileState(t);

                // tankSituation.IsShotAt
                // tankSituation.ThreateningBullets
                // tankSituation.IsInLineOfFire
                // tankSituation.IsLockedDown
                // tankSituation.IsShutIntoQuadrant
                // tankSituation.Quadrant

                TankSituationsByTankIndex[tank.Index] = tankSituation;
                tankSituation.UpdateTankActionSituations(GameState);

                int             bulletIndex = t + Constants.MIN_BULLET_INDEX;
                int             bulletId    = Game.Current.Turns[GameState.Tick].BulletIds[t];
                BulletSituation bulletSituation
                    = BulletSituationCalculator.CreateBulletSituation(GameState, tankSituation, bulletIndex, bulletId);
                BulletSituationsByTankIndex[t] = bulletSituation;
            }
        }
        public void UpdateTankActionSituation(TankSituation tankSituation, TankAction tankAction, GameState newGameState)
        {
            TankAction[] tankActions = new TankAction[] { TankAction.NONE, TankAction.NONE, TankAction.NONE, TankAction.NONE };
            tankActions[tankSituation.Tank.Index] = tankAction;
            List <Point> wallsRemoved = new List <Point>();

            MutableGameStateEngine.ApplyAllActions(newGameState as MutableGameState, tankActions, wallsRemoved);
            bool isAdjacentWallRemoved = false;

            if (!tankSituation.TankState.IsActive)
            {
                IsValid = (TankAction == TankAction.NONE);
                return;
            }
            else
            {
                IsValid = true;
            }

            if (tankAction == TankAction.FIRE)
            {
                Direction    movementDir = tankSituation.TankState.Dir;
                TankLocation tankLoc
                    = Game.Current.Turns[newGameState.Tick].CalculationCache.TankLocationMatrix[tankSituation.TankState.Pos];
                Point adjacentWallPoint = tankLoc.OutsideEdgesByDirection[(int)movementDir].CentreCell.Position;
                isAdjacentWallRemoved = wallsRemoved.Any(
                    wallPoint => wallPoint == adjacentWallPoint
                    );
            }

            NewGameState          = newGameState;
            WallsRemoved          = wallsRemoved.ToArray();
            IsAdjacentWallRemoved = isAdjacentWallRemoved;
            NewTankState          = NewGameState.GetMobileState(TankSituation.Tank.Index);
        }
 public BulletSituation(TankSituation tankSituation, int bulletIndex, int bulletId)
 {
     TankSituation = tankSituation;
     tankSituation.TanksBulletSituation = this;
     BulletIndex = bulletIndex;
     BulletId    = bulletId;
 }
 public bool AreAllTankActionsGenerated(int yourPlayerIndex)
 {
     foreach (Tank tank in Game.Current.Players[yourPlayerIndex].Tanks)
     {
         TankSituation tankSituation = TankSituationsByTankIndex[tank.Index];
         if (!tankSituation.IsTankActionDetermined)
         {
             return(false);
         }
     }
     return(true);
 }
        public TankActionSet GenerateTankActions(int yourPlayerIndex, int tick)
        {
            TankActionSet tankActionSet = new TankActionSet(yourPlayerIndex, tick);

            foreach (Tank tank in Game.Current.Players[yourPlayerIndex].Tanks)
            {
                TankSituation tankSituation = TankSituationsByTankIndex[tank.Index];
                TankAction    bestAction    = tankSituation.GetBestTankAction();
                tankActionSet.Actions[tank.Number] = bestAction;
            }

            return(tankActionSet);
        }
 public TankActionSituation(TankSituation tankSituation, TankAction tankAction)
 {
     TankSituation = tankSituation;
     TankAction    = tankAction;
 }
 public GameSituation(GameState gameState)
 {
     GameState = gameState;
     TankSituationsByTankIndex   = new TankSituation[Constants.TANK_COUNT];
     BulletSituationsByTankIndex = new BulletSituation[Constants.TANK_COUNT];
 }