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.