Refactored lake generation and collision-restricted generation...

This commit is contained in:
Ognjen Milan Robovic 2024-05-26 14:56:32 -04:00
parent 1699d73d55
commit c59d915f66

View File

@ -14,7 +14,6 @@ package body world is
view_reach : constant integer := 96;
lake_count : constant natural := 3;
lake_reach : constant natural := 12;
landmark_limit : constant integer := 90;
location_limit : constant integer := 30;
@ -36,7 +35,24 @@ package body world is
------------------------------------------------------------------------------------------
procedure earth_to_water_transition is
procedure generate_lake (x, y : in integer; size : in natural) is
starts, length : integer;
begin
for offset_x in -size / 2 .. size / 2 loop
starts := core.random (0, abs offset_x);
length := core.random (size / 2, size - starts);
--
for repeat in 0 .. 1 loop
for offset_y in starts .. starts + length loop
map.tiles (x + 2 * offset_x + repeat, y + offset_y) := core.random (18, 23);
end loop;
end loop;
end loop;
end generate_lake;
------------------------------------------------------------------------------------------
procedure compute_earth_to_water_transition is
matrix : array (0 .. 1, 0 .. 1) of natural;
begin
for x in 1 .. map.width - 2 loop
@ -62,7 +78,7 @@ package body world is
end if;
end loop;
end loop;
end earth_to_water_transition;
end compute_earth_to_water_transition;
------------------------------------------------------------------------------------------
@ -133,28 +149,12 @@ package body world is
end loop;
--
for this in 1 .. lake_count loop
declare lake_x : integer := 0;
lake_y : integer := 0;
starts : integer := 0;
length : integer := 0;
begin
lake_x := core.random (2 * lake_reach, map.width - 2 * lake_reach - 1);
lake_y := core.random (2 * lake_reach, map.height - 2 * lake_reach - 1);
--
for x in -lake_reach / 2 .. lake_reach / 2 loop
starts := core.random (0, abs x);
length := core.random (lake_reach / 2, lake_reach - starts);
--
for repeat in 0 .. 1 loop
for y in starts .. starts + length loop
map.tiles (lake_x + 2 * x + repeat, lake_y + y) := core.random (18, 23);
end loop;
end loop;
end loop;
end;
generate_lake (x => core.random (23, map.width - 23),
y => core.random (23, map.height - 23),
size => core.random (7, 19));
end loop;
--
earth_to_water_transition;
compute_earth_to_water_transition;
--
for x in 0 .. width - 1 loop
for y in 0 .. height - 1 loop
@ -167,9 +167,14 @@ package body world is
for index in 1 .. landmark_limit loop
map.landmarks (index).index := core.random (0, landmark_count - 1);
map.landmarks (index).state := 0;
<<repeat_landmark_generation>>
map.landmarks (index).x := core.random (6, map.width - 6);
map.landmarks (index).y := core.random (6, map.height - 6);
--
if map.clips (map.landmarks (index).x, map.landmarks (index).y) then
goto repeat_landmark_generation;
end if;
--
if landmark_trait (landmark_index'val (map.landmarks (index).index)).clip then
declare reach_x : constant natural := landmarks (landmark_index'val (map.landmarks (index).index)).width / core.base;
reach_y : constant natural := landmarks (landmark_index'val (map.landmarks (index).index)).height / core.base;
@ -186,9 +191,14 @@ package body world is
for index in 1 .. location_limit loop
map.locations (index).index := core.random (0, location_count - 1);
map.locations (index).state := 0;
<<repeat_location_generation>>
map.locations (index).x := core.random (6, map.width - 6);
map.locations (index).y := core.random (6, map.height - 6);
--
if map.clips (map.locations (index).x, map.locations (index).y) then
goto repeat_location_generation;
end if;
--
if location_trait (location_index'val (map.locations (index).index)).clip then
declare reach_x : constant natural := locations (location_index'val (map.locations (index).index)).width / core.base;
reach_y : constant natural := locations (location_index'val (map.locations (index).index)).height / core.base;
@ -205,9 +215,14 @@ package body world is
for index in 1 .. construction_limit loop
map.constructions (index).index := core.random (0, construction.count - 1);
map.constructions (index).state := 0;
<<repeat_construction_generation>>
map.constructions (index).x := core.random (6, map.width - 6);
map.constructions (index).y := core.random (6, map.height - 6);
--
if map.clips (map.constructions (index).x, map.constructions (index).y) then
goto repeat_construction_generation;
end if;
--
declare reach_x : constant natural := construction.sprite (construction.enumeration'val (map.constructions (index).index)).width / core.base;
reach_y : constant natural := construction.sprite (construction.enumeration'val (map.constructions (index).index)).height / core.base;
begin
@ -222,16 +237,26 @@ package body world is
for index in 1 .. equipment_limit loop
map.equipments (index).index := core.random (0, equipment.count - 1);
map.equipments (index).state := 0;
<<repeat_equipment_generation>>
map.equipments (index).x := core.random (0, map.width - 1);
map.equipments (index).y := core.random (0, map.height - 1);
--
if map.clips (map.equipments (index).x, map.equipments (index).y) then
goto repeat_equipment_generation;
end if;
end loop;
--
for index in 1 .. unit_limit loop
map.units (index).index := core.random (0, unit.count - 1);
map.units (index).state := 0;
<<repeat_unit_generation>>
map.units (index).x := core.random (0, map.width - 1);
map.units (index).y := core.random (0, map.height - 1);
--
if map.clips (map.units (index).x, map.units (index).y) then
goto repeat_unit_generation;
end if;
--
map.clips (map.units (index).x, map.units (index).y) := true;
end loop;
--