Example #1
0
 Vector2 getCollidedDest(Vector2 dest)
 {
     float shimmy = 10f;
     Terrain terrain = terrainCollider;
     if (this.getDestCenter(dest).X < terrain.collisionCenter.X)
     {
         if (this.getDestCenter(dest).Y < terrain.collisionCenter.Y && terrain.collisionCenter.Y - this.getDestCenter(dest).Y > terrain.collisionCenter.X - this.getDestCenter(dest).X)
         {
             dest.X = terrain.collisionBox.X - getWidth() - shimmy;
             dest.Y = terrain.collisionBox.Y - getHeight();
         }
         else if (this.getDestCenter(dest).Y > terrain.collisionCenter.Y && this.getDestCenter(dest).Y - terrain.collisionCenter.Y > terrain.collisionCenter.X - this.getDestCenter(dest).X)
         {
             dest.X = terrain.collisionBox.X - getWidth() - shimmy;
             dest.Y = terrain.collisionBox.Y + terrain.collisionBox.Height;
         }
         else
         {
             if (this.getDestCenter(dest).Y < terrain.collisionCenter.Y)
             {
                 dest.Y = terrain.collisionBox.Y - getHeight() - shimmy;
                 dest.X = terrain.collisionBox.X - getWidth() - shimmy;
             }
             else
             {
                 dest.Y = terrain.collisionBox.Y + terrain.collisionBox.Height + shimmy;
                 dest.X = terrain.collisionBox.X - getWidth() - shimmy;
             }
         }
     }
     else
     {
         if (this.getDestCenter(dest).Y < terrain.collisionCenter.Y && terrain.collisionCenter.Y - this.getDestCenter(dest).Y > this.getDestCenter(dest).X - terrain.collisionCenter.X)
         {
             dest.X = terrain.collisionBox.X + terrain.collisionBox.Width + shimmy;
             dest.Y = terrain.collisionBox.Y - getHeight() - shimmy;
         }
         else if (this.getDestCenter(dest).Y > terrain.collisionCenter.Y && this.getDestCenter(dest).Y - terrain.collisionCenter.Y > this.getDestCenter(dest).X - terrain.collisionCenter.X)
         {
             dest.X = terrain.collisionBox.X + terrain.collisionBox.Width + shimmy;
             dest.Y = terrain.collisionBox.Y + terrain.collisionBox.Height + shimmy;
         }
         else
         {
             if (this.getDestCenter(dest).Y < terrain.collisionCenter.Y)
             {
                 dest.Y = terrain.collisionBox.Y - getHeight() -shimmy;
                 dest.X = terrain.collisionBox.X + terrain.collisionBox.Width + shimmy;
             }
             else
             {
                 dest.Y = terrain.collisionBox.Y + terrain.collisionBox.Height + shimmy;
                 dest.X = terrain.collisionBox.X + terrain.collisionBox.Width + shimmy;
             }
         }
     }
     terrainCollider = null;
     return dest;
 }
