Ejemplo n.º 1
0
        public List <MapElement> CreateOpenablePortal(RCT rct, string innername, string outername, string outsidename)
        {
            Portal     exit       = new Portal(rct, floorNumber, innername, outername, true);
            RCT        doorRCT    = CreatePortal(exit);
            MapElement mapElement = Stage.GetNode(doorRCT.Start, GetFloorNumber()).mapElement;
            Portal     entrence;

            if (mapElement.GetType() == typeof(Building))
            {
                entrence = new Portal(doorRCT, floorNumber, innername, outsidename, false);
                Building building = mapElement as Building;
                building.CreatePortal(entrence);
            }
            else
            {
                entrence = new Portal(doorRCT, floorNumber, outername, outsidename, false);
                Room room = mapElement as Room;
                room.CreatePortal(entrence);
            }
            Portal.Bind(exit, entrence);
            return(new List <MapElement>()
            {
                exit, entrence
            });
        }
Ejemplo n.º 2
0
        private void UpdateLinks()
        {
            if (mapElement.GetType() == typeof(Furniture))
            {
                Furniture   furniture          = mapElement as Furniture;
                List <Node> noDiagonalSiblings = GetSiblingsNoDiagonals();
                for (int i = 0; i < noDiagonalSiblings.Count; i++)
                {
                    if (!furniture.rct.isContainCRD(noDiagonalSiblings[i].crd))
                    {
                        noDiagonalSiblings[i].UnlinkNode(noDiagonalSiblings);
                    }
                }

                isWalkable = furniture.monoFurniture.Walkable;
                UnlinkAllLinksMutually();
                if (furniture.monoFurniture.Walkable)
                {
                    LinkNode(noDiagonalSiblings, 1 + furniture.monoFurniture.ExtraWeightFrom);
                    foreach (Node node in noDiagonalSiblings)
                    {
                        node.LinkNode(this, 1 + furniture.monoFurniture.ExtraWeightTo);
                    }
                }
            }
            if (mapElement.GetType() == typeof(Column))
            {
                Column      column             = mapElement as Column;
                List <Node> noDiagonalSiblings = GetSiblingsNoDiagonals();
                for (int i = 0; i < noDiagonalSiblings.Count; i++)
                {
                    if (!column.rct.isContainCRD(noDiagonalSiblings[i].crd))
                    {
                        noDiagonalSiblings[i].UnlinkNode(noDiagonalSiblings);
                    }
                }
                isWalkable = false;
                UnlinkAllLinksMutually();
            }
        }
Ejemplo n.º 3
0
        public void DebugParents()
        {
            MapElement elem = this;
            string     log  = "";

            do
            {
                log += elem.ToString() + " > ";
                elem = elem.parentElement;
            } while (elem.GetType() != typeof(Stage));
            log += elem.ToString();

            Debug.Log("PARENTS LOG " + log);
        }
