Exemplo n.º 1
0
        public void SetLevel(Level level)
        {
            if (level.Data.GetLength(0) != _widthTiles || level.Data.GetLength(1) != _heightTiles)
            {
                throw new Exception("fuckkkkk seriously?");
            }

            IsPaused          = false;
            IsStarted         = false;
            IsFinished        = false;
            _softFinished     = false;
            _awaitingCooldown = false;
            _cooldownTimer    = 0;
            _level            = level;
            _tiles            = new Sprite[_widthTiles * _heightTiles];
            Hp = MaxHp = level.Hp;
            CurrentlySelected = null;
            CurrentlyHovered  = null;
            CurrentlyPlacing  = null;
            _finishedWaves.Clear();
            _bulletsToRemove.Clear();
            Bullets.Clear();
            Game.RemoveAllTowers();
            Distributor.Reset();
            Waves.Clear();
            _waveToSpawn = null;


            int i = 0;

            for (int x = 0; x < this._widthTiles; x++)
            {
                for (int y = 0; y < this._heightTiles; y++)
                {
                    int tile  = _level.Data[x, y];
                    int index = 0;

                    if ((tile & Level.S) != 0)
                    {
                        index = 2;
                    }
                    else if ((tile & Level.E) != 0)
                    {
                        index = 3;
                    }
                    else if (tile != 0)
                    {
                        index = 1;
                    }

                    _tiles[i++] = new Sprite(_tilesTexture, new IntRect(index * Game.TileSize, 0, Game.TileSize, Game.TileSize))
                    {
                        Position = Utils.Grid2f(new Vector2i(x, y)),
                        Origin   = new Vector2f(Game.TileSize, Game.TileSize) / 2
                    };
                }
            }
        }
Exemplo n.º 2
0
        public override void Update(float delta)
        {
            bool didPlace   = false;
            var  snappedPos = Utils.Snap2Grid(Game.MousePosition);

            if (CurrentlyPlacing != null)
            {
                if (AKS.WasJustReleased(Mouse.Button.Left))
                {
                    if (CanPlaceTowerAt(snappedPos))
                    {
                        CurrentlyPlacing.Position = snappedPos;
                        Game.Money -= CurrentlyPlacing.Cost;
                        CurrentlyPlacing.IsPlaced = true;
                        CurrentlySelected         = CurrentlyPlacing;
                        CurrentlyPlacing          = null;
                        didPlace = true;
                    }
                }
                else if (AKS.WasJustReleased(Mouse.Button.Right))
                {
                    Game.RemoveTower(CurrentlyPlacing);
                    CurrentlyPlacing = null;
                }
            }

            bool newSelected = false;

            CurrentlyHovered = null;

            foreach (var tower in Game.PlacedTowers)
            {
                if (tower.Position == snappedPos)
                {
                    if (AKS.WasJustPressed(Mouse.Button.Left))
                    {
                        CurrentlySelected = tower;
                        newSelected       = true;
                    }
                    else
                    {
                        CurrentlyHovered = tower;
                    }
                }
            }

            if (AKS.WasJustPressed(Mouse.Button.Left) && !newSelected)
            {
                Vector2i gridPos = Utils.Vf2Grid(Game.MousePositionf);
                if (gridPos.X < _widthTiles && gridPos.Y < _heightTiles)
                {
                    CurrentlySelected = null;
                }
            }

            var upgradeCandidate = CurrentlyHovered ?? CurrentlySelected;

            if (upgradeCandidate != null && AKS.WasJustPressed(Keyboard.Key.U))
            {
                Game.TryUpgradeTower(upgradeCandidate);
            }

            if (!IsStarted || IsPaused)
            {
                return;
            }

            for (int frame = 0; frame < (AKS.IsKeyDown(Keyboard.Key.LControl) ? 10 : 1); frame++)
            {
                foreach (var tower in Game.PlacedTowers)
                {
                    tower.Update(delta);
                }

                foreach (var wave in Waves)
                {
                    wave.Update(delta);

                    Hp -= wave.FrameDamage;
                    if (Hp <= 0)
                    {
                        Game.IsGameOver = true;
                        return;
                    }

                    if (wave.IsFinishedSpawning && !_finishedWaves.Contains(wave))
                    {
                        _finishedWaves.Add(wave);

                        if (_finishedWaves.Count == _level.NumWaves)
                        {
                            _softFinished = true;
                        }
                        else
                        {
                            _waveCooldownTimer = 0;
                            _waveCooldownGoal  = wave.Cooldown;
                            _waveToSpawn       = _level.SpawnWave();
                        }
                    }
                }

                if (_waveToSpawn != null)
                {
                    _waveCooldownTimer += delta;

                    if (_waveCooldownTimer >= _waveCooldownGoal)
                    {
                        Waves.Add(_waveToSpawn);
                        _waveToSpawn = null;
                    }
                }

                foreach (var bullet in Bullets)
                {
                    if (bullet.ShouldBeCulled)
                    {
                        _bulletsToRemove.Add(bullet);
                    }
                    else
                    {
                        bullet.Update(delta);

                        if (bullet.ShouldBeCulled)
                        {
                            _bulletsToRemove.Add(bullet);
                        }
                        if (bullet.IsCollidable)
                        {
                            foreach (var wave in Waves)
                            {
                                if (!wave.TryBullet(bullet))
                                {
                                    if (bullet.ShouldBeCulled)
                                    {
                                        _bulletsToRemove.Add(bullet);
                                    }
                                    continue;
                                }
                            }
                        }
                    }
                }

                foreach (var bullet in _bulletsToRemove)
                {
                    Bullets.Remove(bullet);
                }

                _bulletsToRemove.Clear();

                foreach (var wave in Waves)
                {
                    wave.CullDeadCreeps();
                }

                if (_softFinished)
                {
                    if (!_awaitingCooldown)
                    {
                        int totalCreeps = 0;

                        foreach (CreepWave wave in Waves)
                        {
                            totalCreeps += wave.Creeps.Count;
                        }

                        if (totalCreeps == 0)
                        {
                            _awaitingCooldown = true;
                        }
                    }

                    if (_awaitingCooldown)
                    {
                        _cooldownTimer += delta;
                        if (_cooldownTimer >= _cooldownGoal)
                        {
                            IsFinished = true;
                            break;
                        }
                    }
                }
            }
        }