;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³                                                                    ³
;³                 STARFOX II - REVENGE OF PEPPY -                    ³
;³                                                                    ³
;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
;³                                                                    ³
;³ FILE:          VIEWS.ASM                                           ³
;³ AUTHOR:       Takumi Kawagoe                                       ³
;³ DESCRIPTION:  The Camera's strategy                                ³
;³ DATE CREATED: 16-2-93                                              ³
;³                                                                    ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
	INCPUB	views


no_VIEW	equ	0	; dummy

;	al_sbyte1	:Don't use! rotx high
;	al_sbyte2	:Don't use! roty high
;	al_sbyte3	:Don't use! rotz high
;	al_pword1	:timer de tsukau.

;	al_sword1	:see showview.asm
;	al_sword2	:see showview.asm
;	al_sbyte4	:see showview.asm



;work0	equ	twork+0
;work1	equ	twork+2
;work2	equ	twork+4
;work3	equ	twork+6
;work4	equ	twork+8
;work5	equ	twork+10
;work6	equ	twork+12
;work7	equ	twork+14
;work8	equ	twork+16
;work9	equ	twork+18
;work10	equ	twork+20
;work11	equ	twork+22
;work12	equ	twork+24
;work13	equ	twork+26
;work14	equ	twork+28
;work15	equ	twork+30


;X1c	equ	twork+26	;16bit
;Y1c	equ	twork+28	;16bit
;Z1c	equ	twork+30	;16bit

	SHORTA
	LONGI


MAIN_VIEWBRANCH_L	; in	: idX = player's pointer
		;	: exal_viewptr = pointer

	PUSHXYP

;	a8i16
;	lda	demowait
;	beq	.start
;	dec	a
;	sta	demowait
;	jmp	.return

.start	ai16
	ldy	al_sword2,x
	lda	exal_viewstratptr+0,y
	beq	.return

	lda	#.return&0ffffH
	dec	a
	pha
	a8
	lda	exal_viewstratptr+2,y
	pha
	a16
	lda	exal_viewstratptr+0,y
	dec	a
	pha
	a8
	rtl

.return

; clear flag

;	ldy	al_sword2,x
;	lda	exal_VIEWflag2,y
;	and	#exal_VIEWflag2_initial^-1
;	sta	exal_VIEWflag2,y

	PULLXYP
	rtl






;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;-------------------------------------------------------------------;
;                                                                   ;
; Calculates the player's view position                             ;  
;                                                                   ; 
;-------------------------------------------------------------------;
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

	SHORTA
	LONGI

ONFIELD_ARWING_VIEW


	php
	a8i16

	toheap	y,x

;	sp_jmp_playertype	x,ARWING,.on

	pl_jmpnot_ifinthesea	x,.on

;	s_jmp_varZERO		W,seadepth,.on

.off	c_vofsoff		x
	bra	.exitvofs
.on	c_vofson		x

.exitvofs

;	jsl	testview_l


;	jsl	Arwing0_horizon_l

;	lda	BOSSstatus
;	bit	#BOSSstatus_look
;	bne	.BOSS

;	jmp	LOOK_p1
;	jmp	C3dview

;	jsr	ONFIELDArwing0_camera


	jsr	ARWING_CAMERA
	jsl	camrotX_shock_l
	jsr	copy_viewrot
	jsr	copy_viewpos

	jsl	VIEW_CHANGE_l

	jsl	set_hscroll_offset_l

;;;	jsl	makecamerabubble_srou_l

;-------------------------------------------------------------------------------
	jsl	demoview_srou_l


.testonton	LOCAL



	IFEQ	1

	pl_jmpnot_ifenter	x,.enter

	toheap	y,x

	s_copy_alvar2var	W,y,x1,exal_enterposx
	s_copy_alvar2var	W,y,z1,exal_enterposz

	ldy	#viewblk1

	s_copy_pos	y,x
	s_set_alvar	W,y,al_worldy,#-100

	s_set_alvar	W,y,al_worldz,#0	;z1
	s_set_alvar	W,y,al_worldx,#0	;x1

	s_add_alvar	W,y,al_worldz,#0
	s_add_alvar	W,y,al_worldx,#-90

.enter	c_calc_lookangle	W,x,work0,work1,#0,#0,#0

	a16
	lda	work0
	asra
	sta	work0
	asra
	clc
	adc	work0
	sta	work0
	a8

	s_set_alvar	W,y,al_rotx,work0
	s_set_alvar	W,y,al_roty,work1

.notenter

	ENDC

;-------------------------------------------------------------------------------


	plp
	rts


;INSPACE_ARMER_VIEW


COSMO_ARWING_VIEW

	php
	a8i16

	c_vofson	x

;	s_jmpNOT_alsflag	x,sflag6,.nokamitsuki
;	c_view_inbetween	x,on
;	jmp			.exit

.nokamitsuki

	jsr	ARWING_CAMERA
	jsl	camrotX_shock_l
	jsr	copy_viewrot
	jsr	copy_viewpos
	jsl	VIEW_CHANGE_l

	jsl	set_hscroll_offset_l
	jsl	set_vscroll_offset_l

.exit
	jsl	demoview_srou_l

	plp
	rts
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;DEMO                                                         ³
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

;DEMO_AWDEAD_0_0_VIEW
;
;	php
;	a8i16
;
;	c_vofson	x
;
;	jsl	Arwing0_horizon_l
;	jsr	DEMO_AWDEAD_0_0_camera
;	jsr	copy_viewrot
;	jsr	copy_viewpos
;	jsl	VIEW_CHANGE_l
;
;	plp
;	rts
;


;DEMO_BATTLESTART_0_0_VIEW
;
;	php
;	a8i16
;
;	c_vofson	x
;
;	jsl	Arwing0_horizon_l
;	jsr	DEMO_BATTLESTART_0_0_camera
;	jsr	copy_viewrot
;	jsr	copy_viewpos
;;	jsl	VIEW_CHANGE_l
;
;	plp
;	rts



;TEST_DUEL_VIEW
;
;	php
;	a8i16
;
;	c_vofson	x
;
;	jsl	Arwing0_horizon_l
;	jsr	DEMO_BOSS_camera
;	jsr	copy_viewrot
;	jsr	copy_viewpos
;;	jsl	Arwing0_horizon_l
;
;;	s_jmpNOT_varAND		B,BOSSstatus,#BOSSstatus_demoend,.exit
;;	c_set_viewstrat		x,SPIN_ARWING
;
;.exit
;	plp
;	rts


;LOOK_P1
;
;	c_vofson	x
;
;	pl_ldy_viewblk	x
;
;	phx
;
;	s_set_objtobeplayer1	x
;	s_set_alvar		W,y,al_rotx,#-20
;	s_set_alvar		W,y,al_roty,#0
;	s_set_alvar		W,y,al_rotz,#0
;	s_add_roffs2pos		B,y,x,y,#-3,#-12,#-25,1,1,0,2,2,2
;	jmp			.exit
;
;.exit	plx
;
;	s_set_alvar		W,y,al_sword1,#0
;
;	jsl	Arwing0_horizon_l
;	plp
;	rts





	IFEQ	1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
C3Dview
	phx
	pl_ldy_viewblk		x
	s_jmpNOT_alsflag		x,player2,.p1
.p2	s_set_alvar	W,y,al_rotx,#0
	s_set_alvar	W,y,al_roty,#80H
	s_set_alvar	W,y,al_rotz,#0
	PHX
	s_set_objtobeplayer1	x
	c_add_roffs2pos16	W,y,x,y,#-3,#-30,#-150,1,1,0	;,2,2,2
	PLX
	bra			.pp
.p1	PHX
	ldx			#viewblk2
	s_copy_pos		y,x
	s_set_alvar	W,y,al_rotx,#0
	s_set_alvar	W,y,al_roty,#-80H
	s_set_alvar	W,y,al_rotz,#0
	s_add_alvar		W,y,al_worldx,#3
;	s_set_objtobeplayer2	x
;	c_add_roffs2pos16	W,y,x,y,#3,#-30,#-150,1,1,0	;,2,2,2
	PLX
.pp	pl_ldy_viewblk	x
;	PHY
;**************************************************
;
;	s_set_objtobeplayer1	x
;	ldy		dummyobj
;	s_copy_pos	y,x
;
;	PLY
;
;	s_exg_objs
;
;	s_obj2obj_3dangle	x,y,al_roty,al_rotx,0
;
;	a16
;	lda		al_roty,x
;	xba
;	and		#0ff00H
;	nega
;	sta		al_roty,x
;	a8
;
;**************************************************
;	s_pull_obj	x
	plx
	plp
	rts
	s_set_var	B,work0,#0
	s_jmpNOT_alsflag	x,player2,.ppp
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
	ENDC


	IFEQ	1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	testjoypad	X,pcont
	beq		.noX
	s_Fchase_var	B,LOOKdis,#127,1
.noX	testjoypad	B,pcont
	beq		.noB
	s_Fchase_var	B,LOOKdis,#0,1
.noB	lda		LOOKdis
;	printb	1,2
	testjoypad	tleft,pcont
	beq		.noL
	s_Fchase_var	B,EYEdis,#100,1
.noL	testjoypad	tright,pcont
	beq		.noR
	s_Fchase_var	B,EYEdis,#0,1
.noR	s_set_var	B,EYEdis,#0
	lda		EYEdis
;	printb	1,3
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

	ENDC


	IFEQ	1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	s_set_var	B,work0,#80H
.ppp	pl_ldy_viewblk	x
	s_push_obj	x
	s_set_objtobeplayer2	x
	s_copy_pos	y,x
;;**************************************************
	s_push_obj	x
	s_push_obj	y
	ldy		dummyobj
	s_copy_pos	y,x
	s_copy_rots	y,x
;	s_add_roffs2pos	B,y,x,x,#0,#0,LOOKdis,1,1,0,1,1,1
	s_add_roffs2pos	B,y,x,x,#0,#0,#100,1,1,0,1,1,1
	s_pull_obj	y
	s_pull_obj	x
;**************************************************
;**************************************************
	s_set_alvar	B,y,al_rotx,#0
	s_set_alvar	B,y,al_roty,#0
	s_set_alvar	W,y,al_rotz,#0
	s_copy_alvar2alvar	B,y,al_rotx+1,x,al_rotx
	s_copy_alvar2alvar	B,y,al_roty+1,x,al_roty
	s_neg_alvar		W,y,al_rotx
	s_neg_alvar		W,y,al_roty
	s_jmp_varZERO	B,work0,.lll2
.lll1
;	s_copy_var2var	B,work1,EYEdis
;	s_neg_var	B,work1
	a16
	lda		EYEdis
	and	#0ffH
	nega
	sta	work1
	A8
;	c_add_roffs2pos16	W,y,x,x,work1,#-30,#-150,1,1,0	;,2,2,2
	c_add_roffs2pos16	W,y,x,x,#-3,#-30,#-150,1,1,0	;,2,2,2
	jmp	.kkk
.lll2
;	s_copy_var2var	B,work1,EYEdis
	a16
	lda		EYEdis
	and	#0ffH
	sta	work1
	A8
;	c_add_roffs2pos16	W,y,x,x,work1,#-30,#-150,1,1,0	;,2,2,2
	c_add_roffs2pos16	W,y,x,x,#3,#-30,#-150,1,1,0	;,2,2,2
.kkk
;**************************************************
	s_push_obj	x
	s_push_obj	y
	tyx
	ldy		dummyobj
	s_obj2obj_3dangle	x,y,al_roty,al_rotx,0
	a16
	lda		al_roty,x
	xba
	and		#0ff00H
	nega
	sta		al_roty,x
	a8
	s_pull_obj	y
	s_pull_obj	x
;**************************************************
	s_pull_obj	x
	plp
	rts
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
	ENDC


;-------------------------------------------------------------------
;-------------------------------------------------------------------
	SHORTA
	LONGI

IM_SUBMARINE_VIEW

ONFIELD_ROBO_VIEW

	php

	a8i16

;	s_jmp_varZERO	W,seadepth,.on

	pl_jmpnot_ifinthesea	x,.on

.off	c_vofsoff	x
	bra	.exitvofs
.on	c_vofson	x
.exitvofs

;*********************************************
;	jsl	testview_l
;	plp
;	rts
;*********************************************


	;jmp	LOOK_p1


	;plp
	;rtl

;	jmp	C3dview

;	jsl	Arwing0_horizon_l

	jsl	VIEW_CHANGE_l
	jsr	ROBOT_CAMERA
	jsl	camrotX_shock_l

	jsl	blockmap_cam_srou_l

	jsr	copy_viewrot
	jsr	copy_viewpos
	jsl	demoview_srou_l

	plp
	rts

;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;-------------------------------------------------------------------;
;                                                                   ;
; TEST VIEW
;                                                                   ; 
;-------------------------------------------------------------------;
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

	SHORTA
	LONGI
testview_l

	IFEQ	1

	phx
	phy
	php

	a8
	lda.l	seavscroll_buf+0
;	printh	data1_0,kawagoe
	a16
	lda.l	seavscroll_buf+1
;	printh	data1_1,kawagoe

	a8
	lda.l	seavscroll_buf+3
;	printh	data2_0,kawagoe
	a16
	lda.l	seavscroll_buf+4