Example #2
0
        public override void collide(ScreenObject collider, TimeSpan timeSpan)
        {
            float shimmy = (float)timeSpan.TotalMilliseconds * _speed;

            if (collider == _killer || _state == STATE_DEAD || _state == STATE_DYING)
                return;
            if (collider is Terrain)
            {
                terrainCollider = (Terrain)collider;
            }
            else if (collider is Shot && collider.getSide() != _side && !(collider is Pavise) && collider.getState() != STATE_DEAD && collider.getState() != Shot.STATE_GROUND)
            {
                if (this is Targeteer)
                {
                    if (collider is ArquebusierShot || (collider is CrossbowShot && collider.getSide() == BattleScreen.SIDE_PLAYER))
                        ((Targeteer)this).shieldBreak();
                    else
                        ((Targeteer)this).shieldBlock();
                }
                else if (this is CrossbowmanPavise)
                {
                    if (_side == BattleScreen.SIDE_PLAYER)
                        ((CrossbowmanPavise)this).shieldBlock();
                    else
                        hit();
                }
                else if (!(this is Leader) && (this._side == BattleScreen.SIDE_ENEMY || _screen.getPlayerFormation() == this.myFormation))
                    hit();

                ((Shot)collider).hit();

                _killer = collider;
            }
            else if ((collider is PikeTip && collider.getSide() != _side) && (_state != STATE_DEAD && _state != STATE_DYING && _state != STATE_ROUTE && _state != STATE_ROUTED))
            {
                if (((PikeTip)collider).getSoldierState() == Pikeman.STATE_LOWERED)
                {
                    if (!(this is Targeteer) && !(this is Wolf) && _side != BattleScreen.SIDE_NEUTRAL)
                    {
                        hit();
                        _killer = collider;
                        ((PikeTip)collider).getPikeman().recoil();
                    }
                    else if (this is Targeteer)
                    {
                        if ( (!(this is Colmillos) && ((Targeteer)this)._hasShield) || (this is Colmillos && !((ColmillosFormation)((Colmillos)this).myFormation).attacked))
                        {
                            ((Targeteer)this).shield();
                            this.setReactionDest(collider.getCenter().X + 50f);//((collider.getSide() == BattleScreen.SIDE_ENEMY? 1 : -1 ) * collider.getWidth() * 0.5f + Soldier.WIDTH * 0.35f
                        }
                        else
                        {
                            hit();
                            _killer = collider;
                            ((PikeTip)collider).getPikeman().recoil();
                        }
                    }
                }
            }
            else if ((collider is WeaponSwing && collider.getSide() != _side) && (_state != STATE_DEAD && _state != STATE_DYING && _state != STATE_ROUTE && _state != STATE_ROUTED))
            {
                if (((WeaponSwing)collider).getSoldier() is Colmillos)
                {
                    if (!((WeaponSwing)collider).hit)
                    {
                        if (this is Targeteer)
                            ((Targeteer)this).shieldBreak();
                        else
                        {
                            hit();
                            _killer = collider;
                        }
                        ((WeaponSwing)collider).hit = true;
                        _screen.removeScreenObject(collider);
                    }

                }
                else if (this is Targeteer)
                    ((Targeteer)this).shieldBreak();
                else
                {
                    hit();
                    _killer = collider;
                }
            }
            else if ((collider is LanceTip && collider.getSide() != _side) && (_state != STATE_DEAD && _state != STATE_DYING && _state != STATE_MELEE_WIN && _state != STATE_MELEE_LOSS && _state != STATE_ROUTE && _state != STATE_ROUTED))
            {
                if (this is Targeteer)
                    ((Targeteer)this).shieldBreak();
                else
                    hit();
                ((LanceTip)collider).getCavalry().recoil();
                _killer = collider;
            }
            else if (collider is Soldier)
            {
                bool colliderInFormation = false;
                bool thisInFormation = false;
                if (_screen.getPlayerFormation() != null && _screen.getPlayerFormation().getSoldiers() != null)
                {
                    colliderInFormation = ((Soldier)collider).myFormation == _screen.getPlayerFormation();
                    thisInFormation = myFormation == _screen.getPlayerFormation();
                }
                if (_state != STATE_DEAD && _state != STATE_DYING && _state != STATE_MELEE_WIN && _state != STATE_MELEE_LOSS && (!(this is Targeteer) || _state != Targeteer.STATE_SHIELDBREAK) && (!(this is DismountedCavalry) || _state != DismountedCavalry.STATE_FALLING))
                {
                    if (this is CrossbowmanPavise && collider is CrossbowmanPavise
                        && (this._state == STATE_CHARGING || this._state == STATE_RELOADING || this._state == STATE_ATTACKING || this._state == CrossbowmanPavise.STATE_PLACING || this._state == CrossbowmanPavise.STATE_RETRIEVING)
                        && (collider.getState() == STATE_CHARGING || collider.getState() == STATE_RELOADING || collider.getState() == STATE_ATTACKING || collider.getState() == CrossbowmanPavise.STATE_PLACING || collider.getState() == CrossbowmanPavise.STATE_RETRIEVING))
                    {
                        Vector2 changeVector = new Vector2(0f, (float)timeSpan.TotalMilliseconds * _speed);
                        ((CrossbowmanPavise)this).postRetrieveState = _state;
                        ((CrossbowmanPavise)this).paviseRetrieve();
                        if (this._position.Y < collider._position.Y)
                        {
                            this._position -= changeVector;
                            ((CrossbowmanPavise)this)._meleeDestination -= changeVector;
                            ((CrossbowmanPavise)this).chargePosition -= changeVector;
                        }
                        else
                        {
                            this._position += changeVector;
                            ((CrossbowmanPavise)this)._meleeDestination += changeVector;
                            ((CrossbowmanPavise)this).chargePosition += changeVector;
                        }
                    }
                    //push from collisions with other charging enemy soldiers
                    else if (myFormation == null && ((Soldier)collider).myFormation == null
                        && _side == BattleScreen.SIDE_ENEMY && collider.getSide() == BattleScreen.SIDE_ENEMY
                        && (collider.getState() != STATE_DYING && collider.getState() != STATE_DEAD))
                    {
                        if (this._position.Y < collider._position.Y)
                        {
                            this._position -= new Vector2(0f, (float)timeSpan.TotalMilliseconds * _speed);
                        }
                        else
                        {
                            this._position += new Vector2(0f, (float)timeSpan.TotalMilliseconds * _speed);
                        }
                    }
                    else
                    {
                        if (!((collider.getSide() == BattleScreen.SIDE_NEUTRAL && _side == BattleScreen.SIDE_PLAYER) || (collider.getSide() == BattleScreen.SIDE_PLAYER && _side == BattleScreen.SIDE_NEUTRAL)))
                        {
                            //fighting
                            if (_side != collider.getSide() && !(this is Leader || collider is Leader) && collider.getState() != STATE_DEAD && collider.getState() != STATE_DYING && collider.getState() != STATE_MELEE_WIN && collider.getState() != STATE_MELEE_LOSS && (!(collider is Targeteer) || collider.getState() != Targeteer.STATE_SHIELDBREAK) && (!(collider is DismountedCavalry) || collider.getState() != DismountedCavalry.STATE_FALLING) && (!(collider is Wolf) || collider.getState() != Wolf.STATE_KILL) && (!(this is Wolf) || this._state != Wolf.STATE_KILL))
                            {
                                bool rescueFight = (_side == BattleScreen.SIDE_PLAYER && !thisInFormation) ||
                                                    (collider.getSide() == BattleScreen.SIDE_PLAYER && !colliderInFormation);

                                if (this is Colmillos)
                                {
                                    if (_state != Colmillos.STATE_ATTACK)
                                        attack();
                                    _destination = _position;
                                }
                                else if (collider is Colmillos)
                                {
                                    if (collider.getState() != Colmillos.STATE_ATTACK)
                                        ((Colmillos)collider).attack();

                                    ((Colmillos)collider)._destination = ((Colmillos)collider)._position;
                                }
                                else if (this is Dopple)
                                {
                                    if (_state != STATE_ATTACKING)
                                        attack();
                                    ((Soldier)collider).engage(false, _position, this, rescueFight);
                                }
                                else if (collider is Dopple)
                                {
                                    if (collider.getState() != STATE_ATTACKING)
                                        ((Dopple)collider).attack();
                                    engage(false, collider.getPosition(), (Soldier)collider, rescueFight);
                                }
                                else if (_side == BattleScreen.SIDE_ENEMY || this is Wolf)
                                {
                                    engage(true, collider.getPosition(), (Soldier)collider, rescueFight);
                                    ((Soldier)collider).engage(false, _position, this, rescueFight);
                                }
                                else
                                {
                                    engage(false, collider.getPosition(), (Soldier)collider, rescueFight);
                                    ((Soldier)collider).engage(true, _position, this, rescueFight);
                                }
                            }
                            //rescue
                            else if (_side == BattleScreen.SIDE_PLAYER && collider.getSide() == BattleScreen.SIDE_PLAYER && (thisInFormation != colliderInFormation))
                            {
                                if (thisInFormation &&
                                    collider.getState() != STATE_CHARGING && collider.getState() != STATE_DYING
                                    && collider.getState() != STATE_DEAD
                                    && collider.getState() != STATE_MELEE_LOSS && collider.getState() != STATE_MELEE_WIN
                                    && collider.getState() != STATE_ATTACKING && collider.getState() != STATE_RELOADING)
                                {
                                    ((Soldier)collider)._state = STATE_READY;
                                    ((Soldier)collider)._reacting = false;
                                    if (((Soldier)collider).myFormation != null && ((Soldier)collider).myFormation != _screen.getPlayerFormation())
                                        ((Soldier)collider).myFormation.removeSoldier(((Soldier)collider));
                                    _screen.getPlayerFormation().addSoldier((Soldier)collider);
                                    _screen.removeLooseSoldier((Soldier)collider);
                                }
                                else if (colliderInFormation &&
                                    this.getState() != STATE_CHARGING && this.getState() != STATE_DYING
                                    && this.getState() != STATE_DEAD
                                    && this.getState() != STATE_MELEE_LOSS && this.getState() != STATE_MELEE_WIN
                                    && this.getState() != STATE_ATTACKING && this.getState() != STATE_RELOADING)
                                {
                                    _reacting = false;
                                    _state = STATE_READY;
                                    if (myFormation != null)
                                        myFormation.removeSoldier(this);
                                    _screen.getPlayerFormation().addSoldier(this);
                                    _screen.removeLooseSoldier(this);
                                }
                            }
                        }
                    }
                }
            }
        }
