public void SetColor(DFCoord2d position, Color32 input) { if ((position.x + position.y * blockWidthTiles) < colors.Length) { colors[position.x + position.y * blockWidthTiles] = input; } }
DFCoord2d SnapDirection(Vector2 dir) { DFCoord2d outDir = new DFCoord2d(0, 0); if (Mathf.Abs(dir.x) > Math.Abs(dir.y)) { //x is the dominant direction if (dir.x > 0) { return(new DFCoord2d(1, 0)); } else { return(new DFCoord2d(-1, 0)); } } else { //y is the dominant dir. if (dir.y <= 0) { return(new DFCoord2d(0, 1)); } else { return(new DFCoord2d(0, -1)); } } }
void GenerateRegionMeshes() { if (GameSettings.Instance.rendering.distantTerrainDetail == GameSettings.LandscapeDetail.Off) { return; } foreach (RegionMap map in regionMaps.region_maps) { DFCoord2d pos = new DFCoord2d(map.map_x, map.map_y); RegionMaker region; if (!DetailRegions.ContainsKey(pos)) { region = Instantiate(regionPrefab); region.transform.parent = transform; region.transform.localPosition = RegionToUnityCoords(map.map_x, map.map_y, 0); DetailRegions[pos] = region; } else { region = DetailRegions[pos]; } region.CopyFromRemote(map, worldMap); region.name = region.worldNameEnglish; } }
public int AddTilePage(DFCoord2d coord) { if (!spriteIndices.ContainsKey(coord)) { spriteIndices[coord] = coordList.Count; coordList.Add(coord); } return(spriteIndices[coord]); }
public TiletypeShape GetSingleTile(DFCoord2d position) { if (position.x >= 0 && position.x < blockWidthTiles && position.y >= 0 && position.y < blockWidthTiles) { return(terrain[position.x + position.y * blockWidthTiles]); } else { return(TiletypeShape.EMPTY); } }
public Color32 GetColor(DFCoord2d position) { if ((position.x + position.y * blockWidthTiles) < colors.Length) { return(colors[position.x + position.y * blockWidthTiles]); } else { return(Color.white); } }
public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value) { if (coordList.ContainsKey(tile.buildingLocalPos)) { value = coordList[tile.buildingLocalPos].GetValue(tile, layer); return(true); } DFCoord2d any = new DFCoord2d(-1, -1); if (coordList.ContainsKey(any)) { value = coordList[any].GetValue(tile, layer); return(true); } value = default(T); return(false); }
void GenerateRegionMeshes() { foreach (WorldMap map in regionMaps.world_maps) { DFCoord2d pos = new DFCoord2d(map.map_x, map.map_y); if (DetailRegions.ContainsKey(pos)) { //Debug.Log("Region exists: " + pos.x + ", " + pos.y); continue; } RegionMaker region = Instantiate <RegionMaker>(regionPrefab); region.CopyFromRemote(map, DFConnection.Instance.NetMapInfo); region.name = region.worldNameEnglish; region.transform.parent = transform; DetailRegions[pos] = region; } }
void GenerateRegionMeshes() { if (!GameSettings.Instance.rendering.drawDistantTerrain) { return; } foreach (WorldMap map in regionMaps.world_maps) { DFCoord2d pos = new DFCoord2d(map.map_x, map.map_y); if (DetailRegions.ContainsKey(pos)) { continue; } RegionMaker region = Instantiate <RegionMaker>(regionPrefab); region.CopyFromRemote(map, worldMap); region.name = region.worldNameEnglish; region.transform.parent = transform; DetailRegions[pos] = region; } }
void AddTopFace(DFCoord2d position, float height) { Layer layer = Layer.Base; if (GetSingleTile(position) == TiletypeShape.FLOOR) { layer = Layer.Floor; } else if (GetSingleTile(position) == TiletypeShape.WALL) { layer = Layer.Top; } height -= 0.5f * tileHeight; //Todo: Weld vertices that should be welded //On second though, not with vertex colors there. int startindex = finalVertices.Count; finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, height, -(position.y - 0.5f) * tileWidth), layer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, height, -(position.y - 0.5f) * tileWidth), layer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, height, -(position.y + 0.5f) * tileWidth), layer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, height, -(position.y + 0.5f) * tileWidth), layer)); finalUVs.Add(new Vector2((float)(position.x) / 16.0f, -(float)(position.y) / 16.0f)); finalUVs.Add(new Vector2((float)(position.x + 1) / 16.0f, -(float)(position.y) / 16.0f)); finalUVs.Add(new Vector2((float)(position.x) / 16.0f, -(float)(position.y + 1) / 16.0f)); finalUVs.Add(new Vector2((float)(position.x + 1) / 16.0f, -(float)(position.y + 1) / 16.0f)); finalVertexColors.Add(GetColor(position)); finalVertexColors.Add(GetColor(position)); finalVertexColors.Add(GetColor(position)); finalVertexColors.Add(GetColor(position)); finalFaces.Add(startindex); finalFaces.Add(startindex + 1); finalFaces.Add(startindex + 2); finalFaces.Add(startindex + 1); finalFaces.Add(startindex + 3); finalFaces.Add(startindex + 2); }
TiletypeShape GetRelativeTile(DFCoord2d position, FaceDirection direction) { DFCoord2d relativePosition = new DFCoord2d(position.x, position.y); switch (direction) { case FaceDirection.North: relativePosition.y--; break; case FaceDirection.South: relativePosition.y++; break; case FaceDirection.East: relativePosition.x++; break; case FaceDirection.West: relativePosition.x--; break; } return(GetSingleTile(relativePosition)); }
public void SetSingleTile(DFCoord2d position, TiletypeShape tile) { terrain[position.x + position.y * blockWidthTiles] = tile; SetOpenness(); }
public void SetColor(DFCoord2d position, Color32 input) { if ((position.x + position.y * blockWidthTiles) < colors.Length) colors[position.x + position.y * blockWidthTiles] = input; }
public void StoreTiles(RemoteFortressReader.MapBlock block) { bool setTiles = block.tiles.Count > 0; bool setLiquids = block.water.Count > 0 || block.magma.Count > 0; if (!setTiles && !setLiquids) return; for (int xx = 0; xx < 16; xx++) for (int yy = 0; yy < 16; yy++) { DFCoord worldCoord = new DFCoord(block.map_x + xx, block.map_y + yy, block.map_z); DFCoord localCoord = WorldToLocalSpace(worldCoord); if (!InSliceBoundsLocal(localCoord)) { Debug.LogError(worldCoord + " is out of bounds for " + MapSize); return; } int netIndex = xx + (yy * 16); tilesPresent[PresentIndex(localCoord.x, localCoord.y, localCoord.z)] = true; if (setTiles) { tiles[localCoord.x, localCoord.y, localCoord.z].tileType = block.tiles[netIndex]; tiles[localCoord.x, localCoord.y, localCoord.z].material = block.materials[netIndex]; tiles[localCoord.x, localCoord.y, localCoord.z].base_material = block.base_materials[netIndex]; tiles[localCoord.x, localCoord.y, localCoord.z].layer_material = block.layer_materials[netIndex]; tiles[localCoord.x, localCoord.y, localCoord.z].vein_material = block.vein_materials[netIndex]; if (block.construction_items != null && block.construction_items.Count > netIndex) tiles[localCoord.x, localCoord.y, localCoord.z].construction_item = block.construction_items[netIndex]; else tiles[localCoord.x, localCoord.y, localCoord.z].construction_item = new MatPairStruct(-1, -1); } if (setLiquids) { tiles[localCoord.x, localCoord.y, localCoord.z].waterLevel = block.water[netIndex]; tiles[localCoord.x, localCoord.y, localCoord.z].magmaLevel = block.magma[netIndex]; } } foreach (var building in block.buildings) { for (int xx = building.pos_x_min; xx <= building.pos_x_max; xx++) for (int yy = building.pos_y_min; yy <= building.pos_y_max; yy++) { if((building.building_type.building_type == 29 || building.building_type.building_type == 29) && building.room != null && building.room.extents.Count > 0) { int buildingLocalX = xx - building.room.pos_x; int buildingLocalY = yy - building.room.pos_y; if (building.room.extents[buildingLocalY * building.room.width + buildingLocalX] == 0) continue; } DFCoord worldCoord = new DFCoord(xx,yy, block.map_z); DFCoord localCoord = WorldToLocalSpace(worldCoord); DFCoord2d buildingLocalCoord = new DFCoord2d(xx - building.pos_x_min, yy - building.pos_y_min); if (!InSliceBoundsLocal(localCoord)) { Debug.LogError(worldCoord + " is out of bounds for " + MapSize); continue; } tilesPresent[PresentIndex(localCoord.x, localCoord.y, localCoord.z)] = true; tiles[localCoord.x, localCoord.y, localCoord.z].buildingType = building.building_type; tiles[localCoord.x, localCoord.y, localCoord.z].buildingMaterial = building.material; tiles[localCoord.x, localCoord.y, localCoord.z].buildingLocalPos = buildingLocalCoord; } } }
public void Modify(int? tileType = null, MatPairStruct? material = null, MatPairStruct? base_material = null, MatPairStruct? layer_material = null, MatPairStruct? vein_material = null, int? waterLevel = null, int? magmaLevel = null, MatPairStruct? construction_item = null, int? rampType = null, BuildingStruct? buildingType = null, MatPairStruct? buildingMaterial = null, DFCoord2d? buildingLocalPos = null, BuildingDirection? buildingDirection = null, bool? hidden = null, byte? trunkPercent = null, DFCoord? positionOnTree = null, TileDigDesignation? digDesignation = null, List<Spatter> spatters = null) { if (tileType != null) { this.tileType = tileType.Value; } if (material != null) { this.material = material.Value; } if (base_material != null) { this.base_material = base_material.Value; } if (layer_material != null) { this.layer_material = layer_material.Value; } if (vein_material != null) { this.vein_material = vein_material.Value; } if (waterLevel != null) { this.waterLevel = waterLevel.Value; } if (magmaLevel != null) { this.magmaLevel = magmaLevel.Value; } if (construction_item != null) { this.construction_item = construction_item.Value; } if(rampType != null) { this.rampType = rampType.Value; } if(buildingType != null) { this.buildingType = buildingType.Value; } if(buildingMaterial != null) { this.buildingMaterial = buildingMaterial.Value; } if (buildingLocalPos != null) this.buildingLocalPos = buildingLocalPos.Value; if (buildingDirection != null) this.buildingDirection = buildingDirection.Value; if (hidden != null) Hidden = hidden.Value; if (trunkPercent != null) this.trunkPercent = trunkPercent.Value; if (positionOnTree != null) this.positionOnTree = positionOnTree.Value; if (digDesignation != null) this.digDesignation = digDesignation.Value; if (spatters != null) this.spatters = spatters; }
void GenerateRegionMeshes() { foreach (WorldMap map in regionMaps.world_maps) { DFCoord2d pos = new DFCoord2d(map.map_x, map.map_y); if (DetailRegions.ContainsKey(pos)) { //Debug.Log("Region exists: " + pos.x + ", " + pos.y); continue; } RegionMaker region = Instantiate<RegionMaker>(regionPrefab); region.CopyFromRemote(map, DFConnection.Instance.NetMapInfo); region.name = region.worldNameEnglish; region.transform.parent = transform; DetailRegions[pos] = region; } }
void AddSideFace(DFCoord2d position, FaceDirection direction) { Layer topLayer = Layer.Top; Layer bottomLayer = Layer.Base; float currentFloorHeight = -0.5f * tileHeight; float adjacentFloorHeight = -0.5f * tileHeight; switch (GetSingleTile(position)) { case TiletypeShape.WALL: currentFloorHeight = 0.5f * tileHeight; topLayer = Layer.Top; break; case TiletypeShape.RAMP: case TiletypeShape.FLOOR: currentFloorHeight = floorHeight - (0.5f * tileHeight); topLayer = Layer.Floor; break; default: break; } switch (GetRelativeTile(position, direction)) { case TiletypeShape.WALL: adjacentFloorHeight = 0.5f * tileHeight; bottomLayer = Layer.Top; break; case TiletypeShape.FLOOR: adjacentFloorHeight = floorHeight - (0.5f * tileHeight); bottomLayer = Layer.Floor; break; default: break; } if (currentFloorHeight <= adjacentFloorHeight) return; int startindex = finalVertices.Count; int uvPos = 0; switch (direction) { case FaceDirection.North: finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, currentFloorHeight, -(position.y - 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, currentFloorHeight, -(position.y - 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, adjacentFloorHeight, -(position.y - 0.5f) * tileWidth), bottomLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, adjacentFloorHeight, -(position.y - 0.5f) * tileWidth), bottomLayer)); uvPos = position.x; break; case FaceDirection.South: finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, currentFloorHeight, -(position.y + 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, currentFloorHeight, -(position.y + 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, adjacentFloorHeight, -(position.y + 0.5f) * tileWidth), bottomLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, adjacentFloorHeight, -(position.y + 0.5f) * tileWidth), bottomLayer)); uvPos = 16 - position.x; break; case FaceDirection.East: finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, currentFloorHeight, -(position.y + 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, currentFloorHeight, -(position.y - 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, adjacentFloorHeight, -(position.y + 0.5f) * tileWidth), bottomLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, adjacentFloorHeight, -(position.y - 0.5f) * tileWidth), bottomLayer)); uvPos = position.y; break; case FaceDirection.West: finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, currentFloorHeight, -(position.y - 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, currentFloorHeight, -(position.y + 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, adjacentFloorHeight, -(position.y - 0.5f) * tileWidth), bottomLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, adjacentFloorHeight, -(position.y + 0.5f) * tileWidth), bottomLayer)); uvPos = 16 - position.y; break; default: break; } finalUVs.Add(new Vector2(-(float)(uvPos + 1) / 16.0f, -(float)(0) / 16.0f)); finalUVs.Add(new Vector2(-(float)(uvPos) / 16.0f, -(float)(0) / 16.0f)); finalUVs.Add(new Vector2(-(float)(uvPos + 1) / 16.0f, -(float)(0 + 1) / 16.0f)); finalUVs.Add(new Vector2(-(float)(uvPos) / 16.0f, -(float)(0 + 1) / 16.0f)); finalVertexColors.Add(GetColor(position)); finalVertexColors.Add(GetColor(position)); finalVertexColors.Add(GetColor(position)); finalVertexColors.Add(GetColor(position)); finalFaces.Add(startindex); finalFaces.Add(startindex + 1); finalFaces.Add(startindex + 2); finalFaces.Add(startindex + 1); finalFaces.Add(startindex + 3); finalFaces.Add(startindex + 2); }
public void Modify(int?tileType = null, MatPairStruct?material = null, MatPairStruct?base_material = null, MatPairStruct?layer_material = null, MatPairStruct?vein_material = null, int?waterLevel = null, int?magmaLevel = null, MatPairStruct?construction_item = null, int?rampType = null, BuildingStruct?buildingType = null, MatPairStruct?buildingMaterial = null, DFCoord2d?buildingLocalPos = null, BuildingDirection?buildingDirection = null, bool?hidden = null, byte?trunkPercent = null, DFCoord?positionOnTree = null, TileDigDesignation?digDesignation = null, List <Spatter> spatters = null) { if (tileType != null) { this.tileType = tileType.Value; } if (material != null) { this.material = material.Value; } if (base_material != null) { this.base_material = base_material.Value; } if (layer_material != null) { this.layer_material = layer_material.Value; } if (vein_material != null) { this.vein_material = vein_material.Value; } if (waterLevel != null) { this.waterLevel = waterLevel.Value; } if (magmaLevel != null) { this.magmaLevel = magmaLevel.Value; } if (construction_item != null) { this.construction_item = construction_item.Value; } if (rampType != null) { this.rampType = rampType.Value; } if (buildingType != null) { this.buildingType = buildingType.Value; } if (buildingMaterial != null) { this.buildingMaterial = buildingMaterial.Value; } if (buildingLocalPos != null) { this.buildingLocalPos = buildingLocalPos.Value; } if (buildingDirection != null) { this.buildingDirection = buildingDirection.Value; } if (hidden != null) { Hidden = hidden.Value; } if (trunkPercent != null) { this.trunkPercent = trunkPercent.Value; } if (positionOnTree != null) { this.positionOnTree = positionOnTree.Value; } if (digDesignation != null) { this.digDesignation = digDesignation.Value; } if (spatters != null) { this.spatters = spatters; } }
public CollisionState CheckCollision(Vector3 pos) { var dfPos = GameMap.UnityToDFCoord(pos); var localPos = pos - GameMap.DFtoUnityCoord(dfPos); var tile = this[dfPos]; if (tile == null) { return(CollisionState.None); } var shape = tile.shape; var state = CollisionState.None; switch (shape) { case TiletypeShape.NO_SHAPE: case TiletypeShape.EMPTY: case TiletypeShape.ENDLESS_PIT: case TiletypeShape.TWIG: state = CollisionState.None; break; case TiletypeShape.FLOOR: case TiletypeShape.BOULDER: case TiletypeShape.PEBBLES: case TiletypeShape.BROOK_TOP: case TiletypeShape.SAPLING: case TiletypeShape.SHRUB: case TiletypeShape.BRANCH: case TiletypeShape.TRUNK_BRANCH: if (localPos.y < 0.5f) { state = CollisionState.Solid; } else { state = CollisionState.None; } break; case TiletypeShape.WALL: case TiletypeShape.FORTIFICATION: case TiletypeShape.BROOK_BED: case TiletypeShape.TREE_SHAPE: state = CollisionState.Solid; break; case TiletypeShape.STAIR_UP: if (localPos.y < 0.5f) { state = CollisionState.Solid; } else { state = CollisionState.Stairs; } break; case TiletypeShape.STAIR_DOWN: if (localPos.y < 0.5f) { state = CollisionState.Stairs; } else { state = CollisionState.None; } break; case TiletypeShape.STAIR_UPDOWN: state = CollisionState.Stairs; break; case TiletypeShape.RAMP: DFCoord2d dir = SnapDirection(localPos); break; case TiletypeShape.RAMP_TOP: break; default: break; } return(state); }
public void StoreTiles(RemoteFortressReader.MapBlock block, out bool setTiles, out bool setLiquids, out bool setSpatters) { setTiles = block.tiles.Count > 0; setLiquids = block.water.Count > 0 || block.magma.Count > 0; setSpatters = block.spatterPile.Count > 0; if (!setTiles && !setLiquids) { return; } for (int xx = 0; xx < 16; xx++) { for (int yy = 0; yy < 16; yy++) { DFCoord worldCoord = new DFCoord(block.map_x + xx, block.map_y + yy, block.map_z); if (!InSliceBounds(worldCoord)) { Debug.LogError(worldCoord + " is out of bounds for " + MapSize); return; } int netIndex = xx + (yy * 16); if (this[worldCoord] == null) { this[worldCoord] = new Tile(this, worldCoord); } if (block.tiles.Count > 0) { this[worldCoord].tileType = block.tiles[netIndex]; this[worldCoord].material = block.materials[netIndex]; this[worldCoord].base_material = block.base_materials[netIndex]; this[worldCoord].layer_material = block.layer_materials[netIndex]; this[worldCoord].vein_material = block.vein_materials[netIndex]; if (block.construction_items != null && block.construction_items.Count > netIndex) { this[worldCoord].construction_item = block.construction_items[netIndex]; } else { this[worldCoord].construction_item = new MatPairStruct(-1, -1); } if (block.tree_percent != null && block.tree_percent.Count > netIndex) { this[worldCoord].trunkPercent = (byte)block.tree_percent[netIndex]; this[worldCoord].positionOnTree = new DFCoord(block.tree_x[netIndex], block.tree_y[netIndex], block.tree_z[netIndex]); } else { this[worldCoord].trunkPercent = 0; this[worldCoord].positionOnTree = new DFCoord(0, 0, 0); } } if (setLiquids) { this[worldCoord].waterLevel = block.water[netIndex]; this[worldCoord].magmaLevel = block.magma[netIndex]; if (this[worldCoord].Hidden != block.hidden[netIndex]) { this[worldCoord].Hidden = block.hidden[netIndex]; setTiles = true; } if (block.tile_dig_designation != null && block.tile_dig_designation.Count > netIndex) { if (this[worldCoord].digDesignation != block.tile_dig_designation[netIndex]) { this[worldCoord].digDesignation = block.tile_dig_designation[netIndex]; setTiles = true; } } } if (setSpatters) { this[worldCoord].spatters = block.spatterPile[netIndex].spatters; } } } foreach (var building in block.buildings) { if (building.building_type.building_type == 30) { continue; // We won't do civzones right now. } for (int xx = building.pos_x_min; xx <= building.pos_x_max; xx++) { for (int yy = building.pos_y_min; yy <= building.pos_y_max; yy++) { if ((building.building_type.building_type == 29) && building.room != null && building.room.extents.Count > 0) { int buildingLocalX = xx - building.room.pos_x; int buildingLocalY = yy - building.room.pos_y; if (building.room.extents[buildingLocalY * building.room.width + buildingLocalX] == 0) { continue; } } DFCoord worldCoord = new DFCoord(xx, yy, block.map_z); DFCoord2d buildingLocalCoord = GetRotatedLocalCoord(worldCoord, building);// = new DFCoord2d(xx - building.pos_x_min, yy - building.pos_y_min); if (!InSliceBounds(worldCoord)) { Debug.LogError(worldCoord + " is out of bounds for " + MapSize); continue; } if (this[worldCoord] == null) { this[worldCoord] = new Tile(this, worldCoord); } this[worldCoord].buildingType = building.building_type; this[worldCoord].buildingMaterial = building.material; this[worldCoord].buildingLocalPos = buildingLocalCoord; this[worldCoord].buildingDirection = building.direction; } } } }
void GenerateRegionMeshes() { if (GameSettings.Instance.rendering.distantTerrainDetail == GameSettings.LandscapeDetail.Off) return; foreach (RegionMap map in regionMaps.region_maps) { DFCoord2d pos = new DFCoord2d(map.map_x, map.map_y); RegionMaker region; if (!DetailRegions.ContainsKey(pos)) { region = Instantiate(regionPrefab); region.transform.parent = transform; region.transform.localPosition = RegionToUnityCoords(map.map_x, map.map_y, 0); DetailRegions[pos] = region; } else region = DetailRegions[pos]; region.CopyFromRemote(map, worldMap); region.name = region.worldNameEnglish; } }
public Tile(MapDataStore container, DFCoord position) { this.container = container; this.position = position; tileType = default(int); material = default(MatPairStruct); base_material = default(MatPairStruct); layer_material = default(MatPairStruct); vein_material = default(MatPairStruct); construction_item = default(MatPairStruct); waterLevel = default(int); magmaLevel = default(int); rampType = 0; buildingMaterial = default(MatPairStruct); buildingType = default(BuildingStruct); buildingLocalPos = default(DFCoord2d); }
public TiletypeShape GetSingleTile(DFCoord2d position) { if (position.x >= 0 && position.x < blockWidthTiles && position.y >= 0 && position.y < blockWidthTiles) return terrain[position.x + position.y * blockWidthTiles]; else return TiletypeShape.EMPTY; }
TiletypeShape GetRelativeTile(DFCoord2d position, FaceDirection direction) { DFCoord2d relativePosition = new DFCoord2d(position.x, position.y); switch (direction) { case FaceDirection.North: relativePosition.y--; break; case FaceDirection.South: relativePosition.y++; break; case FaceDirection.East: relativePosition.x++; break; case FaceDirection.West: relativePosition.x--; break; } return GetSingleTile(relativePosition); }
public Tile(MapDataStore container, DFCoord position) { this.container = container; this.position = position; tileType = default(int); material = default(MatPairStruct); base_material = default(MatPairStruct); layer_material = default(MatPairStruct); vein_material = default(MatPairStruct); construction_item = default(MatPairStruct); waterLevel = default(int); magmaLevel = default(int); rampType = 0; buildingMaterial = default(MatPairStruct); buildingType = default(BuildingStruct); buildingLocalPos = default(DFCoord2d); buildingDirection = 0; Hidden = false; trunkPercent = 0; positionOnTree = default(DFCoord); digDesignation = TileDigDesignation.NO_DIG; spatters = null; }
void AddTopFace(DFCoord2d position, float height) { Layer layer = Layer.Base; if (GetSingleTile(position) == TiletypeShape.FLOOR) layer = Layer.Floor; else if (GetSingleTile(position) == TiletypeShape.WALL) layer = Layer.Top; height -= 0.5f * tileHeight; //Todo: Weld vertices that should be welded //On second though, not with vertex colors there. int startindex = finalVertices.Count; finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, height, -(position.y - 0.5f) * tileWidth), layer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, height, -(position.y - 0.5f) * tileWidth), layer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, height, -(position.y + 0.5f) * tileWidth), layer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, height, -(position.y + 0.5f) * tileWidth), layer)); finalUVs.Add(new Vector2((float)(position.x) / 16.0f, -(float)(position.y) / 16.0f)); finalUVs.Add(new Vector2((float)(position.x + 1) / 16.0f, -(float)(position.y) / 16.0f)); finalUVs.Add(new Vector2((float)(position.x) / 16.0f, -(float)(position.y + 1) / 16.0f)); finalUVs.Add(new Vector2((float)(position.x + 1) / 16.0f, -(float)(position.y + 1) / 16.0f)); finalVertexColors.Add(GetColor(position)); finalVertexColors.Add(GetColor(position)); finalVertexColors.Add(GetColor(position)); finalVertexColors.Add(GetColor(position)); finalFaces.Add(startindex); finalFaces.Add(startindex + 1); finalFaces.Add(startindex + 2); finalFaces.Add(startindex + 1); finalFaces.Add(startindex + 3); finalFaces.Add(startindex + 2); }
void AddSideFace(DFCoord2d position, FaceDirection direction) { Layer topLayer = Layer.Top; Layer bottomLayer = Layer.Base; float currentFloorHeight = -0.5f * tileHeight; float adjacentFloorHeight = -0.5f * tileHeight; switch (GetSingleTile(position)) { case TiletypeShape.WALL: currentFloorHeight = 0.5f * tileHeight; topLayer = Layer.Top; break; case TiletypeShape.RAMP: case TiletypeShape.FLOOR: currentFloorHeight = floorHeight - (0.5f * tileHeight); topLayer = Layer.Floor; break; default: break; } switch (GetRelativeTile(position, direction)) { case TiletypeShape.WALL: adjacentFloorHeight = 0.5f * tileHeight; bottomLayer = Layer.Top; break; case TiletypeShape.FLOOR: adjacentFloorHeight = floorHeight - (0.5f * tileHeight); bottomLayer = Layer.Floor; break; default: break; } if (currentFloorHeight <= adjacentFloorHeight) { return; } int startindex = finalVertices.Count; int uvPos = 0; switch (direction) { case FaceDirection.North: finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, currentFloorHeight, -(position.y - 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, currentFloorHeight, -(position.y - 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, adjacentFloorHeight, -(position.y - 0.5f) * tileWidth), bottomLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, adjacentFloorHeight, -(position.y - 0.5f) * tileWidth), bottomLayer)); uvPos = position.x; break; case FaceDirection.South: finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, currentFloorHeight, -(position.y + 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, currentFloorHeight, -(position.y + 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, adjacentFloorHeight, -(position.y + 0.5f) * tileWidth), bottomLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, adjacentFloorHeight, -(position.y + 0.5f) * tileWidth), bottomLayer)); uvPos = 16 - position.x; break; case FaceDirection.East: finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, currentFloorHeight, -(position.y + 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, currentFloorHeight, -(position.y - 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, adjacentFloorHeight, -(position.y + 0.5f) * tileWidth), bottomLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x + 0.5f) * tileWidth, adjacentFloorHeight, -(position.y - 0.5f) * tileWidth), bottomLayer)); uvPos = position.y; break; case FaceDirection.West: finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, currentFloorHeight, -(position.y - 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, currentFloorHeight, -(position.y + 0.5f) * tileWidth), topLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, adjacentFloorHeight, -(position.y - 0.5f) * tileWidth), bottomLayer)); finalVertices.Add(AdjustForRamps(new Vector3((position.x - 0.5f) * tileWidth, adjacentFloorHeight, -(position.y + 0.5f) * tileWidth), bottomLayer)); uvPos = 16 - position.y; break; default: break; } finalUVs.Add(new Vector2(-(float)(uvPos + 1) / 16.0f, -(float)(0) / 16.0f)); finalUVs.Add(new Vector2(-(float)(uvPos) / 16.0f, -(float)(0) / 16.0f)); finalUVs.Add(new Vector2(-(float)(uvPos + 1) / 16.0f, -(float)(0 + 1) / 16.0f)); finalUVs.Add(new Vector2(-(float)(uvPos) / 16.0f, -(float)(0 + 1) / 16.0f)); finalVertexColors.Add(GetColor(position)); finalVertexColors.Add(GetColor(position)); finalVertexColors.Add(GetColor(position)); finalVertexColors.Add(GetColor(position)); finalFaces.Add(startindex); finalFaces.Add(startindex + 1); finalFaces.Add(startindex + 2); finalFaces.Add(startindex + 1); finalFaces.Add(startindex + 3); finalFaces.Add(startindex + 2); }
public void Modify (int? tileType = null, MatPairStruct? material = null, MatPairStruct? base_material = null, MatPairStruct? layer_material = null, MatPairStruct? vein_material = null, int? waterLevel = null, int? magmaLevel = null, MatPairStruct? construction_item = null, int? rampType = null, BuildingStruct? buildingType = null, MatPairStruct? buildingMaterial = null, DFCoord2d? buildingLocalPos = null, BuildingDirection? buildingDirection = null, bool? hidden = null) { if (tileType != null) { this.tileType = tileType.Value; } if (material != null) { this.material = material.Value; } if (base_material != null) { this.base_material = base_material.Value; } if (layer_material != null) { this.layer_material = layer_material.Value; } if (vein_material != null) { this.vein_material = vein_material.Value; } if (waterLevel != null) { this.waterLevel = waterLevel.Value; } if (magmaLevel != null) { this.magmaLevel = magmaLevel.Value; } if (construction_item != null) { this.construction_item = construction_item.Value; } if(rampType != null) { this.rampType = rampType.Value; } if(buildingType != null) { this.buildingType = buildingType.Value; } if(buildingMaterial != null) { this.buildingMaterial = buildingMaterial.Value; } if (buildingLocalPos != null) this.buildingLocalPos = buildingLocalPos.Value; if (buildingDirection != null) this.buildingDirection = buildingDirection.Value; if (hidden != null) this.hidden = hidden.Value; }
public void CopyFrom(Tile orig) { container = orig.container; position = orig.position; tileType = orig.tileType; material = orig.material; base_material = orig.base_material; layer_material = orig.layer_material; vein_material = orig.vein_material; construction_item = orig.construction_item; waterLevel = orig.waterLevel; magmaLevel = orig.magmaLevel; RampType = orig.RampType; buildingType = orig.buildingType; buildingMaterial = orig.buildingMaterial; buildingLocalPos = orig.buildingLocalPos; buildingDirection = orig.buildingDirection; Hidden = orig.Hidden; trunkPercent = orig.trunkPercent; positionOnTree = orig.positionOnTree; digDesignation = orig.digDesignation; spatters = orig.spatters; }
public Color32 GetColor(DFCoord2d position) { if ((position.x + position.y * blockWidthTiles) < colors.Length) return colors[position.x + position.y * blockWidthTiles]; else return Color.white; }
public void InitOrModifyTile(DFCoord coord, int? tileType = null, MatPairStruct? material = null, MatPairStruct? base_material = null, MatPairStruct? layer_material = null, MatPairStruct? vein_material = null, int? waterLevel = null, int? magmaLevel = null, MatPairStruct? construction_item = null, int? rampType = null, BuildingStruct? buildingType = null, MatPairStruct? buildingMaterial = null, DFCoord2d? buildingLocalPos = null, BuildingDirection? buildingDirection = null, bool? hidden = null, byte? trunkPercent = null, DFCoord? positionOnTree = null, TileDigDesignation? digDesignation = null, List<Spatter> spatters = null) { if (!InSliceBounds(coord)) { throw new UnityException("Can't modify tile outside of slice"); } if (this[coord] == null) this[coord] = new Tile(this, coord); this[coord].Modify( tileType, material, base_material, layer_material, vein_material, waterLevel, magmaLevel, construction_item, rampType, buildingType, buildingMaterial, buildingLocalPos, buildingDirection, hidden, trunkPercent, positionOnTree, digDesignation, spatters ); }
public void InitOrModifyTile(DFCoord coord, int? tileType = null, MatPairStruct? material = null, MatPairStruct? base_material = null, MatPairStruct? layer_material = null, MatPairStruct? vein_material = null, int? waterLevel = null, int? magmaLevel = null, MatPairStruct? construction_item = null, int? rampType = null, BuildingStruct? buildingType = null, MatPairStruct? buildingMaterial = null, DFCoord2d? buildingLocalPos = null) { DFCoord local = WorldToLocalSpace(coord); if (!InSliceBoundsLocal(local.x, local.y, local.z)) { throw new UnityException("Can't modify tile outside of slice"); } tilesPresent[PresentIndex(local.x, local.y, local.z)] = true; tiles[local.x, local.y, local.z].Modify(tileType, material, base_material, layer_material, vein_material, waterLevel, magmaLevel, construction_item, rampType, buildingType, buildingMaterial, buildingLocalPos); }
void GenerateRegionMeshes() { foreach (WorldMap map in regionMaps.world_maps) { DFCoord2d pos = new DFCoord2d(map.map_x, map.map_y); if (DetailRegions.ContainsKey(pos)) { continue; } RegionMaker region = Instantiate<RegionMaker>(regionPrefab); region.CopyFromRemote(map, worldMap); region.name = region.worldNameEnglish; region.transform.parent = transform; DetailRegions[pos] = region; } }
public void InitOrModifyTile(DFCoord coord, int? tileType = null, MatPairStruct? material = null, MatPairStruct? base_material = null, MatPairStruct? layer_material = null, MatPairStruct? vein_material = null, int? waterLevel = null, int? magmaLevel = null, MatPairStruct? construction_item = null, int? rampType = null, BuildingStruct? buildingType = null, MatPairStruct? buildingMaterial = null, DFCoord2d? buildingLocalPos = null, BuildingDirection? buildingDirection = null, bool? hidden = null) { DFCoord local = WorldToLocalSpace(coord); if (!InSliceBoundsLocal(local.x, local.y, local.z)) { throw new UnityException("Can't modify tile outside of slice"); } if (tiles[local.x, local.y, local.z] == null) tiles[local.x, local.y, local.z] = new Tile(this, local); tiles[local.x, local.y, local.z].Modify(tileType, material, base_material, layer_material, vein_material, waterLevel, magmaLevel, construction_item, rampType, buildingType, buildingMaterial, buildingLocalPos, buildingDirection, hidden); }