diff --git a/Assets/Scripts/CityGen/CityGen.cs b/Assets/Scripts/CityGen/CityGen.cs index 5481695e42882c8c89fbfe264e4582b913aadc24..12f362ef2213b475c6fecc4f93acff6ae367ec52 100644 --- a/Assets/Scripts/CityGen/CityGen.cs +++ b/Assets/Scripts/CityGen/CityGen.cs @@ -72,8 +72,8 @@ public partial class CityGen : MonoBehaviour { //TODO:add prefab TEST this.prefab = Resources.Load<GameObject>(prefabPath); - this.footprint.x = prefab.GetComponentInChildren<Renderer>().bounds.max.x - prefab.GetComponentInChildren<Renderer>().bounds.min.x; - this.footprint.y = prefab.GetComponentInChildren<Renderer>().bounds.max.y - prefab.GetComponentInChildren<Renderer>().bounds.min.y; + this.footprint.x = prefab.GetComponentInChildren<Renderer>().bounds.max.x +0.5f - prefab.GetComponentInChildren<Renderer>().bounds.min.x; + this.footprint.y = prefab.GetComponentInChildren<Renderer>().bounds.max.z +0.5f - prefab.GetComponentInChildren<Renderer>().bounds.min.z; this.offsetForFootprint.x = prefab.GetComponentInChildren<Renderer>().bounds.min.x; this.offsetForFootprint.y = prefab.GetComponentInChildren<Renderer>().bounds.min.y; @@ -85,30 +85,52 @@ public partial class CityGen : MonoBehaviour { public int height; public Vector3 orientation; public string zoneName; + public int development; // How developed is the building / equal to index in the zoneType prefabs public Tile(){ this.zoneName = "Empty"; } - public string updateTile(Vector3 value){ + public Tile(Tile original){ + this.height = original.height; + this.orientation = original.orientation; + this.zoneName = original.zoneName; + this.development = original.development; + } + + public Tile updateTile(Vector3 value){ + Tile newTile = new Tile(this); // update zoneName + + float mostProminent = 0; + for(int i =0; i < 3; i++ ){ + if(value[i] > mostProminent){ + mostProminent = value[i]; + } + } + if(value.x != 0){ - this.zoneName = "Recidential"; + newTile.zoneName = "Recidential"; + newTile.development = (int)value.x; } else if (value.y != 0){ - this.zoneName = "Commercial"; + newTile.zoneName = "Commercial"; + newTile.development = (int)value.y; } else if (value.z != 0){ - this.zoneName = "Industrial"; + newTile.zoneName = "Industrial"; + newTile.development = (int)value.z; } else { - this.zoneName = "Empty"; + newTile.zoneName = "Empty"; + newTile.development = 0; } - return this.zoneName; + return newTile; } public void genDemo(int id, string zoneName){ this.height = 4 + id; this.zoneName = zoneName; this.orientation = new Vector3(1.0f, 0.0f, 0.0f); + this.development = id; } } @@ -118,8 +140,8 @@ public partial class CityGen : MonoBehaviour { public List<Prefab> prefabs; public Vector2 layoutDimension; [HideInInspector] - public int[,] layout; - public Tile[] tiles; + public Tile[,] layout; + //public Tile[] tiles; public Prefab findPrefabById(int id){ foreach(Prefab prefab in prefabs){ @@ -136,22 +158,42 @@ public partial class CityGen : MonoBehaviour { this.zoneTypes[0] = new ZoneType( "Recidential", - (Vector3 tileInfo) => {return new Vector3(1,0,0);} + (Vector3 tileInfo) => { + tileInfo.x += 0.5f; + tileInfo.y += 0.25f; + tileInfo.z += -0.5f; + return tileInfo; + } ); this.zoneTypes[1] = new ZoneType( "Commercial", - (Vector3 tileInfo) => {return new Vector3(0,1,0);} + (Vector3 tileInfo) => { + tileInfo.x += 0.25f; + tileInfo.y += 0.25f; + tileInfo.z += -0.25f; + return tileInfo; + } ); this.zoneTypes[2] = new ZoneType( "Industrial", - (Vector3 tileInfo) => {return new Vector3(0,0,1);} + (Vector3 tileInfo) => { + tileInfo.x += -0.25f; + tileInfo.y += -0.25f; + tileInfo.z += 0.75f; + return tileInfo; + } ); this.zoneTypes[3] = new ZoneType( "Empty", - (Vector3 tileInfo) => {return Vector3.zero;} + (Vector3 tileInfo) => { + return tileInfo; + tileInfo.x += 0.25f; + tileInfo.y += -0.75f; + tileInfo.z += -0.75f; + } ); prefabs = new List<Prefab>(); @@ -168,22 +210,6 @@ public partial class CityGen : MonoBehaviour { return null; } - //Update tile information and return id of prefab - public int updateTile(int x, int y, Vector3 value){ - string zoneName = this.tiles[(int)(x + y * this.layoutDimension.x)].updateTile(value); - - //update layout[x,y] - if(zoneName == "Recidential"){ - return (int)value.x; - } else if (zoneName == "Commercial"){ - return (int)value.y; - } else if (zoneName == "Industrial"){ - return (int)value.z; - } else { - return 0; - } - } - public void genDemo(){ for(int i = 0; i < this.zoneTypes.Length; i++){ @@ -217,29 +243,37 @@ public partial class CityGen : MonoBehaviour { } } - this.layoutDimension.x = 5; - this.layoutDimension.y = 5; + this.layoutDimension.x = 15; + this.layoutDimension.y = 15; - this.layout = new int[(int) this.layoutDimension.x,(int) this.layoutDimension.y]; + this.layout = new Tile[(int)this.layoutDimension.x, (int)this.layoutDimension.y];//[(int) this.layoutDimension.x,(int) this.layoutDimension.y]; + + for(int i =0; i < this.layoutDimension.x; i++){ + for(int j = 0; j < this.layoutDimension.y; j++){ + this.layout[j, i] = new Tile(); + } + } + + string[] zoneNames = {"Recidential", "Commercial", "Industrial"}; for(int i = 0; i < 3; i++){ for(int j = 0; j < 3; j++){ - this.layout[j,i] = 1+i+j*3; + this.layout[j,i].genDemo(1+j+i*3, zoneNames[j]);//= 1+i+j*3; } } - this.tiles = new Tile[25]; + //this.tiles = new Tile[25]; - for(int i =0; i < this.layoutDimension.x * this.layoutDimension.y; i++){ + /*for(int i =0; i < this.layoutDimension.x * this.layoutDimension.y; i++){ this.tiles[i] = new Tile(); } - + string[] zoneNames = {"Recidential", "Commercial", "Industrial"}; for(int y = 0; y < 3; y++){ for(int x = 0; x < 3; x++){ this.tiles[(int)(x + y * this.layoutDimension.x)].genDemo(1+x+y*3,zoneNames[x]); } - } + }*/ } diff --git a/Assets/Scripts/CityGen/CityGen_Simulator.cs b/Assets/Scripts/CityGen/CityGen_Simulator.cs index 544c0d64fdf5c63325eacfba09df031e19273b67..e374ad8fc5fbd11772a39a0b931756be34878627 100644 --- a/Assets/Scripts/CityGen/CityGen_Simulator.cs +++ b/Assets/Scripts/CityGen/CityGen_Simulator.cs @@ -22,7 +22,7 @@ public partial class CityGen : MonoBehaviour { this.city.genDemo(); // Run simulation - for(int i = 0; i < 1; i++) { + for(int i = 0; i < 5; i++) { this.updateBoard(); } @@ -36,8 +36,8 @@ public partial class CityGen : MonoBehaviour { string logBoard = ""; for(int i = 0; i < this.city.layoutDimension.y; i++) { for(int j = 0; j < this.city.layoutDimension.x; j++) { - logBoard += this.city.layout[j,i] + this.city.tiles[j + i * (int)this.city.layoutDimension.x].zoneName + " "; - Prefab prefab = city.findPrefabById(this.city.layout[j,i]); + logBoard += this.city.layout[j,i].development + this.city.layout[j,i].zoneName + " "; + Prefab prefab = city.findPrefabById(this.city.layout[j,i].development); if(prefab != null && prefab.prefab != null){ //print(prefab.identifier); Vector3 position = new Vector3( transform.position.x + j * prefab.footprint.x, @@ -66,7 +66,7 @@ public partial class CityGen : MonoBehaviour { }*/ // A temp variable to hold the next state while it's being calculated. - int[,] newBoard = new int[(int)this.city.layoutDimension.x, (int)this.city.layoutDimension.y]; + Tile[,] newBoard = new Tile[(int)this.city.layoutDimension.x, (int)this.city.layoutDimension.y]; for (var y = 0; y < this.city.layoutDimension.y; y++) { for (var x = 0; x < this.city.layoutDimension.x; x++) { @@ -90,11 +90,13 @@ public partial class CityGen : MonoBehaviour { } //updates the type and development of tile at (x,y) - private int updateTile(int x, int y) + private Tile updateTile(int x, int y) { // The value indicating type and development of current tile. Vector3 value = getTileValueVector(x, y); + List<Vector3> effects = new List<Vector3>(); + // This nested loop enumerates the 9 cells in the specified cells neighborhood. for (var j = -1; j <= 1; j++) { // If loopEdges is set to false and y+j is off the board, continue. @@ -104,9 +106,9 @@ public partial class CityGen : MonoBehaviour { // Loop around the edges if y+j is off the board. int k = (y + j + (int)this.city.layoutDimension.y) % (int)this.city.layoutDimension.y; - + for (var i = -1; i <= 1; i++) { - // If loopEdges is set to false and x+i is off the board, continue. + // If loopEdges is set to false and x+i is off the board, continue. if (!this.loopEdges && x + i < 0 || x + i >= (int)this.city.layoutDimension.x) { continue; } @@ -116,33 +118,37 @@ public partial class CityGen : MonoBehaviour { // Count the neighbor cell at (h,k) if it is alive. ZoneType zoneType = this.city.findZoneByName( - this.city.tiles[(int)(h + k * this.city.layoutDimension.x)].zoneName + this.city.layout[h, k].zoneName ); - if(zoneType != null){ - value = zoneType.zoneRule(value); - } + //if(zoneType != null){ + effects.Add(zoneType.zoneRule(value)); + //} } } - - int prefabId = this.city.updateTile(x, y, value); - return prefabId; + + + return this.city.layout[x, y].updateTile( + this.standardize( + this.grindDaEffects(effects) + ) + ); } // Get a Vector4 representing tile at (x,y) preference towards the three zoneTypes and development. public Vector3 getTileValueVector(int x, int y){ - string zoneName = this.city.tiles[(int)(x + y * this.city.layoutDimension.x)].zoneName; + string zoneName = this.city.layout[x, y].zoneName; ZoneType zoneType = this.city.findZoneByName(zoneName); if(zoneType.zoneName == "Empty"){ return Vector3.zero; } - +/* int development = zoneType.getDevelopmentIndex( - this.city.layout[x, y] - ); - + this.city.layout[x, y].development + ); */ + int development = this.city.layout[x,y].development; switch(zoneName){ case "Recidential": return new Vector3(1.0f * development, 0.0f, 0.0f); @@ -156,5 +162,31 @@ public partial class CityGen : MonoBehaviour { return Vector3.zero; } + + public Vector3 grindDaEffects(List<Vector3> effects){ + Vector3 result = new Vector3(); + + foreach (Vector3 effect in effects) + result += (effect + new Vector3( + UnityEngine.Random.Range(0, 10), + UnityEngine.Random.Range(0, 10), + UnityEngine.Random.Range(0, 10) + ) + ); + + return result; + } + + public Vector3 standardize(Vector3 vector){ + vector.Normalize(); + vector = vector * 3; + + if (Mathf.Min(vector.x, vector.y, vector.z) == 0.0f) + return vector; + + float ratio = Mathf.Max(vector.x, vector.y, vector.z) / Mathf.Min(vector.x, vector.y, vector.z); + + return vector * ratio ; + } } diff --git a/Assets/Scripts/CityGen/somthingToFixWhenTheDayComes.cs b/Assets/Scripts/CityGen/somthingToFixWhenTheDayComes.cs new file mode 100644 index 0000000000000000000000000000000000000000..2a31ec59dd6a8ce753752587839523723535516a --- /dev/null +++ b/Assets/Scripts/CityGen/somthingToFixWhenTheDayComes.cs @@ -0,0 +1,52 @@ +/* +public Tile updateTile(Vector3 value){ + Tile newTile = new Tile(this); + // update zoneName + + int mostProminent = 0; + float heighestValue = 0.0f; + for(int i =0; i < 3; i++ ){ + if(value[i] > heighestValue){ + heighestValue = value[i]; + mostProminent = i; + } + } + + float ratio = Mathf.Max(value.x, value.y, value.z) / Mathf.Min(value.x, value.y, value.z); + //Find the range of development (require zoneTypes) -> this.zoneTypes[mostProminent].prefabsIdentifier.Count; + + // Set zoneName based on most prominent feature + switch(mostProminent){ + case 0:{ + if(this.zoneName == "Recidential"){ + newTile.development = this.development++; + }else{ + newTile.development = this.development--; + } + newTile.zoneName = "Recidential"; + break; + } + case 1:{ + if(this.zoneName == "Commercial"){ + newTile.development = this.development++; + }else{ + newTile.development = this.development--; + } + newTile.zoneName = "Commercial"; + break; + } + case 2:{ + if(this.zoneName == "Industrial"){ + newTile.development = this.development++; + }else{ + newTile.development = this.development--; + } + newTile.zoneName = "Industrial"; + break; + } + } + + return newTile; + } + + */ \ No newline at end of file diff --git a/Assets/Scripts/CityGen/somthingToFixWhenTheDayComes.cs.meta b/Assets/Scripts/CityGen/somthingToFixWhenTheDayComes.cs.meta new file mode 100644 index 0000000000000000000000000000000000000000..84b9f2688c4f67a91095d397c9559555ea5d303e --- /dev/null +++ b/Assets/Scripts/CityGen/somthingToFixWhenTheDayComes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0aae670bee2894d9ba0692b061f5d3c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: