CHDIR ".\programs\samples\pete\booger"

REM
REM
REM             REALiTY Software
REM
REM         BOOGER and the Martians
REM
REM
REM             Coded By M.Ware
REM
REM
REM SWFX & GIF Routines used (Thanks dudes !!)
REM
REM   All other coding by REALiTY Software
REM
REM
REM
REM This is the 1st game from REALiTY Software
REM soon to be one of many ,i already have another BOOGER
REM game in the pipeline and have began work on it
REM hopefully it wont be too long coming.
REM
REM BOOGER and the Martians was written in QB4.5 on a 133Mhz
REM Pentium but should run on anything Pentium even 486 im not
REM sure about 386's etc maybe you could EMAIL me about how
REM it works on another machine ?
REM
REM Anyone out there who knows how to program music ,mail me please
REM i havent dabbled in it yet but someone who knows can save a
REM lot of time !.
REM
REM Hope you enjoy the GAME sorry there are not many REMARKS but hey
REM thats one of the joys of programming !.
REM
REM Best of luck ..........................
REM
REM P.S Maybe someone would like to join forces and make a really
REM     really really good game ???
REM
REM EMail me on : Matthew.Ware@virgin.net
REM
REM As Booger would say L8rs DUDES !!!







REM     -Set Up Those Variables-

DEFINT A-Z
RANDOMIZE TIMER

DIM SHARED c$(8) 'FM register information for 9 channels
c$(0) = "&hB0&h20&h23&h40&h43&h60&h63&h80&h83&hA0&HBD&HC0&HE0&HE3&hB0"
c$(1) = "&hB1&h21&h24&h41&h44&h61&h64&h81&h84&hA1&HBD&HC1&HE1&HE4&hB1"
c$(2) = "&hB2&h22&h25&h42&h45&h62&h65&h82&h85&hA2&HBD&HC2&HE2&HE5&hB2"
c$(3) = "&hB3&h28&h2B&h48&h4B&h68&h6B&h88&h8B&hA3&HBD&HC3&HE8&HEB&hB3"
c$(4) = "&hB4&h29&h2C&h49&h4C&h69&h6C&h89&h8C&hA4&HBD&HC4&HE9&HEC&hB4"
c$(5) = "&hB5&h2A&h2D&h4A&h4D&h6A&h6D&h8A&h8D&hA5&HBD&HC5&HEA&HED&hB5"
c$(6) = "&hB6&h30&h33&h50&h53&h70&h73&h90&h93&hA6&HBD&HC6&HF0&HF3&hB6"
c$(7) = "&hB7&h31&h34&h51&h54&h71&h74&h91&h94&hA7&HBD&HC7&HF1&HF4&hB7"
c$(8) = "&hB8&h32&h35&h52&h55&h72&h75&h92&h95&hA8&HBD&HC8&HF2&HF5&hB8"
DIM sfx$(25)
OPEN ".\data\noise.set" FOR INPUT AS #1
FOR fxnum% = 0 TO 25
    INPUT #1, sfx$(fxnum%)
NEXT
CLOSE #1


DIM Prefix(4095), Suffix(4095), OutStack(4095), shiftout%(8)
DIM Ybase AS LONG, powersof2(11) AS LONG, WorkCode AS LONG

graphics = 39
DIM grid(10, 10)
DIM sprite(74, 40)
DIM spriteback(74, 40)
DIM spritemask(74, 40)
DIM default(74): frame = 0

DIM greenback(74)
DIM greenmask(74)
DIM greensprite(74)
aliens = 50
DIM alienx!(aliens): DIM alieny!(aliens)
DIM alienmove(aliens): DIM aliengrap(aliens)
DIM alienspeed!(aliens)
DIM floor(8)
DIM scroller(1000)
DIM comment$(10)
DIM word$(32)


