From c59d915f669c76dfd86bf0e2f643eabc079e50b4 Mon Sep 17 00:00:00 2001 From: xolatile Date: Sun, 26 May 2024 14:56:32 -0400 Subject: [PATCH] Refactored lake generation and collision-restricted generation... --- source/world.adb | 71 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 23 deletions(-) diff --git a/source/world.adb b/source/world.adb index 0b5905a..10caacf 100644 --- a/source/world.adb +++ b/source/world.adb @@ -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; + <> 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; + <> 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; + <> 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; + <> 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; + <> 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; --