public override void Update() { base.Update(); if (state == TileBridgeState.Creating) { timer++; if (timer >= 10) { timer = 0; if (RoomControl.IsTileInBounds(pieceLocation) && GetConnectedTile(pieceLocation) == null) { AudioSystem.PlaySound(GameData.SOUND_BARRIER); TileData pieceTileData = Resources.GetResource <TileData>( isVertical ? "bridge_vertical" : "bridge_horizontal"); Tile pieceTile = Tile.CreateTile(pieceTileData); RoomControl.PlaceTileOnHighestLayer(pieceTile, pieceLocation); pieceLocation += Directions.ToPoint(bridgeDirection); } else { state = TileBridgeState.Created; } } } else if (state == TileBridgeState.Destroying) { timer++; if (timer >= 10) { timer = 0; TileBridge pieceTile = GetConnectedTile(pieceLocation); if (pieceTile != null) { RoomControl.RemoveTile(pieceTile); AudioSystem.PlaySound(GameData.SOUND_BARRIER); } pieceLocation -= Directions.ToPoint(bridgeDirection); if (pieceLocation == Location) { state = TileBridgeState.Destroyed; } } } }
//----------------------------------------------------------------------------- // Internal methods //----------------------------------------------------------------------------- private void Crumble() { RoomControl.RemoveTile(this); RoomControl.SpawnEntity(new EffectFallingObject(DepthLayer.EffectCrackedFloorCrumble), Center); // Play crumble sound AudioSystem.PlaySound(GameData.SOUND_FLOOR_CRUMBLE); // Create a pit tile if this tile is on the bottom layer. if (Layer == 0) { TileData pitTileData = Resources.GetResource <TileData>("pit"); Tile pitTile = Tile.CreateTile(pitTileData); RoomControl.PlaceTile(pitTile, Location, Layer); } }
//----------------------------------------------------------------------------- // Bridge Methods //----------------------------------------------------------------------------- public void CreateBridge(bool instantaneous = false, bool rememberState = false) { if (bridgeDirection >= 0 && (state == TileBridgeState.Destroyed || state == TileBridgeState.Destroying)) { if (state == TileBridgeState.Destroying) { pieceLocation += Directions.ToPoint(bridgeDirection); } else { pieceLocation = Location + Directions.ToPoint(bridgeDirection); } state = TileBridgeState.Creating; timer = 0; } if (instantaneous) { while (state == TileBridgeState.Creating) { if (RoomControl.IsTileInBounds(pieceLocation) && GetConnectedTile(pieceLocation) == null) { TileData pieceTileData = Resources.GetResource <TileData>( isVertical ? "bridge_vertical" : "bridge_horizontal"); Tile pieceTile = Tile.CreateTile(pieceTileData); RoomControl.PlaceTileOnHighestLayer(pieceTile, pieceLocation); pieceLocation += Directions.ToPoint(bridgeDirection); } else { state = TileBridgeState.Created; break; } } } if (state == TileBridgeState.Created || state == TileBridgeState.Creating) { Properties.Set("built", true); } }
// Called when the player digs the tile with the shovel. public virtual bool OnDig(int direction) { if (isMoving || !IsDigable) { return(false); } // Remove/dig the tile. if (layer == 0) { roomControl.RemoveTile(this); // Spawn the a "dug" tile in this tile's place. TileData data = Resources.GetResource <TileData>("dug"); Tile dugTile = Tile.CreateTile(data); roomControl.PlaceTile(dugTile, location, layer); Graphics.PlaySprite(GameData.SPR_TILE_DUG); } else { roomControl.RemoveTile(this); } if (properties.GetBoolean("disable_on_destroy", false)) { Properties.Set("enabled", false); // TODO: this won't exactly work anymore. } // Spawn drops. Entity dropEntity = SpawnDrop(); if (dropEntity != null) { if (dropEntity is Collectible) { (dropEntity as Collectible).PickupableDelay = GameSettings.COLLECTIBLE_DIG_PICKUPABLE_DELAY; } dropEntity.Physics.Velocity = Directions.ToVector(direction) * GameSettings.DROP_ENTITY_DIG_VELOCITY; } return(true); }
//----------------------------------------------------------------------------- // Overridden methods //----------------------------------------------------------------------------- public override void OnInitialize() { if (IsRaised) { Graphics.PlayAnimation(GameData.ANIM_TILE_CROSSING_GATE_RAISE); } else { Graphics.PlayAnimation(GameData.ANIM_TILE_CROSSING_GATE_LOWER); } bool isFacingLeft = Properties.GetBoolean("face_left", false); Graphics.AnimationPlayer.SkipToEnd(); Graphics.SubStripIndex = (isFacingLeft ? 1 : 0); CollisionModel = (isFacingLeft ? GameData.MODEL_EDGE_W : GameData.MODEL_EDGE_E); Point2I trackLocation = Location; if (isFacingLeft) { trackLocation.X -= 1; } else { trackLocation.X += 1; } // Create the dummy tile to serve as the solid dummySolidTile = Tile.CreateTile(new TileData()); dummySolidTile.CollisionModel = new CollisionModel(new Rectangle2I(0, 0, 16, 8)); dummySolidTile.ClingWhenStabbed = false; dummySolidTile.SolidType = TileSolidType.Solid; dummySolidTile.IsSolid = !IsRaised; RoomControl.PlaceTile(dummySolidTile, trackLocation, Layer); }