diff --git a/SeasonsOfLoneliness.cpp b/SeasonsOfLoneliness.cpp index cb80b09..bb1d209 100644 --- a/SeasonsOfLoneliness.cpp +++ b/SeasonsOfLoneliness.cpp @@ -19,6 +19,7 @@ using namespace olc; #define SKIP_CHAPTER2 true #define SKIP_STORYBOOK true #define SKIP_CHAPTER3 true +#define SKIP_LAUNCHPAD true #define STARTING_MAP MAP_1 #define STARTING_STATE CUTSCENE_3 @@ -59,6 +60,7 @@ enum GAMESTATE{ DISPLAY_BOOK, DISPLAY_BOOK2, CUTSCENE_6, + IN_SPACE, }; namespace cutscene{ @@ -97,6 +99,7 @@ namespace cutscene{ LAUNCHPAD_OPEN, LAUNCHPAD_PREPARE, READY_TO_BOARD, + INTRUDERS_DETECTED, }; } @@ -142,6 +145,7 @@ namespace gameflag{ ROCKET_LAUNCH_READY, COLLECTED_ITEMS_IN_DOME, BOARDED_ROCKET, + INTRUDER_DETECTED, }; } @@ -630,8 +634,10 @@ public: Pixel FOREGROUND_EFFECT_COLOR; Pixel ORIGINAL_FOREGROUND_EFFECT_COLOR; int PIXEL_LIMIT=0; - vf2d PIXEL_POS; - vf2d PIXEL_SIZE; + vf2d PIXEL_POS={0,0}; + vf2d PIXEL_SIZE={WIDTH,HEIGHT}; + vf2d STAR_POS={0,0}; + vf2d STAR_SIZE={WIDTH,HEIGHT}; float PIXEL_EFFECT_TRANSPARENCY=0; int CUTSCENE_OBJ_COUNT=0; int TERMINAL_SELECTED_CHAR=0; @@ -648,6 +654,7 @@ public: int BATTLE_REASON_CODE=-1; bool BATTLE_DROUGHT_ACTIVE=false; bool ROCKET_BOARD_OPTION=false; + int LOCKED_IN_DELAY=0; Map*MAP_1=new Map("map1"); Map*MAP_2=new Map("map2"); @@ -674,6 +681,7 @@ public: Encounter ENCOUNTER_SANDWORM_1; Encounter ENCOUNTER_MEGAMOTH; Encounter ENCOUNTER_SNAKEPACK; + Encounter ENCOUNTER_Y_Y; Encounter CURRENT_ENCOUNTER; std::vectorMOVESET_SPIDEY; std::vectorMOVESET_SANDWORM; @@ -683,6 +691,7 @@ public: std::vectorMOVESET_XMINION; std::vectorMOVESET_MEGAMOTH; std::vectorMOVESET_SIDEWINDER; + std::vectorMOVESET_Y_Y; std::vectorSEEDS; std::vectorTREES; bool SOUND_IS_MUTED=false; @@ -704,6 +713,7 @@ public: #define MAX_PIXELS 500 effect::Pixel*pixels[MAX_PIXELS]; + effect::Pixel*starpixels[150]; bool OnUserCreate() override { @@ -717,27 +727,33 @@ public: EnableLayer(i,true); } - if (SKIP_INTRO||SKIP_CHAPTER1||SKIP_CHAPTER2||SKIP_CHAPTER3) { + if (SKIP_INTRO||SKIP_CHAPTER1||SKIP_CHAPTER2||SKIP_CHAPTER3||SKIP_LAUNCHPAD) { GAME_FLAGS[gameflag::TUTORIAL_WALKED_OFF_FARM]=true; GAME_FLAGS[gameflag::VISIT_BROKEN_ROVER]=true; GAME_STATE=GAMEWORLD; } - if (SKIP_CHAPTER1||SKIP_CHAPTER2||SKIP_CHAPTER3) { + if (SKIP_CHAPTER1||SKIP_CHAPTER2||SKIP_CHAPTER3||SKIP_LAUNCHPAD) { GAME_FLAGS[gameflag::COLLECTED_SILICON_1]=true; GAME_FLAGS[gameflag::REPAIRED_ROVER_1]=true; GAME_FLAGS[gameflag::REST_IN_DOME]=true; GAME_STATE=GAMEWORLD; } - if (SKIP_CHAPTER2||SKIP_CHAPTER3) { + if (SKIP_CHAPTER2||SKIP_CHAPTER3||SKIP_LAUNCHPAD) { //GAME_FLAGS[gameflag::CHECK_ROVER_3]=true; GAME_FLAGS[gameflag::COLLECTED_SILICON_3]=true; GAME_FLAGS[gameflag::CHECK_ROVER_2]=true; } - if (SKIP_CHAPTER3) { + if (SKIP_CHAPTER3||SKIP_LAUNCHPAD) { GAME_FLAGS[gameflag::CHECK_ROVER_4]=true; GAME_FLAGS[gameflag::LITTLESNAKES_KILLED]=true; GAME_FLAGS[gameflag::COLLECTED_SILICON_4]=true; } + if (SKIP_LAUNCHPAD) { + GAME_FLAGS[gameflag::CHECK_ROVER_5]=true; + GAME_FLAGS[gameflag::ROCKET_LAUNCH_READY]=true; + GAME_FLAGS[gameflag::COLLECTED_ITEMS_IN_DOME]=true; + GAME_FLAGS[gameflag::BOARDED_ROCKET]=true; + } if (SKIP_CHAPTER2||SKIP_BOSS) { GAME_FLAGS[gameflag::SLEEP]=true; GAME_FLAGS[gameflag::FIRST_ENCOUNTER_X_X]=true; @@ -759,9 +775,26 @@ public: GAME_FLAGS[gameflag::NEXT_COORDS2]=true; PLAYER_HP=PLAYER_MAXHP=100; PLAYER_COORDS[0]=38; - PLAYER_COORDS[1]=37; + PLAYER_COORDS[1]=38; } + if (SKIP_LAUNCHPAD) { + GAME_STATE=IN_SPACE; + PlayCutscene(cutscene::READY_TO_BOARD); + fadeOut(); + HAILSTORM->playerOwnCount=6; + PETAL_STORM->playerOwnCount=6; + HURRICANE->playerOwnCount=6; + METEOR_RAIN->playerOwnCount=6; + METEOR_STORM->playerOwnCount=6; + SNOWSTORM->playerOwnCount=6; + FLASH_FLOOD->playerOwnCount=6; + SUNNY_DAY->playerOwnCount=6; + FIRESTORM->playerOwnCount=6; + SOLAR_FLARE->playerOwnCount=6; + foodCount=16; + PLAYER_HP=PLAYER_MAXHP=130; + } SONG_MAIN = sound::Wave("./assets/SeasonsOfLoneliness.wav"); @@ -1011,6 +1044,14 @@ public: MOVESET_SIDEWINDER.push_back(MEGA_FANG); MOVESET_SIDEWINDER.push_back(MEGA_FANG); + MOVESET_Y_Y.push_back(METEOR_RAIN); + MOVESET_Y_Y.push_back(AVALANCHE); + MOVESET_Y_Y.push_back(LIGHT_STORM); + MOVESET_Y_Y.push_back(TORNADO); + MOVESET_Y_Y.push_back(GUST); + MOVESET_Y_Y.push_back(DROUGHT); + MOVESET_Y_Y.push_back(HAILSTORM); + COLLECTED_ITEMS.push_back({20,5}); COLLECTED_ITEMS.push_back({20,6}); COLLECTED_ITEMS.push_back({19,5}); @@ -1063,6 +1104,13 @@ public: ENCOUNTER_SNAKEPACK.playerY=6; ENCOUNTER_SNAKEPACK.map=MAP_5; ENCOUNTERS.push_back(ENCOUNTER_SNAKEPACK); + ENCOUNTER_Y_Y.entities.push_back(new Entity(Y_Y_DECAL,"Y.Y",4-1,3.5-2,895,895,MOVESET_Y_Y,{1,1},true)); + ENCOUNTER_Y_Y.x=1000-4; + ENCOUNTER_Y_Y.y=1000-3.5; + ENCOUNTER_Y_Y.playerX=4; + ENCOUNTER_Y_Y.playerY=6; + ENCOUNTER_Y_Y.map=MAP_6; + //ENCOUNTERS.push_back(ENCOUNTER_Y_Y); BASE_OBJECTS["DOME"]=new ObjectLoadInfo(DOME_DECAL); @@ -1099,7 +1147,13 @@ public: for (int i=0;ir=brightness; + starpixels[i]->g=brightness; + starpixels[i]->b=brightness; + starpixels[i]->pos={WIDTH/2,HEIGHT/2-24}; + starpixels[i]->spd={range(-4,4),range(-3,3)}; + float size = range(1,2); + starpixels[i]->size={size,size}; + starpixels[i]->a=255; + } + TIMER=0; + }break; } switch (CURRENT_CUTSCENE) { case cutscene::DISPLAY_VOLCANIC_AREA:{ @@ -1919,6 +1996,7 @@ public: BATTLE_CARD_SELECTION_IND=0; BATTLE_CARD_SELECTION=availablePowers[BATTLE_CARD_SELECTION_IND]; PLAYER_SELECTED_TARGET=-1; + LOCKED_IN_DELAY=0; } } } @@ -1943,15 +2021,19 @@ public: int TARGET_COORDS_Y=CURRENT_ENCOUNTER.y+HEIGHT/32/2; if (PLAYER_COORDS[0]==TARGET_COORDS_X&&PLAYER_COORDS[1]==TARGET_COORDS_Y &&BATTLE_PLAYER_COORDS.x==CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerX&&BATTLE_PLAYER_COORDS.y==CURRENT_ENCOUNTER.y+CURRENT_ENCOUNTER.playerY) { - if (!GAME_FLAGS[gameflag::FIRST_ENCOUNTER_X_X]&&GAME_FLAGS[gameflag::SLEEP]) { - GAME_FLAGS[gameflag::FIRST_ENCOUNTER_X_X]=true; - DisplayMessageBox(22); - break; + if (LOCKED_IN_DELAY>30) { + if (!GAME_FLAGS[gameflag::FIRST_ENCOUNTER_X_X]&&GAME_FLAGS[gameflag::SLEEP]) { + GAME_FLAGS[gameflag::FIRST_ENCOUNTER_X_X]=true; + DisplayMessageBox(22); + break; + } + //std::cout<<"Battle State is "<60*8) { PlayCutscene(cutscene::LAUNCHPAD_PREPARE); - CUTSCENE_OBJS[1]=CreateObject({30,35},LAUNCHPAD_DECAL); - CUTSCENE_OBJS[2]=CreateObject({30,35},LAUNCHPAD_HALF1_DECAL); - CUTSCENE_OBJS[3]=CreateObject({30,35},LAUNCHPAD_HALF2_DECAL); + CUTSCENE_OBJS[1]=CreateObject({30,35},LAUNCHPAD_DECAL,true); + CUTSCENE_OBJS[2]=CreateObject({30,35},LAUNCHPAD_HALF1_DECAL,true); + CUTSCENE_OBJS[3]=CreateObject({30,35},LAUNCHPAD_HALF2_DECAL,true); } } }break; @@ -2748,6 +2830,36 @@ public: } } }break; + case cutscene::INTRUDERS_DETECTED:{ + if (!messageBoxVisible) { + if (!CUTSCENE_FLAGS[0]) { + CUTSCENE_FLAGS[0]=true; + DisplayMessageBox(54); + } else + if (!CUTSCENE_FLAGS[1]) { + CUTSCENE_FLAGS[1]=true; + DisplayMessageBox(55); + } else + if (!CUTSCENE_FLAGS[2]) { + CUTSCENE_FLAGS[2]=true; + CUTSCENE_OBJS[0]=CreateObject({999.5,999.25},PLAYER_DECAL,playerAnim,true); + } else + if (MoveObjectTowardsPoint({999.5,1002},CUTSCENE_OBJS[0],VERT_FIRST)) { + if (!CUTSCENE_FLAGS[3]) { + DisplayMessageBox(56); + CUTSCENE_FLAGS[3]=true; + } else + if (!CUTSCENE_FLAGS[4]) { + DisplayMessageBox(57); + CUTSCENE_FLAGS[4]=true; + } else { + updatePlayerState(); + ENCOUNTERS.push_back(ENCOUNTER_Y_Y); + EndCutscene(); + } + } + } + }break; } if (GAME_STATE==CUTSCENE_3&&!SOUND_IS_PLAYING) { @@ -2848,6 +2960,38 @@ public: GAME_STATE=LATER_THAT_NIGHTFADEOUT; } }break; + case IN_SPACE:{ + for (int i=0;i<150;i++) { + starpixels[i]->pos+=starpixels[i]->spd; + bool hitEdge=false; + if (starpixels[i]->pos.xpos.x=STAR_POS.x+STAR_SIZE.x; + hitEdge=true; + } else + if (starpixels[i]->pos.x>STAR_POS.x+STAR_SIZE.x) { + starpixels[i]->pos.x=STAR_POS.x; + hitEdge=true; + } else + if (starpixels[i]->pos.ypos.y=STAR_POS.y+STAR_SIZE.y; + hitEdge=true; + } else + if (starpixels[i]->pos.y>STAR_POS.y+STAR_SIZE.y) { + starpixels[i]->pos.y=STAR_POS.y; + hitEdge=true; + } + if (hitEdge) { + starpixels[i]->pos={WIDTH/2,HEIGHT/2-24}; + } + } + if (TIMER>300) { + if (!GAME_FLAGS[gameflag::INTRUDER_DETECTED]) { + GAME_FLAGS[gameflag::INTRUDER_DETECTED]=true; + DisplayMessageBox(53); + PlayCutscene(cutscene::INTRUDERS_DETECTED); + } + } + }break; } if (PIXEL_EFFECT_TRANSPARENCY>0) { @@ -2973,6 +3117,7 @@ public: case CUTSCENE_2: case GAMEWORLD: case COLLECTED_SILICON:{ + DrawMap(); DrawGameWorld(); int meterYOffset=2; if (CURRENT_CUTSCENE==cutscene::NONE) { @@ -3030,6 +3175,21 @@ public: case DISPLAY_BOOK2:{ DrawDecal({WIDTH/2-BOOK2_DECAL->sprite->width*2/2,HEIGHT/2-BOOK2_DECAL->sprite->height*2/2},BOOK2_DECAL,{2,2}); }break; + case IN_SPACE:{ + Clear(BLACK); + DrawStars(); + if (!IN_BATTLE_ENCOUNTER) { + DrawDecal({WIDTH/2-32,HEIGHT/2-32},Y_Y_DECAL); + } + DrawGameWorld(); + SetDrawTarget(2); + if (IN_BATTLE_ENCOUNTER) { + DrawPartialDecal({(float)((BATTLE_PLAYER_COORDS.x-PLAYER_COORDS[0])*32+WIDTH/2-16+(current_playerAnim->flipped?32:0)),(float)((BATTLE_PLAYER_COORDS.y-PLAYER_COORDS[1])*32+HEIGHT/2-16)},current_playerAnim->spr,current_playerAnim->getCurrentFrame(),{32,32},{(float)(current_playerAnim->flipped?-1:1),1}); + } + if (IN_BATTLE_ENCOUNTER&&BATTLE_ENTRY_TIMER<45) { + DrawStringDecal({(float)((BATTLE_PLAYER_COORDS.x-PLAYER_COORDS[0])*32+WIDTH/2-16+(current_playerAnim->flipped?32:0)),(float)((BATTLE_PLAYER_COORDS.y-PLAYER_COORDS[1])*32+HEIGHT/2-16-sin(frameCount*12/60.0)*4-12)},"!!",RED); + } + }break; } switch (BATTLE_STATE) { case battle::PLAYER_SELECTION:{ @@ -3147,7 +3307,7 @@ public: //FillRectDecal({WIDTH/2-2,HEIGHT/2-2},{4,4},WHITE); } - void DrawGameWorld() { + void DrawMap() { for (int y=-1;y<=HEIGHT/32+1;y++) { for (int x=-1;x<=WIDTH/32+1;x++) { float xOffset=PLAYER_COORDS[0]-(WIDTH/32/2); @@ -3166,6 +3326,9 @@ public: } } } + } + + void DrawGameWorld() { for (auto&obj:OBJECTS) { if (obj->spr!=NULL) { if (obj->name.compare("PLANT")==0) { @@ -3493,7 +3656,7 @@ public: } bool playerCanMove() { - return PLAYER_HP>0&&GAME_STATE==GAMEWORLD&&CURRENT_CUTSCENE==cutscene::NONE&&!messageBoxVisible&&!IN_BATTLE_ENCOUNTER; + return PLAYER_HP>0&&(GAME_STATE==GAMEWORLD||GAME_STATE==IN_SPACE)&&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) { @@ -4027,6 +4190,13 @@ public: } } } + + void DrawStars(){ + for (int i=0;i<150;i++) { + float distanceFromCenter=distancetoCoords(starpixels[i]->pos,{WIDTH/2,HEIGHT/2-24}); + FillRectDecal(starpixels[i]->pos,starpixels[i]->size,{(uint8_t)(starpixels[i]->r),(uint8_t)(starpixels[i]->g),(uint8_t)(starpixels[i]->b),(uint8_t)(std::clamp(distanceFromCenter/64.0*255,0.0,255.0))}); + } + } }; diff --git a/Seasons_of_Loneliness b/Seasons_of_Loneliness index 819627c..5715495 100755 Binary files a/Seasons_of_Loneliness and b/Seasons_of_Loneliness differ diff --git a/data.h b/data.h index 2fe198d..91c0fb0 100644 --- a/data.h +++ b/data.h @@ -221,6 +221,21 @@ I can finally get off this planet, once and for all.)",//51 R"( $PLAYER I should probably stock up on food and supplies before leaving. Once I board, I won't be able to return.)",//52 +R"( +Y.Y +ATTENTION! INTRUDERS DETECTED ON BOARD THE SHIP!)",//53 +R"( +$PLAYER +Intruders...? There's not a soul in sigh-)",//54 +R"( +Y.Y +BEGINNING IMMEDIATE DETAINING PROCEDURES.)",//55 +R"( +$PLAYER +Wait- I'M THE INTRUDER?!)",//56 +R"( +Y.Y +PREPARE TO BE ELIMINATED.)",//57 };