SCREEN _NEWIMAGE(600, 420, 8)
_FULLSCREEN
RANDOMIZE TIMER


bc = 15: nc = 2: tc = 1 ' background, number, text colors

wx = 400: wy = 400 ' world size

' 1=X, 2=Y, 3=destX, 4=destY, 5=#, 6=sex, 7=age, 8=hunger, 9=thirst, etc.

INPUT nsp
INPUT rc

' species, #, stats

DIM cr(nsp, 1000, 10), cn$(nsp), cc(nsp), tnc(nsp)

CLS

sa = 5 ' AI scan area size
lfs = 100
ngo = 100

' create critters

FOR sp = 1 TO nsp

    cn$(sp) = STR$(sp): cc(sp) = sp + 2

    tnc(sp) = rc ' INT(RND * rc) + 2

    FOR cn = 1 TO tnc(sp)

        20

        rx = INT(RND * (wx - 20)) + 10
        ry = INT(RND * (wy - 20)) + 10

        FOR ps = 1 TO nsp
            FOR lc = 1 TO cn
                IF cr(ps, lc, 1) = rx AND cr(ps, lc, 2) = ry THEN 20
            NEXT
        NEXT

        cr(sp, cn, 5) = cn
        cr(sp, cn, 1) = rx: cr(sp, cn, 2) = ry
        cr(sp, cn, 3) = rx: cr(sp, cn, 4) = ry

        PSET (cr(sp, cn, 1), cr(sp, cn, 2)), cc(sp)

    NEXT

NEXT

sp = 1: cn = 0

time = TIMER

' main

LINE (0, 0)-(599, 419), bc, B
LINE (400, 0)-(400, 419), bc

100

cycles = cycles + 1

LOCATE 2, 52: COLOR tc: PRINT "Cycles:";: COLOR nc: PRINT cycles
LOCATE 3, 52: COLOR tc: PRINT "Per Second:";: COLOR nc: PRINT INT(cycles / INT(TIMER - time))

FOR d = 1 TO nsp

    LOCATE 4 + d, 52: COLOR cc(d): PRINT cn$(d);: COLOR nc: PRINT tnc(d)

NEXT

IF sp > nsp THEN sp = 1

110

k$ = INKEY$

IF k$ = "r" THEN RUN

IF k$ = CHR$(27) THEN END

' critter actions

cn = cn + 1

IF cn > tnc(sp) THEN cn = 0: sp = sp + 1: GOTO 100

cx = cr(sp, cn, 1): cy = cr(sp, cn, 2) ' current critter current loc

' look around

rng = INT(RND * 100)

IF rng = 0 THEN cr(sp, cn, 10) = 0: GOTO 40

FOR sa1 = cx - sa TO cx + sa
    FOR sa2 = cy - sa TO cy + sa

        dc = POINT(sa1, sa2)

        IF dc = cc(sp) AND cx <> sa1 AND cy <> s2 THEN ' look for same critter
            rng = INT(RND * lfs)
            IF rng = 0 THEN cr(sp, cn, 3) = sa1: cr(sp, cn, 4) = sa2: cr(sp, cn, 10) = 1
        END IF

    NEXT
NEXT

40

' give rnd dest if nothing going on

rng = INT(RND * ngo)

IF cr(sp, cn, 10) = 0 AND rng = 0 THEN

    cr(sp, cn, 10) = 1
    cr(sp, cn, 3) = INT(RND * (wx - 2)) + 1
    cr(sp, cn, 4) = INT(RND * (wy - 2)) + 1

END IF

' move critter

IF cx < cr(sp, cn, 3) AND POINT(cr(sp, cn, 1) + 1, cr(sp, cn, 2)) = 0 THEN cr(sp, cn, 1) = cr(sp, cn, 1) + 1
IF cx > cr(sp, cn, 3) AND POINT(cr(sp, cn, 1) - 1, cr(sp, cn, 2)) = 0 THEN cr(sp, cn, 1) = cr(sp, cn, 1) - 1
IF cy < cr(sp, cn, 4) AND POINT(cr(sp, cn, 1), cr(sp, cn, 2) + 1) = 0 THEN cr(sp, cn, 2) = cr(sp, cn, 2) + 1
IF cy > cr(sp, cn, 4) AND POINT(cr(sp, cn, 1), cr(sp, cn, 2) - 1) = 0 THEN cr(sp, cn, 2) = cr(sp, cn, 2) - 1

IF cx = cr(sp, cn, 3) AND cy = cr(sp, cn, 4) THEN cr(sp, cn, 10) = 0

'draw critter

PSET (cx, cy), 0
PSET (cr(sp, cn, 1), cr(sp, cn, 2)), cc(sp)

IF cn <= tnc(sp) THEN 110
cn = 0

IF sp <= nsp THEN 100
sp = 0


GOTO 100
