|
|
|
@ -14,6 +14,7 @@ using namespace olc; |
|
|
|
|
|
|
|
|
|
#define SKIP_INTRO true |
|
|
|
|
#define SKIP_CHAPTER1 true |
|
|
|
|
#define SKIP_BOSS true |
|
|
|
|
#define SKIP_CHAPTER2 false |
|
|
|
|
#define SKIP_CHAPTER3 false |
|
|
|
|
|
|
|
|
@ -77,6 +78,7 @@ namespace cutscene{ |
|
|
|
|
SHAKE, |
|
|
|
|
INVESTIGATE_X_X, |
|
|
|
|
CHECK_COORDS, |
|
|
|
|
SPAWN_WORMS, |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -109,6 +111,7 @@ namespace gameflag{ |
|
|
|
|
TUTORIAL2_X_X, |
|
|
|
|
CHECK_ROVER, |
|
|
|
|
NEXT_COORDS, |
|
|
|
|
COLLECTED_SILICON_2, |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -129,7 +132,8 @@ class Seed{ |
|
|
|
|
namespace reasoncode{ |
|
|
|
|
enum Code{ |
|
|
|
|
SEED_GROWTH, |
|
|
|
|
TREE_BURN |
|
|
|
|
TREE_BURN, |
|
|
|
|
DROUGHT |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -578,9 +582,11 @@ public: |
|
|
|
|
int MAIN_MENU_SELECTION=0; |
|
|
|
|
std::string MENU_OPTIONS[4]={"NEW GAME","CONTINUE","MUTE SOUND","EXIT"}; |
|
|
|
|
int BATTLE_REASON_CODE=-1; |
|
|
|
|
bool BATTLE_DROUGHT_ACTIVE=false;
|
|
|
|
|
|
|
|
|
|
Map*MAP_1=new Map("map1"); |
|
|
|
|
Map*MAP_2=new Map("map2"); |
|
|
|
|
Map*MAP_3=new Map("map3"); |
|
|
|
|
|
|
|
|
|
Decal*DOME_DECAL,*FOOD_METER_DECAL,*OXYGEN_METER_DECAL,*PLANT_DECAL, |
|
|
|
|
*PLAYER_DECAL, |
|
|
|
@ -594,6 +600,7 @@ public: |
|
|
|
|
std::vector<Encounter> ENCOUNTERS; |
|
|
|
|
Encounter ENCOUNTER_SPIDEY_1; |
|
|
|
|
Encounter ENCOUNTER_X_X; |
|
|
|
|
Encounter ENCOUNTER_SANDWORM_1; |
|
|
|
|
Encounter CURRENT_ENCOUNTER; |
|
|
|
|
std::vector<WEATHER_POWER*>MOVESET_SPIDEY; |
|
|
|
|
std::vector<WEATHER_POWER*>MOVESET_SANDWORM; |
|
|
|
@ -649,6 +656,14 @@ public: |
|
|
|
|
if (SKIP_CHAPTER3) { |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
if (SKIP_BOSS) { |
|
|
|
|
GAME_FLAGS[gameflag::SLEEP]=true; |
|
|
|
|
GAME_FLAGS[gameflag::FIRST_ENCOUNTER_X_X]=true; |
|
|
|
|
GAME_FLAGS[gameflag::ANALYSIS_X_X]=true; |
|
|
|
|
GAME_FLAGS[gameflag::TUTORIAL1_X_X]=true; |
|
|
|
|
GAME_FLAGS[gameflag::TUTORIAL2_X_X]=true; |
|
|
|
|
GAME_STATE=GAMEWORLD; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SONG_MAIN = sound::Wave("./assets/SeasonsOfLoneliness.wav"); |
|
|
|
@ -882,6 +897,14 @@ public: |
|
|
|
|
ENCOUNTER_X_X.playerX=3; |
|
|
|
|
ENCOUNTER_X_X.playerY=2; |
|
|
|
|
ENCOUNTER_X_X.map=MAP_1; |
|
|
|
|
ENCOUNTER_SANDWORM_1.entities.push_back(new Entity(SANDWORM_DECAL,"Sandworm",2,1,165,165,MOVESET_SANDWORM)); |
|
|
|
|
ENCOUNTER_SANDWORM_1.entities.push_back(new Entity(SANDWORM_DECAL,"Sandworm",3,4,165,165,MOVESET_SANDWORM)); |
|
|
|
|
ENCOUNTER_SANDWORM_1.entities.push_back(new Entity(SANDWORM_DECAL,"Sandworm",6,3,165,165,MOVESET_SANDWORM)); |
|
|
|
|
ENCOUNTER_SANDWORM_1.x=20-4; |
|
|
|
|
ENCOUNTER_SANDWORM_1.y=73-3.5; |
|
|
|
|
ENCOUNTER_SANDWORM_1.playerX=4; |
|
|
|
|
ENCOUNTER_SANDWORM_1.playerY=3.5; |
|
|
|
|
ENCOUNTER_SANDWORM_1.map=MAP_3; |
|
|
|
|
//ENCOUNTERS.push_back(ENCOUNTER_X_X); //Activate at beginning of Chapter 2.
|
|
|
|
|
|
|
|
|
|
BASE_OBJECTS["DOME"]=new ObjectLoadInfo(DOME_DECAL); |
|
|
|
@ -1200,11 +1223,19 @@ public: |
|
|
|
|
} |
|
|
|
|
switch (CURRENT_CUTSCENE) { |
|
|
|
|
case cutscene::TRANSITION_CUTSCENE:{ |
|
|
|
|
LoadMap(MAP_1); |
|
|
|
|
PLAYER_COORDS[0]=40.5; |
|
|
|
|
PLAYER_COORDS[1]=37.5; |
|
|
|
|
fadeIn(); |
|
|
|
|
EndCutscene(); |
|
|
|
|
if (GAME_FLAGS[gameflag::CHECK_ROVER]) { |
|
|
|
|
LoadMap(MAP_3); |
|
|
|
|
PLAYER_COORDS[0]=40.5; |
|
|
|
|
PLAYER_COORDS[1]=37.5; |
|
|
|
|
fadeIn(); |
|
|
|
|
EndCutscene(); |
|
|
|
|
} else { |
|
|
|
|
LoadMap(MAP_1); |
|
|
|
|
PLAYER_COORDS[0]=40.5; |
|
|
|
|
PLAYER_COORDS[1]=37.5; |
|
|
|
|
fadeIn(); |
|
|
|
|
EndCutscene(); |
|
|
|
|
} |
|
|
|
|
if (!GAME_FLAGS[gameflag::VISIT_BROKEN_ROVER]) { |
|
|
|
|
GAME_FLAGS[gameflag::VISIT_BROKEN_ROVER]=true; |
|
|
|
|
PlayCutscene(cutscene::WALK_TO_ROVER); |
|
|
|
@ -1737,7 +1768,7 @@ public: |
|
|
|
|
PIXEL_EFFECT_TRANSPARENCY=(0.5*cos(((M_PI/(30.0*(ref->effectTime/120.0)))/2)*EFFECT_TIMER-M_PI)+0.5); |
|
|
|
|
if (EFFECT_TIMER==30&&ref->name.compare("Petal Storm")==0) { |
|
|
|
|
int healPower=30; |
|
|
|
|
int healRoll=healPower+rand()%ref->damageRoll*sign(healPower); |
|
|
|
|
int healRoll=healPower+rand()%ref->damageRoll*sign(healPower)*(BATTLE_DROUGHT_ACTIVE?0.5:1); |
|
|
|
|
if (BATTLE_CURRENT_TURN_ENTITY==-1) { |
|
|
|
|
effectRadius({(int)BATTLE_PLAYER_COORDS.x,(int)BATTLE_PLAYER_COORDS.y},ref,-healRoll,true); |
|
|
|
|
} else { |
|
|
|
@ -1757,7 +1788,7 @@ public: |
|
|
|
|
if (BATTLE_CURRENT_TURN_ENTITY==-1) { |
|
|
|
|
if (FOOD_REGEN_TURNS>0) { |
|
|
|
|
FOOD_REGEN_TURNS--;
|
|
|
|
|
PLAYER_HP=std::clamp(PLAYER_HP+(int)(PLAYER_MAXHP*0.33),0,PLAYER_MAXHP); |
|
|
|
|
PLAYER_HP=std::clamp(PLAYER_HP+(int)((PLAYER_MAXHP*0.33)*(BATTLE_DROUGHT_ACTIVE?0.5:1)),0,PLAYER_MAXHP); |
|
|
|
|
CreateDisplayNumber((int)(-PLAYER_MAXHP*0.33),CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerX,CURRENT_ENCOUNTER.y+CURRENT_ENCOUNTER.playerY,frameCount); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
@ -1797,6 +1828,10 @@ public: |
|
|
|
|
if (ref->burnTrees&&TREES.size()>0&&ref->treeBurnChance>range(0,1)){ |
|
|
|
|
BATTLE_REASON_CODE=reasoncode::TREE_BURN; |
|
|
|
|
BATTLE_STATE=battle::WAIT_TURN_ANIMATION2; |
|
|
|
|
} else
|
|
|
|
|
if (ref==DROUGHT) { |
|
|
|
|
BATTLE_REASON_CODE=reasoncode::DROUGHT; |
|
|
|
|
BATTLE_STATE=battle::WAIT_TURN_ANIMATION2; |
|
|
|
|
} else { |
|
|
|
|
BATTLE_REASON_CODE=-1; |
|
|
|
|
BATTLE_STATE=battle::DAMAGE_RESOLUTION; |
|
|
|
@ -1814,12 +1849,15 @@ public: |
|
|
|
|
case reasoncode::TREE_BURN:{ |
|
|
|
|
applyPixelEffect(FIRESTORM_EFF,BATTLE_PLAYER_COORDS,0); |
|
|
|
|
}break; |
|
|
|
|
case reasoncode::DROUGHT:{ |
|
|
|
|
applyPixelEffect(DROUGHT_EFF,BATTLE_PLAYER_COORDS,0); |
|
|
|
|
}break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (EFFECT_TIMER==60) { |
|
|
|
|
switch (BATTLE_REASON_CODE) { |
|
|
|
|
case reasoncode::SEED_GROWTH:{ |
|
|
|
|
int healAmt=-10*SEEDS.size(); |
|
|
|
|
int healAmt=-10*SEEDS.size()*(BATTLE_DROUGHT_ACTIVE?0.5:1); |
|
|
|
|
CreateDisplayNumber(healAmt,BATTLE_PLAYER_COORDS.x,BATTLE_PLAYER_COORDS.y,frameCount); |
|
|
|
|
PLAYER_HP=std::clamp(PLAYER_HP+healAmt*-1,0,PLAYER_MAXHP); |
|
|
|
|
addTrees(SEEDS.size()); |
|
|
|
@ -2153,6 +2191,35 @@ public: |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}break; |
|
|
|
|
case cutscene::SPAWN_WORMS:{ |
|
|
|
|
if (CUTSCENE_TIMER<60) { |
|
|
|
|
if (frameCount%4==0) { |
|
|
|
|
PLAYER_COORDS[1]+=0.25; |
|
|
|
|
} else
|
|
|
|
|
if (frameCount%4==1) { |
|
|
|
|
PLAYER_COORDS[1]+=0.25; |
|
|
|
|
} else
|
|
|
|
|
if (frameCount%4==2) { |
|
|
|
|
PLAYER_COORDS[1]-=0.25; |
|
|
|
|
} else
|
|
|
|
|
if (frameCount%4==3) { |
|
|
|
|
PLAYER_COORDS[1]-=0.25; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if (!messageBoxVisible) { |
|
|
|
|
if (!CUTSCENE_FLAGS[0]) { |
|
|
|
|
CUTSCENE_FLAGS[0]=true; |
|
|
|
|
CUTSCENE_OBJS[1]=CreateObject({PLAYER_COORDS[0]-2,PLAYER_COORDS[1]-3},SANDWORM_DECAL,true); |
|
|
|
|
CUTSCENE_OBJS[2]=CreateObject({PLAYER_COORDS[0]-3,PLAYER_COORDS[1]+1},SANDWORM_DECAL,true); |
|
|
|
|
CUTSCENE_OBJS[3]=CreateObject({PLAYER_COORDS[0]+0,PLAYER_COORDS[1]-1},SANDWORM_DECAL,true); |
|
|
|
|
DisplayMessageBox(30); |
|
|
|
|
} else { |
|
|
|
|
EndCutscene(); |
|
|
|
|
ENCOUNTERS.push_back(ENCOUNTER_SANDWORM_1); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (GAME_STATE==CUTSCENE_3&&!SOUND_IS_PLAYING) { |
|
|
|
@ -2223,11 +2290,22 @@ public: |
|
|
|
|
}break; |
|
|
|
|
case COLLECTED_SILICON:{ |
|
|
|
|
if (!messageBoxVisible) { |
|
|
|
|
if (!GAME_FLAGS[gameflag::COLLECTED_SILICON_1]) { |
|
|
|
|
GAME_FLAGS[gameflag::COLLECTED_SILICON_1]=true; |
|
|
|
|
DisplayMessageBox(15); |
|
|
|
|
if (CURRENT_MAP==MAP_3) { |
|
|
|
|
if (!GAME_FLAGS[gameflag::COLLECTED_SILICON_2]) { |
|
|
|
|
GAME_FLAGS[gameflag::COLLECTED_SILICON_2]=true; |
|
|
|
|
DisplayMessageBox(29); |
|
|
|
|
} else { |
|
|
|
|
GAME_STATE=GAMEWORLD; |
|
|
|
|
StartCutscene(cutscene::SPAWN_WORMS); |
|
|
|
|
CUTSCENE_OBJS[0]=CreateObject({PLAYER_COORDS[0],PLAYER_COORDS[1]},PLAYER_DECAL,playerAnimDown,true); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
GAME_STATE=GAMEWORLD; |
|
|
|
|
if (!GAME_FLAGS[gameflag::COLLECTED_SILICON_1]) { |
|
|
|
|
GAME_FLAGS[gameflag::COLLECTED_SILICON_1]=true; |
|
|
|
|
DisplayMessageBox(15); |
|
|
|
|
} else { |
|
|
|
|
GAME_STATE=GAMEWORLD; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}break; |
|
|
|
@ -2410,6 +2488,10 @@ public: |
|
|
|
|
DrawWrappedText({5,5},"The trees cause rampaging fires!",WIDTH-8,DARK_RED,{2,2}); |
|
|
|
|
DrawWrappedText({4,4},"The trees cause rampaging fires!",WIDTH-8,WHITE,{2,2}); |
|
|
|
|
}break; |
|
|
|
|
case reasoncode::DROUGHT:{ |
|
|
|
|
DrawWrappedText({5,5},"A drought is active, causing healing to be reduced!",WIDTH-8,DARK_MAGENTA,{2,2}); |
|
|
|
|
DrawWrappedText({4,4},"A drought is active, causing healing to be reduced!",WIDTH-8,WHITE,{2,2}); |
|
|
|
|
}break; |
|
|
|
|
} |
|
|
|
|
}break; |
|
|
|
|
} |
|
|
|
@ -2859,9 +2941,8 @@ public: |
|
|
|
|
foodCount--; |
|
|
|
|
} else |
|
|
|
|
if (power->damage==-1001) { |
|
|
|
|
//Instead heal for their max health.
|
|
|
|
|
FOOD_REGEN_TURNS=4; |
|
|
|
|
finalDamage=-PLAYER_MAXHP*0.33; |
|
|
|
|
finalDamage=-PLAYER_MAXHP*0.33*(BATTLE_DROUGHT_ACTIVE?0.5:1); |
|
|
|
|
foodCount--; |
|
|
|
|
} |
|
|
|
|
PLAYER_HP=std::clamp(PLAYER_HP-finalDamage,0,PLAYER_MAXHP); |
|
|
|
@ -3075,7 +3156,7 @@ public: |
|
|
|
|
PLAYER_COORDS[1]=teleLoc.y+0.5; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Object*CreateObject(vf2d pos,Decal*spr,int ,bool temporary=false) { |
|
|
|
|
Object*CreateObject(vf2d pos,Decal*spr,bool temporary=false) { |
|
|
|
|
Object*newobj; |
|
|
|
|
OBJECTS.push_back(newobj=new Object(spr)); |
|
|
|
|
newobj->x=pos.x; |
|
|
|
|