
POSITIONY EQU 220 // Position en Y de la voiture a l'initialisation
TAILLE    EQU 14  // Longueur de la voiture

// Initialisation des players/missiles

initplayer:

        lda        106       // Pointe sur PM

        clc
        adc        #4        // + 1024
        sta        $e7
	sta	   players

        lda        #1
        sta        623       // Ordre d'affichage pm1..4 puis pf1..4
 

        lda        #0
        sta        $e6

// Attention, je profite ici du fait que l'accumulateur soit NULL !
        sta        53277     // On vire les players missiles de l'ecran !
        sta        53256     // Taille normal des players
        sta        53257     // Suite taille...
	sta        53258
	sta        53259
// Ces players ne sont pas utilises pour le moment
        sta        53250	// Position V1
        sta        53251	// Position V2
        sta        53248	// Position de notre voiture
        sta        53249

// Initialisation variables
	sta phaseJump
	sta tempoJump
	sta StartV1
	sta StartV2
	sta PosX1
	sta PosX2
	sta PosY1
	sta PosY2

        ldx        #4
	stx	   53278 // On en profite pour effacer les collisions

// Effacement des zones memoires des differents players
bcleffallplayers

	jsr clearPM
        dex

        cpx        #0
        beq finclearcar

        lda        $e7
        clc
        adc        #1
        sta        $e7
	jmp bcleffallplayers

finclearcar:
        lda        $e7
        sec
        sbc        #3	// 4 blocs de 256 octets viennent d'etre effaces, retour au debut de la zone memoire de PM
        sta        $e7

// Chargement de la voiture
        ldy        #POSITIONY    // Position en Y
        lda        #Carrosserie&255
        sta        $e8
        lda        #Carrosserie/256
        sta        $e9
        ldx        #13
        stx        memy0

        jsr bclloadcar

// Chargement des roues
        clc
        lda        $e7
        adc        #1    // Deuxieme player
        sta        $e7

        ldy        #POSITIONY    // Position en Y
        lda        #roues&255
        sta        $e8
        lda        #roues/256
        sta        $e9
        ldx        #13
        stx        memy0

        jsr bclloadcar   

        sec
        lda        $e7
        sbc        #4
        sta        $e7

	ldy	#13	// encore 13 elements a dessiner de la voiture
	sty	idx1
	sty	idx2


        rts

bclloadcar:
	tya
	sec
	sbc	   #TAILLE
	sta	   memy2
bclloadcarb:
        sty        memy1
        ldy        memy0
                
        lda        ($e8),y
        dey
        sty        memy0
        ldy        memy1
        sta        ($e6),y
        dey
        cpy        memy2
        bne bclloadcarb   
  
	rts

/*****************************************************************************/
/* Procedure qui va effacer une zone player (utilise e6, e7 pointant sur la  */
/* zone memoire du player a effacer					     */
/*****************************************************************************/

clearPM:

        ldy        #255
	lda	   #0
// Vidage en cours !
bclclearPM:
        sta        ($e6),y
        dey
        cpy        #0
        bne bclclearPM

        sta        ($e6),y   
	rts

/*****************************************************************************/
/* Grosse procedure qui va permettre l'affichage et la descente des voitures */
/*****************************************************************************/
deplaceadver:
	
// Initialisation des pointeurs sur PM 2
	lda        106       ; Pointe sur PM

        clc
        adc        #6        ; PM 2
        sta        $e7

        lda        #51
        sta        $e6

// La voiture 1 est-elle affichee ?
	lda	   StartV1
	cmp	   #0
	beq VoitureSuivante
// Oui, il faut la deplacer
	jsr deplaceV1
	jsr deplaceH1

// Initialisation des pointeurs sur PM 3
VoitureSuivante:
	ldy	   $e7
	iny
	sty	   $e7

// La voiture 2 est-elle affichee ?
	lda	   StartV2
	cmp	   #0
	beq FinVoiture

// Oui, il faut la deplacer
	jsr deplaceV2
	jsr deplaceH2

FinVoiture:
	lda	   StartV1 // Notre voiture est-elle affichee
	cmp	   #1
	beq DebutAffV2	// Oui, Rien a faire 

// Si oui, on initialise un compteur
	lda	   CptV1
	cmp        #0
	beq okinitcptV1
	jmp deccptV1
okinitcptV1
	lda	   53770
	ldx	   level
	cpx 	   #1 // Plus de voitures
	beq normalv1
	and	   #%111111
	sta	  CptV1
	jmp DebutAffV2
normalv1:
	and	   #%1111111 // Rare voiture Nunmero 1 pour le niveau 1, et pas de voiture 2 entre parenthese !
	sta	  CptV1
	jmp DebutAffV2




