Exemplo n.º 1
0
        //-----------------------------------------------------------------------------
        // Overridden methods
        //-----------------------------------------------------------------------------
        public override void OnInitialize()
        {
            base.OnInitialize();

            direction		= Properties.GetInteger("direction", Directions.Down);
            extendLength	= 0.0f;
            isBeingPulled	= false;

            SetLength(0.0f);

            CollisionStyle		= CollisionStyle.Circular;
            IsSolid				= true;
            ClingWhenStabbed	= false;
            SolidType			= TileSolidType.HalfSolid;
            Rectangle2I collisionBox = new Rectangle2I(4, 4, 8, 8);
            collisionBox.ExtendEdge(direction, 5);
            CollisionModel = new CollisionModel(collisionBox);

            if (direction == Directions.Right)
                Graphics.PlaySprite(GameData.SPR_TILE_PULL_HANDLE_RIGHT);
            else if (direction == Directions.Up)
                Graphics.PlaySprite(GameData.SPR_TILE_PULL_HANDLE_UP);
            else if (direction == Directions.Left)
                Graphics.PlaySprite(GameData.SPR_TILE_PULL_HANDLE_LEFT);
            else if (direction == Directions.Down)
                Graphics.PlaySprite(GameData.SPR_TILE_PULL_HANDLE_DOWN);
        }
Exemplo n.º 2
0
        //-----------------------------------------------------------------------------
        // Internal methods
        //-----------------------------------------------------------------------------
        private void PerformDig(PlayerState state)
        {
            // Look for tiles to dig up.
            float distance = 6.5f;
            Vector2F center = Player.Center;
            if (Directions.IsVertical(Player.Direction))
                distance = 7.5f;
            else
                center.Y += 4.0f;
            Vector2F hotspot = GMath.Round(center) + (Directions.ToVector(Player.Direction) * distance);
            Point2I tileLoc = RoomControl.GetTileLocation(hotspot);
            if (!RoomControl.IsTileInBounds(tileLoc))
                return;

            Tile tile = RoomControl.GetTopTile(tileLoc);

            if (tile != null && tile.OnDig(Player.Direction)) {
                // Spawn dirt effect.
                Effect effect = new Effect();
                effect.Graphics.DepthLayer = DepthLayer.EffectDirt;
                effect.CreateDestroyTimer(15);
                effect.EnablePhysics(PhysicsFlags.HasGravity);
                effect.Physics.Velocity = Directions.ToVector(Player.Direction) * 0.5f;
                effect.Graphics.IsShadowVisible = false;
                effect.Graphics.PlayAnimation(GameData.ANIM_EFFECT_DIRT);
                effect.Graphics.SubStripIndex = Player.Direction;
                if (Directions.IsHorizontal(Player.Direction)) {
                    effect.Physics.ZVelocity	= 3.0f;
                    effect.Physics.Gravity		= 0.5f;
                }
                else {
                    effect.Physics.ZVelocity	= 2.5f;
                    effect.Physics.Gravity		= 0.4f;
                }
                RoomControl.SpawnEntity(effect, tile.Center);

                AudioSystem.PlaySound(GameData.SOUND_SHOVEL);
            }
            else {
                AudioSystem.PlaySound(GameData.SOUND_EFFECT_CLING);
            }

            // Check for monster interactions.
            Rectangle2I shovelHitBox = new Rectangle2I(-4, -4, 8, 8);
            shovelHitBox.Point += (Point2I) Player.CenterOffset;
            shovelHitBox.ExtendEdge(Player.Direction, 7);
            foreach (Monster monster in Player.Physics.GetEntitiesMeeting<Monster>(shovelHitBox, CollisionBoxType.Soft)) {
                monster.TriggerInteraction(InteractionType.Shovel, Player);
            }
        }