
Au début du code, j'ai rajouté:
#define SWITCHES 0x01
Mais quand je fais fait la modif dans le code, ça va pas : )
if (SWITCHES & BUTTON_PAUSE
#define SWITCHES 0x01
if (SWITCHES & BUTTON_PAUSE
beauregard (./30) :
ah, merci de m'éclairer.
Au début du code, j'ai rajouté:#define SWITCHES 0x01
Mais quand je fais fait la modif dans le code, ça va pas :)if (SWITCHES & BUTTON_PAUSE
uchar sprsys at 0xfc92,
joystick at 0xfcb0,
switches at 0xfcb1,
cart0 at 0xfcb2;
Donc ta définition de SWITCH
en supposant que l'include de lynx.h est déjà fait corretement(mais ça doit être le cas sinon test tests sur la variable joystick ne marcheraient pas).vince (./31) :oui, c'est ce que j'avais fait au début, mais il y a un message d'erreur (undefined symbol), car j'avais mis switches en majuscule, et non en minuscule, merci pour votre patience.
Il faut le définir comme adresse à 0xFCB1 et pas comme valeur... Et encore pour le coup, y'a RIEN à faire vu que la variable "switches" est définie dans lynx.h :uchar sprsys at 0xfc92, joystick at 0xfcb0, switches at 0xfcb1, cart0 at 0xfcb2;
ES, faut l'oublier et ton test, il faut le remplacer parif (switches & BUTTON_PAUSE)Donc ta définition de SWITCH
en supposant que l'include de lynx.h est déjà fait corretement(mais ça doit être le cas sinon test tests sur la variable joystick ne marcheraient pas).
RYGAR (./26) :j'ai fait des tests, et j'ai décidé de rajouter un 2ème cailloux, avec même un zoom puisque la LYNX le permet facilement. Prochaine version très bientôt.
ensuite la vitesses des globules et des cailloux est toujours la même que l'on est un score de 10, 100 ou 700points alors qu'il serait bien qu'elle augmente histoire de rendre la partie plus intense
RYGAR (./26) :Mr Gunpei yokoi a montré la voie avec ses Game&watch (parachute)
Et puis ton code et la simplicité du game play m'a redonné envie d'essayer de programmer de petites choses pour la Lynx alors là aussi chapeau
/*
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)
if (gspause==0)
{
++temparoch; // animation des rochers
if (temparoch>5)
{
temparoch=0;++aroch;
if (aroch>15) aroch=0;
}
SCBDATA(SCBroch) = rochtab[aroch%18];
SCBX(SCBroch) = rochx;
SCBY(SCBroch) = rochy;
SCBDATA(SCBroch2) = rochtab[aroch%18];
SCBX(SCBroch2) = roch2x;
SCBY(SCBroch2) = roch2y;
// ********* rocher 1 :
if (eroch==0 & nbrnexu==0)
{
rochx=180;
if (goroch<32) ++goroch; // petite temporisation avant apparition du 1er rocher
if (goship==1 & goroch>31 & stopm==0)
{
rasam=rasa;
rasa=random()%4; // de 0 à 3
if (rasa==rasam) // Si le même nombre sort 2 fois de suite, alors...
{
rasar=random()%2; // de 0 à 1
if (rasar==0) ++rasa;
if (rasar==1) --rasa;
}
if (rasa>3) rasa=0;
if (rasa<0) rasa=3;
if (gshat==1) // hasard "aidé"
{
//++atest;
gshat=0;
if (rasa>1) rasa=rasa-gshas;
if (rasa<2) rasa=rasa+gshas;
if (rasa>3) rasa=0;
if (rasa<0) rasa=3;
}
if (tyroch==0) rochy=rasa*24;
if (tyroch==1)
{
++chroch;
if (chroch==3) chroch=1;
if (chroch==1) {SCBHS(SCBroch) = 0x100;SCBVS(SCBroch) = 0x100;}
if (chroch==2) {SCBHS(SCBroch) = 0x150;SCBVS(SCBroch) = 0x150;}
if (rasa==3 & chroch==2) rasa=0;
rochy=rasa*34;
}
eroch=1;rochx=180;temprochx=0;rochy=rochy+3;
// Taille rocher1: 24*24 ; objectif :
// 4 positions de départ Y pour le rocher : rochy = 3 ou 27 ou 51 ou 75
// espacement de 3 lignes en haut et en bas : 3 et 99 (75 + 24 (nbre de ligne du rocher1))
}
}
if (eroch==1)
{
rochx=rochx-vroch;
if (rochx<-36) {eroch=0;rochx=180;SCBX(SCBroch) = rochx;} // si rocher1 sort de l'écran, alors remise à 0 de sa création.
// collision rocher1/shiplayer !!!
if (gsblip==1 & stopm==0)
{
if (rochy+12>posy-4 & rochy+12<posy+28) // test colision rocher 24*24
{
if (rochx+12>posx & rochx+12<posx+40)
{
eroch=0;goroch=0;rochx=180;
boumgb=1;aaroch=16;
stopm=1;energ=0;SCBX(SCBjauge) = 200; // panne sèche: arrêt du moteur à hélice
}
}
if (eroch==1 & chroch==2 & rochy+24>posy-4 & rochy+24<posy+28) // test colision rocher 36*36
{
if (rochx+24>posx & rochx+24<posx+40)
{
eroch=0;goroch=0;rochx=180;
boumgb=1;aaroch=16;
stopm=1;energ=0;SCBX(SCBjauge) = 200; // panne sèche: arrêt du moteur à hélice
}
}
}
}
// ********* rocher 2 :
if (eroch2==0 & nbrnexu==0)
{
roch2x=180;
// if (goroch2<128-(gshas*8)) ++goroch2; // petite temporisation avant apparition du 1er rocher
// if (goship==1 & goroch2>127-(gshas*8) & stopm==0)
// vroch=1;
// if (level==3 | level==4) vroch=2;
// if (level==5 | level==6) vroch=3;
// if (level==7) vroch=4;// trop rapide
if (goroch2<32+(216-(vroch*72))) ++goroch2; // petite temporisation avant apparition du 1er rocher
if (goship==1 & goroch2>31+(215-(vroch*72)) & stopm==0)
{
rbsam=rbsa;
rbsa=random()%4; // de 0 à 3
if (rbsa==rbsam) // Si le même nombre sort 2 fois de suite, alors...
{
rbsar=random()%2; // de 0 à 1
if (rbsar==0) ++rbsa;
if (rbsar==1) --rbsa;
}
if (rbsa>3) rbsa=0;
if (rbsa<0) rbsa=3;
//rasa=3;
//atest=rasa;
//atest=rbsa;
if (rbsa==rasa) //(rbsa==3)//atest) //(atest==rasa)//(atest==0) si le même que le rocher 1, alors...
{
// rbsa=1;
// ++atest;
//rbsa=1;
rbsar=random()%2; // de 0 à 1
if (rbsar==0) ++rbsa;
if (rbsar==1) --rbsa;
if (rbsa>3) rbsa=0;
if (rbsa<0) rbsa=3;
}
if (tyroch2==0) roch2y=rbsa*24;
if (tyroch2==1)
{
++chroch2;
if (chroch2==3) chroch2=1;
if (chroch2==1) {SCBHS(SCBroch2) = 0x100;SCBVS(SCBroch2) = 0x100;}
if (chroch2==2) {SCBHS(SCBroch2) = 0x150;SCBVS(SCBroch2) = 0x150;}
if (rbsa==3 & chroch2==2) rbsa=0;
roch2y=rbsa*34;
}
eroch2=1;roch2x=180;temprochx2=0;roch2y=roch2y+3;
// Taille rocher1: 24*24 ; objectif :
// 4 positions de départ Y pour le rocher : rochy = 3 ou 27 ou 51 ou 75
// espacement de 3 lignes en haut et en bas : 3 et 99 (75 + 24 (nbre de ligne du rocher1))
}
}
if (eroch2==1)
{
roch2x=roch2x-vroch;
if (roch2x<-36) {eroch2=0;roch2x=180;SCBX(SCBroch2) = roch2x;} // si rocher1 sort de l'écran, alors remise à 0 de sa création.
// collision rocher2/shiplayer !!!
if (gsblip==3 & stopm==0)
{
if (roch2y+12>posy-4 & roch2y+12<posy+28) // test colision rocher 24*24
{
if (roch2x+12>posx & roch2x+12<posx+40)
{
eroch2=0;goroch2=0;roch2x=180;
boumgb=1;aaroch=16;
stopm=1;energ=0;SCBX(SCBjauge) = 200; // panne sèche: arrêt du moteur à hélice
}
}
if (eroch2==1 & chroch2==2 & roch2y+24>posy-4 & roch2y+24<posy+28) // test colision rocher 36*36
{
if (roch2x+24>posx & roch2x+24<posx+40)
{
eroch2=0;goroch2=0;roch2x=180;
boumgb=1;aaroch=16;
stopm=1;energ=0;SCBX(SCBjauge) = 200; // panne sèche: arrêt du moteur à hélice
}
}
}
}
// if (eroch>0) // affichage
// {
// SCBDATA(SCBroch) = rochtab[aroch%18];
// SCBX(SCBroch) = rochx;
// SCBY(SCBroch) = rochy;
//DrawSprite(SCBroch);
// }
// test3:
//SCBDATA(SCBchiffres) = chiffrestab[10%12];
//SCBX(SCBchiffres) = rochx+12;
//SCBY(SCBchiffres) = rochy+12;
//DrawSprite(SCBchiffres);
// fin test3
// ********* rhume (vilain 1) :
if (vil==0 & goship==1)
{
if (govil<tgovil) //32
{
vilx=160;++govil; // petite temporisation avant l'attaque virale
}
//if (govil==tgovil & stopm==0 & nbrnexu==0) //31
if (stopm==0 & nbrnexu==0) //31
{
vilx=160;
hasam=hasa;
hasa=random()%6; // de 0 à 5
// if (hasa==hasam) ++hasa;
// if (hasa>5) hasa=0;
if (hasa==hasam | hasa==rasam) // Si le même nombre sort 2 fois de suite, alors...
{
hasar=random()%2; // de 0 à 1
if (hasar==0) ++hasa;
if (hasar==1) --hasa;
}
if (hasa>5) hasa=0;
if (hasa<0) hasa=5;
vil=1;vilx=160;tempvilx=0;vily=hasa*16;vily=vily+3;avil=0;tempavil=0;
// Taille vilain1: 16*16 ; objectif :
// 6 positions de départ Y pour le vilain1 : vily = 3 ou 19 ou 35 ou 51 ou 67 ou 83
// espacement de 3 lignes en haut et en bas : 3 et 99 (83 + 16 (nbre de ligne du vilain1))
}
}
//
// test1:
// SCBDATA(SCBchiffres) = chiffrestab[10%12];
// SCBX(SCBchiffres) = posx+30;
// SCBY(SCBchiffres) = posy+9;
// DrawSprite(SCBchiffres);
// SCBX(SCBchiffres) = posx+30;
// SCBY(SCBchiffres) = posy+12;
// DrawSprite(SCBchiffres);
// SCBX(SCBchiffres) = posx+40;
// SCBY(SCBchiffres) = posy+9;
// DrawSprite(SCBchiffres);
// SCBX(SCBchiffres) = posx+40;
// SCBY(SCBchiffres) = posy+12;
// DrawSprite(SCBchiffres);
// fin test1
if (vil==1)
{
++tempvilx; // vitesse du vilain 1 en fonction du niveau.
if (tempvilx>speedvil)
{
tempvilx=0;--vilx;
}
// vilx=vilx-speedvil;
// if (level==2 & tempvilx>0)
// {
// tempvilx=0;--vilx;
// }
++tempavil; // animation du vilain 1
/***************************************************************************
** Les conditions suivantes ralentissent le jeu ! Alors j'opte pour une **
** seule condition... il faut limiter le nbre de condition.
***************************************************************************/
// if (tempavil==41) tempavil=1;
// if (tempavil>0 & tempavil<11) avil=0; // 1 à 10
// if (tempavil>10 & tempavil<21) avil=1; // 11 à 20
// if (tempavil>20 & tempavil<31) avil=2; // 21 à 30
// if (tempavil>30 & tempavil<41) avil=1; // 31 à 40
if (tempavil>10)
{
tempavil=0;++avil;
if (avil>2) avil=0;
}
// SCBDATA(SCBrhume) = rhumetab[avil%7];
// SCBX(SCBrhume) = vilx;
// SCBY(SCBrhume) = vily;
// DrawSprite(SCBrhume);
if (vilx<-16) {vil=0;govil=0;} // si vilain1 sort de l'écran, alors remise à 0 de sa création.
// test2:
// SCBX(SCBchiffres) = vilx;
// SCBY(SCBchiffres) = vily+8;
// DrawSprite(SCBchiffres);
// fin test2
// capture du vilain1 !!!
// atest=0;
// if (vily+8>posy+9 & vily+8<posy+12) atest=1;
// if (vily+6>posy+7 & vily+8<posy+16) atest=1;
if (stopm==0)
{
if (vily+8>posy+7 & vily+8<posy+16)
{
if (vilx>posx+30 & vilx<posx+40)
{
// atest=1;
vil=2;avil=3;tempavil=0;
}
}
}
// vily
// posx
// posy
}
if (vil==2) // virus capturé le nanoship !
{
// avil=3;
vily=posy+3;vilx=posx+38;
tempd=0; // ici, on stoppe temporairement la jauge.
if (tempavil<31) ++tempavil; // animation du vilain 1
if (tempavil>0 & tempavil<11) avil=4; // 1 à 10
if (tempavil>10 & tempavil<21) avil=3; // 11 à 20
if (tempavil>20 & tempavil<31) avil=4; // 21 à 30
if (tempavil==31 | boumgb>0)
{
tempavil=0;vil=0;govil=0;
vilx=160;SCBX(SCBrhume) = vilx;
if (boumgb==0)
{
energ=energ+4;++score;
if (energ>10) energ=10;
}
// --energ;
// if (energ<1) energ=10;
}
}
if (vil>0) // affichage
{
SCBDATA(SCBrhume) = rhumetab[avil%7];
SCBX(SCBrhume) = vilx;
SCBY(SCBrhume) = vily;
// DrawSprite(SCBrhume);
}
} // if (gspause==0)
DrawSprite(SCBroch); // Affichage sprites chainés (rocher + rhume)
// ********* jauge d'énergie du shiplayer:
if (gsblip==2)
{
if (energ>0 & gspause==0 & nbrnexu==0) // Si le shiplayer a encore de l'énergie, alors...
{
++tempd; // ...incremente une petite tempo
if (tempd>11) // 59
{
tempd=0;--energ;
if (energ==0)
{
stopm=1; // panne sèche: arrêt du moteur à hélice
SCBX(SCBjauge) = 200; // mettre image jauge hors de l'écran.
}
}
}
//energ=1;
if (energ>0 & gspause==0)
{
--energ; // energ de 1 à 10 --> mais de 0 à 9 pour le n° image
SCBDATA(SCBjauge) = jaugetab[energ%10];
SCBX(SCBjauge) = 55;
SCBY(SCBjauge) = 4;
// DrawSprite(SCBjauge);
++energ;
}
}
DrawSprite(SCBjauge); // Affichage sprites (jauge )
if (stopm>0 & gspause==0)
{
if (boumgb>0) // explosion du shiplayer
{
++aaroch;
if (aaroch==18)
{
aaroch=16;nbboum++; // nombre de boum
++scboom;
if (scboom>4) scboom=1;
}
SCBDATA(SCBroch) = rochtab[aaroch%18];
if (scboom==1)
{
SCBHS(SCBroch) = 0x100;SCBVS(SCBroch) = 0x100;
SCBX(SCBroch) = posx+10;SCBY(SCBroch) = posy-1;
}
if (scboom==2 | scboom==4)
{
SCBHS(SCBroch) = 0x140;SCBVS(SCBroch) = 0x140;
SCBX(SCBroch) = posx+6;SCBY(SCBroch) = posy-4;
}
if (scboom==3)
{
SCBHS(SCBroch) = 0x180;SCBVS(SCBroch) = 0x180;
SCBX(SCBroch) = posx+2;SCBY(SCBroch) = posy-7;
}
DrawSprite(SCBroch);
SCBHS(SCBroch) = 0x100;SCBVS(SCBroch) = 0x100;
}
// | cette barre verticale veut dire OR/OU en langage C
if (nbboum>31 | outship>31) // outship voir plus haut (pour faire une recherche, appuyez sur Ctrl + F)
{
SCBX(SCBroch) = 200;SCBX(SCBroch2) = 200; // mettre image rocher et virus hors de l'écran.
nbboum=0;scboom=0;outship=0;
--gslife; // perd un ship...
stopm=0;etape=1;tempa=0;energ=10;goship=0;posx=-40;posy=39;boumgb=0;aaroch=0;
govil=0;vil=0;vilx=0;tempvilx=0;vily=0;avil=0;tempavil=0;
hasa=0;hasam=0;hasar=0;
goroch=0;eroch=0;rochx=0;rochy=0;
goroch2=0;eroch2=0;roch2x=0;roch2y=0;
temprochx=0;aroch=0;temparoch=0;
rasa=0;rasam=0;rasar=0;
rbsa=0;rbsam=0;rbsar=0;
nbrnexu=0;nbrnext=0;
if (gslife>0) // ...mais s'il en reste encore, alors retour à l'étape 1.
{
etape=1;
}
if (gslife<1) // ...mais s'il n'en plus, alors game over.
{
etape=8;tempa=0;xpush=-48;ypush=34;
}
}
}
// ********* passage au prochein niveau
if (nbrnexu>0)
{
if (nbrnexu==1 & vil<1 & eroch<1 & eroch2<1)
{
nbrnexu=2; // joueur n'a plus le contrôle du shiplayer
}
if (nbrnexu==3) // passage au level suivant
{
SCBX(SCBroch) = 200;SCBX(SCBroch2) = 200; // mettre image rocher et virus hors de l'écran.
//nbboum=0;outship=0;
//--gslife; // perd un ship...
stopm=0;etape=1;tempa=0;energ=10;goship=0;posx=-40;posy=39;boumgb=0;aaroch=0;
govil=0;vil=0;vilx=0;tempvilx=0;vily=0;avil=0;tempavil=0;
hasa=0;hasam=0;hasar=0;
goroch=0;eroch=0;rochx=0;rochy=0;
goroch2=0;eroch2=0;roch2x=0;roch2y=0;
temprochx=0;aroch=0;temparoch=0;
rasa=0;rasam=0;rasar=0;
rbsa=0;rbsam=0;rbsar=0;
nbrnexu=0;nbrnext=0;
// if (gslife>0) // ...mais s'il en reste encore, alors retour à l'étape 1.
// {
etape=1;++level;
}
}
} // if (etape==2)
// *********************************************************************************************
// if (etape==3)
// {
// }
// *********************************************************************************************
if (etape>7)
{
SCBDATA(SCB) = gameover;
SCBX(SCB) = 70;
SCBY(SCB) = 34;
DrawSprite(SCB);
if (etape==9)
{
if (!(joystick & BUTTON_LEFT))
{
etape=0;SCBX(SCB)=0;SCBY(SCB)=0;SCBDATA(SCB)=fond1;
SCBX(SCBchiffres2) = 200;
SCBX(SCBchiffres3) = 200;
}
}
if (etape==8) // game over.
{
SCBDATA(SCB) = pushup;
SCBX(SCB) = xpush;
SCBY(SCB) = ypush;
DrawSprite(SCB);
if (xpush<8 & elvl==5) xpush=xpush+2;
if (xpush>7)
{
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)
{
tempa=0;xpush=-48;ypush=34;
etape=9;
}
}
}
}
// *********************************************************************************************
// ********* affichage du score :
if ((etape==1 & drap1==1) | etape==2 | etape==8 | etape==9)
{
if (score<1000)
{
unite = score % 10;
dizaine = score / 10 % 10;
centaine = score / 100 % 10;
// unité:
SCBDATA(SCBchiffres1) = chiffrestab[unite%12];
SCBX(SCBchiffres1) = 150;
SCBY(SCBchiffres1) = 53;
// dizaine:
SCBDATA(SCBchiffres2) = chiffrestab[dizaine%12];
SCBX(SCBchiffres2) = 150;
SCBY(SCBchiffres2) = 53-4;
// centaine:
SCBDATA(SCBchiffres3) = chiffrestab[centaine%12]; // 0
SCBX(SCBchiffres3) = 150;
SCBY(SCBchiffres3) = 53-8;
}
DrawSprite(SCBchiffres1); // Affichage sprites chainés (score)
/***************************************************************************
** Test (lignes suivantes a désactivées) **
***************************************************************************/
/*
//unite = gshas % 10;
unite = nbrnexu % 10;
// unité:
SCBDATA(SCBchiffres1) = chiffrestab[unite%12];
SCBX(SCBchiffres1) = 130;
SCBY(SCBchiffres1) = 23;
DrawSprite(SCBchiffres1); // Affichage valeur testé
unite = rasa % 10;
// unité:
SCBDATA(SCBchiffres1) = chiffrestab[unite%12];
SCBX(SCBchiffres1) = 130;
SCBY(SCBchiffres1) = 53;
DrawSprite(SCBchiffres1); // Affichage valeur testé
//unite = rbsa % 10;
//unite = roch2x % 10;
//dizaine = roch2x / 10 % 10;
//centaine = roch2x / 100 % 10;
unite = goroch2 % 10;
dizaine = goroch2 / 10 % 10;
centaine = goroch2 / 100 % 10;
// unité:
SCBDATA(SCBchiffres1) = chiffrestab[unite%12];
SCBX(SCBchiffres1) = 120;
SCBY(SCBchiffres1) = 53;
// dizaine:
SCBDATA(SCBchiffres2) = chiffrestab[dizaine%12];
SCBX(SCBchiffres2) = 120;
SCBY(SCBchiffres2) = 53-4;
// centaine:
SCBDATA(SCBchiffres3) = chiffrestab[centaine%12]; // 0
SCBX(SCBchiffres3) = 120;
SCBY(SCBchiffres3) = 53-8;
DrawSprite(SCBchiffres1); // Affichage valeur testé
unite = atest % 10;
dizaine = atest / 10 % 10;
// unité:
SCBDATA(SCBchiffres1) = chiffrestab[unite%12];
SCBX(SCBchiffres1) = 100;
SCBY(SCBchiffres1) = 53;
// dizaine:
SCBDATA(SCBchiffres2) = chiffrestab[dizaine%12];
SCBX(SCBchiffres2) = 100;
SCBY(SCBchiffres2) = 53-4;
DrawSprite(SCBchiffres1); // Affichage valeur testé
*/
/***************************************************************************
** Fin Test **
***************************************************************************/
}
// *********************************************************************************************
//Fchiffres(8,92,etape); // test de variable (mais où est le debogueur ?)
if (etape==2 & gspause>0)
{
SCBDATA(SCB) = ipause;
SCBX(SCB) = 73;
SCBY(SCB) = 30;
DrawSprite(SCB);
}
Vsync();
SwapBuffers();
}
/**************************************************************************
** FIN de la BOUCLE PRINCIPALE **
**************************************************************************/
}
RYGAR (./36) :Merci, je prépare une version 0.5 avec quelques bruitages à l'aide de ABCmusic
Chouette une nouvelle version à tester ce soir![]()
Ça commence à faire un jolie code et tu t'approches de la limite de taille du *.o
RYGAR (./38) :L'astuce, c'est qu'il ne faut pas trop rester au bas de l'écran. Pour remonter la barre d'énergie, et gonfler le score, il faut monter de temps en temps pour gober les virus (car ils réapparaissent immédiatement après avoir été gober).
Vraiment de mieux en mieux ton jeu, les niveaux, les cailloux de différentes tailles... vivement les bruitages !
Par contre je trouve que la barre d'énergie diminue très très vite (trop vite). Si tu rates 2 virus c'est déjà mort.
/*
Glob Shoot version 0.5 - LYNX - kit BLL (newcc65)
27/11/2010
console tenu à la verticale
Handy/Option/Rotate Screen(Right)
D-pad et bouton pause
LYNX - video game */
#include <lynx.h>
#include <lynxlib.h>
#include <stdlib.h>
//#include "inc\fond1.pal" // Ceci sert à inclure le fichier palette généré par sprpck
//{
extern void silence();
extern void abcmusic();
extern void update_music();
char abcmusic0[];
char abcmusic1[];
char abcmusic2[];
char abcmusic3[];
char abcmenu1[];
char abcmenu2[];
char abcbric[];
char abcaptvir[];
char abcboum[];
char abcpanne[];
char abces[];
#asm
xref _abcmenu1
xref _abcmenu2
xref _abcbric
xref _abcaptvir
xref _abcboum
xref _abcpanne
xref _abces
xref _abcmusic0
xref _abcmusic1
xref _abcmusic2
xref _abcmusic3
_abcmenu1
dc.b "O2X7I1V32T20R54H7K8"
dc.b "|:C4"
dc.b 0
_abcmenu2
dc.b "O3X7I1V16T20R54H7K12"
dc.b "|:c2"
dc.b 0
_abcbric
dc.b "O4X7I1V16T20R54H7K12"
dc.b "|:C1"
dc.b 0
_abcaptvir
dc.b "O2X15I1V32T1R14H6K30"
dc.b "|:C4D4C4E4D4C4D4"
dc.b 0
_abcboum
dc.b "O2X248I1V16T50R80H2K2"
dc.b "|:C2"
dc.b 0
_abcpanne
dc.b "O4X6I1V127T6R5H6K6"
dc.b "|:C4D4C4E4D4C4D4E4C4"
dc.b 0
_abces
dc.b "O4X6I1V127T6R16H2K3"
dc.b "|:C2D2C2E2D2C2D2E2C2"
dc.b 0
_abcmusic0
dc.b "O2X3I1V70T20R54H2K1"
dc.b "|:C4O3T2C4"
dc.b 0
_abcmusic1
dc.b "O2X7I0V45T20R80H8K1"
dc.b "|:C4D4E4F4"
dc.b "C4D4E4F4"
dc.b "c4B4A4E4"
dc.b "c4B4A4E4"
dc.b "E4F4G4A4"
dc.b "E4F4G4A4"
dc.b "C4D4E4F4"
dc.b "C4D4E4F4:"
dc.b 0
_abcmusic2
dc.b "O1X7I0V45T20R40H2K3"
dc.b "zzzzzzzz"
dc.b "|:CDEEDEFFEFGEFDGG"
dc.b "I1CDEEDEFFEFGEFDCC"
dc.b "I0cBAABAGGAGFFEDEE"
dc.b "cBAABAGGAGFFEDCC"
dc.b "ECDDFDEEGEFGABcc"
dc.b "ECDDFDEEGEFGABcc"
dc.b "CDEEDEFFEFGEFDGG"
dc.b "CDEEDEFFEFGEFDCC:"
dc.b 0
_abcmusic3
dc.b "O2X7I0V45T20R80H8K1"
dc.b "z4z4z2"
dc.b "|:C4D4E4F4"
dc.b "C4D4E4F4"
dc.b "c4B4A4E4"
dc.b "c4B4A4E4"
dc.b "E4F4G4A4"
dc.b "E4F4G4A4"
dc.b "C4D4E4F4"
dc.b "C4D4E4F4:"
dc.b 0
#endasm
//}
/* 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 SCBSTRETC H(a) (*(uint *)((a)+15)) // déformation, macro
//#define SCBTILT(a) (*(uint *)((a)+17)) // déformation, macro
char SCREEN[8160] at (MEMTOP-16320);
char RENDER[8160] at (MEMTOP-8160);
//char redir[]={0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF};
char pal[]={
0x00,0x0F,0x0B,0x08,0x03,0x04,0x06,0x0A,0x00,0x00,0x07,0x07,0x03,0x00,0x05,0x03,
0x00,0x0F,0x0B,0x06,0x00,0x30,0x54,0xAA,0x08,0x05,0x0E,0xAF,0x5F,0x0F,0xC0,0x61};
// ------------------------------------
extern char pushup[]; // image appuyez sur haut, d'une taille de 48*35;
char SCBp[];
#asm
_SCBp 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
// ------------------------------------
extern char fond1[]; // ecran titre
char SCBl[];
#asm
_SCBl 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 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 pause, d'une taille de 13*43;
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
// ------------------------------------
// clip du sprite 1 --> 6 images, de 0 à 5, du moteur à élice :
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
#asm
_SCBsprite1 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
// ------------------------------------
extern char sprite2[]; // coque (taille: 30*24)
char SCBsprite2[]; // déclaration d'un nouveau controleur de sprite, coque
#asm
_SCBsprite2 dc.b $c7,$10,$20
dc.w 0, 0 ;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
// ------------------------------------
// 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
char SCBscore1[]; // déclaration d'un nouveau controleur de sprite (score unité)
char SCBscore2[]; // déclaration d'un nouveau controleur de sprite (score dizaine)
char SCBscore3[]; // déclaration d'un nouveau controleur de sprite (score centaine)
#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
;
_SCBscore1 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
;
_SCBscore2 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
;
_SCBscore3 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)
char bruitm;
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);
xpush=-48;ypush=34;
/* set the palette */
SetRGB(pal); // Ceci sert à changer la palette de la Lynx (16 couleurs).
//DrawFBox(0,0,160,102,0);
//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 pause, d'une taille de 13*43;
SCBX(SCB) = 0;
SCBY(SCB) = 0;
SCBDATA(SCB) = fond1;
// 1er sprite chainé (fond intro + fond jeu + shiplayer moteur + shiplayer coque + rocher1 + rocher2 + vilainrhume + pushup + jauge)
SCBX(SCBl) = 0;
SCBY(SCBl) = 0;
SCBDATA(SCBl) = fond1;
SCBNEXT(SCBl) = SCBgsf1; // chainage de sprite 2ème image fond
SCBX(SCBgsf1) = 0;
SCBY(SCBgsf1) = -102;
SCBDATA(SCBgsf1) = fond2;
SCBNEXT(SCBgsf1) = SCBgsf2; // chainage de sprite 2ème image fond
SCBX(SCBgsf2) = 32;
SCBY(SCBgsf2) = -102;
SCBDATA(SCBgsf2) = fond2;
SCBNEXT(SCBgsf2) = SCBgsf3; // chainage de sprite 3ème image fond
SCBX(SCBgsf3) = 64;
SCBY(SCBgsf3) = -102;
SCBDATA(SCBgsf3) = fond2;
SCBNEXT(SCBgsf3) = SCBgsf4; // chainage de sprite 4ème image fond
SCBX(SCBgsf4) = 96;
SCBY(SCBgsf4) = -102;
SCBDATA(SCBgsf4) = fond2;
SCBNEXT(SCBgsf4) = SCBgsf5; // chainage de sprite 5ème image fond
SCBX(SCBgsf5) = 128;
SCBY(SCBgsf5) = -102;
SCBDATA(SCBgsf5) = fond2;
SCBNEXT(SCBgsf5) = SCBgsf6; // chainage de sprite 6ème image fond
SCBX(SCBgsf6) = 160;
SCBY(SCBgsf6) = -102;
SCBDATA(SCBgsf6) = fond2;
SCBNEXT(SCBgsf6) = SCBsprite1; // chainage du moteur à élice du shiplayer
SCBX(SCBsprite1) = 0;
SCBY(SCBsprite1) = -200;
SCBDATA(SCBsprite1) = sprtab[t%6];
SCBNEXT(SCBsprite1) = SCBsprite2; // chainage de la coque du shiplayer
SCBX(SCBsprite2) = 0;
SCBY(SCBsprite2) = -200;
SCBDATA(SCBsprite2) = sprite2;
SCBNEXT(SCBsprite2) = SCBroch; // chainage de sprite rocher 1
SCBX(SCBroch) = 0;
SCBY(SCBroch) = -200;
SCBDATA(SCBroch) = rochtab[0%18];//roch;//rochtab[0%18];
SCBNEXT(SCBroch) = SCBroch2; // chainage de sprite rocher 2
SCBX(SCBroch2) = 0;
SCBY(SCBroch2) = -200;
SCBDATA(SCBroch2) = rochtab[0%18];//roch;//rochtab[0%18];
SCBNEXT(SCBroch2) = SCBrhume; // chainage de sprite vilainrhume
SCBX(SCBrhume) = 32;
SCBY(SCBrhume) = 0;
SCBDATA(SCBrhume) = rhume;
SCBNEXT(SCBrhume) = SCBp; // chainage de sprite info commande
SCBX(SCBp) = xpush;
SCBY(SCBp) = ypush;
SCBDATA(SCBp) = pushup;
SCBNEXT(SCBp) = SCBjauge; // chainage du sprite jauge
SCBX(SCBjauge) = 0;SCBY(SCBjauge) = -200; // coordonnées X et Y de la jauge
SCBDATA(SCBjauge) = jauge;
SCBNEXT(SCBjauge) = SCBscore1; // chainage score unité
SCBX(SCBscore1) = 4;SCBY(SCBscore1) = -200;
SCBDATA(SCBscore1) = chiffrestab[0%14]; //
SCBNEXT(SCBscore1) = SCBscore2; // chainage score dizaine
SCBX(SCBscore2) = 4;SCBY(SCBscore2) = -200;
SCBDATA(SCBscore2) = chiffrestab[0%14]; //
SCBNEXT(SCBscore2) = SCBscore3; // chainage score centaine
SCBX(SCBscore3) = 4;SCBY(SCBscore3) = -200;
SCBDATA(SCBscore3) = chiffrestab[0%14]; //
// 2ème sprite chainé (test)
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 des chiffres et des lettres :
// SCBX(SCBchiffres) = 0;
// SCBY(SCBchiffres) = 0;
// SCBDATA(SCBchiffres) = chiffres;
// posx = -40;
// posy = -39;
xlvla=160;xlvlb=160;xlvlc=160;xlvld=160;xlvle=160;
elvl=0;
/**************************************************************************
** BOUCLE PRINCIPALE **
**************************************************************************/
for(;;) // boucle principale
{
update_music(); // petite subtilité de la gestion sonore
/*
// 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 (joystick & BUTTON_OPTION1) // test sonore
{
if (atest==0){
++atest;
silence();
abcmusic(0,abcmenu1);
abcmusic(1,abcmenu2);
}
}
*/
// *********************************************************************************************
if (etape==0) // écran titre
{
SCBX(SCBp) = xpush;SCBY(SCBp) = ypush;
DrawSprite(SCBl); // Affichage sprites chainés (fond intro + fond jeu + shiplayer moteur + shiplayer coque + rocher1 + rocher2 + vilainrhume + pushup)
// 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,5); //5
// 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
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;
// bruitage menu :
silence();
abcmusic(0,abcmenu1);
abcmusic(1,abcmenu2);
SCBY(SCBl) = -200; // fond intro mis hors de l'écran
// // bruitage panne sèche :
// silence();
// abcmusic(3,abcpanne);
}
}
}
// *********************************************************************************************
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;}
// }
// bruitage boum :
if (compteur==0)
{
if (elvl==0)
{
xlvla=xlvla-8;
if (xlvla<1) {xlvla=0;++elvl;silence();abcmusic(2,abcbric);}
}
SCBX(SCB) = xlvla;
}
if (compteur==1)
{
if (elvl==1)
{
xlvlb=xlvlb-8;
if (xlvlb<33) {xlvlb=32;++elvl;silence();abcmusic(2,abcbric);}
}
SCBX(SCB) = xlvlb;
}
if (compteur==2)
{
if (elvl==2)
{
xlvlc=xlvlc-8;
if (xlvlc<65) {xlvlc=64;++elvl;silence();abcmusic(2,abcbric);}
}
SCBX(SCB) = xlvlc;
}
if (compteur==3)
{
if (elvl==3)
{
xlvld=xlvld-8;
if (xlvld<97) {xlvld=96;++elvl;silence();abcmusic(2,abcbric);}
}
SCBX(SCB) = xlvld;
}
if (compteur==4)
{
if (elvl==4)
{
xlvle=xlvle-8;
if (xlvle<127) {xlvle=128;++elvl;silence();abcmusic(2,abcbric);}
}
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
SCBX(SCBp) = xpush;SCBY(SCBp) = ypush;
DrawSprite(SCBl); // Affichage sprites chainés (fond intro + fond jeu + shiplayer moteur + shiplayer coque + rocher1 + rocher2 + vilainrhume + pushup)
// 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;SCBX(SCBp) = xpush;etape=2;drap1=1;
SCBX(SCBjauge) = 55;SCBY(SCBjauge) = 4;
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;
SCBY(SCBgsf1) = 0;SCBY(SCBgsf2) = 0;SCBY(SCBgsf3) = 0;SCBY(SCBgsf4) = 0;SCBY(SCBgsf5) = 0;SCBY(SCBgsf6) = 0;
// 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;
}
// bruitage menu :
silence();
abcmusic(0,abcmenu1);
abcmusic(1,abcmenu2);
}
}
}
// *********************************************************************************************
// 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 (switches & BUTTON_PAUSE)
{
if (gspause==0) {gspause=1;silence();abcmusic(0,abcaptvir);}
}
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
}
/***************************************************************************
** 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;
// ********* affichage du score :
unite = score % 10;
dizaine = score / 10 % 10;
centaine = score / 100 % 10;
// unité:
SCBDATA(SCBscore1) = chiffrestab[unite%12];
SCBX(SCBscore1) = 150;SCBY(SCBscore1) = 53;
// dizaine:
SCBDATA(SCBscore2) = chiffrestab[dizaine%12];
SCBX(SCBscore2) = 150;SCBY(SCBscore2) = 53-4;
// centaine:
SCBDATA(SCBscore3) = chiffrestab[centaine%12]; // 0
SCBX(SCBscore3) = 150;SCBY(SCBscore3) = 53-8;
// ********* 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)
{
if (bruitm==0 & posx>0) {
bruitm=1;
// bruitage moteur shiplayer rentree sortie :
silence();
abcmusic(3,abces);
}
posx=posx+1;
if (posx>=20) {posx=20; goship=1; bruitm=0;}
}
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(SCBl); // Affichage sprites chainés (décor + shiplayer)
if (gspause==0)
{
++temparoch; // animation des rochers
if (temparoch>5)
{
temparoch=0;++aroch;
if (aroch>15) aroch=0;
}
SCBDATA(SCBroch) = rochtab[aroch%18];
SCBX(SCBroch) = rochx;
SCBY(SCBroch) = rochy;
SCBDATA(SCBroch2) = rochtab[aroch%18];
SCBX(SCBroch2) = roch2x;
SCBY(SCBroch2) = roch2y;
// ********* rocher 1 :
if (eroch==0 & nbrnexu==0)
{
rochx=180;
if (goroch<32) ++goroch; // petite temporisation avant apparition du 1er rocher
if (goship==1 & goroch>31 & stopm==0)
{
rasam=rasa;
rasa=random()%4; // de 0 à 3
if (rasa==rasam) // Si le même nombre sort 2 fois de suite, alors...
{
rasar=random()%2; // de 0 à 1
if (rasar==0) ++rasa;
if (rasar==1) --rasa;
}
if (rasa>3) rasa=0;
if (rasa<0) rasa=3;
if (gshat==1) // hasard "aidé"
{
//++atest;
gshat=0;
if (rasa>1) rasa=rasa-gshas;
if (rasa<2) rasa=rasa+gshas;
if (rasa>3) rasa=0;
if (rasa<0) rasa=3;
}
if (tyroch==0) rochy=rasa*24;
if (tyroch==1)
{
++chroch;
if (chroch==3) chroch=1;
if (chroch==1) {SCBHS(SCBroch) = 0x100;SCBVS(SCBroch) = 0x100;}
if (chroch==2) {SCBHS(SCBroch) = 0x150;SCBVS(SCBroch) = 0x150;}
if (rasa==3 & chroch==2) rasa=0;
rochy=rasa*34;
}
eroch=1;rochx=180;temprochx=0;rochy=rochy+3;
// Taille rocher1: 24*24 ; objectif :
// 4 positions de départ Y pour le rocher : rochy = 3 ou 27 ou 51 ou 75
// espacement de 3 lignes en haut et en bas : 3 et 99 (75 + 24 (nbre de ligne du rocher1))
}
}
if (eroch==1)
{
rochx=rochx-vroch;
if (rochx<-36) {eroch=0;rochx=180;SCBX(SCBroch) = rochx;} // si rocher1 sort de l'écran, alors remise à 0 de sa création.
// collision rocher1/shiplayer !!!
if (gsblip==1 & stopm==0)
{
if (rochy+12>posy-4 & rochy+12<posy+28) // test colision rocher 24*24
{
if (rochx+12>posx & rochx+12<posx+40)
{
eroch=0;goroch=0;rochx=180;
boumgb=1;aaroch=16;
stopm=1;energ=0;SCBY(SCBjauge) = -200; // panne sèche: arrêt du moteur à hélice
}
}
if (eroch==1 & chroch==2 & rochy+24>posy-4 & rochy+24<posy+28) // test colision rocher 36*36
{
if (rochx+24>posx & rochx+24<posx+40)
{
eroch=0;goroch=0;rochx=180;
boumgb=1;aaroch=16;
stopm=1;energ=0;SCBY(SCBjauge) = -200; // panne sèche: arrêt du moteur à hélice
}
}
}
}
// ********* rocher 2 :
if (eroch2==0 & nbrnexu==0)
{
roch2x=180;
// if (goroch2<128-(gshas*8)) ++goroch2; // petite temporisation avant apparition du 1er rocher
// if (goship==1 & goroch2>127-(gshas*8) & stopm==0)
// vroch=1;
// if (level==3 | level==4) vroch=2;
// if (level==5 | level==6) vroch=3;
// if (level==7) vroch=4;// trop rapide
if (goroch2<32+(216-(vroch*72))) ++goroch2; // petite temporisation avant apparition du 1er rocher
if (goship==1 & goroch2>31+(215-(vroch*72)) & stopm==0)
{
rbsam=rbsa;
rbsa=random()%4; // de 0 à 3
if (rbsa==rbsam) // Si le même nombre sort 2 fois de suite, alors...
{
rbsar=random()%2; // de 0 à 1
if (rbsar==0) ++rbsa;
if (rbsar==1) --rbsa;
}
if (rbsa>3) rbsa=0;
if (rbsa<0) rbsa=3;
//rasa=3;
//atest=rasa;
//atest=rbsa;
if (rbsa==rasa) //(rbsa==3)//atest) //(atest==rasa)//(atest==0) si le même que le rocher 1, alors...
{
// rbsa=1;
// ++atest;
//rbsa=1;
rbsar=random()%2; // de 0 à 1
if (rbsar==0) ++rbsa;
if (rbsar==1) --rbsa;
if (rbsa>3) rbsa=0;
if (rbsa<0) rbsa=3;
}
if (tyroch2==0) roch2y=rbsa*24;
if (tyroch2==1)
{
++chroch2;
if (chroch2==3) chroch2=1;
if (chroch2==1) {SCBHS(SCBroch2) = 0x100;SCBVS(SCBroch2) = 0x100;}
if (chroch2==2) {SCBHS(SCBroch2) = 0x150;SCBVS(SCBroch2) = 0x150;}
if (rbsa==3 & chroch2==2) rbsa=0;
roch2y=rbsa*34;
}
eroch2=1;roch2x=180;temprochx2=0;roch2y=roch2y+3;
// Taille rocher1: 24*24 ; objectif :
// 4 positions de départ Y pour le rocher : rochy = 3 ou 27 ou 51 ou 75
// espacement de 3 lignes en haut et en bas : 3 et 99 (75 + 24 (nbre de ligne du rocher1))
}
}
if (eroch2==1)
{
roch2x=roch2x-vroch;
if (roch2x<-36) {eroch2=0;roch2x=180;SCBX(SCBroch2) = roch2x;} // si rocher1 sort de l'écran, alors remise à 0 de sa création.
// collision rocher2/shiplayer !!!
if (gsblip==3 & stopm==0)
{
if (roch2y+12>posy-4 & roch2y+12<posy+28) // test colision rocher 24*24
{
if (roch2x+12>posx & roch2x+12<posx+40)
{
eroch2=0;goroch2=0;roch2x=180;
boumgb=1;aaroch=16;
stopm=1;energ=0;SCBY(SCBjauge) = -200; // panne sèche: arrêt du moteur à hélice
}
}
if (eroch2==1 & chroch2==2 & roch2y+24>posy-4 & roch2y+24<posy+28) // test colision rocher 36*36
{
if (roch2x+24>posx & roch2x+24<posx+40)
{
eroch2=0;goroch2=0;roch2x=180;
boumgb=1;aaroch=16;
stopm=1;energ=0;SCBY(SCBjauge) = -200; // panne sèche: arrêt du moteur à hélice
}
}
}
}
// if (eroch>0) // affichage
// {
// SCBDATA(SCBroch) = rochtab[aroch%18];
// SCBX(SCBroch) = rochx;
// SCBY(SCBroch) = rochy;
//DrawSprite(SCBroch);
// }
// test3:
//SCBDATA(SCBchiffres) = chiffrestab[10%12];
//SCBX(SCBchiffres) = rochx+12;
//SCBY(SCBchiffres) = rochy+12;
//DrawSprite(SCBchiffres);
// fin test3
// ********* rhume (vilain 1) :
if (vil==0 & goship==1)
{
if (govil<tgovil) //32
{
vilx=160;++govil; // petite temporisation avant l'attaque virale
}
//if (govil==tgovil & stopm==0 & nbrnexu==0) //31
if (stopm==0 & nbrnexu==0) //31
{
vilx=160;
hasam=hasa;
hasa=random()%6; // de 0 à 5
// if (hasa==hasam) ++hasa;
// if (hasa>5) hasa=0;
if (hasa==hasam | hasa==rasam) // Si le même nombre sort 2 fois de suite, alors...
{
hasar=random()%2; // de 0 à 1
if (hasar==0) ++hasa;
if (hasar==1) --hasa;
}
if (hasa>5) hasa=0;
if (hasa<0) hasa=5;
vil=1;vilx=160;tempvilx=0;vily=hasa*16;vily=vily+3;avil=0;tempavil=0;
// Taille vilain1: 16*16 ; objectif :
// 6 positions de départ Y pour le vilain1 : vily = 3 ou 19 ou 35 ou 51 ou 67 ou 83
// espacement de 3 lignes en haut et en bas : 3 et 99 (83 + 16 (nbre de ligne du vilain1))
}
}
//
// test1:
// SCBDATA(SCBchiffres) = chiffrestab[10%12];
// SCBX(SCBchiffres) = posx+30;
// SCBY(SCBchiffres) = posy+9;
// DrawSprite(SCBchiffres);
// SCBX(SCBchiffres) = posx+30;
// SCBY(SCBchiffres) = posy+12;
// DrawSprite(SCBchiffres);
// SCBX(SCBchiffres) = posx+40;
// SCBY(SCBchiffres) = posy+9;
// DrawSprite(SCBchiffres);
// SCBX(SCBchiffres) = posx+40;
// SCBY(SCBchiffres) = posy+12;
// DrawSprite(SCBchiffres);
// fin test1
if (vil==1)
{
++tempvilx; // vitesse du vilain 1 en fonction du niveau.
if (tempvilx>speedvil)
{
tempvilx=0;--vilx;
}
// vilx=vilx-speedvil;
// if (level==2 & tempvilx>0)
// {
// tempvilx=0;--vilx;
// }
++tempavil; // animation du vilain 1
/***************************************************************************
** Les conditions suivantes ralentissent le jeu ! Alors j'opte pour une **
** seule condition... il faut limiter le nbre de condition.
***************************************************************************/
// if (tempavil==41) tempavil=1;
// if (tempavil>0 & tempavil<11) avil=0; // 1 à 10
// if (tempavil>10 & tempavil<21) avil=1; // 11 à 20
// if (tempavil>20 & tempavil<31) avil=2; // 21 à 30
// if (tempavil>30 & tempavil<41) avil=1; // 31 à 40
if (tempavil>10)
{
tempavil=0;++avil;
if (avil>2) avil=0;
}
// SCBDATA(SCBrhume) = rhumetab[avil%7];
// SCBX(SCBrhume) = vilx;
// SCBY(SCBrhume) = vily;
// DrawSprite(SCBrhume);
if (vilx<-16) {vil=0;govil=0;} // si vilain1 sort de l'écran, alors remise à 0 de sa création.
// test2:
// SCBX(SCBchiffres) = vilx;
// SCBY(SCBchiffres) = vily+8;
// DrawSprite(SCBchiffres);
// fin test2
// capture du vilain1 !!!
// atest=0;
// if (vily+8>posy+9 & vily+8<posy+12) atest=1;
// if (vily+6>posy+7 & vily+8<posy+16) atest=1;
if (stopm==0)
{
if (vily+8>posy+7 & vily+8<posy+16)
{
if (vilx>posx+30 & vilx<posx+40)
{
// atest=1;
vil=2;avil=3;tempavil=0;
// bruitage capture virus :
silence();
abcmusic(0,abcaptvir);
}
}
}
// vily
// posx
// posy
}
if (vil==2) // virus capturé le nanoship !
{
// avil=3;
vily=posy+3;vilx=posx+38;
tempd=0; // ici, on stoppe temporairement la jauge.
if (tempavil<31) ++tempavil; // animation du vilain 1
if (tempavil>0 & tempavil<11) avil=4; // 1 à 10
if (tempavil>10 & tempavil<21) avil=3; // 11 à 20
if (tempavil>20 & tempavil<31) avil=4; // 21 à 30
if (tempavil==31 | boumgb>0)
{
tempavil=0;vil=0;govil=0;
vilx=160;SCBX(SCBrhume) = vilx;
if (boumgb==0)
{
energ=energ+4;++score;
if (energ>10) energ=10;
}
// --energ;
// if (energ<1) energ=10;
}
}
if (vil>0) // affichage
{
SCBDATA(SCBrhume) = rhumetab[avil%7];
SCBX(SCBrhume) = vilx;
SCBY(SCBrhume) = vily;
// DrawSprite(SCBrhume);
}
} // if (gspause==0)
// DrawSprite(SCBroch); // Affichage sprites chainés (rocher + rhume)
// ********* jauge d'énergie du shiplayer:
if (gsblip==2)
{
if (energ>0 & gspause==0 & nbrnexu==0) // Si le shiplayer a encore de l'énergie, alors...
{
++tempd; // ...incremente une petite tempo
if (tempd>11) // 59
{
tempd=0;--energ;
if (energ==0)
{
stopm=1; // panne sèche: arrêt du moteur à hélice
SCBY(SCBjauge) = -200; // mettre image jauge hors de l'écran.
// bruitage panne sèche :
silence();
abcmusic(3,abcpanne);
}
}
}
//energ=1;
if (energ>0 & gspause==0)
{
--energ; // energ de 1 à 10 --> mais de 0 à 9 pour le n° image
SCBDATA(SCBjauge) = jaugetab[energ%10];
SCBX(SCBjauge) = 55;SCBY(SCBjauge) = 4;
++energ;
}
}
//DrawSprite(SCBjauge); // Affichage sprites (jauge )
if (stopm>0 & gspause==0)
{
if (boumgb>0) // explosion du shiplayer
{
++aaroch;
if (aaroch==18)
{
aaroch=16;nbboum++; // nombre de boum
++scboom;
if (scboom>4) {
scboom=1;
// bruitage boum :
silence();
abcmusic(1,abcboum);
}
}
SCBDATA(SCBroch) = rochtab[aaroch%18];
if (scboom==1)
{
SCBHS(SCBroch) = 0x100;SCBVS(SCBroch) = 0x100;
SCBX(SCBroch) = posx+10;SCBY(SCBroch) = posy-1;
}
if (scboom==2 | scboom==4)
{
SCBHS(SCBroch) = 0x140;SCBVS(SCBroch) = 0x140;
SCBX(SCBroch) = posx+6;SCBY(SCBroch) = posy-4;
}
if (scboom==3)
{
SCBHS(SCBroch) = 0x180;SCBVS(SCBroch) = 0x180;
SCBX(SCBroch) = posx+2;SCBY(SCBroch) = posy-7;
}
//DrawSprite(SCBroch); // Affichage sprites chainés (rocher + rhume)
SCBHS(SCBroch) = 0x100;SCBVS(SCBroch) = 0x100;
}
// | cette barre verticale veut dire OR/OU en langage C
if (nbboum>31 | outship>47) // outship voir plus haut (pour faire une recherche, appuyez sur Ctrl + F)
{
SCBX(SCBroch) = 200;SCBX(SCBroch2) = 200; // mettre image rocher et virus hors de l'écran.
nbboum=0;scboom=0;outship=0;
--gslife; // perd un ship...
stopm=0;etape=1;tempa=0;energ=10;goship=0;posx=-40;posy=39;boumgb=0;aaroch=0;
govil=0;vil=0;vilx=0;tempvilx=0;vily=0;avil=0;tempavil=0;
hasa=0;hasam=0;hasar=0;
goroch=0;eroch=0;rochx=0;rochy=0;
goroch2=0;eroch2=0;roch2x=0;roch2y=0;
temprochx=0;aroch=0;temparoch=0;
rasa=0;rasam=0;rasar=0;
rbsa=0;rbsam=0;rbsar=0;
nbrnexu=0;nbrnext=0;
if (gslife>0) // ...mais s'il en reste encore, alors retour à l'étape 1.
{
etape=1;
SCBY(SCBgsf1) = -200;SCBY(SCBgsf2) = -200;SCBY(SCBgsf3) = -200;SCBY(SCBgsf4) = -200;SCBY(SCBgsf5) = -200;SCBY(SCBgsf6) = -200;
SCBY(SCBsprite1) = -200;SCBY(SCBsprite2) = -200;SCBY(SCBroch) = -200;SCBY(SCBroch2) = -200;SCBY(SCBrhume) = -200;SCBY(SCBjauge) = -200;
}
if (gslife<1) // ...mais s'il n'en plus, alors game over.
{
etape=8;tempa=0;xpush=-48;ypush=34;
SCBY(SCBgsf1) = -200;SCBY(SCBgsf2) = -200;SCBY(SCBgsf3) = -200;SCBY(SCBgsf4) = -200;SCBY(SCBgsf5) = -200;SCBY(SCBgsf6) = -200;
SCBY(SCBsprite1) = -200;SCBY(SCBsprite2) = -200;SCBY(SCBroch) = -200;SCBY(SCBroch2) = -200;SCBY(SCBrhume) = -200;SCBY(SCBjauge) = -200;
}
}
}
// ********* passage au prochein niveau
if (nbrnexu>0 & boumgb==0)
{
if (nbrnexu==1 & vil<1 & eroch<1 & eroch2<1)
{
nbrnexu=2; // joueur n'a plus le contrôle du shiplayer
// bruitage moteur shiplayer rentree sortie :
silence();
abcmusic(3,abces);
}
if (nbrnexu==3) // passage au level suivant
{
SCBX(SCBroch) = 200;SCBX(SCBroch2) = 200; // mettre image rocher et virus hors de l'écran.
//nbboum=0;outship=0;
//--gslife; // perd un ship...
stopm=0;tempa=0;energ=10;goship=0;posx=-40;posy=39;boumgb=0;aaroch=0;
govil=0;vil=0;vilx=0;tempvilx=0;vily=0;avil=0;tempavil=0;
hasa=0;hasam=0;hasar=0;
goroch=0;eroch=0;rochx=0;rochy=0;
goroch2=0;eroch2=0;roch2x=0;roch2y=0;
temprochx=0;aroch=0;temparoch=0;
rasa=0;rasam=0;rasar=0;
rbsa=0;rbsam=0;rbsar=0;
nbrnexu=0;nbrnext=0;
etape=1;++level;
SCBY(SCBgsf1) = -200;SCBY(SCBgsf2) = -200;SCBY(SCBgsf3) = -200;SCBY(SCBgsf4) = -200;SCBY(SCBgsf5) = -200;SCBY(SCBgsf6) = -200;
SCBY(SCBsprite1) = -200;SCBY(SCBsprite2) = -200;SCBY(SCBroch) = -200;SCBY(SCBroch2) = -200;SCBY(SCBrhume) = -200;SCBY(SCBjauge) = -200;
}
}
} // if (etape==2)
// *********************************************************************************************
// if (etape==3)
// {
// }
// *********************************************************************************************
if (etape>7)
{
SCBDATA(SCB) = gameover;
SCBX(SCB) = 70;
SCBY(SCB) = 34;
DrawSprite(SCB);
if (etape==9)
{
if (!(joystick & BUTTON_LEFT))
{
etape=0;
SCBY(SCBscore1) = -200;SCBY(SCBscore2) = -200;SCBY(SCBscore3) = -200; // score
SCBX(SCBl) = 0;SCBY(SCBl) = 0; // coordonnées fond intro
}
}
if (etape==8) // game over.
{
SCBX(SCBp) = xpush;SCBY(SCBp) = ypush;
DrawSprite(SCBl); // Affichage sprites chainés (fond intro + fond jeu + shiplayer moteur + shiplayer coque + rocher1 + rocher2 + vilainrhume + pushup)
//SCBDATA(SCB) = pushup;
//SCBX(SCB) = xpush;
//SCBY(SCB) = ypush;
//DrawSprite(SCB);
if (xpush<8 & elvl==5) xpush=xpush+2;
if (xpush>7)
{
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)
{
tempa=0;xpush=-48;ypush=34;
etape=9;
// bruitage menu :
silence();
abcmusic(0,abcmenu1);
abcmusic(1,abcmenu2);
}
}
}
}
// *********************************************************************************************
/***************************************************************************
** Test (lignes suivantes a désactivées) **
***************************************************************************/
/*
//unite = gshas % 10;
unite = nbrnexu % 10;
// unité:
SCBDATA(SCBchiffres1) = chiffrestab[unite%12];
SCBX(SCBchiffres1) = 130;
SCBY(SCBchiffres1) = 23;
DrawSprite(SCBchiffres1); // Affichage valeur testé
unite = rasa % 10;
// unité:
SCBDATA(SCBchiffres1) = chiffrestab[unite%12];
SCBX(SCBchiffres1) = 130;
SCBY(SCBchiffres1) = 53;
DrawSprite(SCBchiffres1); // Affichage valeur testé
//unite = rbsa % 10;
//unite = roch2x % 10;
//dizaine = roch2x / 10 % 10;
//centaine = roch2x / 100 % 10;
unite = goroch2 % 10;
dizaine = goroch2 / 10 % 10;
centaine = goroch2 / 100 % 10;
// unité:
SCBDATA(SCBchiffres1) = chiffrestab[unite%12];
SCBX(SCBchiffres1) = 120;
SCBY(SCBchiffres1) = 53;
// dizaine:
SCBDATA(SCBchiffres2) = chiffrestab[dizaine%12];
SCBX(SCBchiffres2) = 120;
SCBY(SCBchiffres2) = 53-4;
// centaine:
SCBDATA(SCBchiffres3) = chiffrestab[centaine%12]; // 0
SCBX(SCBchiffres3) = 120;
SCBY(SCBchiffres3) = 53-8;
DrawSprite(SCBchiffres1); // Affichage valeur testé
*/
/***************************************************************************
** Fin Test **
***************************************************************************/
// *********************************************************************************************
//Fchiffres(8,92,etape); // test de variable (mais où est le debogueur ?)
if (etape==2 & gspause>0)
{
SCBDATA(SCB) = ipause;
SCBX(SCB) = 73;
SCBY(SCB) = 30;
DrawSprite(SCB);
}
/*
unite = atest % 10;
dizaine = atest / 10 % 10;
// unité:
SCBDATA(SCBchiffres1) = chiffrestab[unite%12];
SCBX(SCBchiffres1) = 100;
SCBY(SCBchiffres1) = 53;
// dizaine:
SCBDATA(SCBchiffres2) = chiffrestab[dizaine%12];
SCBX(SCBchiffres2) = 100;
SCBY(SCBchiffres2) = 53-4;
DrawSprite(SCBchiffres1); // Affichage valeur testé
*/
Vsync();
SwapBuffers();
}
/**************************************************************************
** FIN de la BOUCLE PRINCIPALE **
**************************************************************************/
}
RYGAR (./46) :merci pour le retour
Petit retour ici aussi pour ta dernière mise à jour et comme pour Fission je ne me concentrerais que sur les 2 défauts majeurs que j'ai relevé :
1 Mon dieu que ça rame !!! Le premier niveau passe encore mais dés le deuxième c'est atroce![]()
RYGAR (./46) :si le jeu ralentis considérablement, forcément, ça va pas le faire. Mais la bonne nouvelle, c'est que je sais maintenant comment marche voff et hoff, la prochaine mise à jour devrait, je l'espère, régler le soucis (ou pas).
2 Heu la différence entre les niveaux 1/2 et 3/4 j'ai pas bien vu ???pour moi c'est toujours pareil il suffit d'attraper un certain nombre d'ennemis pour passer au niveau suivant non ?
RYGAR (./52) :Ouf, bon ben il vaut mieux ne plus toucher à rien, je pense que je vais le laisser comme ça, merci pour tes retours
Mais c'est parfais !
Le scrolling est fluide et rapide c'est un vrai plaisir. C'est dingue comme tu es passé en peu de temps d'une version lente et avec des ralentissements à cette version ci, ça prouve que tu maitrises de mieux en mieux la programmation sur Lynx.
Tu comptes encore modifier le jeu ou tu vas le laisser tel quel ?
Dans le 1er cas je brule une Eprom et je me fait une cartouche dans le second je te donnerais encore mon avis de joueur perpétuellement insatisfait
beauregard (./53) :
Ouf, bon ben il vaut mieux ne plus toucher à rien, je pense que je vais le laisser comme ça
RYGAR (./54) :merci beaucoup, j'ai bien hâte de montrer la vidéo à ma entourage
pour la vidéo c'est prévu aussi dés que je l'aurais "cartouchifié"