'===========================================================================
' Subject: BIOSPHERE                          Date: 09-03-97 (22:56)       
'  Author: Paul Maunders                      Code: QB, QBasic, PDS        
'  Origin: Cyberax@hotmail.com              Packet: AI.ABC
'===========================================================================
' Variables:    Name
'               Creature ID
'               MAP Position
'               Head
'               Body
'               Wheels
'               Eyes
'               Distance Travelled
'               Food Eaten
'               Energy Expended
'               Creatures Killed
'               CYBERSEX
'               Children Amount
'               Activity
'               Action
'               Days Alive

hsex = 2 '(2/3)
csex = 2 '(High = More sex)

CLS : RANDOMIZE TIMER
DIM NAME$(100, 2)       'ID, (Name, Carnivore/Herbivore)
DIM Map(80, 20)         '(X,Y)
DIM Creature(100, 4)    'ID, (Head, Body, Wheels, Eyes)
DIM Stats(100, 6)       'ID, (Distance,Food,Energy,Killed,SEX,Children)
DIM Activity(100, 2)    'ID, (Activity,Action)
DIM Days(100, 1)            'ID, (Days Alive)
    TotalDays = 0
DIM Location(100, 2)    'ID, (X,Y)
DIM OldLocation(100, 2)

COLOR 14, 12
LOCATE 1, 1: PRINT SPACE$(80)
LOCATE 1, 34: PRINT "TECHNOSPHERE"
COLOR 15, 0

FOR a = 1 TO 100
x = (INT(RND * 80) + 1)
y = (INT(RND * 20) + 1)
Map(x, y) = a
Location(a, 1) = x
Location(a, 2) = y
NAME$(a, 1) = "nameless"
IF INT(RND * 6) = 0 THEN S$ = "C" ELSE S$ = "H"
NAME$(a, 2) = S$
IF S$ = "H" THEN Stats(a, 2) = 1
NEXT

FOR x = 1 TO 80
FOR y = 1 TO 20
IF Map(x, y) > 0 THEN
        LOCATE y + 2, x
        IF NAME$(Map(x, y), 2) = "H" THEN PRINT "O"
        IF NAME$(Map(x, y), 2) = "C" THEN PRINT "*"
        END IF
NEXT
NEXT

REM Main Loop ************************************************************