comment$(1) = "Wake up dude!"
comment$(2) = "Are You Asleep Again!"
comment$(3) = "Were sposed to save the world!"
comment$(4) = "I need a LEAK !!"
comment$(5) = "G E T  A  M O V E  O N"
comment$(6) = "I'm the one in danger !!!!"
comment$(7) = "Stop thinking and play !"
comment$(8) = "The Bikes Overheating !!!"
comment$(9) = "PHHURRRP oops ,sorry!"
comment$(10) = "Fffarrt ,slipped out!"
word$(1) = "Easy Street Dude !!!"
leveltoo = 1
sndon = 1
size = 74
level = 1
SCREEN 13: CLS: GOSUB grabsprites




REM         -Main Prog Starts Here !!!-

mainstart:
jpdet = 9
look1 = 0
lives = 3

SCREEN 13: CLS

GOSUB titlescreen

CLS

restart:

CLS
GOSUB loadlevel ' Gets level data from disc

PALETTE: CLS



REM                   -Draw Level Contents-

FOR ground = 200 TO 40 STEP -50
    FOR layer = 1 TO 8
        LINE (1, ground - layer)-(319, ground - layer), floor(9 - layer)
    NEXT layer
NEXT ground
moving! = 0: movingy! = 0
counter = 0: movgot = 0: movgot1 = 3

FOR howmany = 1 TO 50
    IF alienx!(howmany) <> 0 AND alienmove(howmany) = 0 THEN PUT (alienx!(howmany), alieny!(howmany)), sprite(size, aliengrap(howmany)), PSET
NEXT howmany




REM     -Okey Here Goes the main Routine !!!(HELP)-

gx! = 4: gy! = 32: anim = 0: jump = 0
   
GET (gx!, gy!)-(gx! + 10, gy! + 10), greenback()
REM snd = 19: GOSUB snd


mainloop:

counter = counter + 1: IF counter = 50 THEN counter = 0

WAIT &H3DA, 8

PUT (gx!, gy!), greenback(), PSET
gx! = gx! + moving!
gy! = gy! + movingy!
   
IF POINT(gx! + 10, gy! + 10 + movingy!) = 0 AND POINT(gx!, gy! + 10 + movingy!) = 0 THEN movingy! = movingy! + .125
IF POINT(gx! + 9, gy! + 9 + movingy!) = land AND POINT(gx!, gy! + 9 + movingy!) = land THEN movingy! = 0: jump = 0
IF POINT(gx! - 3, gy! + 4) = land THEN jpdet = 9: GOSUB missit
   
IF passd <> 0 THEN GOTO missit

IF POINT(gx! - 3, gy! + 4) <> 0 OR POINT(gx! - movgot1, gy! + 9) <> 0 THEN GOSUB dead
IF POINT(gx! + 11, gy! + 4) <> 0 OR POINT(gx! + movgot, gy! + jpdet) <> 0 THEN GOSUB dead
IF POINT(gx! + 4, gy! + 9) <> 0 THEN GOSUB dead

missit:
   
IF POINT(gx! + 5, gy! - 2) <> 0 THEN a$ = "DEFAULT": GOSUB dead
IF gx! > 305 AND gy! > 162 THEN GOTO leveldone
IF gx! > 305 THEN gx! = 4: gy! = gy! + 50
GET (gx!, gy!)-(gx! + 10, gy! + 10), greenback()
PUT (gx!, gy!), greenmask(), AND
PUT (gx!, gy!), sprite(size, anim), OR

IF counter > 25 THEN frame = 1 ELSE frame = 0

GOSUB alienmove


a$ = INKEY$
a$ = LCASE$(a$)
IF a$ = "x" AND moving! < 2 THEN moving! = moving! + .5
IF a$ = "z" AND moving! > 0 THEN moving! = moving! - .25
IF a$ = " " AND jump <> 1 THEN jump = 1: jpdet = 4: movingy! = -1.8
   
IF a$ = "q" THEN END
IF a$ = "s" THEN sndon = sndon + 1: IF sndon > 1 THEN sndon = 0

