// Decompiled with JetBrains decompiler // Type: Terraria.GameContent.Biomes.CaveHouse.HouseUtils // Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null // MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83 // Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe using Microsoft.Xna.Framework; using System; using System.Collections.Generic; using Terraria.ID; using Terraria.WorldBuilding; namespace Terraria.GameContent.Biomes.CaveHouse { public static class HouseUtils { private static readonly bool[] BlacklistedTiles = TileID.Sets.Factory.CreateBoolSet(true, 225, 41, 43, 44, 226, 203, 112, 25, 151); private static readonly bool[] BeelistedTiles = TileID.Sets.Factory.CreateBoolSet(true, 41, 43, 44, 226, 203, 112, 25, 151); public static HouseBuilder CreateBuilder(Point origin, StructureMap structures) { List rooms = HouseUtils.CreateRooms(origin); if (rooms.Count == 0 || !HouseUtils.AreRoomLocationsValid((IEnumerable) rooms)) return HouseBuilder.Invalid; HouseType houseType = HouseUtils.GetHouseType((IEnumerable) rooms); if (!HouseUtils.AreRoomsValid((IEnumerable) rooms, structures, houseType)) return HouseBuilder.Invalid; switch (houseType) { case HouseType.Wood: return (HouseBuilder) new WoodHouseBuilder((IEnumerable) rooms); case HouseType.Ice: return (HouseBuilder) new IceHouseBuilder((IEnumerable) rooms); case HouseType.Desert: return (HouseBuilder) new DesertHouseBuilder((IEnumerable) rooms); case HouseType.Jungle: return (HouseBuilder) new JungleHouseBuilder((IEnumerable) rooms); case HouseType.Mushroom: return (HouseBuilder) new MushroomHouseBuilder((IEnumerable) rooms); case HouseType.Granite: return (HouseBuilder) new GraniteHouseBuilder((IEnumerable) rooms); case HouseType.Marble: return (HouseBuilder) new MarbleHouseBuilder((IEnumerable) rooms); default: return (HouseBuilder) new WoodHouseBuilder((IEnumerable) rooms); } } private static List CreateRooms(Point origin) { Point result; if (!WorldUtils.Find(origin, Searches.Chain((GenSearch) new Searches.Down(200), (GenCondition) new Conditions.IsSolid()), out result) || result == origin) return new List(); Microsoft.Xna.Framework.Rectangle room1 = HouseUtils.FindRoom(result); Microsoft.Xna.Framework.Rectangle room2 = HouseUtils.FindRoom(new Point(room1.Center.X, room1.Y + 1)); Microsoft.Xna.Framework.Rectangle room3 = HouseUtils.FindRoom(new Point(room1.Center.X, room1.Y + room1.Height + 10)); room3.Y = room1.Y + room1.Height - 1; float roomSolidPrecentage1 = HouseUtils.GetRoomSolidPrecentage(room2); float roomSolidPrecentage2 = HouseUtils.GetRoomSolidPrecentage(room3); room1.Y += 3; room2.Y += 3; room3.Y += 3; List rectangleList = new List(); if ((double) WorldGen.genRand.NextFloat() > (double) roomSolidPrecentage1 + 0.200000002980232) rectangleList.Add(room2); rectangleList.Add(room1); if ((double) WorldGen.genRand.NextFloat() > (double) roomSolidPrecentage2 + 0.200000002980232) rectangleList.Add(room3); return rectangleList; } private static Microsoft.Xna.Framework.Rectangle FindRoom(Point origin) { Point result1; bool flag1 = WorldUtils.Find(origin, Searches.Chain((GenSearch) new Searches.Left(25), (GenCondition) new Conditions.IsSolid()), out result1); Point result2; int num1 = WorldUtils.Find(origin, Searches.Chain((GenSearch) new Searches.Right(25), (GenCondition) new Conditions.IsSolid()), out result2) ? 1 : 0; if (!flag1) result1 = new Point(origin.X - 25, origin.Y); if (num1 == 0) result2 = new Point(origin.X + 25, origin.Y); Microsoft.Xna.Framework.Rectangle rectangle = new Microsoft.Xna.Framework.Rectangle(origin.X, origin.Y, 0, 0); if (origin.X - result1.X > result2.X - origin.X) { rectangle.X = result1.X; rectangle.Width = Utils.Clamp(result2.X - result1.X, 15, 30); } else { rectangle.Width = Utils.Clamp(result2.X - result1.X, 15, 30); rectangle.X = result2.X - rectangle.Width; } Point result3; bool flag2 = WorldUtils.Find(result1, Searches.Chain((GenSearch) new Searches.Up(10), (GenCondition) new Conditions.IsSolid()), out result3); Point result4; int num2 = WorldUtils.Find(result2, Searches.Chain((GenSearch) new Searches.Up(10), (GenCondition) new Conditions.IsSolid()), out result4) ? 1 : 0; if (!flag2) result3 = new Point(origin.X, origin.Y - 10); if (num2 == 0) result4 = new Point(origin.X, origin.Y - 10); rectangle.Height = Utils.Clamp(Math.Max(origin.Y - result3.Y, origin.Y - result4.Y), 8, 12); rectangle.Y -= rectangle.Height; return rectangle; } private static float GetRoomSolidPrecentage(Microsoft.Xna.Framework.Rectangle room) { float num = (float) (room.Width * room.Height); Ref count = new Ref(0); WorldUtils.Gen(new Point(room.X, room.Y), (GenShape) new Shapes.Rectangle(room.Width, room.Height), Actions.Chain((GenAction) new Modifiers.IsSolid(), (GenAction) new Actions.Count(count))); return (float) count.Value / num; } private static int SortBiomeResults(Tuple item1, Tuple item2) => item2.Item2.CompareTo(item1.Item2); private static bool AreRoomLocationsValid(IEnumerable rooms) { foreach (Microsoft.Xna.Framework.Rectangle room in rooms) { if (room.Y + room.Height > Main.maxTilesY - 220) return false; } return true; } private static HouseType GetHouseType(IEnumerable rooms) { Dictionary resultsOutput = new Dictionary(); foreach (Microsoft.Xna.Framework.Rectangle room in rooms) WorldUtils.Gen(new Point(room.X - 10, room.Y - 10), (GenShape) new Shapes.Rectangle(room.Width + 20, room.Height + 20), (GenAction) new Actions.TileScanner(new ushort[12] { (ushort) 0, (ushort) 59, (ushort) 147, (ushort) 1, (ushort) 161, (ushort) 53, (ushort) 396, (ushort) 397, (ushort) 368, (ushort) 367, (ushort) 60, (ushort) 70 }).Output(resultsOutput)); List> tupleList = new List>(); tupleList.Add(Tuple.Create(HouseType.Wood, resultsOutput[(ushort) 0] + resultsOutput[(ushort) 1])); tupleList.Add(Tuple.Create(HouseType.Jungle, resultsOutput[(ushort) 59] + resultsOutput[(ushort) 60] * 10)); tupleList.Add(Tuple.Create(HouseType.Mushroom, resultsOutput[(ushort) 59] + resultsOutput[(ushort) 70] * 10)); tupleList.Add(Tuple.Create(HouseType.Ice, resultsOutput[(ushort) 147] + resultsOutput[(ushort) 161])); tupleList.Add(Tuple.Create(HouseType.Desert, resultsOutput[(ushort) 397] + resultsOutput[(ushort) 396] + resultsOutput[(ushort) 53])); tupleList.Add(Tuple.Create(HouseType.Granite, resultsOutput[(ushort) 368])); tupleList.Add(Tuple.Create(HouseType.Marble, resultsOutput[(ushort) 367])); tupleList.Sort(new Comparison>(HouseUtils.SortBiomeResults)); return tupleList[0].Item1; } private static bool AreRoomsValid( IEnumerable rooms, StructureMap structures, HouseType style) { foreach (Microsoft.Xna.Framework.Rectangle room in rooms) { if (style != HouseType.Granite) { if (WorldUtils.Find(new Point(room.X - 2, room.Y - 2), Searches.Chain(new Searches.Rectangle(room.Width + 4, room.Height + 4).RequireAll(false), (GenCondition) new Conditions.HasLava()), out Point _)) return false; } if (WorldGen.notTheBees) { if (!structures.CanPlace(room, HouseUtils.BeelistedTiles, 5)) return false; } else if (!structures.CanPlace(room, HouseUtils.BlacklistedTiles, 5)) return false; } return true; } } }