|
|
@ -46,6 +46,7 @@ enum GAMESTATE{ |
|
|
|
GAMEWORLD, |
|
|
|
GAMEWORLD, |
|
|
|
WAITING_FOR_CUTSCENE_3, |
|
|
|
WAITING_FOR_CUTSCENE_3, |
|
|
|
GAME_OVER, |
|
|
|
GAME_OVER, |
|
|
|
|
|
|
|
GAME_OVER_TERMINAL, |
|
|
|
COLLECTED_SILICON, |
|
|
|
COLLECTED_SILICON, |
|
|
|
CUTSCENE_4, //First rover repaired.
|
|
|
|
CUTSCENE_4, //First rover repaired.
|
|
|
|
CUTSCENE_4_DONE, |
|
|
|
CUTSCENE_4_DONE, |
|
|
@ -335,6 +336,7 @@ class Entity{ |
|
|
|
public: |
|
|
|
public: |
|
|
|
bool ally=false; |
|
|
|
bool ally=false; |
|
|
|
int hp; |
|
|
|
int hp; |
|
|
|
|
|
|
|
int startingHP; |
|
|
|
int maxhp; |
|
|
|
int maxhp; |
|
|
|
Decal*spr; |
|
|
|
Decal*spr; |
|
|
|
float x; |
|
|
|
float x; |
|
|
@ -354,7 +356,7 @@ class Entity{ |
|
|
|
this->x=x; |
|
|
|
this->x=x; |
|
|
|
this->y=y; |
|
|
|
this->y=y; |
|
|
|
this->maxhp=hp; |
|
|
|
this->maxhp=hp; |
|
|
|
this->hp=hp; |
|
|
|
this->hp=this->startingHP=hp; |
|
|
|
this->maxhp=maxhp; |
|
|
|
this->maxhp=maxhp; |
|
|
|
this->moveSet=moveset; |
|
|
|
this->moveSet=moveset; |
|
|
|
this->fixedTurnOrder=fixedMoveset; |
|
|
|
this->fixedTurnOrder=fixedMoveset; |
|
|
@ -978,6 +980,9 @@ public: |
|
|
|
fadeOut(); |
|
|
|
fadeOut(); |
|
|
|
} |
|
|
|
} |
|
|
|
}break; |
|
|
|
}break; |
|
|
|
|
|
|
|
case GAME_OVER_TERMINAL:{ |
|
|
|
|
|
|
|
fadeOut(); |
|
|
|
|
|
|
|
}break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -1131,6 +1136,7 @@ public: |
|
|
|
}
|
|
|
|
}
|
|
|
|
if (GetKey(W).bPressed||GetKey(UP).bPressed||GetKey(NP8).bPressed) { |
|
|
|
if (GetKey(W).bPressed||GetKey(UP).bPressed||GetKey(NP8).bPressed) { |
|
|
|
PLAYER_SELECTED_TARGET=-1; |
|
|
|
PLAYER_SELECTED_TARGET=-1; |
|
|
|
|
|
|
|
//std::cout<<"Battle State is "<<BATTLE_STATE<<" (1)\n";
|
|
|
|
BATTLE_STATE=battle::PLAYER_SELECTION; |
|
|
|
BATTLE_STATE=battle::PLAYER_SELECTION; |
|
|
|
} |
|
|
|
} |
|
|
|
if (GetKey(A).bPressed||GetKey(LEFT).bPressed||GetKey(NP4).bPressed) { |
|
|
|
if (GetKey(A).bPressed||GetKey(LEFT).bPressed||GetKey(NP4).bPressed) { |
|
|
@ -1233,6 +1239,15 @@ public: |
|
|
|
PlayCutscene(cutscene::IN_BED); |
|
|
|
PlayCutscene(cutscene::IN_BED); |
|
|
|
PLAYER_HP=PLAYER_MAXHP; |
|
|
|
PLAYER_HP=PLAYER_MAXHP; |
|
|
|
}break; |
|
|
|
}break; |
|
|
|
|
|
|
|
case GAME_OVER:{ |
|
|
|
|
|
|
|
GAME_STATE=GAME_OVER_TERMINAL; |
|
|
|
|
|
|
|
fadeIn(); |
|
|
|
|
|
|
|
}break; |
|
|
|
|
|
|
|
case GAME_OVER_TERMINAL:{ |
|
|
|
|
|
|
|
LoadPreviousPlayerState(); |
|
|
|
|
|
|
|
GAME_STATE=GAMEWORLD; |
|
|
|
|
|
|
|
fadeIn(); |
|
|
|
|
|
|
|
}break; |
|
|
|
} |
|
|
|
} |
|
|
|
switch (CURRENT_CUTSCENE) { |
|
|
|
switch (CURRENT_CUTSCENE) { |
|
|
|
case cutscene::TRANSITION_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++) { |
|
|
|
for (int i=0;i<ENCOUNTERS.size();i++) { |
|
|
|
Encounter enc = ENCOUNTERS[i]; |
|
|
|
Encounter enc = ENCOUNTERS[i]; |
|
|
|
if (enc.map==CURRENT_MAP&&collidesWithPlayer(enc)) { |
|
|
|
if (enc.map==CURRENT_MAP&&collidesWithPlayer(enc)) { |
|
|
@ -1668,6 +1683,7 @@ public: |
|
|
|
DisplayMessageBox(22); |
|
|
|
DisplayMessageBox(22); |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//std::cout<<"Battle State is "<<BATTLE_STATE<<" (2)\n";
|
|
|
|
BATTLE_STATE = battle::PLAYER_SELECTION; |
|
|
|
BATTLE_STATE = battle::PLAYER_SELECTION; |
|
|
|
clearPixelEffect(); |
|
|
|
clearPixelEffect(); |
|
|
|
EFFECT_TIMER = 0; |
|
|
|
EFFECT_TIMER = 0; |
|
|
@ -1915,37 +1931,38 @@ public: |
|
|
|
if (allDead) { |
|
|
|
if (allDead) { |
|
|
|
IN_BATTLE_ENCOUNTER=false; |
|
|
|
IN_BATTLE_ENCOUNTER=false; |
|
|
|
ENCOUNTERS.erase(ENCOUNTERS.begin()+CURRENT_ENCOUNTER_IND); |
|
|
|
ENCOUNTERS.erase(ENCOUNTERS.begin()+CURRENT_ENCOUNTER_IND); |
|
|
|
BATTLE_CARD_SELECTION_IND=0; |
|
|
|
resetBattleState(); |
|
|
|
PLAYER_SELECTED_TARGET=-1; |
|
|
|
|
|
|
|
BATTLE_STATE=battle::NONE; |
|
|
|
|
|
|
|
PLAYER_COORDS[0]=BATTLE_PLAYER_COORDS.x; |
|
|
|
PLAYER_COORDS[0]=BATTLE_PLAYER_COORDS.x; |
|
|
|
PLAYER_COORDS[1]=BATTLE_PLAYER_COORDS.y;
|
|
|
|
PLAYER_COORDS[1]=BATTLE_PLAYER_COORDS.y;
|
|
|
|
clearSeeds(); |
|
|
|
|
|
|
|
clearTrees(); |
|
|
|
|
|
|
|
performCropUpdate(8); |
|
|
|
performCropUpdate(8); |
|
|
|
if (FOOD_REGEN_TURNS>0) { |
|
|
|
if (FOOD_REGEN_TURNS>0) { |
|
|
|
FOOD_REGEN_TURNS=0; |
|
|
|
FOOD_REGEN_TURNS=0; |
|
|
|
foodCount++; |
|
|
|
foodCount++; |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
|
|
|
|
if (PLAYER_HP<=0) { |
|
|
|
|
|
|
|
GameOver(); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
if (!GAME_FLAGS[gameflag::ANALYSIS_X_X]&&GAME_FLAGS[gameflag::FIRST_ENCOUNTER_X_X]) { |
|
|
|
if (!GAME_FLAGS[gameflag::ANALYSIS_X_X]&&GAME_FLAGS[gameflag::FIRST_ENCOUNTER_X_X]) { |
|
|
|
GAME_FLAGS[gameflag::ANALYSIS_X_X]=true; |
|
|
|
GAME_FLAGS[gameflag::ANALYSIS_X_X]=true; |
|
|
|
DisplayMessageBox(23); |
|
|
|
DisplayMessageBox(23); |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
if (BATTLE_CURRENT_TURN_ENTITY==-1) { |
|
|
|
//std::cout<<"Battle State is "<<BATTLE_STATE<<" (3)\n";
|
|
|
|
BATTLE_DROUGHT_ACTIVE=false; |
|
|
|
|
|
|
|
std::cout<<"Drought turned off.\n"; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
BATTLE_STATE=battle::PLAYER_SELECTION; |
|
|
|
BATTLE_STATE=battle::PLAYER_SELECTION; |
|
|
|
PLAYER_SELECTED_TARGET=-1; |
|
|
|
PLAYER_SELECTED_TARGET=-1; |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
|
|
|
|
if (BATTLE_CURRENT_TURN_ENTITY==-1) { |
|
|
|
|
|
|
|
BATTLE_DROUGHT_ACTIVE=false; |
|
|
|
|
|
|
|
std::cout<<"Drought turned off.\n"; |
|
|
|
|
|
|
|
} |
|
|
|
BATTLE_CURRENT_TURN_ENTITY=turnOrder.front(); |
|
|
|
BATTLE_CURRENT_TURN_ENTITY=turnOrder.front(); |
|
|
|
turnOrder.pop(); |
|
|
|
turnOrder.pop(); |
|
|
|
if (BATTLE_CURRENT_TURN_ENTITY==-1) { |
|
|
|
if (BATTLE_CURRENT_TURN_ENTITY==-1) { |
|
|
|
if (PLAYER_HP<=0) { |
|
|
|
if (PLAYER_HP<=0) { |
|
|
|
GAME_STATE=GAME_OVER; |
|
|
|
GameOver(); |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
@ -2253,18 +2270,8 @@ public: |
|
|
|
switch (GAME_STATE) { |
|
|
|
switch (GAME_STATE) { |
|
|
|
case CUTSCENE_1: |
|
|
|
case CUTSCENE_1: |
|
|
|
case CUTSCENE_3: |
|
|
|
case CUTSCENE_3: |
|
|
|
case CUTSCENE_4:{ |
|
|
|
case CUTSCENE_4: |
|
|
|
switch (GAME_STATE) { |
|
|
|
case GAME_OVER_TERMINAL:{ |
|
|
|
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; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (GAME_STATE==CUTSCENE_3&&frameCount%4!=0) {break;} |
|
|
|
if (GAME_STATE==CUTSCENE_3&&frameCount%4!=0) {break;} |
|
|
|
if (textInd<CONSOLE_REF_TEXT.length()) { |
|
|
|
if (textInd<CONSOLE_REF_TEXT.length()) { |
|
|
|
char c = CONSOLE_REF_TEXT[textInd++]; |
|
|
|
char c = CONSOLE_REF_TEXT[textInd++]; |
|
|
@ -2409,15 +2416,17 @@ public: |
|
|
|
if(WALK_STEPS++>60&&!IN_BATTLE_ENCOUNTER) { |
|
|
|
if(WALK_STEPS++>60&&!IN_BATTLE_ENCOUNTER) { |
|
|
|
PLAYER_HP=std::clamp(PLAYER_HP+1,0,PLAYER_MAXHP); |
|
|
|
PLAYER_HP=std::clamp(PLAYER_HP+1,0,PLAYER_MAXHP); |
|
|
|
updatePlayerState(); |
|
|
|
updatePlayerState(); |
|
|
|
|
|
|
|
WALK_STEPS=0; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void drawGame(){ |
|
|
|
void drawGame(){ |
|
|
|
switch (GAME_STATE) { |
|
|
|
switch (GAME_STATE) { |
|
|
|
case CUTSCENE_1: |
|
|
|
case CUTSCENE_1: |
|
|
|
case CUTSCENE_4:{ |
|
|
|
case CUTSCENE_4: |
|
|
|
|
|
|
|
case GAME_OVER_TERMINAL:{ |
|
|
|
DrawStringDecal({16,16},CUTSCENE_CONSOLE_TEXT,GREEN,{1,1}); |
|
|
|
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); |
|
|
|
FillRectDecal({(float)(16+(cursorX)*8%(WIDTH-32)),(float)(8+GetTextSize(CUTSCENE_CONSOLE_TEXT).y+((cursorX==28)?8:0))},{4,8},GREEN); |
|
|
|
} else { |
|
|
|
} 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)); |
|
|
|
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() { |
|
|
|
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) { |
|
|
|
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; |
|
|
|
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(); |
|
|
|
|
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|