IF moving! <> 0 THEN IF anim1 = INT(5 / moving!) THEN anim = anim + 1: IF anim > 1 THEN anim = 0
IF moving! <> 0 THEN movgot1 = -3: movgot = 0: look1 = 0: anim1 = anim1 + 1: IF anim1 > INT(5 / moving!) THEN anim1 = 0: snd = 5: GOSUB snd
IF jump = 1 THEN jpdet = 4: anim = 11
IF jump = 0 THEN jpdet = 9
IF moving! = 0 AND look1 = 0 THEN anim = 0: look1 = 1
IF moving! = 0 AND jump = 1 THEN anim = 0
IF moving! = 0 THEN tick = tick + 1: IF tick = 35 THEN tick = 0: snd = 5: GOSUB snd
IF moving! = 0 AND look = 950 THEN anim = 10: snd = 7: GOSUB snd: COLOR 15: t$ = comment$(INT(RND(1) * 9) + 1): v = 1: GOSUB centre
IF moving! = 0 THEN movgot1 = 4: movgot = 12
IF look = 1290 THEN look1 = 0: anim = 0: v = 1: t$ = "                               ": look = 0: GOSUB centre
look = look + 1: IF look = 1300 THEN look = 0


GOTO mainloop


REM     -Routine for alien movement-

alienmove:
  
FOR howmany = 1 TO 50

    GET (0, 0)-(10, 9), default()

    IF alienmove(howmany) = 0 THEN GOTO skip

    PUT (alienx!(howmany), alieny!(howmany)), default(), PSET

    IF alienmove(howmany) = 1 THEN GOTO vert

    IF alienx!(howmany) < 10 OR alienx!(howmany) > 300 THEN alienspeed!(howmany) = -alienspeed!(howmany)
    IF POINT(alienx!(howmany) - 2, alieny!(howmany) + 4) <> 0 OR POINT(alienx!(howmany) + 12, alieny!(howmany) + 4) <> 0 THEN alienspeed!(howmany) = -alienspeed!(howmany): GOTO turned

    IF POINT(alienx!(howmany) - 2, alieny!(howmany) + 9) <> 0 OR POINT(alienx!(howmany) + 12, alieny!(howmany) + 9) <> 0 THEN alienspeed!(howmany) = -alienspeed!(howmany)

    turned:

    alienx!(howmany) = alienx!(howmany) + alienspeed!(howmany)
    GOTO placealien

    vert:

    alieny!(howmany) = alieny!(howmany) - alienspeed!(howmany)
    IF POINT(alienx!(howmany) + 4, alieny!(howmany) - 1) <> 0 OR POINT(alienx!(howmany) + 4, alieny!(howmany) + 10) <> 0 THEN alienspeed!(howmany) = -alienspeed!(howmany)

    placealien:

    PUT (alienx!(howmany), alieny!(howmany)), spritemask(size, aliengrap(howmany)), AND
    PUT (alienx!(howmany), alieny!(howmany)), sprite(size, aliengrap(howmany) + frame), OR


    skip:
NEXT howmany
RETURN





dead:

PUT (gx!, gy!), sprite(size, 21)
snd = 4
GOSUB snd
GOSUB delay
GOSUB delay
   
IF lives = 0 THEN GOSUB completedead
   
pic$ = ".\data\crashed1.bgr"
IF lives > 1 THEN pic$ = ".\data\crashed.bgr"
   
GOSUB picture
GOSUB keypress
lives = lives - 1: IF lives > -1 THEN GOTO restart

completedead:


pic$ = ".\data\totalled.bgr"
GOSUB picture
GOSUB keypress

GOTO mainstart


gamecomplete:

CLS
pic$ = ".\data\COMPLETE.bgr"
GOSUB picture
GOSUB keypress
level = 1
GOSUB mainstart



titlescreen:

pic$ = ".\data\title.bgr": GOSUB picture
GOSUB delay
pic$ = ".\data\title1.bgr": GOSUB picture
snd = 24
GOSUB snd
GOSUB keypress
pic$ = ".\data\title2.bgr": GOSUB picture
GOSUB keypress
pic$ = ".\data\title3.bgr": GOSUB picture
GOSUB keypress
pic$ = ".\data\title4.bgr": GOSUB picture
snd = 25: GOSUB snd


