Jump to content
IGNORED

7800 Game Development... (Part 6 of 6)


Curt Vendel

Recommended Posts

********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

Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...