123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- ; FOODHIT.S
- ;
- ; THIS ROUTINE HAS TWO NESTED LOOPS-- ONE FOR ALL THE FLYING FOODS, AND
- ; ONE FOR THE 5 CHARACTERS.
- GLBL FOODHIT
- GLBL MKSPLAT
- GLBL ERASEIT
- GLBL TUNIN
- GLBL STATHIT,STATDIE,FALLING,YCENTER
- GLBL NUMFOOD,FLYING,CREATOR,DYCHAR,DXCHAR,CDIR
- GLBL HEROKILL,CPALW,CARRYING,HELDFOOD,LEAVING
- GLBL CSPEED,CFRAME,NUMCHHIT,CHSTAMP,BLOCK2,NUMFALL,ADDSCORE
- GLBL LASTCHEF,CACOUNT,SPLAT,SPLATCH,SPLATPW,CSTAMP
- GLBL ANGLE
- GLBL NUMSTUCK,NUMINAIR
- GLBL STICKING,CTYPE,PIEFLY,PIEFLYPW
- GLBL REJOYING
- GLBL FCENTERY,DYFCHAR,STUKXPOS,STUKYPOS
- FCHKCTR EQU 2
- FCHFCTR EQU 0
- FCHEFDX EQU $04
- FCHUCKDX EQU $03
- FOODSTRT EQU $0F
- FOODDEC EQU $0E one less than FOODSTRT
- DXFOOD EQU $02
- DYFOOD EQU $03
- RAMDEF ; ZERO PAGE
- RSEG CODE1
- FOODHIT LDX #0
- LDA STATUS
- CMP #STATHIT only test chuck if STATHIT
- BEQ FHLOOP1
- LDX #$0C else test everyone
- FHLOOP1 LDA CSTATE,X
- CMP #REJOYING test if he's rejoicing !
- BEQ FHSKIP1
- CMP #FALLING ; IF FALLING OR RISING,
- BMI FHSKIP1
- FHNXTJMP JMP FHNXTCH ; DON'T TEST FOR INTERSECTION.
- FHSKIP1 LDA CYPOS,X ; IF ZERO, HE'S NOT VISIBLE
- ; BNE FHSKIP11
- BEQ FHNXTJMP ; GO ON TO NEXT CHARACTER
- FHSKIP11 SEC
- SBC FCENTERY,X ; CHARACTERS ARE TALLER- NORMALIZE
- STA TEMP0 ; USE AS TESTED Y COORDINATE
- AAF1 LDY #FCHKCTR
- TXA
- BEQ NOTCHEF1
- LDY #FCHFCTR
- NOTCHEF1 STY TEMP1
- LDA CXPOS,X
- CLC
- ADC TEMP1 center for chef or chuck
- STA TEMP1 tested x coordinate
- AAF2 LDY #FCHUCKDX use a different DX for chefs
- TXA
- BEQ NOTCHEF
- LDY #FCHEFDX it's a chef-- gets killed easier
- NOTCHEF STY TEMP2
- LDY #NUMFOOD+FOODDEC ; START AT LAST HOLE AND DECREMENT
- ; THE LAST INDEX IS ONE LESS
- FHLOOP2 LDA CYPOS,Y ; IF NO FOOD IS HERE, DON'T TEST IT
- ; BNE FHSKIP4
- BEQ FHFDJMP ; IF NOT VISIBLE, Y == 0
- ; a jump
- FHSKIP4 LDA CSTATE,Y ; SEE IF IT'S FLYING
- CMP #FLYING
- BEQ FHSKIP5
- CMP #ANGLE
- BEQ FHSKIP6 ; DON'T USE "CREATOR"
- FHFDJMP JMP FHNXTFD ; IF IT'S NOT FLYING, SKIP IT
- FHSKIP5 TXA ; GET CHARACTER INTO A
- CMP CREATOR,Y ; SEE IF HE'S THE THROWER
- ; BNE FHSKIP6
- BEQ FHFDJMP ; IF SO, SKIP THIS FOOD
- ; a jump
- FHSKIP6 LDA CYPOS,Y ; GET FOOD'S Y
- SEC
- SBC TEMP0 ; SUBTRACT CHAR'S Y
- BPL ZFHYPOS ; Y DIFF IS POSITIVE
- EOR #$FF ; ELSE, DO TWO'S COMPLEMENT
- CLC
- ADC #1
- ; AT THIS POINT, ACC CONTAINS THE ABSOLUTE VALUE OF X DIFFERENCE.
- ZFHYPOS CMP DYFCHAR,X
- ; BMI ZFHXTST ; Y IS NEAR-- CHECK X
- BPL FHFDJMP ; ELSE, GO TO NEXT FOOD
- ; a jump
- ZFHXTST LDA CXPOS,Y
- SEC
- SBC TEMP1 ; CHARACTER X
- BPL ZFHXPOS ; X DIFF IS POSITIVE
- EOR #$FF ; ELSE, DO TWO'S COMPLEMENT
- CLC
- ADC #1
- ZFHXPOS CMP TEMP2 DX for character + food
- ; BMI FDKILL
- BPL FHFDJMP a jump
- ; If this is a chef, make the food splat. If it's chuck, just make the
- ; food stick to him, and update the flying food variables.
- FDKILL STX TEMPX
- LDA STATUS ; IF IT'S HITTING HERO, MAKE IT
- CMP #STATHIT ; SURROUND CHUCK.
- BNE FDKILL01 not hitting-- don't adjust food
- LDA #6 the splat sound (even though it
- JSR TUNIN doesn't splat)
- DEC NUMINAIR update counters for food
- INC NUMSTUCK
- LDA #STICKING ; HITTING THE HERO-- MAKE IT STICK
- STA CSTATE,Y
- LDA CTYPE,Y
- CMP #2 ; PIES
- BNE ZENDSP12 ; ANY OTHER FOOD
- LDX CDIR,Y ; IF PIE, BASE ON DIRECTION
- LDA PIEFLY,X
- STA CSTAMP,Y
- LDA PIEFLYPW,X
- STA CPALW,Y
- LDX TEMPX
- ZENDSP12 LDA CXPOS,X
- CLC
- ADC STUKXPOS-15,Y ; FIRST FOOD IS AT 15
- STA CXPOS,Y
- LDA CYPOS,X
- CLC
- ADC STUKYPOS-15,Y
- STA CYPOS,Y
- FDKILL01 TXA ; CHARACTER INDEX
- BNE FCHKILL
- ; IF CHARLIE, DO IT TO HIM
- ; ELSE, KILL THE CHEF
- FHKILL LDA #STICKING state for sitting on top of hero
- STA CSTATE,Y keep the same stamp and position
- LDA STATUS
- CMP #STATDIE
- BMI FHKILL1
- RTS
- FHKILL1 JMP HEROKILL same as a JSR followed by RTS
- FCHKILL LDA CPALW,Y
- AND #$E0 ; GET JUST THE PALETTE
- STA TEMP0
- LDA CPALW,X
- AND #$1F
- ORA TEMP0
- STA CPALW,X
- LDA CPALW+1,X
- AND #$1F
- ORA TEMP0
- STA CPALW+1,X
- LDA CPALW+2,X
- AND #$1F
- ORA TEMP0
- STA CPALW+2,X
- STX TEMPX
- JSR MKSPLAT make the food splat on the chef
- LDX TEMPX
- LDA CSTATE,X ; SEE IF HE'S CARRYING
- CMP #CARRYING
- BNE FCH0010
- JSR ERASEIT erase carried food
- FCH0010 LDA CDIR,Y
- STA CDIR,X
- LDA #LEAVING
- STA CSTATE,X
- LDA #0
- STA CFRAME,X
- STA CSPEED,X
- LDA #2 ; ANIMATION COUNTER
- STA CFRAME+1,X
- LDA CREATOR,Y ; CREATOR OF THE FOOD
- BNE FHSKIPSC
- ; IF THE HERO, GIVE POINTS
- ; ELSE, DON'T
- FHGIVESC INC NUMCHHIT ; ONE MORE CHEF HIT
- STX TEMPX ; SAVE INDEX
- LDX #10
- LDA NUMCHHIT ; 100 X NUMBER HIT
- CMP #11 ; IF GREATER THAN 10, USE 10
- BPL ZFH013
- TAX
- ZFH013 JSR ADDSCORE
- LDX TEMPX ; RESTORE CHEF INDEX
- FHSKIPSC INC NUMFALL ; IF IT'S 4, ALL CHEFS HAVE FALLEN
- LDA NUMFALL
- CMP #4
- BNE ZFH020
- ZFH010 STX TEMPX ; SAVE CURRENT CHEF INDEX
- LDX LASTCHEF ; LOAD LAST CHEF TO HAVE FALLEN
- LDA #0
- STA CACOUNT,X ; SET COUNTER TO 0 SO IT RISES
- STA CACOUNT+1,X
- LDX TEMPX ; RESTORE CURRENT CHEF INDEX
- ZFH020 STX LASTCHEF ; IN CASE ALL HAVE FALLEN AT ONCE
- JMP FHNXTCH go right to the next chef
- ; since this chef is dead
- ; END OF THE TWO LOOPS:
- FHNXTFD DEY ; TEST FOR END OF FOOD LOOOP
- CPY #FOODSTRT
- BMI FHSKIP3
- JMP FHLOOP2 ; IF POSITIVE, MORE FOOD
- ; ELSE GO ON TO NEXT CHARACTER
- FHSKIP3
- FHNXTCH DEX
- DEX
- DEX
- BMI FHSKIP2
- JMP FHLOOP1
- FHSKIP2
- FHBYE RTS
- ; THIS ROUTINE IS ALSO CALLED FROM "MOVE" WHEN A FOOD HITS THE WALL
- ; REGISTERX GETS TRASHED
- MKSPLAT LDA #SPLAT
- STA CSTATE,Y
- LDA #2
- STA CACOUNT,Y
- LDA #4
- STA CFRAME,Y ; 5 FRAMES OF ANIMATION
- TAX
- LDA SPLATCH,X
- STA CSTAMP,Y
- LDA CPALW,Y
- AND #$E0 ; TOP THREE BITS ARE PALETTE
- ORA SPLATPW,X
- STA CPALW,Y
- LDA #BLOCK2
- STA CHSTAMP,Y
- LDA #6 ; THE SPLAT SOUND
- JMP TUNIN same as JSR followed by RTS
- ; This routine also called from HOLEHIT-- "MKREJOY" to erase foods of
- ; rejoicing chefs
- ERASEIT STY TEMPY ; SAVE INDEX REGISTER
- LDY HELDFOOD,X ; ERASE FOOD
- LDA #0
- STA CYPOS,Y ; STORE 0 INTO FOOD'S YPOS
- LDY TEMPY
- RTS
- END
|