Curt Vendel Posted June 3, 2004 Share Posted June 3, 2004 ********SMAGIC.S PROCESS POWERS AND TREASURES ZERODEF RSEG CODE6 * GOTTREAS - CALLED WHEN BIRD PICKS UP A TREASURE GOTTREAS STA TEMP4 ;COLSTAT OF TREASURE JSR DELTREAS ;COUNTS ON INDEX BEING IN X LDA #JWTUNE ;CALL TREASURE SOUND JSR TUNIN LDX PLAYER ;PUT TRVAL INDEX IN X BEQ IHAT3 INX IHAT3 LDA PHASE BMI BNSTREAS ;ITS THE BONUS RACK LDA TRVAL1+1,X ;ADD DIRECTLY TO SCORE STA TENS LDA TRVAL1,X STA HUNDS JSR ADDSCORE BIT TRDSPFLG ;THIS FLAG SHIT INSURES THAT INITRSMP BMI NOINITT ;IS CALLED ONLY THE FIRST TIME THAT ;WE LAND ON A TREASURE JSR INITRSMP NOINITT LDA TEMP4 ;GET OBJECT ID SEC SBC #TREASCOL ASL A CLC ADC PLAYER TAY LDA JEWCNT,Y SED CMP #$9 BEQ NOSTOCN ;IF NINE THEN PUNT CLC ADC #1 NOSTOCN CLD STA JEWCNT,Y NOTNOW RTS BNSTREAS LDA TRVAL1+1,X STA TEMP10 ;TENS LDA TRVAL1,X STA TEMP6 ;HUNDS LDA TEMP4 ;COLSTAT OF TREASURE SEC ;GET INDEX INTO TREASURE COUNTERS SBC #TREASCOL ASL A CLC ADC PLAYER TAY LDX JEWCNT,Y SED TVMULT LDA BNSTENS ;ADD TREASURE VALUE TO BONUS POINTS CLC ADC TEMP10 STA BNSTENS LDA BNSHUNDS ADC TEMP6 STA BNSHUNDS LDA BNSHTHS ADC #0 STA BNSHTHS NOCARRY DEX BNE TVMULT ;DO FOR EACH MULTIPLE CLD RTS * THIS CODE IS CALLED WHEN THE BIRD SHOOTS A TREASURE HITTREAS ;COLSTAT OF TREASURE BIT PHASE BMI SAVEME ;IGNORE IF IN BONUS SEC ;ACCUMULATOR HAS COLSTAT OF TREASURE SBC #TREASCOL ;GET INDEX INTO TREASURE COUNTERS ASL A CLC ADC PLAYER TAY LDA #1 STA JEWCNT,Y ;RESET MULTIPLIER ; WE NEED A SOUND FOR THIS SAVEME JMP DELTREAS ;THIS WILL RTS * INITIALIZE THE TREASURE DISPLAY INITRSMP LDX #19 TRMPLP LDA TREASTBL,X STA BOTMSMAP,X DEX BPL TRMPLP LDA #$FF STA TRDSPFLG ; SET FLAG RTS TREASTBL DB L(BLANKCHR),L(V),L(A),L(L),L(U),L(E),L(EQUALS),0,0,0 DB L(BLANKCHR),0,L(JEWCON),L(BLANKCHR),0,L(EGGCON),L(BLANKCHR) DB 0,L(BARCON),L(BLANKCHR) * LDTREAS ZJEWLOC EQU 11 ZEGGLOC EQU 14 ZBARLOC EQU 17 LDTREAS BIT PHASE ;IF IN BONUS PHASE UNCONDITIONALLY LOAD BPL JUSTREAS ;BONUS STATE ;DO BONUS RACK DISPLAY LDA BNSTIMER ;LOAD STATE NOW STA PTR0 ;TEMP LSR A ;FIRST THE TIMER LSR A LSR A LSR A STA TOPMSMAP+6 LDA PTR0 AND #$0F STA TOPMSMAP+7 * LDSCOREB ;LOADS DISPLAY FOR BONUS RACK SCORE LDSCOREB LDX #5 ;SIX DIGITS LDY #2 ;THREE BYTES PEPSIB LDA BNSHTHS,Y ;GET LOW TWO DIGITS OF BONUS SCORE PHA ;SAVE AWAY AND #$0F ;GET BOTTOM NIBBLE ; CLC ;NUMBERS START AT ZERO ; ADC #L(NUMBERS) ;MAY BE UNNECESSARY STA TEMP0,X ;STORE AWAY FOR LATER DEX PLA ;GET BACK LOW BYTE AND GET NEXT DIGIT AND #$F0 LSR A LSR A LSR A LSR A ; CLC ; ADC #L(NUMBERS) STA TEMP0,X DEX DEY BPL PEPSIB ;DO UNTIL ALL 6 DIGITS (3 BYTES) ARE ;LOADED LDA #$69 ;SET OVERFLOW ADC #$69 LDX #0 ;THIS ELIMINATES LEADING ZEROES LDA #L(BLANKCHR) SPRITEB LDY TEMP0,X BVC NOMORE0B BNE NOMORE0B ;NOT ZERO SO PUNT ON BLANKS STA TOPMSMAP+14,X BEQ NEXEXB NOMORE0B TYA STA TOPMSMAP+14,X CLV NEXEXB INX CPX #6 BNE SPRITEB TYA BNE NOSTUF0B LDA #0 ;IF ZERO IS LEAST SIGNIFICANT DIGIT STA TOPMSMAP+19 ;THEN DISPLAY IT NOSTUF0B JUSTREAS BIT TRDSPFLG ;IF THIS IS STILL ZERO THEN WE DON'T BPL RTTS ;HAVE TO LOAD VALUES YET LDX PLAYER LDA JEWCNT,X ;LOAD MULTIPLIERS STA BOTMSMAP+ZJEWLOC LDA BARCNT,X STA BOTMSMAP+ZBARLOC LDA EGGCNT,X STA BOTMSMAP+ZEGGLOC TXA ;LOAD TREASURE VALUE BEQ IHATHIS INX IHATHIS LDA TRVAL1+1,X STA TEMP0 AND #$0F STA BOTMSMAP+9 LDA TEMP0 LSR A LSR A LSR A LSR A STA BOTMSMAP+8 LDA TRVAL1,X AND #$0F STA BOTMSMAP+7 LDA BOTMSMAP+7 ;DO LEADING ZERO SUPPRESSION BNE RTTS LDX #L(BLANKCHR) STX BOTMSMAP+7 RTTS RTS INITBNS LDA #-1 ;INIT OODLES OF BONUS THINGS STA PHASE LDX PLAYER SED LDA XTRBNSTM,X ;EXTRA BONUS TIME CLC ADC #$20 ;MINIMUM BONUS STA BNSTIMER CLD LDA #0 STA XTRBNSTM,X LDA #0 STA BNSTENS STA BNSHUNDS STA BNSHTHS BIT TRDSPFLG BMI LABEL42 JSR INITRSMP ;INCASE IT ISN'T THERE INIT BOTTOM ;TREASURE MAP LABEL42 LDY #19 ;DISPLAY BNLP LDA BNINTBL,Y STA TOPMSMAP,Y DEY BPL BNLP LDA #38 ;CENTER TOP TREASURE MAP STA DLY+9 RTS BNINTBL DB L(BLANKCHR),L(T),L(I),L(M),L(E),L(BLANKCHR),L(BLANKCHR) DB L(BLANKCHR),L(BLANKCHR),L(S),L©,L(O),L®,L(E),L(BLANKCHR) DB L(BLANKCHR),L(BLANKCHR),L(BLANKCHR),L(BLANKCHR),L(BLANKCHR) ENDBONUS LDA BNSTENS STA TENS LDA BNSHUNDS STA HUNDS LDA BNSHTHS STA HUNTHOUS JSR ADDSCORE LDX PLAYER LDA #1 ;RESET MULTIPLIER FOR PLAYER STA JEWCNT,X STA BARCNT,X STA EGGCNT,X TXA ;SET FLAG BY DOING TXA BEQ IHAT4 INX IHAT4 LDA #$50 STA TRVAL1+1,X LDA #0 STA TRVAL1,X RTS * EXTRA BONUS TIME POWER EXTRABNS LDX PLAYER LDA XTRBNSTM,X CMP #$70 ;LIMIT TOTAL BONUS TO 90 SECONDS BEQ GOAWAY SED CLC ADC #$10 ;TEN SECONDS OF EXTRA BONUS STA XTRBNSTM,X CLD GOAWAY RTS * ADDTRVAL UPDATES TREASURE VALUE ADDTRVAL ;ASSUMES VALUE IN A SED LDX PLAYER BEQ IHAT2 INX IHAT2 CLC ADC TRVAL1+1,X STA TRVAL1+1,X LDA #0 ADC TRVAL1,X STA TRVAL1,X CLD RTS ******************************************************************************** * * * * * HIEROS FOR THE MASSES * * * ******************************************************************************** * GOTHIERO ;CALLED WHEN BIRD LANDS ON HIERO GOTHIERO JSR GLOHIERO JSR PLAHIERO ;WILL BE MADE INTO A JUMP LATER WHEN RTS ;DEBUGGING IS COMPLETE * PLAHIERO ;ASSUMES OBJECT ID IS IN TEMP1 PLAHIERO ;DOES GAMEPLAY FOR HIEROS LDA TEMP0 ;FIRST WE STORE AWAY TYPE OF HIERO LDX PLAYER BNE DOPL2 ;CAREFUL! TEMP0 IS STORED IN GLOHIERO LDY PGNUM,X ;WHY DOES SOME CODE INEVITABLY BECOME CPY #3 ;A FUCKING MESS BNE NOTCLR LDY #0 ;ZERO OUT PGS AS WELL AS RESETING PGNUM STY PGS1+1 STY PGS1+2 NOTCLR STA PGS1,Y ;PUT HIERO TYPE IN ARRAY LDA HIROSNDS,Y ;CALL SOUND FOR HIERO JSR TUNIN JMP NEWNOP DOPL2 LDY PGNUM,X CPY #3 ;A FUCKING MESS BNE NOTCLR2 LDY #0 ;ZERO OUT PGS AS WELL AS PGNUM STY PGS2+1 STY PGS2+2 NOTCLR2 STA PGS2,Y NEWNOP INY ;NOW DO A CHECK TO SEE IF ITS POWERTIME STY PGNUM,X ;CAN DO THIS AS PGNUM IS IN ZERO PAGE CPY #3 ;TIME FOR A POWER BNE RTSFHIRO JSR DETPOWER ;DETERMINE WHAT POWER IF ANY IT IS RTSFHIRO RTS HIROSNDS DB NHIERO1,NHIERO2,NHIERO3 * DETPOWER ;CALLED WHEN THREE HIEROS ARE GOTTEN DETPOWER LDX PLAYER LDY PGSOFF,X LDX PGS1,Y ;FIRST HIERO LDA PGHASH1,X LDX PGS1+1,Y ;SECOND HIERO EOR PGHASH2,X LDX PGS1+2,Y ;THIRTD HIERO EOR PGHASH3,X LDX #0 PGCMPLP CMP PGDIV,X BCS GOTIT INX BPL PGCMPLP GOTIT TXA LDA PGIDENT,X ;GET REAL POWER NUMBER LDX PLAYER STA PGPOWER,X LDA #$1F STA ROTATE ;START COLOR ROTATION ;NEED TO PUT IN CODE TO DETERMINE RTS ;IF IMMEDIATE POWER OR NOT PGSOFF DB 0,3 PGHASH1 DB 0,$E9,$23,$A8,$53,$FD,$CE,$9F,$69 PGHASH2 DB 0,$8D,$9A,$C6,$08,$4B,$B3,$1C,$AA PGHASH3 DB 0,$38,$EC,$A1,$7B,$55,$B9,$98,$43 PGDIV DB 249 ;SLOWDOWN DB 235 ;POINTS DB 229 ;KILL EVERYTHING DB 225 ;INVINCIBILITY DB 220 ;POINTS DB 212 ;KILL UWES DB 204 ;AFTERBURNER DB 197 ;POINTS DB 195 ;EXTRA LIFE DB 185 ;AIR FREEZE DB 173 ;POINTS DB 160 ;SUPERSONIC SHOTS DB 154 ;HOVER DB 133 ;POINTS DB 126 ;EXTRA BONUS DB 119 ;RANDOM HIEROS DB 98 ;POINTS DB 96 ;KILL SPHINX DB 91 ;CAN'T HOP DB 87 ;POINTS DB 84 ;CAN'T FLY DB 76 ;KILL MINIS DB 71 ;POINTS DB 58 ;KILL POTS DB 50 ;POINTS DB 46 ;CAN'T SWIM DB 40 ;PARALIZE SPHINX DB 35 ;POINTS DB 31 ;DECOY DB 23 ;AIR BOMB DB 8 ;POINTS DB 0 ;WARP PGIDENT DB 18 ;SLOWDOWN DB 2 ;POINTS DB 20 ;KILL EVERYTHING DB 22 ;INVINCIBILITY DB 2 ;POINTS DB 8 ;KILL UWES DB 17 ;AFTERBURNER DB 2 ;POINTS DB 1 ;EXTRA LIFE DB 10 ;AIR FREEZE DB 2 ;POINTS DB 21 ;SUPERSONIC SHOTS DB 16 ;HOVER DB 2 ;POINTS DB 7 ;EXTRA BONUS DB 19 ;RANDOM HIEROS DB 2 ;POINTS DB 6 ;KILL SPHINX DB 12 ;CAN'T HOP DB 2 ;POINTS DB 14 ;CAN'T FLY DB 4 ;KILL MINIS DB 2 ;POINTS DB 5 ;KILL POTS DB 2 ;POINTS DB 13 ;CAN'T SWIM DB 15 ;PARALIZE SPHINX DB 2 ;POINTS DB 11 ;DECOY DB 3 ;AIR BOMB DB 2 ;POINTS DB 9 ;WARP * GIVPOWER ;CALLED WHEN RIGHT BUTTON IS PUSHED GIVPOWER LDX PLAYER LDA PGPOWER,X ;IF NO POWER THEN PUNT BEQ GIVEXIT TAY ;SET UP POWER ROUTINE THROUGH INDIRECT LDA #POWRUSE ;PLAY TUNE FOR POWER RELEASE JSR TUNIN LDA PWRROUTL,Y ;JUMP STA PTR0 LDA PWRROUTH,Y STA PTR0+1 JSR JMPIND ;GO TO APPROPRIATE POWER ROUTINE LDA #0 LDX PLAYER ;ZERO OUT POWER STA PGPOWER,X LDA PGNUM,X ;IF THREE HIEROS THEN ZERO OUT NUMBER CMP #3 ;OF HIEROS BNE GIVEXIT LDA #0 STA PGNUM,X LDX PLAYER ;ZERO OUT PGS AS WELL BEQ PPONE LDX #3 PPONE STA PGS1,X STA PGS1+1,X STA PGS1+2,X GIVEXIT RTS * JMPIND JMPIND JMP (PTR0) ;GO TO APPROPRIATE POWER ROUTINE JMPRTS RTS PWRROUTL DB L(JMPRTS),L(XLIFE),L(POINTS),L(KAFLEAS),L(KAMINIS),L(KAFIRES) DB L(KILLSPHX),L(EXTRABNS),L(KAUWES),L(DOWARP),L(FRFLEAS) DB L(DODECOY) DB L(NOHOP),L(NOSWIM),L(NOFLY),L(DOPARA),L(DOHOVER),L(DOSPEED) DB L(DOSLOW),L(DOROUL),L(KAOMNI),L(DOQUIK),L(DOINVINC) PWRROUTH DB H(JMPRTS),H(XLIFE),H(POINTS),H(KAFLEAS),H(KAMINIS),H(KAFIRES) DB H(KILLSPHX),H(EXTRABNS),H(KAUWES),H(DOWARP),H(FRFLEAS) DB H(DODECOY) DB H(NOHOP),H(NOSWIM),H(NOFLY),H(DOPARA),H(DOHOVER),H(DOSPEED) DB H(DOSLOW),H(DOROUL),H(KAOMNI),H(DOQUIK),H(DOINVINC) NOTIMP RTS * WARP POWER DOWARP LDA #$FF STA WARP ;SET WARP FLAG RTS * XLIFE ;JUST ADDS LIVES XLIFE INC PL1LIVES,X ;X STILL HAS PLAYER NUMBER RTS * POINTS ;ADDS POINTS BONZO SOUND NEEDED HERE POINTS LDA #$05 STA HUNDS JSR ADDSCORE RTS * DECOY DODECOY JSR CLRPFLGS LDA #30 STA PTIMER JSR RANDOM AND #$7F CLC ADC #1 STA NOHOMING RTS * PARALYSE DOPARA LDA #-1 STA PARASPHX RTS * SHACKLES/CANT HOP NOHOP JSR CLRPFLGS LDA #20 STA PTIMER LDA #-1 STA CANTHOP RTS * POLYWATER/CANT SWIM NOSWIM JSR CLRPFLGS LDA #20 STA PTIMER LDA #-1 STA CANTSWIM RTS * BROKEN WING/CANT FLY NOFLY JSR CLRPFLGS LDA #20 STA PTIMER LDA #-1 STA CANTFLY RTS * HOVER DOHOVER JSR CLRPFLGS LDA #20 STA PTIMER LDA #-1 STA HOVER RTS * SPEEDUP DOSPEED JSR CLRPFLGS LDA #20 STA PTIMER LDA #-1 STA SPEEDUP RTS * SLOWDOWN DOSLOW JSR CLRPFLGS LDA #20 STA PTIMER LDA #-1 STA SLOWDOWN RTS * ROULETTE DOROUL LDX PLAYER LDA #2 STA PGNUM,X LDY PGSOFF,X JSR RANDOM AND #7 CLC ADC #1 STA PGS1,Y JSR RANDOM AND #7 CLC ADC #1 STA PGS1+1,Y LDA #0 STA PGS1+2,Y RTS * OMNICIDE - KILL ALL ENEMIES KAOMNI JSR KAFLEAS JSR KAUWES JSR KAMINIS JSR KAFIRES JMP KILLSPHX * QUICK SHOTS DOQUIK JSR CLRPFLGS LDA #6 STA QUIKSHOT LDA #20 STA PTIMER RTS * INVINCIBILITY DOINVINC JSR CLRPFLGS LDA #20 STA PTIMER LDA #-1 STA INVINCBL LDHEXIT2 RTS * LDHIEROS * LOADS DISPLAY WITH CURRENT HEIROGLYPH STATUS LDHIEROS BIT PHASE BMI LDHEXIT2 ;GO AWAY IF IN BONUS RACK LDA DEATH ;DO NOT LOAD HIERO STATE WHEN IN BEQ NOEXIT ;GAME OVER MODE LDA #$6F STA P1C2SHDB ;ON DEATH MAKE SURE DISPLAY IS STATIC RTS ;BYE BYE. TIME TO BLOW THIS CLAMBAKE NOEXIT LDX PLAYER ;THIS IS REALLY ANOTHER SUBROUTINE BUT LDY PGPOWER,X ;FOR SPEED PURPOSES IS HERE BNE ISPOW ;NO POWER SO PUNT LDY #10 ;THIS HELPS DECOUPLE GAMEPLAY FROM LDA #L(BLANKCHR) ;DISPLAY BELIEVE IT OR NOT POOPLOOP STA TOPMSMAP+8,Y DEY BPL POOPLOOP BMI NOWHI ISPOW LDA LOPOWTXT,Y STA PTR0 LDA HIPOWTXT,Y STA PTR0+1 LDY #10 POWLDLP LDA (PTR0),Y STA TOPMSMAP+8,Y DEY BPL POWLDLP NOWHI LDX PLAYER ;THIS SHIT YOU SEE HERE AND MANY PLACES BEQ ONER ;GETS THE APPROPRIATE PLAYER INDEX INTO LDX #3 ;X ONER LDA PGS1,X ASL A TAY LDA PGTABLE,Y STA TOPMSMAP+1 LDA PGTABLE+1,Y STA TOPMSMAP+2 LDA PGS1+1,X ASL A TAY LDA PGTABLE,Y STA TOPMSMAP+3 LDA PGTABLE+1,Y STA TOPMSMAP+4 LDA PGS1+2,X ASL A TAY LDA PGTABLE,Y STA TOPMSMAP+5 LDA PGTABLE+1,Y STA TOPMSMAP+6 LDA ROTATE ;ROTATE PALETTE FOR TOPMSMAP BEQ LDHEXIT ;UNLESS ZERO THEN PUNT CLC ADC #$0E ;SOMEWHAT CONFUSING BUT ROTATE FINISHES AND #$0F ;AT ZERO BUT WE WANT COLOR TO BE SET TO STA PTR0 ;$XF WHEN IT IS FINISHED LDA #$60 ;THE LAST TIME THIS GOES THROUGH ROTATE ;IS $01 THEREFORE WE ADD $0E TO GET $0F ORA PTR0 ;IT DOESN'T MATTER WHAT ROTATE STARTS STA P1C2SHDB ;AT DEC ROTATE ;DECREMENT ROTATE COUNTER LDHEXIT RTS * TABLES FOR HIERO DISPLAY PGTABLE DB L(BLANKCHR),L(BLANKCHR),L(LCANE),L(LCANE+1),L(LMWS),L(LMWS+1) DB L(LFEATH),L(LFEATH+1) DB L(LEYE),L(LEYE+1),L(LAHNK),L(LAHNK+1),L(LBIRD),L(LBIRD+1) DB L(LSUN),L(LSUN+1),L(LBOWL),L(LBOWL+1) * TABLES FOR POWER TEXT DISPLAY LOPOWTXT DB L(BLNK),L(POWER1),L(POWER2),L(POWER3),L(POWER4),L(POWER5) DB L(POWER6),L(POWER7),L(POWER8),L(POWER9),L(POWER10),L(POWER11) DB L(POWER12),L(POWER13),L(POWER14),L(POWER15),L(POWER16) DB L(POWER17),L(POWER18),L(POWER19),L(POWER20),L(POWER21) DB L(POWER22) HIPOWTXT DB H(BLNK),H(POWER1),H(POWER2),H(POWER3),H(POWER4),H(POWER5) DB H(POWER6),H(POWER7),H(POWER8),H(POWER9),H(POWER10),H(POWER11) DB H(POWER12),H(POWER13),H(POWER14),H(POWER15),H(POWER16) DB H(POWER17),H(POWER18),H(POWER19),H(POWER20),H(POWER21) DB H(POWER22) BLNK DB L(BLANKCHR),L(BLANKCHR),L(BLANKCHR),L(BLANKCHR),L(BLANKCHR) DB L(BLANKCHR),L(BLANKCHR),L(BLANKCHR),L(BLANKCHR),L(BLANKCHR) DB L(BLANKCHR) POWER1 DB L(E),L(X),L(T),L®,L(A),L(BLANKCHR),L(L),L(I),L(F),L(E) DB L(BLANKCHR) POWER2 DB L(BLANKCHR),L(BLANKCHR),L(P),L(O),L(I),L(N),L(T),L(S) DB L(BLANKCHR),L(BLANKCHR),L(BLANKCHR) POWER3 DB L(BLANKCHR),L(A),L(I),L®,L(BLANKCHR),L(B),L(O),L(M),L(B) DB L(BLANKCHR),L(BLANKCHR) POWER4 DB L(BLANKCHR),L(K),L(I),L(L),L(L),L(BLANKCHR),L(M),L(I),L(N) DB L(I),L(S) POWER5 DB L(BLANKCHR),L(K),L(I),L(L),L(L),L(BLANKCHR),(P),L(O),L(T),L(S) DB L(BLANKCHR) POWER6 DB L(K),L(I),L(L),L(L),L(BLANKCHR),L(S),L(P),L(H),L(I),L(N),L(X) POWER7 DB L(E),L(X),L(T),L®,L(A),L(BLANKCHR),L(B),L(O),L(N),L(U),L(S) POWER8 DB L(BLANKCHR),L(K),L(I),L(L),L(L),L(BLANKCHR),L(U),L(W),L(E) DB L(S),L(BLANKCHR) POWER9 DB L(BLANKCHR),L(BLANKCHR),L(BLANKCHR),L(W),L(A),L®,L(P) DB L(BLANKCHR),L(BLANKCHR),L(BLANKCHR),L(BLANKCHR) POWER10 DB L(A),L(I),L®,L(BLANKCHR),L(F),L®,L(E),L(E),L(Z),L(E) DB L(BLANKCHR) POWER11 DB L(BLANKCHR),L(BLANKCHR),L(BLANKCHR),L(D),L(E),L©,L(O),L(Y) DB L(BLANKCHR),L(BLANKCHR),L(BLANKCHR) POWER12 DB L(BLANKCHR),L(S),L(H),L(A),L©,L(K),L(L),L(E),L(S) DB L(BLANKCHR),L(BLANKCHR) POWER13 DB L(BLANKCHR),L(P),L(O),L(L),L(Y),L(W),L(A),L(T),L(E),L® DB L(BLANKCHR) POWER14 DB L(B),L®,L(O),L(K),L(E),L(N),L(BLANKCHR),L(W),L(I),L(N),L(G) POWER15 DB L(H),L(O),L(L),L(D),L(BLANKCHR),L(S),L(P),L(H),L(I),L(N),L(X) POWER16 DB L(BLANKCHR),L(BLANKCHR),L(BLANKCHR),L(H),L(O),L(V),L(E),L® DB L(BLANKCHR),L(BLANKCHR),L(BLANKCHR) POWER17 DB L(BLANKCHR),L(S),L(P),L(E),L(E),L(D),L(BLANKCHR),L(U),L(P) DB L(BLANKCHR),L(BLANKCHR) POWER18 DB L(BLANKCHR),L(S),L(L),L(O),L(W),L(BLANKCHR),L(D),L(O),L(W) DB L(N),L(BLANKCHR) POWER19 DB L(BLANKCHR),L®,L(O),L(U),L(L),L(E),L(T),L(T),L(E) DB L(BLANKCHR),L(BLANKCHR) POWER20 DB L(BLANKCHR),L(O),L(M),L(N),L(I),L©,L(I),L(D),L(E) DB L(BLANKCHR),L(BLANKCHR) POWER21 DB L(Q),L(U),L(I),L©,L(K),L(BLANKCHR),L(S),L(H),L(O),L(T),L(S) POWER22 DB L(I),L(N),L(V),L(I),L(N),L©,L(I),L(B),L(L),L(E),L(BLANKCHR) CLRPFLGS LDA #0 ;CLEAR TIMED POWER FLAGS LDX #TPNUMB-1 CLRTPLP STA TPSTART,X DEX BPL CLRTPLP LDA #3 STA QUIKSHOT RTS END ******* SGNDOBJ.S THE AMAZING SPHINX * THIS FILE CONTAINS THE CODE THAT ANIMATES AND CONTROLS THE BIG SPHINX, THE * MINI SPHINXES, AND THE FIRE POTS. ZERODEF RSEG CODEB MINIINIT LDY #MININUMB-1 ; CALLED WITH SLOT NUMBER IN X MINILP LDA MINITBL,Y BMI MINIFND DEY BPL MINILP RTS ; IGNORE IF NO SLOT AVAILABLE MINIFND TXA ; X IS THE LOADER TABLE SLOT NUMBER STA MINITBL,Y LDA #0 ; ALIVE STATE STA XTBL,X ; THIS IS WHERE MINISTATE IS KEPT NOW RTS KAMINIS LDY #MININUMB-1 ; KILL ALL MINIS KAMINILP LDX MINITBL,Y BMI KNMINI ; THIS ONES DEAD JSR MINIKILL KNMINI DEY BPL KAMINILP RTS MINIKILL LDA XTBL,X BNE MINIDEAD ; MINI IS ALREADY DYING OR DEAD LDA #1 STA XTBL,X ; SET MINI STATE TO START EXPLOSION LDA #MINIBM ;THE BIG BANG JSR TUNIN LDA #$10 STA HUNDS JSR ADDSCORE MINIDEAD RTS ; ANIMATE MINI SPHINX EXPLOSION IF NECESSARY - CONTROLLED BY MINISTAT ; ; 0 ; STILL ALIVE ; 1 ; START EXPLOSION MXREM EQU 2 ; REMOVE OVERLAY MXREP EQU 4 ; REPLACE OVERLAY MXLOW EQU 15 ; LOWER OVERLAY AND REMOVE HEAD MXDONE EQU 21 ; EXPLOSION IS OVER ; XTBL IS USED TO STORE THE MINI STATE SO THAT IT CAN EASILY BE SET TO ONE ; TO INITIATE THE EXPLOSION WHEN A COLISION IS DETECTED DOMINIS LDY #MININUMB-1 DOMINILP LDA MINITBL,Y BMI DOMINIDN ; NO MINI HERE TAX LDA VPTBL,X CMP #SCRENBOT+1 BNE DOMINI1 LDA #-1 STA MINITBL,Y DOMINIDN DEY BPL DOMINILP RTS DOMSHOTS LDA SPHXSHTD BNE MINIDONE LDA COLX1,X ;THE OFFSETS NEED ADJUSTING CLC ADC #3 ;FUDGE FACTOR STA TEMP2 ; X POS FOR LAUNCHER SEC SBC XTBL+ZBIRD CMP #-8 ;LAUNCH SHOT WHEN BIRD IS IN FRONT BCS ENOGINIM ;OF MINI SPHINX (FOR NOW) CMP #8 BCS MINIDONE ENOGINIM LDA VPTBL,X ; MINI SPHINX MUST BE ON THE SCREEN CMP #SCRENBOT-25 BCS MINIDONE LDA HPTBL,X CMP #15 BCC MINIDONE CMP #145 BCS MINIDONE LDA #0 STA TEMP0 ;TEMP0 = 0 MEANS MINI SPHINX LDA #15 ; Y POS STA TEMP7 LDA COLZ1,X SEC SBC #1 ; PREVENT SUICIDE STA TEMP9 JSR LAUNCHER MINIDONE LDY TEMP1 JMP DOMINIDN DOMINI1 STY TEMP1 LDA XTBL,X ; THIS IS THE MINI STATE BEQ DOMSHOTS ; THE MINI IS ALIVE RBOOR CMP #MXDONE ; THE MINI IS DEAD OR DYING BEQ MINIDONE ; ALREADY DEAD INC XTBL,X ; NEXT STATE NEXT TIME STX TEMP0 CMP #1 BEQ MEXPINIT ; START THE EXPLOSION UP LDX TEMP1 ; OTHERWISE CONTINUE ANIMATION LDY MINIOVER,X ; Y IS OVERLAY SLOT NUMBER TAX ; X IS CURRENT ANIMATION NUMBER LDA MINIEXSL-2,X STA SLTBL,Y LDA MINIEXPW-2,X STA PWTBL,Y CPX #MXREM BEQ MEXPREM ; REMOVE OVERLAY CPX #MXREP BEQ MEXPREP ; REPLACE OVERLAY CPX #MXLOW BEQ MEXPLOW ; LOWER OVERLAY MEXPFNSH LDX TEMP0 JMP MINIDONE ; ALL DONE WITH THIS ANIMATION MEXPREM LDA #200 ; OFF SCREEN HP STA HPTBL,Y ; OVERLAY'S HP JMP MEXPFNSH MEXPREP LDX TEMP1 ; GET MINI SPHINX NUMBER LDA MINITBL,X ; GET SLOT NUMBER OF TOP TAX LDA HPTBL,X STA HPTBL,Y ; RESTORE HP JMP MEXPFNSH MEXPLOW LDA VPTBL,Y ; LOWER THE OVERLAY CLC ADC #3 STA VPTBL,Y LDX TEMP1 ; AND REMOVE THE HEAD FROM THE TOP LDA MINITBL,X TAX LDA SLTBL,X CLC ADC #3 STA SLTBL,X ; BYPASS HEAD IN STAMP LDA HPTBL,X CLC ADC #12 STA HPTBL,X ; NEW HP FOR TOP LDA PWTBL,X CLC ADC #3 STA PWTBL,X ; AND SHRINK THE WIDTH LDA COLY2,X SEC SBC #10 STA COLY2,X ; ALSO LOWER TOP OF COLISION BOX BNE MEXPFNSH MEXPINIT JSR GETASLOT ; X IS NOW OVERLAY SLOT NUMBER BMI MEXPWAIT ; NO SLOT AVAILABLE LDY TEMP1 ; Y IS NOW MINI SPHINX NUMBER TXA STA MINIOVER,Y LDA MINITBL,Y TAY ; Y IS NOW TOP SLOT NUMBER LDA VPTBL,Y CLC ADC #5 STA VPTBL,X ; OVERLAY INITIAL VP LDA HPTBL,Y STA HPTBL,X ; OVERLAY HP LDA YTBL,Y CLC ADC #6 STA YTBL,X ; OVERLAY Y LDA #L(MINIEXP1) STA SLTBL,X ; FIRST EXPLOSION ANIMATION LDA #H(MINIEXP1) STA SHTBL,X LDA #$9C ; FIRST EXPLOSION PALETTE STA PWTBL,X ;PALW/WIDTH LDA #H(MINIEXP1+$1700-$1600) STA SMTBL,X LDA DXTBL,Y SEC SBC #6 STA TEMP6 CLC ADC #2 STA TEMP10 LDA #0 ; NO COLISION BOX FOR OVERLAY STA COLSTAT,X JSR OBJINS ; INSERT OVERLAY INTO LINKED LIST JMP MEXPFNSH MEXPWAIT LDX TEMP0 DEC XTBL,X ; RESTORE OLD STATE FOR NEXT TIME JMP MINIDONE ; TABLES FOR MINI SPHINX EXPLOSION ANIMATION - STARTING WITH SECOND ANIMATION MINIEXSL DB 0 ; 2 - NO OVERLAY DB 0 ; 3 - NO OVERLAY DB L(MINIEXP1) ; 4 DB L(MINIEXP1) ; 5 DB L(MINIEXP2) ; 6 DB L(MINIEXP1) ; 7 DB L(MINIEXP1) ; 8 DB L(MINIEXP2) ; 9 DB L(MINIEXP2) ; 10 DB L(MINIEXP1) ; 11 DB L(MINIEXP1) ; 12 DB L(MINIEXP2) ; 13 DB L(MINIEXP1) ; 14 DB L(MINIEXP3) ; 15 DB L(MINIEXP1) ; 16 DB L(MINIEXP2) ; 17 DB L(MINIEXP3) ; 18 DB L(MINIEXP1) ; 19 DB L(MINIEXP3) ; 20 MINIEXPW DB $9C ; 2 - NO OVERLAY DB $9C ; 3 - NO OVERLAY DB $9C ; 4 DB $9C ; 5 DB $9C ; 6 DB $9C ; 7 DB $9C ; 8 DB $9C ; 9 DB $9C ; 10 DB $9C ; 11 DB $9C ; 12 DB $9C ; 13 DB $9C ; 14 DB $FC ; 15 DB $9C ; 16 DB $9C ; 17 DB $FC ; 18 DB $9C ; 19 DB $FC ; 20 SXFLINIT LDA PHASE BNE SLIDONE ; PUNT IF NOT NORMAL GAME PLAY TXA ; REMEMBER INDEX OF BOTTOM OF SPHINX FACE STA LOWFACE LDA COLX1,X ; GET X POSITION OF SPHINX NOSE CLC ADC #2 STA SPHNXNSX LDA #3 ; ADJUST THIS SEC SBC DIFCULTY STA TEMP4 ; AMOUNT OF EXTRA COLISION BOX LDA COLX1,X SEC SBC TEMP4 STA COLX1,X LDA COLX2,X CLC ADC TEMP4 STA COLX2,X LDA COLY1,X SEC SBC TEMP4 STA COLY1,X LDA COLY2,X CLC ADC TEMP4 STA COLY2,X SLIDONE RTS SXFHINIT LDA PHASE BNE SLIDONE ; PUNT IF NOT NORMAL GAME PLAY TXA ; REMEMBER INDEX OF TOP OF SPHINX FACE STA HIFACE INC PHASE ; SET TO PHASE 1 LDA #0 STA FACER ; INITIALIZE ANIMATION RTS DSEXCLPS LDA #L(CRATERL) LDX LOWFACE STA SLTBL,X LDA #L(CRATERH) LDX HIFACE STA SLTBL,X JMP DSEXANIM DSEXDONE LDX SEXP1 ; DELETE THE OVERLAYS JSR OBJDEL JSR RETASLOT LDX SEXP2 JSR OBJDEL JSR RETASLOT LDX SEXP3 JSR OBJDEL JSR RETASLOT LDA #-2 ; GO TO TIMED BONUS PHASE STA PHASE RTS DSEXINIT LDX LOWFACE LDA HPTBL,X STA TEMP3 LDA VPTBL,X STA TEMP4 LDA DXTBL,X SEC SBC #4 STA TEMP6 ; ASSUMING THIS DOESN'T GO AWAY CLC ADC #2 STA TEMP10 ; SAME HERE LDY #2 DSEXINLP JSR GETASLOT TXA STA SEXP1,Y LDA #H(SPHXGLMR) STA SHTBL,X LDA #H(SPHXGLMR+1700-1600) STA SMTBL,X LDA #$9E STA PWTBL,X LDA #30 STA YTBL,X LDA TEMP3 CLC ADC SEXHPOFF,Y STA HPTBL,X LDA TEMP4 CLC ADC SEXVPOFF,Y STA VPTBL,X LDA #0 STA COLSTAT,X JSR OBJINS DEY BPL DSEXINLP LDY #0 JMP DSEXANIM DSEXPL CMP #-1 ; PHASE IS IN A BNE ANRTS ; PHASE EQUALS -1 DURING EXPLOSION LDA MAINCNT LSR A BCC ANRTS INC FACER LDY FACER CPY #0 BEQ DSEXINIT CPY #15 BEQ DSEXDONJ CPY #11 BNE DSEXANIM JMP DSEXCLPS DSEXDONJ JMP DSEXDONE DSEXANIM LDX SEXP1 LDA SEXAN1,Y STA SLTBL,X LDX SEXP2 LDA SEXAN2,Y STA SLTBL,X LDX SEXP3 LDA SEXAN3,Y STA SLTBL,X ANRTS RTS SPHNXNSY EQU 22 DOSPHINX LDX LOWFACE LDA PHASE BEQ ANRTS ; IF IN NORMAL PLAY BMI DSEXPL ; IF IN EXPLOSION OR BONUS PHASE CMP #1 BNE DSTUNE ; ALREADY STOPPED SCROLLING LDA COLZ1,X CMP #140 BCS DSTUNE ; KEEP SCROLLING INC PHASE ; NOW IN PHASE 2 DSTUNE LDA #SFINKS CMP TUNNUM BEQ DSSHOOT ; STILL PLAYING CMP TUNNUM+1 BEQ DSSHOOT ; STILL PLAYING JSR TUNIN ; PLAY AGAIN - IT GOT BOOTED DSSHOOT BIT PARASPHX BMI ANRTS LDA SPHXSHTD BNE DSSPAWN LDA #1 STA TEMP0 ;TEMP0 = 1 MEANS BIG SPHINX LDA SPHNXNSX STA TEMP2 LDA #SPHNXNSY+7 ; Y POS STA TEMP7 LDA COLZ1,X SEC SBC #6 ; PREVENT SUICIDE STA TEMP9 JSR LAUNCHER DSSPAWN LDA PHASE CMP #2 BNE DSANIM ; SPAWN ONLY WHEN SCROLLING IS STOPPED DEC SPNCNT BNE DSANIM LDX LOWFACE LDA #20 STA SPNCNT LDA SPHNXNSX STA SPNX LDA #SPHNXNSY-6 STA SPNY LDA COLZ1,X SEC SBC #5 STA SPNZ JSR RANDOM AND #3 LDX PLAYER ADC RACK,X CMP #$C BCC DSSPCLS LDA #$B DSSPCLS STA SPNCLASS JSR SPAWN DSANIM LDA MAINCNT AND #3 BNE DSDONE LDY FACER LDA FACEADV,Y BPL FACESTA LDA RNDOM AND #4 FACESTA STA FACER TAY LDA FACEHI,Y LDX HIFACE STA SLTBL,X LDA FACELO,Y LDX LOWFACE STA SLTBL,X DSDONE RTS FACEADV DB 1,2,3,$80,5,6,7,$80 SEXHPOFF DB 0,5,3 SEXVPOFF DB -17,-16,-8 SEXAN1 DB L(SPHXGLMR) ;0 DB L(BLANK) ;1 DB L(SPHXGLMR) ;2 DB L(SPHXFLSH) ;3 DB L(SPHXGLMR) ;4 DB L(SPHXGLMR) ;5 DB L(SPHXFLSH) ;6 DB L(SPHXEXPL) ;7 DB L(SPHXFLSH) ;8 DB L(SPHXEXPL) ;9 DB L(SPHXEXPL) ;10 DB L(SPHXEXPL) ;11 DB L(SPHXFLSH) ;12 DB L(SPHXEXPL) ;13 DB L(SPHXEXPL) ;14 SEXAN2 DB L(BLANK) ;0 DB L(SPHXGLMR) ;1 DB L(BLANK) ;2 DB L(SPHXGLMR) ;3 DB L(SPHXFLSH) ;4 DB L(SPHXGLMR) ;5 DB L(SPHXGLMR) ;6 DB L(SPHXFLSH) ;7 DB L(SPHXEXPL) ;8 DB L(SPHXEXPL) ;9 DB L(SPHXFLSH) ;10 DB L(SPHXEXPL) ;11 DB L(SPHXEXPL) ;12 DB L(SPHXFLSH) ;13 DB L(SPHXEXPL) ;14 SEXAN3 DB L(BLANK) ;0 DB L(BLANK) ;1 DB L(SPHXGLMR) ;2 DB L(BLANK) ;3 DB L(SPHXGLMR) ;4 DB L(SPHXFLSH) ;5 DB L(SPHXGLMR) ;6 DB L(SPHXFLSH) ;7 DB L(SPHXEXPL) ;8 DB L(SPHXFLSH) ;9 DB L(SPHXEXPL) ;10 DB L(SPHXEXPL) ;11 DB L(SPHXFLSH) ;12 DB L(SPHXEXPL) ;13 DB L(SPHXEXPL) ;14 FACELO DB L(SPFACE1L),L(SPFACE4L),L(SPFACE5L),L(SPFACE4L),L(SPFACE1L) DB L(SPFACE2L),L(SPFACE1L),L(SPFACE3L) FACEHI DB L(SPFACE1H),L(SPFACE4H),L(SPFACE5H),L(SPFACE4H),L(SPFACE1H) DB L(SPFACE2H),L(SPFACE1H),L(SPFACE3H) KILLSPHX LDA PHASE ; A SHOT HIT THE SPHINX BEQ KSDONE BMI KSDONE ; ITS ALREADY BEEN HIT JSR INITBNS : TELL STUFF IN SMAGIC LDA #-1 STA FACER ; START OF FACE EXPLOSION ANIMATION LDA #SFINKS ; DO WE NEED THIS IF WE HAVE A TWO JSR SCRAPONE ; CHANNEL SOUND?? LDA #SPHXBM0 JSR TUNIN LDA #SPHXBM1 JSR TUNIN LDA RACK ;SCORE FOR SPHINX IS (RACK+5)*1000 ASL A ;RACK STARTS AT 0 ASL A ASL A ASL A ;MOVE TO UPPER NIBBLE SED CLC ADC #$50 ;ADD RACK TO 5000 STA HUNDS LDA #0 ADC #0 STA HUNTHOUS CLD JSR ADDSCORE KSDONE RTS * KILL ALL FIRE POTS POWER KAFIRES LDX #FIRENUMB-1 ; KILL ALL FIRES KAFIRELP LDA FIRETIP,X BMI KNFIRE ; NOT AN ACTIVE FIRE POT LDA #0 STA FIREGOAL,X KNFIRE DEX BPL KAFIRELP RTS FIREINIT LDY #FIRENUMB-1 ; CALLED WITH SLOT NUMBER IN X FIRELP LDA FIRETIP,Y BMI FIREFND DEY BPL FIRELP FIREKILL LDA #SCRENBOT+1 STA VPTBL,X JSR OBJDEL ; DELETE FIRE IF WE CAN'T ANIMATE IT JSR RETASLOT RTS FIREFND STX TEMP2 ; TIP SLOT NUMBER TXA ; TIP SLOT IN A AND X STA FIRETIP,Y JSR RANDOM ; START WITH RANDOM ANIMATION STA FIREANIM,Y LDA #2 STA FIREHGHT,Y ; LDA #2 ;2 IS ALREADY IN A STA FIREGOAL,Y LDA DIFIND ;0 IS LOW DIFF., 255 IS HIGH ASL A ;PUT TOP TWO BITS INTO BOTTOM TWO BITS ROL A ;SHIFTED TOP BIT INTO BIT0 ROL A ;SHIFTED NEXT BIT INTO BIT0 AND #$3 ;MASK OUT REMAINING BITS ;NOW WE HAVE TWO LOW ORDER BITS BASED ON DIFFICULTY STA TEMP3 ;I KNOW I CAN USE THIS JSR RANDOM AND #$0C ORA TEMP3 TAX LDA MODETABL,X STA FIREMODE,Y LDA #-1 STA FIRECOL1,Y STA FIRECOL2,Y STY TEMP3 ; FIRE TABLE INDEX ;Y HAS NOT CHANGED, BUT I USED TEMP3 AS A TEMP ABOVE RTS MODETABL DB 0,2,2,1,1,1,1,3,0,0,2,2,1,1,0,3 DOFIRE LDX #FIRENUMB-1 DFLOOP LDY FIRETIP,X BPL DFYES ; AN ACTIVE ENTRY DFNEXT DEX BPL DFLOOP RTS DFFREE LDA #-1 STA FIRETIP,X ; MARK TABLE ENTRY AS UNUSED BMI DFNEXT ; ALWAYS DFYES STX TEMP0 ; FIRE TABLE INDEX STY TEMP1 ; TIP SLOT NUMBER LDA VPTBL,Y CMP #SCRENBOT+1 BEQ DFFREE ; THE TIP HAS SCROLLED OFF INC FIREANIM,X LDA FIREANIM,X AND #3 BNE DFNEXT ; ONLY DO EVERY 4TH GAME LOOP LDA FIREHGHT,X ; COMPARE HEIGHT AND GOAL TO GET CMP FIREGOAL,X ; DIRECTION TO MOVE BEQ DFMCFALL ; DF IS A RELATIVE OF ROSALIE BCC JDRISE JMP DFFALL JDRISE JMP DFRISE HIBND DB 17,49,49,49 ;TABLE OF FLAME HI BOUNDS BY MODE GOALBASE DB 40,2 ;BASE OF SPAZ GOAL DFMCFALL ;THERE ARE FOUR FIREMODES -- 0) MELLOW 1) RANDOM 2) SPASTIC 3) HARDCORE LDA FIREMODE,X TAY ; MODE STAYS IN Y FOR NOW JSR RANDOM ; GET NEW GOAL AND #$3F CMP #2 BCC DFANIM ; LEAVE SAME IF TO LOW CMP HIBND,Y ; GET HIGH BOUND BASED ON MODE BCS DFANIM ; LEAVE SAME IF TO HIGH CPY #2 ; LOOK FOR MORE COMPLICATED MODES BCC STGOAL ; IF SIMPLE, STORE GOAL ;THIS IS WHERE THE FUN BEGINS -- WE NEED SOME GOAL SELECTION INTELLIGENCE STA TEMP2 ; SAVE CALCULATED RANDOM GOAL FOR LATER BEQ SPAZ ; IF MODE = 2, GO TO SPAZ DRIVER ;THIS MUST BE THE HARDCORE DRIVER. WE KEEP GOAL RANDOM IF NOT IN ;RANGE OF X. IF IN X RANGE, WE KEEP GOAL LOW UNTIL IN Z RANGE. THEN ;WE RAISE GOAL TO ZAP THE DESERT FUCKIN' FALCON ;SEE IF BIRD IS NEAR LDY TEMP1 ;INDEX OF TIP LDA COLX1,Y ;9 BIT AVERAGE OF COLLISION X'ES CLC ADC COLX2,Y ROR A ;DON'T LOSE TOP BIT SEC SBC XTBL ;COMPARE TO BIRD'S X CMP #-18 ;IF OUT OF X RANGE, USE RANDOM GOAL BCS CHEQUEZ CMP #18 BCS USETE2 ;WE TAKE THIS BRANCH TO USE RANDOM GOAL ;NOW WE KNOW IT IS IN X RANGE ;CHECK Z RANGE FOR LOW OR HIGH GOAL CHEQUEZ LDA COLZ1,Y ;9 BIT AVERAGE OF COLLISION Z'ES CLC ADC COLZ2,Y ROR A ;DON'T LOSE TOP BIT SEC SBC ZTBL BMI USETE2 ;POT IS BEHIND BIRD CMP #$1C ;LOTS O' LEAD TIME LDA #0 ;CARRY SET MAKES THIS A 1 (>= 1C) ROL A ;USE CARRY TO MAKE THIS A 0 OR 1. 0 IS ;FOR HIGOAL, 1 IS FOR LOW GOAL TAY ;SAVE THIS FOR INDEXING SOON JSR RANDOM ;GET RANDOM GOAL BASED IN RGHT PLACE AND #7 ADC GOALBASE,Y BNE STGOAL ;JMP SPAZ TAY ;SAVE TEMP2 IN Y ALSO FOR QUICK COMPARE LDA #16 ;SEE WHAT LAST GOAL WAS (HI OR LO) CMP FIREGOAL,X TYA ;GET RANDOM GOAL IN A BCS HIGOAL ;IF GOAL >16, THEN MAKE NEW ONE <16 CMP #16 ;CHECK NEW GOAL FOR LOWNESS BCS DFANIM BCC STGOAL HIGOAL CMP #40 ;IS GOAL HIGH ENOUGH? BCC DFANIM ;IF NOT, DON'T CHANGE GOAL USETE2 LDA TEMP2 ;I KNOW THIS IS ALREADY IN A STGOAL STA FIREGOAL,X DFANIM LDA FIREANIM,X ; DERIVE ANIMATION INDEX LSR A LSR A CMP #6 BCC DFANIMOK LDA #0 STA FIREANIM,X DFANIMOK TAY LDA COLANIM,Y STA TEMP2 LDA TIPANIM,Y LDY TEMP1 ; INDEX OF TIP STA SLTBL,Y LDY FIRECOL1,X ; DO UPPER COLUMN BMI DFC1GONE ; IT MUST HAVE SCROLLED OFF LDA VPTBL,Y ; SEE IF IT JUST SCROLLED OFF CMP #SCRENBOT+1 BNE DFC1HERE ; NOPE LDA #-1 STA FIRECOL1,X ; MARK IT BMI DFC1GONE ; ALWAYS DFC1HERE LDA TEMP2 ; COLUMN ANIMATION STA SLTBL,Y DFC1GONE LDY FIRECOL2,X ; DO LOWER COLUMN BMI DFNEXTJ ; IT MUST HAVE SCROLLED OFF LDA VPTBL,Y ; SEE IF IT JUST SCROLLED OFF CMP #SCRENBOT+1 BNE DFC2HERE ; NOPE LDA #-1 STA FIRECOL2,X ; MARK IT BMI DFNEXTJ ; ALWAYS DFC2HERE LDA TEMP2 ; COLUMN ANIMATION STA SLTBL,Y DFNEXTJ JMP DFNEXT DFRISE LDA VPTBL,Y CMP #-10 BCS DFRISE1 ; LET IT GO PAST TOP OF SCREEN CMP #-20 BCC DFRISE1 ; BUT NOT TOO FAR DEC FIREGOAL,X ; TO PREVENT IT FROM STICKING HERE JMP DFDONE DFRISE1 JSR RANDOM ; HOW MUCH DO WE RISE ? AND #7 STA TEMP3 INC TEMP3 ; MAKE BETWEEN 1 AND 8 LDA FIREHGHT,X STA TEMP5 ; NEED TO KEEP OLD HEIGHT CLC ADC TEMP3 CMP #49 BCS DFDONE ; DON'T GET TOO HIGH STA FIREHGHT,X STA TEMP7 ; NEED THIS LATER WITHOUT INDEXING LDX TEMP1 ; FIRE TIP SLOT LDY TEMP0 ; FIRE TABLE INDEX LDA COLY2,X ; ADJUST COLISION BOX CLC ADC TEMP3 STA COLY2,X LDA VPTBL,X ; DO TIP FIRST SEC SBC TEMP3 STA VPTBL,X LDA TEMP7 ; NEW HEIGHT CMP #17 BCC DFDONE ; NO OTHER PIECES LDA TEMP5 ; OLD HEIGHT CMP #17 ; DOES COLUMN 1 ALREADY EXIST BCC DFADDC1J ; NEED A NEW PIECE LDA TEMP7 ; NEW HEIGHT CMP #33 BCC DFDONE ; NO OTHER PIECES LDA TEMP5 ; OLD HEIGHT CMP #33 ; DOES COLUMN 2 ALREADY EXIST BCC DFADDC2J ; NEED A NEW PIECE DFDONE LDX TEMP0 LDY TEMP1 JMP DFANIM DFADDC1J JMP DFADDC1 DFADDC2J JMP DFADDC2 DFDELC1J JMP DFDELC1 DFDELC2J JMP DFDELC2 DFFALL JSR RANDOM ; HOW MUCH DO WE FALL ? AND #7 STA TEMP3 INC TEMP3 ; MAKE BETWEEN 1 AND 8 LDA FIREHGHT,X STA TEMP5 ; NEED TO KEEP OLD HEIGHT SEC SBC TEMP3 CMP #2 BCC DFLOW ; DON'T GET TOO LOW CMP #-8 BCS DFLOW ; WATCH FOR NEGATIVES STA FIREHGHT,X STA TEMP7 ; NEED THIS LATER WITHOUT INDEXING LDX TEMP1 ; FIRE TIP SLOT LDY TEMP0 ; FIRE TABLE INDEX LDA COLY2,X ; ADJUST COLISION BOX SEC SBC TEMP3 STA COLY2,X LDA VPTBL,X ; DO TIP FIRST CLC ADC TEMP3 STA VPTBL,X LDA TEMP5 ; OLD HEIGHT CMP #17 BCC DFDONE ; NO OTHER PIECES LDA TEMP7 ; NEW HEIGHT CMP #17 ; DOES COLUMN 1 ALREADY EXIST BCC DFDELC1J ; DELETE A PIECE LDA TEMP5 ; OLD HEIGHT CMP #33 BCC DFDONE ; NO OTHER PIECES LDA TEMP7 ; NEW HEIGHT CMP #33 ; DOES COLUMN 2 ALREADY EXIST BCC DFDELC2J ; DELETE A PIECE JMP DFDONE DFLOW LDA FIREGOAL,X ; CALLED WHEN FIRE HEIGHT LESS THAN 2 BNE DFDONE LDY FIRETIP,X LDA #-1 STA FIRETIP,X TYA TAX JSR FIREKILL ; EXTINGUISH IT LDX TEMP0 JMP DFNEXT DFADDC1 JSR GETASLOT ; GET COLUMN SLOT NUMBER IN X BMI DFDONEJ ; THIS NEEDS TO BE HANDLED BETTER LDY TEMP1 ; TIP SLOT NUMBER LDA VPTBL,Y ; COL1 VP = TIP VP + HGHT - 16 CLC ADC TEMP7 ; NEW HEIGHT SEC SBC #16 STA VPTBL,X LDA #0 STA COLSTAT,X ; NO COLISION BOX LDA HPTBL,Y SEC SBC #2 STA HPTBL,X LDA #H(COL1) STA SHTBL,X LDA #L(COL1) STA SLTBL,X LDA #H(COL1+$1100-$1000) ; NON-HACKED STAMP STA SMTBL,X LDA #$9D STA PWTBL,X LDA #16 STA YTBL,X LDA DXTBL,Y ; SAME DX AS TIP STA TEMP6 LDA DFTBL,Y STA TEMP10 JSR OBJINS LDY TEMP0 ; FIRE SLOT NUMBER TXA STA FIRECOL1,Y ; MARK IT DFDONEJ JMP DFDONE DFADDC2 JSR GETASLOT ; GET COLUMN SLOT NUMBER IN X BMI DFDONEJ ; THIS NEEDS TO BE HANDLED BETTER LDY TEMP1 ; TIP SLOT NUMBER LDA VPTBL,Y ; COL2 VP = TIP VP + HGHT - 32 CLC ADC TEMP7 ; NEW HEIGHT SEC SBC #32 STA VPTBL,X LDA #0 STA COLSTAT,X ; NO COLISION BOX LDA HPTBL,Y SEC SBC #2 STA HPTBL,X LDA #H(COL1) STA SHTBL,X LDA #L(COL1) STA SLTBL,X Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.