gh-scrum/src/creature_m.pas

127 lines
2.7 KiB
ObjectPascal
Raw Normal View History

2026-02-28 10:57:08 +00:00
unit creature_m;
interface
type
2026-02-28 16:22:15 +00:00
creatureType = (creatureHamster, creatureGhost, creatureSun,
creatureSnake, creatureDrop);
creaturePtr = ^creature;
2026-02-28 10:57:08 +00:00
creature = record
2026-02-28 17:20:24 +00:00
curX, curY, dX, dY, moveSpeed, animation: integer;
2026-02-28 16:22:15 +00:00
alive: boolean;
t: creatureType;
2026-02-28 17:35:07 +00:00
rageMode: boolean; {for sun }
bigStep: boolean; {for sun }
beforeTransform: integer; {for sun and drop }
diagonalMove: boolean; {for snake and drop}
beforeReverse: integer; {for snake and drop}
2026-02-28 16:22:15 +00:00
end;
creatureItemPtr = ^creatureItem;
creatureItem = record
cr: creaturePtr;
next: creatureItemPtr
end;
creatureList = record
len: integer;
first, last: creatureItemPtr;
2026-02-28 10:57:08 +00:00
end;
2026-02-28 16:22:15 +00:00
function RandomLR(l, r: integer): integer;
procedure AppendCreature(var lst: creatureList; c: creaturePtr);
procedure DisposeCreatureList(var lst: creatureList);
2026-02-28 11:14:58 +00:00
procedure KillCreature(var cr: creature);
2026-02-28 16:22:15 +00:00
procedure InitCreatureList(var lst: creatureList);
procedure StopCreature(var cr: creature);
2026-02-28 17:32:14 +00:00
procedure UpdateEnemyStates(var lst: creatureList);
2026-02-28 10:57:08 +00:00
implementation
2026-02-28 17:32:14 +00:00
uses arena_graphics_m, arena_m, math_m, ascii_arts_m, sun_m, snake_m, drop_m;
2026-02-28 10:57:08 +00:00
2026-02-28 16:22:15 +00:00
function RandomLR(l, r: integer): integer;
2026-02-28 10:57:08 +00:00
begin
2026-02-28 16:22:15 +00:00
RandomLR := l + Random(r - l + 1)
2026-02-28 10:57:08 +00:00
end;
2026-02-28 16:22:15 +00:00
procedure AppendCreature(var lst: creatureList; c: creaturePtr);
var
item: creatureItemPtr;
2026-02-28 10:57:08 +00:00
begin
2026-02-28 16:22:15 +00:00
new(item);
item^.cr := c;
item^.next := nil;
if lst.first = nil then
lst.first := item
else
lst.last^.next := item;
lst.last := item
2026-02-28 10:57:08 +00:00
end;
2026-02-28 16:22:15 +00:00
procedure DisposeCreatureList(var lst: creatureList);
var
tmp: creatureItemPtr;
2026-02-28 10:57:08 +00:00
begin
2026-02-28 16:22:15 +00:00
while lst.first <> nil do
begin
tmp := lst.first;
lst.first := lst.first^.next;
if lst.first = nil then
lst.last := nil;
dispose(tmp^.cr);
dispose(tmp);
lst.len := lst.len - 1
end
2026-02-28 10:57:08 +00:00
end;
2026-02-28 11:14:58 +00:00
procedure KillCreature(var cr: creature);
begin
2026-02-28 17:32:14 +00:00
cr.alive := false
2026-02-28 16:22:15 +00:00
end;
procedure InitCreatureList(var lst: creatureList);
begin
lst.len := 0;
lst.first := nil;
lst.last := nil
end;
procedure StopCreature(var cr: creature);
begin
cr.dX := 0;
cr.dY := 0
2026-02-28 11:14:58 +00:00
end;
2026-02-28 17:32:14 +00:00
procedure UpdateEnemyCreatureState(var cr: creature);
begin
case cr.t of
creatureSun:
UpdateSunState(cr);
creatureSnake:
UpdateSnakeState(cr);
creatureDrop:
UpdateDropState(cr)
end
end;
procedure UpdateEnemyStates(var lst: creatureList);
var
tmp: creatureItemPtr;
begin
tmp := lst.first;
while tmp <> nil do
begin
if tmp^.cr^.t <> creatureGhost then
UpdateEnemyCreatureState(tmp^.cr^);
tmp := tmp^.next
end
end;
2026-02-28 10:57:08 +00:00
end.