DO
TotalDays = TotalDays + 1
FoodCheck = FoodCheck + 1
        ERASE Map
        FOR a = 1 TO 100        'Movement Loop
        IF NAME$(a, 2) = "DEAD" THEN
                LOCATE Location(a, 2), Location(a, 1)
                COLOR 14
                PRINT "#"
                COLOR 15
                GOTO 200
                END IF
        OldLocation(a, 1) = Location(a, 1)
        OldLocation(a, 2) = Location(a, 2)
        IF NAME$(a, 2) <> "C" THEN                              'Sexy Loop (H)
                RANDY = INT(RND * 20)
                IF RANDY < hsex THEN
                FOR b = 1 TO 100
                IF NAME$(b, 2) = "H" THEN EXIT FOR
                NEXT
                IF Location(b, 1) > Location(a, 1) THEN Location(a, 1) = Location(a, 1) + 1
                IF Location(b, 1) < Location(a, 1) THEN Location(a, 1) = Location(a, 1) - 1
                IF Location(b, 2) > Location(a, 2) THEN Location(a, 2) = Location(a, 2) + 1
                IF Location(b, 2) < Location(a, 2) THEN Location(a, 2) = Location(a, 2) - 1
                END IF
                IF RANDY >= hsex THEN
                Location(a, 1) = Location(a, 1) + INT(RND * 3) - 1
                Location(a, 2) = Location(a, 2) + INT(RND * 3) - 1
                END IF
        END IF
        IF NAME$(a, 2) = "C" THEN
                RANDY = INT(RND * 20)
                IF RANDY < csex THEN                       'Sexy Loop (C)
                FOR b = 1 TO 100
                IF NAME$(b, 2) = "C" THEN EXIT FOR
                NEXT
                IF Location(b, 1) > Location(a, 1) THEN Location(a, 1) = Location(a, 1) + 1
                IF Location(b, 1) < Location(a, 1) THEN Location(a, 1) = Location(a, 1) - 1
                IF Location(b, 2) > Location(a, 2) THEN Location(a, 2) = Location(a, 2) + 1
                IF Location(b, 2) < Location(a, 2) THEN Location(a, 2) = Location(a, 2) - 1
                END IF
                IF RANDY >= csex THEN                      'Hungry Loop (C)
                        hunt = INT(RND * 10)
                        IF hunt < 2 THEN
                        FOR b = 1 TO 100
                        IF NAME$(b, 2) = "H" THEN EXIT FOR
                        NEXT
                        IF Location(b, 1) > Location(a, 1) THEN Location(a, 1) = Location(a, 1) + 1
                        IF Location(b, 1) < Location(a, 1) THEN Location(a, 1) = Location(a, 1) - 1
                        IF Location(b, 2) > Location(a, 2) THEN Location(a, 2) = Location(a, 2) + 1
                        IF Location(b, 2) < Location(a, 2) THEN Location(a, 2) = Location(a, 2) - 1
                        END IF
                        IF hunt >= 2 THEN
                        Location(a, 1) = Location(a, 1) + INT(RND * 3) - 1
                        Location(a, 2) = Location(a, 2) + INT(RND * 3) - 1
                        END IF
                END IF
        END IF
        IF Location(a, 1) > 80 THEN Location(a, 1) = 80
        IF Location(a, 2) > 20 THEN Location(a, 2) = 20
        IF Location(a, 1) <= 1 THEN Location(a, 1) = 1
        IF Location(a, 2) <= 1 THEN Location(a, 2) = 1
        x = Location(a, 1)
        y = Location(a, 2)
        IF Map(x, y) <> a AND Map(x, y) <> 0 THEN
                                IF NAME$(Map(x, y), 2) = "H" AND NAME$(a, 2) = "C" THEN
                                NAME$(Map(x, y), 2) = "DEAD"
                                Stats(a, 2) = Stats(a, 2) + 1
                                END IF
                                IF NAME$(Map(x, y), 2) = "C" AND NAME$(a, 2) = "C" THEN
                                        IF Stats(a, 2) > Stats(a, 6) THEN
                                        Stats(a, 6) = Stats(a, 6) + 1
                                        FOR b = 1 TO 100
                                        IF NAME$(b, 2) = "DEAD" THEN NAME$(b, 2) = "C": EXIT FOR
                                        IF NAME$(b, 2) = "" THEN NAME$(b, 2) = "C": EXIT FOR
                                        NEXT
                                        END IF
                                END IF
                                IF NAME$(Map(x, y), 2) = "H" AND NAME$(a, 2) = "H" THEN
                                        IF Stats(a, 2) > Stats(a, 6) THEN
                                        Stats(a, 6) = Stats(a, 6) + 1
                                        FOR b = 1 TO 100
                                        IF NAME$(b, 2) = "DEAD" THEN NAME$(b, 2) = "H": EXIT FOR
                                        IF NAME$(b, 2) = "" THEN NAME$(b, 2) = "H": EXIT FOR
                                        NEXT
                                        END IF
                                END IF
                                IF NAME$(Map(x, y), 2) = "DEAD" AND NAME$(a, 2) = "H" THEN
                                Stats(a, 2) = Stats(a, 2) + 1
                                NAME$(Map(x, y), 2) = ""
                                END IF
                                IF NAME$(Map(x, y), 2) = "DEAD" AND NAME$(a, 2) = "C" THEN
                                Stats(a, 2) = Stats(a, 2) + 1
                                NAME$(Map(x, y), 2) = ""
                                END IF
        END IF
        Map(x, y) = a
        LOCATE OldLocation(a, 2) + 2, OldLocation(a, 1): PRINT " "
        LOCATE y + 2, x
        IF NAME$(a, 2) = "H" THEN COLOR 15: PRINT "O"
        IF NAME$(a, 2) = "C" THEN COLOR 13: PRINT "*"
        IF NAME$(a, 2) = "DEAD" THEN COLOR 14: PRINT "#": COLOR 15
200     NEXT a
C = 0
H = 0
D = 0
F = 0
FOR a = 1 TO 100
IF NAME$(a, 2) = "C" THEN C = C + 1
IF NAME$(a, 2) = "H" THEN H = H + 1
IF NAME$(a, 2) = "DEAD" THEN D = D + 1
IF NAME$(a, 2) = "" THEN F = F + 1
NEXT

IF FoodCheck > 7 THEN
        FoodCheck = 0
        FOR a = 1 TO 100
        IF NAME$(a, 2) = "C" THEN
        IF Stats(a, 6) >= Stats(a, 2) THEN NAME$(a, 2) = "DEAD"
        END IF
        NEXT a
        END IF

COLOR 14, 12
LOCATE 1, 1: PRINT SPACE$(80)
LOCATE 1, 34: PRINT "TECHNOSPHERE"
COLOR 15, 0

LOCATE 23, 1: PRINT "Days"; TotalDays
LOCATE 23, 16: PRINT "C/vore(*) "; C
LOCATE 23, 31: PRINT "H/vore(O) "; H
LOCATE 23, 47: PRINT "Dead(#) "; D
LOCATE 23, 60: PRINT "Free "; F
LOCATE 23, 70: PRINT "Total "; C + H + D + F
       
IF F > 10 THEN
        FOR a = 1 TO 100
        IF NAME$(a, 2) = "" AND F > 0 THEN NAME$(a, 2) = "H": F = F - 1
        NEXT a
END IF

IF D > 10 THEN
        FOR a = 1 TO 100
        IF NAME$(a, 2) = "DEAD" AND D > 0 THEN NAME$(a, 2) = "H": D = D - 1
        NEXT a
END IF


LOOP UNTIL INKEY$ = CHR$(27)


REM **********************************************************************

END