x$ = "    Right ,now dude ,this is the idea ,i've got this plan !!! .....     Firstly il'e get the Harley out of the garage ,won't go anywhere quick "
x$ = x$ + "on a pair of legs !! ,then what ,well lets get to the mothership i thinks and sort the main geezer out ,that bit you can leave to me but i need"
x$ = x$ + " your elp getting there !,basically we start at the top and the idea is to get to the bottom and onto the next street but just in case we meet"
x$ = x$ + " any Alien dudes i guess we ortta dodge em if poss i don't want to total my bike !, and we don't know what else to expect ,so only one way to find out"
x$ = x$ + " and thats to GO FOR IT !!! , OK,OK just in case i thinks the Harley will be alright for a couple of smashes ,maybe 4 i think ,but best none eh ,just hope"
x$ = x$ + " it's enuff to get us through the 30 streets !! ,and also finally"
x$ = x$ + " THE DUDE (almighty) said that the 'S' key will turn the sound on and off and 'Q' during the game will Quit and most finally if you want to get into the game"
x$ = x$ + " quick and the delays between screens and when we crash etc are toooo looonnnggg just hit the SPACEBAR !!  L8rs Dude !                  "

scroll = LEN(x$)

DO

    COLOR 37: v = 23: t$ = word$(level): GOSUB centre

    FOR r = 1 TO scroll

        COLOR 9: LOCATE 19, 37: PRINT MID$(x$, r, 1)
        IF MID$(x$, r, 1) <> " " THEN snd = 18: GOSUB snd

        FOR left = 1 TO 8


            GET (80, 144)-(300, 152), scroller()
            PUT (79, 144), scroller(), PSET
            WAIT &H3DA, 8

            a$ = INKEY$
            a$ = LCASE$(a$)

            IF a$ = "x" AND word$(level + 1) <> "" THEN level = level + 1: v = 23: t$ = "                                     ": GOSUB centre
            IF a$ = "z" AND level > 1 THEN level = level - 1: v = 23: t$ = "                                      ": GOSUB centre

            IF a$ = "z" OR a$ = "x" THEN v = 23: t$ = word$(level): GOSUB centre
            IF a$ = " " THEN GOTO doit
            IF a$ = "q" THEN END


        NEXT left
    NEXT r
LOOP

doit:
snd = 25
GOSUB snd
PALETTE
RETURN


leveldone:

pic$ = ".\data\doneit.bgr": GOSUB picture
GOSUB delay
GOSUB delay
level = level + 1
GOTO restart

keypress:
a$ = INKEY$
IF a$ = " " THEN RETURN
GOTO keypress
   
delay:
    
FOR r = 1 TO 300
    FOR rr = 1 TO 20000
    NEXT rr
NEXT r
RETURN

centre:

place = INT(40 - LEN(t$)) / 2
place = place
LOCATE v, place: PRINT t$
RETURN




REM     -Sound Routine (Thanks DUDE!)

snd:

IF sndon = 0 THEN RETURN
sfxnum% = snd
chan% = VAL(MID$(sfx$(sfxnum%), 61, 4))
FOR in = 1 TO 60 STEP 4
    reg$ = MID$(c$(chan%), in, 4): reg% = VAL(reg$)
    dat$ = MID$(sfx$(sfxnum%), in, 4): dat% = VAL(dat$)
    OUT &H388, reg%: FOR d% = 1 TO 6: b% = INP(&H388): NEXT
    OUT &H389, dat%: FOR d% = 1 TO 35: b% = INP(&H388): NEXT
NEXT

RETURN






REM     -Level Loader-

loadlevel:


IF level = 31 THEN GOSUB gamecomplete
pic$ = ".\data\loading.bgr": GOSUB picture

GOSUB delay

lev$ = STR$(level) + ".lev": lev$ = RIGHT$(lev$, LEN(lev$) - 1)
OPEN ".\levels\" + lev$ FOR INPUT AS #1
INPUT #1, levelname$
t$ = levelname$: word$(level) = t$: v = 5: COLOR 155: GOSUB centre
GOSUB delay: GOSUB delay