Example #3
0
        public static void getNewTerrain(int terrainClass, BattleScreen screen, float x, float y, int index)
        {
            Terrain newTerrain = null;
            switch (terrainClass)
            {
                case Terrain.CLASS_TREE0:
                    newTerrain = new Terrain(screen, PikeAndShotGame.TREE0, BattleScreen.SIDE_PLAYER, x, y,new  Rectangle((int)(x + PikeAndShotGame.TREE0.Width / 4), (int)(y + PikeAndShotGame.TREE0.Height *2/3), (int)(PikeAndShotGame.TREE0.Width / 2), (int)(PikeAndShotGame.TREE0.Height/8)));
                    screen.addTerrain(newTerrain);
                    break;
                case Terrain.CLASS_TREE1:
                    newTerrain = new Terrain(screen, PikeAndShotGame.TREE1, BattleScreen.SIDE_PLAYER, x, y, new Rectangle((int)x + 20, (int)y + PikeAndShotGame.TREE1.Height / 2, PikeAndShotGame.TREE1.Width - 40, PikeAndShotGame.TREE1.Height/3));
                    screen.addTerrain(newTerrain);
                    break;
                case Terrain.CLASS_TREE2:
                    newTerrain = new Terrain(screen, PikeAndShotGame.TREE2, BattleScreen.SIDE_PLAYER, x, y);
                    screen.addTerrain(newTerrain);
                    break;
                case Terrain.CLASS_HORIROAD:
                    newTerrain = new Terrain(screen, PikeAndShotGame.ROAD_HORIZONTAL, BattleScreen.SIDE_PLAYER, x, y, 0);
                    screen.addTerrain(newTerrain);
                    break;
                case Terrain.CLASS_HORIROAD2:
                    newTerrain = new Terrain(screen, PikeAndShotGame.ROAD_HORIZONTAL_2, BattleScreen.SIDE_PLAYER, x, y, 0);
                    screen.addTerrain(newTerrain);
                    break;
                case Terrain.CLASS_TURNROAD:
                    newTerrain = new Terrain(screen, PikeAndShotGame.ROAD_TURN, BattleScreen.SIDE_PLAYER, x, y, 0);
                    screen.addTerrain(newTerrain);
                    break;
                case Terrain.CLASS_TURNROADMARKER:
                    newTerrain = new Terrain(screen, PikeAndShotGame.ROAD_TURN_MARKER, BattleScreen.SIDE_PLAYER, x, y, new Rectangle((int)(x + PikeAndShotGame.ROAD_TURN_MARKER.Width / 4), (int)(y + PikeAndShotGame.ROAD_TURN_MARKER.Height / 2), (int)(PikeAndShotGame.ROAD_TURN_MARKER.Width / 2), (int)(PikeAndShotGame.ROAD_TURN_MARKER.Height/8)));
                    screen.addTerrain(newTerrain);
                    break;
                case Terrain.CLASS_MILEROADMARKER:
                    newTerrain = new Terrain(screen, PikeAndShotGame.ROAD_MILE_MARKER, BattleScreen.SIDE_PLAYER, x, y, new Rectangle((int)(x + PikeAndShotGame.ROAD_MILE_MARKER.Width / 4), (int)(y + PikeAndShotGame.ROAD_MILE_MARKER.Height /2), (int)(PikeAndShotGame.ROAD_MILE_MARKER.Width / 2), (int)(PikeAndShotGame.ROAD_MILE_MARKER.Height / 8)));
                    screen.addTerrain(newTerrain);
                    break;
                case Terrain.CLASS_BUSH0:
                    newTerrain = new Terrain(screen, PikeAndShotGame.BUSH0, BattleScreen.SIDE_PLAYER, x, y);
                    screen.addTerrain(newTerrain);
                    break;
                case Terrain.CLASS_BUSH1:
                    newTerrain = new Terrain(screen, PikeAndShotGame.BUSH1, BattleScreen.SIDE_PLAYER, x, y);
                    screen.addTerrain(newTerrain);
                    break;
                case Terrain.CLASS_BUSH2:
                    newTerrain = new Terrain(screen, PikeAndShotGame.BUSH2, BattleScreen.SIDE_PLAYER, x, y);
                    screen.addTerrain(newTerrain);
                    break;

            }
            if (newTerrain != null)
                newTerrain.index = index;
        }
