mise à jour majeure (4 niveaux jouable)
version0.4
[URL=
http://img507.imageshack.us/i/fofo3.jpg/][IMG]
http://img507.imageshack.us/img507/6223/fofo3.jpg[/IMG][/URL]
exe:
Fichier joint : globshoot_04.o
code source, 1er partie:
/*
Glob Shoot version 0.4 - LYNX - kit BLL (newcc65)
10/11/2010
console tenu à la verticale
Handy/Option/Rotate Screen(Right)
D-pad et bouton pause
LYNX-image */
#include <lynx.h>
#include <lynxlib.h>
#include <stdlib.h>
#include "inc\fond1.pal" // Ceci sert à inclure le fichier palette généré par sprpck
/* LYNX-specific #defines: */
#define JOY_RIGHT 0x10
#define JOY_LEFT 0x20
#define JOY_DOWN 0x40
#define JOY_UP 0x80
#define BUTTON_OPTION1 0x08
#define BUTTON_OPTION2 0x04
#define BUTTON_LEFT 0x02
#define BUTTON_RIGHT 0x01
#define BUTTON_PAUSE 0x01
//#define SWITCHES 0x01
//#define SC BSTRETC H(a) (*(uint *)((a)+15)) // déformation, macro
//#define SC BTILT(a) (*(uint *)((a)+17)) // déformation, macro
char SCREEN[8160] at (MEMTOP-16320);
char RENDER[8160] at (MEMTOP-8160);
extern char fond1[]; // ecran titre
//extern char fond2[]; // image decor monde 1, d'une taille de 32*102; il faudra donc scroller 6 images de droite à gauche.
extern char fondlvl[]; // image fond level, d'une taille de 32*102;
extern char gameover[]; // image game over, d'une taille de 20*32;
extern char ipause[]; // image game over, d'une taille de 13*43;
extern char pushup[]; // image game over, d'une taille de 48*35;
char SCB[];
#asm
_SCB dc.b $c0,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm
extern char fond2[]; // image decor monde 1, d'une taille de 32*102; il faudra donc scroller 6 images de droite à gauche.
extern char fond3[]; // image decor monde 1, d'une taille de 32*102; il faudra donc scroller 6 images de droite à gauche.
char SCBfond2[]; // à la 3ème ligna asm, j'ai remplacé 100 par 200 pour doubler la largeur du décor (nbre de colonne * 2)
#asm
_SCBfond2 dc.b $c0,$10,$20
dc.w 0,0
dc.w 0,0,$200,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm
// ------------------------------------
char SCBgsf1[]; // déclaration d'un nouveau controleur de sprite
char SCBgsf2[]; // déclaration d'un nouveau controleur de sprite
char SCBgsf3[]; // déclaration d'un nouveau controleur de sprite
char SCBgsf4[]; // déclaration d'un nouveau controleur de sprite
char SCBgsf5[]; // déclaration d'un nouveau controleur de sprite
char SCBgsf6[]; // déclaration d'un nouveau controleur de sprite
#asm
_SCBgsf1 dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
;
_SCBgsf2 dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
;
_SCBgsf3 dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
;
_SCBgsf4 dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
;
_SCBgsf5 dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
;
_SCBgsf6 dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm
// ------------------------------------
// déclaration des objets sprites qui seront linkés
char sprite1[]; //
extern char sprite2[]; // coque (taille: 30*24)
// A partir du sprite1, je souhaite obtenir 6 images, de 0 à 5, du moteur à élice :
// clip du sprite 1
extern char sp000000[];
extern char sp000001[];
extern char sp000002[];
extern char sp000003[];
extern char sp000004[];
extern char sp000005[];
char *sprtab[6] = {sp000000, sp000001, sp000002, sp000003, sp000004, sp000005};
char SCBsprite1[]; // déclaration d'un nouveau controleur de sprite, moteur à hélice
char SCBsprite2[]; // déclaration d'un nouveau controleur de sprite, coque
#asm
_SCBsprite1 dc.b $c7,$10,$20
dc.w _SCBsprite2,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
_SCBsprite2 dc.b $c7,$10,$20
dc.w 0, _sprite2
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm
// $c0 couleur 0 pas transparente
// $c7 couleur transparente
// ------------------------------------
char chiffres[]; //
// clip du sprite chiffres: 0123456789.L
extern char ch000000[];
extern char ch000001[];
extern char ch000002[];
extern char ch000003[];
extern char ch000004[];
extern char ch000005[];
extern char ch000006[];
extern char ch000007[];
extern char ch000008[];
extern char ch000009[];
extern char ch000010[];
extern char ch000011[];
char *chiffrestab[12] = {ch000000, ch000001, ch000002, ch000003, ch000004,
ch000005, ch000006, ch000007, ch000008,ch000009,
ch000010, ch000011};
char SCBchiffres1[]; // déclaration d'un nouveau controleur de sprite
char SCBchiffres2[]; // déclaration d'un nouveau controleur de sprite
char SCBchiffres3[]; // déclaration d'un nouveau controleur de sprite
#asm
_SCBchiffres1 dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
;
_SCBchiffres2 dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
;
_SCBchiffres3 dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm
// ------------------------------------
// ------------------------------------
char jauge[]; //
// clip du sprite jauge d'énergie du shiplayer
extern char ja000000[];
extern char ja001000[];
extern char ja002000[];
extern char ja003000[];
extern char ja004000[];
extern char ja005000[];
extern char ja006000[];
extern char ja007000[];
extern char ja008000[];
extern char ja009000[];
char *jaugetab[10] = {ja000000, ja001000, ja002000, ja003000, ja004000,
ja005000, ja006000, ja007000, ja008000, ja009000};
char SCBjauge[]; // déclaration d'un nouveau controleur de sprite
#asm
_SCBjauge dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm
// ------------------------------------
// ------------------------------------
char rhume[]; //
// clip du sprite rhume, que le nanoship doit capturer.
extern char rh000000[];
extern char rh000001[];
extern char rh000002[];
extern char rh000003[];
extern char rh000004[];
extern char rh000005[];
extern char rh000006[];
char *rhumetab[7] = {rh000000, rh000001, rh000002, rh000003, rh000004,
rh000005, rh000006};
char SCBrhume[]; // déclaration d'un nouveau controleur de sprite
#asm
_SCBrhume dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm
// ------------------------------------ c0 à la plce de c7 desactive la couleur 0 (transparente)
// ------------------------------------
char roch[]; //
// clip du sprite rhume, que le nanoship doit capturer.
extern char ro000000[];
extern char ro000001[];
extern char ro000002[];
extern char ro000003[];
extern char ro000004[];
extern char ro000005[];
extern char ro000006[];
extern char ro000007[];
extern char ro000008[];
extern char ro000009[];
extern char ro000010[];
extern char ro000011[];
extern char ro000012[];
extern char ro000013[];
extern char ro000014[];
extern char ro000015[];
extern char ro000016[];
extern char ro000017[];
char *rochtab[18] = {ro000000, ro000001, ro000002, ro000003, ro000004,
ro000005, ro000006, ro000007, ro000008, ro000009,
ro000010, ro000011, ro000012, ro000013, ro000014,
ro000015, ro000016, ro000017};
char SCBroch[]; // déclaration d'un nouveau controleur de sprite
char SCBroch2[]; // déclaration d'un nouveau controleur de sprite
#asm
_SCBroch dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
_SCBroch2 dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm
// ------------------------------------
// variable (int = 2 octets ; char = 1 octet)
int posx,posy,level,xpush,ypush,xlvla,xlvlb,xlvlc,xlvld,xlvle,elvl; //
int i,score,energ,nbrnext,nbrnexu; // nbrnext : nombre de fois où l'on repositionne le décor, afin de déterminer la longueur d'un level...
int compteur,scrollx;
char goship,t,tempa,tempb,tempc,tempd,tempe,etape,gspause,gslife,stopm,drap1,nodecor,boumgb,aaroch,nbboum,scboom,outship,gsblip; // de -128 à 127
char tyroch,chroch;
char tyroch2,chroch2;
char gshas,gshat; // hasard "aidé" (incrementation en attendant l'appuis sur D-pad haut)
int govil,vil,vilx,tempvilx,speedvil,vily,avil,tempavil,hasa,hasam,hasar;
int aroch,temparoch;
int goroch,eroch,rochx,temprochx,rochy,rasa,rasam,rasar;
int goroch2,eroch2,roch2x,temprochx2,roch2y,rbsa,rbsam,rbsar;
int unite;
int dizaine;
int centaine;
int tgovil,vroch;
int atest; // variable utilisée pour tester des trucs et des machins (pas de debug, donc système D)
// assembler vertical retrace syncronisation routine
void Vsync()
{
#asm
vretrace:
lda $fd0a
bne vretrace
#endasm
}
// Hors de l'assembleur, point de salut...
// L'utilisation de la procedure suivante, lors de l'écran d'action,
// fait ramer le jeu.
void Fchiffres(clx,cly,classe)
int clx,cly,classe;
{
SCBDATA(SCBchiffres1) = chiffrestab[classe%12];
SCBX(SCBchiffres1) = clx;
SCBY(SCBchiffres1) = cly;
DrawSprite(SCBchiffres1);
}
/**************************************************************************
** **
** **
**************************************************************************/
char main()
//main()
{
InitIRQ();
CLI;
SetBuffers(SCREEN, RENDER ,0);
// SCBX(SCB) = 0;
// SCBY(SCB) = 0;
// SCBDATA(SCB) = fond1;
// SCBNEXT(SCB) = SCBromeo; // chainage de sprite
// SCBX(SCBromeo) = 0;
// SCBY(SCBromeo) = 0;
// SCBDATA(SCBromeo) = romeotab[0%6];
/* set the palette */
SetRGB(pal); // Ceci sert à changer la palette de la Lynx (16 couleurs).
//DrawFBox(0,0,160,102,0);
SCBX(SCB) = 0;
SCBY(SCB) = 0;
SCBDATA(SCB) = fond1;
// SCBNEXT(SCB) = SCBfond2; // chainage de sprite
// SCBX(SCBfond2) = 0;
// SCBY(SCBfond2) = 0;
// SCBDATA(SCBfond2) = fond2;
// SCBNEXT(SCBfond2) = SCBsprite1; // chainage de sprite
// SCBX(SCBsprite1) = 0;
// SCBY(SCBsprite1) = 0;
// SCBDATA(SCBsprite1) = sprite1;
// SCBNEXT(SCBsprite1) = SCBsprite2; // chainage de sprite
// SCBX(SCBsprite2) = 58;
// SCBY(SCBsprite2) = 52;
// SCBDATA(SCBsprite2) = sprite2;
// 1er sprite chainé (fond + shiplayer)
SCBX(SCBgsf1) = 0;
SCBY(SCBgsf1) = 0;
SCBDATA(SCBgsf1) = fond2;
SCBNEXT(SCBgsf1) = SCBgsf2; // chainage de sprite 2ème image fond
SCBX(SCBgsf2) = 32;
SCBY(SCBgsf2) = 0;
SCBDATA(SCBgsf2) = fond2;
SCBNEXT(SCBgsf2) = SCBgsf3; // chainage de sprite 3ème image fond
SCBX(SCBgsf3) = 64;
SCBY(SCBgsf3) = 0;
SCBDATA(SCBgsf3) = fond2;
SCBNEXT(SCBgsf3) = SCBgsf4; // chainage de sprite 4ème image fond
SCBX(SCBgsf4) = 96;
SCBY(SCBgsf4) = 0;
SCBDATA(SCBgsf4) = fond2;
SCBNEXT(SCBgsf4) = SCBgsf5; // chainage de sprite 5ème image fond
SCBX(SCBgsf5) = 128;
SCBY(SCBgsf5) = 0;
SCBDATA(SCBgsf5) = fond2;
SCBNEXT(SCBgsf5) = SCBgsf6; // chainage de sprite 6ème image fond
SCBX(SCBgsf6) = 160;
SCBY(SCBgsf6) = 0;
SCBDATA(SCBgsf6) = fond2;
SCBNEXT(SCBgsf6) = SCBsprite1; // chainage de sprite shiplayer
SCBX(SCBsprite1) = 0;
SCBY(SCBsprite1) = 0;
SCBDATA(SCBsprite1) = sprite1;
// coordonnées X et Y du shiplayer, moteur à hélice :
// SCBX(SCBsprite1) = 0;
// SCBY(SCBsprite1) = 0;
// SCBDATA(SCBsprite1) = sprite1;
// coordonnées X et Y du shiplayer, coque :
// SCBX(SCBsprite2) = 58;
// SCBY(SCBsprite2) = 52;
// SCBDATA(SCBsprite2) = sprite2;
// 2ème sprite chainé (rocher et rhume)
SCBX(SCBroch) = 0;
SCBY(SCBroch) = 0;
SCBDATA(SCBroch) = roch;//rochtab[0%18];
SCBNEXT(SCBroch) = SCBroch2; // chainage de sprite
SCBX(SCBroch2) = 0;
SCBY(SCBroch2) = 0;
SCBDATA(SCBroch2) = roch;//rochtab[0%18];
SCBNEXT(SCBroch2) = SCBrhume; // chainage de sprite
SCBX(SCBrhume) = 32;
SCBY(SCBrhume) = 0;
SCBDATA(SCBrhume) = rhume;
// 3ème sprite chainé (jauge et score)
// SCBX(SCBjauge) = 0;
// SCBY(SCBjauge) = 0;
// SCBDATA(SCBjauge) = jauge;//rochtab[0%18];
// SCBNEXT(SCBjauge) = chiffres; // chainage de sprite
// SCBX(SCBchiffres) = 0;
// SCBY(SCBchiffres) = 0;
// SCBDATA(SCBchiffres) = chiffres;
// 3ème sprite chainé (score)
SCBX(SCBchiffres1) = 0;
SCBY(SCBchiffres1) = 0;
SCBDATA(SCBchiffres1) = chiffres;
SCBNEXT(SCBchiffres1) = SCBchiffres2; // chainage de sprite
SCBX(SCBchiffres2) = 0;
SCBY(SCBchiffres2) = 0;
SCBDATA(SCBchiffres2) = chiffres;
SCBNEXT(SCBchiffres2) = SCBchiffres3; // chainage de sprite
SCBX(SCBchiffres3) = 0;
SCBY(SCBchiffres3) = 0;
SCBDATA(SCBchiffres3) = chiffres;
// coordonnées X et Y de la jauge :
SCBX(SCBjauge) = 0;
SCBY(SCBjauge) = 0;
SCBDATA(SCBjauge) = jauge;
// coordonnées X et Y des chiffres et des lettres :
// SCBX(SCBchiffres) = 0;
// SCBY(SCBchiffres) = 0;
// SCBDATA(SCBchiffres) = chiffres;
// posx = -40;
// posy = -39;
xpush=-48;
ypush=34;
xlvla=160;xlvlb=160;xlvlc=160;xlvld=160;xlvle=160;
elvl=0;
/**************************************************************************
** BOUCLE PRINCIPALE **
**************************************************************************/
for(;;) // boucle principale
{
// test affichage nombre de sprite:
if (joystick & (BUTTON_RIGHT)) nodecor=1;//{nodecor=1;DrawFBox(0,0,160,102,0);}
if (joystick & (BUTTON_LEFT)) nodecor=0;
// *********************************************************************************************
if (etape==0) // écran titre
{
SCBX(SCB) = 0;
SCBY(SCB) = 0;
SCBDATA(SCB) = fond1;
DrawSprite(SCB); // affichage fond1
// SCBDATA(SCBchiffres1) = chiffrestab[0%12]; // 0
// SCBX(SCBchiffres1) = 2;
// SCBY(SCBchiffres1) = 20;
// DrawSprite(SCBchiffres1);
Fchiffres(2,20,0); // 0
// SCBDATA(SCBchiffres1) = chiffrestab[10%12]; // .
// SCBX(SCBchiffres1) = 2;
// SCBY(SCBchiffres1) = 25;
// DrawSprite(SCBchiffres1);
Fchiffres(2,25,10); //.
// SCBDATA(SCBchiffres1) = chiffrestab[4%12]; // 4
// SCBX(SCBchiffres1) = 2;
// SCBY(SCBchiffres1) = 30;
// DrawSprite(SCBchiffres1);
Fchiffres(2,30,4); //3
// SCBDATA(SCBchiffres1) = chiffrestab[2%12]; // 2
// SCBX(SCBchiffres1) = 2;
// SCBY(SCBchiffres1) = 35;
// DrawSprite(SCBchiffres1);
// Fchiffres(2,35,2); //2
Fchiffres(88,75,2); // 2
Fchiffres(88,79,0); // 0
Fchiffres(88,83,1); // 1
Fchiffres(88,87,0); // 0
SCBDATA(SCB) = pushup;
SCBX(SCB) = xpush;//48;
SCBY(SCB) = ypush;
DrawSprite(SCB);
if (xpush<8) xpush=xpush+2;
if (xpush>7)//(tempa>24 & etape==0) // petite teporisation avant d'autoriser le joueur de recommencer le jeu.
{
xpush=7;
++tempa; // bulle info clignote doucement
if (tempa>63) tempa=1;
if (tempa>0 & tempa<32) ypush=34;
if (tempa>31) ypush=200;
if (joystick & JOY_RIGHT)
{
level=1;//3;//1;
tempa=0;xpush=-48;ypush=34;xlvla=160;xlvlb=160;xlvlc=160;xlvld=160;xlvle=160;elvl=0;
etape=1; energ=10;score=0;drap1=0; // drap1 agit sur l'affichage du score.
goship=0; posx=-40; posy=39;gslife=3;
govil=0;goroch=0;tyroch=0;chroch=0;
SCBDATA(SCB) = fondlvl;
}
}
}
// *********************************************************************************************
if (etape==1 | etape==8 | etape==9) // écran level OU ecran perd une vie/game over
{
if (elvl<4) DrawFBox(0,0,160,102,0);
SCBDATA(SCB) = fondlvl;
for (compteur = 0 ; compteur < 5 ; compteur++) // de 0 à 4, ce qui fait 5. Grâce à la boucle for...
{
//SCBX(SCB) = compteur*32; // ...on incrémente la position X de chaque nouvelle image...
//SCBX(SCB) = (compteur*32)+xlvl; // ...on incrémente la position X de chaque nouvelle image...
// if (compteur==elvl)
// {
// xlvl=xlvl-4;
// if (xlvl<1+(elvl*32)) {xlvl=0+(elvl*32);++elvl;}
// SCBX(SCB) = (compteur*32)+xlvl;
// if (compteur!=elvl) {xlvl=160;}
// }
if (compteur==0)
{
if (elvl==0)
{
xlvla=xlvla-8;
if (xlvla<1) {xlvla=0;++elvl;}
}
SCBX(SCB) = xlvla;
}
if (compteur==1)
{
if (elvl==1)
{
xlvlb=xlvlb-8;
if (xlvlb<33) {xlvlb=32;++elvl;}
}
SCBX(SCB) = xlvlb;
}
if (compteur==2)
{
if (elvl==2)
{
xlvlc=xlvlc-8;
if (xlvlc<65) {xlvlc=64;++elvl;}
}
SCBX(SCB) = xlvlc;
}
if (compteur==3)
{
if (elvl==3)
{
xlvld=xlvld-8;
if (xlvld<97) {xlvld=96;++elvl;}
}
SCBX(SCB) = xlvld;
}
if (compteur==4)
{
if (elvl==4)
{
xlvle=xlvle-8;
if (xlvle<127) {xlvle=128;++elvl;}
}
SCBX(SCB) = xlvle;
}
SCBY(SCB) =0;
DrawSprite(SCB); // ... et ainsi on affiche fondlvl 5 fois la même image (taille: 32*102) l'une àprès l'autre, à un intervalle de 32.
}
}
// *********************************************************************************************
if (etape==1)
{
if (level>4) level=1; // temporaire
// SCBDATA(SCBchiffres) = chiffrestab[11%12]; // L
// SCBX(SCBchiffres) = 93;
// SCBY(SCBchiffres) = 44;
// DrawSprite(SCBchiffres);
Fchiffres(118,44,11);
// SCBDATA(SCBchiffres) = chiffrestab[10%12]; // -
// SCBX(SCBchiffres) = 93;
// SCBY(SCBchiffres) = 44+5;
// DrawSprite(SCBchiffres);
Fchiffres(118,49,10);
// SCBDATA(SCBchiffres) = chiffrestab[level%12]; // 1
// SCBX(SCBchiffres) = 93;
// SCBY(SCBchiffres) = 44+10;
// DrawSprite(SCBchiffres);
Fchiffres(118,57,level);
Fchiffres(86,57,gslife); // nbre de vie
SCBDATA(SCBrhume) = rhumetab[5%7]; // coeur
SCBX(SCBrhume) = 82;
SCBY(SCBrhume) = 39;
DrawSprite(SCBrhume);
// if (tempa<80) ++tempa; // durée de l'écran de présentation : level et nbre de life
// if (tempa>79)
// {
SCBDATA(SCB) = pushup;
SCBX(SCB) = xpush;//48;
SCBY(SCB) = ypush;
DrawSprite(SCB);
if (xpush<8 & elvl==5) xpush=xpush+2;
if (xpush>7)
{
xpush=8;
++tempa; // bulle info clignote doucement
if (tempa>63) tempa=1;
if (tempa>0 & tempa<32) ypush=34;
if (tempa>31) ypush=200;
// SCBX(SCBroch) = 20;
// SCBY(SCBroch) = 39;
// SCBDATA(SCBroch) = rochtab[18%18];
// DrawSprite(SCBroch); // Affichage sprites chainés (rocher + rhume)
++gshas;
if (gshas==3) gshas=1; // 1 ou 2
//if (joystick & (BUTTON_LEFT))
if (joystick & JOY_RIGHT)
{
gshat=1; // hasard "aidé"
SCBX(SCBroch) = 200;
tempa=0;xpush=-48;ypush=34;etape=2;SCBDATA(SCB) = fond2;drap1=1;
xlvla=160;xlvlb=160;xlvlc=160;xlvld=160;xlvle=160;elvl=0;
govil=0;
eroch=0;goroch=0;eroch2=0;goroch2=0;
rochx=180;SCBX(SCBroch) = rochx;
roch2x=180;SCBX(SCBroch2) = roch2x;
boumgb=0;SCBX(SCBrhume) = -100;
// level 1 : virus lent ; petit rocher lent
// level 2 : virus rapide ; petit rocher lent ; gros rocher lent
// level 3 : virus rapide ; petit rocher rapide ; gros rocher rapide
// level 4 : virus rapide*2 ; petit rocher rapide ; gros rocher rapide
// level 5 : virus rapide*2 ; petit rocher rapide *2; gros rocher rapide *2
// level 6 : virus rapide*3 ; petit rocher rapide *2; gros rocher rapide *2
// level 7 : virus rapide*3 ; petit rocher rapide *3; gros rocher rapide *3
// level 1,2,3,4,5 et 6: virus --> govil>31
// level 7 : virus lent ; petit rocher lent
// level 8 : virus lent ; petit rocher lent ; gros rocher lent
// level 9 : virus rapide ; petit rocher lent ; gros rocher lent
// level 10 : virus rapide ; petit rocher rapide ; gros rocher rapide
// level 11 : virus rapide ; petit rocher rapide *2; gros rocher rapide *2
// level 12 : virus rapide ; petit rocher rapide *4; gros rocher rapide *4
// level 7,8,9,10,11 et 12: virus --> govil>93
if (level>0 & level<8) {tgovil=32;} // vitesse de sortie des virus
if (level>7 & level<11) {tgovil=96;}
speedvil=0; // vitesse de déplacement des virus
// if (level==1) speedvil=1;
// if (level==2 | level==3) speedvil=2;
// if (level==4 | level==5) speedvil=3;
// if (level==6 | level==7) speedvil=4;
//if (level==1) speedvil=1;
if (level==1 | level==2 | level==3 | level==4) speedvil=1;
//if (level==5) speedvil=1;
if (level==6 | level==7 | level==8 | level==9) speedvil=0;
//if (level==10) speedvil=1;
//if (level==6 | level==7) speedvil=1;
//speedvil=1;
// vitesse des rochers :
vroch=1;
if (level==1) {eroch2=-1;} // interdit le 2ème rocher pour le 1er niveau
if (level==3 | level==4) vroch=2; //
//if (level==3) vroch=1,5; //
//if (level==4) vroch=2; //
//if (level==5 | level==6) vroch=3;// trop rapide
//if (level==7) vroch=4;// trop rapide
SCBHS(SCBroch) = 0x100;SCBVS(SCBroch) = 0x100;
tyroch=0;chroch=0;
if (level>1) tyroch=1;
SCBHS(SCBroch2) = 0x100;SCBVS(SCBroch2) = 0x100;
tyroch2=0;chroch2=0;
if (level>2) tyroch2=1;
if (level==1 | level==6)
{
SCBDATA(SCBgsf1) = fond2;
SCBDATA(SCBgsf2) = fond2;
SCBDATA(SCBgsf3) = fond2;
SCBDATA(SCBgsf4) = fond2;
SCBDATA(SCBgsf5) = fond2;
SCBDATA(SCBgsf6) = fond2;
}
if (level==2 | level==7)
{
SCBDATA(SCBgsf1) = fond3;
SCBDATA(SCBgsf2) = fond3;
SCBDATA(SCBgsf3) = fond3;
SCBDATA(SCBgsf4) = fond3;
SCBDATA(SCBgsf5) = fond3;
SCBDATA(SCBgsf6) = fond3;
}
if (level==3 | level==8)
{
SCBDATA(SCBgsf1) = fond2;
SCBDATA(SCBgsf2) = fond2;
SCBDATA(SCBgsf3) = fond2;
SCBDATA(SCBgsf4) = fond2;
SCBDATA(SCBgsf5) = fond2;
SCBDATA(SCBgsf6) = fond2;
}
if (level==4 | level==9)
{
SCBDATA(SCBgsf1) = fond3;
SCBDATA(SCBgsf2) = fond3;
SCBDATA(SCBgsf3) = fond3;
SCBDATA(SCBgsf4) = fond3;
SCBDATA(SCBgsf5) = fond3;
SCBDATA(SCBgsf6) = fond3;
}
}
}
}
// *********************************************************************************************
// Affichage de 4 images pour le décors, les 2 images du shiplayer, la jauge et les 2 images du score.
if (etape==2)
{
++gsblip; // economie ressource machine --> certaines des conditions n'ont pas besoin d'être lu par la LYNX à chaque boucle.
if (gsblip==5)
{
gsblip=1;
/*
if (joystick & BUTTON_PAUSE)
{
if (gspause==0) gspause=1;
}
if (!(joystick & BUTTON_PAUSE))
{
if (gspause==1) gspause=2;
}
if (joystick & BUTTON_PAUSE)
{
if (gspause==2) gspause=3;
}
if (!(joystick & BUTTON_PAUSE))
{
if (gspause==3) gspause=0;
}
*/
// /* probleme à resoudre : bouton pause
if (switches & BUTTON_PAUSE)
{
if (gspause==0) gspause=1;
}
if (!(switches & BUTTON_PAUSE))
{
if (gspause==1) gspause=2;
}
if (switches & BUTTON_PAUSE)
{
if (gspause==2) gspause=3;
}
if (!(switches & BUTTON_PAUSE))
{
if (gspause==3) gspause=0;
}
// */
}
// ********* decor :
//scrollx=2
if (gspause==0) scrollx=2; // vitesse de défilement du décor
if (gspause>0)
{
scrollx=0; // vitesse de défilement du décor
// SCBX(SCBroch) = 70;
// SCBY(SCBroch) = 39;
// SCBDATA(SCBroch) = rochtab[19%18];
// DrawSprite(SCBroch); // Affichage sprites chainés (rocher + rhume)
// SCBDATA(SCB) = ipause;
// SCBX(SCB) = 70;
// SCBY(SCB) = 39;
// DrawSprite(SCB);
}
/***************************************************************************
** Problème de ralentissement au bout de 20 secondes de jeu : **
** problème résolu en chainant les sprites. **
***************************************************************************/
if (SCBX(SCBgsf1)<=-32)
{
SCBX(SCBgsf1) = 0;
SCBX(SCBgsf2) = 32;
SCBX(SCBgsf3) = 64;
SCBX(SCBgsf4) = 96;
SCBX(SCBgsf5) = 128;
SCBX(SCBgsf6) = 160;
if (nbrnexu==0)
{
++nbrnext ;
if (nbrnexu==0)
{
if (stopm==0 & boumgb==0 & gspause==0)
{
if (nbrnext>(60*level)) // longueur d'un level
//if (nbrnext>30) // longueur d'un level
{
nbrnexu=1;
}
}
}
}
}
SCBX(SCBgsf1)=SCBX(SCBgsf1)-scrollx;
SCBX(SCBgsf2)=SCBX(SCBgsf2)-scrollx;
SCBX(SCBgsf3)=SCBX(SCBgsf3)-scrollx;
SCBX(SCBgsf4)=SCBX(SCBgsf4)-scrollx;
SCBX(SCBgsf5)=SCBX(SCBgsf5)-scrollx;
SCBX(SCBgsf6)=SCBX(SCBgsf6)-scrollx;
// ********* shiplayer :
if (gspause==0)
{
if (nbrnexu==2)
{
++posx; // le shiplayer quitte le niveau en automatique
if (posx>160) {nbrnexu=3;}
}
if (goship==0 & posx<20)
{
posx=posx+1;
if (posx>=20) {posx=20; goship=1;}
}
if (goship==1 & stopm==0 & nbrnexu<2)
{
if (joystick & JOY_RIGHT) posx++; // direction Droite
if (posx>120) posx=120;
if (joystick & JOY_LEFT) posx--; // direction Gauche
if (posx<2) posx=2;
if (joystick & JOY_UP) posy--; // direction Haut
if (posy<-2) posy=-2;
if (joystick & JOY_DOWN) posy++; // direction Bas
if (posy>80) posy=80;
}
// sprite 1 du shiplayer: moteur à hélice (6 images d'une taille de 8*22 chacunes)
SCBX(SCBsprite1) = posx;
SCBY(SCBsprite1) = posy;
++tempa; // vitesse animation de l'hélice
if (tempa>=3+stopm)
{
tempa=0;
++t;
if (stopm>0 & stopm<32) ++stopm; // Arrêt progressif du moteur à hélice...
}
if (stopm>1) // ...et le shiplayer sort progressivement de l'écran.
{
++tempe;
if (tempe>=4) {tempe=0;--posx;++outship;} //
}
// clip du sprite 1
if (t>=5) t=0;
}
SCBDATA(SCBsprite1) = sprtab[t%6];
// rappel: Le sprite 2 (coque) est lié au sprite 1 (hélice).
SCBX(SCBsprite2) = posx+8;
SCBY(SCBsprite2) = posy-1;
//DrawSprite(SCBsprite1);
DrawSprite(SCBgsf1); // Affichage sprites chainés (décor + shiplayer)