--- a/hedgewars/uLandGenMaze.pas Sun Jan 19 00:18:28 2014 +0400
+++ b/hedgewars/uLandGenMaze.pas Tue Jan 21 22:38:13 2014 +0100
@@ -16,7 +16,6 @@
DIR_S: direction = (x: 0; y: 1);
DIR_W: direction = (x: -1; y: 0);
-
operator = (const a, b: direction) c: Boolean;
begin
c := (a.x = b.x) and (a.y = b.y);
@@ -27,28 +26,43 @@
large_cell_size = 256;
braidness = 10;
-var x, y: LongInt;
- cellsize: LongInt; //selected by the user in the gui
- seen_cells_x, seen_cells_y: LongInt; //number of cells that can be visited by the generator, that is every second cell in x and y direction. the cells between there are walls that will be removed when we move from one cell to another
- num_edges_x, num_edges_y: LongInt; //number of resulting edges that need to be vertexificated
- num_cells_x, num_cells_y: LongInt; //actual number of cells, depending on cell size
- seen_list: array of array of LongInt;
- xwalls: array of array of Boolean;
- ywalls: array of array of Boolean;
- x_edge_list: array of array of Boolean;
- y_edge_list: array of array of Boolean;
- maze: array of array of Boolean;
- pa: TPixAr;
- num_vertices: LongInt;
- off_y: LongInt;
- num_steps: LongInt;
- current_step: LongInt;
- step_done: array of Boolean;
- done: Boolean;
- last_cell: array of record x, y: LongInt; end;
- came_from: array of array of record x, y: LongInt; end;
+type
+ cell_t = record x,y : LongInt
+ end;
+
+var x, y : LongInt;
+ cellsize : LongInt; //selected by the user in the gui
+ seen_cells_x, seen_cells_y : LongInt; //number of cells that can be visited by the generator, that is every second cell in x and y direction. the cells between there are walls that will be removed when we move from one cell to another
+ num_edges_x, num_edges_y : LongInt; //number of resulting edges that need to be vertexificated
+ num_cells_x, num_cells_y : LongInt; //actual number of cells, depending on cell size
+
+
+ seen_list : array of array of LongInt;
+ xwalls : array of array of Boolean;
+ ywalls : array of array of Boolean;
+ x_edge_list : array of array of Boolean;
+ y_edge_list : array of array of Boolean;
+ maze : array of array of Boolean;
+
+ pa : TPixAr;
+ num_vertices : LongInt;
+ off_y : LongInt;
+ num_steps : LongInt;
+ current_step : LongInt;
+
+ step_done : array of Boolean;
+
+ done : Boolean;
+
+{ last_cell : array 0..3 of record x, y :LongInt ; end;
+ came_from : array of array of record x, y: LongInt; end;
+ came_from_pos : array of LongInt;
+}
+ last_cell : array of cell_t;
+ came_from : array of array of cell_t;
came_from_pos: array of LongInt;
- maze_inverted: Boolean;
+
+ maze_inverted : Boolean;
function when_seen(x: LongInt; y: LongInt): LongInt;
begin
@@ -104,11 +118,11 @@
begin
//we have already seen the target cell, decide if we should remove the wall anyway
//(or put a wall there if maze_inverted, but we are not doing that right now)
- if not maze_inverted and (GetRandom(braidness) = 0) then
+ if (not maze_inverted) and (GetRandom(braidness) = 0) then
//or just warn that inverted+braid+indestructible terrain != good idea
begin
case dir.x of
-
+
-1:
if x > 0 then
ywalls[x-1, y] := false;
@@ -178,10 +192,10 @@
last_cell[current_step].x := came_from[current_step, came_from_pos[current_step]].x;
last_cell[current_step].y := came_from[current_step, came_from_pos[current_step]].y;
came_from_pos[current_step] := came_from_pos[current_step] - 1;
-
+
if came_from_pos[current_step] >= 0 then
- see_cell
-
+ see_cell()
+
else
step_done[current_step] := true;
end;
@@ -208,7 +222,7 @@
tmp_x := cellsize
else
tmp_x := cellsize * 2 div 3;
-
+
if maze_inverted or (y mod 2 = 0) then
tmp_y := cellsize
else
@@ -318,11 +332,11 @@
num_cells_x := LAND_WIDTH div cellsize;
if not odd(num_cells_x) then
num_cells_x := num_cells_x - 1; //needs to be odd
-
+
num_cells_y := LAND_HEIGHT div cellsize;
if not odd(num_cells_y) then
num_cells_y := num_cells_y - 1;
-
+
num_edges_x := num_cells_x - 1;
num_edges_y := num_cells_y - 1;
@@ -333,19 +347,23 @@
num_steps := 3 //TODO randomize, between 3 and 5?
else
num_steps := 1;
-
+
SetLength(step_done, num_steps);
SetLength(last_cell, num_steps);
SetLength(came_from_pos, num_steps);
SetLength(came_from, num_steps, num_cells_x*num_cells_y);
+
done := false;
for current_step := 0 to num_steps - 1 do
+begin
step_done[current_step] := false;
came_from_pos[current_step] := 0;
-
+end;
+
current_step := 0;
+
SetLength(seen_list, seen_cells_x, seen_cells_y);
SetLength(xwalls, seen_cells_x, seen_cells_y - 1);
SetLength(ywalls, seen_cells_x - 1, seen_cells_y);
@@ -353,6 +371,7 @@
SetLength(y_edge_list, num_cells_x, num_edges_y);
SetLength(maze, num_cells_x, num_cells_y);
+
num_vertices := 0;
playHeight := num_cells_y * cellsize;