unit creature_m; interface type creatureType = (creatureHamster, creatureGhost, creatureSun, creatureSnake, creatureDrop); creaturePtr = ^creature; creature = record curX, curY, dX, dY, moveSpeed, animation: integer; symbol: char; alive: boolean; t: creatureType; 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 MakeStep(var cr: creature); procedure InitCreatureList(var lst: creatureList); procedure StopCreature(var cr: creature); implementation uses arena_graphics_m, arena_m, math_m, ascii_arts_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; DrawFieldCell(cr.curX, cr.curY, CaptureSymbol) end; procedure MakeStep(var cr: creature); begin cr.curX := Clamp(cr.curX + cr.dX, 1, ArenaW); cr.curY := Clamp(cr.curY + cr.dY, 1, ArenaH) 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; end.