;	printh	data2_1,kawagoe

	a8
	lda.l	seavscroll_buf+6
;	printh	data3_0,kawagoe
	a16
	lda.l	seavscroll_buf+7
;	printh	data3_1,kawagoe
	a8

	a8
	lda.l	seavscroll_buf+9
;	printh	data4_0,kawagoe
	a16
	lda.l	seavscroll_buf+10
;	printh	data4_1,kawagoe
	a8

	a8
	lda.l	seavscroll_buf+12
;	printh	data5_0,kawagoe

	a8
	lda.l	seavscroll_buf+15
;	printh	data6_0,kawagoe


	a8
	lda.l	seavscroll_buf+18
;	printh	enddata_0,kawagoe


	c_vofsoff	x

	pl_ldy_viewblk	x


.up	testjoypad	up,pcont
	beq		.dw
	s_sub_alvar	B,y,al_rotx+1,#3

.dw	testjoypad	down,pcont
	beq		.left
	s_add_alvar	B,y,al_rotx+1,#3

.left	testjoypad	left,pcont
	beq		.right
	s_sub_alvar	B,y,al_roty+1,#3

.right	testjoypad	right,pcont
	beq		.noudlr
	s_add_alvar	B,y,al_roty+1,#3

.noudlr
	s_set_alvar	B,y,al_vel,#0

.x	testjoypad	x,pcont
	beq		.b
	s_add_alvar	W,y,al_worldy,#-20
	bra		.setvec

.b	testjoypad	b,pcont
	beq		.y
	s_add_alvar	W,y,al_worldy,#20
	bra		.setvec

.y	testjoypad	y,pcont
	beq		.a
	s_set_alvar	B,y,al_vel,#20
	bra		.setvec

.a	testjoypad	a,pcont
	beq		.setvec
	s_set_alvar	B,y,al_vel,#-20


.setvec
	phx

	tyx

	s_copy_alvar2alvar	B,x,al_rotx,x,al_rotx+1
	s_copy_alvar2alvar	B,x,al_roty,x,al_roty+1
	s_copy_alvar2alvar	B,x,al_rotz,x,al_rotz+1

	s_neg_alvar	B,y,al_rotx
	s_neg_alvar	B,y,al_roty
	s_neg_alvar	B,y,al_rotz

	s_gen_3Dvecs	x,al_roty,al_rotx,al_vel
	s_add_vecs2pos	x

	s_set_alvar	B,y,al_rotx,#0
	s_set_alvar	B,y,al_rotx,#0
	s_set_alvar	B,y,al_rotx,#0

	plx

	plp
	ply
	plx

	ENDC

	rtl

;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;-------------------------------------------------------------------;
;                                                                   ;
; Calculates the player's view position                             ;  
;                                                                   ; 
;-------------------------------------------------------------------;
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
	SHORTA
	LONGI

ROBOT_CAMERA

	s_start_strat


	PUSHXYP

	a8i16


	toheap			y,x

;-------------------------------------------------------------------------
; -- copy rot x,y,z into view --

	s_push_obj		y
; - rotx -

; - roty -

	s_copy_alvar2var	W,y,work0,exal_roty
	s_neg_var		W,work0
	s_set_alvar		W,y,exal_camroty,work0
	s_sub_alvars		W,y,exal_camroty,y,exal_camrotyofs
	s_Fchase_alvar		W,y,exal_camrotyofs,#0,100H

; noturn mode no offset(arwing de tsukau)

	s_achase_alvar		W,y,exal_camrotyofsNT,#0,3

; - rotz -
	s_achase_alvar		W,y,exal_camrotz,#0,1
	s_pull_obj		y

;-------------------------------------------------------------------------
; -- copy world x,y,z into view --

	s_copy_alvar2var	W,y,X1c,exal_worldx
	s_copy_alvar2var	W,y,Y1c,exal_worldy
	s_copy_alvar2var	W,y,Z1c,exal_worldz

	s_set_var		W,work1,#0
	jsr			set_camera_worldz_offset
	jsr			set_camera_worldx_offset

	s_set_alvar		W,y,exal_camworldx,X1c
	s_set_alvar		W,y,exal_camworldz,Z1c


;--------------------------------------------------------------------------------------
	pl_jmpnot_iftransrising	x,.p_height

	s_achase_alvar2alvar	W,y,exal_camworldy,x,al_worldy,2

	jmp	.exit

;--------------------------------------------------------------------------------------
; SET WORLDY

; Y offset (normal mode)

.p_height
;--------------------------------------------------------------------------------------
; cockpit mode

	pl_jmpNOT_ifcockpit	x,.transWY

.cockWY	s_copy_alvar2var	W,x,work0,al_worldy

	jmp			.set2
;--------------------------------------------------------------------------------------

.transWY	pl_jmp_iftransform	x,.cockWY

;--------------------------------------------------------------------------------------
; not cockpit mode

.normWY	s_set_var		W,work0,#0

;--------------------------------------------------------------------------------------
; trans falling

	pl_jmpnot_iftransfalling	x,.nottransfalling

	pl_jmp_ifonthe	x,water,.transfall_marine

.transfall_ground

	s_achase_alvar2alvar	W,y,exal_camworldy,x,al_worldy,1
	jmp			.exit

.transfall_marine

	s_achase_alvar2alvar	W,y,exal_camworldy,x,al_worldy,3
	jmp			.exit

.nottransfalling

;--------------------------------------------------------------------------------------
; normal mode

	pl_jmp_ifinthesea	x,.marine

	pl_jmp_UEpool		x,.pool

	pl_test_planetmode	marine
	rlbne			.ground

	rb_jmp_ifonshape	x,.ground

;--------------------------------------------------------------------------------------

.marine
	s_achase_alvar2alvar	W,y,exal_camworldy,y,exal_bodyworldy,2

	jmp		.exit

;--------------------------------------------------------------------------------------

.ground
	s_copy_alvar2var	W,y,work0,exal_getheight_WY
	s_varadd_alvar		W,y,work0,exal_pooldepth

	s_jmp_alvarZERO		W,x,al_slopeptr,.stest
	s_add_var		W,work0,#slopeyofs
.stest

	jmp	.set

;--------------------------------------------------------------------------------------

.pool
	s_copy_alvar2var	W,y,work0,exal_pooldepth
	s_sub_var		W,work0,#RBcameraYofs>>1

	s_jmp_alvarZERO		W,x,al_slopeptr,.stest2
	s_add_var		W,work0,#slopeyofs
.stest2

	bra	.set2

;--------------------------------------------------------------------------------------
.set
	sm_jmp_if2screen	.set_2

	s_sub_var		W,work0,#RBcameraYofs
	bra			.set2
.set_2	s_sub_var		W,work0,#RBcameraYofs_2	; battle mode

.set2

;********************************************************************

	s_copy_var2var		W,x1,work0		;chase value
	s_copy_alvar2var	W,y,x2,exal_camworldy	;current value
	s_copy_var2var		W,x3,#50		;limitter

	jsl			ACHASElimit_srou_l

	s_copy_var2var		W,work0,x2

;********************************************************************




;testtest
	s_achase_alvar		W,y,exal_camworldy,work0,3	;2
	bra			.exit

	pl_jmp_ifjmp		x,.set2
	s_achase_alvar2alvar	W,y,exal_camworldy,x,al_worldy,2

;--------------------------------------------------------------------------------------

.exit

	IFEQ	1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; -- clamp pros.(tunnel mode) --
	jsr		copyviewpos2dummy
	s_push_obj	x
	ldx		dummyobj
	jsl		getheight_l
	s_jmp_alvarless	W,y,exal_camworldy,y1,.nc0
;	s_jmp_alvarNE	B,x,al_slopetype,#st_wall,.nc0
	jsl		clamptoside_l
	s_add_alvar	W,y,exal_camworldx,x1
	s_add_alvar	W,y,exal_camworldz,z1
;	lda		al_slopetype,x
;	printh		CAMSLOPETYPE,kawagoe
.nc0	s_pull_obj	x
.noclamp
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
	ENDC



	PULLXYP

	rts

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

RB_CAMROTX_l			; set camera rotation x

	s_start_strat

	PUSHYP

	a8i16

	toheap		y,x

;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ set "look y offset" ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

.crxground	s_set_var	W,work1,#5	; Yofs chase rate

;-----------------------------------------------------------------------------
; force flag on(path de set suru) ?

	s_jmpnot_alvarAND	B,y,exal_VIEWflag3,#exal_VIEWflag3_forcelookyofs,.do

	jmp	.n

;	a16
;	lda	exal_camlookyofs,y
;	cmp	exal_camlookYofs_ext,y
;	a8
;	bcc	.do
;
;	testjoypad	X,pcont
;	rlbeq		.n

;-----------------------------------------------------------------------------
.do
	testjoypad	X,pcont
	rlbeq		.nopushX
.doit
;-----------------------------------------------------------------------------
.u	testjoypad	UP,ptrig
	beq		.ucont
	s_or_alvar	B,y,exal_VIEWflag,#exal_VIEWflag_RBtrigX

.ucont	testjoypad	UP,pcont
	beq		.d

	s_and_alvar	B,y,exal_VIEWflag3,#exal_VIEWflag3_forcelookyofs^-1

	sm_jmp_if2screen	.ofs_U_2

.ofs_U_1	s_set_var	W,work0,#RBcameralookYofs_U
	jmp		.Fc
.ofs_U_2	s_set_var	W,work0,#RBcameralookYofs_U_2
	jmp		.Fc

;-----------------------------------------------------------------------------
.d	testjoypad	DOWN,ptrig
	beq		.dcont
	s_or_alvar	B,y,exal_VIEWflag,#exal_VIEWflag_RBtrigX

.dcont	testjoypad	DOWN,pcont
	beq		.n2

	s_and_alvar	B,y,exal_VIEWflag3,#exal_VIEWflag3_forcelookyofs^-1

	sm_jmp_if2screen	.ofs_D_2

.ofs_D_1	s_set_var	W,work0,#RBcameralookYofs
	bra		.Fc
.ofs_D_2	s_set_var	W,work0,#RBcameralookYofs_2
	bra		.Fc

;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
.n
	s_set_var	W,work1,#3

.n2	sm_jmp_if2screen	.n2_2

	a16
	lda	#RBcameralookYofs_no
	bra	.n2_3
.n2_2	a16
	lda	#RBcameralookYofs_no_2
.n2_3	sta	work0
	a8

;-----------------------------------------------------------------------------
; BOSS mode tokade,path kara Y offset wo set sitatoki....

	s_varadd_alvar	W,y,work0,exal_camlookyofs_ext

;-----------------------------------------------------------------------------

.Fc	sm_Fchase_alvar	W,y,exal_camlookYofs,work0,work1	;5

	bra			.setYofs

.nopushX	s_and_alvar		B,y,exal_VIEWflag,#(exal_VIEWflag_RBpushX!exal_VIEWflag_RBtrigX)^-1

.setYofs	s_copy_alvar2var	W,y,work0,exal_camlookYofs
	s_varsub_alvar		W,y,work0,exal_camYofs_normal
	s_set_var		W,work1,#100

.skip0

;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ calc angle  camera --> point ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

.look
	c_calc_lookangle	W,x,work0,work1,#0,work0,work1

.skip2	toheap		y,x

.max
	lda		work0+1
	bmi		.min
	s_jmp_varLESS	B,work0+1,#onfield_RBCAMmaxrotX,.crx
	bra			.crx

.min
	lda		work0+1
	bpl		.crx
	s_jmp_varMORE	B,work0+1,#onfield_RBCAMminrotX,.crx

.crx
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
	pl_test_planetmode	marine
	bne			.ground
	pl_jmpnot_ifonthe	x,water,.ground
;-----------------------------------------------------------------------------
.marine
	a8
	pl_jmpnot_iftransfalling	x,.inmarine
	s_jmp_varPL	W,work0,.walkshake
.inmarine	s_achase_alvar	W,y,exal_camrotx,work0,1
	bra		.walkshake

;-----------------------------------------------------------------------------
.ground
	pl_jmp_iffloating	x,.skip6,y
	pl_jmpNOT_ifjmp		x,.skip6

	a16
	lda.w		exal_camworldy,y
	sec
	sbc		al_worldy,x
	bra		.walkshake

.skip6	a8
	s_achase_alvar	W,y,exal_camrotx,work0,1

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; -- walk --
.walkshake	a8


	pl_jmp_ASHIinpool	x,.jjjj
;	pl_jmp_ifonthepool	x,.jjjj

	pl_jmpNOT_ifjmp		x,.do2
.jjjj	s_set_var	W,work0,#0


	lda	gameframe
;	printb	frame,kawagoe


	bra		.addws

.do2	phx

	lda		#0
	xba

	lda		al_animframe,x
	and		#127
	tax

	lda.l	.data,x

	plx
	sta	work0
	lda	#0
	sta	work0+1


	s_copy_alvar2var	W,y,work1,exal_camRotXofs

	s_achase_var		W,work0,work1,3

.addws
	s_set_alvar	W,y,exal_camRotXofs,work0
	s_add_alvars	W,y,exal_camrotx,y,exal_camRotXofs


.crxexit

	PULLYP


	rtl

