Пример #1
0
 private bool vTile(Tile tile)
 {
     if (tile != null)
     {
         GroundBrush bb = tile.getGroundBrush();
         if (bb != null)
         {
             if (bb.hasOptionalBorder())
             {
                 return(true);
             }
         }
     }
     return(false);
 }
Пример #2
0
        public static void doBorders(GameMap map, Tile tile)
        {
            //Console.WriteLine("------------------------------");
            GroundBrush border_brush = tile.getGroundBrush();

            int x = tile.Position.X;
            int y = tile.Position.Y;
            int z = tile.Position.Z;

            Pair <Boolean, GroundBrush>[] neighbours = new Pair <bool, GroundBrush> [8];

            if (x == 0)
            {
                if (y == 0)
                {
                    neighbours[0] = new Pair <bool, GroundBrush>(false, null);
                    neighbours[1] = new Pair <bool, GroundBrush>(false, null);
                    neighbours[2] = new Pair <bool, GroundBrush>(false, null);
                    neighbours[3] = new Pair <bool, GroundBrush>(false, null);
                    neighbours[4] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x + 1, y, z));
                    neighbours[5] = new Pair <bool, GroundBrush>(false, null);
                    neighbours[6] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x, y + 1, z));
                    neighbours[7] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x + 1, y + 1, z));
                }
                else
                {
                    neighbours[0] = new Pair <bool, GroundBrush>(false, null);
                    neighbours[1] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x, y - 1, z));
                    neighbours[2] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x + 1, y - 1, z));
                    neighbours[3] = new Pair <bool, GroundBrush>(false, null);
                    neighbours[4] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x + 1, y, z));
                    neighbours[5] = new Pair <bool, GroundBrush>(false, null);
                    neighbours[6] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x, y + 1, z));
                    neighbours[7] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x + 1, y + 1, z));
                }
            }
            else if (y == 0)
            {
                neighbours[0] = new Pair <bool, GroundBrush>(false, null);
                neighbours[1] = new Pair <bool, GroundBrush>(false, null);
                neighbours[2] = new Pair <bool, GroundBrush>(false, null);
                neighbours[3] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x - 1, y, z));
                neighbours[4] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x + 1, y, z));
                neighbours[5] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x - 1, y + 1, z));
                neighbours[6] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x, y + 1, z));
                neighbours[7] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x + 1, y + 1, z));
            }
            else
            {
                neighbours[0] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x - 1, y - 1, z));
                neighbours[1] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x, y - 1, z));
                neighbours[2] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x + 1, y - 1, z));
                neighbours[3] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x - 1, y, z));
                neighbours[4] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x + 1, y, z));
                neighbours[5] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x - 1, y + 1, z));
                neighbours[6] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x, y + 1, z));
                neighbours[7] = new Pair <bool, GroundBrush>(false, extractGroundBrushFromTile(map, x + 1, y + 1, z));
            }

            List <BorderCluster> border_list = new List <BorderCluster>();

            specific_list.Clear();

            for (int i = 0; i < 8; i++)
            {
                if (neighbours[i].first)
                {
                    continue;
                }
                GroundBrush other = neighbours[i].second;
                if (border_brush != null)
                {
                    if (other != null)
                    {
                        if (other.getID() == border_brush.getID())
                        {
                            continue;
                        }
                        if (other.hasOuterBorder() || border_brush.hasInnerBorder())
                        {
                            bool only_mountain = false;
                            if ((other.friendOf(border_brush) || border_brush.friendOf(other)))
                            {
                                if (other.hasOptionalBorder())
                                {
                                    only_mountain = true;
                                }
                                else
                                {
                                    continue;
                                }
                            }

                            UInt32 tiledata = 0;
                            for (int j = i; j < 8; j++)
                            {
                                if (!neighbours[j].first && (neighbours[j].second != null) && neighbours[j].second.getID() == other.getID())
                                {
                                    neighbours[j].first = true;
                                    tiledata           |= Convert.ToUInt32(1) << j;
                                }
                            }

                            if (tiledata != 0)
                            {
                                if (other.hasOptionalBorder() && tile.hasOptionalBorder())
                                {
                                    BorderCluster cluster = new BorderCluster();
                                    cluster.alignment = tiledata;
                                    cluster.z         = 0x7FFFFFFF; // Above all other borders
                                    //cluster.z = 0;

                                    cluster.border = other.optional_border;
                                    //Console.WriteLine("Aqui 01");
                                    border_list.Add(cluster);
                                    if (other.useSoloOptionalBorder())
                                    {
                                        only_mountain = true;
                                    }
                                }
                                if (!only_mountain)
                                {
                                    BorderBlock bb = getBrushTo(border_brush, other);
                                    if (bb != null)
                                    {
                                        bool found = false;

                                        foreach (BorderCluster bc in border_list)
                                        {
                                            if (bc.border.Equals(bb.autoborder))
                                            {
                                                bc.alignment |= tiledata;
                                                if (bc.z < other.getZ())
                                                {
                                                    bc.z = other.getZ();
                                                }
                                                if (bb.specific_cases.Count() > 0)
                                                {
                                                    if (!specific_list.Contains(bb))
                                                    {
                                                        specific_list.Add(bb);
                                                    }
                                                }
                                                found = true;
                                                break;
                                            }
                                        }
                                        if (!found)
                                        {
                                            BorderCluster bc = new BorderCluster();
                                            bc.alignment = tiledata;
                                            bc.z         = other.getZ();
                                            bc.border    = bb.autoborder;
                                            //Console.WriteLine("Aqui 02");
                                            border_list.Add(bc);
                                            if (bb.specific_cases.Count() > 0)
                                            {
                                                if (!specific_list.Contains(bb))
                                                {
                                                    specific_list.Add(bb);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else if (border_brush.hasInnerZilchBorder())
                    {
                        UInt32 tiledata = 0;
                        for (int j = i; j < 8; j++)
                        {
                            if (neighbours[j].first == false && neighbours[j].second == null)
                            {
                                neighbours[j].first = true;
                                tiledata           |= Convert.ToUInt32(1) << j;
                            }
                        }
                        if (tiledata != 0)
                        {
                            BorderCluster cluster = new BorderCluster();
                            cluster.alignment = tiledata;
                            cluster.z         = 5000;
                            BorderBlock bb = getBrushTo(border_brush, null);
                            if (bb == null)
                            {
                                continue;
                            }
                            cluster.border = bb.autoborder;
                            if (cluster.border != null)
                            {
                                //Console.WriteLine("Aqui 03");
                                border_list.Add(cluster);
                            }
                            if (bb.specific_cases.Count() > 0)
                            {
                                if (!specific_list.Contains(bb))
                                {
                                    specific_list.Add(bb);
                                }
                            }
                        }
                        continue;
                    }
                }
                else if (other != null && other.hasOuterZilchBorder())
                {
                    UInt32 tiledata = 0;
                    for (int j = i; j < 8; j++)
                    {
                        if (neighbours[j].first == false && (neighbours[j].second != null) && neighbours[j].second.getID() == other.getID())
                        {
                            neighbours[j].first = true;
                            tiledata           |= Convert.ToUInt32(1) << j;
                        }
                    }
                    if (tiledata != 0)
                    {
                        BorderCluster cluster = new BorderCluster();
                        cluster.alignment = tiledata;
                        cluster.z         = other.getZ();
                        BorderBlock bb = getBrushTo(null, other);
                        if (bb != null)
                        {
                            cluster.border = bb.autoborder;
                            if (cluster.border != null)
                            {
                                //Console.WriteLine("where 04 - " + i);
                                border_list.Add(cluster);
                            }
                            if (bb.specific_cases.Count() > 0)
                            {
                                if (!specific_list.Contains(bb))
                                {
                                    specific_list.Add(bb);
                                }
                            }
                        }
                        if (other.hasOptionalBorder() && tile.hasOptionalBorder())
                        {
                            BorderCluster _cluster = new BorderCluster();
                            _cluster.alignment = tiledata;
                            _cluster.z         = 0x7FFFFFFF; // Above other zilch borders
                            // _cluster.z = 0;
                            _cluster.border = other.optional_border;
                            //Console.WriteLine("Aqui 05");
                            border_list.Add(_cluster);
                        }
                        else
                        {
                            tile.setOptionalBorder(false);
                        }
                    }
                }
                neighbours[i].first = true;
            }
            tile.clearBorders();
            //Messages.AddLogMessage("Quantidade de border list: " + border_list.Count);

            //people.OrderBy(x => x.LastName).ToList();

            border_list = border_list.OrderByDescending(item => item.z).ToList();

            while (border_list.Count > 0)
            {
                //BorderCluster cluster = border_list.Last();

                BorderCluster cluster = border_list.First();

                if (cluster.border == null)
                {
                    border_list.Remove(cluster);
                    continue;
                }

                //Console.WriteLine("id: " + cluster.border.Id + " alignment: " + cluster.alignment);
                long[] i = new long[4];
                i[0] = ((Border_Types.border_types[cluster.alignment] & 0x000000FF) >> 0);
                i[1] = ((Border_Types.border_types[cluster.alignment] & 0x0000FF00) >> 8);
                i[2] = ((Border_Types.border_types[cluster.alignment] & 0x00FF0000) >> 16);
                i[3] = ((Border_Types.border_types[cluster.alignment] & 0xFF000000) >> 24);

                for (int iter = 0; iter < 4; ++iter)
                {
                    if (i[iter] != 0)
                    {
                        if (cluster.border.tiles[i[iter]] != 0)
                        {
                            tile.addBorderItem(Item.Create(cluster.border.tiles[i[iter]]));
                        }
                        else
                        {
                            if (i[iter] == BorderType.NORTHWEST_DIAGONAL)
                            {
                                tile.addBorderItem(Item.Create(cluster.border.tiles[BorderType.WEST_HORIZONTAL]));
                                tile.addBorderItem(Item.Create(cluster.border.tiles[BorderType.NORTH_HORIZONTAL]));
                            }
                            else if (i[iter] == BorderType.NORTHEAST_DIAGONAL)
                            {
                                tile.addBorderItem(Item.Create(cluster.border.tiles[BorderType.EAST_HORIZONTAL]));
                                tile.addBorderItem(Item.Create(cluster.border.tiles[BorderType.NORTH_HORIZONTAL]));
                            }
                            else if (i[iter] == BorderType.SOUTHWEST_DIAGONAL)
                            {
                                tile.addBorderItem(Item.Create(cluster.border.tiles[BorderType.SOUTH_HORIZONTAL]));
                                tile.addBorderItem(Item.Create(cluster.border.tiles[BorderType.WEST_HORIZONTAL]));
                            }
                            else if (i[iter] == BorderType.SOUTHEAST_DIAGONAL)
                            {
                                tile.addBorderItem(Item.Create(cluster.border.tiles[BorderType.SOUTH_HORIZONTAL]));
                                tile.addBorderItem(Item.Create(cluster.border.tiles[BorderType.EAST_HORIZONTAL]));
                            }
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                border_list.Remove(cluster);
            }
            if (specific_list.Count > 1)
            {
                // Global.mapCanvas.drawing = false;
                //  MessageBox.Show("Tem especifico");
            }
        }
Пример #3
0
        public override bool canDraw(GameMap map, Position pos)
        {
            Tile tile = map.getTile(pos);

            // You can't do gravel on a mountain tile



            if (tile != null)
            {
                GroundBrush bb = tile.getGroundBrush();
                if (bb != null)
                {
                    if (bb.hasOptionalBorder())
                    {
                        return(false);
                    }
                }
                //tile.clearBorders();
            }

            int x = pos.x;
            int y = pos.y;
            int z = pos.z;


            tile = map.getTile(x - 1, y - 1, z); if (vTile(tile))
            {
                return(true);
            }
            tile = map.getTile(x, y - 1, z); if (vTile(tile))
            {
                return(true);
            }
            tile = map.getTile(x + 1, y - 1, z); if (vTile(tile))
            {
                return(true);
            }
            tile = map.getTile(x - 1, y, z); if (vTile(tile))
            {
                return(true);
            }
            tile = map.getTile(x + 1, y, z); if (vTile(tile))
            {
                return(true);
            }
            tile = map.getTile(x - 1, y + 1, z); if (vTile(tile))
            {
                return(true);
            }
            tile = map.getTile(x, y + 1, z); if (vTile(tile))
            {
                return(true);
            }
            tile = map.getTile(x + 1, y + 1, z); if (vTile(tile))
            {
                return(true);
            }

            return(false);
        }