1
0
Fork 0

GenerationProcessor

This commit is contained in:
Saibotk 2018-04-22 02:23:13 +02:00
parent bb476cc969
commit 50d76e7ec2
4 changed files with 255 additions and 3 deletions

View file

@ -11,6 +11,53 @@ public class GameController : MonoBehaviour {
private Room start;
private Room finish;
// Generation Settings
[Header("Tile Prefabs")]
[SerializeField]
GameObject BorderOuter;
[SerializeField]
GameObject BorderInner;
[SerializeField]
GameObject BorderSingle;
[SerializeField]
GameObject Ground;
[SerializeField]
GameObject Door;
[SerializeField]
GameObject Rock;
[SerializeField]
GameObject RockL;
[SerializeField]
GameObject RockU;
[SerializeField]
GameObject RockR;
[SerializeField]
GameObject RockD;
[SerializeField]
GameObject RockLU;
[SerializeField]
GameObject RockLR;
[SerializeField]
GameObject RockLD;
[SerializeField]
GameObject RockUR;
[SerializeField]
GameObject RockUD;
[SerializeField]
GameObject RockRD;
[SerializeField]
GameObject RockLURD;
[SerializeField]
GameObject RockLUD;
[SerializeField]
GameObject RockLUR;
[SerializeField]
GameObject RockURD;
[SerializeField]
GameObject RockLRD;
private Dictionary<GenerationProcessor.ExtendedTileType, GameObject> genPrefabs;
private bool engineInitDone;
public static GameController instance;
@ -25,6 +72,29 @@ public class GameController : MonoBehaviour {
// Use this for initialization
void Start () {
genPrefabs = new Dictionary<GenerationProcessor.ExtendedTileType, GameObject>();
genPrefabs.Add(GenerationProcessor.ExtendedTileType.BorderOuter, BorderOuter);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.BorderInner, BorderInner);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.BorderSingle, BorderSingle);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.Rock, Rock);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockL, RockL);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockU, RockU);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockR, RockR);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockD, RockD);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockLU, RockLU);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockLR, RockLR);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockLD, RockLD);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockLURD, RockLURD);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockRD, RockRD);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockUR, RockUR);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockUD, RockUD);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockLUD, RockLUD);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockLUR, RockLUR);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockURD, RockURD);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.RockLRD, RockLRD);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.Ground, Ground);
genPrefabs.Add(GenerationProcessor.ExtendedTileType.Door, Door);
//ChangeState(GameState.INIT);
}

View file

@ -0,0 +1,171 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GenerationProcessor {
public enum ExtendedTileType
{
BorderOuter, BorderInner, BorderSingle, Ground, Door, Rock, RockL, RockU, RockR, RockD, RockLU, RockLR, RockLD, RockUR, RockUD, RockRD, RockLURD, RockLUD, RockLUR, RockURD, RockLRD
}
Dictionary<ExtendedTileType, GameObject> prefabs;
public GenerationProcessor(Dictionary<ExtendedTileType, GameObject> prefabs)
{
this.prefabs = prefabs;
}
public GameObject ProcessRoom(Dictionary<Vector2, Room.TileType> d)
{
GameObject root = new GameObject
{
name = "Room"
};
foreach (Vector2 v in d.Keys)
{
bool left = false;
bool top = false;
bool right = false;
bool bottom = false;
// left bound
if(d.ContainsKey(v + new Vector2(-1, 0)))
{
if(d[v + new Vector2(-1, 0)] == d[v])
{
left = true;
}
}
// top bound
if (d.ContainsKey(v + new Vector2(0, 1)))
{
if (d[v + new Vector2(0, 1)] == d[v])
{
top = true;
}
}
// right bound
if (d.ContainsKey(v + new Vector2(1, 0)))
{
if (d[v + new Vector2(1, 0)] == d[v])
{
right = true;
}
}
// bottom bound
if (d.ContainsKey(v + new Vector2(0, -1)))
{
if (d[v + new Vector2(0, -1)] == d[v])
{
bottom = true;
}
}
ExtendedTileType type = ExtendedTileType.Ground;
// ---------------------------------------------------------------------------------------------------------------------------------------------
// ^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~
//
// *** W A R N I N G B A D C O D E A H E A D ! ! ! ***
// __________________________________________________________________________
//
// DON'T WATCH, UNLESS YOU WANT TO GET TRAUMATIZED!
//
// ^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~^~!~
// ---------------------------------------------------------------------------------------------------------------------------------------------
switch (d[v])
{
case Room.TileType.WALL:
type = ExtendedTileType.BorderSingle;
if(top && left && d.ContainsKey(v + new Vector2(-1, -1)) || top && right && d.ContainsKey(v + new Vector2(1, -1)) || right && bottom && d.ContainsKey(v + new Vector2(1, 1)) || left && bottom && d.ContainsKey(v + new Vector2(-1, 1)))
{
type = ExtendedTileType.BorderOuter;
} else if(top && left || top && right || right && bottom || left && bottom)
{
type = ExtendedTileType.BorderInner;
}
break;
case Room.TileType.GROUND:
type = ExtendedTileType.Ground;
break;
case Room.TileType.DOOR:
type = ExtendedTileType.Door;
break;
case Room.TileType.ROCK:
type = ExtendedTileType.Rock;
if (top && !right && !left && !bottom)
{
type = ExtendedTileType.RockU;
}
if (left && !right && !bottom && !top)
{
type = ExtendedTileType.RockL;
}
if (right && !bottom && !left && !top)
{
type = ExtendedTileType.RockR;
}
if (bottom && !right && !left && !top)
{
type = ExtendedTileType.RockD;
}
if (left && top && !bottom && !right)
{
type = ExtendedTileType.RockLU;
}
if (left && right && !top && !bottom)
{
type = ExtendedTileType.RockLR;
}
if (left && bottom && !right && !top)
{
type = ExtendedTileType.RockLD;
}
if (top && right && !left && !bottom)
{
type = ExtendedTileType.RockUR;
}
if (top && bottom && !left && !right)
{
type = ExtendedTileType.RockUD;
}
if (right && bottom && !top && !left)
{
type = ExtendedTileType.RockRD;
}
if (left && top && bottom && !right)
{
type = ExtendedTileType.RockLUD;
}
if (left && top && right && !bottom)
{
type = ExtendedTileType.RockLUR;
}
if (top && right && bottom && !left)
{
type = ExtendedTileType.RockURD;
}
if (left && right && bottom && !top)
{
type = ExtendedTileType.RockLRD;
}
if (left && top && right && bottom)
{
type = ExtendedTileType.RockLURD;
}
break;
}
CreateGOFromType(v, type, root);
}
return root;
}
private GameObject CreateGOFromType(Vector2 v, ExtendedTileType t, GameObject root)
{
GameObject tmp = null;
if (prefabs.ContainsKey(t) && root != null)
{
tmp = GameObject.Instantiate(prefabs[t], root.transform);
tmp.transform.position = v;
}
return tmp;
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ff430f09ad5abe842954d226715a96aa
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -5,11 +5,11 @@ using UnityEngine;
public class Room : MonoBehaviour {
public enum TileType {
GROUND, WALL, DOOR
GROUND, WALL, DOOR, ROCK
}
Vector2 position;
Map<Vector2, TileType> tiles;
Dictionary<Vector2, TileType> tiles;
List<Door> doors;
List<Transform> spawnpoints;