示例#1
0
 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));
            }
        }
    }
示例#3
0
    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;
        }
    }
示例#4
0
 public int AddTilePage(DFCoord2d coord)
 {
     if (!spriteIndices.ContainsKey(coord))
     {
         spriteIndices[coord] = coordList.Count;
         coordList.Add(coord);
     }
     return(spriteIndices[coord]);
 }
示例#5
0
 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);
     }
 }
示例#6
0
 public Color32 GetColor(DFCoord2d position)
 {
     if ((position.x + position.y * blockWidthTiles) < colors.Length)
     {
         return(colors[position.x + position.y * blockWidthTiles]);
     }
     else
     {
         return(Color.white);
     }
 }
示例#7
0
    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);
    }
示例#8
0
 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;
     }
 }
示例#9
0
    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;
        }
    }
示例#10
0
    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);
    }
示例#11
0
    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));
    }
示例#12
0
 public void SetSingleTile(DFCoord2d position, TiletypeShape tile)
 {
     terrain[position.x + position.y * blockWidthTiles] = tile;
     SetOpenness();
 }
示例#13
0
 public void SetColor(DFCoord2d position, Color32 input)
 {
     if ((position.x + position.y * blockWidthTiles) < colors.Length)
         colors[position.x + position.y * blockWidthTiles] = input;
 }
示例#14
0
    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;
                }
        }
    }
示例#15
0
 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;
     }
 }
示例#17
0
    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;
                }
            }
        }
    }
示例#21
0
    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;
        }
    }
示例#22
0
 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);
 }
示例#23
0
 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;
 }
示例#24
0
 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);
 }
示例#25
0
 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;
 }
示例#26
0
    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);
    }
示例#27
0
    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);
    }
示例#28
0
 public void SetSingleTile(DFCoord2d position, TiletypeShape tile)
 {
     terrain[position.x + position.y * blockWidthTiles] = tile;
     SetOpenness();
 }
示例#29
0
 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;
 }
示例#30
0
 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;
 }
示例#31
0
 public Color32 GetColor(DFCoord2d position)
 {
     if ((position.x + position.y * blockWidthTiles) < colors.Length)
         return colors[position.x + position.y * blockWidthTiles];
     else return Color.white;
 }
示例#32
0
 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
         );
 }
示例#33
0
 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);
 }
示例#34
0
 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;
     }
 }
示例#35
0
 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);
 }