;*********************************************************************
;	mario kart << OBJ Hit check >>
;					Programed by H.Yajima
;*********************************************************************
		INCLUDE	../../SFX/RP5C77
		INCLUDE	../../SFX/RP5A22
		INCLUDE	../../DSP/D77C25
		INCLUDE	../../../kimura/join/work.def
		INCLUDE	../../../kimura/join/buffer.def
		INCLUDE	../DEF/object.def
		include	../DEF/effect.def
;----------------------------------------------------------------------
		GLB	Hit_check	;(Hit_car)
		GLB	Hit_battle
		glb	Hit_GP_A,Hit_GP_B
		glb	Hit_TM_A,Hit_TM_B
		glb	Hit_VS
;----------------------------------------------------------------------
		EXT	Move_situation
;- - - - - - - - - - - - - -
		ext	sound_my_dokan
		ext	sound_enemy,sound_wood,sound_kamebana,sound_enemyspin
;----------------------------------------------------------------------
		COMN
;- - - - - - - - - - - - - -
angle		ds	2	; work
speed		ds	2
index_offset	ds	2
;- - - - - - - - - - - - - -
work		DS	2
winner_index	DS	2
lost_index	DS	2
;- - - - - - - - - - - - - -
distance_work	DS	2
player_work	DS	2
winner_speed	DS	2
lost_speed	DS	2
;----------------------------------------------------------------------
vx1		DS	2
vx2		DS	2	; 16
vy1		DS	2	; 18
vy2		DS	2	; 1a
;----------------------------------------------------------------------
double_hit	DS	2	; ２度当たりフラグ
;- - - - - - - - - - - - - -
		EXTEND
objdata	SECT	REL
		mem16
		idx16
STOP_TIME	EQU	8
;#####################################################################
;		SPRITE HIT CHECK
;#####################################################################
;*********************************************************************
;		通常の当たりチェック	( GP )
;*********************************************************************
;- - - - - - - - - - - - - - 
Hit_GP_A	jsr	Hit_TM_A	; 
		jmp	Hit_check_A
;- - - - - - - - - - - - - - 
Hit_GP_B	jsr	Hit_TM_B	; 
		jmp	Hit_check_B
;*********************************************************************
;		ＶＳ用当たりチェック	( VS )
;*********************************************************************
Hit_check
Hit_VS	
	;	jsr	brank_on
		jsr	Hit_TM_A
		jsr	Hit_TM_B
		jsr	Hit_check_A
		jsr	Hit_check_B
	;	jsr	brank_off
		rts
;*********************************************************************
;		タイムアタック用	( TM )
;*********************************************************************
Hit_TM_B	ldx	#player_r1
		ldy	#_distance_B
		lda	#40h
		bra	Hit_TM
; - - - - - - - - - - - - - - - - - - - - - - - -
Hit_TM_A	ldx	#player_r0
		ldy	#_distance_A
		lda	#0
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Hit_TM		sta	<index_offset
		stx	<player_work
		sty	<distance_work
		lda	!course_type	;おばけなら終了！
		beq	exit$
; - - - - - - - - - - - - - - - - - - - - - - - -
		ldx	#network_index
		bra	entry$
loop$		clc
		adc	<index_offset
		tay
		lda	(<distance_work),y
		sec
		sbc	#0e0h
		cmp	#040h			; 0e0h < dist < 120h
		bcs	skip$
; - - - - - - - - - - - - - - - - - - - - - - - -
		phx			; >>
		ldx	<player_work	; x = player index
		jsr	polehit_check	; y = enemy index
		plx			; <<
; - - - - - - - - - - - - - - - - - - - - - - - -
skip$		inx
		inx
entry$		lda	<0,x
		bne	loop$
exit$		rts
;*********************************************************************
;		バトル用当たりチェック ( BT )
;*********************************************************************
Hit_battle	ldx	<A_forward	; start pointer = X
		bra	entry$
;- - - - - - - - - - - - - - - - - - - - - -
loop$		lda	<_status,x
		bit	#03000h		; バトル用当たり無視ビット
		bne	skip_2$
;- - - - - - - - - - - - - - - - - - - - - -
skip$		lda	!_status,y
		bit	#03000h		; バトル用当たり無視ビット
		beq	skip_1$	
		jsr	next_forward	; あたりＯＫまでループ
		bra	skip$
;- - - - - - - - - - - - - - - - - - - - - -
skip_1$		ora	<_status,x
		bmi	skip_11$
		jsr	entry_check_KT	; カート同士のあたり
		bra	skip_2$
skip_11$	jsr	entry_check_AT	; アイテム入りのあたり
skip_2$		tyx
entry$		ldy	<_forward_A,X
		cpy	#A_root
		bne	loop$
		rts
;- - - - - - - - - - - - - - - - - - - - - -
next_forward	lda	!_forward_A,y
		cmp	#A_root
		bne	exit$
		pla			;<< del return value
exit$		tay
		rts

;************** GP用当たり基本ルーチン ********************************
;----------------------------------------------------------------------
;		Ａ画面の当たり範囲サーチ
;----------------------------------------------------------------------
Hit_check_A	ldx	<A_forward	; start pointer = X
		bra	entry$
;- - - - - - - - - - - - - - - - - - - - - -
loop$		lda	<_status,x	; item ?
		ora	!_status,y
		bmi	item$
		lda	!_distance_A,y
		bmi	next$
		cmp	!hit_distance	; 当たりチェックを行なう距離
		bcc	next$
check$		jsr	entry_check_KT
next$		tyx
entry$		ldy	<_forward_A,x
		cpy	#A_root
		bne	loop$
end$		rts
item$		jsr	entry_check_AT
		bra	next$
;----------------------------------------------------------------------
;		Ｂ画面の当たり範囲サーチ
;----------------------------------------------------------------------
Hit_check_B	LDX	<B_forward	; start pointer = X
		BRA	entry$
