Skip to content

Commit

Permalink
Merge pull request #126 from Fenyx4/dungeon
Browse files Browse the repository at this point in the history
Simple dungeons!
  • Loading branch information
Fenyx4 authored Jan 18, 2022
2 parents 8417fa3 + b37e418 commit 2db76c3
Show file tree
Hide file tree
Showing 8 changed files with 622 additions and 4 deletions.
13 changes: 12 additions & 1 deletion U4DosRandomizer/Dungeon.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,17 @@ public Dungeon(Stream dngStream, UltimaData data)
}
}

public IEnumerable<DungeonTile> Tiles(int level)
{
for (int row = 0; row < 8; row++)
{
for (int col = 0; col < 8; col++)
{
yield return GetTile(level, row, col);
}
}
}

public byte[] Save()
{
var dungeonBytes = new byte[8 * 8 * 8 + 256 * rooms.Count];
Expand Down Expand Up @@ -89,7 +100,7 @@ public DungeonTile GetTile(int level, int x, int y)

public void SetTile(int l, int x, int y, byte tile)
{
map[l, x, y] = tile;
map[l, x % 8 , y % 8] = tile;
}
}
}
67 changes: 64 additions & 3 deletions U4DosRandomizer/DungeonTile.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
namespace U4DosRandomizer
using System;
using System.Collections.Generic;

namespace U4DosRandomizer
{
public class DungeonTile
{
Expand All @@ -11,8 +14,8 @@ public class DungeonTile
public DungeonTile(int l, int x, int y, byte[,,] map)
{
this.L = l;
this.X = x;
this.Y = y;
this.X = Wrap(x);
this.Y = Wrap(y);
this.map = map;
}

Expand All @@ -25,5 +28,63 @@ public void SetTile(byte tile)
{
map[L, X, Y] = tile;
}

public IEnumerable<DungeonTile> NeighborsSameLevel()
{
DungeonTile[] neighbors = new DungeonTile[4];
neighbors[0] = new DungeonTile(L, X - 1, Y, map);
neighbors[1] = new DungeonTile(L, X + 1, Y, map);
neighbors[2] = new DungeonTile(L, X, Y - 1, map);
neighbors[3] = new DungeonTile(L, X, Y + 1, map);

return neighbors;
}

public IEnumerable<DungeonTile> NeighborsSameLevelAndAdjacent()
{
DungeonTile[] neighbors = new DungeonTile[8];
neighbors[0] = new DungeonTile(L, X - 1, Y, map);
neighbors[1] = new DungeonTile(L, X + 1, Y, map);
neighbors[2] = new DungeonTile(L, X, Y - 1, map);
neighbors[3] = new DungeonTile(L, X, Y + 1, map);
neighbors[4] = new DungeonTile(L, X - 1, Y - 1, map);
neighbors[5] = new DungeonTile(L, X + 1, Y - 1, map);
neighbors[6] = new DungeonTile(L, X - 1, Y + 1, map);
neighbors[7] = new DungeonTile(L, X + 1, Y + 1, map);

return neighbors;
}

public IEnumerable<DungeonTile> KittyCorners()
{
DungeonTile[] neighbors = new DungeonTile[4];
neighbors[0] = new DungeonTile(L, X - 1, Y - 1, map);
neighbors[1] = new DungeonTile(L, X + 1, Y - 1, map);
neighbors[2] = new DungeonTile(L, X - 1, Y + 1, map);
neighbors[3] = new DungeonTile(L, X + 1, Y + 1, map);

return neighbors;
}

private static int Wrap(int input)
{
return (input % 8 + 8) % 8;
}

public override int GetHashCode()
{
int result = (int)(X ^ (X >> 32));
result = 31 * result + (int)(Y ^ (Y >> 32));
result = 31 * result + (int)(L ^ (L >> 32));
return result;
}

public override bool Equals(Object obj)
{
if (obj == null || !(obj is DungeonTile))
return false;
else
return X == ((DungeonTile)obj).X && Y == ((DungeonTile)obj).Y && L == ((DungeonTile)obj).L;
}
}
}
13 changes: 13 additions & 0 deletions U4DosRandomizer/Dungeons.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,19 @@ public void Randomize(Random random, Flags flags)
}
}
}

