//----------------------------------------------------------------------------- // 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); }
//----------------------------------------------------------------------------- // 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); } }