; TRCC.ASM

; COLLISION TESTS

HITTST PROC
	LDA	P0PF	;BODY0 TO TRC
	AND	#%00000111
	BNE	P0COLN
	LDA	P1PF	;NOSE0 TO TRC
	AND	#%00000111
	BNE	P0COLN
	LDA	P2PF	;BODY1 TO TRC
	AND	#%00000111
	BNE	P1CJMP
	LDA	P3PF	;NOSE1 TO TRC
	AND	#%00000111
	BNE	P1CJMP

	LDA	P1PL	;nose0 to nose1
	AND	#%00000100
	BEQ	FINTST
	LDA	RANDOM	;random death
	AND	#1
	BEQ	P0COLN
	JMP	P1CJMP

FINTST	LDA	P0PL	;body0 to body1
	AND	#%00000100
	BNE	P0COLN
	LDA	P1PL	;nose0 to body1
	AND	#%00000100
	BNE	P0COLN

	LDA	P2PL	;body1 to body0
	AND	#%00000001
	BNE	P1CJMP
	LDA	P3PL	;nose1 to body0
	AND	#%00000001
	BNE	P1CJMP
	RTS
P1CJMP	JMP	P1COLN	;vector to far

P0COLN =	*	;process death
	PLA		;clear JSR addr
	PLA

	JSR	KILSND
	LDA	#168
	STA	AUDC2

	LDX	#10	;flash trace
:NEXT	LDA	RANDOM
	ORA	#%00000101
	STA	COLOR1
	STA	AUDF2
	LDY	#1
	JSR	PAUSE
	DEX
	BPL	:NEXT
	LDA	#206
	STA	COLOR1

	LDA	PLCOL	; set coordinates
	STA	HCOORD	; for explosion
	LDA	PLROW
	STA	VCOORD

	JSR	CRSET	;reset trace start
	LDA	PLROW
	STA	ROWCRS
	LDA	PLCOL
	STA	COLCRS
	LDA	#8
	STA	SAUDF2
	LDA	#%01010000
	STA	AUDCTL
	LDA	#2
	STA	LNBIT
	LDA	#LOW SCR0	; set indirect addr
	STA	ZPADR		; to pick score
	LDA	#HIGH SCR0	; to add points to
	STA	ZPADR+1
	JSR	EATLN

	LDA	#143	; setup for explosion
	STA	SAUDC1
	LDA	#255
	STA	AUDF1
	LDA	#0
	STA	AUDC2
	STA	AUDCTL
	LDA	#2
	STA	PLTVAL
	STA	HPOSP0
	STA	HPOSP1
	JSR	EXPLOS
	LDY	#35
	JSR	PAUSE
	RTS

P1COLN =	*	;process player 2 death
	PLA
	PLA
; EAT LINE SOUND
	JSR	KILSND
	LDA	#168
	STA	AUDC2

	LDX	#10
NXCL2	LDA	RANDOM
	ORA	#%00000101
	STA	COLOR2
	STA	AUDF2
	LDY	#1
	JSR	PAUSE
	DEX
	BPL	NXCL2
	LDA	#156
	STA	COLOR2

 	LDA	PLCOL+1
	STA	HCOORD
	LDA	PLROW+1
	STA	VCOORD

	JSR	CRSET
	LDA	PLROW+1
	STA	ROWCRS
	LDA	PLCOL+1
	STA	COLCRS
	LDA	#8
	STA	SAUDF2
	LDA	#%01010000
	STA	AUDCTL
	LDA	#3
	STA	LNBIT
; SET SCORE INDIRECT ADDR
	LDA	#LOW SCR1
	STA	ZPADR
	LDA	#HIGH SCR1
	STA	ZPADR+1
	JSR	EATLN

	LDA	#143
	STA	SAUDC1
	LDA	#255
	STA	AUDF1
	LDA	#0
	STA	AUDCTL
	STA	AUDC2
	LDA	#3
	STA	PLTVAL
	STA	HPOSP2
	STA	HPOSP3
	JSR	EXPLOS
	LDY	#35
	JSR	PAUSE
	RTS

; value of screen data to follow in eatline
LNBIT	DB	0

; Begin at start of line and follow
; up to the ship

EATLN	PROC
CLEAR	=	*
	JSR	SCORE	;calc score
	LDA	SAUDF1	;process sound
	CLC
	ADC	#50
	BCC	:OK
	INC	SAUDF2
:OK	STA	AUDF1
	STA	SAUDF1
	LDA	SAUDF2
	STA	AUDF2

	JSR	SCRSCN	;put score to screen
	LDA	#00	;blank line pixel
	JSR	$F5B7	;OUTCH
	JSR	$F593	;GETCH
	DEC	COLCRS	;follow line
	CMP	LNBIT	; + 1 COL
	BEQ	CLEAR

	DEC	COLCRS
	DEC	COLCRS
	JSR	$F593
	DEC	COLCRS
	CMP	LNBIT	; - 1 COL
	BEQ	CLEAR

	INC	COLCRS
	DEC	ROWCRS
	JSR	$F593
	DEC	COLCRS
	CMP	LNBIT	; - 1 ROW
	BEQ	CLEAR

	INC	ROWCRS
	INC	ROWCRS
	JSR	$F593
	DEC	COLCRS
	CMP	LNBIT	; + 1 ROW
	BEQ	CLEAR
	RTS