Ejemplo n.º 4
0
        public void RenderBackground()//Добавление фона карты
        {
            //stage.groundFloor
            Node[,] map = stage.floors.Find(x => x.number == stage.groundFloor).map;
            // left side
            int sbg = 0, ebg = 0;

            for (int x = 0; x < map.GetLength(0); x++)
            {
                Node       node       = Stage.GetNode(x, stage.rct.Start.z);
                MapElement mapElement = node.mapElement.GetParentByClass(typeof(Street));

                if (mapElement.GetType() == typeof(Street))
                {
                    Street street = mapElement as Street;
                    if (street.axis == 'h')
                    {
                        createQuads(new CRD(sbg, stage.rct.Start.z - 1), new Vector3(0, 0, 0), ebg - sbg + 1);
                        int sx = x;
                        int ex = x + mapElement.rct.Height - 1;
                        x   = ex + 1;
                        sbg = x;
                        BackgroundStreet bgStreet = new BackgroundStreet(new RCT(new CRD(sx, stage.rct.Start.z - 25), new CRD(ex, stage.rct.Start.z - 1)), street.axis, street.sidewalk);
                    }
                }
                else
                {
                    ebg = x;
                }
            }
            createQuads(new CRD(sbg, stage.rct.Start.z - 1), new Vector3(0, 0, 0), ebg - sbg + 1);
            //right side
            sbg = 0; ebg = 0;
            for (int x = 0; x < map.GetLength(0); x++)
            {
                Node       node       = Stage.GetNode(x, stage.rct.End.z);
                MapElement mapElement = node.mapElement.GetParentByClass(typeof(Street));
                if (mapElement.GetType() == typeof(Street))
                {
                    Street street = mapElement as Street;
                    if (street.axis == 'h')
                    {
                        createQuads(new CRD(sbg, stage.rct.End.z + 1), new Vector3(0, 180, 0), ebg - sbg + 1);
                        int sx = x;
                        int ex = x + mapElement.rct.Height - 1;
                        x   = ex + 1;
                        sbg = x;
                        BackgroundStreet bgStreet = new BackgroundStreet(new RCT(new CRD(sx, stage.rct.End.z + 1), new CRD(ex, stage.rct.End.z + 25)), street.axis, street.sidewalk);
                    }
                }
                else
                {
                    ebg = x;
                }
            }
            createQuads(new CRD(sbg, stage.rct.End.z + 1), new Vector3(0, 180, 0), ebg - sbg + 1);
            //top side
            sbg = 0; ebg = 0;
            for (int z = 0; z < map.GetLength(1); z++)
            {
                Node       node       = Stage.GetNode(stage.rct.Start.x, z);
                MapElement mapElement = node.mapElement.GetParentByClass(typeof(Street));
                if (mapElement.GetType() == typeof(Street))
                {
                    Street street = mapElement as Street;
                    if (street.axis == 'v')
                    {
                        createQuads(new CRD(stage.rct.Start.x - 1, sbg), new Vector3(0, 90, 0), ebg - sbg + 1);
                        int sz = z;
                        int ez = z + mapElement.rct.Width - 1;
                        z   = ez + 1;
                        sbg = z;
                        BackgroundStreet bgStreet = new BackgroundStreet(new RCT(new CRD(stage.rct.Start.x - 25, sz), new CRD(stage.rct.Start.x - 1, ez)), street.axis, street.sidewalk);
                    }
                }
                else
                {
                    ebg = z;
                }
            }
            createQuads(new CRD(stage.rct.Start.x - 1, sbg), new Vector3(0, 90, 0), ebg - sbg + 1);
            //bottom side
            sbg = 0; ebg = 0;
            for (int z = 0; z < map.GetLength(1); z++)
            {
                Node       node       = Stage.GetNode(stage.rct.End.x, z);
                MapElement mapElement = node.mapElement.GetParentByClass(typeof(Street));
                if (mapElement.GetType() == typeof(Street))
                {
                    Street street = mapElement as Street;
                    if (street.axis == 'v')
                    {
                        createQuads(new CRD(stage.rct.End.x + 1, sbg), new Vector3(0, 270, 0), ebg - sbg + 1);
                        int sz = z;
                        int ez = z + mapElement.rct.Width - 1;
                        z   = ez + 1;
                        sbg = z;
                        BackgroundStreet bgStreet = new BackgroundStreet(new RCT(new CRD(stage.rct.End.x + 1, sz), new CRD(stage.rct.End.x + 25, ez)), street.axis, street.sidewalk);
                    }
                }
                else
                {
                    ebg = z;
                }
            }
            createQuads(new CRD(stage.rct.End.x + 1, sbg), new Vector3(0, 270, 0), ebg - sbg + 1);
            createQuad(new CRD(-1, -1), new Vector3(0, 45, 0), -1);
            createQuad(new CRD(-1, stage.width), new Vector3(0, 135, 0), -1);
            createQuad(new CRD(stage.height, -1), new Vector3(0, -45, 0), -1);
            createQuad(new CRD(stage.height, stage.width), new Vector3(0, -135, 0), -1);
        }