.data
	DB	80H
	DB	80H
	DB	0
	DB	0

	DB	0
	DB	0
	DB	80H
	DB	80H

	DB	80H
	DB	80H
	DB	0
	DB	0

	DB	0
	DB	0
	DB	80H
	DB	80H



;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;-------------------------------------------------------------------
;              DEMO CAMERA
;-------------------------------------------------------------------
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;DEMO_AWCLEAR_0_0_camera
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

	IFEQ	1
;alvars of viewblk
;	al_stratstate	:state
;	al_pword1	:time counter
;	al_pbyte1	;roty temp
;	al_pbyte2	;worldz offset
aw00state0wait	equ	50
aw00state2wait	equ	90
	phx
	phy
	php
	a8i16
	s_set_alvar	W,x,al_sword1,#0
	sm_jmp_if2screen	.dop2
	s_jmp_alsflag	x,player2,.exit
.dop2
; world x y z
	pl_ldy_viewblk		x
;---------------------------------------------------------------------------------
.state0	; wait mode
	s_jmp_IFNOTstate	y,0,.state1
	s_add_roffs2pos		B,y,x,x,#0,#0,#-(cameraZ_offset_normal>>2),0,1,0,1,1,1
	c_inc_timer		y
	c_jmp_timerNE		y,#aw00state0wait,.exit_state0
	c_set_timer		y,#0
	s_next_state		y
	c_view_inbetween	x,on
.exit_state0
;---------------------------------------------------------------------------------
.state1	s_jmp_IFNOTstate	y,1,.state2
	s_copy_alvar2var	B,y,work0,al_pbyte2
	s_push_obj		y
	ldy			dummyobj
	s_add_roffs2pos		B,y,x,x,#30,#30,work0,0,1,0,1,1,1
	s_pull_obj		y
; dummy pos --> camera pos
	s_push_obj		x
	ldx			dummyobj
	s_copy_alvar2alvar	W,y,al_worldx,x,al_worldx
	s_copy_alvar2alvar	W,y,al_worldz,x,al_worldz
	s_achase_alvar2alvar	W,y,al_worldy,x,al_worldy,2
	s_pull_obj		x

	s_add_alvar		B,y,al_pbyte2,#3
	s_jmp_alvarMI		B,y,al_pbyte2,.exit_state1
	s_jmp_alvarLESS		B,y,al_pbyte2,#50,.exit_state1

	s_next_state		y
	c_set_timer		y,#0

	s_push_obj		y
	ldy			al_sword2,x
	s_copy_alvar2alvar	W,y,exal_vx,x,al_vx
	s_copy_alvar2alvar	W,y,exal_vz,x,al_vz
	s_pull_obj		y

.exit_state1
;---------------------------------------------------------------------------------
.state2

	pl_ldy_viewblk		x
	s_jmp_IFNOTstate	y,2,.state3

	s_push_obj	y
	ldy			al_sword2,x
	s_copy_alvar2var	W,y,work0,exal_vx
	s_copy_alvar2var	W,y,work1,exal_vz
	s_pull_obj	y


;*******************************************************
	s_push_obj	x
	s_push_obj	y

	txy

	ldx			dummyobj
	s_copy_rots		x,y
	s_set_alvar		B,x,al_vel,#35	;speed
	s_gen_3Dvecs		x,al_roty,al_rotx,al_vel
	s_copy_alvar2var	W,x,x1,al_vx
	s_copy_alvar2var	W,x,y1,al_vy
	s_copy_alvar2var	W,x,z1,al_vz
	s_pull_obj	y
	s_pull_obj	x

	s_add_alvar		W,y,al_worldx,x1
	s_add_alvar		W,y,al_worldy,y1
	s_add_alvar		W,y,al_worldz,z1
;*******************************************************

;	s_jmp_alvarNE	W,y,al_pword1,#aw00state2wait,.state2_1
	c_jmp_timerNE	y,#aw00state2wait,.state2_1


	s_jmp_alsflag	x,player2,.state2_p2
.state2_p1	s_or_var	B,p1_status,#p1_status_gameend
	jmp		.exit	;state3
.state2_p2	s_or_var	B,p2_status,#p2_status_gameend
	jmp		.exit	;state3

.state2_1
	c_inc_timer	y

;---------------------------------------------------------------------------------
.state3
; rot x y z


	pl_ldy_viewblk	x
	jsr			calc_lookobj_crou

	ldy			al_sword2,x
	s_achase_alvar		W,y,exal_camrotx,work0,5
	s_set_alvar		W,y,exal_camroty,work1
	s_achase_alvar		W,y,exal_camrotz,#0,3

	pl_ldy_viewblk	x

; add float

	s_push_obj	x
	s_push_obj	y
	ldy		al_sword2,x
	s_pull_obj	x
	s_add_alvars	W,x,al_worldx,y,exal_worldyoffset
	s_pull_obj	x


.exit_state3
.exit	plp
	ply
	plx

	ENDC
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

;	rts


;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;-------------------------------------------------------------------;
;            ---- COSMO MODE ----                                   ;
; Calculates the Arwing's camera position                           ;  
;                                                                   ; 
;-------------------------------------------------------------------;
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

ARWING_CAMERA

	s_start_strat

	PUSHYP

	a8i16

	toheap	y,x

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; -- copy x,y,z into view --

	s_copy_alvar2var	W,x,X1c,al_worldx
	s_copy_alvar2var	W,x,Y1c,al_worldy
	s_copy_alvar2var	W,x,Z1c,al_worldz

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; -- set camera view offset Y1c --

	sp_jmp_playertype	x,ufo,.armercamyofs

.arwingcamyofs
	jsr			set_camera_worldy_offset4	;aw
	bra			.nocamyofs
.armercamyofs
	jsr			set_camera_worldy_offset5	;am
.nocamyofs
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; -- set camera view offset Y1c --

	jsr			set_camera_worldz_offset

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; -- set camera view offset Y1c --

;	sp_jmp_playertype	x,UFO,.endxofs
;	s_set_var		W,work1,#cameraX_offset
	jsr			set_camera_worldx_offset
.endxofs
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; -- set worldX,Y,Z --


; -- check y limit (seadepth)--


.nolimitY

	s_copy_alvar2var	W,y,work4,exal_worldyoffset ; (=shake)

	s_add_var		W,Y1c,work4
	s_set_alvar		W,y,exal_camworldy,Y1c
	s_set_alvar		W,y,exal_camworldx,X1c
	s_set_alvar		W,y,exal_camworldz,Z1c

	jsr	cam_boost_zofs_srou

.camrot
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;-- camera rotx ---

	sp_jmp_playertype	x,ufo,.armercamrotx,y

.arwingcamrotx

	c_jmp_viewstratEQ	x,COSMO_ARWING,.COSMO,y

.onfield	jsr	OF_CAMROTX
	bra	.nocamrotx

.cosmo	jsr	CS_CAMROTX
	bra	.nocamrotx

.armercamrotx

	s_achase_alvar	W,y,exal_camrotx,#0,3

.nocamrotx
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

;-- camera roty ---

	pl_jmp_ifturn	x,.crotynormal

;-----------------------------------------------------------------------------
;[1 tunnel mode]

	s_set_var	W,work0,#0

	pl_jmpnot_ifcockpit	x,.notcock,y
	s_jmp_ABSalvarless	W,y,exal_rotyoffset,#16*256,.notrot

	a16
	lda	exal_rotyoffset,y
	asra
	asra
	jmp	.setyofs2



.notcock	SHORTA
	pl_jmp_ifturn	x,.SF2,y

.SF1	a16
	lda	#camerax_offset_SF1-10
	bra	.setofs

.SF2	a16
	lda	#camerax_offset_SF2-10

.setofs	sta	x1
	nega
	sta	x2

	lda	exal_camXofs,y
	bmi	.tlmi
.tlpl	cmp	x1	;#cameraX_offset
	bcc	.notrot
	a8
	testjoypad	left,pcont
	beq		.notrot
	bra	.setyofs

.tlmi	LONGA
	cmp	x2	;#-cameraX_offset
	bcs	.notrot
	a8
	testjoypad	right,pcont
	beq		.notrot

.setyofs	a16
	lda	exal_rotyoffset,y
	asra
	asra
	sta	tpy
	asra
	clc
	adc	tpy
.setyofs2	nega
	sta	work0
	a8

.notrot	s_Fchase_alvar		W,y,exal_camrotyofsNT,work0,100H

	bra	.cryn

;-----------------------------------------------------------------------------
;[2 normal mode]
.crotynormal

	s_achase_alvar	W,y,exal_camrotyofsNT,#0,3

.cryn	a16
	lda	exal_roty,y
	nega
	sta	work0
	a8

	s_achase_alvar		W,y,exal_camroty,work0,2

	a16
	lda			work0
	sec
	sbc			exal_camroty,y
	sta			exal_camrotyofs,y
	a8
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;-- camera rotz ---

; transform no toki rotz ha 0 ni suru.

	pl_jmpnot_iftransform	x,.normalrotz
.camrotzoff	a16
	lda			exal_camrotz,y
	adiv2
	sta			exal_camrotz,y
	a8

	jmp			.nocamrotz


.normalrotz	sp_jmp_playertype	x,ufo,.armercamrotz

.arwingcamrotz

	s_copy_alvar2var	B,y,work0+1,exal_inccamrotz
	s_set_var		B,work0+0,#0
	s_Fchase_alvar		W,y,exal_camrotz,work0,100H
	bra			.nocamrotz

.armercamrotz

	s_copy_alvar2var	B,x,work0+1,exal_inccamrotz
	s_set_var		B,work0+0,#0
	s_set_var		B,work0+1,#0
	s_Fchase_alvar		W,x,exal_inccamrotz,work0,100H
	s_achase_alvar		W,x,exal_camrotz,#0,3

.nocamrotz
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; -- clamp pros.(tunnel mode) --

	jsr		copyviewpos2dummy

	s_push_obj	x
	ldx		dummyobj
	jsl		getheight_l
	s_jmp_alvarless	W,y,exal_camworldy,y1,.nc0
	s_jmp_alvarNE	B,x,al_slopetype,#st_wall,.nc0
	jsl		clamptoside_l
	s_add_alvar	W,y,exal_camworldx,x1
	s_add_alvar	W,y,exal_camworldz,z1

;	lda		al_slopetype,x
;	printh		CAMSLOPETYPE,kawagoe


.nc0
	s_pull_obj	x
.noclamp
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

.exit	PULLYP
	rts





;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

; 	calcurate camera rotationXYZ


OF_CAMROTX

; --- set rotation X ---

	phx
	phy
	php

	s_start_strat

	a8i16

	testjoypad		up,pcont
	s_beq			.exit_up

;------------------------------------

; wait camera's moving (uwcm)

	pl_jmp_ifcockpit	x,.uwcm_skip2

	pl_ldy_viewblk		x


	lda		al_worldy,x
	sec
	sbc.w		al_worldy,y
	sta		work0
	bcc			.uwcm_skip4

	pl_abs_var		W,work0


;	test_screenmode		onescreen
;	beq			.twoscreen
	sm_jmp_if2screen	.twoscreen

.onescreen	s_jmp_varMORE		W,work0,#camera_wait_value_1,.uwcm_skip2
	bra			.uwcm_skip4
.twoscreen	s_jmp_varMORE		W,work0,#camera_wait_value,.uwcm_skip2

.uwcm_skip4
	ldy			al_sword2,x
	s_set_alvar		B,y,exal_inccamrotx,#-2
	jmp			.set

.uwcm_skip2
	ldy			al_sword2,x
	s_jmp_alvarAND		B,y,exal_xyzLMT,#exal_xyzLMT_bottom,.no_keys

;check Arwing's limitter

	s_copy_alvar2alvar	B,y,exal_inccamrotx,y,exal_minCrotx

	jmp			.set
.uwcm_skip3

.exit_up
;------------------------------------
;	TM_TESTEXBUTTON		down
	testjoypad		down,pcont
	rlbeq	.no_keys

;------------------------------------

; wait camera's moving (dwcm)


	pl_jmp_ifcockpit	x,.dwcm_skip2

	pl_ldy_viewblk		x

	lda		al_worldy,x
	sec
	sbc.w		al_worldy,y
	sta		work0

	bcs			.dwcm_skip4
	pl_abs_var		W,work0

	s_jmp_varMORE		W,work0,#camera_wait_value,.dwcm_skip2
	s_bra			.dwcm_skip4

.dwcm_skip4
	ldy			al_sword2,x
	s_set_alvar		B,y,exal_inccamrotx,#2
	bra			.dwcm_skip3

.dwcm_skip2
	ldy			al_sword2,x
	s_and_alvar		B,y,exal_updown,#80H^-1
	s_copy_alvar2alvar	B,y,exal_inccamrotx,y,exal_maxCrotx


.dwcm_skip3
	bra	.set
.no_keys
	ldy			al_sword2,x
	s_set_alvar		B,y,exal_inccamrotx,#camrotxmid


.set


;--- camera rotx ---

	ldy			al_sword2,x
	s_copy_alvar2var	B,y,work0+1,exal_inccamrotx
	s_set_var		B,work0+0,#0



	s_jmp_alvarNE		B,y,exal_inccamrotx,#0,.camxinc0

	s_achase_alvar		W,y,exal_camrotx,work0,5
	s_bra	.camxinc1

