add invincible powerup and allow quit on mobile
after game over
This commit is contained in:
parent
a551b2d194
commit
f04fa49de2
|
@ -64,6 +64,7 @@ enum FurnaceCVObjectTypes {
|
||||||
CV_MINE,
|
CV_MINE,
|
||||||
CV_POWERUP_P,
|
CV_POWERUP_P,
|
||||||
CV_POWERUP_S,
|
CV_POWERUP_S,
|
||||||
|
CV_MOD_I,
|
||||||
CV_MOD_S,
|
CV_MOD_S,
|
||||||
CV_EXTRA_LIFE
|
CV_EXTRA_LIFE
|
||||||
};
|
};
|
||||||
|
@ -115,7 +116,7 @@ struct FurnaceCVPlayer: FurnaceCVObject {
|
||||||
short speedX, speedY;
|
short speedX, speedY;
|
||||||
unsigned char shootDir;
|
unsigned char shootDir;
|
||||||
unsigned char animFrame;
|
unsigned char animFrame;
|
||||||
unsigned char invincible;
|
short invincible;
|
||||||
unsigned char shotTimer;
|
unsigned char shotTimer;
|
||||||
|
|
||||||
void collision(FurnaceCVObject* other);
|
void collision(FurnaceCVObject* other);
|
||||||
|
@ -376,6 +377,17 @@ struct FurnaceCVPowerupS: FurnaceCVObject {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct FurnaceCVModI: FurnaceCVObject {
|
||||||
|
unsigned char life;
|
||||||
|
void collision(FurnaceCVObject* other);
|
||||||
|
void tick();
|
||||||
|
FurnaceCVModI(FurnaceCV* p):
|
||||||
|
FurnaceCVObject(p),
|
||||||
|
life(255) {
|
||||||
|
type=CV_MOD_I;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct FurnaceCVModS: FurnaceCVObject {
|
struct FurnaceCVModS: FurnaceCVObject {
|
||||||
unsigned char life;
|
unsigned char life;
|
||||||
void collision(FurnaceCVObject* other);
|
void collision(FurnaceCVObject* other);
|
||||||
|
@ -419,7 +431,7 @@ struct FurnaceCV {
|
||||||
int textWait, curText, transWait;
|
int textWait, curText, transWait;
|
||||||
int ticksToInit;
|
int ticksToInit;
|
||||||
|
|
||||||
bool inGame, inTransition, newHiScore, playSongs, pleaseInitSongs;
|
bool inGame, inTransition, newHiScore, playSongs, pleaseInitSongs, gameOver;
|
||||||
unsigned char lives, respawnTime, stage, shotType;
|
unsigned char lives, respawnTime, stage, shotType;
|
||||||
int score;
|
int score;
|
||||||
int hiScore;
|
int hiScore;
|
||||||
|
@ -494,6 +506,7 @@ struct FurnaceCV {
|
||||||
newHiScore(false),
|
newHiScore(false),
|
||||||
playSongs(true),
|
playSongs(true),
|
||||||
pleaseInitSongs(false),
|
pleaseInitSongs(false),
|
||||||
|
gameOver(false),
|
||||||
lives(5),
|
lives(5),
|
||||||
respawnTime(0),
|
respawnTime(0),
|
||||||
stage(0),
|
stage(0),
|
||||||
|
@ -853,6 +866,15 @@ void FurnaceGUI::drawTutorial() {
|
||||||
touchControls|=128;
|
touchControls|=128;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cv!=NULL) {
|
||||||
|
if (touchControls && cv->gameOver) {
|
||||||
|
cv->unload();
|
||||||
|
delete cv;
|
||||||
|
cv=NULL;
|
||||||
|
cvOpen=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cv==NULL) {
|
if (cv==NULL) {
|
||||||
|
@ -922,8 +944,8 @@ void FurnaceGUI::drawTutorial() {
|
||||||
|
|
||||||
if (((double)canvasH/(double)canvasW)>0.7) {
|
if (((double)canvasH/(double)canvasW)>0.7) {
|
||||||
if (mobileUI) {
|
if (mobileUI) {
|
||||||
p0=ImVec2(0.0,0.0);
|
p0=ImVec2(0.0,canvasH*0.05);
|
||||||
p1=ImVec2(canvasW,canvasW*0.7);
|
p1=ImVec2(canvasW,(canvasH*0.05)+(canvasW*0.7));
|
||||||
} else {
|
} else {
|
||||||
p0=ImVec2(0.0,(canvasH-(canvasW*0.7))*0.5);
|
p0=ImVec2(0.0,(canvasH-(canvasW*0.7))*0.5);
|
||||||
p1=ImVec2(canvasW,canvasW*0.7+(canvasH-(canvasW*0.7))*0.5);
|
p1=ImVec2(canvasW,canvasW*0.7+(canvasH-(canvasW*0.7))*0.5);
|
||||||
|
@ -1445,6 +1467,7 @@ void FurnaceCV::render(unsigned char joyIn) {
|
||||||
} else {
|
} else {
|
||||||
startTyping(_(cvText[2]),15,13);
|
startTyping(_(cvText[2]),15,13);
|
||||||
}
|
}
|
||||||
|
gameOver=true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2247,7 +2270,7 @@ void FurnaceCVEnemy1::collision(FurnaceCVObject* other) {
|
||||||
if (--health<=0) {
|
if (--health<=0) {
|
||||||
dead=true;
|
dead=true;
|
||||||
if ((rand()%7)==0 || (enemyType>1 && (rand()%7)==3)) {
|
if ((rand()%7)==0 || (enemyType>1 && (rand()%7)==3)) {
|
||||||
switch (rand()%13) {
|
switch (rand()%14) {
|
||||||
case 0: // extra life
|
case 0: // extra life
|
||||||
cv->createObject<FurnaceCVExtraLife>(x+(enemyType>=2?8:0),y+(enemyType>=2?8:0));
|
cv->createObject<FurnaceCVExtraLife>(x+(enemyType>=2?8:0),y+(enemyType>=2?8:0));
|
||||||
break;
|
break;
|
||||||
|
@ -2262,6 +2285,9 @@ void FurnaceCVEnemy1::collision(FurnaceCVObject* other) {
|
||||||
case 12: // mod
|
case 12: // mod
|
||||||
cv->createObject<FurnaceCVModS>(x+(enemyType>=2?8:0),y+(enemyType>=2?8:0));
|
cv->createObject<FurnaceCVModS>(x+(enemyType>=2?8:0),y+(enemyType>=2?8:0));
|
||||||
break;
|
break;
|
||||||
|
case 13: // mod
|
||||||
|
cv->createObject<FurnaceCVModI>(x+(enemyType>=2?8:0),y+(enemyType>=2?8:0));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cv->soundEffect(SE_EXPL1);
|
cv->soundEffect(SE_EXPL1);
|
||||||
|
@ -3021,6 +3047,33 @@ void FurnaceCVExtraLife::tick() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FurnaceCVModI IMPLEMENTATION
|
||||||
|
|
||||||
|
void FurnaceCVModI::collision(FurnaceCVObject* other) {
|
||||||
|
if (other->type==CV_PLAYER) {
|
||||||
|
dead=true;
|
||||||
|
cv->soundEffect(SE_PICKUP1);
|
||||||
|
cv->addScore(200);
|
||||||
|
((FurnaceCVPlayer*)other)->invincible=600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FurnaceCVModI::tick() {
|
||||||
|
if (--life==0) dead=true;
|
||||||
|
|
||||||
|
if (life>64 || (life&1)) {
|
||||||
|
spriteDef[0]=0x41c;
|
||||||
|
spriteDef[1]=0x41d;
|
||||||
|
spriteDef[2]=0x43c;
|
||||||
|
spriteDef[3]=0x43d;
|
||||||
|
} else {
|
||||||
|
spriteDef[0]=0;
|
||||||
|
spriteDef[1]=0;
|
||||||
|
spriteDef[2]=0;
|
||||||
|
spriteDef[3]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// FurnaceCVModS IMPLEMENTATION
|
// FurnaceCVModS IMPLEMENTATION
|
||||||
|
|
||||||
void FurnaceCVModS::collision(FurnaceCVObject* other) {
|
void FurnaceCVModS::collision(FurnaceCVObject* other) {
|
||||||
|
|
Loading…
Reference in a new issue