Ejemplo n.º 5
0
        public void SaveMap(Map map, string path)
        {
            Debug.Log("Saving map at: " + path);

            var        mapLines    = new List <string>();
            MapElement lastMapElem = null;

            var elems = new List <MapElement>();

            //Config
            elems.AddRange(map.UnchangedElements);

            //Players
            foreach (var player in DomEdit.I.MapMan.Map.Players)
            {
                elems.Add(new AllowedPlayer {
                    NationNum = player.Nation.id
                });
                elems.Add(new StartLocation {
                    NationNum = player.Nation.id, ProvinceNum = player.CapitalProvinceNum
                });
            }

            //Provinces
            foreach (var province in map.ProvinceMap.Values)
            {
                bool isIndieProvince  = province.Owner == Nation.Independents;
                bool hasIndieMonsters = isIndieProvince && province.Monsters.Any();
                if (!isIndieProvince || hasIndieMonsters)
                {
                    elems.Add(new Land {
                        ProvinceNum = province.ProvinceNumber
                    });

                    if (!isIndieProvince)
                    {
                        elems.Add(new ProvinceOwner {
                            NationNum = province.Owner.id
                        });
                        if (province.HasLab)
                        {
                            elems.Add(new Laboratory());
                        }
                        if (province.HasTemple)
                        {
                            elems.Add(new Temple());
                        }
                        if (province.HasFort)
                        {
                            elems.Add(new Fort {
                                FortId = 1
                            });
                        }

                        if (DomEdit.I.MapMan.Map.Players.Any(x => x.CapitalProvinceNum == province.ProvinceNumber))
                        {
                            elems.Add(new KnownMagicSite {
                                ProvinceNum = province.ProvinceNumber, SiteId = 1500
                            });
                        }
                    }
                }
            }

            //Monsters
            foreach (var province in map.ProvinceMap.Values.Where(x => x.Monsters.Any()))
            {
                elems.Add(new SetLand {
                    ProvinceNum = province.ProvinceNumber
                });

                var nationalityMonsterGroups = province.Monsters.GroupBy(x => x.Nationality);

                foreach (var group in nationalityMonsterGroups)
                {
                    var nation = group.Key;

                    // if (nation != Nation.Independents)
                    // {
                    elems.Add(new ProvinceOwner {
                        NationNum = nation.id
                    });
                    // }

                    foreach (var monster in group)
                    {
                        switch (monster)
                        {
                        case Commander commander:
                            elems.Add(new CommanderElement {
                                MonsterId = commander.MonsterId, ProvinceNum = province.ProvinceNumber
                            });

                            foreach (var unit in commander.UnitsUnderCommand)
                            {
                                elems.Add(new UnitsElement {
                                    MonsterId = unit.MonsterId, Amount = unit.Amount, ProvinceNum = province.ProvinceNumber
                                });
                            }

                            foreach (var item in commander.Items)
                            {
                                elems.Add(new ItemElement {
                                    ItemName = item.ItemName
                                });
                            }
                            foreach (var magicOverride in commander.MagicOverrides)
                            {
                                Magic magic = magicOverride.Path switch
                                {
                                    MagicPath.Fire => new FireMagic(),
                                    MagicPath.Air => new AirMagic(),
                                    MagicPath.Water => new WaterMagic(),
                                    MagicPath.Earth => new EarthMagic(),
                                    MagicPath.Astral => new AstralMagic(),
                                    MagicPath.Death => new DeathMagic(),
                                    MagicPath.Nature => new NatureMagic(),
                                    MagicPath.Blood => new BloodMagic(),
                                    MagicPath.Holy => new HolyMagic(),
                                    _ => throw new ArgumentOutOfRangeException()
                                };
                                magic.MagicLevel = magicOverride.MagicValue;
                                elems.Add(magic);
                            }

                            break;

                        case Troops troops:
                            elems.Add(new UnitsElement {
                                MonsterId = troops.MonsterId, Amount = troops.Amount, ProvinceNum = province.ProvinceNumber
                            });
                            break;

                        default:
                            throw new ArgumentOutOfRangeException(nameof(monster));
                        }
                    }
                }

                if (province.Owner != Nation.Independents)
                {
                    elems.Add(new ProvinceOwner {
                        NationNum = province.Owner.id
                    });
                }
            }


            foreach (var mapElement in elems)
            {
                var key     = GetMapElementKey(mapElement.GetType());
                var mapLine = $"#{key} {string.Join(" ", mapElement.SaveArgs())}";

                bool isDifferentTypeFromPrevious = lastMapElem != null && lastMapElem.GetType() != mapElement.GetType();
                if (mapElement is IOwnedByProvince && lastMapElem is IOwnedByProvince)
                {
                    isDifferentTypeFromPrevious = false;
                }
                if (isDifferentTypeFromPrevious)
                {
                    mapLines.Add("");
                }

                mapLines.Add(mapLine);

                lastMapElem = mapElement;
            }

            File.WriteAllLines(path, mapLines);
        }