123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398 |
- ******************************************************************************
- **** CENTIPEDE MOTION
- **** SMD 7/15/83
- ******************************************************************************
- MOVCENTI LDA NUMSEG
- BEQ SEEYA ;IF NO LIVE SEGMENTS
- CMP #1
- BNE SKPSPDUP ;IF NOT TIME TO SPEED UP LAST HEAD
- LDA DIFLEVEL ;DON'T SPEED UP LAST HEAD IN NOVICE GM
- BEQ SKPSPDUP
- LDA #0
- STA SPDCTRL ;SPEED UP LAST HEAD
- SKPSPDUP LDA SHTRTIMR
- BNE SEEYA ;IF THE SHOOTER IS DEAD
- LDA DELAYSEG
- BEQ NOSEGDLY ;IF NO DELAY OCCURS BEFORE MOTION
- DEC DELAYSEG ;DECREMENT THE DELAY COUNTER
- BNE ZDELAY
- LDA #7 ;TURN ON FEET SOUND
- JSR TUNIN
- ZDELAY RTS
- NOSEGDLY LDX #0
- DOCENT LDA OBJSTAT,X
- BMI SEGALIVE ;IF SEGMENT ALIVE
- LDA #0
- STA GTEMP2
- SEGSKIP INX
- CPX MAXSGCNT
- BNE DOCENT ;IF MORE SEGMENTS LEFT
- SEEYA RTS ;IT'S BEEN FUN, BUT WE'RE DONE
- SEGALIVE LDA OBJOFFST,X
- CMP #L(EXPLOS)
- BCS SEGSKIP
- JSR SHTRCOLL ;DID THIS SEGMENT HIT SHOOTER?
- LDA SHTRTIMR
- BNE SEEYA ;YES, SHOOTER DEAD
- LDA OBJSTAT,X
- AND #$10
- BNE FASTSEG ;IF THIS IS A FAST MOVING SEGMENT
- LDA FRMCNT
- AND SPDCTRL ;SPDCTRL = 0 IF ONLY ONE SEGMENT LEFT
- BNE SEGSKIP ;IF NOT TIME TO MOVE A SLOW SEGMENT
- FASTSEG LDA OBJSTAT,X
- AND #$20
- BNE SKPHMP1 ;IF SEGMENT IS NOT A HEAD
- JMP NOTHEAD
- SKPHMP1 LDA #0
- STA GTEMP2 ;RESET TURN FLAG FROM PREVIOUS CHAIN
- LDA OBJSTAT,X
- AND #$03
- BEQ SGNTTURN
- JMP SEGTURN ;IF HEAD IS IN THE PROCESS OF TURNING
- SGNTTURN LDA OBJSTAT,X
- AND #$40
- BEQ SGNTPOIS ;IF HEAD IS NOT POISONED
- MAKETURN LDA OBJSTAT,X
- ORA #$03
- STA OBJSTAT,X ;PUT HEAD IN STAGE 3 OF TURNING
- JMP SEGTURN3 ;ALWAYS
- SGNTPOIS LDA OBJOFFST,X ;CHECK DIRECTION OF HEAD
- AND #$04
- BNE HDNGLEFT ;IF HEAD IS HEADING LEFT
- LDA OBJX,X
- CMP CENTRGHT ;135 IN GAME PLAY, 134 IN TITLE
- BCC NOSGEDGE ;IF OBJECT ISN'T ABOUT TO HIT RT. EDGE
- SGATEDGE LDA OBJY,X
- CMP #184
- BNE MAKETURN ;IF HEAD ISN'T ON BOTTOM ROW
- LDA OBJSTAT,X
- AND #$08
- BEQ SKPBNCE2
- BOUNC LDA OBJSTAT,X
- EOR #$08
- STA OBJSTAT,X
- LDA OBJOFFST,X
- EOR #$04
- STA OBJOFFST,X
- JMP XMOVESEG
- SKPBNCE2 TXA
- TAY
- INY
- CPY MAXSGCNT
- BEQ MAKETURN ;IF HEAD HAS NO BODY
- LDA OBJSTAT,Y
- BPL MAKETURN ;" " " " "
- AND #$20
- BNE MAKETURN ;" " " " "
- NXTSGBCK INY
- CPY MAXSGCNT
- BEQ SGBOUNCE ;IF LAST LINK
- LDA OBJSTAT,Y
- BPL SGBOUNCE ;IF END OF LAST CHAIN
- AND #$20
- BEQ NXTSGBCK ;IF SEGMENT IS NOT A HEAD
- SGBOUNCE DEY
- LDA OBJY,Y
- CMP #184
- BNE MAKETURN ;IF TAIL IS NOT ON THE BOTTOM ROW
- LDA OBJSTAT,Y
- EOR #$28
- STA OBJSTAT,Y ;CONVERT IT TO A HEAD
- LDA OBJOFFST,Y
- EOR #$34
- STA OBJOFFST,Y ;REVERSE HIS DIRECTION, TOO
- BNE MAKETURN ;ALWAYS
- HDNGLEFT LDA OBJX,X
- CMP CENTLEFT ;18 IN GAME PLAY, 19 IN TITLE PAGE
- BCC SGATEDGE ;IF HEAD IS ABOUT TO HIT LEFT EDGE
- ; SEC
- SBC #7
- NOSGEDGE CLC
- ADC #5
- STA GTEMP1
- LDA OBJY,X
- BEQ MAKETRN1
- JSR COBSTAC ;LOOK FOR COLLISION WITH A CHARACTER
- BEQ NODETECT ;IF NO COLLISION WAS FOUND
- MDETCT AND #$FC ;CHECK FOR COLLISION W/POISONED MUSH
- CMP #$4C
- BNE MAKETRN1 ;IF NOT A POISONED SHROOM COLLISION
- LDA OBJSTAT,X
- ORA #$E7 ;CHANGE HEAD TO A POISONED ONE
- STA OBJSTAT,X
- ; LDA OBJOFFST,X ;different graphics for poison heads
- ; ORA #$10 ; no longer exists
- ; STA OBJOFFST,X
- BNE SEGTURN3 ;ALWAYS
- NODETECT JSR OVRLAP ;LOOK FOR COLLISION WITH OTHER OBJECTS
- BCC SEGANIM ;IF NO COLLISION WAS DETECTED
- MAKETRN1 LDA OBJSTAT,X
- AND #$08
- BNE JMPBOUNC
- JMP MAKETURN ;ALWAYS
- JMPBOUNC LDA OBJOFFST,X ;BUMP IT OVER TWO PIXELS ON BOTTOM ROW
- AND #$04
- BEQ JMPBOUNL
- INC OBJX,X
- INC OBJX,X
- JMP BOUNC
- JMPBOUNL DEC OBJX,X
- DEC OBJX,X
- JMP BOUNC
- NOTHEAD LDA OBJSTAT,X
- AND #$03
- BNE SEGTURN ;IF SEGMENT IS CURRENTLY TURNING
- LDA GTEMP2 ;CHECK TURN FLAG FOR CHAIN
- BEQ SEGANIM ;IF NO TURN SHOULD COMMENCE
- LDA #0
- STA GTEMP2 ;RESET TURN FLAG
- LDA OBJSTAT,X
- ORA #$03
- STA OBJSTAT,X ;MAKE OBJECT TURN ON NEXT MOTION PASS
- SEGANIM LDA FRMCNT ;CHANGE CENTIPEDE ANIMATION
- AND #$03
- BNE XMOVESEG ;IF NOT RIGHT FRAME TO CHANGE ANIM.
- LDA OBJOFFST,X
- AND #$03
- BNE NOANMRST
- LDA OBJOFFST,X
- ORA #$03
- STA OBJOFFST,X ;RESET ANIMATION SEQUENCE
- BNE XMOVESEG ;ALWAYS
- NOANMRST DEC OBJOFFST,X ;NEXT ANIMATION IN SEQUENCE
- XMOVESEG LDA OBJOFFST,X ;MODIFY X POSITION OF CENTIPEDE
- AND #$04
- BNE SEGLEFT ;IF SEGMENT IS GOING LEFT
- INC OBJX,X ;MOVE RIGHT ONE PIXEL
- JMP SEGSKIP ;ALWAYS
- SEGLEFT DEC OBJX,X ;MOVE LEFT ONE PIXEL
- JMP SEGSKIP ;ALWAYS
- SEGTURN CMP #3
- BNE SEGTURN2 ;IF NOT IN STAGE 3 OF TURNING
- SEGTURN3 LDA OBJSTAT,X ;GET UP/DOWN BIT FROM STATUS
- AND #$04
- LSR A
- STA GTEMP1 ;SAVE IT FOR JUST A MOMENT
- LDA OBJOFFST,X ;CHANGE OFFSET TO APPROPRIATE STAMP
- ORA #$0B
- AND #$FD
- ORA GTEMP1
- STATCHNG DEC OBJSTAT,X ;CHANGE TO NEXT TURNING STATE
- YMOVESEG STA OBJOFFST,X ;MODIFY CENTIPEDE'S Y POSITION
- YMOVE2 AND #$02
- BEQ SEGUP ;IF SEGMENT IS MOVING UP
- LDA OBJY,X
- CLC
- ADC #2
- STA OBJY,X ;MOVE SEGMENT DOWN TWO PIXELS
- BNE XMOVESEG ;ALWAYS
- SEGUP LDA OBJY,X
- SEC
- SBC #2
- STA OBJY,X ;MOVE OBJECT UP TWO PIXELS
- BNE XMOVESEG ;ALWAYS
- SEGTURN2 CMP #2
- BNE SEGTURN1 ;IF NOT IN STATE 2 OF TURNING
- LDA OBJOFFST,X
- AND #$FE ;CHANGE STAMP TO VERTICAL CENTIPEDE
- BNE STATCHNG ;ALWAYS
- SEGTURN1 LDA OBJOFFST,X
- AND #$01
- BNE FINALTRN ;IF ON LAST STAGE OF TURN
- LDA OBJOFFST,X
- EOR #$05 ;CHANGE STAMP
- BNE YMOVESEG ;ALWAYS
- FINALTRN LDY OBJY,X
- LDA ATTRACT
- BPL SKPATTR2 ;IF NOT IN ATTRACT MODE
- CPY #YBTMATTR+6
- BNE SKPATTR2
- STA GTEMP2
- LDA #0
- STA OBJSTAT,X
- DEC NUMSEG
- JMP SEGSKIP
- SKPATTR2 LDA OBJSTAT,X
- AND #$04
- BNE DWNWRDSG ;IF SEGMENT IS TRAVELLING DOWN
- CPY #146
- BEQ CHNGUPDN ;CHANGE VERTICAL DIRECTION
- BNE NOREVRSE ;ALWAYS
- DWNWRDSG CPY #182
- BNE NOREVRSE ;IF NOT ON BOTTOM ROW
- LDA OBJSTAT,X
- CMP #$C0
- BCC STRTNEWD ;IF NOT POISONED
- EOR #$41 ;UNPOISON, MAKE VERT. DIR. = UP, AND
- STA OBJSTAT,X ;INITIALIZE START OF TURN
- LDA OBJOFFST,X
- AND #$E6
- STA GTEMP2 ;TURN FLAG FOR NEXT SEGMENT IN CHAIN
- BNE STATCHNG ;ALWAYS
- STRTNEWD AND #$20
- BEQ CHNGUPDN ;IF OBJECT ON BOTTOM ISN'T A HEAD
- STA NEWHDFLG
- CHNGUPDN LDA OBJSTAT,X
- EOR #$04 ;CHANGE UP/DOWN BIT
- STA OBJSTAT,X
- NOREVRSE LDY #1 ;NON-ZERO VALUE FOR TURN FLAG
- SKIPFLAG LDA GTEMP2 ;TURN FLAG FOR NEXT SEGEMENT IN CHAIN
- BEQ NOQUIKTN ;IF NO TURN IS TO BE DONE IMMEDIATELY
- LDA OBJSTAT,X ;CHANGE STATUS TO 'SEGMENT ABOUT TO
- CLC ;TURN' (AFTER IT IS DECREMENTED)
- ADC #3
- STA OBJSTAT,X
- NOQUIKTN STY GTEMP2
- LDA OBJOFFST-1,X
- AND #$03
- STA GTEMP6
- LDA OBJOFFST,X
- TAY
- AND #$F4
- ORA GTEMP6
- STA OBJOFFST,X
- DEC OBJSTAT,X
- TYA
- JMP YMOVE2 ;ALWAYS
- ********* OBJECT COLLISION DETECTION TO BE BUILT ON THIS SITE
- OVRLAP NOP
- LDY #$FF
- LDA OBJOFFST,X
- AND #$04
- OVRLAP2 BNE STYGTMP3
- INY
- STYGTMP3 STY GTEMP3
- STX GTEMP4
- LDY #13
- OVRLOOP CPY #12
- BEQ OFFROW
- LDA OBJY,Y ;IN SAME ROW?
- CMP OBJY,X
- BNE OFFROW
- LDA OBJSTAT,Y ;LIVE OBJECT?
- BPL OFFROW
- LDA OBJOFFST,Y
- CMP #L(EXPLOS)
- BCS OFFROW
- CPY GTEMP4 ;COMPARING WITH SELF?
- BEQ OFFROW
- LDA OBJX,X ;IN SAME COLUMN (ONLY LOOKING AHEAD)?
- SEC
- SBC OBJX,Y
- EOR GTEMP3
- CMP #$FA
- BCS FNDOVRLP
- OFFROW DEY
- BPL OVRLOOP
- NOVRLAP CLC
- RTS
- FNDOVRLP CPX #12 ;DID WE TEST FOR SPIDER OVERLAPPING
- BCS FOUNDOUT ; WITH CENTIPEDE? JMP IF YES
- CPY GTEMP4 ;IS Y < X? (IF SO, DIFFERENT CHAINS,
- BCC FOUNDOUT ; SINCE X IS A HEAD)
- SAMECHN LDA OBJSTAT,Y ;ANY HEADS BETWEENS X AND Y?
- AND #$20
- BNE FOUNDOUT ;IF SO, DIFFERENT CHAINS
- DEY
- CPY GTEMP4
- BNE SAMECHN
- BEQ NOVRLAP ;IF NOT, SAME CHAIN, NO OVERLAP
- FOUNDOUT SEC
- RTS
- ****************************************************************************
- ********* NEWHD -- ADD NEW HEADS
- ****************************************************************************
- NEWHD LDA ATTRACT
- BMI AUREVOIR ;FRENCH FOR GOODBYE
- LDA NEWHDFLG
- BEQ AUREVOIR ;IF NEW HEADS SHOULDN'T COME OUT YET
- LDA SHTRTIMR
- BNE AUREVOIR ;IF SHOOTER IS EXPLODING
- LDA NHDTIMER
- BEQ LAUNCHED
- DEC NHDTIMER
- AUREVOIR RTS
- LAUNCHED LDY PLAYER
- LDA GAMETYPE
- CMP #1
- BEQ ZGMTPMV1
- LDY #0
- ZGMTPMV1 LDX MAXSGCNT
- NEXTGUY DEX
- BMI AUREVOIR
- LDA OBJSTAT,X
- BPL CANDIDAT ;FOUND A CANDIDATE TO MAKE A NEW HEAD
- BMI NEXTGUY ;ALWAYS
- CANDIDAT LDA DIFLEVEL
- BNE NHDFAST
- LDA #$A4 ;ALL NEW HEADS GO SLOW IN NOVICE GAME
- BNE NHDSPD
- NHDFAST LDA #$B4
- NHDSPD STA OBJSTAT,X ;OBJECT STATUS OF NEW HEAD
- LDA #$63
- STA OBJOFFST,X ;OBJECT OFFSET
- LDA #136
- STA OBJY,X ;YPOS OF OBJECT
- LDA #12
- STA OBJX,X ;XPOS
- LDA NHDCOUNT,Y
- CMP #$60 ;SHORTEST TIME (EXCEPT FROM SCORE)
- BCC ZSKIPDC1
- ;;;;; SEC
- SBC #4
- STA NHDCOUNT,Y
- LDA DIFLEVEL
- BEQ ZSKIPDC1
- LDA NHDCOUNT,Y
- SEC ;SUBTRACT 8 FROM TIME IF STANDARD
- SBC #4 ; DIFFICULTY GAME
- STA NHDCOUNT,Y
- ZSKIPDC1 LDA NHDCOUNT,Y
- STA NHDTIMER
- JSR RANDOM
- BMI ZNHDRGT ;IF THE NEW HEAD SHOULD MOVE RIGHT
- LDA #140
- STA OBJX,X
- LDA #$67
- STA OBJOFFST,X
- ZNHDRGT INC NUMSEG ;ONE MORE OF THESE CRITTERS NOW
- RTS
|