Game over and state reloading

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
master
sigonasr2 2 years ago
parent 2095d32d8f
commit 3f73e7547d
  1. 98
      SeasonsOfLoneliness.cpp
  2. BIN
      Seasons_of_Loneliness
  3. 5
      data.h

@ -46,6 +46,7 @@ enum GAMESTATE{
GAMEWORLD,
WAITING_FOR_CUTSCENE_3,
GAME_OVER,
GAME_OVER_TERMINAL,
COLLECTED_SILICON,
CUTSCENE_4, //First rover repaired.
CUTSCENE_4_DONE,
@ -335,6 +336,7 @@ class Entity{
public:
bool ally=false;
int hp;
int startingHP;
int maxhp;
Decal*spr;
float x;
@ -354,7 +356,7 @@ class Entity{
this->x=x;
this->y=y;
this->maxhp=hp;
this->hp=hp;
this->hp=this->startingHP=hp;
this->maxhp=maxhp;
this->moveSet=moveset;
this->fixedTurnOrder=fixedMoveset;
@ -978,6 +980,9 @@ public:
fadeOut();
}
}break;
case GAME_OVER_TERMINAL:{
fadeOut();
}break;
}
}
@ -1131,6 +1136,7 @@ public:
}
if (GetKey(W).bPressed||GetKey(UP).bPressed||GetKey(NP8).bPressed) {
PLAYER_SELECTED_TARGET=-1;
//std::cout<<"Battle State is "<<BATTLE_STATE<<" (1)\n";
BATTLE_STATE=battle::PLAYER_SELECTION;
}
if (GetKey(A).bPressed||GetKey(LEFT).bPressed||GetKey(NP4).bPressed) {
@ -1233,6 +1239,15 @@ public:
PlayCutscene(cutscene::IN_BED);
PLAYER_HP=PLAYER_MAXHP;
}break;
case GAME_OVER:{
GAME_STATE=GAME_OVER_TERMINAL;
fadeIn();
}break;
case GAME_OVER_TERMINAL:{
LoadPreviousPlayerState();
GAME_STATE=GAMEWORLD;
fadeIn();
}break;
}
switch (CURRENT_CUTSCENE) {
case cutscene::TRANSITION_CUTSCENE:{
@ -1615,7 +1630,7 @@ public:
}
}
if (!IN_BATTLE_ENCOUNTER) {
if (!IN_BATTLE_ENCOUNTER&&playerCanMove()) {
for (int i=0;i<ENCOUNTERS.size();i++) {
Encounter enc = ENCOUNTERS[i];
if (enc.map==CURRENT_MAP&&collidesWithPlayer(enc)) {
@ -1668,6 +1683,7 @@ public:
DisplayMessageBox(22);
break;
}
//std::cout<<"Battle State is "<<BATTLE_STATE<<" (2)\n";
BATTLE_STATE = battle::PLAYER_SELECTION;
clearPixelEffect();
EFFECT_TIMER = 0;
@ -1915,37 +1931,38 @@ public:
if (allDead) {
IN_BATTLE_ENCOUNTER=false;
ENCOUNTERS.erase(ENCOUNTERS.begin()+CURRENT_ENCOUNTER_IND);
BATTLE_CARD_SELECTION_IND=0;
PLAYER_SELECTED_TARGET=-1;
BATTLE_STATE=battle::NONE;
resetBattleState();
PLAYER_COORDS[0]=BATTLE_PLAYER_COORDS.x;
PLAYER_COORDS[1]=BATTLE_PLAYER_COORDS.y;
clearSeeds();
clearTrees();
performCropUpdate(8);
if (FOOD_REGEN_TURNS>0) {
FOOD_REGEN_TURNS=0;
foodCount++;
}
} else {
if (PLAYER_HP<=0) {
GameOver();
break;
}
if (!GAME_FLAGS[gameflag::ANALYSIS_X_X]&&GAME_FLAGS[gameflag::FIRST_ENCOUNTER_X_X]) {
GAME_FLAGS[gameflag::ANALYSIS_X_X]=true;
DisplayMessageBox(23);
break;
}
if (BATTLE_CURRENT_TURN_ENTITY==-1) {
BATTLE_DROUGHT_ACTIVE=false;
std::cout<<"Drought turned off.\n";
}
//std::cout<<"Battle State is "<<BATTLE_STATE<<" (3)\n";
BATTLE_STATE=battle::PLAYER_SELECTION;
PLAYER_SELECTED_TARGET=-1;
}
} else {
if (BATTLE_CURRENT_TURN_ENTITY==-1) {
BATTLE_DROUGHT_ACTIVE=false;
std::cout<<"Drought turned off.\n";
}
BATTLE_CURRENT_TURN_ENTITY=turnOrder.front();
turnOrder.pop();
if (BATTLE_CURRENT_TURN_ENTITY==-1) {
if (PLAYER_HP<=0) {
GAME_STATE=GAME_OVER;
GameOver();
break;
}
} else {
@ -2253,18 +2270,8 @@ public:
switch (GAME_STATE) {
case CUTSCENE_1:
case CUTSCENE_3:
case CUTSCENE_4:{
switch (GAME_STATE) {
case CUTSCENE_1:{
CONSOLE_REF_TEXT=STORY_TEXT1;
}break;
case CUTSCENE_3:{
CONSOLE_REF_TEXT=STORY_TEXT2;
}break;
case CUTSCENE_4:{
CONSOLE_REF_TEXT=STORY_TEXT3;
}break;
}
case CUTSCENE_4:
case GAME_OVER_TERMINAL:{
if (GAME_STATE==CUTSCENE_3&&frameCount%4!=0) {break;}
if (textInd<CONSOLE_REF_TEXT.length()) {
char c = CONSOLE_REF_TEXT[textInd++];
@ -2409,15 +2416,17 @@ public:
if(WALK_STEPS++>60&&!IN_BATTLE_ENCOUNTER) {
PLAYER_HP=std::clamp(PLAYER_HP+1,0,PLAYER_MAXHP);
updatePlayerState();
WALK_STEPS=0;
}
}
void drawGame(){
switch (GAME_STATE) {
case CUTSCENE_1:
case CUTSCENE_4:{
case CUTSCENE_4:
case GAME_OVER_TERMINAL:{
DrawStringDecal({16,16},CUTSCENE_CONSOLE_TEXT,GREEN,{1,1});
if (textInd<STORY_TEXT1.length()) {
if (textInd<CONSOLE_REF_TEXT.length()) {
FillRectDecal({(float)(16+(cursorX)*8%(WIDTH-32)),(float)(8+GetTextSize(CUTSCENE_CONSOLE_TEXT).y+((cursorX==28)?8:0))},{4,8},GREEN);
} else {
FillRectDecal({(float)(16+(cursorX)*8%(WIDTH-32)),(float)(8+GetTextSize(CUTSCENE_CONSOLE_TEXT).y+((cursorX==28)?8:0))},{4,8},Pixel(0,255,0,(0.5*sin(frameCount*4/60.0)+0.5)*256));
@ -2917,7 +2926,7 @@ public:
}
bool playerCanMove() {
return GAME_STATE==GAMEWORLD&&CURRENT_CUTSCENE==cutscene::NONE&&!messageBoxVisible&&!IN_BATTLE_ENCOUNTER;
return PLAYER_HP>0&&GAME_STATE==GAMEWORLD&&CURRENT_CUTSCENE==cutscene::NONE&&!messageBoxVisible&&!IN_BATTLE_ENCOUNTER;
}
void DrawCard(WEATHER_POWER*data,vf2d offset={0,0},vf2d scale={1,1},float darknessFactor=1.0) {
@ -3357,6 +3366,41 @@ public:
PREV_PLAYERSTATE->weatherPowerCounts[i]=WEATHER_POWERS[i]->playerOwnCount;
}
}
void LoadPreviousPlayerState() {
PLAYER_COORDS[0]=PREV_PLAYERSTATE->x;
PLAYER_COORDS[1]=PREV_PLAYERSTATE->y;
foodCount=PREV_PLAYERSTATE->foodCount;
PLAYER_HP=PREV_PLAYERSTATE->playerHP;
PLAYER_MAXHP=PREV_PLAYERSTATE->playerMaxHP;
for (int i=0;i<WEATHER_POWER_COUNT;i++) {
WEATHER_POWERS[i]->playerOwnCount=PREV_PLAYERSTATE->weatherPowerCounts[i];
}
}
void resetBattleState(){
IN_BATTLE_ENCOUNTER=false;
BATTLE_CARD_SELECTION_IND=0;
PLAYER_SELECTED_TARGET=-1;
BATTLE_STATE=battle::NONE;
std::cout<<"Battle State set to "<<BATTLE_STATE<<"\n";
BATTLE_DROUGHT_ACTIVE=false;
clearSeeds();
clearTrees();
while (!turnOrder.empty()) {
turnOrder.pop();
}
}
void GameOver() {
GAME_STATE=GAME_OVER;
ResetTerminal(STORY_TEXT4+PLAYER_NAME+STORY_TEXT5);
for (int i=0;i<CURRENT_ENCOUNTER.entities.size();i++) {
CURRENT_ENCOUNTER.entities[i]->hp=CURRENT_ENCOUNTER.entities[i]->startingHP;
}
resetBattleState();
fadeOut();
}
};

Binary file not shown.

@ -28,6 +28,11 @@ GPSNAV-35 - UNABLE TO LOCATE
Press any key to continue.)";
std::string STORY_TEXT4=R"(Unable to hang on, )";
std::string STORY_TEXT5=R"( lets out their last breath before collapsing for eternity...?
Press any key to continue.)";
std::string STORY_DIALOG[]={R"(
???
RAIN CYCLE COMMENCING)", //0

Loading…
Cancel
Save