gh-scrum/src/creature_m.pas

127 lines
2.7 KiB
ObjectPascal

unit creature_m;
interface
type
creatureType = (creatureHamster, creatureGhost, creatureSun,
creatureSnake, creatureDrop);
creaturePtr = ^creature;
creature = record
curX, curY, dX, dY, moveSpeed, animation: integer;
alive: boolean;
t: creatureType;
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}
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;
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.