// On decremente un compteur jusqu'a arriver a 0 pour permettre l'affichage de la voiture
deccptV1	
	ldx	   CptV1
	dex
	stx	   CptV1
	cpx	   #0
	beq OkaffV1
	jmp DebutAffV2


OkaffV1:
// Nous allons la reafficher, il faut initialiser la position de la voiture lorsqu'elle va repartir
	lda	   #0
	sta incscore5V2
	lda	   #1
	sta	   StartV1
	lda        53770	// Choisissons une couleur dans notre tableau
	and	   #%00000111
	tax
	lda	   tabColor,x
        sta        706

// Pour cela, nous allons regarder la position de la bordure sur la premiere ligne de l'ecran

	// Position de la voiture en X
	lda	centre // Pour cela, nous reprenons le centre de la route
	asl	A      // Le point vaut 2x deplacement d'un sprite

	clc 	// Le sprite a son 0 (bord ecran visible) a 48
	adc	#48 // Pour position le PM sur l'ecran

	// Un peu d'aleatoire
	tax
	lda	53770
	and	#%10000000
	cmp	#0
	bne posplus5
	txa
	sec
	sbc	#25

	sta	PosX1
	sta     53250
	rts

posplus5:
	txa
	clc
	adc	#5
	
	sta	PosX1
	sta	53250
	rts

DebutAffV2:
	lda	   StartV2 // Notre voiture est-elle affichee
	cmp	   #1
	beq FinaffV2	// Oui, Rien a faire 

// Sinon, Va-t-on l'afficher la prochaine fois ???
	lda	   level
	cmp	   #1 // Pas de deuxieme voiture pour le niveau 1
	bne okrandomV2
	jmp FinaffV2
okrandomV2:

// Si oui, on initialise un compteur
	lda	   CptV2
	cmp        #0
	beq okinitcptV2
	jmp deccptV2
okinitcptV2
	lda	   53770
	sta	  CptV2
	rts


// On decremente un compteur jusqu'a arriver a 0 pour permettre l'affichage de la voiture
deccptV2
	ldx	   CptV2
	dex
	stx	   CptV2
	cpx	   #0
	beq OkaffV2
	rts


OkaffV2:
// Nous allons la reafficher, il faut initialiser la position de la voiture lorsqu'elle va repartir
	lda	   #0
	sta incscore5V3
	lda	   #1
	sta	   StartV2
	lda        53770	// Choisissons une couleur dans notre tableau
	and	   #%00000111
	tax
	lda	   tabColor,x
        sta        707

// Pour cela, nous allons regarder la position de la bordure sur la premiere ligne de l'ecran

	// Position de la voiture en X
	lda	centre // Pour cela, nous reprenons le centre de la route
	asl	A      // Le point vaut 2x deplacement d'un sprite

	clc 	// Le sprite a son 0 (bord ecran visible) a 48
	adc	#48 // Pour position le PM sur l'ecran

	// Un peu d'aleatoire
	tax
	lda	53770
	and	#%10000000
	cmp	#0
	bne posplus5V2
	txa
	sec
	sbc	#25

	sta	PosX2
	sta     53251
	rts

posplus5V2:
	txa
	clc
	adc	#5
	
	sta	PosX2
	sta	53251
FinaffV2:
	rts

// Scrolling vertical du vehicule 1
deplaceV1:
	ldx	idx1
	cpx	#0
	beq debscrollV1
	lda 	colV2	// Collision ?
	beq debscrollV1
	rts

debscrollV1:
	ldy	   #173

bclScrollV1:
	lda	($e6),y
	iny
	sta	($e6),y
	dey
	dey
	cpy	#0
	bne bclScrollV1

// La voiture est-elle completement affichee, ou faut-il continuer de la dessiner
	lda	idx1
	cmp	#255
	beq fscrollcar1

// Suite au scrolling, il manque un morceau du vehicule !
        lda        #voiture&255
        sta        $e8

        lda        #voiture/256
        sta        $e9

	ldy	   idx1
	lda	   ($e8),y
	dey
	sty	   idx1
	ldy	   #1
	sta	   ($e6),y // On dessine la ligne manquante...et on decremente le compteur du dessin de la voiture
// Lorsque toute la voiture sera dessinee, il ne faudra plus continuer de la dessiner et simplement la scroller !

	jmp fscrollcar2
		
fscrollcar1:
// La voiture etant completement dessinee, on stocke 0 pour ne pas avoir de bave !
	ldy	   #1
	lda	   #0
	sta	   ($e6),y

fscrollcar2:
	ldy	PosY1 // La voiture va-t-elle sortir de la zone de jeux ?
	cpy     #174
	bne fscrollcar2suite
	lda     incscore5V2
	cmp	#0
	bne fscrollcar2suite

	/* Incrementation du score +10 points */	
	lda	#10
	sta	increment
	jsr	incscore