Example #4
0
 protected void spawnInitialTerrain()
 {
     int next = 0;
     for (int i = 0; i < 100; i++)
     {
         next = PikeAndShotGame.random.Next(7);
         Terrain terrain;
         if (next == 2)
         {
             terrain = new Terrain(this, PikeAndShotGame.ROAD_TERRAIN[next], SIDE_PLAYER, PikeAndShotGame.random.Next(PikeAndShotGame.SCREENWIDTH), PikeAndShotGame.random.Next(PikeAndShotGame.SCREENHEIGHT), 8000f, 1500f);
             _terrain.Add(terrain);
         }
         else
         {
             terrain = new Terrain(this, PikeAndShotGame.ROAD_TERRAIN[next], SIDE_PLAYER, PikeAndShotGame.random.Next(PikeAndShotGame.SCREENWIDTH), PikeAndShotGame.random.Next(PikeAndShotGame.SCREENHEIGHT));
             _terrain.Add(terrain);
         }
         terrain.generated = true;
     }
 }
Example #5
0
        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        public virtual void update(GameTime gameTime)
        {
            getInput(gameTime.ElapsedGameTime);

            _elapsedTime = gameTime.TotalGameTime.TotalMilliseconds;

            foreach (Shot shot in _shots)
            {
                shot.update(gameTime.ElapsedGameTime);
                if (shot.isDead())
                    _deadThings.Add(shot);
            }

            if(_formation != null)
                _formation.update(gameTime.ElapsedGameTime);

            foreach (ScreenObject screeny in _screenObjectsToAdd)
            {
                _screenObjects.Add(screeny);
            }
            _screenObjectsToAdd.Clear();

            foreach (ScreenAnimation screeny in this._screenAnimationsToAdd)
            {
                _screenAnimations.Add(screeny);
            }
            _screenAnimationsToAdd.Clear();

            if (playerInPlay)
            {
                foreach (Formation f in _enemyFormations)
                {
                    f.update(gameTime.ElapsedGameTime);
                    if (f.getSide() == SIDE_ENEMY && (f.getPosition().X < (-1 * f.getTotalRows() * Soldier.WIDTH) + _mapOffset.X || f.getTotalRows() == 0))
                    {
                        if (!f.hasSoldierOnScreen() && this is LevelScreen)
                            _deadFormations.Add(f);
                    }
                }
            }

            foreach (Formation f in _enemyFormationsToAdd)
                _enemyFormations.Add(f);

            _enemyFormationsToAdd.Clear();

            //checking for empty or off screen formations
            foreach (Formation f in _deadFormations)
            {
                _enemyFormations.Remove(f);
                foreach (Soldier sold in f.getSoldiers())
                    _deadThings.Add(sold);
            }
            _deadFormations.Clear();

            checkCollisions(gameTime.ElapsedGameTime);

            foreach (Soldier sold in _looseSoldiers)
            {
                sold.update(gameTime.ElapsedGameTime);

                if (sold.getSide() == BattleScreen.SIDE_PLAYER && sold.getPosition().X > PikeAndShotGame.SCREENWIDTH + getMapOffset().X + 2f * Soldier.WIDTH)
                    sold.setState(Soldier.STATE_DEAD);
                else if (sold.getSide() == BattleScreen.SIDE_ENEMY && sold.getPosition().X < -210 + getMapOffset().X)
                    sold.setState(Soldier.STATE_DEAD);

                if (sold.isDead())
                {
                    _deadThings.Add(sold);
                }
            }
            foreach (Soldier s in unlooseSoldiers)
            {
                _looseSoldiers.Remove(s);
            }
            unlooseSoldiers.Clear();

            foreach (Terrain t in _terrain)
            {
                if (t.isAnimated())
                {
                    t.update(gameTime.ElapsedGameTime);
                }

                if (t.getPosition().X < -t.getWidth() + getMapOffset().X && !(this is LevelEditorScreen))
                    t.setState(Soldier.STATE_DEAD);

                if (t.isDead())
                {
                    _deadThings.Add(t);
                }
            }

            foreach (Soldier newThing in _newThings)
            {
                _looseSoldiers.Add(newThing);
            }
            _newThings.Clear();

            // clean up of dead objects
            foreach (ScreenObject obj in _moreDeadThings)
                _deadThings.Add(obj);

            _moreDeadThings.Clear();

            foreach (ScreenObject obj in _deadThings)
            {
                if (obj is Shot)
                    _shots.Remove(obj);
                else if (obj is Soldier)
                {
                    _looseSoldiers.Remove(obj);
                }
                else if (obj is Terrain)
                {
                    _terrain.Remove(obj);
                    if (((Terrain)obj).generated)
                    {
                        int terrainIndex = PikeAndShotGame.random.Next(7);
                        Terrain terrain;
                        if (terrainIndex == 2)
                        {
                            terrain = new Terrain(this, PikeAndShotGame.ROAD_TERRAIN[terrainIndex], SIDE_PLAYER, PikeAndShotGame.SCREENWIDTH + getMapOffset().X, PikeAndShotGame.random.Next(PikeAndShotGame.SCREENHEIGHT), 8000f, 1500f);
                            _terrain.Add(terrain);
                        }
                        else
                        {
                            terrain = new Terrain(this, PikeAndShotGame.ROAD_TERRAIN[terrainIndex], SIDE_PLAYER, PikeAndShotGame.SCREENWIDTH + getMapOffset().X, PikeAndShotGame.random.Next(PikeAndShotGame.SCREENHEIGHT));
                            _terrain.Add(terrain);
                        }
                        terrain.generated = true;

                    }
                }

                if (obj is WeaponSwing)
                    ((WeaponSwing)obj).getHeight();

                _screenObjects.Remove(obj);
            }
            _deadThings.Clear();

            // screen animations

            foreach (ScreenAnimation ani in _screenAnimations)
            {
                ani.update(gameTime.ElapsedGameTime);
                if (ani.isDone())
                    _deadThings.Add(ani);
            }

            foreach (Object ani in _deadThings)
            {
                if (ani is ScreenAnimation)
                    _screenAnimations.Remove(ani);
                else if (ani is ScreenObject)
                    _screenObjects.Remove(ani);
            }

            _deadThings.Clear();
        }
Example #6
0
 public void addTerrain(Terrain t)
 {
     _terrain.Add(t);
 }