;- - - - - - - - - - - - - - - - - - - - - -
loop$		LDA	<_status,X	; item ?
		ORA	!_status,Y
		BMI	item$
		LDA	!_distance_B,Y
		BMI	next$
		CMP	!hit_distance	; 当たりチェックを行なう距離
		BCC	next$
check$		JSR	entry_check_KT
next$		TYX
entry$		LDY	<_forward_B,X
		CPY	#B_root
		BNE	loop$
		RTS
item$		jsr	entry_check_AT
		bra	next$
;- - - - - - - - - - - - - - - - - - - -


;************** 座標範囲チェック ***************************************
;----------------------------------------------------------------------
;	座標で当たっているかをチェック ( わきだし障害物用 )
;----------------------------------------------------------------------
polehit_check	

		lda	!_situationXH,y		; structure
		sec
		sbc	<_situationXH,x		; player X position
		clc
		adc	#4
		cmp	#8
		bcs	exit$
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
		lda	!_situationYH,y		; structure
		sec
		sbc	<_situationYH,x		; player Y position
		clc
		adc	#4
		cmp	#8
		bcs	exit$
;----------------------------------------------------------------------
		lda	<_poo_status,x		; x = kart index
		bne	exit$
		lda	<_BGcheck_flag,x	; BG hit ?
		bne	exit$
		lda	<_situationZH,x		; Z check
		cmp	#4			; あたり高さ
		bcs	exit$
		lda	!_situationZL+1,y
		sec
		sbc	!polehit_1
		cmp	!polehit_2
		bcs	exit$

		lda	!goal_kabe
		sta	>keycode_camera		; カメラ通常モード

		jmp	Crash_pole		;障害物とヒット！
						;１つぬければ rts