.camxinc0	s_achase_alvar	W,y,exal_camrotx,work0,4
.camxinc1

;--- camera roty ---

;	s_copy_alvar2var	W,y,work0,exal_roty+1
;	s_neg_var		W,work0
;	s_achase_alvar		B,y,exal_camroty+1,work0,2

;--- camera rotz ---

;	s_Fchase_alvar		W,y,exal_camrotz,inc_camrotz,100H
;	s_Fchase_alvar2alvar	W,x,exal_camrotz,x,exal_inccamrotz,100H


	plp
	ply
	plx
	rts



;------------------------------------------------------------------------------
; 	calcurate camera rotationXYZ
	SHORTA
	LONGI	

;	work0:work RAM

CS_CAMROTX

; --- set rotation X ---

	phx
	phy
	php

	a8i16
	toheap	y,x
	pl_jmp_ifcockpit	x,.cockpit,y

;--------------------------------------------------------------
; --[normal mode]--

	s_set_var	W,work0,#0


; check alt limit

.top	pl_jmpNOT_ifaltLMT	x,top,.btm
	lda	exal_camupdw,y
	bit	#exal_camupdw_up
	beq	.tbout
	lda	exal_maxCrotX,y
	asra
	sta	work0+1
	bra	.dwac

.btm	pl_jmpNOT_ifaltLMT	x,bottom,.tbout
	lda	exal_camupdw,y
	bit	#exal_camupdw_dw
	beq	.tbout
	lda	exal_minCrotX,y
	asra
	sta	work0+1
	bra	.upac
.tbout


.up
	lda	exal_camupdw,y
	and	#exal_camupdw_dwL
	beq	.dw
	s_copy_alvar2var	B,y,work0+1,exal_minCrotX
.upac	s_achase_alvar		W,y,exal_acclcamrotX,#-1c0H,3
	jmp			.ac

.dw
	lda	exal_camupdw,y
	and	#exal_camupdw_upH
	beq	.cknk
	s_copy_alvar2var	B,y,work0+1,exal_maxCrotX
.dwac	s_achase_alvar		W,y,exal_acclcamrotX,#1c0H,3
	jmp			.ac


.cknk
	lda	exal_camupdw,y
	bit	#exal_camupdw_up
	bne	.nkup
	bit	#exal_camupdw_dw
	rlbeq	.nk

.nkdw	s_set_alvar		W,y,exal_acclcamrotX,#-80H
	bra			.nkf
.nkup	s_set_alvar		W,y,exal_acclcamrotX,#80H
.nkf
	s_achase_alvar		W,y,exal_camrotX,#0,3

	jmp			.exit_ccr

;--------------------------------------------------------------
; --[cockpit mode]--

.cockpit	s_set_var		W,work0,#0
	testjoypad		up,pcont
	bne			.cup
	testjoypad		down,pcont
	bne			.cdw
	s_set_var		W,x1,#0
	jmp			.nk

.cup	s_set_var		W,x1,#-200H
	s_set_var		W,work0,#0
	s_copy_alvar2var	B,y,work0+1,exal_minCrotX
	pl_jmp_ifaltLMT		x,bottom,.cudH
	bra			.cudF

.cdw	s_set_var		W,x1,#200H
	s_set_var		W,work0,#0
	s_copy_alvar2var	B,y,work0+1,exal_maxCrotX
	pl_jmpNOT_ifaltLMT	x,top,.cudF

.cudH	a16	;if LMT max=50%
	lda			work0
	asra
	sta			work0
	a8
.cudF	s_Fchase_alvar		W,y,exal_acclcamrotX,x1,80H
	jmp			.ac

;--------------------------------------------------------------

.nk	s_Fchase_alvar		W,y,exal_acclcamrotX,#0,80H
	s_achase_alvar		W,y,exal_camrotX,#0,3	; achase is better
	jmp			.exit_ccr

.ac
	s_copy_alvar2var	W,y,x1,exal_camrotx
	s_varadd_alvar		W,y,x1,exal_acclcamrotx
.brpl
	s_jmp_varLESS		W,x1,#0,.brmi
	s_jmp_varLESS		W,x1,work0,.setadd
	s_bra			.brac
.brmi
	s_jmp_varMORE		W,x1,#0,.skip0
	s_jmp_varMORE		W,x1,work0,.setadd

.brac
	s_achase_alvar		W,y,exal_camrotx,work0,3
	s_bra			.skip0
.setadd	s_set_alvar		W,y,exal_camrotx,x1
	s_bra			.skip0

.skip0

.exit_ccr

.exit	plp
	ply
	plx
	rts

;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;-------------------------------------------------------------------;
;                                                                   ;
; Set camera world x offset                                         ;  
;                                                                   ; 
;-------------------------------------------------------------------;
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

set_camera_worldx_offset	; in : work1 (offset value)

;camofs_acclmax	equ	5
;camofs_acclincrate	equ	1

	s_start_strat

	PUSHYP

	a8i16

	toheap	y,x


;	a16
;	lda	exal_camxofs,y
;	printh	xofs,kawagoe
;	lda	exal_camxofsbuf,y
;	printh	xofsBB,kawagoe
;	a8



	sp_jmp_playertype	x,ARWING,.ARWING

;---------------------------------------------------------------------------
.ROBOT

;	pl_jmp_ifturn	x,.RBturn
;
;off	a16
;	lda	al_mx,x
;	nega
;	sta	exal_sidevel,y
;	a8
;	bra	.ARWING


	lda	exal_blockmapstatus,y
	bit	#exal_blockmapstatus_Lout!exal_blockmapstatus_Rout
	rlbne	.blockLR


.RBturn	pl_jmp_iftransfalling	x,.addofs,y
	s_achase_alvar	W,y,exal_camXofs,#0,3
	s_set_alvar	W,y,exal_acclcamXofs,#0
	s_set_alvar	W,y,exal_camxofsbuf,#0
	jmp		.addofs

;---------------------------------------------------------------------------
.ARWING

;cockpit mode

	pl_jmpNOT_ifcockpit	x,.notcock,y
	s_achase_alvar		W,y,exal_camXofs,#0,2
	s_set_var		W,work0,#0
	jmp	.inside

.notcock
;---------------------------------------------------------------------
;set camera offset x(MAX,MIN)

	pl_jmpnot_ifturn	x,.calcofs,y

;---------------------------------------------------------------------

.ck_tLR
	pl_jmp_notLRKEYdown	pcont,.no_tLR

	s_Fchase_alvar	W,y,exal_camxofsbuf,#0,10

	jmp		.acxofs

.no_tLR

;---------------------------------------------------------------------
.calcofs


; blockmap 


	lda	exal_blockmapstatus,y
	bit	#exal_blockmapstatus_Lout!exal_blockmapstatus_Rout
	beq	.noblock

.blockLR	a16
	bit	#exal_blockmapstatus_Lout
	bne	.blockR
.blockL	lda	#-20
	bra	.block
.blockR	lda	#20
.block	sta	tpx
	a8
	bra	.cktype


.noblock	s_copy_alvar2var	W,y,tpx,exal_sidevel

.cktype	sp_jmp_playertype	x,ROBOT,.ccRB,y
	pl_jmpnot_ifturn	x,.ccAW_SF1,y


;.ccAW_SF2	a16
;	lda	#camerax_offset_SF2
;	sta	x1
;	lda	#-camerax_offset_SF2
;	bra	.cc

.ccAW_SF1	a16
	lda	#camerax_offset_SF1
	sta	x1
	lda	#-camerax_offset_SF1
	bra	.cc

.ccRB	a16
	lda	#80	;camerax_offsetRB
	sta	x1
	lda	#-80	;camerax_offsetRB
.cc	sta	x2

	lda		tpx
	clc
	adc		exal_camxofsbuf,y
	bmi		.mi
.pl	cmp		x1	; max value
 	bcc		.setxofs
	lda		x1	;
	bra		.setxofs
.mi	cmp		x2	; min value
	bcs		.setxofs
	lda		x2	;
.setxofs	sta		exal_camxofsbuf,y
	a8

.acxofs	s_achase_alvar2alvar	W,y,exal_camxofs,y,exal_camxofsbuf,2

;---------------------------------------------------------------------
.addofs
	s_copy_alvar2var	W,y,work0,exal_camXofs

.inside	lda.w		exal_camroty+1,y
	nega
	sta		work3+0

	pl_roty_xvec16div2	work1,work2,work0,work3+0

	s_add_var	W,X1c,work1
	s_add_var	W,Z1c,work2

;-------------------------------------------------------------------

.exit	PULLYP
	rts

;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;-------------------------------------------------------------------;
;                                                                   ;
; set Arwing's Z offset(exal_camZofs_N			       ;
; (see sub routine CAM_BOOST_ZOFS)				       ;
;                                                                   ; 
;-------------------------------------------------------------------;
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;	In	:	exal_camZofs(word) offset value
;		:	X1c,Y1c,Z1c worldx,y,z
;		:	idY = camera pointer
;	Out	:	X1c(=+offset),Y1c(=+offset),Z1c(=+offset)

set_camera_worldz_offset

	PUSHXYP

	a8i16

	toheap	y,x

	sp_jmpnot_playertype	x,ROBOT,.normal

	s_set_var		W,z1,#0

	s_jmp_alvarzero	W,x,al_slopeptr,.chase
	s_set_var	W,z1,#slopezofs
.chase	s_achase_alvar	W,y,exal_camZofs,z1,5

.add	s_copy_alvar2var	W,y,work0,exal_camZofs_N
	s_varadd_alvar		W,y,work0,exal_camzofs

	bra			.calc

;-----------------------------------------------------
; --- calc value of offset Z ---

.normal
	s_copy_alvar2var	W,y,work0,exal_camZofs_N

;-----------------------------------------------------

.calc	s_copy_var2var		W,work1,work0
	s_set_var		B,work0+0,#0

; add offset value

	lda			#0
	clc
	adc			work0+0
	sta			work0+0

	s_copy_alvar2var	B,y,work0+1,exal_camroty+1

	jsl			calc_WLDoffset_l

	s_add_var		W,X1c,work2
	s_add_var		W,Z1c,work4


;-------------------------------------------------------------------
	PULLXYP

	rts

;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;-------------------------------------------------------------------;
;                                                                   ;
; set world z offset value : exal_camZofs_N
;                                                                   ; 
;-------------------------------------------------------------------;
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

cam_boost_zofs_srou

cb_zofs	equ	work9
cb_zrot	equ	work8
cb_zvx	equ	work7
cb_zvz	equ	work6


	PUSHXYP

	a8i16

	toheap	y,x

	s_set_var		W,cb_zofs,#0

	sp_jmp_playertype	x,ARWING,.arwing

;-------------------------------------------------------------------
.armer
; -- cockpit mode offset --

	pl_jmp_ifcockpit	x,.set_camofs,y
	pl_jmp_iftutumode	x,.set_camofs,y

	a16
	lda	exal_vz+1,y
	nega
	sexa
	asra
	sta	cb_zofs
	a8

	bra			.set_camofs
;-------------------------------------------------------------------
.arwing
; -- cockpit mode offset --

	pl_jmp_ifcockpit	x,.set_camofs,y

; -- boost offset --
.boost_ofs

	pl_jmp_ifboost		x,.F
	pl_jmp_ifbrake		x,.B
	jmp			.set_camofs
.B
	s_copy_alvar2var	W,y,cb_zofs,exal_camZofs_B	;#50
	jmp			.set_camofs
.F
	s_copy_alvar2var	W,y,cb_zofs,exal_camZofs_F	;#50

;-------------------------------------------------------------------
.set_camofs
	s_achase_alvar		W,y,exal_camZofs,cb_zofs,3

	a16
	lda	exal_camZofs,y
	asl	a
	sta	cb_zofs
	a8

;-------------------------------------------------------------------
.calc

; copy pos --> dummy

	jsr	copyviewpos2dummy

	s_push_obj	y
	ldy	dummyobj
;	s_add_Roffs2pos		B,y,y,x,#0,#0,cb_zofs,1,1,0,1,1,1
	c_add_Roffs2pos16	W,y,y,x,#0,#0,cb_zofs,1,1,0
	s_pull_obj	y

	jsr	copydummypos2view

;-------------------------------------------------------------------
.exit	PULLXYP

	rts



;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;-------------------------------------------------------------------;
;                                                                   ;
; Calculates the camera world XYZ offset			       ;
;                                                                   ; 
;-------------------------------------------------------------------;
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
calc_WLDoffset_l	; in	: work0   angleX(8 bits)
		;	: work0+1 angleY(8 bits)

		;	: work1(worldZ offset value)
		; out	: work2(x),work3(y),work4(z)

	s_start_strat


	PUSHXYP

	a8i16

	s_neg_var	B,work0+1

	pl_rotxy_zvec16	work2,work3,work4,work1,work0+0,work0+1

	a16
	lda	work2
	asra
	sta	work2

	lda	work3
	asra
	sta	work3

	lda	work4
	asra
	sta	work4


	PULLXYP

	rtl



;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;-------------------------------------------------------------------;
;                                                                   ;
; Calculates the camera world X Z offset			       ;
;                                                                   ; 
;-------------------------------------------------------------------;
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
	IFEQ	1

