summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrexim <reximkut@gmail.com>2024-03-17 01:59:06 +0700
committerrexim <reximkut@gmail.com>2024-03-17 01:59:06 +0700
commitee5d0dae7738e0cb480465ae0ecd6e15fd8ed118 (patch)
treea1691e76f2ebe6b2e9da91afacd532f8398c500f
parent074c3b9d787aacd13ba87fd49b01537fb99bbac0 (diff)
Optimize path finding, remove custom queue.
-rw-r--r--game.adb12
-rw-r--r--queue.adb43
-rw-r--r--queue.ads18
3 files changed, 4 insertions, 69 deletions
diff --git a/game.adb b/game.adb
index 7dbe7f0..3d2f625 100644
--- a/game.adb
+++ b/game.adb
@@ -12,7 +12,6 @@ use Ada.Containers;
with Ada.Strings.Fixed; use Ada.Strings.Fixed;
with Ada.Strings;
with Ada.Exceptions; use Ada.Exceptions;
-with Queue;
procedure Game is
DEVELOPMENT : constant Boolean := True;
@@ -267,9 +266,6 @@ procedure Game is
Items: Hashed_Map_Items.Map;
end record;
- package IVector2_Queue is new Queue(Item => IVector2);
- use IVector2_Queue;
-
type Game_State is record
Map: Map_Access := Null;
Player: Player_State;
@@ -287,7 +283,6 @@ procedure Game is
Checkpoint: Checkpoint_State;
- Q: IVector2_Queue.Queue;
Duration_Of_Last_Turn: Double;
end record;
@@ -411,10 +406,11 @@ procedure Game is
if not Boss_Can_Stand_Here(Game, New_Position, Me) then
exit;
end if;
- if Game.Bosses(Me).Path(New_Position.Y, New_Position.X) < 0 then
- Game.Bosses(Me).Path(New_Position.Y, New_Position.X) := Game.Bosses(Me).Path(Position.Y, Position.X) + 1;
- Q.Append(New_Position);
+ if Game.Bosses(Me).Path(New_Position.Y, New_Position.X) >= 0 then
+ exit;
end if;
+ Game.Bosses(Me).Path(New_Position.Y, New_Position.X) := Game.Bosses(Me).Path(Position.Y, Position.X) + 1;
+ Q.Append(New_Position);
Step(Dir, New_Position);
end loop;
end;
diff --git a/queue.adb b/queue.adb
deleted file mode 100644
index 4745ee8..0000000
--- a/queue.adb
+++ /dev/null
@@ -1,43 +0,0 @@
-with Ada.Unchecked_Deallocation;
-
-package body Queue is
- procedure Delete_Items_Array is new Ada.Unchecked_Deallocation(Items_Array, Items_Array_Access);
-
- procedure Grow(Q: in out Queue) is
- New_Items: constant Items_Array_Access := new Items_Array(0..Q.Items'Length*2-1);
- begin
- for Offset in Q.Items'Range loop
- New_Items(Offset) := Q.Items((Q.Start + Offset) mod Q.Items'Length);
- end loop;
- Delete_Items_Array(Q.Items);
- Q.Items := New_Items;
- Q.Start := 0;
- end;
-
- procedure Enqueue(Q: in out Queue; X: Item) is
- begin
- if Q.Items = null then
- Q.Items := new Items_Array(0..INIT_CAPACITY-1);
- end if;
-
- if Q.Count >= Q.Items'Length then
- Grow(Q);
- end if;
-
- Q.Items((Q.Start + Q.Count) mod Q.Items'Length) := X;
- Q.Count := Q.Count + 1;
- end;
-
- function Dequeue(Q: in out Queue; X: out Item) return Boolean is
- begin
- if Q.Count <= 0 then
- return False;
- end if;
-
- X := Q.Items(Q.Start);
- Q.Start := (Q.Start + 1) mod Q.Items'Length;
- Q.Count := Q.Count - 1;
-
- return True;
- end;
-end Queue;
diff --git a/queue.ads b/queue.ads
deleted file mode 100644
index fdfa484..0000000
--- a/queue.ads
+++ /dev/null
@@ -1,18 +0,0 @@
-generic
- type Item is private;
-package Queue is
- INIT_CAPACITY: constant Integer := 256;
-
- type Items_Array is array (Natural range <>) of Item;
- type Items_Array_Access is access Items_Array;
-
- type Queue is record
- Items: Items_Array_Access := null;
- Start: Integer := 0;
- Count: Integer := 0;
- end record;
-
- procedure Grow(Q: in out Queue);
- procedure Enqueue(Q: in out Queue; X: Item);
- function Dequeue(Q: in out Queue; X: out Item) return Boolean;
-end Queue;