diff --git a/SeasonsOfLoneliness.cpp b/SeasonsOfLoneliness.cpp index ef6aae3..53e7b55 100644 --- a/SeasonsOfLoneliness.cpp +++ b/SeasonsOfLoneliness.cpp @@ -51,6 +51,10 @@ namespace cutscene{ NODE_COLLECT_CUTSCENE, PAN_OVER_TO_CROPS, RAINING_IN_DOME, + AFTER_RAIN, + WALK_TO_COMPUTER, + INPUT_USERNAME, + GO_OUTSIDE, }; } @@ -68,6 +72,13 @@ namespace battle{ }; } +namespace gameflag{ + enum FLAG{ + TUTORIAL_WALKED_OFF_FARM, + }; +} + +#define MAX_TERMINAL_NAME_LENGTH 6 #define WIDTH 256 #define HEIGHT 224 #define ALPHA_SCREEN1 128 @@ -141,9 +152,9 @@ class Object{ Animation*anim; vi2d spos; vi2d size; - bool flipped; + bool flipped=false; bool hascut=false; - bool tempObj; + bool tempObj=false; Object(){}; Object(Decal*spr) { this->spr=spr; @@ -297,6 +308,7 @@ public: const float TARGET_RATE = 1/60.0; std::string MAP_NAME = ""; std::string CUTSCENE_CONSOLE_TEXT = ""; + bool GAME_FLAGS[128]={}; int**MAP=NULL; int MAP_WIDTH=-1; int MAP_HEIGHT=-1; @@ -308,6 +320,7 @@ public: int CUTSCENE_TIMER=0; bool CUTSCENE_FLAGS[8]; Object*CUTSCENE_OBJS[8]; + int CUTSCENE_OBJ_INDICES[8]; bool messageBoxVisible=false; int messageBoxCursor; std::string messageBoxSpeaker; @@ -319,7 +332,7 @@ public: int foodCount=3; bool oxygenMeterVisible=false; int oxygenQualityLevel=34; - int plantState=0b10010110101000101010100110101010; + int plantState=0b01001010010100010101010010010101; SplashScreen splash; Animation current_playerAnim; Animation playerAnim; @@ -393,13 +406,17 @@ public: vf2d PIXEL_SIZE; std::vectorMOVESET_SPIDEY; float PIXEL_EFFECT_TRANSPARENCY=0.5; + int CUTSCENE_OBJ_COUNT=0; + int TERMINAL_SELECTED_CHAR=0; + std::string TERMINAL_INPUT=""; + std::string PLAYER_NAME="..."; Decal*DOME_DECAL,*FOOD_METER_DECAL,*OXYGEN_METER_DECAL,*PLANT_DECAL, *PLAYER_DECAL, *WEATHERNODE_EFFECT_DECAL,*POWER_HAILSTORM_DECAL,*POWER_HURRICANE_DECAL,*POWER_METEOR_SHOWER_DECAL,*POWER_METEOR_STORM_DECAL,*POWER_SNOWSTORM_DECAL, *SPIDEY_DECAL,*TARGETING_CIRCLE,*TARGETING_RANGE_CIRCLE,*HEALTHBAR_DECAL, - *CONSUME_SNACK_DECAL,*CONSUME_MEAL_DECAL; + *CONSUME_SNACK_DECAL,*CONSUME_MEAL_DECAL,*COMPUTER_DECAL; std::map BASE_OBJECTS; std::vector ENCOUNTERS; Encounter ENCOUNTER_SPIDEY_1; @@ -440,6 +457,7 @@ public: TARGETING_CIRCLE=new Decal(new Sprite("assets/targetCircle.png")); TARGETING_RANGE_CIRCLE=new Decal(new Sprite("assets/targetRange.png")); HEALTHBAR_DECAL=new Decal(new Sprite("assets/healthbar.png")); + COMPUTER_DECAL=new Decal(new Sprite("assets/computerSystem.png")); current_playerAnim.spr=PLAYER_DECAL; playerAnim.spr=PLAYER_DECAL; @@ -540,6 +558,7 @@ public: BASE_OBJECTS["METEORSHOWER_NODE"]=new ObjectLoadInfo(POWER_METEOR_SHOWER_DECAL,&POWER_METEOR_SHOWER_ANIMATION); BASE_OBJECTS["METEORSTORM_NODE"]=new ObjectLoadInfo(POWER_METEOR_STORM_DECAL,&POWER_METEOR_STORM_ANIMATION); BASE_OBJECTS["SNOWSTORM_NODE"]=new ObjectLoadInfo(POWER_SNOWSTORM_DECAL,&POWER_SNOWSTORM_ANIMATION); + BASE_OBJECTS["COMPUTER"]=new ObjectLoadInfo(COMPUTER_DECAL); for (int i=0;i0) { + TERMINAL_INPUT.erase(TERMINAL_INPUT.length()-1); + } else + if (TERMINAL_SELECTED_CHAR==27&&TERMINAL_INPUT.length()>0) { + PLAYER_NAME=TERMINAL_INPUT; + PlayCutscene(cutscene::GO_OUTSIDE); + } + }break; } } @@ -698,6 +733,38 @@ public: } }break; } + } else { + switch (CURRENT_CUTSCENE) { + case cutscene::INPUT_USERNAME:{ + if (GetKey(W).bPressed||GetKey(UP).bPressed||GetKey(NP8).bPressed) { + TERMINAL_SELECTED_CHAR=TERMINAL_SELECTED_CHAR-7; + if (TERMINAL_SELECTED_CHAR<0) { + TERMINAL_SELECTED_CHAR+=28; + } + } + if (GetKey(D).bPressed||GetKey(RIGHT).bPressed||GetKey(NP6).bPressed) { + if ((TERMINAL_SELECTED_CHAR+1)%7==0) { + TERMINAL_SELECTED_CHAR-=6; + } else { + TERMINAL_SELECTED_CHAR++; + } + } + if (GetKey(A).bPressed||GetKey(LEFT).bPressed||GetKey(NP4).bPressed) { + if ((TERMINAL_SELECTED_CHAR-1)%7==6||TERMINAL_SELECTED_CHAR-1<0) { + TERMINAL_SELECTED_CHAR+=6; + } else { + TERMINAL_SELECTED_CHAR--; + } + } + if (GetKey(S).bPressed||GetKey(DOWN).bPressed||GetKey(NP5).bPressed||GetKey(NP2).bPressed) { + if (TERMINAL_SELECTED_CHAR+7>=28) { + TERMINAL_SELECTED_CHAR=(TERMINAL_SELECTED_CHAR+7)%28; + } else { + TERMINAL_SELECTED_CHAR+=7; + } + } + }break; + } } SetDrawTarget(nullptr); Clear(BLANK); @@ -759,6 +826,7 @@ public: }break; case cutscene::RAINING_IN_DOME:{ applyPixelEffect(HURRICANE,GetMapFileCoords(7,11)); + CUTSCENE_TIMER=0; }break; } for (int i=0;i<8;i++) { @@ -801,43 +869,59 @@ public: } if (playerCanMove()) { - bool changed=false; + bool animationchanged=false; + bool positionModified=false; if (GetKey(D).bHeld||GetKey(RIGHT).bHeld||GetKey(NP6).bHeld) { - PLAYER_COORDS[0]=std::clamp(PLAYER_COORDS[0]+MOVE_SPD,0.1,(double)MAP_WIDTH); + if (MAP[(int)PLAYER_COORDS[1]][(int)std::clamp(PLAYER_COORDS[0]+MOVE_SPD,0.1,(double)MAP_WIDTH)]!=4) { + PLAYER_COORDS[0]=std::clamp(PLAYER_COORDS[0]+MOVE_SPD,0.1,(double)MAP_WIDTH); + positionModified=true; + } //ConsoleClear(); //cout<<"("<=60*6) { + PIXEL_EFFECT_TRANSPARENCY=(60-(CUTSCENE_TIMER-60*6))/60; + } + if (CUTSCENE_TIMER>=60*7) { + PlayCutscene(cutscene::AFTER_RAIN); + } + }break; + case cutscene::AFTER_RAIN:{ + if (!messageBoxVisible) { + if (!CUTSCENE_FLAGS[0]) { + DisplayMessageBox(2); + CUTSCENE_FLAGS[0]=true; + } else + if (!CUTSCENE_FLAGS[1]) { + DisplayMessageBox(3); + CUTSCENE_FLAGS[1]=true; + foodMeterVisible=true; + } else { + PLAYER_COORDS[0]=13; + PLAYER_COORDS[1]=4; + changeAnimation(playerAnimLeft); + EndCutscene(); + } + } + }break; + case cutscene::WALK_TO_COMPUTER:{ + if (!messageBoxVisible) { + if (!CUTSCENE_FLAGS[0]) { + DisplayMessageBox(11); + CUTSCENE_FLAGS[0]=true; + } else + if (!CUTSCENE_FLAGS[1]) { + DisplayMessageBox(4); + CUTSCENE_FLAGS[1]=true; + } else { + vi2d targetPos = GetMapFileCoords(19,4); + if (CUTSCENE_OBJS[0]->x<19) { + CUTSCENE_OBJS[0]->x+=MOVE_SPD; + if (CUTSCENE_OBJS[0]->x>19) { + CUTSCENE_OBJS[0]->x=19; + } + } + if (CUTSCENE_OBJS[0]->y<4) { + CUTSCENE_OBJS[0]->y+=MOVE_SPD; + if (CUTSCENE_OBJS[0]->y>4) { + CUTSCENE_OBJS[0]->y=4; + } + } + if (CUTSCENE_OBJS[0]->y>4) { + CUTSCENE_OBJS[0]->y-=MOVE_SPD; + if (CUTSCENE_OBJS[0]->y<4) { + CUTSCENE_OBJS[0]->y=4; + } + } + if (MoveCameraTowardsPoint({19,4})) { + if (!CUTSCENE_FLAGS[2]) { + DisplayMessageBox(5); + CUTSCENE_FLAGS[2]=true; + } else { + PlayCutscene(cutscene::INPUT_USERNAME); + } + } + } + } + }break; + case cutscene::GO_OUTSIDE:{ + if (!messageBoxVisible) { + if (!CUTSCENE_FLAGS[0]) { + CUTSCENE_FLAGS[0]=true; + DisplayMessageBox(12); + } else + if (!CUTSCENE_FLAGS[1]) { + CUTSCENE_FLAGS[1]=true; + DisplayMessageBox(6); + } else { + PLAYER_COORDS[0]=19; + PLAYER_COORDS[1]=4; + EndCutscene(); + } + } + }break; } switch (GAME_STATE) { @@ -1221,6 +1390,15 @@ public: } } + //Triggers when the player has successfully moved. + void playerMoved(){ + if (!GAME_FLAGS[gameflag::TUTORIAL_WALKED_OFF_FARM]&&foodCount>3&&PLAYER_COORDS[0]>12) { + GAME_FLAGS[gameflag::TUTORIAL_WALKED_OFF_FARM]=true; + PlayCutscene(cutscene::WALK_TO_COMPUTER); + CUTSCENE_OBJS[0]=CreateObject({PLAYER_COORDS[0],PLAYER_COORDS[1]},PLAYER_DECAL,{32,0},{32,32},true); + } + } + void drawGame(){ switch (GAME_STATE) { case CUTSCENE_1:{ @@ -1241,14 +1419,14 @@ public: int meterYOffset=2; if (CURRENT_CUTSCENE==cutscene::NONE) { if (foodMeterVisible) { - DrawStringDecal({WIDTH-36*0.4-GetTextSize(std::to_string(foodCount)).x*1-8,meterYOffset+2},std::to_string(foodCount),BLUE,{1,1}); - DrawStringDecal({WIDTH-36*0.4-GetTextSize(std::to_string(foodCount)).x*1-7,meterYOffset+2},std::to_string(foodCount),BLACK,{1,1}); + DrawStringDecal({WIDTH-36*0.4-GetTextSize(std::to_string(foodCount)).x*1-8,meterYOffset+1},std::to_string(foodCount),BLACK,{1,1}); + DrawStringDecal({WIDTH-36*0.4-GetTextSize(std::to_string(foodCount)).x*1-7,meterYOffset+2},std::to_string(foodCount),WHITE,{1,1}); DrawDecal({WIDTH-52*0.4,meterYOffset},FOOD_METER_DECAL,{0.4,0.4}); meterYOffset+=(2+48*0.4); } if (oxygenMeterVisible) { - DrawStringDecal({WIDTH-36*0.4-GetTextSize(std::to_string(oxygenQualityLevel)+"%").x*1-8,meterYOffset+2},std::to_string(oxygenQualityLevel)+"%",BLUE,{1,1}); - DrawStringDecal({WIDTH-36*0.4-GetTextSize(std::to_string(oxygenQualityLevel)+"%").x*1-7,meterYOffset+2},std::to_string(oxygenQualityLevel)+"%",BLACK,{1,1}); + DrawStringDecal({WIDTH-36*0.4-GetTextSize(std::to_string(oxygenQualityLevel)+"%").x*1-8,meterYOffset+1},std::to_string(oxygenQualityLevel)+"%",BLACK,{1,1}); + DrawStringDecal({WIDTH-36*0.4-GetTextSize(std::to_string(oxygenQualityLevel)+"%").x*1-7,meterYOffset+2},std::to_string(oxygenQualityLevel)+"%",WHITE,{1,1}); DrawDecal({WIDTH-52*0.4,meterYOffset},OXYGEN_METER_DECAL,{0.4,0.4}); meterYOffset+=(2+48*0.4); } @@ -1337,6 +1515,10 @@ public: FillRectDecal({0,0},{WIDTH,HEIGHT},Pixel(0,0,0,128)); DrawCard(CUTSCENE_DISPLAYED_CARD); }break; + case cutscene::INPUT_USERNAME:{ + FillRectDecal({0,0},{WIDTH,HEIGHT},Pixel(0,0,0,128)); + DrawTerminal(); + }break; } FillRectDecal({0,0},{WIDTH,HEIGHT},Pixel(0,0,0,transparency)); //FillRectDecal({WIDTH/2-2,HEIGHT/2-2},{4,4},WHITE); @@ -1411,14 +1593,46 @@ public: DrawDecal(pos,HEALTHBAR_DECAL,{width/32,1},col); } + void DrawTerminal() { + const int TERMINAL_WIDTH=7; + for (int i=0;i<26;i++) { + std::string s(1,(char)('A'+i)); + DrawStringDecal({(32*(i%TERMINAL_WIDTH))+16,16*(i/TERMINAL_WIDTH)+HEIGHT/2},s); + } + std::string backspace(1,(char)('<')); + DrawStringDecal({(32*(26%TERMINAL_WIDTH))+16,16*(26/TERMINAL_WIDTH)+HEIGHT/2},backspace); + DrawStringDecal({(32*(27%TERMINAL_WIDTH))+16,16*(27/TERMINAL_WIDTH)+HEIGHT/2},"ENTER"); + DrawStringDecal({(32*((TERMINAL_SELECTED_CHAR)%TERMINAL_WIDTH))+8,16*(TERMINAL_SELECTED_CHAR/TERMINAL_WIDTH)+HEIGHT/2},">"); + std::string terminal_name=TERMINAL_INPUT; + for (int i=0;i>getPlantId(x+8,y+2)*2&0b11; + } + + //This uses MAP COORDS for determining bit location. The plants are offset by (X+8,Y+2)!! Use getPlantStatusWithAbsoluteCoords() to translate to map coords. int getPlantStatus(int x,int y) { return plantState>>getPlantId(x,y)*2&0b11; } + void setPlantStatusWithAbsoluteCoords(int x,int y,char state) { + setPlantStatus(x+8,y+2,state); + } + + //This uses MAP COORDS for determining bit location. The plants are offset by (X+8,Y+2)!! Use setPlantStatusWithAbsoluteCoords() to translate to map coords. void setPlantStatus(int x,int y,char state) { int mask=0b11111111111111111111111111111111; mask-=3<tempObj) { + OBJECTS.erase(OBJECTS.begin()+j); + std::cout<<"Erased at position "<x=pos.x; @@ -1877,6 +2103,7 @@ public: } } } + //Returns true if the camera reached the target position. bool MoveCameraTowardsPoint(vf2d pos,float spd=BATTLE_CAMERA_SCROLL_SPD) { bool reachedPosition=true; if (PLAYER_COORDS[0]!=pos.x) { diff --git a/Seasons_of_Loneliness b/Seasons_of_Loneliness index ecde574..968bfda 100755 Binary files a/Seasons_of_Loneliness and b/Seasons_of_Loneliness differ diff --git a/assets/computerSystem.png b/assets/computerSystem.png new file mode 100644 index 0000000..b209dee Binary files /dev/null and b/assets/computerSystem.png differ diff --git a/assets/maps/map2 b/assets/maps/map2 index 3715f12..d05e49a 100644 --- a/assets/maps/map2 +++ b/assets/maps/map2 @@ -1,12 +1,16 @@ 29 -10 +14 +00000000000000000000000000000 +00000004444444444444440000000 +00000004111133333333340000000 +00000004111133333333340000000 +00000004111133333333340000000 +00000004111133333333340000000 +00000004333333333333340000000 +00000004444444444444440000000 +00000000000000000000000000000 00000000000000000000000000000 00000000000000000000000000000 -00000000111133333333300000000 -00000000111133333333300000000 -00000000111133333333300000000 -00000000111133333333300000000 -00000000333333333333300000000 00000000000000000000000000000 00000000000000000000000000000 00000000000000000000000000000 @@ -27,4 +31,5 @@ 10;5;PLANT 11;5;PLANT 15;6;EXIT -16;6;EXIT \ No newline at end of file +16;6;EXIT +20;4;COMPUTER \ No newline at end of file diff --git a/data.h b/data.h index 1b73839..f3b1b8d 100644 --- a/data.h +++ b/data.h @@ -24,19 +24,19 @@ $PLAYER Oh thank goodness, and just in time too!)", //1 R"( CompU-16770 -RAIN CYCLE ENDING. NEXT RAIN CYCLE DUE IN 17 TERRESTIAL CYCLES.)", //2 +RAIN CYCLE ENDING. NEXT RAIN CYCLE DUE IN 17 TERRA REVOLUTIONS.)", //2 R"( $PLAYER -I wonder how the air is today..)", //3 -R"( -CompU-16770 -RAIN CYCLE ENDING. NEXT RAIN CYCLE DUE IN 17 TERRESTIAL CYCLES.)",//4 +Time to collect these crops!)", //3 R"( $PLAYER -Hmm, an actual good day!)",//5 +Looks like a good time to go out too! Oxygen levels are at a good reading. Just going to do a quick system log...)",//4 +R"( +CompU-16770 + )",//5 R"( $PLAYER -The winds must have kicked in early. Better go out and work on R.O.V.E.R..)",//6 +The winds must have kicked in early this morning. Better go outside and work on R.O.V.E.R..)",//6 R"( $PLAYER I almost have the receiving unit repaired, I just need another good vein of silicon and we can finish this.)",//7 @@ -49,12 +49,19 @@ So those dust columns only form around large hole deposits. This is usually wher R"( $PLAYER We'll head there.)",//10 +R"( +$PLAYER +What a great harvest!)",//11 +R"( +CompU-16770 +Authenticated. Record successfully logged.)",//12 }; -olc::Pixel TILE_COLORS[4]={ - olc::Pixel(112, 88, 64), //DIRT - olc::Pixel(60, 97, 49), //GRASS - olc::Pixel(30, 84, 87), //WATER - olc::Pixel(180, 191, 209), //MARBLE +olc::Pixel TILE_COLORS[]={ + olc::Pixel(112, 88, 64), //0 DIRT + olc::Pixel(60, 97, 49), //1 GRASS + olc::Pixel(30, 84, 87), //2 WATER + olc::Pixel(180, 191, 209), //3 MARBLE + olc::Pixel(112, 88, 64), //4 WALL (DIRT) }; \ No newline at end of file