* * Blockade: Game * *-------------------------------------- * Gestion du jeu nowPLAY ldx currX ldy currY jsr calcPLATEAU tax lda plateauBACK,x ; on ne deplace pas and #$ff ; si on a qqch de fixe sta valueCURR cmp #$07 beq nowPLAY1 cmp #$11 bcs nowPLAY1 lda plateauFORE,x ; si rien en fore, alors retour and #$ff beq nowPLAY2 brl nowPLAY20 ; on a qqch en fore *--- nowPLAY1 ldy #6 jsr playSND ldx oldX ; retour sans changement stx currX ldy oldY sty currY lda oldC sta currC rts nowPLAY2 lda #06 ; on affiche le sprite ldx currX ldy currY jsr showSCREEN lda oldC ldx oldX ldy oldY jsr showSCREEN lda valueCURR sta currC ldy #4 jsr playSND rts *--- On a qqch en foreground nowPLAY20 sta currC jsr calcNEXT bcs nowPLAY1 tax lda plateauFORE,x and #$ff sta nextC cmp #$11 bcc nowPLAY201 brl nowPLAY1 nowPLAY201 eor currC cmp #1 bne nowPLAY22 jsr saveALL lda nextC ; regarde si CARRE cmp #$0a bcs nowPLAY21 ldy #10 jsr playSND dec nbPIECES ; CARRE -> effacer dec nbPIECES ldx nextX ldy nextY jsr calcPLATEAU tax lda plateauFORE,x and #$ff00 sta plateauFORE,x stz currC stz nextC brl nowPLAY40 nowPLAY21 lda nextC sec sbc #2 sta nextC ldy #0 jsr playSND stz currC dec nbPIECES brl nowPLAY40 nowPLAY22 cmp currC ; si =currC alors on a rien beq nowPLAY23 ; en fore brl nowPLAY1 nowPLAY23 lda currC sta nextC phx jsr saveALL plx *--- Rien en nextFore, regarde en nextBack nowPLAY30 lda plateauBACK,x and #$ff cmp #$07 beq nowPLAY31 cmp #$11 bcc nowPLAY32 nowPLAY31 brl nowPLAY1 nowPLAY32 ldy currC ; gestion du mur mouvant cpy #$10 bne nowPLAY321 sty nextC brl nowPLAY40 nowPLAY321 cmp #1 ; force jaune bne nowPLAY33 ldy #9 jsr playSND lda currC and #$fe sta nextC brl nowPLAY40 nowPLAY33 cmp #2 ; force bleu bne nowPLAY34 ldy #3 jsr playSND lda currC ora #$01 sta nextC brl nowPLAY40 nowPLAY34 cmp #3 ; echange couleur bne nowPLAY35 ldy #12 jsr playSND lda currC ; vire bit 0 and #$fe pha lda currC and #$01 ; garde bit 0 eor #$01 ; 0=>1 & 1=>0 ora 1,s ply sta nextC brl nowPLAY40 nowPLAY35 cmp #4 ; degenerateur bne nowPLAY37 lda currC cmp #$0e bcs nowPLAY36 clc adc #2 sta nextC ldy #5 jsr playSND nowPLAY36 brl nowPLAY40 nowPLAY37 cmp #5 ; teleporteur bne nowPLAY40 jsr manageTELE bcs nowPLAY40 stx nextX sty nextY lda currC sta nextC ldy #11 jsr playSND *--- Reaffiche tout ce qui a change nowPLAY40 lda #06 ; on affiche le curseur ldx currX ldy currY jsr showSCREEN lda oldC ; on reaffiche l'ancien sprite ldx oldX ldy oldY jsr showSCREEN ldy #8 jsr playSND lda nbPIECES cmp nbPIECES2 bne nowPLAY41 jsr saveALL nowPLAY41 ldx oldX ; on efface l'ancienne valeur ldy oldY jsr calcPLATEAU tax lda plateauFORE,x and #$ff00 sta plateauFORE,x ldx currX ldy currY jsr calcPLATEAU tax lda plateauFORE,x and #$ff00 sta plateauFORE,x ldx nextX ; on met la nouvelle valeur ldy nextY jsr calcPLATEAU tax lda plateauFORE,x and #$ff00 ora nextC sta plateauFORE,x lda nextC bne nowPLAY42 ldx nextX ; on met la nouvelle valeur ldy nextY jsr calcPLATEAU tax lda plateauBACK,x and #$ff nowPLAY42 ldx nextX ; affiche it ldy nextY jsr showSCREEN lda valueCURR sta currC lda #1 sta fgUNDO rts *--- Gestion du teleporteur manageTELE lda #1 sta deltaMVT ldx nextX stx teleX ldy nextY sty teleY *--- manageTELE1 lda deltaMVT asl asl clc adc #2 sta maxMVT ; nombre maxi de deplacement stz nbMVT ; nb de deplacements effectues ldx teleX ; calcul de l'adresse stx xFIRST ; de la premiere case stx xSECOND lda teleY sec sbc deltaMVT sta yFIRST sta ySECOND *--- manageTELE2 ldx xFIRST ldy yFIRST jsr manageTELE10 bcs manageTELE3 ldx xFIRST ldy yFIRST clc rts manageTELE3 ldx xSECOND ldy ySECOND jsr manageTELE10 bcs manageTELE4 ldx xSECOND ldy ySECOND clc rts *--- manageTELE4 lda nbMVT clc adc #2 sta nbMVT ; incremente le numero du mouvement cmp maxMVT bne manageTELE6 lda deltaMVT clc adc #1 sta deltaMVT cmp #16 beq manageTELE5 brl manageTELE1 manageTELE5 sec rts *--- manageTELE6 lda yFIRST clc adc #1 sta yFIRST sta ySECOND bmi manageTELE7 cmp teleY bcc manageTELE7 beq manageTELE7 inc xFIRST bra manageTELE8 manageTELE7 dec xFIRST manageTELE8 lda teleX sec sbc xFIRST clc adc teleX sta xSECOND brl manageTELE2 *--- manageTELE10 cpx #15 ; x<15 bcc manageTELE11 bra manageTELE15 manageTELE11 cpy #9 ; y<9 bcc manageTELE12 bra manageTELE15 manageTELE12 cpx currX ; sur curseur bne manageTELE13 cpy currY beq manageTELE15 manageTELE13 cpx teleX ; sur teleporteur de depart bne manageTELE14 cpy teleY beq manageTELE15 manageTELE14 jsr calcPLATEAU ; regarde si on a un teleporteur tax lda plateauBACK,x and #$ff cmp #$05 bne manageTELE15 lda plateauFORE,x and #$ff bne manageTELE15 clc rts manageTELE15 sec rts *-------------------------------------- saveALL ldx #0 sep #$20 ]lp lda plateauBACK,x sta plateauBACK2,x lda plateauFORE,x sta plateauFORE2,x inx cpx #15*9 bne ]lp rep #$20 ldx oldX stx copyX ldy oldY sty copyY lda oldC sta copyC lda nbPIECES sta nbPIECES2 rts *--- restoreALL lda fgUNDO bne restoreALL1 rts restoreALL1 ldx #0 sep #$20 ]lp lda plateauBACK,x pha lda plateauBACK2,x sta plateauBACK,x pla sta plateauBACK2,x lda plateauFORE,x pha lda plateauFORE2,x sta plateauFORE,x tay pla sta plateauFORE2,x tya bne restoreALL2 lda plateauBACK,x restoreALL2 sta plateauALL,x inx cpx #15*9 bne ]lp rep #$20 lda #showSCREEN sta printLEVEL1+1 jsr printLEVEL lda #showSPRITE sta printLEVEL1+1 lda coorX ldx copyX stx currX stx coorX sta copyX lda coorY ldy copyY sty currY sty coorY sta copyY lda currC pha lda copyC sta currC pla sta copyC lda #6 jsr showSCREEN ldx nbPIECES lda nbPIECES2 sta nbPIECES stx nbPIECES2 rts *-------------------------------------- * Routines diverses decodeLEVEL lda ptrLEVEL sta Debut lda ptrLEVEL+2 sta Debut+2 lda #0 ldx level ]lp dex cpx #0 beq decodeLEVEL1 clc adc #$b8 bra ]lp decodeLEVEL1 clc adc Debut sta Debut lda Debut+2 adc #0 sta Debut+2 *--- Recopie nom ldy #24-2 ]lp lda [Debut],y sta levelNAME,y dey dey bpl ]lp *--- Recopie fond lda Debut clc adc #$18 sta Debut lda Debut+2 adc #0 sta Debut+2 lda #plateauALL sta Arrivee lda #^plateauALL sta Arrivee+2 ldx #9 decodeLEVEL2 ldy #14 ]lp lda [Debut],y sta [Arrivee],y dey dey bpl ]lp lda Debut clc adc #16 sta Debut lda Arrivee clc adc #15 sta Arrivee dex bne decodeLEVEL2 lda [Debut] xba sta nbPIECES *--- Gere le premier plan sep #$20 ldx #0 ]lp lda plateauALL,x cmp #$06 beq decodeLEVEL3 cmp #$13 bcs decodeLEVEL5 cmp #$08 bcs decodeLEVEL4 bra decodeLEVEL5 decodeLEVEL3 lda #0 decodeLEVEL4 sta plateauFORE,x stz plateauBACK,x bra decodeLEVEL6 decodeLEVEL5 sta plateauBACK,x stz plateauFORE,x decodeLEVEL6 inx cpx #15*9 bne ]lp rep #$20 stz fgUNDO rts *-------------------------------------- putLEVEL sep #$20 ldx level lda scdVAR,x and #$f0 lsr lsr lsr lsr ora #'0' cmp #'0' bne putLEVEL0 lda #' ' putLEVEL0 sta strLEVEL lda scdVAR,x and #$0f ora #'0' sta strLEVEL+1 rep #$20 putLEVEL1 lda #strLEVEL ldx #$00e1 ldy #$95f0 jsr printIT lda ptrSCR clc adc #$75f0 tay lda #strLEVEL ldx ptrSCR+2 jsr printIT rts *-------------------------------------- printLEVEL lda #0 sta printY sta showX sta showY ]lp tax lda plateauALL,x and #$ff ldx showX ldy showY cmp #$06 bne printLEVEL1 stx currX stx coorX stx oldX sty currY sty coorY sty oldY printLEVEL1 jsr showSPRITE inc showX lda showX cmp #15 bne printLEVEL2 stz showX inc showY printLEVEL2 inc printY lda printY cmp #15*9 bne ]lp *--- Affiche le nom lda levelNAME and #$ff tax stz levelNAME1,x lda #$7598 clc adc ptrSCR tay lda #levelNAME1 ldx ptrSCR+2 jsr printIT jsr putLEVEL rts *-------------------------------------- showSCREEN phy asl tay lda adrSPRITE,y clc adc ptrSPRITE sta Debut lda ptrSPRITE+2 adc #0 sta Debut+2 ply jsr calcWHAT clc adc #$2005 sta Arrivee lda #$00e1 sta Arrivee+2 bra showSPRITE1 *-------------------------------------- showSPRITE phy asl tay lda adrSPRITE,y clc adc ptrSPRITE sta Debut lda ptrSPRITE+2 adc #0 sta Debut+2 ply jsr calcWHAT clc adc #5 ; Correctif centre clc adc ptrSCR sta Arrivee lda ptrSCR+2 adc #0 sta Arrivee+2 showSPRITE1 ldx #20 ldy #0 ]lp lda [Debut],y sta [Arrivee],y iny iny lda [Debut],y sta [Arrivee],y iny iny lda [Debut],y sta [Arrivee],y iny iny lda [Debut],y sta [Arrivee],y iny iny lda [Debut],y sta [Arrivee],y tya clc adc #160-8 tay dex bne ]lp rts *-------------------------------------- calcWHAT tya asl tay lda scrY,y pha txa asl tax lda scrX,x clc adc 1,s plx rts *-------------------------------------- calcPLATEAU lda platY,y and #$ff pha txa clc adc 1,s plx clc rts *-------------------------------------- calcNEXT lda currX sta nextX lda currY sta nextY lda theDIR ; left bne calcNEXT1 lda nextX beq calcNEXT5 dec nextX bra calcNEXT4 calcNEXT1 cmp #1 ; right bne calcNEXT2 lda nextX cmp #14 beq calcNEXT5 inc nextX bra calcNEXT4 calcNEXT2 cmp #2 ; up bne calcNEXT3 lda nextY beq calcNEXT5 dec nextY bra calcNEXT4 calcNEXT3 lda nextY ; down cmp #8 beq calcNEXT5 inc nextY calcNEXT4 ldx nextX ldy nextY jsr calcPLATEAU clc rts calcNEXT5 sec rts *-------------------------------------- preparePIC lda ptrSPRITE sta Debut lda ptrSPRITE+2 sta Debut+2 lda ptrSCR sta Arrivee lda ptrSCR+2 sta Arrivee+2 ldy #0 tya ]lp sta [Arrivee],y iny iny bpl ]lp ldy #180*160 ]lp lda [Debut],y sta [Arrivee],y iny iny bpl ]lp rts *--- Jeu level ds 2 oldLEVEL ds 2 strLEVEL asc ' '00 nbPIECES ds 2 nbPIECES2 ds 2 fgUNDO ds 2 printY ds 2 showX ds 2 showY ds 2 valueCURR ds 2 xFIRST ds 2 ; teleporteur yFIRST ds 2 xSECOND ds 2 ySECOND ds 2 nbMVT ds 2 maxMVT ds 2 teleX ds 2 teleY ds 2 deltaMVT ds 2 oldX ds 2 ; ancien oldY ds 2 oldC ds 2 currX ds 2 ; courant currY ds 2 currC ds 2 nextX ds 2 ; le premier apres nextY ds 2 nextC ds 2 copyX ds 2 ; sauvegarde copyY ds 2 copyC ds 2 theDIR ds 2 theKEY ds 2 scrX dw $00,$0a,$14,$1e,$28,$32,$3c,$46 dw $50,$5a,$64,$6e,$78,$82,$8c scrY dw $0000,$0c80,$1900,$2580,$3200 dw $3e80,$4b00,$5780,$6400 adrSPRITE dw $141,$14c,$157,$162,$16d,$178,$183 dw $18e,$199,$1a4,$1af,$1ba,$1c5,$1d0 dw $f01,$f0c,$f17,$f22,$f2d,$f38,$f43 dw $f4e,$f59,$f64,$f6f,$f7a,$f85,$f90 platY db 0,15,30,45,60,75,90,105,120,135 levelNAME ds 1 levelNAME1 ds 24 plateauALL ds 15*9 plateauBACK2 ds 15*9 plateauFORE2 ds 15*9 plateauBACK ds 15*9 plateauFORE ds 15*9