FOR r = 1 TO aliens
    INPUT #1, alienx!(r)
    INPUT #1, alieny!(r)
    INPUT #1, alienmove(r)
    INPUT #1, aliengrap(r)
    INPUT #1, alienspeed!(r)
    IF alienmove(r) = 1 THEN alieny!(r) = alieny!(r) - 2
    IF alienmove(r) <> 1 THEN alieny!(r) = alieny!(r) - 1
    aliengrap(r) = aliengrap(r) - 1
NEXT r
FOR r = 1 TO 8
    INPUT #1, floor(r)
NEXT r
CLOSE #1
land = floor(1)

RETURN

REM     -Routine to load and grab all sprite/mask etc data-

grabsprites:
FOR howmany = 1 TO graphics
    fa$ = STR$(howmany) + ".spr"
    fb$ = RIGHT$(fa$, LEN(fa$) - 1)
    f$ = ".\data\" + fb$
    OPEN f$ FOR INPUT AS #1
    FOR x = 1 TO 10
        FOR Y = 1 TO 10
            INPUT #1, grid(x, Y): PSET (x, Y), grid(x, Y)
        NEXT Y
    NEXT x
    CLOSE #1
    GET (1, 1)-(10, 10), sprite(size, spriteno)
    IF howmany = 1 THEN GET (1, 1)-(10, 10), greensprite()
    FOR x = 1 TO 10
        FOR Y = 1 TO 10
            IF POINT(x, Y) = 0 THEN PSET (x, Y), 255
        NEXT Y
    NEXT x
    GET (1, 1)-(10, 10), spritemask(size, spriteno)
    IF howmany = 1 THEN GET (1, 1)-(10, 10), greenmask()
    spriteno = spriteno + 1
NEXT howmany
CLS
RETURN

REM     -Routine to load pics (Thanks DUDE !)

picture:

FOR a% = 0 TO 7: shiftout%(8 - a%) = 2 ^ a%: NEXT a%
FOR a% = 0 TO 11: powersof2(a%) = 2 ^ a%: NEXT a%
OPEN pic$ FOR BINARY AS #1
pic$ = "      ": GET #1, , pic$
GET #1, , TotalX: GET #1, , TotalY: GOSUB GetByte
NumColors = 2 ^ ((a% AND 7) + 1): nopalette = (a% AND 128) = 0
GOSUB GetByte: Background = a%
GOSUB GetByte: IF a% <> 0 THEN PRINT "Bad screen descriptor.": END
IF nopalette = 0 THEN p$ = SPACE$(NumColors * 3): GET #1, , p$
DO
    GOSUB GetByte
    IF a% = 44 THEN
        EXIT DO
    ELSEIF a% <> 33 THEN
        PRINT "Unknown extension type.": END
    END IF
    GOSUB GetByte
    DO: GOSUB GetByte: pic$ = SPACE$(a%): GET #1, , pic$: LOOP UNTIL a% = 0
LOOP
GET #1, , XStart: GET #1, , YStart: GET #1, , XLength: GET #1, , YLength
XEnd = XStart + XLength: YEnd = YStart + YLength: GOSUB GetByte
IF a% AND 128 THEN PRINT "Can't handle local colormaps.": END
Interlaced = a% AND 64: PassNumber = 0: PassStep = 8
GOSUB GetByte
ClearCode = 2 ^ a%
EOSCode = ClearCode + 1
FirstCode = ClearCode + 2: NextCode = FirstCode
StartCodeSize = a% + 1: CodeSize = StartCodeSize
StartMaxCode = 2 ^ (a% + 1) - 1: MaxCode = StartMaxCode

BitsIn = 0: BlockSize = 0: BlockPointer = 1
x% = XStart: Y% = YStart: Ybase = Y% * 320&

SCREEN 13: DEF SEG = &HA000
IF nopalette = 0 THEN
    OUT &H3C7, 0: OUT &H3C8, 0
    FOR a% = 1 TO NumColors * 3: OUT &H3C9, ASC(MID$(p$, a%, 1)) \ 4: NEXT a%
