gh/creature_m.pas

134 lines
2.9 KiB
ObjectPascal
Raw Normal View History

2026-01-10 07:09:22 +00:00
unit creature_m;
interface
uses sun_fields_m, snake_fields_m, drop_fields_m;
type
creatureType = (creatureHamster, creatureGhost, creatureSun,
creatureSnake, creatureDrop);
creaturePtr = ^creature;
creature = record
curX, curY, dX, dY, moveSpeed, animation: integer;
alive: boolean;
t: creatureType;
sunf: sunStatePtr;
snakef: snakeStatePtr;
dropf: dropStatePtr;
end;
creatureItemPtr = ^creatureItem;
creatureItem = record
cr: creaturePtr;
next: creatureItemPtr
end;
creatureList = record
len: integer;
first, last: creatureItemPtr;
end;
function RandomLR(l, r: integer): integer;
procedure AppendCreature(var lst: creatureList; c: creaturePtr);
procedure DisposeCreatureList(var lst: creatureList);
procedure KillCreature(var cr: creature);
procedure InitCreatureList(var lst: creatureList);
procedure StopCreature(var cr: creature);
procedure UpdateEnemyStates(var lst: creatureList);
implementation
uses arena_graphics_m, arena_m, math_m, ascii_arts_m, sun_m, snake_m, drop_m;
function RandomLR(l, r: integer): integer;
begin
RandomLR := l + Random(r - l + 1)
end;
procedure AppendCreature(var lst: creatureList; c: creaturePtr);
var
item: creatureItemPtr;
begin
new(item);
item^.cr := c;
item^.next := nil;
if lst.first = nil then
lst.first := item
else
lst.last^.next := item;
lst.last := item
end;
procedure DisposeCreatureList(var lst: creatureList);
var
tmp: creatureItemPtr;
begin
while lst.first <> nil do
begin
tmp := lst.first;
lst.first := lst.first^.next;
if lst.first = nil then
lst.last := nil;
if tmp^.cr^.t = creatureSun then
dispose(tmp^.cr^.sunf)
else
if tmp^.cr^.t = creatureSnake then
dispose(tmp^.cr^.snakef)
else
if tmp^.cr^.t = creatureDrop then
dispose(tmp^.cr^.dropF);
dispose(tmp^.cr);
dispose(tmp);
lst.len := lst.len - 1
end
end;
procedure KillCreature(var cr: creature);
begin
cr.alive := false
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
end;
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;
end.