;calc_XZoffset_l	; in	: A angle(8bits)
;		;	: work0(offset value)
;		; out	: work1(z) work2(x)
;
;	s_start_strat
;
;-----------------------------------------------------
;	php
;
;	a8i16
;	pha
;
;	s_copy_var2var	W,x1,work0
;	s_copy_var2var	W,z1,#0
;
;	pla
;
;	jsl	rotate_16xz_l
;
;	s_copy_var2var	W,work2,x2
;	s_copy_var2var	W,work1,z2
;
;	plp
;
;	rtl

	ENDC

;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;
;-------------------------------------------------------------------;
;                                                                   ;
; Calculates camera worldy offset(part4)              	       ;
;                                                                   ;
;-------------------------------------------------------------------;
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;

exal_camupdw_up	equ	%00000001
exal_camupdw_upH	equ	%00000010
exal_camupdw_upOLD	equ	%00000100	; last
exal_camupdw_upC	equ	%00001000	; Camera's wldY reached min value

exal_camupdw_dw	equ	%00010000
exal_camupdw_dwL	equ	%00100000
exal_camupdw_dwOLD	equ	%01000000	; last
exal_camupdw_dwC	equ	%10000000	; Camera's wldY reached max value

exal_camupdw_dwALL	equ	exal_camupdw_dw!exal_camupdw_dwL!exal_camupdw_dwOLD
exal_camupdw_upALL	equ	exal_camupdw_up!exal_camupdw_upH!exal_camupdw_upOLD

set_camera_worldy_offset4	;(scwo)


	PUSHXYP

	a8i16

	toheap	y,x
	s_jmp_alvarAND		B,y,exal_VIEWflag,#exal_VIEWflag_cpchg,.transform
	pl_jmp_ifcockpit	x,.cockpit,y
	jmp	.do

;------------------------------------------------------------------------
.transform
.cockpit	; cockpit mode


	s_push_obj		x	; camera Y center
	pl_ldx_viewblk		x
	s_copy_alvar2alvar	W,y,exal_camYcenter,x,al_worldy
	s_set_alvar		B,y,exal_camYcenterOFS,#0
	s_pull_obj		x

	s_jmp_alvarPL		W,y,exal_camZofs_N,.rear

.front	; changing
	a16
	lda			exal_camYofs,y
	adiv2
	sta			exal_camYofs,y
	a8
	jmp			.done
.rear	a8
	s_set_alvar		W,y,exal_camYofs,#-40
	jmp			.done

;------------------------------------------------------------------------
.do
	c_jmp_viewstratEQ	x,ONFIELD_ARWING,.ONFIELD_AW,y
	c_jmp_viewstratEQ	x,COSMO_ARWING,.COSMO_AW,y
	jmp	.exit

;----------------------------------------------------
; worldy offset for ONFIELD ARWING
.ONFIELD_AW
	a8

;	ldatestvalue	W,y2
;	s_set_alvar	W,y,exal_midCmoveY,y2

	a16

	lda	exal_camYofs,y
	beq	.oaskip0
	adiv2
	sta	exal_camYofs,y

.oaskip0

	lda	Y1c
	sec
	sbc	exal_midCmoveY,y	;work0
	sta	y1

	a8

	lda	exal_camyofsrate,y
	sta	y2

	pl_mult_168	y1,y1,y2

	a16
	lda	y1
	clc
	adc	exal_midCmoveY,y	;work0
	sta	Y1c

	jmp	.done


;----------------------------------------------------
; worldy offset for COSMO ARWING

.COSMO_AW	a8

	c_jmpnot_ifdemoview	x,.caw_start,y

	a16
	
	lda	#0
	sta	exal_camYcenterOFS,Y
	sta	exal_camYofs,y
	lda	al_worldy,x
	sta	exal_camworldy,y
	sta	exal_camYcenter,Y

	a8

	jmp	.exit


;----------------------------------------------------
.caw_start
	lda	exal_camYofsMAX,y
	a16
	sexa
	sta	work5
	nega
	sta	work6
	a8

;----------------------------------------------------

; flag
	a8

	testjoypad		up,pcont
	bne			.dwf0
	testjoypad		down,pcont
	bne			.upf0

	jmp	.nkf0

.upf0	lda	exal_camupdw,y
	bit	#exal_camupdw_up
	bne	.upf1
	and	#(exal_camupdw_upH!exal_camupdw_dwALL)^-1
.upf1	ora	#exal_camupdw_up!exal_camupdw_upOLD
	bra	.flagE

.dwf0	lda	exal_camupdw,y
	bit	#exal_camupdw_dw
	bne	.dwf1
	and	#(exal_camupdw_dwL!exal_camupdw_upALL)^-1
.dwf1	ora	#exal_camupdw_dw!exal_camupdw_dwOLD
	bra	.flagE

.nkf0	lda	exal_camupdw,y
	and	#(exal_camupdw_up!exal_camupdw_upH!exal_camupdw_dw!exal_camupdw_dwL)^-1
.flagE	sta	exal_camupdw,y
;----------------------------------------------------

	lda	exal_camupdw,y
	bit	#exal_camupdw_upC!exal_camupdw_dwC
	rlbne	.Pros1
	bit	#exal_camupdw_upH!exal_camupdw_dwL
	rlbeq	.Pros1

;----- ----- ----- ----- ----- ----- -----
.Pros0	; after camYofs reach MAX rate

	a16

	lda	Y1c
	sec
	sbc	exal_camYcenterOFS,Y
	sta	exal_camYcenter,Y
	lda	exal_camYcenterOFS,Y
	sta	work0

	lda	exal_camYcenterOFS,y
	bmi	.P0mi
.P0pl	lda	work5
	bra	.P0set
.P0mi	lda	work6
.P0set
	pha
;	test_screenmode	onescreen
;	beq		.two

	a8
	sm_jmp_if2screen	.two
	a16

;one screen 75%

.one	a16
	pla
	jsl	perc75A_l
	bra	.otF0

;two screen 300%
.two	a16
	pla
	sta	tpx
	asl	a
	clc
	adc	tpx
.otF0	sta	work1
	a8
	s_Fchase_alvar	W,y,exal_camYcenterOFS,work1,10
	a16
	jmp	.inn

;----- ----- ----- ----- ----- ----- -----

.Pros1	; before camYofs reach MAX rate

	a16
	lda	Y1c
	sec
	sbc	exal_camYcenter,Y
	sta	exal_camYcenterOFS,Y
	sta	work0
.doit
	lda	exal_camupdw,y
	bit	#exal_camupdw_dw!exal_camupdw_dwOLD
	bne	.pl0
	bit	#exal_camupdw_up!exal_camupdw_upOLD
	bne	.mi0
.mi0
	lda	work0
	rlbpl	.inn
	cmp	work6	;ofsYmaxNEG
	rlbcs	.inn

	pha
	lda	Y1c
	clc
	adc	work5	;ofsYmax
	sta	work3
	a8
	s_achase_alvar		W,y,exal_camYcenter,work3,2
	s_jmpNOT_alvarAND	B,y,exal_camupdw,#exal_camupdw_up,.inn_n2
	s_or_alvar		B,y,exal_camupdw,#exal_camupdw_upH
	a16
	pla

	jmp	.inn_n

.pl0
	lda	work0
	bmi	.inn
	cmp	work5	;ofsYmax
	bcc	.inn

	pha
	lda	Y1c
	clc
	adc	work6	;ofsYmaxNEG
	sta	work3
	a8
	s_achase_alvar		W,y,exal_camYcenter,work3,2
	s_jmpNOT_alvarAND	B,y,exal_camupdw,#exal_camupdw_dw,.inn_n2
	s_or_alvar		B,y,exal_camupdw,#exal_camupdw_dwL
	a16
	pla

	jmp	.inn_n

.inn_n2
	a16
	pla
.inn_n	sta	work0

.inn
;	test_screenmode	onescreen
;	bne		.onescreen
	a8
	sm_jmp_if1screen	.onescreen
	a16

.twoscreen	lda	work0
	asra
	sta	tpx
	asra
	asra
	nega
	clc
	adc	tpx
	nega
	sta	exal_camYofs,y
	bra	.done

.onescreen	a16
	lda	work0	; calc 38%
	asra
	sta	tpx
	asra
	asra
	nega
	clc
	adc	tpx
	nega
	sta	exal_camYofs,y

.done
	a16
	lda	Y1c
	clc
	adc	exal_camYofs,y
	sta	Y1c

.exit
	jsr	TESTALTLMT

	PULLXYP

	rts


testofs	equ	150


TESTALTLMT
	phx
	phy
	php

	a8i16
	ldy	al_sword2,x

	s_and_alvar	B,y,exal_camupdw,#(exal_camupdw_dwC!exal_camupdw_upC)^-1

	a16
	lda	al_worldy,x

	bmi	.mi

.pl	sec
	sbc	#2000-testofs
	bmi	.exit

	a8
	s_or_alvar	B,y,exal_camupdw,#exal_camupdw_dwC
	s_copy_alvar2var	W,x,y1,al_worldy
	s_add_var		W,y1,#-testofs	;150
	bra	.ac

.mi	a16
	clc
	adc	#2000-testofs
	bpl	.exit

	a8
	s_or_alvar	B,y,exal_camupdw,#exal_camupdw_upC
	s_copy_alvar2var	W,x,y1,al_worldy
	s_add_var		W,y1,#testofs	;150
.ac	s_achase_alvar	W,y,exal_camYcenter,y1,3

.exit
	plp
	ply
	plx
	rts




;------------------------------------------------------------------------
; for ARMER

set_camera_worldy_offset5	;(scwo)

	phx
	phy
	php

	a8i16

	toheap	y,x

; -- camera Y center --

	phx
	pl_ldx_viewblk		x
	s_copy_alvar2alvar	W,y,exal_camYcenter,x,al_worldy
	s_set_alvar		B,y,exal_camYcenterOFS,#0
	plx

; -- flag --

	s_jmp_alvarAND		B,y,exal_VIEWflag,#exal_VIEWflag_cpchg,.transform
	pl_jmp_ifcockpit	x,.cockpit,y
	pl_jmp_iftransform	x,.transform
	jmp			.do


.cockpit
.transform
	a16
	lda	exal_camYofs,y
	adiv2
	sta	exal_camYofs,y
	a8
	jmp	.skip0

.do
	;pl_jet	x,check
	;bne	.jeton
	;s_jmp_alvarZERO	W,y,exal_vy,.skip0

.jeton	a16
	lda	exal_vy+1,y
	sexa
	nega
	sta		work0
	s_achase_alvar	W,y,exal_camYofs,work0,3
	a8

.skip0	a16
	lda	exal_camYofs,y
	clc
	adc	Y1c
	sta	Y1c
	a8

.exit	plp
	ply
	plx
	rts

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; Set Arwing's hscroll offset
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; set :exal_sidevel ( camera X offset inc value )

set_hscroll_offset_l

	PUSHYP

	a8i16

	toheap	y,x

	c_jmp_ifdemoview	x,.exit,y

	pl_jmp_ifturn		x,.exit,y

	a16
	lda	exal_sidevel,y

	asra
	asra
	asra

	sta	tpx
	a8


	s_jmp_alsflag	x,player2,.p2

.p1	a16
	lda	player1hscroll_offset
	clc
	sbc	tpx
	sta	player1hscroll_offset
	bra	.exit

.p2	a16
	lda	player2hscroll_offset
	clc
	sbc	tpx
	sta	player2hscroll_offset


.exit	PULLYP

	rtl


	IFEQ	1


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

	pl_ldy_viewblk	x

	a16
	lda.w	al_worldx,y
	sta	x1
	lda.w	al_worldz,y
	sta	z1
	a8
	toheap	y,x
	a16
	lda	exal_camworldxold,y
	sta	x2
	lda	exal_camworldzold,y
	sta	z2

	jsr	.calcf


	clc
	adc	exal_hscrollofsftotal,y
	sta	exal_hscrollofsftotal,y

	lsr	a
	lsr	a
	lsr	a
	pha
	a8
	s_jmp_alsflag	x,player2,.p2
.p1	a16
	pla
	sta	player1hscroll_offset
	bra	.exit

.p2	a16
	pla
	sta	player2hscroll_offset
	bra	.exit

.clr

.exit	PULLYP

	rtl




.calcf	LONGA

	lda	exal_forceroty,y
	lsr	a
	lsr	a
	lsr	a
	lsr	a
	lsr	a
	and	#7
	beq	.r00
	dec	a
	beq	.r20
	dec	a
	beq	.r40
	dec	a
	beq	.r60
	dec	a
	beq	.r80
	dec	a
	beq	.ra0
	bra	.re0

;old - new

.r20	; (Zn+Xn) - (Zo+Xo)
	lda	z1
	clc
	adc	x1
	sec
	sbc	z2
	sec
	sbc	x2
	jsl	perc75A_l
	rts

.r60	; (Zn-Xn) - (Zo-Xo)
	lda	z1
	sec
	sbc	x1
	sec
	sbc	z2
	clc
	adc	x2
	jsl	perc75A_l
	rts

.ra0	; -(Zn+Xn) - -(Zo+Xn)

	lda	z2
	clc
	adc	x2
	sec
	sbc	z1
	sec
	sbc	x1
	jsl	perc75A_l
	rts