var noDungeons = new NoDungeonGenerator();
foreach( var dungeonName in dungeons.Keys)
{
noDungeons.GenerateMaze(dungeonName, dungeons[dungeonName], 8, 8, 8, random);
}
//var wilson = new WilsonMazeGenerator();
////TODO - Do something here
//foreach( var dungeon in dungeons.Values)
//{
// wilson.GenerateMaze(dungeon, 8, 8, 8, random);
//}

}

public void Update(UltimaData ultimaData, Flags flags)
Expand Down
18 changes: 18 additions & 0 deletions U4DosRandomizer/Helpers/Extensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace U4DosRandomizer.Helpers
{
public static class Extensions
{
// https://github.com/MrYossu/MazesForProgrammers/blob/1fae491a80240f80c334f2721189dd43a0146dec/Mazes.Models/Models/Extensions.cs
public static T Rand<T>(this IEnumerable<T> items, Random r = null) =>
items.Shuffle(r).First();

// https://github.com/MrYossu/MazesForProgrammers/blob/1fae491a80240f80c334f2721189dd43a0146dec/Mazes.Models/Models/Extensions.cs
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> items, Random r) =>
items.OrderBy(n => r.Next());
}
}
9 changes: 9 additions & 0 deletions U4DosRandomizer/IMazeGenerator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System;

namespace U4DosRandomizer
{
public interface IMazeGenerator
{
void GenerateMaze(string dungeonName, Dungeon dungeon, int numLevels, int width, int height, Random rand);
}
}
189 changes: 189 additions & 0 deletions U4DosRandomizer/NoDungeonGenerator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
using System;