; Add to proper player score buffer
; one point for each pixel eaten.

ZPADR	=	$86	;indirect addr of player score buffer
SCORE	PROC
	SED
	LDY	#2
	CLC
	LDA	(ZPADR),Y
	ADC	#1
	STA	(ZPADR),Y
	BCC	:OUT
	LDY	#1
	LDA	(ZPADR),Y
	ADC	#0
	STA	(ZPADR),Y
	BCC	:OUT
	LDY	#0
	LDA	(ZPADR),Y
	ADC	#0
	STA	(ZPADR),Y
:OUT	CLD
	RTS

; Multi purpose pause rtn

PAUSE	PROC		;CALLER SETS Y
	TXA
	PHA
	LDA	#3
	LDX	#00
	JSR	SETVBV
	LDA	#1
	STA	CDTMF3
:WAIT	LDA	CDTMF3
	BNE	:WAIT
	PLA
	TAX
	RTS

; EXPLOSION ROUTINE

;  smoke ring explosion data

EXPTBL	DB	$1F,$3F,$5E,$7D,$9C,$BB,$C9,$D7,$E5,$F3,$F1
HCOORD	DB	0	;coordinates of explosion
VCOORD	DB	0
RINGCT	DB	0	;number of rings ploted
EXTEN	DB	0	;dia. of ring passed to plot rtn
PLTVAL	DB	0	;color of ring
SAUDC1	DB	0	;shadow audio c
NWORK	DB	0	;blank out ring dia.
PWORK	DB	0	;plot ring dia.

; Each ring is ploted and then later
; blanked out. The values in pwork or
; nwork are subtracted from each nibble
; of a byte of exptbl which is then added
; to or subtracted from the coordinates
; of the explosion giving the position of
; the next pixel to be ploted.

EXPLOS	PROC		;controls the ring plotings
	LDY	#13
	STY	NWORK
	LDA	#10
	STA	PWORK
NXPWK	STA	EXTEN
	JSR	RING

	DEC	SAUDC1	;PRO SOUND
	LDA	SAUDC1
	AND	#%11101111
	STA	AUDC1

	DEC	PWORK
FINNW	DEC	NWORK	;finish clearing out the ring

	LDY	#1
	JSR	PAUSE
	LDA	NWORK

EXPL2	=	*
	LDA	NWORK
	BPL	NOTOUT
	RTS
NOTOUT	STA	EXTEN
	LDA	PLTVAL
	PHA
	LDA	#0
	STA	PLTVAL
	JSR	RING
	PLA
	STA	PLTVAL
	LDA	PWORK
	BMI	FINNW
	JMP	NXPWK

; Rtn to a plot ring of an explosion
; controls pixels to be ploted in one ring

RING	PROC
	LDX	#10
:NEXT	=	*
	TXA
	PHA
	JSR	SETRC
	JSR	ADDH
	JSR	SUBV
	LDA	PLTVAL
 	JSR	$F5B7	;OUTCH (PLOT)
	JSR	SUBH
	JSR	ADDV
	LDA	PLTVAL
 	JSR	$F5B7
	JSR	ADDH
	JSR	ADDV
	LDA	PLTVAL
 	JSR	$F5B7
	JSR	SUBH
	JSR	SUBV
	LDA	PLTVAL
 	JSR	$F5B7
	PLA
	TAX
	DEX
	BPL	:NEXT
	RTS

; This procedure splits the explosion data
; and subtracts the dia. value (exten)
; from  it then stores the result in the
; hor and ver registers

VER	DB	0
HOR	DB	0
SETRC	PROC
	LDA	EXPTBL,X
	AND	#$0F
	SEC
	SBC	EXTEN
	BPL	:SKIP
	LDA	#0
:SKIP	STA	VER
	LDA	EXPTBL,X
	LSR	A ! LSR A ! LSR A ! LSR A
	SEC
	SBC	EXTEN
	BPL	:SKIP2
	LDA	#0
:SKIP2	STA	HOR
	RTS

; ADD OR SUB ROUTINES TO SET ROW COL
; these routines are called to calculate
; the actual plot position used by the OS,
; based on the values in HOR and VER

ADDH	=	*
	LDA	HOR
	CLC
	ADC	HCOORD
	CMP	#158
	BCC	OKRNG
	LDA	#158
OKRNG	STA	COLCRS
	RTS

ADDV	=	*
	LDA	VER
	CLC
	ADC	VCOORD
	CMP	#90
	BCC	OKRNG3
	LDA	#90
OKRNG3	STA	ROWCRS
	RTS

SUBH	=	*
	LDA	HCOORD
	SEC
	SBC	HOR
	CMP	#1
	BCS	OKRNG2
	LDA	#1
OKRNG2	STA	COLCRS
	RTS

SUBV	=	*
	LDA	VCOORD
	SEC
	SBC	VER
	CMP	#1
	BCS	OKRNG4
	LDA	#1
OKRNG4	STA	ROWCRS
	RTS

	LINK		D:TRCD.ASM