.re0	; -(Zn-Xn) - -(Zn-Xn)

	lda	x1
	sec
	sbc	z1
	clc
	adc	z2
	sec
	sbc	x2
	jsl	perc75A_l
	rts

.r00	; (Xn) - (Xo)
	lda	x1
	sec
	sbc	x2
	rts

.r80	; -{(Xo) - (Xn)}
	lda	x2
	sec
	sbc	x1
	rts

.r40	; (Zn) - (Zo)
	lda	z1
	sec
	sbc	z2
	rts

.rc0	; -{(Zo) - (Zn)}
	lda	z2
	sec
	sbc	z1
	rts

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

	ENDC


;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; Set Arwing(Armer)'s vscroll offset(SPACE MODE)
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
set_vscroll_offset_l

	PUSHYP

	a8i16

	sp_jmp_ifvscrolloff	x,.pp

	ai16

	lda	BATTLEAREA_maxY
	clc
	adc	BATTLEAREA_minY
	adiv2
	nega
	clc
	adc	al_worldy,x

	asra
	asra
	asra
	asra
	sta	work0
	bit	#8000H
	bne	.mi

.pl	cmp	vscrollofsmax	; limitter
	bcc	.done
	lda	vscrollofsmax
	bra	.set

.mi	nega
	cmp	vscrollofsmax	; limitter
	bcc	.done
	lda	vscrollofsmax
	nega
.set	sta	work0

.done

	s_jmp_alsflag	x,player2,.pp2
.pp1
	s_set_var	W,player1vscroll_offset,work0
	bra	.pp
.pp2
	s_set_var	W,player2vscroll_offset,work0
	bra	.pp


.pp
	PULLYP

	rtl


;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;-------------------------------------------------------------------;
;                                                                   ;
; Calculates the horizon position                                   ;  
;                                                                   ; 
;-------------------------------------------------------------------;
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
;set horizon data

set_horizon_l


	PUSHXYPB

	a8i16

	BANK7E

;player1

	ldx	playpt1
	toheap	y,x

	a16

	lda	player1_horizonbak
	jsr	.addseaofs

	sta	player1_horizon

	jsr	.calcV
	clc
	adc	player1_horizon_offset
	sta	player1_horizonbak

	lda	player1vscroll_offset
	clc
	adc	player1_horizonbak
	sta	player1_horizonbak


	a8

	test_screenmode	onescreen
	bne	.exit

;player2

	ldx	playpt2
	toheap	y,x

	a16

	lda	player2_horizonbak
	jsr	.addseaofs
	sta	player2_horizon

	jsr	.calcV
	clc
	adc	player2_horizon_offset
	sta	player2_horizonbak

	lda	player2vscroll_offset
	clc
	adc	player2_horizonbak
	sta	player2_horizonbak

.exit

	PULLXYPB
	rtl

.calcV

	a8i16


	pl_ldy_viewblk	x
	a16
	lda.w	al_rotx,y
	clc
	toheap	y,x
;	adc	exal_camrotxtilt,y
	adiv2
	adiv2
	adiv2
	adiv2
	adiv2
	adiv2

;*************************************
; adjusting....

	sta	tpx

	adiv2
	adiv2
	adiv2
	sta	tpy
	adiv2
	clc
	adc	tpy

	nega
	clc
	adc	tpx
;*************************************

	sta	Y1c
;	adiv2
;	clc
;	adc	Y1c
	nega
	sta	y1

.return	a16
	lda	y1
	rts


.addseaofs	LONGA
	LONGI
	sta	y1
	a8

	pl_jmpnot_ifcamintheseareally	x,.exitaso,y

	s_Fchase_alvar	W,y,exal_horizon_wofs,200h,10h


	a16
	lda	y1
	clc
	adc	exal_horizon_wofs,y
	sta	y1
	rts




.exitaso	s_Fchase_alvar	W,y,exal_horizon_wofs,0h,10h

	a16
	lda	y1
	rts	
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;----------------------------------------------------------------------------
;		copy VIEW ANGLE
;----------------------------------------------------------------------------
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
copy_viewrot

;	idX	: camera pointer
;	idY	: heap pointer

	PUSHXYP
	a8i16
	stx			work0

	toheap	y,x

	pl_ldx_viewblk		x
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; -- rotx --
	s_copy_alvar2alvar	W,x,al_rotx,y,exal_camrotx

	a16
	lda	exal_camrotxtilt,y
	asl	a
	clc
	adc	al_rotx,x
	sta	al_rotx,x
	a8

;;;;	s_add_alvars		W,x,al_rotx,y,exal_camrotxtilt

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; -- roty --
	s_copy_alvar2alvar	W,x,al_roty,y,exal_camroty
	s_add_alvars		W,x,al_roty,y,exal_camrotyofsNT

;;;;	s_set_alvar		W,x,al_roty,#0

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; -- rotz --
	s_push_obj		x
	ldx	work0
	s_jmp_alsflag		x,player2,.p2rotz
.p1rotz	s_pull_obj		x
;	s_set_alvar		W,x,al_rotz,p1_camrotzbuf
;	s_copy_alvar2var	W,y,p1_camrotzbuf,exal_camrotz
	a16
	lda	exal_camrotz,y
	sta	al_rotz,x
	sta	p1_camrotzbuf
	a8
	bra			.pprotz

.p2rotz	s_pull_obj		x
;	s_set_alvar		W,x,al_rotz,p2_camrotzbuf
;	s_copy_alvar2var	W,y,p2_camrotzbuf,exal_camrotz
	a16
	lda	exal_camrotz,y
	sta	al_rotz,x
	sta	p2_camrotzbuf
	a8
.pprotz
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
.exit	PULLXYP

	rts


;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;----------------------------------------------------------------------------
;		copy VIEW POS
;----------------------------------------------------------------------------
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
copy_viewpos

	PUSHXYP

	s_start_strat

	a8i16

	pl_ldy_viewblk	x

	s_achase_alvar	W,y,al_sword1,#0,3

	toheap		x,x

	a16
	lda	exal_camworldx,x
	sta.w	al_worldx,y
	lda	exal_camworldy,x
	sta.w	al_worldy,y
	lda	exal_camworldz,x
	sta.w	al_worldz,y

.exit	PULLXYP
	rts

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;----------------------------------------------------------------------------
;		CAMERA LOOKS OBJECTS
;----------------------------------------------------------------------------
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

;	In	:	idX   = pointer of object
;		:	idY   = camera pointer
;		:	work0 = X offset(8bit)
;		:	work1 = Y offset(8bit)
;		:	work2 = Z offset(8bit)
;
;	Out	:	work0 = rotx(16bit)
;		:	work1 = roty(16bit)

	SHORTA
	LONGI

cam_looksobj_l

	phx
	phy
	php
	a8i16


	sp_jmp_playertype	x,ROBOT,.rb

.aw
	ldy			dummyobj
	s_copy_pos		y,x
	bra			.roffs

.rb
	s_push_obj		x

	toheap		y,x

	ldx		dummyobj

	a16
	lda	exal_worldx,y
	sta	al_worldx,x
	lda	exal_worldy,y
	sta	al_worldy,x
	lda	exal_worldz,y
	sta	al_worldz,x

	lda	exal_bodyofsy,y
	sexa
	nega
	clc
	adc	y1
	sta	y1
	a8

	txy
	s_pull_obj		x

.roffs
	a16
	lda	y1
	pha
	a8

	c_add_roffs2pos16	W,y,y,x,x1,#0,z1,0,1,0

	a16
	pla
	sta	y1
	a8

	s_add_alvar	W,y,al_worldy,y1



	s_push_obj		x
	pl_ldx_viewblk		x

	ldy			dummyobj


	lda	al_rotx,x
	pha
	lda	al_roty,x
	pha

	s_obj2obj_3dangle	x,y,al_roty,al_rotx,0

	s_copy_alvar2var	B,x,x1,al_rotx
	s_copy_alvar2var	B,x,y1,al_roty

	pla
	sta	al_roty,x
	pla
	sta	al_rotx,x

	s_neg_var		W,x1
	s_neg_var		W,y1
	s_pull_obj		x

	plp
	ply
	plx
	rtl

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;----------------------------------------------------------------------------
;		INBETWEEN ROUTINE
;----------------------------------------------------------------------------
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
set_inbet_l

;in			:exal_worldxold,exal_worldyold,exal_worldzold

	phx
	phy
	php

	phx

	toheap		y,x

	pl_ldx_viewblk	x

; ----
	s_jmpNOT_alvarAND	B,y,exal_VIEWflag,#exal_VIEWflag_inbetrot!exal_VIEWflag_inbetrot,.noinit

	lda		exal_VIEWflag2,y
	bit		#exal_VIEWflag2_inbetofftrig
	beq		.pos
	and		#~exal_VIEWflag2_inbetofftrig
	sta		exal_VIEWflag2,y
	jmp		.noinit

; ----
.pos
	lda		exal_VIEWflag,y
	bit		#exal_VIEWflag_inbetpos
	beq		.rot
	and		#~exal_VIEWflag_inbetpos
	sta		exal_VIEWflag,y

	a16
	lda		exal_camworldxold,y
	sec
	sbc		al_worldx,x
	sta		exal_caminbetWX,y

	lda		exal_camworldyold,y
	sec
	sbc		al_worldy,x
	sta		exal_caminbetWY,y

	lda		exal_camworldzold,y
	sec
	sbc		al_worldz,x
	sta		exal_caminbetWZ,y

	a8
;---
.rot
	lda		exal_VIEWflag,y
	bit		#exal_VIEWflag_inbetrot
	beq		.rot
	and		#~exal_VIEWflag_inbetrot
	sta		exal_VIEWflag,y

	lda		exal_camrotxold,y
	sec
	sbc		al_rotx+1,x
	sta		exal_caminbetRX,y

	lda		exal_camrotyold,y
	sec
	sbc		al_roty+1,x
	sta		exal_caminbetRY,y

	lda		exal_camrotzold,y
	sec
	sbc		al_rotz+1,x
	sta		exal_caminbetRZ,y

	lda		al_roty+1,x
	sta		exal_caminbetroty,y

	a8
;---
.noinit

	s_achase_alvar	W,y,exal_caminbetWX,#0,3
	s_achase_alvar	W,y,exal_caminbetWY,#0,3
	s_achase_alvar	W,y,exal_caminbetWZ,#0,3

	s_fchase_alvar	B,y,exal_caminbetRX,#0,1
	s_fchase_alvar	B,y,exal_caminbetRY,#0,1
	s_fchase_alvar	B,y,exal_caminbetRZ,#0,1

	s_add_alvars	B,x,al_rotx+1,y,exal_caminbetRX
	s_add_alvars	B,x,al_roty+1,y,exal_caminbetRY
	s_add_alvars	B,x,al_rotz+1,y,exal_caminbetRZ

	s_copy_alvar2var	W,y,work0,exal_caminbetWX
	s_copy_alvar2var	W,y,work1,exal_caminbetWY
	s_copy_alvar2var	W,y,work2,exal_caminbetWZ

	s_copy_alvar2var	B,y,work3,exal_caminbetroty

	ldy			dummyobj
	s_copy_alvar2alvar	B,y,al_rotx,x,al_rotx+1
	s_copy_alvar2alvar	B,y,al_rotz,x,al_rotz+1

	lda		work3	;al_roty+1,x
	sec
	sbc		al_roty+1,x
	sta.w		al_roty,y

	s_jmp_varnotzero	W,work0,.rotation
	s_jmp_varnotzero	W,work1,.rotation
	s_jmp_varzero		W,work2,.notrotation


.rotation

	c_add_Roffs2pos16	W,x,x,y,work0,work1,work2,0,1,0

.notrotation


	plx

; set old worldXYZ,rotXYZ  &  camera's worldXYZ,rotXYZ

	pl_oldposrots	x


;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³Set distance camera to player³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ



	plp
	ply
	plx

	rtl


.xba
	a16
	lda	al_rotx,x
	xba
	sta	al_rotx,x
	lda	al_roty,x
	xba
	sta	al_roty,x
	lda	al_rotz,x
	xba
	sta	al_rotz,x
	a8

	rts


;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

copy_camoldposrots_l


	s_start_strat

	PUSHXYP

	toheap	y,x

	ai16
	lda	al_worldx,x
	sta	exal_worldxold,y
	lda	al_worldy,x
	sta	exal_worldyold,y
	lda	al_worldz,x
	sta	exal_worldzold,y
	a8

	pl_ldx_viewblk		x

	s_copy_alvar2alvar	B,y,exal_camrotxold,x,al_rotx+1
	s_copy_alvar2alvar	B,y,exal_camrotyold,x,al_roty+1
	s_copy_alvar2alvar	B,y,exal_camrotzold,x,al_rotz+1

	a16
	lda	al_worldx,x
	sta	exal_camworldxold,y
	lda	al_worldy,x
	sta	exal_camworldyold,y
	lda	al_worldz,x
	sta	exal_camworldzold,y


	PULLXYP

	rtl
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;-------------------------------------------------------------------;
; Set player's shock!		                               ;
;-------------------------------------------------------------------;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

	SHORTA
	LONGI

