public override bool Generate(CubeWorld.World.CubeWorld world) { switch (generationStep) { case 0: world.tileManager.EnqueueTilesWithRules(); world.tileManager.enqueueTileUpdates = true; generationStep++; break; case 1: if (world.tileManager.pendingTileUpdates.Count > 0 && initialIterations-- >= 0) { world.tileManager.Update(TILE_UPDATE_STEP); } else { generationStep++; } break; case 2: LightModelAmbient.InitLuminance(world.tileManager); generationStep++; break; case 3: LightModelLightSource.InitLuminance(world.tileManager); generationStep++; break; case 4: world.tileManager.updateLighting = true; world.tileManager.reportTileInvalidated = true; world.gameplay.WorldCreated(); return(true); } return(false); }
public void SetTileOnFire(TilePosition pos, bool onFire) { if (GetTileType(pos) != TileDefinition.EMPTY_TILE_TYPE) { if (tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].OnFire != onFire) { tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].OnFire = onFire; if (onFire) { ExecuteTileActions(pos, TileActionRule.ActionType.ONFIRE); if (tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].LightSource == false) { tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].LightSource = true; if (tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].CastShadow) { tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].CastShadow = false; if (updateLighting) { LightModelAmbient.UpdateLuminanceDark(this, pos); } } if (updateLighting) { LightModelLightSource.UpdateLuminanceLight(this, pos, (byte)(Tile.MAX_LUMINANCE - 1)); } else { SetTileLightSourceLuminance(pos, (byte)(Tile.MAX_LUMINANCE - 1)); } } } else { TileDefinition def = GetTileDefinition(GetTileType(pos)); if (tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].LightSource != (def.lightSourceIntensity > 0)) { if (updateLighting) { LightModelLightSource.UpdateLuminanceDark(this, pos); } tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].LightSource = false; if (def.castShadow != tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].CastShadow != def.castShadow) { tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].CastShadow = false; if (updateLighting) { LightModelAmbient.UpdateLuminanceLight(this, pos, GetTileAmbientLuminance(pos)); } } } } if (enqueueTileUpdates) { EnqueueInvalidatedTileAndNearTiles(pos); } if (reportTileInvalidated) { ReportTileInvalidated(pos); } } } }
public void MoveTile(TilePosition oldTilePos, TilePosition newTilePos) { Tile oldTile = tiles[oldTilePos.x | (oldTilePos.y << sizeXbits) | (oldTilePos.z << sizeXBitsYBits)]; Tile oldTileUpdated = oldTile; if (oldTile.LightSource) { if (updateLighting) { LightModelLightSource.UpdateLuminanceDark(this, oldTilePos); oldTileUpdated.LightSourceLuminance = GetTileLightSourceLuminance(oldTilePos); } else { oldTile.LightSourceLuminance = 0; } } oldTileUpdated.tileType = TileDefinition.EMPTY_TILE_TYPE; oldTileUpdated.Energy = 0; oldTileUpdated.Destroyed = false; oldTileUpdated.OnFire = false; oldTileUpdated.CastShadow = false; oldTileUpdated.LightSource = false; oldTileUpdated.Dynamic = false; oldTileUpdated.ExtraData = 0; tiles[oldTilePos.x | (oldTilePos.y << sizeXbits) | (oldTilePos.z << sizeXBitsYBits)] = oldTileUpdated; if (updateLighting) { if (oldTileUpdated.CastShadow != oldTile.CastShadow) { LightModelAmbient.UpdateLuminanceLight(this, oldTilePos, oldTileUpdated.AmbientLuminance); LightModelLightSource.UpdateLuminanceLight(this, oldTilePos, oldTileUpdated.LightSourceLuminance); } } UpdateTopPosition(oldTilePos, TileDefinition.EMPTY_TILE_TYPE); Tile newTileOriginal = GetTile(newTilePos); Tile newTile = oldTile; if (newTile.LightSource == false) { newTile.LightSourceLuminance = newTileOriginal.LightSourceLuminance; } newTile.AmbientLuminance = newTileOriginal.AmbientLuminance; tiles[newTilePos.x | (newTilePos.y << sizeXbits) | (newTilePos.z << sizeXBitsYBits)] = newTile; if (newTile.Dynamic) { DynamicTile dynamicTile = dynamicTiles[oldTilePos]; dynamicTiles.Remove(oldTilePos); dynamicTiles[newTilePos] = dynamicTile; dynamicTile.tilePosition = newTilePos; if (dynamicTilesTimeout.ContainsKey(oldTilePos)) { dynamicTilesTimeout.Remove(oldTilePos); dynamicTilesTimeout[newTilePos] = dynamicTile; } } if (updateLighting) { if (newTile.CastShadow) { LightModelAmbient.UpdateLuminanceDark(this, newTilePos); LightModelLightSource.UpdateLuminanceDark(this, newTilePos); } if (newTile.LightSource) { LightModelLightSource.UpdateLuminanceLight(this, newTilePos, newTile.LightSourceLuminance); } } else { if (newTile.LightSource) { SetTileLightSourceLuminance(newTilePos, newTile.LightSourceLuminance); } } UpdateTopPosition(newTilePos, newTile.tileType); if (enqueueTileUpdates) { EnqueueInvalidatedTileAndNearTiles(oldTilePos); EnqueueInvalidatedTileAndNearTiles(newTilePos); } if (reportTileInvalidated) { ReportTileInvalidated(oldTilePos); ReportTileInvalidated(newTilePos); } }
public void SetTileType(TilePosition pos, byte type) { Tile oldTile = tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)]; if (oldTile.Dynamic) { SetTileDynamic(pos, false, false, 0); oldTile.Dynamic = false; } if (oldTile.LightSource) { if (updateLighting) { LightModelLightSource.UpdateLuminanceDark(this, pos); oldTile.LightSourceLuminance = GetTileLightSourceLuminance(pos); } else { oldTile.LightSourceLuminance = 0; } } Tile newTile = oldTile; TileDefinition tileDefinition = GetTileDefinition(type); newTile.tileType = type; newTile.Energy = (byte)tileDefinition.energy; newTile.Destroyed = false; newTile.OnFire = false; newTile.CastShadow = tileDefinition.castShadow; newTile.LightSource = (tileDefinition.lightSourceIntensity > 0); newTile.ExtraData = 0; tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)] = newTile; if (updateLighting) { if (newTile.CastShadow != oldTile.CastShadow) { if (newTile.CastShadow) { LightModelAmbient.UpdateLuminanceDark(this, pos); LightModelLightSource.UpdateLuminanceDark(this, pos); } else { LightModelAmbient.UpdateLuminanceLight(this, pos, newTile.AmbientLuminance); LightModelLightSource.UpdateLuminanceLight(this, pos, newTile.LightSourceLuminance); } } if (tileDefinition.lightSourceIntensity > 0) { LightModelLightSource.UpdateLuminanceLight(this, pos, tileDefinition.lightSourceIntensity); } } else { if (newTile.LightSource) { SetTileLightSourceLuminance(pos, tileDefinition.lightSourceIntensity); } } ExecuteTileActions(pos, TileActionRule.ActionType.CREATED); if (enqueueTileUpdates) { EnqueueInvalidatedTileAndNearTiles(pos); } UpdateTopPosition(pos, type); if (reportTileInvalidated) { ReportTileInvalidated(pos); } }