public void IsLandOrWaterTest() { var h = new Hex(); Assert.IsTrue(h.IsWater()); Assert.IsFalse(h.IsLand()); h = new Hex(Hex.HexType.Ocean); Assert.IsTrue(h.IsWater()); Assert.IsFalse(h.IsLand()); h = new Hex(Hex.HexType.Shore); Assert.IsTrue(h.IsWater()); Assert.IsFalse(h.IsLand()); h = new Hex(Hex.HexType.Land); Assert.IsFalse(h.IsWater()); Assert.IsTrue(h.IsLand()); var r = new River(); var rs = new RiverSegment(r); h.MainRiverSegment = rs; Assert.IsFalse(h.IsWater()); Assert.IsTrue(h.IsLand()); }
public River(Coords start, string name = "River") { Name = name; RiverSegment seg = new RiverSegment(this, start); FirstSeg = LastSeg = seg; }
private void AddFlow(RiverSegment riverSegment, int flow) { while (riverSegment != null) { riverSegment.Flow += flow; riverSegment = riverSegment.NextSegment; } }
public void Extend(Hex.Side side, Coords coords) { RiverSegment newSeg = new RiverSegment(this, coords); LastSeg.ExitSide = side; newSeg.EntrySide = Hex.OppositeSide(side); newSeg.PrevSegment = LastSeg; LastSeg.NextSegment = newSeg; LastSeg = newSeg; }
public void HasRiverTest() { var r = new River(); var rs = new RiverSegment(r); var h = new Hex(); Assert.IsFalse(h.HasRiver()); h.MainRiverSegment = rs; Assert.IsTrue(h.HasRiver()); }
// Adds start segment, and two following segments randomly public void SetupGame() { // Clear from a previous run foreach (RiverSegment rs in river) { // Destroy river prefab go Destroy(rs.riverPrefab); // And all obstacle gos if (rs.obstacles != null) { foreach (GameObject obs in rs.obstacles) { Destroy(obs); } } } // Ensure river is clear before starting river.Clear(); // Set obstacle spawning range obsRangeMin = 1; // Generate the first 3 river segments: // Start segment RiverSegment start = new RiverSegment(); // Create prefab instance start.riverPrefab = (GameObject)Instantiate(Resources.Load("StartSegment")); // Set its position start.riverPrefab.transform.position = Vector3.zero; // Set its type start.type = "Sq1TL"; // Add start to river list river.Add(start); // Going right direction = 2; // Add 2 more river segments AddRiverSegment(); AddRiverSegment(); }
private void PlaceSegment(RiverSegment segmentPrefab) { //get segment from pool or instatiate it var segment = pool.TryPop(segmentPrefab.type); //try get already instantiated segment from pool if (segment == null) { var segmentGameObject = Instantiate(segmentPrefab.gameObject, segmentParent); segment = segmentGameObject.GetComponent <RiverSegment>(); segment.onDespawn += delegate { pool.Push(segment); GenerateRiver(); }; } //set segment up segment.PlaceStartOfSegmentAt(spawnPosition); lastSegment = segment; }
// Adds another random river segment to game river list public void AddRiverSegment() { // Increase min number of obstacles per each segment with every new segment obsRangeMin++; // First - add new tile // Look at direction to determine next available group of tiles switch (direction) { // Up case 1: { int choice = Random.Range(1, 3); // Instantiate chosen tile if (choice == 1) { RiverSegment Sq1TL = new RiverSegment(); Sq1TL.riverPrefab = (GameObject)Instantiate(Resources.Load("Sq1TL")); // Set river current direction Sq1TL.riverPrefab.GetComponentInChildren <RiverCurrent_UD>().ChangeCurrentDirection(riverCurrentSpeed); Sq1TL.riverPrefab.GetComponentInChildren <RiverCurrentLR>().ChangeCurrentDirection(riverCurrentSpeed); Sq1TL.riverPrefab.GetComponentInChildren <RiverCurrentTL>().ChangeCurrentDirection(riverCurrentSpeed); // Set type Sq1TL.type = "Sq1TL"; Vector3 pos = river[river.Count - 1].riverPrefab.transform.position; pos.z += 60; Sq1TL.riverPrefab.transform.position = pos; // Add to river list river.Add(Sq1TL); // Set direction (right) direction = 2; } else if (choice == 2) { RiverSegment Sq1TR = new RiverSegment(); Sq1TR.riverPrefab = (GameObject)Instantiate(Resources.Load("Sq1TR")); // Set river direction Sq1TR.riverPrefab.GetComponentInChildren <RiverCurrent_UD>().ChangeCurrentDirection(riverCurrentSpeed); Sq1TR.riverPrefab.GetComponentInChildren <RiverCurrentLR>().ChangeCurrentDirection(-riverCurrentSpeed); // Right to left = neg Sq1TR.riverPrefab.GetComponentInChildren <RiverCurrentTR>().ChangeCurrentDirection(-riverCurrentSpeed); // Set type Sq1TR.type = "Sq1TR"; Vector3 pos = river[river.Count - 1].riverPrefab.transform.position; pos.z += 60; Sq1TR.riverPrefab.transform.position = pos; river.Add(Sq1TR); // Set direction (left) direction = 4; } } break; // Right case 2: { // Last tile was going right; can only choose from tiles in right river segments list Random.InitState(System.DateTime.Now.Millisecond); int choice = Random.Range(1, 3); // Only two options currently // Grab last tile type string lastType = river[river.Count - 1].type; // Instantiate the next tile from this group // Top Right if (choice == 1) { // Instantiate next river segment RiverSegment Sq1TR = new RiverSegment(); Sq1TR.riverPrefab = (GameObject)Instantiate(Resources.Load("Sq1TR")); // Set current direction Sq1TR.riverPrefab.GetComponentInChildren <RiverCurrent_UD>().ChangeCurrentDirection(-riverCurrentSpeed); Sq1TR.riverPrefab.GetComponentInChildren <RiverCurrentLR>().ChangeCurrentDirection(riverCurrentSpeed); Sq1TR.riverPrefab.GetComponentInChildren <RiverCurrentTR>().ChangeCurrentDirection(riverCurrentSpeed); // Set its type Sq1TR.type = "Sq1TR"; // Set its position - based on last tile type if (lastType == "Sq1TL") { // In this case, add 60 to x for next tile pos Vector3 pos = river[river.Count - 1].riverPrefab.transform.position; pos.x += 60; Sq1TR.riverPrefab.transform.position = pos; } else if (lastType == "Sq1BL") { // In this case, add 60 to x for next tile pos and subtract 40 from z Vector3 pos = river[river.Count - 1].riverPrefab.transform.position; pos.x += 60; pos.z -= 40; Sq1TR.riverPrefab.transform.position = pos; } // Add to river river.Add(Sq1TR); // Set direction (down) direction = 3; } // Bottom Right else if (choice == 2) { // Instantiate next river segment RiverSegment Sq1BR = new RiverSegment(); Sq1BR.riverPrefab = (GameObject)Instantiate(Resources.Load("Sq1BR")); Sq1BR.riverPrefab.GetComponentInChildren <RiverCurrent_UD>().ChangeCurrentDirection(riverCurrentSpeed); Sq1BR.riverPrefab.GetComponentInChildren <RiverCurrentLR>().ChangeCurrentDirection(riverCurrentSpeed); Sq1BR.riverPrefab.GetComponentInChildren <RiverCurrentBR>().ChangeCurrentDirection(-riverCurrentSpeed); // Set its type Sq1BR.type = "Sq1BR"; // Set its position - based on last tile type if (lastType == "Sq1TL") { // In this case, add 60 to x for next tile pos and add 40 to z Vector3 pos = river[river.Count - 1].riverPrefab.transform.position; pos.x += 60; pos.z += 40; Sq1BR.riverPrefab.transform.position = pos; } else if (lastType == "Sq1BL") { // In this case, add 60 to x for next tile pos Vector3 pos = river[river.Count - 1].riverPrefab.transform.position; pos.x += 60; Sq1BR.riverPrefab.transform.position = pos; } // Add to river river.Add(Sq1BR); // Set direction (up) direction = 1; } } break; // Down case 3: { // Pick a random segment Random.InitState(System.DateTime.Now.Millisecond); int choice = Random.Range(1, 3); // Only two options currently // Act on choice; instantiate chosen river segment // Bottom Left if (choice == 1) { // Instantiate prefab RiverSegment Sq1BL = new RiverSegment(); Sq1BL.riverPrefab = (GameObject)Instantiate(Resources.Load("Sq1BL")); // Set current direction Sq1BL.riverPrefab.GetComponentInChildren <RiverCurrent_UD>().ChangeCurrentDirection(-riverCurrentSpeed); Sq1BL.riverPrefab.GetComponentInChildren <RiverCurrentLR>().ChangeCurrentDirection(riverCurrentSpeed); Sq1BL.riverPrefab.GetComponentInChildren <RiverCurrentBL>().ChangeCurrentDirection(-riverCurrentSpeed); // Set its type Sq1BL.type = "Sq1BL"; // Set its position // In this case, -60 on z Vector3 pos = river[river.Count - 1].riverPrefab.transform.position; pos.z -= 60; Sq1BL.riverPrefab.transform.position = pos; // Add it to river list river.Add(Sq1BL); // Set direction (right) direction = 2; } // Bottom Right else if (choice == 2) { // Instantiate prefab RiverSegment Sq1BR = new RiverSegment(); Sq1BR.riverPrefab = (GameObject)Instantiate(Resources.Load("Sq1BR")); // Set current direction Sq1BR.riverPrefab.GetComponentInChildren <RiverCurrent_UD>().ChangeCurrentDirection(-riverCurrentSpeed); // Up to down is negative Sq1BR.riverPrefab.GetComponentInChildren <RiverCurrentLR>().ChangeCurrentDirection(-riverCurrentSpeed); // Right to left is negative Sq1BR.riverPrefab.GetComponentInChildren <RiverCurrentBR>().ChangeCurrentDirection(riverCurrentSpeed); // Set its type Sq1BR.type = "Sq1BR"; // Set its position // In this case, -60 on z Vector3 pos = river[river.Count - 1].riverPrefab.transform.position; pos.z -= 60; Sq1BR.riverPrefab.transform.position = pos; // Add segment to river list river.Add(Sq1BR); // Set direction (left) direction = 4; } } break; // Left case 4: { // Pick a random tile Random.InitState(System.DateTime.Now.Millisecond); int choice = Random.Range(1, 3); // Grab last tile type string lastType = river[river.Count - 1].type; // Act on choice // Top Left if (choice == 1) { RiverSegment Sq1TL = new RiverSegment(); Sq1TL.riverPrefab = (GameObject)Instantiate(Resources.Load("Sq1TL")); // Set current direction Sq1TL.riverPrefab.GetComponentInChildren <RiverCurrent_UD>().ChangeCurrentDirection(-riverCurrentSpeed); // Going down so neg Sq1TL.riverPrefab.GetComponentInChildren <RiverCurrentLR>().ChangeCurrentDirection(-riverCurrentSpeed); // Right to left so neg Sq1TL.riverPrefab.GetComponentInChildren <RiverCurrentTL>().ChangeCurrentDirection(-riverCurrentSpeed); // Negate Sq1TL.type = "Sq1TL"; // Set position based on last tile type if (lastType == "Sq1TR") { Vector3 pos = river[river.Count - 1].riverPrefab.transform.position; pos.x -= 60; Sq1TL.riverPrefab.transform.position = pos; } else if (lastType == "Sq1BR") { Vector3 pos = river[river.Count - 1].riverPrefab.transform.position; pos.x -= 60; pos.z -= 40; Sq1TL.riverPrefab.transform.position = pos; } // Add it to river list river.Add(Sq1TL); // Set direction (down) direction = 3; } // Bottom Left else if (choice == 2) { RiverSegment Sq1BL = new RiverSegment(); Sq1BL.riverPrefab = (GameObject)Instantiate(Resources.Load("Sq1BL")); // Set river current direction Sq1BL.riverPrefab.GetComponentInChildren <RiverCurrent_UD>().ChangeCurrentDirection(riverCurrentSpeed); Sq1BL.riverPrefab.GetComponentInChildren <RiverCurrentLR>().ChangeCurrentDirection(-riverCurrentSpeed); // Right to left Sq1BL.riverPrefab.GetComponentInChildren <RiverCurrentBL>().ChangeCurrentDirection(riverCurrentSpeed); // Set type Sq1BL.type = "Sq1BL"; // Set position based on last tile type if (lastType == "Sq1BR") { Vector3 pos = river[river.Count - 1].riverPrefab.transform.position; pos.x -= 60; Sq1BL.riverPrefab.transform.position = pos; } else if (lastType == "Sq1TR") { Vector3 pos = river[river.Count - 1].riverPrefab.transform.position; pos.x -= 60; pos.z += 40; Sq1BL.riverPrefab.transform.position = pos; } // Add it to river list river.Add(Sq1BL); // Set direction (up) direction = 1; } } break; default: break; } // end add tile switch on dir // Now add obstacles to this river segment AddRiverObstacles(); }
// Adds river obstacles to the last placed river segment private void AddRiverObstacles() { // First iteration - just add one rock to each river segment, in a random legal position // Copy the last river segment in river list RiverSegment riverSeg = river[river.Count - 1]; // Instantiate it's obstacles list riverSeg.obstacles = new List <GameObject>(); // Determine how many obstacles on this river segment int obsCount = Random.Range(obsRangeMin, obsRangeMin + 3); for (int i = 0; i < obsCount; i++) { // Randomise location of obstacle - based on type of river segment (each has unique area coords) int x = 0, z = 0; // Top left if (riverSeg.type == "Sq1TL") { x = Random.Range(-9, 30); if (x > 10) { z = Random.Range(41, 60); } else { z = Random.Range(1, 60); } } // Top right else if (riverSeg.type == "Sq1TR") { x = Random.Range(-30, 9); if (x < -10) { z = Random.Range(41, 60); } else { z = Random.Range(1, 60); } } // Bottom left else if (riverSeg.type == "Sq1BL") { x = Random.Range(-9, 30); if (x > 10) { z = Random.Range(1, 20); } else { z = Random.Range(1, 60); } } // Bottom right else if (riverSeg.type == "Sq1BR") { x = Random.Range(-30, 9); if (x < -10) { z = Random.Range(1, 20); } else { z = Random.Range(1, 60); } } else { Debug.Log("Type error!"); } // Then create a random rock game object string chosenRock = rockNames[Random.Range(0, rockNames.Length)]; Debug.Log("Rock: " + chosenRock); GameObject rock = (GameObject)Instantiate(Resources.Load(chosenRock)); // Set its position - relative to the segment's center pos Vector3 pos = new Vector3(riverSeg.riverPrefab.transform.position.x + x, 0, riverSeg.riverPrefab.transform.position.z + z); rock.transform.position = pos; // Add it to obstacles list riverSeg.obstacles.Add(rock); } // end obstacle for loop // Finally, overwrite last river segment with the copy that's been changed river[river.Count - 1] = riverSeg; }
public void Push(RiverSegment segment) //is called when segment exits screen { segment.gameObject.SetActive(false); pool.Add(segment); }