END IF
LINE (0, 0)-(319, 199), Background, BF
DO
    GOSUB GetCode
    IF Code <> EOSCode THEN
        IF Code = ClearCode THEN
            NextCode = FirstCode
            CodeSize = StartCodeSize
            MaxCode = StartMaxCode
            GOSUB GetCode
            CurCode = Code: LastCode = Code: LastPixel = Code
            IF x% < 320 THEN POKE x% + Ybase, LastPixel
            x% = x% + 1: IF x% = XEnd THEN GOSUB NextScanLine
        ELSE
            CurCode = Code: StackPointer = 0
            IF Code > NextCode THEN EXIT DO
            IF Code = NextCode THEN
                CurCode = LastCode
                OutStack(StackPointer) = LastPixel
                StackPointer = StackPointer + 1
            END IF

            DO WHILE CurCode >= FirstCode
                OutStack(StackPointer) = Suffix(CurCode)
                StackPointer = StackPointer + 1
                CurCode = Prefix(CurCode)
            LOOP

            LastPixel = CurCode
            IF x% < 320 THEN POKE x% + Ybase, LastPixel
            x% = x% + 1: IF x% = XEnd THEN GOSUB NextScanLine

            FOR a% = StackPointer - 1 TO 0 STEP -1
                IF x% < 320 THEN POKE x% + Ybase, OutStack(a%)
                x% = x% + 1: IF x% = XEnd THEN GOSUB NextScanLine
            NEXT a%

            IF NextCode < 4096 THEN
                Prefix(NextCode) = LastCode
                Suffix(NextCode) = LastPixel
                NextCode = NextCode + 1
                IF NextCode > MaxCode AND CodeSize < 12 THEN
                    CodeSize = CodeSize + 1
                    MaxCode = MaxCode * 2 + 1
                END IF
            END IF
            LastCode = Code
        END IF
    END IF
LOOP UNTIL doneflag OR Code = EOSCode



CLOSE #1
doneflag = 0
RETURN


GetByte: pic$ = " ": GET #1, , pic$: a% = ASC(pic$): RETURN

NextScanLine:
IF Interlaced THEN
    Y% = Y% + PassStep
    IF Y% >= YEnd THEN
        PassNumber = PassNumber + 1
        SELECT CASE PassNumber
            CASE 1: Y% = 4: PassStep = 8
            CASE 2: Y% = 2: PassStep = 4
            CASE 3: Y% = 1: PassStep = 2
        END SELECT
    END IF
ELSE
    Y% = Y% + 1
END IF
x% = XStart: Ybase = Y% * 320&: doneflag = Y% > 199
RETURN
GetCode:
IF BitsIn = 0 THEN GOSUB ReadBufferedByte: LastChar = a%: BitsIn = 8
WorkCode = LastChar \ shiftout%(BitsIn)
DO WHILE CodeSize > BitsIn
    GOSUB ReadBufferedByte: LastChar = a%
    WorkCode = WorkCode OR LastChar * powersof2(BitsIn)
    BitsIn = BitsIn + 8
LOOP
BitsIn = BitsIn - CodeSize
Code = WorkCode AND MaxCode
RETURN
ReadBufferedByte:
IF BlockPointer > BlockSize THEN
    GOSUB GetByte: BlockSize = a%
    pic$ = SPACE$(BlockSize): GET #1, , pic$
    BlockPointer = 1
END IF
a% = ASC(MID$(pic$, BlockPointer, 1)): BlockPointer = BlockPointer + 1
RETURN


REM         - I Guess this is the end (FOR NOW!)



SUB playsfx (sfx$)

chan = VAL(MID$(sfx$, 61, 4))
FOR in = 1 TO 60 STEP 4
    reg$ = MID$(c$(chan), in, 4): reg = VAL(reg$)
    dat$ = MID$(sfx$, in, 4): dat = VAL(dat$)
    OUT &H388, reg: FOR i1 = 1 TO 6: p = INP(&H388): NEXT
    OUT &H389, dat: FOR i1 = 1 TO 35: p = INP(&H388): NEXT
NEXT

END SUB

