221 lines
7.2 KiB
C#
221 lines
7.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using UnityEngine;
|
|
|
|
namespace Assets.Scripts
|
|
{
|
|
public enum TileType
|
|
{
|
|
PLAIN,
|
|
HILLS,
|
|
FOREST,
|
|
MOUNTAINS,
|
|
LAKE,
|
|
CITY,
|
|
DESERT,
|
|
NULL
|
|
}
|
|
|
|
static class TileTypeMethods
|
|
{
|
|
public static TileType getRandomType(int index)
|
|
{
|
|
return (TileType)index;
|
|
}
|
|
|
|
public static int getHighest()
|
|
{
|
|
return (int)TileType.DESERT;
|
|
}
|
|
|
|
public static List<TileType> getPossibleNeighbours(TileType toCheck)
|
|
{
|
|
List<TileType> result = new List<TileType>();
|
|
switch (toCheck)
|
|
{
|
|
case TileType.PLAIN:
|
|
result.Add(TileType.PLAIN);
|
|
result.Add(TileType.FOREST);
|
|
result.Add(TileType.LAKE);
|
|
result.Add(TileType.MOUNTAINS);
|
|
result.Add(TileType.DESERT);
|
|
result.Add(TileType.HILLS);
|
|
break;
|
|
case TileType.FOREST:
|
|
result.Add(TileType.PLAIN);
|
|
result.Add(TileType.FOREST);
|
|
break;
|
|
case TileType.MOUNTAINS:
|
|
result.Add(TileType.PLAIN);
|
|
result.Add(TileType.MOUNTAINS);
|
|
break;
|
|
case TileType.LAKE:
|
|
result.Add(TileType.PLAIN);
|
|
result.Add(TileType.LAKE);
|
|
result.Add(TileType.DESERT);
|
|
result.Add(TileType.CITY);
|
|
break;
|
|
case TileType.DESERT:
|
|
result.Add(TileType.PLAIN);
|
|
result.Add(TileType.LAKE);
|
|
result.Add(TileType.DESERT);
|
|
break;
|
|
case TileType.HILLS:
|
|
result.Add(TileType.PLAIN);
|
|
result.Add(TileType.HILLS);
|
|
break;
|
|
case TileType.CITY:
|
|
result.Add(TileType.LAKE);
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static Color getLowestColor(TileType type)
|
|
{
|
|
Color32 result;
|
|
switch (type)
|
|
{
|
|
case TileType.PLAIN:
|
|
result = new Color32(0, 150, 0, 255);
|
|
break;
|
|
case TileType.HILLS:
|
|
result = new Color32(0, 150, 0, 255);
|
|
break;
|
|
case TileType.FOREST:
|
|
result = new Color32(0, 150, 0, 255);
|
|
break;
|
|
case TileType.MOUNTAINS:
|
|
result = new Color32(0, 150, 0, 255);
|
|
break;
|
|
case TileType.LAKE:
|
|
result = new Color32(30, 110, 190, 255);
|
|
break;
|
|
case TileType.DESERT:
|
|
result = new Color32(219, 186, 162, 255);
|
|
break;
|
|
default:
|
|
result = new Color32(0, 150, 0, 255);
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static Color32 getHighestColor(TileType type)
|
|
{
|
|
Color32 result;
|
|
switch (type)
|
|
{
|
|
case TileType.PLAIN:
|
|
result = new Color32(0, 185, 0, 255);
|
|
break;
|
|
case TileType.HILLS:
|
|
result = new Color32(0, 185, 0, 255);
|
|
break;
|
|
case TileType.FOREST:
|
|
result = new Color32(0, 110, 20, 255);
|
|
break;
|
|
case TileType.MOUNTAINS:
|
|
result = new Color32(140, 140, 140, 255);
|
|
break;
|
|
case TileType.LAKE:
|
|
result = new Color32(0, 150, 0, 255);
|
|
break;
|
|
case TileType.DESERT:
|
|
result = new Color32(237, 201, 175, 255);
|
|
break;
|
|
default:
|
|
result = new Color32(0, 185, 0, 255);
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static float[] generateSamples(TileType type, Vector3[] vertices, System.Random rand)
|
|
{
|
|
float[] result = new float[vertices.Length];
|
|
float part1;
|
|
float part2;
|
|
float[] lowModifier = new float[2];
|
|
float[] highModifier = new float[2];
|
|
switch (type)
|
|
{
|
|
case TileType.PLAIN:
|
|
lowModifier[0] = 0.2f;
|
|
lowModifier[1] = 0.1f;
|
|
highModifier[0] = 0.2f;
|
|
highModifier[1] = 0.1f;
|
|
break;
|
|
case TileType.HILLS:
|
|
lowModifier[0] = 0.2f;
|
|
lowModifier[1] = 0.1f;
|
|
highModifier[0] = 0.5f;
|
|
highModifier[1] = 0.1f;
|
|
break;
|
|
case TileType.FOREST:
|
|
lowModifier[0] = 0.15f;
|
|
lowModifier[1] = 0.1f;
|
|
highModifier[0] = 0.3f;
|
|
highModifier[1] = 0.1f;
|
|
break;
|
|
case TileType.MOUNTAINS:
|
|
lowModifier[0] = 0.2f;
|
|
lowModifier[1] = 0.3f;
|
|
highModifier[0] = 1.0f;
|
|
highModifier[1] = 0.2f;
|
|
break;
|
|
case TileType.LAKE:
|
|
lowModifier[0] = 0.2f;
|
|
lowModifier[1] = 0.1f;
|
|
highModifier[0] = 0.3f;
|
|
highModifier[1] = 0.1f;
|
|
break;
|
|
case TileType.DESERT:
|
|
lowModifier[0] = 0.2f;
|
|
lowModifier[1] = 0.1f;
|
|
highModifier[0] = 0.5f;
|
|
highModifier[1] = 0.1f;
|
|
break;
|
|
case TileType.CITY:
|
|
lowModifier[0] = 0.1f;
|
|
lowModifier[1] = 0.1f;
|
|
highModifier[0] = 0.1f;
|
|
highModifier[1] = 0.1f;
|
|
break;
|
|
}
|
|
for (int i = 0; i < result.Length; i++)
|
|
{
|
|
part1 = Mathf.PerlinNoise(vertices[i].x, vertices[i].z) - lowModifier[0] * rand.Next(0, 6);
|
|
part2 = Mathf.PerlinNoise(vertices[i].x, vertices[i].z) + highModifier[0] * rand.Next(0, 6);
|
|
|
|
result[i] = part1 * lowModifier[1] + part2 * highModifier[0];
|
|
}
|
|
|
|
result = adaptType(type, result);
|
|
return result;
|
|
}
|
|
|
|
private static float[] adaptType(TileType type, float[] basis)
|
|
{
|
|
float[] result = basis;
|
|
for (int i = 0; i < result.Length; i++)
|
|
{
|
|
switch (type)
|
|
{
|
|
case TileType.LAKE:
|
|
result[i] = basis[i] - 3;
|
|
break;
|
|
case TileType.MOUNTAINS:
|
|
result[i] = basis[i] + 3;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|
|
}
|