fscrollcar2suite
	cpy	#174+13
	bne FinscrollcarV1
// Oui, il faut donc reinitialiser les variables pour preparer le prochain affichage de celle-ci
	ldy	#0
	sty	PosY1   // Elle est au debut
	sty 	StartV1 // La voiture n'est plus demarree...
	ldy	#13	// encore 13 elements a dessiner de la voiture
	sty	idx1
	rts
FinscrollcarV1:
	iny		// On va mettre ajour sa position...
	sty	PosY1
        rts

deplaceV2:
// Scrolling vertical du vehicule 2
	ldx	idx2
	cpx	#0
	beq debscrollV2
	lda 	colV3	// Collision ?
	beq debscrollV2
	rts
debscrollV2:
	ldy	   #173
bclScrollV2:
	lda	($e6),y
	iny
	sta	($e6),y
	dey
	dey
	cpy	#0
	bne bclScrollV2

// La voiture est-elle completement affichee, ou faut-il continuer de la dessiner
	lda	idx2
	cmp	#255
	beq fscrollcar1b

// Suite au scrolling, il manque un morceau du vehicule !
        lda        #voiture&255
        sta        $e8

        lda        #voiture/256
        sta        $e9

	ldy	   idx2
	lda	   ($e8),y
	dey
	sty	   idx2
	ldy	   #1
	sta	   ($e6),y // On dessine la ligne manquante...et on decremente le compteur du dessin de la voiture
// Lorsque toute la voiture sera dessinee, il ne faudra plus continuer de la dessiner et simplement la scroller !

	jmp fscrollcar2b
		
fscrollcar1b:
// La voiture etant completement dessinee, on stocke 0 pour ne pas avoir de bave !
	ldy	   #1
	lda	   #0
	sta	   ($e6),y

fscrollcar2b:
	ldy	PosY2 // La voiture va-t-elle sortir de la zone de jeux ?
	cpy     #174
	bne fscrollcar2bsuite	
	
	lda     incscore5V3
	cmp	#0
	bne fscrollcar2suite

	/* Incrementation du score +10 points */	
	lda	#10
	sta	increment
	jsr	incscore

fscrollcar2bsuite:

	cpy	#174+13
	bne FinscrollcarV2
// Oui, il faut donc reinitialiser les variables pour preparer le prochain affichage de celle-ci
	ldy	#0
	sty	PosY2   // Elle est au debut
	sty 	StartV2 // La voiture n'est plus demarree...
	ldy	#13	// encore 13 elements a dessiner de la voiture
	sty	idx2
	rts
FinscrollcarV2:
	iny		// On va mettre ajour sa position...
	sty	PosY2
        rts


deplaceH1:
	lda 	colV2	// Collision ?
	cmp	#0
	bne deplaceH1DNon

	clc
	lda	PosY1	// Position verticale du PM
	adc	#7	// On va determiner la position de la voiture sur les bords de la route en son centre
	lsr	A // A convertir en position graphique (le sprite fait 4 deplacement pour 1 deplacement graphique)
	lsr	A // D'ou la division par 4
	tax	// Cette position servant d'index dans notre tableau liste des centres de la route
	lda	bpilecentre,x
	asl	A     // convertion en position x avec comme unite celle utilise par le sprite. Le point vaut 2x deplacement d'un sprite

	clc 	// Le sprite a son 0 (bord ecran visible) a 48
	adc	#48 // Pour position le PM sur l'ecran

	tax
	// Testons la position de la voiture avec le bord gauche
	lda	TailleRoute
	asl	A
	asl	A
	sta	ChpCalcTempo
	txa
	sec
	sbc	ChpCalcTempo // Centre - taille route ds unite sprite			
	clc
	adc	#4 // Marge de securite
	// Maintenant comparons avec la position de la voiture
	sec
	sbc	PosX1
	cmp	#0
	bmi deplaceH1GNon
	
	ldy	PosX1
	iny
	iny
	iny
	sty     PosX1
	sty	53250
deplaceH1GNon:

	// Testons maintenant a droite
	txa
	clc
	adc 	ChpCalcTempo
	sec
	sbc	#10 // Marge de securite avec une voiture qui fait deja 8 de large
	sta	ChpCalcTempo
	lda	PosX1
	sec
	sbc	ChpCalcTempo
	cmp	#0
	bmi deplaceH1DNon

	ldy	PosX1
	dey
	dey
	dey
	sty     PosX1
	sty	53250

deplaceH1DNon:
	rts