camrotX_shock_l

	PUSHXYP

	a8i16
	ldy	al_sword2,x
	s_neg_alvar	W,y,exal_camrotxtilt
	s_fchase_alvar	W,y,exal_camrotxtilt,#0,10H

	PULLXYP

	rtl

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;		VIEW CHANGE ROUTINE
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
NUMofAWview	equ	2

;viewtab_one	equ	work9
;viewtab_two	equ	work8


	SHORTA
	LONGI

VIEW_CHANGE_l

	PUSHXYP

	a8i16

	toheap	y,x

;--------------------------------------------------------------------------------
; view change wo shita atono inbetween on?

	s_jmpnot_alvarAND	B,y,exal_VIEWflag,#exal_VIEWflag_cpinbet,.noinbet
	s_and_alvar		B,y,exal_VIEWflag,#exal_VIEWflag_cpinbet^-1
	c_view_inbetween	x,on,y

.noinbet
;--------------------------------------------------------------------------------

	s_jmp_alvarPL		W,y,exal_camZofs_N,.clrPLAYER
	s_jmp_alvarLESS		W,y,exal_camZofs_N,#-40,.setplayer

.clrPLAYER
	s_set_alsflag		x,insidecockpit
	bra	.do

.setPLAYER	s_clr_alsflag		x,insidecockpit

.do

;--------------------------------------------------------------------------------

	IFNE	debuginfo
		testjoypad	tleft,pcont
		beq		.cka00
		testjoypad	tright,pcont
		beq		.cka00
		testjoypad	Y,ptrig
		beq		.cka00
	ELSEIF
		jmp		.cka00
	ENDC

		s_or_alvar	B,y,exal_VIEWflag,#exal_VIEWflag_change

.cka00
		s_jmp_alvarAND	B,y,exal_VIEWflag,#exal_VIEWflag_cpchg,.cka0

		s_jmpNOT_alvarAND	B,y,exal_VIEWflag,#exal_VIEWflag_change,.cka0
		s_and_alvar	B,y,exal_VIEWflag,#exal_VIEWflag_change^-1

		kplsound	x,viewchange

		c_view_inbetween	x,on,y


		pl_eor_alvar	B,y,exal_VIEWflag,#exal_VIEWflag_cockpit
		s_or_alvar	B,y,exal_VIEWflag,#exal_VIEWflag_cpchg

.cka0



;-----------------------------------------------------
; rising nara camera wo hiku.

		pl_jmpnot_iftransrising	x,.normal
		s_set_var	W,work0,#-400
		bra		.cka4

;-----------------------------------------------------

.normal		pl_jmp_iftransform	x,.cka3
		s_jmpNOT_alvarAND	B,y,exal_VIEWflag,#exal_VIEWflag_cockpit,.cka3
		s_copy_alvar2var	W,y,work0,exal_camZofs_cock
		bra			.cka4

.cka3		s_copy_alvar2var	W,y,work0,exal_camZofs_objective
.cka4

;------------------------------------------------------------------------

.chaseAWv
		s_Fchase_alvar	W,y,exal_camZofs_N,work0,30
		bra		.setofs2
.setofs2
		s_varsub_alvar		W,y,work0,exal_camZofs_N
		pl_abs_var		W,work0
		s_jmp_varMORE		W,work0,#50,.exitAWv

		s_jmpNOT_alvarAND	B,y,exal_VIEWflag,#exal_VIEWflag_cpchg,.exitAWv
		s_and_alvar		B,y,exal_VIEWflag,#exal_VIEWflag_cpchg^-1
		s_or_alvar		B,y,exal_VIEWflag,#exal_VIEWflag_cpinbet

.exitAWv

		PULLXYP
		rtl



;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
VIEW_CHANGE_INIT_l

		PUSHXYP

		a8i16

		ldy		al_sword2,x


	sp_jmp_playertype	x,ARWING,.ARWING
	sp_jmp_playertype	x,UFO,.ARMER
	sp_jmp_playertype	x,ROBOT,.ROBOT

;.no
		ai16
		phx
		ldx	#VIEW_ZERO&WM
		jmp	.set


.ROBOT
		ai16
		phx

		a8
		sm_jmp_if2screen	.tscRB
		a16

;		test_screenmode	onescreen
;		beq	.tscRB
.oscRB		ldx	#RBV_NORMAL_1&WM
		jmp	.set
.tscRB		a16
		ldx	#RBV_NORMAL&WM
		jmp	.set


.ARMER
.ARWING
		ai16
		phx

		a8
		sm_jmp_if2screen	.tsc
		a16

;		test_screenmode	onescreen
;		beq	.tsc
.osc		ldx	#ARV_NORMAL_1&WM
		jmp	.set
.tsc		a16
		ldx	#ARV_NORMAL&WM
		jmp	.set


.set		lda.l	VIEW_TABLE&0ff0000H+0,x
		sta	exal_camZofs_N,y
		sta	exal_camZofs_objective,y
		lda.l	VIEW_TABLE&0ff0000H+2,x
		sta	exal_camZofs_F,y
		lda.l	VIEW_TABLE&0ff0000H+4,x
		sta	exal_camZofs_B,y
		lda.l	VIEW_TABLE&0ff0000H+6,x
		sta	exal_camZofs_cock,y

		lda.l	VIEW_TABLE&0ff0000H+8,x
		sta	exal_camRotXofs_Normal,y
		lda.l	VIEW_TABLE&0ff0000H+10,x
		sta	exal_camRotXofs_JMP,y
		lda.l	VIEW_TABLE&0ff0000H+12,x
		sta	exal_camYofs_Normal,y

.exit		plx

		PULLXYP


		rtl

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;	copy view pos <---> dummy obj pos
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
copyviewpos2dummy

;	in	:idx player's pointer

	s_start_strat

	PUSHXYP

	a8i16

	toheap	y,x

	ldx	dummyobj
	a16
	lda	exal_camworldx,y
	sta	al_worldx,x
	lda	exal_camworldy,y
	sta	al_worldy,x
	lda	exal_camworldz,y
	sta	al_worldz,x

	PULLXYP

	rts

;---------------------------------------------------------------
copydummypos2view

;	in	:idx player's pointer

	s_start_strat

	PUSHXYP

	a8i16

	toheap	y,x

	ldx	dummyobj
	a16
	lda	al_worldx,x
	sta	exal_camworldx,y
	lda	al_worldy,x
	sta	exal_camworldy,y
	lda	al_worldz,x
	sta	exal_camworldz,y

	PULLXYP

	rts

;---------------------------------------------------------------
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³   -----------------------    ³
;³   VIEW CHANGE DATA(ROBOT)    ³
;³   -----------------------    ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
RB_VIEW_COCK	DW	0
	DW	-150


VIEW_TABLE	;(4 Table)


;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³   -----------------------    ³
;³   VIEW CHANGE DATA(ARWING)   ³
;³   -----------------------    ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

RBV_NORMAL_1	; one screen mode

	DW	-RB0camZofs_N_1
	DW	-RB0camZofs_F_1
	DW	-RB0camZofs_B_1
	DW	20
	DW	0
	DW	0
	DW	0

RBV_NORMAL	; two screen mode

	DW	-RB0camZofs_N
	DW	-RB0camZofs_F
	DW	-RB0camZofs_B
	DW	20
	DW	0
	DW	0
	DW	0

ARV_NORMAL_1	; one screen mode

	DW	-cameraZ_offset_normal_1
	DW	-cameraZ_offset_boost_1
	DW	-cameraZ_offset_brake_1
	DW	20
	DW	0
	DW	0
	DW	0

ARV_NORMAL	; two screen mode

	DW	-cameraZ_offset_normal
	DW	-cameraZ_offset_boost
	DW	-cameraZ_offset_brake
	DW	20
	DW	0
	DW	0
	DW	0

;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³   -----------------------    ³
;³  VIEW CHANGE DATA(ALL CLEAR) ³
;³   -----------------------    ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ


VIEW_ZERO	;clera data

	DW	0
	DW	0
	DW	0
	DW	0
	DW	0
	DW	0

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;	DEMO CAMERA
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;	al_pword1	:time counter
;	al_pbyte1	;temp
;	al_pbyte2	;temp

;local macro


end_demoview	macro

	rtl
	endm

demoview_srou_l

	s_start_strat

	PUSHXYP

	a8i16
	toheap	y,x

	a16
	lda	exal_demoviewstratptr+0,y
	beq	.exit
	a8

	lda	#(.exit&0ff0000H)>>16
	pha
	a16
	lda	#.exit&0ffffH
	dec	a
	pha

	a8
	lda	exal_demoviewstratptr+2,y
	pha
	a16
	lda	exal_demoviewstratptr+0,y
	dec	a
	pha
	a8
	rtl

.exit	LOCAL

	PULLXYP
	rtl


;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;	DEMO CAMERA
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
	IFEQ	1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DVSTRAT_entertutu_0
	jsr	dv_enterpos
	jsr	dv_watchobj
	c_set_demoviewstrat	x,entertutu_1
	end_demoview
DVSTRAT_entertutu_1
	toheap	y,x
	sp_jmpnot_playertype	x,UFO,.start
	c_set_demoviewstrat	x,off,y
	jsr	dv_backobj_000
	c_view_inbetween	x,on
	bra	.end
.start	jsr	dv_copyoldpos
	jsr	dv_watchobj
	s_jmp_higher		x,#enterendy-1000,.end
	c_set_demoviewstrat	x,endenter,y
.end	end_demoview
DVSTRAT_gototutu_0
	toheap	y,x
	c_set_demoviewstrat	x,gototutu_1,y
	jsr	dv_frontoftutu
	bra	DVSTRAT_gototutu_1.enter
DVSTRAT_gototutu_1
	toheap	y,x
	pl_enterdist_ifmore	x,#600,.notnext
	c_set_demoviewstrat	x,entertutu_0,y
	s_set_var	B,exbosstest,#1
.notnext	jsr	dv_copyoldpos
.enter	LOCAL
	jsr	dv_watchobj
	end_demoview
DVSTRAT_risetutu_0
	s_set_var	B,exbosstest,#1
	toheap	y,x
	c_set_demoviewstrat	x,risetutu_1,y
	jsr	dv_frontoftutu2
	ldy	#viewblk1
	a16
	lda	al_worldy,x
	clc
	adc	#-50
	sta.w	al_worldy,y
	a8
	jsr	dv_watchobj
	s_copy_alvar2alvar	B,y,al_roty+1,x,al_roty
	s_set_alvar		W,y,al_rotx,#20*256
	end_demoview
DVSTRAT_risetutu_1
	toheap	y,x
	a16
	lda	exal_enterposy,y
	clc
	adc	#-100	;	-1058-120
	sta	y1
	a8
	s_jmp_lower		x,y1,.notnext
	c_set_demoviewstrat	x,gototutu_0,y
.notnext	jsr	dv_copyoldpos
	jsr	dv_addplayervecsxzdiv2
	jsr	dv_watchobj
;dy	#viewblk1
;	lda	al_roty,x
;	nega
;	sta.w	al_roty+1,y
;	lda.w	al_rotx+1,y
;	asra
;	bpl	.pl
;	lda	#0
;	sta.w	al_rotx+1,y
;.pl	jsr	dv_copyoldrot
	end_demoview
;---------------------------------------------------------------------------------------
; enter demo seq 1
DVSTRAT_startenter
	s_start_strat
	toheap	y,x
	lda.w	exal_roty+1,y
	sta	y1
	pl_ldy_viewblk	x
	lda	y1
	sta.w	al_pbyte1,y
	c_set_demoviewstrat	x,startenter_0_1
DVSTRAT_startenter_0_1
	toheap	y,x
	jsr	dv_backobj_001
	jsr	dv_watchobj
	pl_enterdist_ifmore	x,#4800,.exit
	c_set_demoviewstrat	x,startenter_1
.exit	end_demoview
DVSTRAT_startenter_1
	toheap	y,x
	jsr	dv_copyoldpos
	jsr	dv_addplayervecs
	jsr	dv_watchobj
	pl_enterdist_ifmore	x,#4000,.exit
	c_set_demoviewstrat	x,risetutu_0
.exit	end_demoview
;---------------------------------------------------------------------------------------
; enter demo final seq
DVSTRAT_endenter
	s_start_strat
	pl_ldy_viewblk	x
	lda	#4aH
	sta.w	al_pbyte1,y
	c_set_demoviewstrat	x,endenter_0_1
DVSTRAT_endenter_0_1
	toheap	y,x
	sp_jmp_playertype	x,ARWING,.cnt
	c_set_demoviewstrat	x,off,y
	c_view_inbetween	x,on,y
;	ldy	#viewblk1
;	lda.w	al_pbyte1,y
;	printh	FFFFFFFFFFFFF,kawagoe
	bra	.exit
.cnt	jsr	dv_turnaroundobj_001
	ldy		#viewblk1
	s_set_alvar	W,y,al_worldy,#enterendy
	jsr	dv_watchobj
.exit	end_demoview
;---------------------------------------------------------------------------------------
DVSTRAT_gamestart
	s_start_strat
	toheap	y,x
	jsr	dv_gamestartpos
	c_set_demoviewstrat	x,gamestart_1
	pl_ldy_viewblk	x
	s_set_alvar	B,y,al_vel,#5
	jsr		dv_genvecs
	end_demoview
