#define OLC_PGE_APPLICATION #include "pixelGameEngine.h" #include "data.h" using namespace std; enum GAMESTATE{ CUTSCENE_1, CUTSCENE_2, CUTSCENE_3, GAMEWORLD, WAITING_FOR_CUTSCENE_3, }; enum TILES{ DIRT, GRASS, WATER, PLANTS }; enum CUTSCENE{ PAN_DOME, PAUSE_TO_CUTSCENE_3, CUTSCENE_4, }; #define WIDTH 256 #define HEIGHT 224 #define ALPHA_SCREEN1 128 #define ALPHA_SCREEN2 20 #define FADE_SPD 6 #define MOVE_SPD 0.2 #define MESSAGE_SCROLL_WAIT_SPD 2 //Number of frames to wait. class Object{ public: float x,y; olc::Decal*spr; }; class SeasonsOfLoneliness : public olc::PixelGameEngine { public: SeasonsOfLoneliness() { sAppName = "Seasons of Loneliness"; } public: GAMESTATE GAME_STATE=GAMEWORLD; int textInd=0; int cursorX=0; int transitionTime=0; bool fade=false; int transparency=0; int frameCount=0; float elapsedTime=0; const float TARGET_RATE = 1/60.0; std::string CUTSCENE_CONSOLE_TEXT = ""; int**MAP=NULL; int MAP_WIDTH=-1; int MAP_HEIGHT=-1; olc::Decal*TILES; float PLAYER_COORDS[2] = {}; std::vector OBJECTS; bool CUTSCENE_ACTIVE=false; CUTSCENE CURRENT_CUTSCENE=PAN_DOME; int CUTSCENE_TIMER=0; bool CUTSCENE_FLAGS[8]; bool messageBoxVisible; int messageBoxCursor; std::string messageBoxSpeaker; std::string messageBoxText; olc::Decal*DOME_DECAL; std::map BASE_OBJECTS; void LoadMap(char*mapName) { std::ifstream f(mapName); std::string data; MAP_WIDTH=MAP_HEIGHT=-1; if (MAP!=NULL) { for (int y=0;y>data; if (MAP_WIDTH==-1) { std::stringstream stream(data); stream>>MAP_WIDTH; } else if (MAP_HEIGHT==-1) { std::stringstream stream(data); stream>>MAP_HEIGHT; } else if (y>obj.x; std::stringstream split2(data.substr(data.find(';')+1,data.find(';',data.find(";")+1)-(data.find(';')+1))); split2>>obj.y; std::string split3 = data.substr(data.find(';',data.find(";")+1)+1,data.length()-(data.find(';',data.find(";")+1)+1)); obj.spr=BASE_OBJECTS[split3]; printf("Loaded object %s: (%f,%f)\n",split3.c_str(),obj.x,obj.y); OBJECTS.push_back(obj); } } } printf("Loaded %dx%d map:\n",MAP_WIDTH,MAP_HEIGHT); for (int y=0;y=STORY_TEXT1.length()) { fadeOut(); } }break; } return true; } bool OnUserUpdate(float fElapsedTime) override { elapsedTime+=fElapsedTime; while (elapsedTime>TARGET_RATE) { elapsedTime-=TARGET_RATE; updateGame(); } drawGame(); // called once per frame return true; } void fadeOutCompleted() { switch (GAME_STATE) { case CUTSCENE_1:{ GAME_STATE=CUTSCENE_2; PlayCutscene(PAN_DOME); fadeIn(); }break; case CUTSCENE_2:{ fadeIn(); PlayCutscene(CUTSCENE_4); GAME_STATE=GAMEWORLD; }break; } } void fadeInCompleted() { } void PlayCutscene(CUTSCENE scene) { switch (scene) { case PAN_DOME:{ PLAYER_COORDS[0]=14; PLAYER_COORDS[1]=18+(64/2/32); }break; case PAUSE_TO_CUTSCENE_3:{ CUTSCENE_CONSOLE_TEXT.clear(); textInd=0; }break; case CUTSCENE_4:{ LoadMap("assets/maps/map2"); PLAYER_COORDS[0]=16; PLAYER_COORDS[1]=6; }break; } for (int i=0;i<8;i++) { CUTSCENE_FLAGS[i]=false; } CUTSCENE_ACTIVE=true; CUTSCENE_TIMER=0; } void updateGame(){ frameCount++; if (CUTSCENE_ACTIVE) { CUTSCENE_TIMER++; } if (fade&&transparency<255) { transparency=clamp(transparency+FADE_SPD,0,255); if (transparency==255) { fadeOutCompleted(); } } else if (!fade&&transparency>0) { transparency=clamp(transparency-FADE_SPD,0,255); if (transparency==0) { fadeInCompleted(); } } if (GetKey(olc::F1).bPressed) { } if (!CUTSCENE_ACTIVE&&!messageBoxVisible) { if (GetKey(olc::D).bHeld||GetKey(olc::RIGHT).bHeld) { PLAYER_COORDS[0]=clamp(PLAYER_COORDS[0]+MOVE_SPD,0.0,(double)MAP_WIDTH); } if (GetKey(olc::A).bHeld||GetKey(olc::LEFT).bHeld) { PLAYER_COORDS[0]=clamp(PLAYER_COORDS[0]-MOVE_SPD,0.0,(double)MAP_WIDTH); } if (GetKey(olc::W).bHeld||GetKey(olc::UP).bHeld) { PLAYER_COORDS[1]=clamp(PLAYER_COORDS[1]-MOVE_SPD,0.0,(double)MAP_HEIGHT); } if (GetKey(olc::S).bHeld||GetKey(olc::DOWN).bHeld) { PLAYER_COORDS[1]=clamp(PLAYER_COORDS[1]+MOVE_SPD,0.0,(double)MAP_HEIGHT); } } switch (GAME_STATE) { case CUTSCENE_1: case CUTSCENE_3:{ std::string refText; switch (GAME_STATE) { case CUTSCENE_1:{ refText=STORY_TEXT1; }break; case CUTSCENE_3:{ refText=STORY_TEXT2; }break; } if (GAME_STATE==CUTSCENE_3&&frameCount%4!=0) {break;} if (textIndWIDTH-32) { int tempIndex=textInd; while (CUTSCENE_CONSOLE_TEXT[--tempIndex]!=' ') { CUTSCENE_CONSOLE_TEXT.erase(tempIndex); cursorX--; } CUTSCENE_CONSOLE_TEXT.erase(tempIndex++); CUTSCENE_CONSOLE_TEXT+='\n'; cursorX=0; while (tempIndex120) { fadeOut(); } } if (PLAYER_COORDS[0]>38+(128/2/32)) { PLAYER_COORDS[0]=38+(128/2/32); CUTSCENE_FLAGS[0]=true; CUTSCENE_TIMER=0; } }break; case WAITING_FOR_CUTSCENE_3:{ if (transparency>200) { GAME_STATE=CUTSCENE_3; } }break; } } void drawGame(){ switch (GAME_STATE) { case CUTSCENE_1:{ DrawStringDecal({16,16},CUTSCENE_CONSOLE_TEXT,olc::GREEN,{1,1}); if (textInd