namespace U4DosRandomizer
{
internal class NoDungeonGenerator : IMazeGenerator
{
public NoDungeonGenerator()
{
}

public void GenerateMaze(string dungeonName, Dungeon dungeon, int numLevels, int width, int height, Random rand)
{
for(int l = 0; l < numLevels; l++)
{
for(int x = 0; x < width; x++)
{
for(int y = 0; y < height; y++)
{
dungeon.SetTile(l, x, y, DungeonTileInfo.Wall);
}
}
}


if (dungeonName.ToLower() != "abyss")
{
// Starting tile needs to exit dungeon
dungeon.SetTile(0, 1, 1, DungeonTileInfo.LadderUp);
for(int x = 2; x < 6; x++)
{
dungeon.SetTile(0, x, 1, DungeonTileInfo.Nothing);
}
dungeon.SetTile(0, 6, 1, DungeonTileInfo.LadderDown);

for (int l = 1; l < numLevels; l++)
{
if (l != numLevels - 1)
{
dungeon.SetTile(l, 6, 1, DungeonTileInfo.LadderBoth);
}
else
{
dungeon.SetTile(l, 6, 1, DungeonTileInfo.LadderUp);
}
}

dungeon.SetTile(numLevels - 1, 6, 2, DungeonTileInfo.AltarOrStone);

//// Altar of Truth needs to be in row 1 or 2
//dungeon.SetTile(numLevels - 1, 1, 1, DungeonTileInfo.DungeonRoomStart + 15);
//// Altar of Love needs to be in row 3
//dungeon.SetTile(numLevels - 1, 3, 3, DungeonTileInfo.DungeonRoomStart + 15);


if (dungeonName.ToLower() == "deceit")
{
// Altar of Truth enter from the north needs to be in row 1 or 2
dungeon.SetTile(numLevels - 1, 1, 1, DungeonTileInfo.DungeonRoomStart + 15);
dungeon.SetTile(numLevels - 1, 7, 1, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 8, 1, DungeonTileInfo.Nothing);
}
if(dungeonName.ToLower() == "shame")
{
// Altar of Truth enter from the east needs to be in row 1 or 2
dungeon.SetTile(numLevels - 1, 1, 1, DungeonTileInfo.DungeonRoomStart + 15);
dungeon.SetTile(numLevels - 1, 6, 2, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 7, 2, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 8, 2, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 1, 2, DungeonTileInfo.Nothing);

// Altar of Courage enter from the west needs to be in row 4-8
dungeon.SetTile(numLevels - 1, 5, 5, DungeonTileInfo.DungeonRoomStart + 15);
dungeon.SetTile(numLevels - 1, 1, 2, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 2, 2, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 3, 2, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 4, 2, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 5, 2, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 5, 3, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 5, 4, DungeonTileInfo.Nothing);
}
if (dungeonName.ToLower() == "wrong")
{
// Altar of Truth enter from the west needs to be in row 1 or 2
dungeon.SetTile(numLevels - 1, 1, 1, DungeonTileInfo.DungeonRoomStart + 15);
dungeon.SetTile(numLevels - 1, 1, 8, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 8, 8, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 7, 8, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 6, 8, DungeonTileInfo.Nothing);

// Altar of Love enter from the east needs to be in row 3
dungeon.SetTile(numLevels - 1, 3, 3, DungeonTileInfo.DungeonRoomStart + 15);
dungeon.SetTile(numLevels - 1, 2, 8, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 3, 8, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 3, 7, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 3, 6, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 3, 5, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 3, 4, DungeonTileInfo.Nothing);

}
if (dungeonName.ToLower() == "despise")
{
// Altar of Love enter from the north needs to be in row 3
dungeon.SetTile(numLevels - 1, 3, 3, DungeonTileInfo.DungeonRoomStart + 15);
dungeon.SetTile(numLevels - 1, 7, 1, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 8, 1, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 1, 1, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 2, 1, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 2, 2, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 2, 3, DungeonTileInfo.Nothing);
}
if (dungeonName.ToLower() == "covetous")
{
// Altar of Love enter from the west needs to be in row 3
dungeon.SetTile(numLevels - 1, 3, 3, DungeonTileInfo.DungeonRoomStart + 15);
dungeon.SetTile(numLevels - 1, 3, 2, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 3, 1, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 4, 1, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 5, 1, DungeonTileInfo.Nothing);

// Altar of Courage enter from the east needs to be in row 4-8
dungeon.SetTile(numLevels - 1, 5, 5, DungeonTileInfo.DungeonRoomStart + 15);
dungeon.SetTile(numLevels - 1, 5, 6, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 5, 7, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 5, 8, DungeonTileInfo.Nothing);
}
if (dungeonName.ToLower() == "destard")
{
// Altar of Courage enter from the north needs to be in row 4-8
dungeon.SetTile(numLevels - 1, 5, 5, DungeonTileInfo.DungeonRoomStart + 15);

dungeon.SetTile(numLevels - 1, 7, 1, DungeonTileInfo.Nothing);
dungeon.SetTile(numLevels - 1, 8, 1, DungeonTileInfo.Nothing);
for (int y = 1; y < 6; y++)
{
dungeon.SetTile(numLevels - 1, 8, y, DungeonTileInfo.Nothing);
}
for (int x = 1; x < 5; x++)
{
dungeon.SetTile(numLevels - 1, x, 5, DungeonTileInfo.Nothing);
}
}
if (dungeonName.ToLower() == "hythloth")
{
// Altar of Truth needs to be in row 1 or 2
dungeon.SetTile(numLevels - 1, 1, 1, DungeonTileInfo.DungeonRoomStart + 15);
// Altar of Love needs to be in row 3
dungeon.SetTile(numLevels - 1, 3, 3, DungeonTileInfo.DungeonRoomStart + 15);
// Altar of Courage needs to be in row 4-8
dungeon.SetTile(numLevels - 1, 5, 5, DungeonTileInfo.DungeonRoomStart + 15);

// LB entrance connection
for (int y = 0; y < height; y++)
{
dungeon.SetTile(0, 5, y, DungeonTileInfo.Nothing);
}

// Passage way connecting all
for (int y = 2; y < 6; y++)
{
dungeon.SetTile(numLevels - 1, 6, y, DungeonTileInfo.Nothing);
}

// Altar of Truth enter from the south needs to be in row 1 or 2
for (int x = 2; x < 6; x++)
{
dungeon.SetTile(numLevels - 1, x, 1, DungeonTileInfo.Nothing);
}

// Altar of Love enter from the south needs to be in row 3
for (int x = 4; x < 6; x++)
{
dungeon.SetTile(numLevels - 1, x, 3, DungeonTileInfo.Nothing);
}
}
}
else
{
for (int l = 0; l < numLevels; l++)
{
dungeon.SetTile(l, 1, 1+l, DungeonTileInfo.LadderUp);
}
for (var l = 0;l < numLevels; l++)
{
dungeon.SetTile(l, 1, 2+l, DungeonTileInfo.AltarOrStone);
}
}
}
}
}
Loading

0 comments on commit 2db76c3

Please sign in to comment.