exit$		rts
;----------------------------------------------------------------------
;	座標で当たっているかをチェック ( カート／アイテム用 ）
;----------------------------------------------------------------------
entry_check_KT	LDA	!_situationXH,Y		; your car
		SEC
		SBC	<_situationXH,X		; my car
		CLC
		ADC	#4
		CMP	#8
		BCS	next_hit	
;----------------------------------------------------------------------
		LDA	!_situationYH,Y		; your car
		SEC
		SBC	<_situationYH,X		; my car
		CLC
		ADC	#4
		CMP	#8
		BCS	next_hit
;----------------------------------------------------------------------
		lda	!_hit_timer,Y		; OBJ 当たり中？
		ora	<_hit_timer,X
		sta	<double_hit		; / 0 or 1 /
		dec	a
		dec	a
		bpl	next_hit		; / -1,-2 /	
;----------------------------------------------------------------------
		LDA	<_BGcheck_flag,X	; BG 当たり中
		ORA	!_BGcheck_flag,Y
		BNE	next_hit
;- - -
		lda	#2
		cmp	<event_index,x
		bcc	next_hit
		cmp	!event_index,y
		bcc	next_hit

		lda	<_flag,x		; スピン中は当たりなし！
		bpl	skip0$
		lda	<kart_status,x
		and	#ON_spin		; マイカーオイルスピン
		bne	next_hit
		lda	<spin_counter,x		; マイカーカメスピン
		cmp	#0d0H
		bcs	next_hit

skip0$		lda	!_flag,y
		bpl	skip1$
		lda	!kart_status,y
		and	#ON_spin		; マイカーオイルスピン
		bne	next_hit
		lda	!spin_counter,y		; マイカーカメスピン
		cmp	#0d0H
		bcs	next_hit
;- - - 
skip1$		lda	#4
		cmp	<_situationZH,x		; ' Z check '
		bcc	next_hit
		cmp	!_situationZH,y		; ' Z check '
		bcs	entry_hit

next_hit	rts
;
;
;
;----------------------------------------------------------------------
entry_check_AT	LDA	!_situationXH,Y		; your car
		SEC
		SBC	<_situationXH,X		; my car
		CLC
		ADC	#4
		CMP	#8
		BCS	exit$
;----------------------------------------------------------------------
		LDA	!_situationYH,Y		; your car
		SEC
		SBC	<_situationYH,X		; my car
		CLC
		ADC	#4
		CMP	#8
		BCS	exit$
;----------------------------------------------------------------------
		lda	!_hit_timer,Y		; OBJ 当たり中？
		ora	<_hit_timer,X
		sta	<double_hit		; / 0 or 1 /
		dec	a
		dec	a
		bpl	exit$			; / -1,-2 /	
;----------------------------------------------------------------------
		LDA	<_BGcheck_flag,X	; BG 当たり中
		ORA	!_BGcheck_flag,Y
		BNE	exit$
		lda	#0420h
		cmp	<_situationZL+1,x	; ' Z check '
		bcc	exit$
		cmp	!_situationZL+1,y	; ' Z check '
		bcs	entry_hit
exit$		RTS
;----------------------------------------------------------------------

;
;
;
;
;
;
;
;
;
;
;
;*********************************************************************
;	ＯＢＪ 当たり処理 MAIN CONTROL
;*********************************************************************
entry_hit	PHX				;>>
		PHY				;  >>
;- - - - - - - - - - - - - - - - - - - - - - - -
		JSR	Set_flag
;---------------------------------------------- ; winner check -------
		LDA	<_HP,X
		CMP	!_HP,Y
		BCS	crash_1000
		TYA
		TXY
		TAX
crash_1000	STX	<winner_index		; X = 勝ち OBJ
		STY	<lost_index		; Y = 負け OBJ
;---------------------------------------------- ; item check -------
		LDA	<_HP,X			; winner  
		AND	#0C000H			; = fire or star ?
		BEQ	kart$			; 無敵/アイテム	
		JSR	crash_special
		BRA	exit$
kart$		JSR	kart_hit		; カート同士の当たり
;- - - - - - - - - - - - - - - - - - - - - - - -
exit$		PLY				;  <<
		PLX				;<<
		RTS				;		
;*********************************************************************
;	衝突したときに立てるフラグ
;*********************************************************************
;
;------------------------fedcba9876543210------ ; set crash flag  ----
Set_flag	

		STX	<_crash_index,Y		; 衝突した相手の index
		STY	<_crash_index,X		;
		LDA	#8007H			; 衝突 OBJ タイマ
		STA	<_crash_timer,X		;
		STA	!_crash_timer,Y		;

;------------------------fedcba9876543210------ ; set bound flag -----

		LDA	#0001000000000000B	; 衝突お知らせbit
		ORA	<_flag,X
		STA	<_flag,X
		LDA	#0001000000000000B
		ORA	!_flag,Y
		STA	!_flag,Y
;
		lda	#STOP_TIME		; 当たりチェック中 処理不能
		sta	<_hit_timer,x
		sta	!_hit_timer,y

		RTS
;
;*********************************************************************
;		special
;*********************************************************************
crash_special	BMI	crash_win_star		; 勝ちは無敵？
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;	アイテムの勝利 ( 勝ったアイテムの処理 ）
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
crash_win_item	JSR	erase_Xsprite		; アイテム消去
		LDA	!_status,y
		BMI	item_double
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;	( アイテムに負けたカートのスピン処理 )
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		lda	<_item_no,x		; タイプ no
		tax
		jmp	(!item_spin,x)
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;	( 両方ともアイテム )
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
item_double	jsr	erase_Ysprite
		jsl	>sound_kamebana
		jmp	nomal_hit
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;	( 無敵の勝利 )
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
crash_win_star	LDA	!_HP,Y			; double star ?
		BMI	crash_double		; yes 
		ASL	A			; item ?
		BMI	crash_lost_item		; yes
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;	( 無敵に負けたカートのスピン処理 )
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
crash_spin
		lda	!_flag,y
		bmi	skip$

		jsl	>sound_enemyspin	; 敵 無敵スピン

skip$		lda	#effect_mycrash
		ora	<_effect_flag,x
		sta	<_effect_flag,x
		jsr	spin_hit
		jmp	star_crash
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;	( 負けたアイテムの処理 )
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
crash_lost_item	jsr	erase_Ysprite		; アイテム消去
		jsl	>sound_kamebana
		rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;	( 両方とも無敵 )
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
crash_double	
		lda	#effect_mycrash
		ora	<_effect_flag,x
		sta	<_effect_flag,x
		jmp	nomal_hit	
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;	( アイテムに負けたカートのスピン処理 )
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

item_spin	DW	fire$		; 0 バナナ
		DW	midori_kame$	; 2 緑カメ
		DW	kame$		; 4 赤カメ
		DW	kame$		; 6 キラー ( 緑カメ ）
		DW	banana$		; 8 バナナタイプ攻撃
		DW	banana$		; A ミサイルタイプ攻撃
		DW	fire$		; C 投げバナナ
		DW	tamago$		; E 置きガメ
;--------------------------------------------------------------------
; バナナタイプ系統
;- - - - - - - - - - - - - - - - - - - - - - - - - -
banana$		ldx	<winner_index
		ldy	<_fire_register,x	; y = 発射カート index
		ldx	<_status,y
		jmp	(!type_select$,x)
;- - - - - - - - - - - - - - - - - - - - - - - - - -
type_select$	DW	doku$		; mario	
		DW	doku$		; luige
		DW	tamago$		; koopa	
		DW	doku$		; peach	
		DW	fire$		; cong
		DW	tamago$		; kame
		DW	doku$		; kinopio
		DW	tamago$		; yossy
;- - - - - - - - - - - - - - - - - - - - - - - - - -
; 毒きのこ (敵) 
;- - - - - - - - - - - - - - - - - - - - - - - - - -
doku$		ldx	<winner_index		; 勝ち index
		ldy	<lost_index		; 負け index
		lda	!_sunder_timer,y
		beq	skip_doku$
		cmp	#60h
		bcc	chibi$
;
		lda	#40h
		bra	skip_doku2$
;
skip_doku$	lda	#D_sunder_kinoko
skip_doku2$	sta	!_sunder_timer,y
		bra	skip_doku3$
skip_doku3$
		lda	!_flag,y		; 敵カートならスキップ
		bmi	mykart$
		jsl	>sound_enemyspin
		bra	chibi$

mykart$		lda	#8000h			; 小さくなる音
		cpy	#player_r0
		beq	sound_doku$		
		lsr	a		
sound_doku$	tsb	<sound_size

chibi$		tyx				; 負け index

		jmp	speed_down50
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; バナナ (マイカート/敵カート）
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
fire$
		ldx	<winner_index		; 勝ち index
		ldy	<lost_index		; 負け index
		lda	!_flag,y
		bpl	fire_skip$	; コンプならスキップ
		lda	#3		; コントロール不能短い !
		sta	!_hit_timer,y
		bra	fire_skip2$
fire_skip$	jsl	>sound_enemyspin		
		jmp	tamago_skip2$		; 敵カートはむかしのスピン

fire_skip2$	

		lda	#BANANA_spin		; バナナスピン
		ora	!kart_status,y
		sta	!kart_status,y
		lda	!_effect_flag,y		; スピントリガ！
		ora	#effect_spin+effect_spin_c
		sta	!_effect_flag,y

		lda	#0040h
		sta	<_velocityX,x
		sta	<_velocityY,x

		rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; たまご(敵) ファイア（敵) / 置きガメ /
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
tamago$
		ldx	<winner_index		; 勝ち index
		ldy	<lost_index		; 負け index
		lda	!_flag,y
		bpl	tamago_skip$	; コンプならスキップ
		lda	#3		; コントロール不能短い !
		sta	!_hit_timer,y
		bra	tamago_skip2$
tamago_skip$	jsl	>sound_enemyspin
tamago_skip2$	
		jsr	spin_hit
		jsr	nomal_hit

		lda	#0040h
		sta	<_velocityX,x
		sta	<_velocityY,x
		tyx
		stz	<_velocityX,x
		stz	<_velocityY,x

		rts
;- - - - - - - - - - - - - - - - - - - - - - - - - -
; 赤ガメ系統
;- - - - - - - - - - - - - - - - - - - - - - - - - -
kame$		ldx	<winner_index	; 勝ち index
		lda	!_flag,y
		bpl	skip$		; コンプならスキップ
		lda	#STOP_TIME+8	; コントロール不能を長くする
		sta	!_hit_timer,y
		bra	skip2$
skip$		jsl	>sound_enemy
skip2$		jsr	spin_hit
		jmp	nomal_hit
;- - - - - - - - - - - - - - - - - - - - - - - - - -
; 緑ガメ系統
;- - - - - - - - - - - - - - - - - - - - - - - - - -
midori_kame$	ldx	<winner_index	; 勝ち index
		lda	!_flag,y
		bpl	mskip$		; コンプならスキップ
		lda	#STOP_TIME+8	; コントロール不能を長くする
		sta	!_hit_timer,y
		bra	mskip2$
mskip$		jsl	>sound_enemy
mskip2$		jsr	spin_hit
		jmp	hit_90


;*********************************************************************
;	１／２減速
;*********************************************************************
speed_down50	lda	<_velocityX,x
		CMP	#1000000000000000B
		ROR	A
		sta	<_velocityX,x
		lda	<_velocityY,x
		CMP	#1000000000000000B
		ROR	A
		sta	<_velocityY,x
		rts
;*********************************************************************
;	90度 はねとばされる
;*********************************************************************
hit_90		lda	!_velocityX,y		; 負けベクトル
		pha
		lda	!_velocityY,y
		pha

		lda	!frame_part
		bne	skip$
		lda	<_velocityX,x		; 右 90 はじき！
		CMP	#1000000000000000B
		ROR	A
		sta	!_velocityY,y
		lda	<_velocityY,x
		EOR	#1111111111111111B
		INC	A
		CMP	#1000000000000000B
		ROR	A
		sta	!_velocityX,y
		bra	exit$

skip$		lda	<_velocityX,x		; 左 90 はじき !
		EOR	#1111111111111111B
		INC	A
		CMP	#1000000000000000B
		ROR	A
		sta	!_velocityY,y
		lda	<_velocityY,x
		CMP	#1000000000000000B
		ROR	A
		sta	!_velocityX,y
		
exit$		pla				; 負けた方のベクトル
		sta	<_velocityY,x		; をもらう
		pla
		sta	<_velocityX,x

		rts
;*********************************************************************
;		ITEM CRASH
;*********************************************************************
erase_Ysprite	LDX	<lost_index
		BRA	erase_skip
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
					; y = lost index
erase_Xsprite	lda	!_status,y
		bmi	skip$

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;	コンピュータカートなら JUMP する
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		lda	!_flag,y
		bmi	skip$		; コンピュータ？
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
					; x = item index
		lda	<_fire_register,x	; アイテムをだした本人
		tax
		lda	<_flag,x
		bmi	entry$ 		; 敵カートが出したら JUMP

		lda	!driver_priority,y
		ldx	#jump_15_16
		tay
		bne	jumpcheck$
		ldx	#jump_8_16
		bra	jumpcheck$
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
entry$		lda	<rank_number,x	; 順位チェック
		lsr	a
		ldx	<_status,y	; やられカートキャラ
		adc	!lucky_table,x
		tax
jumpcheck$	SEP	#00100000B
		MEM8
		lda	<frame_counter
		and	#01fh
		cmp	!0,x
		REP	#00100000B
		MEM16
		bcs	skip$
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
					; JUMP 処理
jump$		ldx	<lost_index
		lda	#04000h		; spin jump
	;;	lda	#00080h		; jump item
		sta	<special_trigger,x
		lda	#0		; 当たり safe !
		sta	<_hit_timer,x
		pla			; << hit 処理終了
		rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
skip$		ldx	<winner_index
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
erase_skip	lda	#8000h
		sta	<_item_status,x
		lda	#100h
		sta	<_velocityZ,x
disp_ok		ldx	<winner_index
		ldy	<lost_index
		rts
;----------------------------------------------------------------------
lucky_table	DW	mario$
		DW	luige$
		DW	kuppa$	
		DW	peach$	
		DW	cong$
		DW	kame$
		DW	kinopio$
		DW	yossy$
;----------------------------------------------------------------------
mario$
luige$
peach$
yossy$
kame$
kinopio$	db	04h,04h,02h,02h,02h,02h,00h,00h
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cong$
kuppa$		db	02h,02h,02h,02h,02h,02h,00h,00h
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
jump_15_16	db	1eh		; 15/16 でジャンプ
jump_8_16	db	10h		;  8/16 でジャンプ
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;
;
;
;
;*********************************************************************
;		カートスピン
;*********************************************************************
;		Y <- lost index
;			fedcba9876543210
;----------------------------------------------------------------------
spin_hit	tyx
		lda	<frame_counter
		lsr	a
		lda	#spin_left
		bcc	skip0$
		lda	#spin_right
skip0$		ora	<kart_status,x
		sta	<kart_status,x
		lda	#2000H			; 敵スピン
		bit	<_flag,x
		bpl	skip1$
		lda	#spin_power		; マイカースピン
skip1$		sta	<spin_counter,x
skip2$		lda	<_effect_flag,x		; スピントリガ！
		ora	#effect_spin+effect_spin_c
		sta	<_effect_flag,x
;- - - - - - - - - - - - - - - - - - - - - -
exit$		txy
		ldx	<winner_index
		rts
;*********************************************************************
;		あたりチェック用ベクトル計算
;*********************************************************************
have_coin	equ	008h
have_big	equ	010h
;---------------------------------------------------------------------
set_doublespin	lda	#OIL_spin	; オイルスピンする！
		ora	<kart_status,x
		sta	<kart_status,x
set_lostspin	lda	#OIL_spin
		ora	!kart_status,y
		sta	!kart_status,y
		rts
;---------------------------------------------------------------------
;	通常時の カート同士 あたりチェック
;---------------------------------------------------------------------
;- - - - - - - - - - - - - - - - - - - - - -
;	カート強さ決定
;- - - - - - - - - - - - - - - - - - - - - -
kart_hit	lda	<double_hit
		beq	skip0$
		jmp	special_hit
;- - - - - - - - - - - - - - - - - - - - - -
;	当たった時にコインを落とす
;- - - - - - - - - - - - - - - - - - - - - -
skip0$
		lda	#effect_crash+effect_mycrash
		ora	!_effect_flag,y
		sta	!_effect_flag,y
		lda	#effect_crash+effect_mycrash
		ora	<_effect_flag,x
		sta	<_effect_flag,x
skip$
;- - - - - - - - - - - - - - - - - - - - - - - - 
;	敵カートのコントロール不能を長くする
;- - - - - - - - - - - - - - - - - - - - - - - - 
;
	;;	lda	!_flag,y
	;;	lda	#
	;;	sta	!hit_timer,x
;
;- - - - - - - - - - - - - - - - - - - - - -
;	カート強さ決定
;- - - - - - - - - - - - - - - - - - - - - -
		lda	<_HP,x
		sec
		sbc	!_HP,y
		beq	attack_kart		; 全く同じ性能
		dec	a
		beq	attack_1		; 1 コずれ
		dec	a
		beq	attack_2		; 2 コずれ
;- - - - - - - - - - - - - - - - - - - - - -
; レベルの違う敵と接触
;- - - - - - - - - - - - - - - - - - - - - -
level_check
		lda	!_HP,y
		and	#have_big	; 自分 (負け）はチビ？
		bne	skip$
		lda	<_HP,x
		and	#have_big	; 敵 (勝ち) はデカ？
		beq	skip$
		lda	!_flag,y
		bpl	out$		; 負けは,コンピュータ?
		tyx
		jmp	super_dossun
out$
		jsl	>sound_enemyspin	; 敵 無敵スピン
		jsr	spin_hit
		jmp	star_crash


skip$		lda	!_HP,y		; 負けカートはコイン ？
		and	#have_coin
		bne	exit$
		jsr	set_lostspin	; オイルスピン
exit$		jmp	rate_2
;- - - - - - - - - - - - - - - - - - - - - - -
attack_1	lda	<_HP,x		; コインをもっている？
		and	#have_coin
		bne	exit$
		jsr	set_doublespin
exit$		jmp	rate_1
;- - - - - - - - - - - - - - - - - - - - - - -
attack_2	lda	<_HP,x		; コインをもっている？
		and	#have_coin
		bne	exit$
		jsr	set_doublespin
exit$		jmp	rate_2
;---------------------------------------------------------------------
;	クッパとクッパの当たり	( hit rate 0 ) ベクトル入れ替え
;	カメあたりでの当たり
;---------------------------------------------------------------------
attack_kart	lda	<_HP,x		; コインをもっている？
		and	#have_coin
		bne	nomal_hit
		jsr	set_doublespin	; オイルスピン
;- - - - - - - - - - - - - - - - - - - - - -
nomal_hit
;- - - - - - - - - - - - - - - - - - - - - -
;ベクトル反射
;- - - - - - - - - - - - - - - - - - - - - -
		LDA	<_velocityX,X
		STA	<vx1			; winner
		LDA	!_velocityX,Y
		STA	<vx2			; lost
		LDA	<_velocityY,X
		STA	<vy1			; winner
		LDA	!_velocityY,Y
		STA	<vy2			; lost
		JSR	Nomal_mirror
;- - - - - - - - - - - - - - - - - - -
; 角度によるチェック ( くいこみ防止 ）
;- - - - - - - - - - - - - - - - - - -
		LDA	<vx1
		BPL	hit_100
		LDA	<vx2
		BPL	hit_900
		BRA	hit_200
hit_100		LDA	<vx2
		BMI	hit_900
hit_200		LDA	<vy1
		BPL	hit_300
		LDA	<vy2
		BPL	hit_900
		BRA	hit_400
hit_300		LDA	<vy2
		BMI	hit_900
;- - - - - - - - - - - - - - - - - - -
;ベクトル反射 (補正バージョン）
;- - - - - - - - - - - - - - - - - - -
hit_400		JSR	Special_mirror		;
hit_900	
;- - - - - - - - - - - - - - - - - - -
;ベクトルリストア
;- - - - - - - - - - - - - - - - - - -
hit_exit	LDX	<winner_index
		LDY	<lost_index		
		LDA	<vx1
		STA	<_velocityX,X
		LDA	<vx2
		STA	!_velocityX,Y
		LDA	<vy1
		STA	<_velocityY,X
		LDA	<vy2
		STA	!_velocityY,Y
		RTS
;---------------------------------------------------------------------
;	クッパとマリオの当たり	( hit rate 1 )
;---------------------------------------------------------------------
rate_1		lda	<_vF,x
		sec
		sbc	!_vF,y
		bcs	power_hitter
;- - - -- - - - - - - - - - - - - - - - -
					;負け --> 勝ち
					;通常のあたりへ
lost_crash$	jmp	nomal_hit
;
;---------------------------------------------------------------------
;	クッパとカメの当たり	( hit rate 2 )
;	無敵カートとの当たり
;---------------------------------------------------------------------
bound_angle	equ	0e00h
;- - - - - - - - - - - - - - - - - - - - -
star_crash
rate_2
;- - - - - - - - - - - - - - - - - - - - -
		lda	<_vF,x
		sec
		sbc	!_vF,y
		bcs	power_hitter
;- - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
					;負け --> 勝ち
					;負けカートは歯がたたない
lost_crash$	
;- - - - - - - - - - - - - - - - - - - - - - - - -

		lda	<_vF,x	
		cmp	#0100h
		bcc	low_speed$
		lsr	a		; 勝ちカートのスピード
		lsr	a		; がはやいとき
		sta	<speed
		lda	<_vFangle,x
		clc
		adc	#1000h
		sta	<angle
		tyx
		jmp	speed_vxvy

;- - - - - - - - - - - - - - - - - - - - 
low_speed$	tyx			; 勝ちカートのスピード
		lda	<_vFangle,x	; がおそいとき
		clc
		adc	#6000h
		sta	<angle
		lda	<_vF,x
		cmp	#0100h
		bcs	skip$
		lda	#0200h
skip$		lsr	a
		sta	<speed
		jmp	speed_vxvy	
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
power_hitter				;勝ち --> 負け
;					;勝ちカート減速
		lsr	a
		eor	#0ffffh
		sec
		adc	<_vF,x
		sta	<speed
		lda	<_vFangle,x		
		sta	<angle
		jsr	speed_vxvy
;
;- - - - - - - - - - - - - - - - - - - 
		lda	<_flag,x	; 負けカートとばされる
		bmi	win1$
;- - - - - - - - - - - - - - - - - - - - - - - -
		lda	#-bound_angle	; 負けカートがマイカーの場合
		sta	<0
		lda	<_posH_A,x
		cpx	#player_r0
		beq	skip4$
		lda	<_posH_B,x
		bra	skip4$
;- - - - - - - - - - - - - - - - - - - - - - - -
win1$					; 勝ちカートがマイカーの場合

		lda	!_flag,y	; 負けもマオカー？
		bmi	win_10$
		lda	#1800h
		bra	win_20$
win_10$		lda	#bound_angle
win_20$		sta	<0
		lda	!_posH_A,y
		cpx	#player_r0
		beq	skip4$
		lda	!_posH_B,y
;- - - - - - - - - - - - - - - - - - - - - - - -
skip4$		clc
		adc	#0080h
		asl	a
		lda	<0
		bcc	skip$
		eor	#0ffffh
		sec
;- - - - - - - - - - - - - - - - - - - - - - - -
skip$		adc	<_vFangle,x
		sta	<angle
		lda	<_vF,x
		adc	#0020h
		sta	<speed
		tyx
		jmp	speed_vxvy
;---------------------------------------------------------------------
;

; = = 勝ちカート減速 別パターン = =

	if	0
		SEP	#00100000B
		MEM8
		lda	#dsp_multiply
		sta	!DSP_data
		REP	#00100000B
		MEM16
		lda	<_velocityX,x
		sta	!DSP_data
		lda	#05fffh
		sta	!DSP_data
		lda	!DSP_data
		sta	<_velocityX,x
		SEP	#00100000B
		MEM8
		lda	#dsp_multiply
		sta	!DSP_data
		REP	#00100000B
		MEM16
		lda	<_velocityY,x
		sta	!DSP_data
		lda	#05fffh
		sta	!DSP_data
		lda	!DSP_data
		sta	<_velocityY,x
	endif
;
;
;
;
;
;
;-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
;
;**********************************************************************
;	スピードから vX,vY に変換
;**********************************************************************
;angle		equ	0
;speed		equ	2
;----------------------------------------------------------------------
		glb	speed_vxvy_BK
;----------------------------------------------------------------------
speed_vxvy_BK	jsr	speed_vxvy
		rtl
;- - - - - - - - - - - - - - - - - - - - - -
speed_vxvy	SEP	#00100000B
		MEM8
		lda	#dsp_triangle
		sta	!DSP_data
		REP	#00100000B
		MEM16
		lda	<angle
		sta	!DSP_data		
		lda	<speed
		sta	!DSP_data
		LDA	>DSP_status
		BPL	$-4
		lda	!DSP_data
		sta	<_velocityX,x
		lda	!DSP_data
		EOR	#1111111111111111B
		INC	A
		sta	<_velocityY,x
		rts
;**********************************************************************
;	ベクトル反射ルーチン
;**********************************************************************
;----------------------------------------------------------------------
;２度当たりの時の反射ルーチン
;----------------------------------------------------------------------
special_hit
		lda	<_vF,x
		ora	!_vF,y
		bne	skip$
;- - - - - - - - - - - - - - - - - - - - 双方ともベクトル０のとき
		lda	<_poseQ,x
goto$		sta	<angle
		lda	#0180h
		sta	<speed
		jmp	speed_vxvy
;- - - - - - - - - - - - - - - - - - - - ベクトルがあるとき
skip$		lda	<_vF,x
		cmp	!_vF,y
		bcs	skip2$
		lda	!_vF,y
skip2$		cmp	#00c0h
		lda	<_vFangle,x
		bcc	goto$
		rts
;- - - - - - - - - - - - - - - - - - - -

	if	0
;- - - - - - - - - - - - - - - - - - - - 隣接角度チェック
skip$		lda	!_vFangle,y
		sbc	<_vFangle,x
		BPL	$+6
		EOR	#1111111111111111B
		INC	A
		cmp	#02000h
		bcs	exit$
;- - - - - - - - - - - - - - - - - - - - 隣接角度のとき
		tyx
		lda	<_vFangle,x
		adc	#02000h
		sta	<angle
		lda	<_vF,x
		sta	<speed
		jmp	speed_vxvy
;- - - - - - - - - - - - - - - - - - - -
exit$		rts
	endif
;----------------------------------------------------------------------
;ベクトル反射（通常）
;----------------------------------------------------------------------
Nomal_mirror	LDX	<vx2		; <- READ LOST
		LDY	<vx1		; <- READ WIN
		STY	<vx2		; <- WRITE LOST
		STX	<vx1		; <- WRITE WIN
		LDX	<vy2		; <- READ LOST
		LDY	<vy1		; <- READ WIN
		STY	<vy2		; <- WRITE LOST
		STX	<vy1		; <- WRITE WIN
		RTS
;----------------------------------------------------------------------
;ベクトル反射（補正）
;---------------------------------------------------------------------
Special_mirror	LDX	#0		; Xの反射
		JSR	set_vector
		LDX	#2		; Yの反射
;- - - - - - - - - - - - - - - - - - - - - - - - - - - 
set_vector	LDA	<vx1,X
		BMI	m_XXX
;- - - - - - - - - - - - - - - - - - - - - - - - - - - （＋）のとき
		LDA	<vx1,X		; x1 > x2 ?
		CMP	<vx2,X
		BCS	m_3200		; yes -> 3200
		SEC
		SBC	#0080H		; x1= x1-0080H
		STA	<vx1,X
		RTS
m_3200		LDA	<vx2,X		; x2= x2-0080H
		SEC
		SBC	#0080H
		STA	<vx2,X
		RTS
;- - - - - - - - - - - - - - - - - - - - - - - - - - - （ー）のとき
m_XXX		LDA	<vx1,X		; x1 < x2 ?
		CMP	<vx2,X
		BCC	m_5200		; yes -> 5200
		CLC
		ADC	#0080H		; x1= x1+0080H
		STA	<vx1,X
		RTS
m_5200		LDA	<vx2,X		; x2= x2+0080H
		CLC
		ADC	#0080H
		STA	<vx2,X
		RTS
;---------------------------------------------------------------------
;
;
;**********************************************************************
;	ベクトル反射
;**********************************************************************
;	x = 反射 index
;- - - - - - - - - - - - - - - - - - - - - - - - - -
;	スピードが 000H  - 080H  ならば 	080H
;	スピードが 080H  - 200H  ならば		nomal
;	スピードが 200H  - 800H  ならば		半減
;- - - - - - - - - - - - - - - - - - - - - - - - - -
nomal_mirror	lda	<_velocityX,x
		jsr	!nomal_revers
		sta	<_velocityX,x
		lda	<_velocityY,x
		jsr	nomal_revers
		sta	<_velocityY,x
		rts
;- - - - - - - - - - - - - - - - - - - -
nomal_revers	EOR	#1111111111111111B
		INC	A
		bpl	skip_p$
		cmp	#-080h
		bcc	skip_m1$
		lda	#-080h
		rts
skip_m1$	cmp	#-0200h
		bcs	skip_p2$
		bcc	skip_m2$
;- - - - - - - - - - - - - - - - - - - -
skip_p$		cmp	#080h
		bcc	skip_p1$
		lda	#080h
		rts
skip_p1$	cmp	#0200h
		bcc	skip_p2$
skip_m2$	CMP	#1000000000000000B
		ROR	A
skip_p2$	rts
;**********************************************************************
;	２度当たりの時の反射ルーチン
;**********************************************************************
error_mirror	lda	<_vF,x
		bne	skip$
		SEP	#00100000B
		MEM8
		lda	#dsp_triangle
		sta	!DSP_data
		REP	#00100001B
		MEM16
		lda	<_poseQ,x
		sta	!DSP_data
		lda	#0100h
		sta	!DSP_data
		LDA	>DSP_status
		BPL	$-4
		lda	!DSP_data
		sta	<_velocityX,x
		lda	!DSP_data
		EOR	#1111111111111111B
		INC	A
		sta	<_velocityY,x
skip$		rts
;**********************************************************************
;	デバッグ用処理メータ
;**********************************************************************
brank_on	SEP	#00100000B
		MEM8
		lda	#0ah
		sta	!PPU_control
		REP	#00100000B
		MEM16
		rts
brank_off	SEP	#00100000B
		MEM8
		lda	#0fh
		sta	!PPU_control
		REP	#00100000B
		MEM16
		rts
;------------------------------------------
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;= = = = = = = 特殊処理　マイカートに対しての 障害物衝突 = = = = = = =
;
;*********************************************************************
;		障害物衝突
;*********************************************************************
rebound_angle	equ	1000h
rebound_size	equ	06h
;----------------------------------------
pc_exit		rts
Crash_pole	lda	!_pole_status,y		; 障害飛ばし中？
		bmi	pc_exit
		lda	<event_index,x		; 水落ち中？
		cmp	#08h			; 08/06 はペケ
		beq	pc_exit
		cmp	#06h
		beq	pc_exit
;- - - - - - - - - - - - - - - - - - - - - - - - -
entry$		lda	<_muteki_timer,x
		beq	skip$
;- - - - - - - - - - - - - - -
;
		lda	<_poo_status,x		; ワーク使用中？
		bne	skip0$
		sty	<_poo_status,x		; ぶっとび index
		lda	#8000h
		sta	!_pole_status,y
skip0$		jmp	speed_down50		; スピード１／２
;
;- - - - - - - - - - - - - - -
skip$		lda	<_hit_timer,x		; 0,1
		dec	a
		dec	a
		bpl	exit$
		pha				; ( ->> )
		sty	<_crash_index,x		; 衝突した index
		lda	#8007H	
		sta	<_crash_timer,x		; 衝突 obj タイマ
;- - - - - - - - - - - - - - - - - - - - - - - - -
		lda	#0001000000000000B
		ora	<_flag,x
		sta	<_flag,x		; 衝突した flag
;- - - - - - - - - - - - - - - - - - - - - - - - -
		lda	#8			; STOP_TIME
		sta	<_hit_timer,x		; 衝突不能 flag
	;;	lda	#4
	;;	sta	<_unable_control,x

		pla				; ( <<- )
		inc	a			; 連続a当たりのチェック
		beq	double$			; 		
;- - - - - - - - - - - - - - - - - - - - - - - - -
		txa
		ldx	!obj_type
		jmp	(!course_hit,x)
exit$		rts
;- - - - - - - - - - - - - - - - - - - - - - - - -
double$		lda	<_vF,x
		beq	stop$
		cmp	#0040h
		bcs	end$
		lda	<_velocityX,x	
		asl	a
		lda	<_velocityX,x
		lda	<_velocityY,x
		asl	a
		sta	<_velocityY,x
end$		rts
;- - - - - - - - - - - - - - - - - - - - - - - - -
stop$		lda	#0100h			; くいこんだら駄出
		sta	<_velocityX,X
		sta	<_velocityY,X
		rts
;- - - - - - - - - - - - - - - - - - - - - - - - -
course_hit	dw	ch_dokan	;おばけ
		dw	ch_dokan	;サーキット
		dw	ch_poo		;草原
		dw	ch_pack		;ダート
		dw	ch_dokan	;氷
		dw	ch_puku		;海岸
		dw	ch_dosun	;クッパ城
		dw	ch_dosun	;バトル
;- - - - - - - - - - - - - - - - - - - - - - - - -
;ドッスンに当たった
;- - - - - - - - - - - - - - - - - - - - - - - - -
ch_dosun
		tax
		and	#0100h
		jsl	>sound_my_dokan

		lda	!_situationZL+1,y
		beq	exit_dosun

		cpx	#player_r0
		bne	skip$
		
		lda	!_velocityZ+40h,y
		bpl	exit_dosun
		bmi	super_dossun

skip$		lda	!_velocityZ,y
		bpl	exit_dosun
super_dossun

	;;;;	lda	#effect_crash+effect_mycrash
	;;;;	and	#(effect_mycrash^0ffffh)


		lda	<_effect_flag,x
		ora	#effect_dosun
		sta	<_effect_flag,x

		stz	<steering_angle,x	; ハンドルを０にする
		stz	<_velocityX,x		; スピードを０にする
		stz	<_velocityY,x
		lda	#7000h
		sta	<_hit_timer,x
		lda	#2
		sta	<_dmindex,x

		rts

exit_dosun	lda	!map_number
		cmp	#5
		bne	exit$
		jsr	nomal_mirror
		txy			; y = kart index
		jsr	spin_hit
		rts
exit$	
		jsr	Out_spin
		jsr	nomal_mirror
		rts
;- - - - - - - - - - - - - - - - - - - - - - - - -
;土管に当たった
;- - - - - - - - - - - - - - - - - - - - - - - - -
		ext	Spin_kabe
ch_dokan
;						; 横当たり check
		tax
		and	#0100h
		jsl	>sound_my_dokan

		jsr	Out_spin

		lda	!_posH_A,y
		cpx	#player_r0
		beq	skip$
		lda	!_posH_B,y
skip$
skip0$		clc
		adc	#0080h
		bpl	skip1$
		cmp	#-rebound_size
		bcs	nomal$
		lda	#rebound_angle
		bra	skip2$
skip1$		cmp	#rebound_size
		bcc	nomal$	
		lda	#-rebound_angle
skip2$		clc
		adc	<_vFangle,x
		sta	<angle
		lda	<_vF,x
		cmp	#100h
		bcc	skip3$
		lsr	a			; スピード半減
skip3$		sta	<speed
side$		jmp	speed_vxvy		; 横当たり
nomal$		jmp	nomal_mirror		; ダイレクトヒット

;- - - - - - - - - - - - - - - - - - - - - - - - -
;チョロプーに当たった！
;- - - - - - - - - - - - - - - - - - - - - - - - -
ch_poo		tax

		jsr	Out_spin

		stz	<_velocityX,x
		stz	<_velocityY,x
		tya
		ora	#8000h
		sta	<_poo_status,x
;
		tyx
		lda	#8000h
		ora	<_pole_status,x
		sta	<_pole_status,x
;
		rts

;- - - - - - - - - - - - - - - - - - - - - - - - -
;パックン,プクプク,に当たった！
;- - - - - - - - - - - - - - - - - - - - - - - - -
ch_puku
ch_pack		tax
;- - - - - - - - - - - - - - - - - - - -
		lda	!_posH_A,y	; 障害の位置チェック
		cpx	#player_r0
		bne	skip$
		lda	!_posH_B,y
skip$		clc
		adc	#0080h
;- - - - - - - - - - - - - - - - - - - -
		bpl	skip_1$
		lda	#2000h		; 右にとばされる.
		bra	skip_2$
skip_1$		lda	#-2000h		; 左にとばされる.
skip_2$		clc
		adc	<_vFangle,x
		sta	<angle
		lda	<_vF,x
		cmp	#180h		; 180h
		bcs	skip_3$
		lda	#180h		; 180h
skip_3$		sta	<speed
		jsr	speed_vxvy
		lda	#OIL_spin
		ora	<kart_status,x
		sta	<kart_status,x
		rts

;- - - - - - - - - - - - - - - - - - - - - - - - - -
	if	0
		tax
		txy
		jsr	spin_hit
		stz	<_velocityX,x
		stz	<_velocityY,x
		ldy	#01000h		
		lda	<_vFangle,x
		jsl	>Move_situation
		rts
	endif
;- - - - - - - - - - - - - - - - - - - - - - - - - -

;--------------------------------------------------------------------
;	スピン
;--------------------------------------------------------------------
Out_spin	lda	<drift_index,x
		cmp	#0ch			; スピン中特殊処理！
		bne	exit$
		lda	<_velocityX,x		; 座標の緊急待避
		EOR	#1111111111111111B
		INC	A
		sta	<_velocityX,x
		lda	<_velocityY,x
		EOR	#1111111111111111B
		INC	A
		sta	<_velocityY,x
		jsl	>Spin_kabe
		lda	#0ffffh			; 衝突スピン
		sta	<_spin_special,x
		lda	#(1000h^0ffffh)
		and	<_flag,x
		sta	<_flag,x		; 衝突した flag
		stz	<_hit_timer,x		; 衝突不能 flag
		pla
exit$		rts
;--------------------------------------------------------------------
		END
