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;
}
}
}