134 lines
2.9 KiB
ObjectPascal
134 lines
2.9 KiB
ObjectPascal
|
|
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.
|