deplaceH2:
	lda 	colV3	// Collision ?
	cmp	#0
	bne deplaceH2DNon

	clc
	lda	PosY2	// Position verticale du PM
	adc	#7	// On va determiner la position de la voiture sur les bords de la route en son centre
	lsr	A // A convertir en position graphique (le sprite fait 4 deplacement pour 1 deplacement graphique)
	lsr	A // D'ou la division par 4
	tax	// Cette position servant d'index dans notre tableau liste des centres de la route
	lda	bpilecentre,x
	asl	A     // convertion en position x avec comme unite celle utilise par le sprite. Le point vaut 2x deplacement d'un sprite

	clc 	// Le sprite a son 0 (bord ecran visible) a 48
	adc	#48 // Pour position le PM sur l'ecran

	tax
	// Testons la position de la voiture avec le bord gauche
	lda	TailleRoute
	asl	A
	asl	A
	sta	ChpCalcTempo
	txa
	sec
	sbc	ChpCalcTempo // Centre - taille route ds unite sprite			
	clc
	adc	#4 // Marge de securite
	// Maintenant comparons avec la position de la voiture
	sec
	sbc	PosX2
	cmp	#0
	bmi deplaceH2GNon
	
	ldy	PosX2
	iny
	iny
	iny
	sty     PosX2
	sty	53251
deplaceH2GNon:

	// Testons maintenant a droite
	txa
	clc
	adc 	ChpCalcTempo
	sec
	sbc	#10 // Marge de securite avec une voiture qui fait deja 8 de large
	sta	ChpCalcTempo
	lda	PosX2
	sec
	sbc	ChpCalcTempo
	cmp	#0
	bmi deplaceH2DNon

	ldy	PosX2
	dey
	dey
	dey
	sty     PosX2
	sty	53251

deplaceH2DNon:
	rts

Jump:
	lda	phaseJump
	cmp	#0
	bne trtJump
	lda	#1
	sta	phaseJump
	ldx	#0
	stx	tempoJump
trtJump:
	ldx	tempoJump
	cpx	#0
	beq trtPhase1
	jmp trtJump1
trtPhase1:
	cmp	#1
	beq trtPhase1b
	jmp Phase2
trtPhase1b:
	lda	#1
	sta	53256
	sta	53257
	ldy	positionXCar // La voiture doit garder sa verticale
	dey
	dey
	dey
	dey
        sty        53248
        sty        53249
        sty        positionXCar
	jmp trtJump1

Phase2
	cmp	#2
	bne Phase3
	lda	#3
	sta	53256
	sta	53257
	ldy	positionXCar // La voiture doit garder sa verticale
	dey
	dey
	dey
	dey
        sty        53248
        sty        53249
        sty        positionXCar
	jmp trtJump1

Phase3
	cmp	#3
	bne Phase4
	lda	#1
	sta	53256
	sta	53257
	ldy	positionXCar // La voiture doit garder sa verticale
	iny
	iny
	iny
	iny
        sty        53248
        sty        53249
        sty        positionXCar

	jmp trtJump1

Phase4
	cmp	#4
	bne Phase5
	lda	#0
	sta	53256
	sta	53257
	ldy	positionXCar // La voiture doit garder sa verticale
	iny
	iny
	iny
	iny
        sty        53248
        sty        53249
        sty        positionXCar
	jmp trtJump1

Phase5:
	cmp	#5
	bne Phase6
	ldy	positionXCar // Perte de controle de la voiture
	dey
	dey
	dey
        sty        53248
        sty        53249
        sty        positionXCar
	jmp trtJump1

Phase6:
	cmp	#6
	bne Phase7
	ldy	positionXCar  // Perte de controle de la voiture
	dey
	dey
        sty        53248
        sty        53249
        sty        positionXCar
	jmp trtJump1

Phase7:
	cmp	#7
	bne Phase8
	ldy	positionXCar  // Perte de controle de la voiture
	iny
	iny
        sty        53248
        sty        53249
        sty       positionXCar
	jmp trtJump1

Phase8:
	lda	#0
	sta	phaseJump
	jmp FtrtJump

trtJump1:
	inx
	cpx 	#20
	bne FtrtJump
	ldx phaseJump
	inx
	stx phaseJump
	ldx 	#0
FtrtJump
	stx	tempoJump
	rts

clignote
	ldy	varclignote
	cpy	#0
	bne suiclignote
	rts
suiclignote
	sty	705
	dey
	sty	varclignote
	rts


phaseJump db 0
tempoJump db 0

StartV1 db 0 // A 1 indique qu'il faut dessiner la voiture
StartV2 db 0

CptV1   db 0 // compteur avant affichage de la voiture
CptV2   db 0

PosX1	db 0
PosX2   db 0

PosY1	db 0
PosY2   db 0

idx1	db 13
idx2	db 13   

tabColor db 15,20,40,100,0,180,221

players db 0
posBordGauche db 0

tstcouleur db 1

ChpCalcTempo db 0
varclignote db 0


include "datavoiture.i"

        
                                     