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 }); }
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(); } }
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); }
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); }
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); }