DVSTRAT_gamestart_1
	s_start_strat
	toheap	y,x
	jsr		dv_copyoldpos
	pl_ldy_viewblk	x
;	a16
;	lda.w	al_vx,y
;	printh	viewVX,kawagoe
;	lda.w	al_vz,y
;	printh	viewVZ,kawagoe
;	a8
;;;;;	s_add_alvar	W,y,al_worldz,#5
	jsr		dv_watchobj
	jsr		dv_addviewxzvecs
.enter	LOCAL
	a16
	lda.w	al_rotx,y
	jsl	perc87A_l
	sta.w	al_rotx,y
	a8
	end_demoview
DVSTRAT_gamestart_2
	s_start_strat
	toheap	y,x
	jsr	dv_copyoldpos
	pl_ldy_viewblk	x
	s_add_alvar	W,y,al_worldz,#15
	jsr	dv_watchobj
	pl_ldy_viewblk	x
	a16
	lda	al_worldy,x
	sec
	sbc.w	al_worldy,y
	beq	.done
	asra
	asra
	asra
	clc
	adc.w	al_worldy,y
	sta.w	al_worldy,y
.done	a8
	jmp	DVSTRAT_gamestart_1.enter

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

	ENDC

;---------------------------------------------------------------------------------------
DVSTRAT_playerdead

	s_start_strat

	jsr	dv_turninit

	c_set_demoviewstrat	x,playerdead_1

DVSTRAT_playerdead_1

	jsr	dv_turnaroundobj_003
	jsr	dv_watchobj
	jsr	dv_copyplrxzvecs

.exit	end_demoview


;---------------------------------------------------------------------------------------

DVSTRAT_bossenter

	s_start_strat

	jsr	dv_turninit

	c_set_demoviewstrat	x,bossenter_1

DVSTRAT_bossenter_1

	jsr	dv_turnaroundobj_004
	jsr	dv_watchobj
	jsr	dv_copyplrxzvecs

.exit	end_demoview


;---------------------------------------------------------------------------------------

DVSTRAT_awclear_1

	s_start_strat

	toheap	y,x

	jsr	dv_copyoldpos
	jsr	dv_addviewxzvecs
	jsr	dv_watchobj


	a16
	lda	exal_camrotyold-1,y
	and	#0ff00H
	sta	y1
	a8



	pl_ldx_viewblk	x
	PHX
	s_jmp_andframe	#1,.noincy
	s_Fchase_var2alvar	W,x,y1,al_roty,100H
.noincy
	txy
	PLX

	a16
	lda	y1
	sta.w	al_roty,y

	lda.w	al_rotx,y
	jsl	perc62A_l
	sta.w	al_rotx,y
	a8

	end_demoview


;-----------------------------------------------------------------------------
;	stratroutine for DEMO
;-----------------------------------------------------------------------------

dv_watchobj

;	idx :obj pointer

	phy

	pl_ldy_viewblk	x

	c_calc_lookangle	W,x,work0,work1,#0,#0,#0

	a16
	lda	work0
	asra
	sta	work0
	asra
	clc
	adc	work0
	sta	work0
	a8

	s_set_alvar	W,y,al_rotx,work0
	s_set_alvar	W,y,al_roty,work1

	ply

.exit
	rts

dv_backobj_001

	lda	#0
	sta	x1
	lda	#10
	sta	y1
	lda	#-20
	sta	z1
	jmp	dv_backobj

dv_backobj_000

	lda	#0
	sta	x1
	lda	#-10
	sta	y1
	lda	#-80
	sta	z1
	jmp	dv_backobj
dv_backobj

	phy
	ldy	#viewblk1
	s_add_roffs2pos	B,y,x,x,x1,y1,z1,0,1,0,2,2,2
	s_set_alvar	W,y,al_rotx,work0
	ply
	rts

dv_addplayervecs

	phy

	ldy	#viewblk1
	a16
	lda	al_vy,x
	clc
	adc.w	al_worldy,y
	sta.w	al_worldy,y

	jmp	dv_addplayervecsxz.enter

dv_addplayervecsxz

	phy

	ldy	#viewblk1

	a16

.enter	LOCAL

	lda	al_vx,x
	clc
	adc.w	al_worldx,y
	sta.w	al_worldx,y


	lda	al_vz,x
	clc
	adc.w	al_worldz,y
	sta.w	al_worldz,y

	a8

	ply
	rts

dv_addplayervecsxzdiv2

	phy

	ldy	#viewblk1

	a16

	lda	al_vy,x
	asra
;	jsl	perc75A_l
	clc
	adc.w	al_worldy,y
	sta.w	al_worldy,y

.enter	LOCAL

;	lda	al_vx,x
;	jsl	perc75A_l
;	asra
;	clc
;	adc.w	al_worldx,y
;	sta.w	al_worldx,y
;
;
;	lda	al_vz,x
;	asra
;	jsl	perc75A_l
;	clc
;	adc.w	al_worldz,y
;	sta.w	al_worldz,y

	a8

	ply
	rts



dv_copyoldpos

	s_start_strat

	phy
	phx

	pl_ldy_viewblk	x

	toheap	x,x

	s_copy_alvar2alvar	W,y,al_worldx,x,exal_camworldxold
	s_copy_alvar2alvar	W,y,al_worldy,x,exal_camworldyold
	s_copy_alvar2alvar	W,y,al_worldz,x,exal_camworldzold

	plx
	ply

	rts


dv_copyoldrot

	s_start_strat

	phy
	phx

	toheap	x,x

	pl_ldy_viewblk		x

	a16
	lda	exal_camrotxold-1,x
	and	#0ff00H
	sta.w	al_rotx,y
	lda	exal_camrotyold-1,x
	and	#0ff00H
	sta.w	al_roty,y
	lda	exal_camrotzold-1,x
	and	#0ff00H
	sta.w	al_rotz,y
	a8

	plx
	ply

	rts


dv_turnaroundobj_004	; in al_pbyte1

	s_start_strat

	s_set_var	B,x1,#0
	s_set_var	B,y1,#60
	s_set_var	B,z1,#-60

	jmp	dv_turnaroundobj

dv_turnaroundobj_003	; in al_pbyte1

	s_start_strat

	s_set_var	B,x1,#0
	s_set_var	B,y1,#-30
	s_set_var	B,z1,#-70

	jmp	dv_turnaroundobj

dv_turnaroundobj_002	; in al_pbyte1

	s_start_strat

	s_set_var	B,x1,#0
	s_set_var	B,y1,#-80
	s_set_var	B,z1,#-70
	jmp	dv_turnaroundobj

dv_turnaroundobj_001	; in al_pbyte1

	s_start_strat

	s_set_var	B,x1,#0
	s_set_var	B,y1,#0
	s_set_var	B,z1,#-70
	jmp	dv_turnaroundobj

dv_turnaroundobj_000	; in al_pbyte1

	s_start_strat
	s_set_var	B,x1,#0
	s_set_var	B,y1,#0
	s_set_var	B,z1,#-70
	jmp	dv_turnaroundobj
dv_turnaroundobj	; in al_pbyte1

	; in al_pbyte1
		; x1	offsetx
		; y1	offsety
		; z1	offsetz
	s_start_strat
	phy
	phx
	ldy	dummyobj
	ldx	#viewblk1
	lda	al_pbyte1,x
	sec
	sbc	#2
	sta	al_pbyte1,x
	sta.w	al_roty,y
	plx
	s_add_roffs2pos	B,y,x,y,x1,y1,z1,0,1,0,1,0,1
	phx
	ldx	#viewblk1
	s_copy_pos	x,y
	s_set_alvar	W,x,al_rotx,#-10*256
	pl_test_planetmode	space
	beq	.nolmt
	s_jmp_higher	x,#-10H,.nolmt
	s_set_alvar	W,x,al_worldy,#-10H
.nolmt	plx
	ply
	rts



	IFEQ	1
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
dv_frontoftutu2
	s_start_strat
	phy
	toheap	y,x
	s_set_var	W,work0,#100
	s_set_var	W,work1,#100	;-1208
	s_set_var	W,work2,#2600	;2500
	s_copy_alvar2var	W,y,x1,exal_enterposx
	s_copy_alvar2var	W,y,y1,exal_enterposy
	s_copy_alvar2var	W,y,z1,exal_enterposz
	jsr			dv_srou_xzoffset2player
	ply
	rts
dv_frontoftutu
	s_start_strat
	phy
	toheap	y,x
	s_set_var	W,work0,#150
	s_set_var	W,work1,#-1208
	s_set_var	W,work2,#1500
	s_copy_alvar2var	W,y,x1,exal_enterposx
	s_copy_alvar2var	W,y,y1,exal_enterposy
	s_copy_alvar2var	W,y,z1,exal_enterposz
	jsr			dv_srou_xzoffset2player
	ply
	rts
dv_enterpos
;	idx :obj pointer
	s_start_strat
	phy
	toheap	y,x
	s_copy_alvar2var	W,y,x1,exal_enterposx
	s_copy_alvar2var	W,y,z1,exal_enterposz
	s_set_var		W,work0,#70
	s_set_var		W,work1,#-1158
	s_set_var		W,work2,#-70
	s_copy_alvar2var	W,y,x1,exal_enterposx
	s_copy_alvar2var	W,y,y1,exal_enterposy
	s_copy_alvar2var	W,y,z1,exal_enterposz
	jsr			dv_srou_xzoffset2player
	ply
	rts
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
	ENDC



;---------------------------------------------------------------------------------------
dv_turninit	; turn mode no initial

	s_start_strat

	PHY

	toheap	y,x

	lda.w	exal_roty+1,y
	sta	y1

	pl_ldy_viewblk	x
	lda	y1
	sta.w	al_pbyte1,y

	PLY

	rts

;---------------------------------------------------------------------------------------
dv_srou_xzoffset2player

;	in	work0(16bit)	:offset x
;		work1(16bit)	:offset y
;		work2(16bit)	:offset z
;		x1(16bit)	;pos x
;		y1(16bit)	;pos y
;		z1(16bit)	;pos z
;	out	view's al_worldx,y,z

	s_start_strat

	PUSHXYP

	a16
	lda	x1
	sta	work3
	lda	y1
	sta	work4
	lda	z1
	sta	work5
	a8

	s_copy_var2var	W,work5,z1

	jsl		obj2pos_srou_l

	ldy		dummyobj

	pl_ldx_viewblk	x

	lda	y1+1
	nega
	clc
	adc	#128
	sta	al_roty,x

	s_set_alvar		W,x,al_worldx,work3
	s_set_alvar		W,x,al_worldy,work4
	s_set_alvar		W,x,al_worldz,work5
	c_add_Roffs2pos16	W,x,x,y,work0,work1,work2,0,1,0

	PULLXYP

	rts


;---------------------------------------------------------------------------------------
dv_gamestartpos

;	in	X: player's pointer
;	out	view's al_worldx,y,z

	s_start_strat

	PUSHYP

	pl_ldy_viewblk	x

	s_jmp_alsflag	x,player2,.p2

.p1	s_set_alvar	W,y,al_worldx,p1_startx
	s_set_alvar	W,y,al_worldy,p1_starty
	s_set_alvar	W,y,al_worldz,p1_startz
	lda	p1_roty_init
	bra	.pp

.p2	s_set_alvar	W,y,al_worldx,p2_startx
	s_set_alvar	W,y,al_worldy,p2_starty
	s_set_alvar	W,y,al_worldz,p2_startz
	lda	p2_roty_init
.pp

	sta.w	al_roty,y	; keisan no tame
	sta.w	al_roty+1,y	; honto no roty

;	s_add_roffs2pos	B,y,y,y,#-10H,#-10,#40H,0,1,0,2,0,2
	s_add_roffs2pos	B,y,y,y,#0H,#60,#-40H,0,1,0,2,0,2

	PULLYP

	rts

dv_addplrvecsperc50

	PUSHYP

	pl_ldy_viewblk	x

	a16
	lda	al_vx,x
	asra
	clc
	adc.w	al_worldx,y
	sta.w	al_worldx,y
	lda	al_vz,x
	asra
	clc
	adc.w	al_worldz,y
	sta.w	al_worldz,y
	a8

	PULLYP

	rts

dv_copyplrxzvecs

	PUSHYP

	pl_ldy_viewblk	x

	a16
	lda	#0
	sta.w	al_vy,y

	lda	al_vx,x
	sta.w	al_vx,y
	lda	al_vz,x
	sta.w	al_vz,y
	a8

	PULLYP

	rts


dv_addplrxzvecs

	PUSHYP

	pl_ldy_viewblk	x

	a16
	lda	al_vx,x
	sta.w	al_vx,y
	clc
	adc.w	al_worldx,y
	sta.w	al_worldx,y
	lda	al_vz,x
	clc
	adc.w	al_worldz,y
	sta.w	al_vz,y
	sta.w	al_worldz,y
	a8

	PULLYP

	rts


dv_addviewxzvecs

	PUSHYP

	pl_ldy_viewblk	x
	a16
	lda	#0
	sta.w	al_vy,y
	a8
	s_add_vecs2pos	y

	PULLYP

	rts

dv_genvecs
	PUSHXP

	pl_ldx_viewblk	x

	s_gen_vecs	x,al_roty+1,al_vel

	PULLXP

	rts

;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

	end
