public static void PlaceCaiburnHallway(Vector2 placementspot, int width, int height, int direction, ref List <Vector2> deways, int generation, int tiletype, int walltype) { Tile tstart = Framing.GetTileSafely(placementspot); int buffersizex = width + WorldGen.genRand.Next(3); int buffersizey = height + WorldGen.genRand.Next(3); int x = (int)placementspot.X; int y = (int)placementspot.Y; int xbuffer = -buffersizex; int ybuffer = -buffersizey; //ushort[] stoneTypes = new ushort[] { TileID.Stone, TileID.Dirt, TileID.Mud, TileID.ClayBlock }; for (xbuffer = -buffersizex; xbuffer < buffersizex; xbuffer++) { for (ybuffer = -buffersizey; ybuffer < buffersizey; ybuffer++) { Point loc = new Point((int)placementspot.X + (int)xbuffer, (int)placementspot.Y + (int)ybuffer); Tile tile = Framing.GetTileSafely(loc.X, loc.Y); IDGWorldGen.PlaceMulti(placementspot + new Vector2(xbuffer, ybuffer), tiletype, 4, walltype); deways.Add(new Vector2(loc.X, loc.Y)); allDankWater.Add(loc); if (generation > 1000) { if (xbuffer < 2 && xbuffer > -2) { deways.Add(new Vector2((int)placementspot.X + (int)xbuffer, (int)placementspot.Y + (int)ybuffer - 1)); deways.Add(new Vector2((int)placementspot.X + (int)xbuffer, (int)placementspot.Y + (int)ybuffer - 2)); deways.Add(new Vector2((int)placementspot.X + (int)xbuffer, (int)placementspot.Y + (int)ybuffer - 3)); } } } } for (int there = 0; there < 4; there++) { if (there != direction && WorldGen.genRand.Next(0, direction == 3 ? 50 : 100) > generation) { Vector2 edge = new Vector2(width, 0); int width2 = 8 + WorldGen.genRand.Next(7); int height2 = 4 + WorldGen.genRand.Next(3); if (direction == 1) { width2 = 3 + WorldGen.genRand.Next(1); height2 = 5 + WorldGen.genRand.Next(12); edge = new Vector2(0, -height); edge += new Vector2(0, -height2); } else if (direction == 2) { edge = new Vector2(-width, 0); edge += new Vector2(-width2, 0); } else if (direction == 3) { width2 = 3 + WorldGen.genRand.Next(1); height2 = 4 + WorldGen.genRand.Next(12); edge = new Vector2(0, height); edge += new Vector2(0, height2); } else { edge += new Vector2(width2, 0); } Tile tile = Framing.GetTileSafely((int)(placementspot + edge * 2f).X, (int)(placementspot + edge * 2f).Y); if (tile.type != TileID.GoldBrick && tile.type != TileID.SilverBrick && tile.type != TileID.CopperBrick && tile.type != SGAmod.Instance.TileType("MoistStone") && tile.type != TileID.LihzahrdBrick && tile.type != TileID.BlueDungeonBrick && tile.type != TileID.GreenDungeonBrick && tile.type != TileID.PinkDungeonBrick) { PlaceCaiburnHallway(placementspot + edge, width2, height2, there, ref deways, generation + 2, tiletype, walltype); } } else { if (generation < 1000 && generation > 35) { //tiletype = TileID.CopperBrick; //walltype = WallID.CopperBrick; PlaceCaiburnHallway(placementspot + new Vector2(0, -10), 5, 10, 1, ref deways, 1500, tiletype, walltype); break; } } } }
public virtual void AGenPass(GenerationProgress prog) { UnifiedRandom UniRand = new UnifiedRandom(DimDungeonsProxy.DungeonSeeds); int lastseed = WorldGen._genRandSeed; WorldGen._genRandSeed = DimDungeonsProxy.DungeonSeeds; enemyseed = (DimDungeonsProxy.DungeonSeeds); prog.Message = "Loading"; //Sets the text above the worldgen progress bar Main.worldSurface = Main.maxTilesY - 2; //Hides the underground layer just out of bounds Main.rockLayer = Main.maxTilesY; //Hides the cavern layer way out of bounds //Main.spawnTileX = (Main.maxTilesX / 2) / 16; prog.Message = "Once was nothing..."; int tileheight = UniRand.Next(250, 400); NoiseGenerator Noisegen = new NoiseGenerator(DimDungeonsProxy.DungeonSeeds); Noisegen.Amplitude = 1; Noisegen.Frequency *= 0.50; int[] tilesz = { TileID.Dirt, TileID.Dirt, TileID.Dirt, TileID.Dirt, TileID.Stone, TileID.Stone, TileID.DiamondGemsparkOff, TileID.SnowFallBlock }; //Noisegen.Frequency for (int x = 0; x < Main.maxTilesX; x += 1) { for (int y = tileheight; y < Main.maxTilesY; y += 1) { double nousey = (double)MathHelper.Clamp((float)Noisegen.Noise(x, y) + 0.40f, -1.00f, 1.00f); Main.tile[x, y].type = TileID.Stone; int index = (int)MathHelper.Clamp((float)(0.50 + nousey / 2.0) * tilesz.Length, 0f, tilesz.Length - 1); Main.tile[x, y].type = (ushort)tilesz[index]; Main.tile[x, y].active(true); if (nousey < 0) { Main.tile[x, y].type = TileID.Dirt; } } } List <DungeonTile> gatebackdroptiles = new List <DungeonTile>(); int roomwidth = 160; int roomheight = 80; int center = (width / 2); for (int y = (height / 2) - (int)(roomheight); y < height; y += 1) { for (int x = center; x < center + (int)(roomwidth); x += 1) { double input = ((double)center) - (x - 80); float sigmoid = 1f - (1f / (1f + (float)Math.Pow(Math.E, -(input / 10.00)))); Vector2 there = new Vector2(x, y + sigmoid * 60f); IDGWorldGen.PlaceMulti(there, TileID.BlueDungeonBrick, 8, WallID.BlueDungeonSlab); if (there.Y < (height / 2) + 1) { gatebackdroptiles.Add(new DungeonTile(there, 0, 0, there.Y > ((height / 2) - 1), 0)); } } for (int x = center - (int)(roomwidth); x < center; x += 1) { double input = ((double)center) - (x + 80); float sigmoid = (1f / (1f + (float)Math.Pow(Math.E, -(input / 10.00)))); Vector2 there = new Vector2(x, y + sigmoid * 60f); IDGWorldGen.PlaceMulti(there, TileID.BlueDungeonBrick, 8, WallID.PinkDungeonSlab); if (there.Y < (height / 2) + 1) { gatebackdroptiles.Add(new DungeonTile(there, 0, 0, there.Y > ((height / 2) - 1), 0)); } } } List <Point> platforms = new List <Point>(); for (int i = 0; i < gatebackdroptiles.Count; i += 1) { DungeonTile atilz = gatebackdroptiles[i]; int valuex = (int)atilz.vector.X; if (atilz.floor) { Main.tile[valuex, (int)atilz.vector.Y + 1].type = TileID.TeamBlockYellow; } Main.tile[valuex, (int)atilz.vector.Y].active(false); Main.tile[valuex, (int)atilz.vector.Y].wall = (atilz.vector.Y % 20 < 3 ? WallID.PinkDungeonSlab : WallID.BlueDungeonTile); if (Math.Abs(valuex - (width / 2)) < 100) { if (valuex % 12 == 0) { int valuexx = valuex; Main.tile[valuexx, (int)atilz.vector.Y].wall = 0; WorldGen.PlaceWall(valuexx, (int)atilz.vector.Y, WallID.PalladiumColumn); if ((int)atilz.vector.Y % 30 == ((valuex % 24 == 0) ? 15 : 0)) { WorldGen.PlaceObject(valuexx, (int)atilz.vector.Y, TileID.Torches, false, 6); for (int iii = -5; iii < 6; iii += 1) { platforms.Add(new Point(valuexx + iii, (int)atilz.vector.Y + 2)); } } } } } for (int i = 0; i < platforms.Count; i += 1) { WorldGen.PlaceTile(platforms[i].X, platforms[i].Y, TileID.Platforms, style: 21); } }
public static void PlaceCaiburnShrine(Vector2 placementspot, int type) { Tile tstart = Framing.GetTileSafely(placementspot); int heighestTile = Main.maxTilesY; int lowestTile = 0; List <Vector2> deways = new List <Vector2>(); List <Vector2> dewaysMainroom = new List <Vector2>(); int buffersizex = 12 + WorldGen.genRand.Next(7); int buffersizey = 8 + WorldGen.genRand.Next(3); int x = (int)placementspot.X; int y = (int)placementspot.Y; int xbuffer = -buffersizex; int ybuffer = -buffersizey; //ushort[] stoneTypes = new ushort[] { TileID.Stone, TileID.Dirt, TileID.Mud, TileID.ClayBlock }; for (xbuffer = -buffersizex; xbuffer < buffersizex; xbuffer++) { for (ybuffer = -buffersizey; ybuffer < buffersizey; ybuffer++) { Point loc = new Point((int)placementspot.X + (int)xbuffer, (int)placementspot.Y + (int)ybuffer); Tile tile = Framing.GetTileSafely(loc.X, loc.Y); IDGWorldGen.PlaceMulti(placementspot + new Vector2(xbuffer, ybuffer), SGAmod.Instance.TileType("MoistStone"), 4, SGAmod.Instance.WallType("SwampWall")); dewaysMainroom.Add(new Vector2(loc.X, loc.Y)); allDankWater.Add(loc); } } int t1 = SGAmod.Instance.TileType("MoistStone"); int t2 = SGAmod.Instance.WallType("SwampWall"); PlaceCaiburnHallway(placementspot + new Vector2(buffersizex * 1, 0), 12, 6, 0, ref deways, 0, t1, t2); PlaceCaiburnHallway(placementspot + new Vector2(-buffersizex * 1, 0), 12, 6, 2, ref deways, 0, t1, t2); //Clear out area for (int aaa = 0; aaa < deways.Count; aaa++) { if ((int)deways[aaa].Y < heighestTile) { heighestTile = (int)deways[aaa].Y; } if ((int)deways[aaa].Y > lowestTile) { lowestTile = (int)deways[aaa].Y; } Tile tile = Framing.GetTileSafely((int)deways[aaa].X, (int)deways[aaa].Y); tile.active(false); } //Turn to water foreach (Vector2 point in deways.Where(testby => testby.Y > lowestTile - 150)) { if (point.Y + WorldGen.genRand.Next(150) > lowestTile) { Tile tile = Framing.GetTileSafely((int)point.X, (int)point.Y); tile.liquid = 20; } } //Remove top area HashSet <Point16> removes = new HashSet <Point16>(); foreach (Vector2 point in deways.Where(testby => testby.Y < heighestTile + 3)) { Point16 point2 = point.ToPoint16(); if (WorldGen.InWorld(point2.X - 4, point2.Y - 2) && WorldGen.InWorld(point2.X + 4, point2.Y - 2)) { // if (Main.tile[point2.X - 4, point2.Y-2].type == ModContent.TileType<MoistStone>() && Main.tile[point2.X + 4, point2.Y-2].type == ModContent.TileType<MoistStone>() && // Main.tile[point2.X - 4, point2.Y].active() && Main.tile[point2.X - 4, point2.Y].type == ModContent.TileType<MoistStone>() && Main.tile[point2.X + 4, point2.Y].active() && Main.tile[point2.X + 4, point2.Y].type == ModContent.TileType<MoistStone>()) //{ removes.Add(new Point16(point2.X, point2.Y - 1)); removes.Add(new Point16(point2.X, point2.Y - 2)); removes.Add(new Point16(point2.X, point2.Y - 3)); //} } } //turn to biomass foreach (Point16 point2 in removes) { Tile tile = Framing.GetTileSafely(point2.X, point2.Y); if (tile.type == ModContent.TileType <MoistStone>()) { tile.type = (ushort)ModContent.TileType <Biomass>(); } } //Fill some water area with Moist Sand //Liquid.QuickWater(3); //WaterCheck(); //Do general object placement for (int aaa = 0; aaa < deways.Count; aaa++) { if (WorldGen.genRand.Next(0, 100) < 20) { Tile tile = Framing.GetTileSafely((int)deways[aaa].X, (int)deways[aaa].Y + 1); if (tile.active()) { string[] onts = new string[] { "SwampGrassGrow", "SwampGrassGrow2", "SwampGrassGrow3" }; WorldGen.PlaceObject((int)deways[aaa].X, (int)deways[aaa].Y, SGAmod.Instance.TileType(onts[WorldGen.genRand.Next(onts.Length)]), true); } } if (WorldGen.genRand.Next(0, 100) < 5) { Tile tile = Framing.GetTileSafely((int)deways[aaa].X, (int)deways[aaa].Y - 1); if (tile.active()) { WorldGen.PlaceObject((int)deways[aaa].X, (int)deways[aaa].Y, TileID.HangingLanterns, false, 16); } } if (WorldGen.genRand.Next(0, 100) < 5) { Tile tile = Framing.GetTileSafely((int)deways[aaa].X, (int)deways[aaa].Y + 1); if (tile.active()) { WorldGen.placeTrap((int)deways[aaa].X, (int)deways[aaa].Y, 0); } } if (WorldGen.genRand.Next(0, 100) < 2) { Tile tile1 = Framing.GetTileSafely((int)deways[aaa].X, (int)deways[aaa].Y + 1); Tile tile2 = Framing.GetTileSafely((int)deways[aaa].X + 1, (int)deways[aaa].Y + 1); Tile tile3 = Framing.GetTileSafely((int)deways[aaa].X + 1, (int)deways[aaa].Y); Tile tile4 = Framing.GetTileSafely((int)deways[aaa].X, (int)deways[aaa].Y); Vector2 findone = Vector2.Zero; findone = dewaysMainroom.Find(location => new Rectangle((int)location.X - 1, (int)location.Y - 1, 3, 3).Intersects(new Rectangle((int)deways[aaa].X - 1, (int)deways[aaa].Y - 1, 3, 3))); if (tile1.active() && tile2.active() && !tile3.active() && !tile4.active() && findone == Vector2.Zero) { Point loc = new Point((int)deways[aaa].X, (int)deways[aaa].Y); int thechest = WorldGen.PlaceChest(loc.X, loc.Y, 21, false, 12); if (thechest > 0) { for (int xx = 0; xx < 2; xx += 1) { for (int yy = 0; yy < 2; yy += 1) { Tile tile = Framing.GetTileSafely((int)deways[aaa].X + xx, (int)deways[aaa].Y + yy - 1); tile.color((byte)Paints.DeepGreen); } } List <int> loot = new List <int> { 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2359, 301, 302, 303, 304, 305, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 226, 188, 189, 110, 28 }; List <int> lootmain = new List <int> { SGAWorld.WorldIsNovus?SGAmod.Instance.ItemType("UnmanedOre") : SGAmod.Instance.ItemType("NoviteOre"), SGAmod.Instance.ItemType("DankWood"), SGAmod.Instance.ItemType("DankWood"), SGAmod.Instance.ItemType("Biomass"), SGAmod.Instance.ItemType("DankWood"), ItemID.SilverCoin, ItemID.LesserManaPotion }; List <int> lootrare = new List <int> { SGAmod.Instance.ItemType("DankCore"), SGAmod.Instance.ItemType("DankCore") }; List <int> dankrare = new List <int> { SGAmod.Instance.ItemType("DankWoodShield"), SGAmod.Instance.ItemType("MurkyCharm") }; int e = 0; for (int kk = 0; kk < 2 + (Main.expertMode ? 1 : 0); kk += 1) { //for (int i = 0; i < WorldGen.genRand.Next(15, Main.expertMode ? 25 : 30); i += 1) //{ int index = WorldGen.genRand.Next(0, loot.Count); Main.chest[thechest].item[e].SetDefaults(loot[index]); Main.chest[thechest].item[e].stack = WorldGen.genRand.Next(1, Main.expertMode ? 3 : 2); //} e += 1; } if (WorldGen.genRand.Next(0, 100) < 25) { int index = WorldGen.genRand.Next(0, lootrare.Count); Main.chest[thechest].item[e].SetDefaults(lootrare[index]); Main.chest[thechest].item[e].stack = WorldGen.genRand.Next(1, Main.expertMode ? 3 : 1); //} e += 1; } if (WorldGen.genRand.Next(0, 20) == 0) { int index = WorldGen.genRand.Next(0, dankrare.Count); Main.chest[thechest].item[e].SetDefaults(dankrare[index]); Main.chest[thechest].item[e].stack = 1; //} e += 1; } for (int kk = 0; kk < 3 + (Main.expertMode ? 1 : 0); kk += 1) { //for (int i = 0; i < WorldGen.genRand.Next(15, Main.expertMode ? 25 : 30); i += 1) //{ int index = WorldGen.genRand.Next(0, lootmain.Count); Main.chest[thechest].item[e].SetDefaults(lootmain[index]); Main.chest[thechest].item[e].stack = WorldGen.genRand.Next(15, Main.expertMode ? 25 : 45); //} e += 1; } } ///WorldGen.PlaceChestDirect((int)deways[aaa].X, (int)deways[aaa].Y, (ushort)SGAmod.Instance.TileType("OvergrownChest"), 0, 0); } } } for (int aaa = 0; aaa < dewaysMainroom.Count; aaa++) { Tile tile = Framing.GetTileSafely((int)dewaysMainroom[aaa].X, (int)dewaysMainroom[aaa].Y); //Chest.DestroyChest((int)deways[aaa].X, (int)deways[aaa].Y); WorldGen.KillTile((int)deways[aaa].X, (int)deways[aaa].Y); tile.active(false); } //Place Sword for (int kk = 3; kk < 6; kk += 1) { Main.tile[(int)placementspot.X, (int)placementspot.Y + buffersizey - kk].active(false); for (int xx = 0; xx < 6; xx += 1) { Main.tile[(int)placementspot.X - xx, (int)placementspot.Y + buffersizey - kk].active(false); Main.tile[(int)placementspot.X + xx, (int)placementspot.Y + buffersizey - kk].active(false); } } Main.tile[(int)placementspot.X, (int)placementspot.Y + buffersizey - 1].active(true); WorldGen.SlopeTile((int)placementspot.X, (int)placementspot.Y + buffersizey - 1, 0); for (int xx = 0; xx < 4; xx += 1) { Main.tile[(int)placementspot.X - xx, (int)placementspot.Y + buffersizey - 1].active(true); Main.tile[(int)placementspot.X + xx, (int)placementspot.Y + buffersizey - 1].active(true); WorldGen.SlopeTile((int)placementspot.X - xx, (int)placementspot.Y + buffersizey - 1, 0); WorldGen.SlopeTile((int)placementspot.X + xx, (int)placementspot.Y + buffersizey - 1, 0); } Main.tile[(int)placementspot.X - 2, (int)placementspot.Y + buffersizey - 2].active(true); WorldGen.SlopeTile((int)placementspot.X - 2, (int)placementspot.Y + buffersizey - 2, 0); Main.tile[(int)placementspot.X - 1, (int)placementspot.Y + buffersizey - 2].active(true); WorldGen.SlopeTile((int)placementspot.X - 1, (int)placementspot.Y + buffersizey - 2, 0); Main.tile[(int)placementspot.X, (int)placementspot.Y + buffersizey - 2].active(true); WorldGen.SlopeTile((int)placementspot.X, (int)placementspot.Y + buffersizey - 2, 0); Main.tile[(int)placementspot.X + 1, (int)placementspot.Y + buffersizey - 2].active(true); WorldGen.SlopeTile((int)placementspot.X + 1, (int)placementspot.Y + buffersizey - 2, 0); Main.tile[(int)placementspot.X + 2, (int)placementspot.Y + buffersizey - 2].active(true); WorldGen.SlopeTile((int)placementspot.X + 2, (int)placementspot.Y + buffersizey - 2, 0); Point offset = new Point(0, -3); int altertype = type == 0 ? SGAmod.Instance.TileType("CaliburnAltar") : (type == 1 ? SGAmod.Instance.TileType("CaliburnAltarB") : SGAmod.Instance.TileType("CaliburnAltarC")); WorldGen.PlaceObject((int)placementspot.X + offset.X, (int)placementspot.Y + buffersizey + offset.Y, altertype, false, 0); SGAWorld.CaliburnAlterCoordsX[type] = (int)placementspot.X * 16; SGAWorld.CaliburnAlterCoordsY[type] = (int)placementspot.Y * 16; }
private void BossBox() { HashSet <Point16> BossBox = new HashSet <Point16>(); MazeRoom EndPoint = MazeGraphPoints[0]; MazeRoom BossRoomPoint = new MazeRoom(new Point16(BossRoom.Center.X, BossRoom.Center.Y), 0, new Point16(0, 0), 0, true); EndPoint.previousRoom = BossRoomPoint; MazeGraphPoints.Insert(0, BossRoomPoint); for (int xx = BossRoom.X; xx < BossRoom.Width + BossRoom.X; xx += 1) { for (int yy = BossRoom.Y; yy < BossRoom.Height + BossRoom.Y; yy += 1) { Vector2 vectordist = (BossRoom.Center.ToVector2() - new Vector2(xx, yy)); if (BossRoomInside.Contains(xx, yy) || UniRand.NextFloat(vectordist.Length(), 100) < 100) { IDGWorldGen.PlaceMulti(new Point(xx, yy), TileID.RubyGemspark, UniRand.Next(2, 6), -1, true); BossBox.Add(new Point16(xx, yy)); } } } InnerArenaTiles = new HashSet <Point16>(BossBox); foreach (Point16 point in BossBox) { Tile tileline = Main.tile[point.X, point.Y]; tileline.color((byte)Paints.Shadow); //if (BossRoomInside.Contains(point.X, point.Y)) //{ tileline.active(false); tileline.wall = tileline.wall = (ushort)SGAmod.Instance.WallType("NullWallBossArena"); //} } if (roomsize < 5) { roomsize = 5; } foreach (Point point in IDGWorldGen.GetLine(startingPoint.ToPoint(), BossRoom.Center)) { for (int xx = -(roomsize + 2); xx <= roomsize + 2; xx += 1) { for (int yy = -roomsize; yy < roomsize + 1; yy += 1) { if (InsideMap(point.X + xx, point.Y + yy)) { Tile tileline = Main.tile[point.X + xx, point.Y + yy]; tileline.active(false); if (BossRoom.Contains(point.X, point.Y)) { if (tileline.wall != (ushort)SGAmod.Instance.WallType("NullWall") && tileline.wall != (ushort)SGAmod.Instance.WallType("NullWallBossArena")) { tileline.wall = (ushort)SGAmod.Instance.WallType("NullWall"); } } } } } } }
public void EvilSegmentRooms(List <MazeRoom> ListOfRooms, int type) { //Do Sub-Boss Room Gen float bossArenaSize = 80; Vector2 CorruptionRoomAngleAverage = Vector2.Zero; foreach (MazeRoom room in ListOfRooms) { CorruptionRoomAngleAverage += ((room.loc - Middle).ToVector2()); } CorruptionRoomAngleAverage /= ListOfRooms.Count; CorruptionRoomAngleAverage = (Vector2.Normalize(CorruptionRoomAngleAverage) * 500f) + Middle.ToVector2(); List <MazeRoom> MiniBossRoomsBossArena = new List <MazeRoom>(); while (MiniBossRoomsBossArena.Count < 10) { MiniBossRoomsBossArena = ListOfRooms.FindAll(testby => (testby.loc.ToVector2() - CorruptionRoomAngleAverage).Length() < bossArenaSize).ToList(); bossArenaSize += 4; } Vector2 AveragePoint = Vector2.Zero; List <Point> ArenaPoints = new List <Point>(); int minx = width, miny = height, maxx = 0, maxy = 0; //Do Room Carve out foreach (MazeRoom room in MiniBossRoomsBossArena) { AveragePoint += room.loc.ToVector2(); //IDGWorldGen.PlaceMulti(room.loc.ToPoint(), TileID.Cloud, 8); //IDGWorldGen.PlaceMulti(room.loc.ToPoint(), -1, 6); minx = Math.Min(minx, room.loc.X); miny = Math.Min(miny, room.loc.Y); maxx = Math.Max(maxx, room.loc.X); maxy = Math.Max(maxy, room.loc.Y); ArenaPoints.Add(room.loc.ToPoint()); for (int i = 0; i < 2; i += 1) { foreach (MazeRoom room2 in MiniBossRoomsBossArena) { foreach (Point there in IDGWorldGen.GetLine(room.loc.ToPoint(), room2.loc.ToPoint())) { int sizer2 = 8; int sizer = sizer2 - i * 2; for (int x = -sizer; x <= sizer; x += 1) { for (int y = -sizer; y <= sizer; y += 1) { Tile tile = Main.tile[there.X + x, there.Y + y]; if (i < 1) { if (tile.active()) { tile.type = type == 0 ? TileID.AmethystGemspark : TileID.AmberGemspark; } } else { tile.active(false); if (tile.wall == 0) { tile.wall = type == 0 ? WallID.AmethystGemsparkOff : WallID.AmberGemsparkOff; } } } } } } } } AveragePoint /= MiniBossRoomsBossArena.Count; List <MazeRoom> ListofOrderedRooms = ListOfRooms.OrderBy(testby => UniRand.Next(ListOfRooms.Count)).ToList(); ListofOrderedRooms.Insert(0, new MazeRoom(AveragePoint.ToPoint16(), 0, new Point16(0, 0), 0, true)); //place orbs/hearts int index = 0; int heart = type == 0 ? 0 : 1; foreach (MazeRoom lootroom in ListofOrderedRooms) { if (index < 3) { IDGWorldGen.PlaceMulti(lootroom.loc.ToPoint(), type == 0 ? TileID.AmethystGemspark : TileID.AmberGemspark, 5, type == 0 ? WallID.AmethystGemspark : WallID.AmberGemspark); IDGWorldGen.PlaceMulti(lootroom.loc.ToPoint(), -1, 3, type == 0 ? WallID.AmethystGemspark : WallID.AmberGemspark); for (int num36 = 0; num36 < 2; num36++) { for (int num37 = 0; num37 < 2; num37++) { int num38 = lootroom.loc.X + num36; int num39 = lootroom.loc.Y + num37; Main.tile[num38, num39].active(active: true); Main.tile[num38, num39].slope(0); Main.tile[num38, num39].halfBrick(halfBrick: false); Main.tile[num38, num39].type = 31; Main.tile[num38, num39].frameX = (short)(num36 * 18 + 36 * heart); Main.tile[num38, num39].frameY = (short)(num37 * 18 + 36 * 0); } } } index += 1; } }
private void MazeGenerator(Point16 starting, int roomIndex, int maxsize, GenerationProgress prog) { Stack <MazeRoom> mazeStack = new Stack <MazeRoom>(); maxGen = 0; int index = 0; currentPosition = starting; MazeRoom mazz = new MazeRoom(currentPosition, gen, Flow(currentPosition, flowSize), roomIndex); mazeStack.Push(mazz); if (roomIndex == 0) { startingPoint = mazz.loc + mazz.Offset; IDGWorldGen.PlaceMulti(startingPoint.ToPoint(), TileID.Adamantite, roomsize * 3); } ResetMove: //And now, we gen a maze with depth first! //Ah Adamantite, my good friend! Please help me keep track of where we've been! while (mazeStack.Count > 0 && index < maxsize) { MazeRoom whereWeAre = mazeStack.Peek(); //gen = whereWeAre.gen; maxGen = Math.Max(maxGen, gen); Point16 newpoint = currentPosition; prog.Value = MathHelper.Clamp(mazeStack.Count / 100f, 0f, 1f); prog.Message = whereWeAre.loc.X + ":" + whereWeAre.loc.Y + " Gen " + gen; int offset = UniRand.Next(4); for (int i = 0; i < 4; i += 1) { //Check Card Directions //Point16 cardOffset = (DarkSector.Cardinals[(offset + i) % DarkSector.Cardinals.Length]) * new Point16(sizeCheck, sizeCheck); Point16 cardOffset = (Vector2.UnitX * sizeCheck).RotatedBy(UniRand.NextFloat(MathHelper.TwoPi)).ToPoint16(); //(pointhere * sizeCheck).ToPoint16();//(DarkSector.Cardinals[(offset + i) % DarkSector.Cardinals.Length])*sizeCheck; Point16 checkHere = currentPosition + (cardOffset); if (checkHere.X < sizeCheck || checkHere.X > width - sizeCheck || checkHere.Y < sizeCheck || checkHere.Y > height - sizeCheck) { continue; } if (Avoid(checkHere)) { continue; } //Found one, moving // Main.tile[checkHere.X, checkHere.Y].type = TileID.Adamantite; //Main.tile[checkHere.X, checkHere.Y].active(true); //Place down some stuff to mark this area so we don't move back here IDGWorldGen.PlaceMulti(checkHere.ToPoint(), TileID.Adamantite, roomsize * 3); //Draw line and connect the dots Point check1 = (currentPosition + Flow(currentPosition, flowSize)).ToPoint(); Point check2 = (checkHere + Flow(checkHere, flowSize)).ToPoint(); foreach (Point there in IDGWorldGen.GetLine(check1, check2)) { Point16 there2 = new Point16(there.X, there.Y); if (InsideMap(there2.X, there2.Y)) { Tile tileline = Main.tile[there2.X, there2.Y]; //tileline.color((byte)FakeOverworld.Paints.Negative); mazePainter.Add(new MazeRoom(there2, gen, new Point16(0, 0), roomIndex)); } } index += 1; gen += 1; MazeRoom mazepoint = new MazeRoom(checkHere, gen, Flow(currentPosition, flowSize), roomIndex); mazepoint.ConnectedRoom = whereWeAre; if (LastRoom == null || gen > LastRoom.gen) { LastRoom = mazepoint; } mazeStack.Push(mazepoint); mazeRooms.Add(whereWeAre); currentPosition = checkHere; goto ResetMove; } //Dead end, time to step back MazeRoom stepBack = mazeStack.Pop(); MazeRoom previous = stepBack; if (mazeStack.Count > 1) { previous = mazeStack.Peek(); previous.deadEnd = false; } if (!mazeRooms.Any(tester => tester.loc == currentPosition)) { mazeRooms.Add(new MazeRoom(currentPosition, gen, Flow(currentPosition, flowSize), roomIndex, true)); } gen -= 1; currentPosition = previous.loc; } mazePainter.OrderBy(orderby => orderby.gen); mazeRooms.OrderBy(orderby => orderby.gen); /*MazeRoom spawnRoom = mazeRooms[mazeRooms.Count - 1]; * Main.spawnTileX = spawnRoom.loc.X + spawnRoom.Offset.X; * Main.spawnTileY = spawnRoom.loc.Y + spawnRoom.Offset.Y;*/ }
public static void PlaceCaiburnShrine(Vector2 placementspot, int type) { Tile tstart = Framing.GetTileSafely(placementspot); List <Vector2> deways = new List <Vector2>(); List <Vector2> dewaysMainroom = new List <Vector2>(); int buffersizex = 12 + WorldGen.genRand.Next(7); int buffersizey = 8 + WorldGen.genRand.Next(3); int x = (int)placementspot.X; int y = (int)placementspot.Y; int xbuffer = -buffersizex; int ybuffer = -buffersizey; //ushort[] stoneTypes = new ushort[] { TileID.Stone, TileID.Dirt, TileID.Mud, TileID.ClayBlock }; for (xbuffer = -buffersizex; xbuffer < buffersizex; xbuffer++) { for (ybuffer = -buffersizey; ybuffer < buffersizey; ybuffer++) { Tile tile = Framing.GetTileSafely((int)placementspot.X + (int)xbuffer, (int)placementspot.Y + (int)ybuffer); IDGWorldGen.PlaceMulti(placementspot + new Vector2(xbuffer, ybuffer), SGAmod.Instance.TileType("MoistStone"), 4, SGAmod.Instance.WallType("SwampWall")); dewaysMainroom.Add(new Vector2((int)placementspot.X + (int)xbuffer, (int)placementspot.Y + (int)ybuffer)); } } int t1 = SGAmod.Instance.TileType("MoistStone"); int t2 = SGAmod.Instance.WallType("SwampWall"); PlaceCaiburnHallway(placementspot + new Vector2(buffersizex * 1, 0), 12, 6, 0, ref deways, 0, t1, t2); PlaceCaiburnHallway(placementspot + new Vector2(-buffersizex * 1, 0), 12, 6, 2, ref deways, 0, t1, t2); for (int aaa = 0; aaa < deways.Count; aaa++) { Tile tile = Framing.GetTileSafely((int)deways[aaa].X, (int)deways[aaa].Y); tile.active(false); } for (int aaa = 0; aaa < deways.Count; aaa++) { if (WorldGen.genRand.Next(0, 100) < 5) { Tile tile = Framing.GetTileSafely((int)deways[aaa].X, (int)deways[aaa].Y - 1); if (tile.active()) { WorldGen.PlaceObject((int)deways[aaa].X, (int)deways[aaa].Y, TileID.HangingLanterns, false, 16); } } if (WorldGen.genRand.Next(0, 100) < 5) { Tile tile = Framing.GetTileSafely((int)deways[aaa].X, (int)deways[aaa].Y + 1); if (tile.active()) { WorldGen.placeTrap((int)deways[aaa].X, (int)deways[aaa].Y, 0); } } if (WorldGen.genRand.Next(0, 100) < 2) { Tile tile1 = Framing.GetTileSafely((int)deways[aaa].X, (int)deways[aaa].Y + 1); Tile tile2 = Framing.GetTileSafely((int)deways[aaa].X + 1, (int)deways[aaa].Y + 1); Tile tile3 = Framing.GetTileSafely((int)deways[aaa].X + 1, (int)deways[aaa].Y); Tile tile4 = Framing.GetTileSafely((int)deways[aaa].X, (int)deways[aaa].Y); if (tile1.active() && tile2.active() && !tile3.active() && !tile4.active()) { int thechest = WorldGen.PlaceChest((int)deways[aaa].X, (int)deways[aaa].Y, 21, false, 12); if (thechest > 0) { List <int> loot = new List <int> { 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2359, 301, 302, 303, 304, 305, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 226, 188, 189, 110, 28 }; List <int> lootmain = new List <int> { SGAmod.Instance.ItemType("UnmanedOre"), SGAmod.Instance.ItemType("DankWood"), SGAmod.Instance.ItemType("DankWood"), SGAmod.Instance.ItemType("Biomass"), SGAmod.Instance.ItemType("DankWood"), ItemID.SilverCoin, ItemID.LesserManaPotion }; List <int> lootrare = new List <int> { SGAmod.Instance.ItemType("DankCore"), SGAmod.Instance.ItemType("DankCore") }; int e = 0; for (int kk = 0; kk < 2 + (Main.expertMode ? 1 : 0); kk += 1) { //for (int i = 0; i < WorldGen.genRand.Next(15, Main.expertMode ? 25 : 30); i += 1) //{ int index = WorldGen.genRand.Next(0, loot.Count); Main.chest[thechest].item[e].SetDefaults(loot[index]); Main.chest[thechest].item[e].stack = WorldGen.genRand.Next(1, Main.expertMode ? 3 : 2); //} e += 1; } if (WorldGen.genRand.Next(0, 100) < 20) { int index = WorldGen.genRand.Next(0, lootrare.Count); Main.chest[thechest].item[e].SetDefaults(lootrare[index]); Main.chest[thechest].item[e].stack = WorldGen.genRand.Next(1, Main.expertMode ? 2 : 1); //} e += 1; } for (int kk = 0; kk < 3 + (Main.expertMode ? 1 : 0); kk += 1) { //for (int i = 0; i < WorldGen.genRand.Next(15, Main.expertMode ? 25 : 30); i += 1) //{ int index = WorldGen.genRand.Next(0, lootmain.Count); Main.chest[thechest].item[e].SetDefaults(lootmain[index]); Main.chest[thechest].item[e].stack = WorldGen.genRand.Next(15, Main.expertMode ? 25 : 45); //} e += 1; } } ///WorldGen.PlaceChestDirect((int)deways[aaa].X, (int)deways[aaa].Y, (ushort)SGAmod.Instance.TileType("OvergrownChest"), 0, 0); } } } for (int aaa = 0; aaa < dewaysMainroom.Count; aaa++) { Tile tile = Framing.GetTileSafely((int)dewaysMainroom[aaa].X, (int)dewaysMainroom[aaa].Y); Chest.DestroyChest((int)deways[aaa].X, (int)deways[aaa].Y); WorldGen.KillTile((int)deways[aaa].X, (int)deways[aaa].Y); tile.active(false); } for (int kk = 3; kk < 6; kk += 1) { Main.tile[(int)placementspot.X, (int)placementspot.Y + buffersizey - kk].active(false); for (int xx = 0; xx < 6; xx += 1) { Main.tile[(int)placementspot.X - xx, (int)placementspot.Y + buffersizey - kk].active(false); Main.tile[(int)placementspot.X + xx, (int)placementspot.Y + buffersizey - kk].active(false); } } Main.tile[(int)placementspot.X, (int)placementspot.Y + buffersizey - 1].active(true); for (int xx = 0; xx < 4; xx += 1) { Main.tile[(int)placementspot.X - xx, (int)placementspot.Y + buffersizey - 1].active(true); Main.tile[(int)placementspot.X + xx, (int)placementspot.Y + buffersizey - 1].active(true); } WorldGen.PlaceTile((int)placementspot.X - 2, (int)placementspot.Y + buffersizey - 2, SGAmod.Instance.TileType("MoistStone"), style: 10); Main.tile[(int)placementspot.X - 1, (int)placementspot.Y + buffersizey - 2].active(true); Main.tile[(int)placementspot.X, (int)placementspot.Y + buffersizey - 2].active(true); Main.tile[(int)placementspot.X + 1, (int)placementspot.Y + buffersizey - 2].active(true); Main.tile[(int)placementspot.X - 2, (int)placementspot.Y + buffersizey - 2].active(true); WorldGen.PlaceTile((int)placementspot.X + 2, (int)placementspot.Y + buffersizey - 2, SGAmod.Instance.TileType("MoistStone"), style: 41); WorldGen.PlaceObject((int)placementspot.X, (int)placementspot.Y + buffersizey - 3, type == 0 ? SGAmod.Instance.TileType("CaliburnAltar") : (type == 1 ? SGAmod.Instance.TileType("CaliburnAltarB") : SGAmod.Instance.TileType("CaliburnAltarC")), false, 0); SGAWorld.CaliburnAlterCoordsX[type] = (int)placementspot.X * 16; SGAWorld.CaliburnAlterCoordsY[type] = (int)placementspot.Y * 16; }