diff --git a/SeasonsOfLoneliness.cpp b/SeasonsOfLoneliness.cpp index a617fd5..3e78562 100644 --- a/SeasonsOfLoneliness.cpp +++ b/SeasonsOfLoneliness.cpp @@ -12,15 +12,15 @@ using namespace olc; //#define TEST_MAP1 //Toggle to just play around on map 1. //#define TEST_MAP2 //Toggle on to just play around on map 2. -#define SKIP_INTRO true -#define SKIP_CHAPTER1 true -#define SKIP_BOSS true -#define SKIP_SILICON2 true -#define SKIP_CHAPTER2 true -#define SKIP_STORYBOOK true -#define SKIP_CHAPTER3 true -#define SKIP_LAUNCHPAD true -#define SKIP_A_A true +#define SKIP_INTRO false +#define SKIP_CHAPTER1 false +#define SKIP_BOSS false +#define SKIP_SILICON2 false +#define SKIP_CHAPTER2 false +#define SKIP_STORYBOOK false +#define SKIP_CHAPTER3 false +#define SKIP_LAUNCHPAD false +#define SKIP_A_A false #define STARTING_MAP MAP_1 #define STARTING_STATE CUTSCENE_3 @@ -387,6 +387,7 @@ class Entity{ bool ally=false; int hp; int startingHP; + Decal*startingspr; int maxhp; Decal*spr; float x; @@ -405,7 +406,7 @@ class Entity{ bool hidden=false; //If hidden, this enemy will take 0 damage. int shield=0; //If shield is greater than 0, the shield must be depleted first before health can be dealt. Entity(Decal*spr,std::string name,float x,float y,int hp,int maxhp,std::vectormoveset,vf2d sprScale={1,1},bool fixedMoveset=false) { - this->spr=spr; + this->spr=this->startingspr=spr; this->name=name; this->x=x; this->y=y; @@ -672,6 +673,7 @@ public: Pixel SHIP_COLOR=WHITE; vf2d BOSS_SIZE={1,1}; vf2d CREDITS_SCROLLING_OFFSET={0,12}; + bool HIDE_CARDS=false; Map*MAP_1=new Map("map1"); Map*MAP_2=new Map("map2"); @@ -722,11 +724,13 @@ public: PlayerState*PREV_PLAYERSTATE=new PlayerState(); int WALK_STEPS=0; int PETRIFY_TURNS=0; + int LAST_FRAME_SOUND_PLAYED=0; Map*CURRENT_MAP=MAP_1; - sound::Wave SONG_MAIN; + sound::Wave SONG_MAIN,SONG_BATTLE,SONG_FINALBATTLE,SONG_EXPLORE,SONG_DOME; + sound::Wave SOUND_MSG,SOUND_CHANGE_OPTION,SOUND_ROBOTICNOISE,SOUND_SELECT,SOUND_SAW,SOUND_SONAR,SOUND_WARNING,SOUND_EXPLODE,SOUND_LASERSHOOT,SOUND_WEATHERHEAVY,SOUND_WEATHERLIGHT; std::queue turnOrder; @@ -734,6 +738,8 @@ public: effect::Pixel*pixels[MAX_PIXELS]; effect::Pixel*starpixels[150]; + sound::PlayingWave CURRENT_BGM; + bool OnUserCreate() override { SetPixelMode(Pixel::ALPHA); @@ -798,6 +804,21 @@ public: } SONG_MAIN = sound::Wave("./assets/SeasonsOfLoneliness.wav"); + SONG_BATTLE = sound::Wave("./assets/battle.wav"); + SONG_FINALBATTLE = sound::Wave("./assets/finalBattle.wav"); + SONG_EXPLORE = sound::Wave("./assets/explore.wav"); + SONG_DOME = sound::Wave("./assets/dome.wav"); + SOUND_MSG = sound::Wave("./assets/msg.wav"); + SOUND_CHANGE_OPTION = sound::Wave("./assets/card_flip.wav"); + SOUND_ROBOTICNOISE = sound::Wave("./assets/roboticNoise.wav"); + SOUND_SELECT = sound::Wave("./assets/select.wav"); + SOUND_SAW = sound::Wave("./assets/saw.wav"); + SOUND_SONAR = sound::Wave("./assets/sonar.wav"); + SOUND_WARNING = sound::Wave("./assets/warning.wav"); + SOUND_EXPLODE = sound::Wave("./assets/explode.wav"); + SOUND_LASERSHOOT = sound::Wave("./assets/laserShoot.wav"); + SOUND_WEATHERHEAVY = sound::Wave("./assets/weatherHeavy.wav"); + SOUND_WEATHERLIGHT = sound::Wave("./assets/weatherLight.wav"); //ConsoleShow(F1,false); // Called once at the start, so create things here @@ -1201,6 +1222,9 @@ public: ZONES.push_back(SILICON_DEPOSIT_ZONE); + ResetTerminal(STORY_TEXT2); + + for (int i=0;i0) { TERMINAL_INPUT.erase(TERMINAL_INPUT.length()-1); + PlaySound(&SOUND_SELECT,false,0.3); } else if (TERMINAL_SELECTED_CHAR==27&&TERMINAL_INPUT.length()>0) { PLAYER_NAME=TERMINAL_INPUT; PlayCutscene(cutscene::GO_OUTSIDE); + PlaySound(&SOUND_SELECT); } }break; case cutscene::READY_TO_BOARD:{ @@ -1445,9 +1474,11 @@ public: if (MAIN_MENU_SELECTION<0) { MAIN_MENU_SELECTION=3; } + PlaySound(&SOUND_CHANGE_OPTION); } if (GetKey(D).bPressed||GetKey(RIGHT).bPressed||GetKey(NP6).bPressed||GetKey(S).bPressed||GetKey(DOWN).bPressed||GetKey(NP5).bPressed||GetKey(NP2).bPressed) { MAIN_MENU_SELECTION=(MAIN_MENU_SELECTION+1)%4; + PlaySound(&SOUND_CHANGE_OPTION); } } switch (CURRENT_CUTSCENE) { @@ -1457,6 +1488,7 @@ public: if (TERMINAL_SELECTED_CHAR<0) { TERMINAL_SELECTED_CHAR+=28; } + PlaySound(&SOUND_MSG); } if (GetKey(D).bPressed||GetKey(RIGHT).bPressed||GetKey(NP6).bPressed) { if ((TERMINAL_SELECTED_CHAR+1)%7==0) { @@ -1464,6 +1496,7 @@ public: } else { TERMINAL_SELECTED_CHAR++; } + PlaySound(&SOUND_MSG); } if (GetKey(A).bPressed||GetKey(LEFT).bPressed||GetKey(NP4).bPressed) { if ((TERMINAL_SELECTED_CHAR-1)%7==6||TERMINAL_SELECTED_CHAR-1<0) { @@ -1471,6 +1504,7 @@ public: } else { TERMINAL_SELECTED_CHAR--; } + PlaySound(&SOUND_MSG); } if (GetKey(S).bPressed||GetKey(DOWN).bPressed||GetKey(NP5).bPressed||GetKey(NP2).bPressed) { if (TERMINAL_SELECTED_CHAR+7>=28) { @@ -1478,6 +1512,7 @@ public: } else { TERMINAL_SELECTED_CHAR+=7; } + PlaySound(&SOUND_MSG); } }break; case cutscene::READY_TO_BOARD:{ @@ -1512,6 +1547,7 @@ public: case CUTSCENE_3:{ GAME_STATE=CUTSCENE_1; fadeIn(); + stopMusic(); ResetTerminal(STORY_TEXT1); }break; case CUTSCENE_4:{ @@ -1605,6 +1641,7 @@ public: GAME_FLAGS[gameflag::VISIT_BROKEN_ROVER]=true; PlayCutscene(cutscene::WALK_TO_ROVER); } + playMusic(&SONG_EXPLORE); }break; case cutscene::TRANSITION_CUTSCENE_2:{ if (GAME_FLAGS[gameflag::ROCKET_LAUNCH_READY]&&!GAME_FLAGS[gameflag::COLLECTED_ITEMS_IN_DOME]) { @@ -1650,6 +1687,7 @@ public: GAME_FLAGS[gameflag::CHECK_ROVER]=true; DisplayMessageBox(26); } + playMusic(&SONG_DOME); }break; case cutscene::DISPLAY_VOLCANIC_AREA:{ TeleportToMapFileCoords(13,122); @@ -1703,6 +1741,7 @@ public: }break; case cutscene::READY_TO_BOARD:{ GAME_STATE=IN_SPACE; + TIMER=0; fadeIn(); EndCutscene(); }break; @@ -1774,6 +1813,7 @@ public: }break; case cutscene::CUTSCENE_4:{ LoadMap(MAP_2); + playMusic(&SONG_DOME); PLAYER_COORDS[0]=16; PLAYER_COORDS[1]=6; updatePlayerState(); @@ -1818,7 +1858,7 @@ public: audioLevel-=0.01; engine.SetOutputVolume(audioLevel); } else - if (!audioFade&&audioLevel<0.6) { + if (!audioFade&&audioLevel<0.6&&!SOUND_IS_MUTED) { audioLevel+=0.01; engine.SetOutputVolume(audioLevel); } @@ -1873,7 +1913,7 @@ public: bool animationchanged=false; bool positionModified=false; if (GetKey(D).bHeld||GetKey(RIGHT).bHeld||GetKey(NP6).bHeld) { - if (MAP[(int)PLAYER_COORDS[1]][(int)std::clamp(PLAYER_COORDS[0]+MOVE_SPD,0.1,(double)MAP_WIDTH)]!=4) { + if (GAME_STATE!=IN_SPACE&&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; } @@ -1885,7 +1925,7 @@ public: } } if (GetKey(A).bHeld||GetKey(LEFT).bHeld||GetKey(NP4).bHeld) { - if (MAP[(int)PLAYER_COORDS[1]][(int)std::clamp(PLAYER_COORDS[0]-MOVE_SPD,0.1,(double)MAP_WIDTH)]!=4) { + if (GAME_STATE!=IN_SPACE&&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; } @@ -1897,7 +1937,7 @@ public: } } if (GetKey(W).bHeld||GetKey(UP).bHeld||GetKey(NP8).bHeld) { - if (MAP[(int)std::clamp(PLAYER_COORDS[1]-MOVE_SPD,0.1,(double)MAP_HEIGHT)][(int)PLAYER_COORDS[0]]!=4) { + if (GAME_STATE!=IN_SPACE&&MAP[(int)std::clamp(PLAYER_COORDS[1]-MOVE_SPD,0.1,(double)MAP_HEIGHT)][(int)PLAYER_COORDS[0]]!=4) { PLAYER_COORDS[1]=std::clamp(PLAYER_COORDS[1]-MOVE_SPD,0.1,(double)MAP_HEIGHT); positionModified=true; } @@ -1907,9 +1947,14 @@ public: changeAnimation(playerAnimWalkUp); animationchanged=true; } + if (!messageBoxVisible&&BATTLE_STATE==battle::PLAYER_SELECTION) { + HIDE_CARDS=true; + } + } else { + HIDE_CARDS=false; } if (GetKey(S).bHeld||GetKey(DOWN).bHeld||GetKey(NP5).bHeld||GetKey(NP2).bHeld) { - if (MAP[(int)std::clamp(PLAYER_COORDS[1]+MOVE_SPD,0.1,(double)MAP_HEIGHT)][(int)PLAYER_COORDS[0]]!=4) { + if (GAME_STATE!=IN_SPACE&&MAP[(int)std::clamp(PLAYER_COORDS[1]+MOVE_SPD,0.1,(double)MAP_HEIGHT)][(int)PLAYER_COORDS[0]]!=4) { PLAYER_COORDS[1]=std::clamp(PLAYER_COORDS[1]+MOVE_SPD,0.1,(double)MAP_HEIGHT); positionModified=true; } @@ -2302,21 +2347,6 @@ public: CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->hidden=true; } } - if (ref->appliesPetrification) { - if (BATTLE_CURRENT_TURN_ENTITY==-1) { - //Not implemented for the player. - } else { - PETRIFY_TURNS=3; - } - } - if (ref->appliesRadioactive) { - if (BATTLE_CURRENT_TURN_ENTITY==-1) { - //Not implemented for the player. - } else { - SEEDS.clear(); - TREES.clear(); - } - } if (EFFECT_TIMER>ref->effectTime) { EFFECT_TIMER=0; clearPixelEffect(); @@ -2332,6 +2362,14 @@ public: BATTLE_REASON_CODE=reasoncode::DROUGHT; BATTLE_STATE=battle::WAIT_TURN_ANIMATION2; BATTLE_DROUGHT_ACTIVE=true; + } else + if (ref->appliesRadioactive&&(SEEDS.size()>0||TREES.size()>0)) { + BATTLE_REASON_CODE=reasoncode::RADIOACTIVE; + BATTLE_STATE=battle::WAIT_TURN_ANIMATION2; + } else + if (ref->appliesPetrification) { + BATTLE_REASON_CODE=reasoncode::PETRIFIED; + BATTLE_STATE=battle::WAIT_TURN_ANIMATION2; } else { BATTLE_REASON_CODE=-1; BATTLE_STATE=battle::DAMAGE_RESOLUTION; @@ -2375,6 +2413,21 @@ public: } clearTrees(); }break; + case reasoncode::RADIOACTIVE:{ + if (BATTLE_CURRENT_TURN_ENTITY==-1) { + //Not implemented for the player. + } else { + SEEDS.clear(); + TREES.clear(); + } + }break; + case reasoncode::PETRIFIED:{ + if (BATTLE_CURRENT_TURN_ENTITY==-1) { + //Not implemented for the player. + } else { + PETRIFY_TURNS=3; + } + }break; } } if (EFFECT_TIMER==WAIT_THRESHOLD*2) { @@ -2390,6 +2443,11 @@ public: if (BATTLE_CURRENT_TURN_ENTITY==-1) { BATTLE_DROUGHT_ACTIVE=false; std::cout<<"Drought turned off.\n"; + for (int i=0;iname.compare("Snack")==0||WEATHER_POWERS[i]->name.compare("Meal")==0) { + WEATHER_POWERS[i]->playerOwnCount=foodCount; + } + } } else { if (CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->lastSlowVal==CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->speed&& CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->speed!=0&&rand()%3==0) { @@ -2507,11 +2565,6 @@ public: BATTLE_STATE=battle::WAIT_TURN_ANIMATION; PIXEL_EFFECT_TRANSPARENCY=0; EFFECT_TIMER=0; - for (int i=0;iname.compare("Snack")==0||WEATHER_POWERS[i]->name.compare("Meal")==0) { - WEATHER_POWERS[i]->playerOwnCount=foodCount; - } - } } } }break; @@ -2546,6 +2599,7 @@ public: } if (MoveCameraTowardsPoint(GetMapFileCoords(7,11))) { PlayCutscene(cutscene::RAINING_IN_DOME); + PlaySound(&SOUND_WEATHERLIGHT); } }break; case cutscene::RAINING_IN_DOME:{ @@ -2875,7 +2929,7 @@ public: DisplayMessageBox(45); } else { PLAYER_COORDS[0]=CUTSCENE_OBJS[0]->x; - PLAYER_COORDS[1]=CUTSCENE_OBJS[1]->y; + PLAYER_COORDS[1]=CUTSCENE_OBJS[0]->y; current_playerAnim=playerAnimLeft; EndCutscene(); } @@ -3077,8 +3131,7 @@ public: } if (GAME_STATE==CUTSCENE_3&&!SOUND_IS_PLAYING) { - engine.SetOutputVolume(0.6); - engine.PlayWaveform(&SONG_MAIN,true); + playMusic(&SONG_MAIN); SOUND_IS_PLAYING=true; } @@ -3089,6 +3142,22 @@ public: case CUTSCENE_5: case CUTSCENE_6: case GAME_OVER_TERMINAL:{ + int soundFrequency=-1; + if (GAME_STATE==CUTSCENE_1) { + soundFrequency=160; + } else + if (GAME_STATE==CUTSCENE_4) { + soundFrequency=120; + } else + if (GAME_STATE==CUTSCENE_5) { + soundFrequency=80; + } else + if (GAME_STATE==CUTSCENE_6) { + soundFrequency=70; + } + if (soundFrequency!=-1&&frameCount%soundFrequency==0) { + PlaySound(&SOUND_SONAR); + } if (GAME_STATE==CUTSCENE_3&&frameCount%4!=0) {break;} if (textIndsprite->width*2/2),(float)(HEIGHT/2-BOOK2_DECAL->sprite->height*2/2)},BOOK2_DECAL,{2,2}); }break; case IN_SPACE:{ - SetDrawTarget(2); Clear(BLACK); DrawStars(); if (!IN_BATTLE_ENCOUNTER) { @@ -3437,10 +3508,12 @@ public: } switch (BATTLE_STATE) { case battle::PLAYER_SELECTION:{ - SetDrawTarget(nullptr); - DrawCard(availablePowers[(BATTLE_CARD_SELECTION_IND+1)%availablePowers.size()],{WIDTH-96,32},{0.7,0.7},0.4); - DrawCard(availablePowers[(BATTLE_CARD_SELECTION_IND-1<0)?availablePowers.size()-1:BATTLE_CARD_SELECTION_IND-1],{-96,32},{0.7,0.7},0.4); - DrawCard(BATTLE_CARD_SELECTION); + if (!HIDE_CARDS) { + SetDrawTarget(nullptr); + DrawCard(availablePowers[(BATTLE_CARD_SELECTION_IND+1)%availablePowers.size()],{WIDTH-96,32},{0.7,0.7},0.4); + DrawCard(availablePowers[(BATTLE_CARD_SELECTION_IND-1<0)?availablePowers.size()-1:BATTLE_CARD_SELECTION_IND-1],{-96,32},{0.7,0.7},0.4); + DrawCard(BATTLE_CARD_SELECTION); + } }break; case battle::PLAYER_TARGET_SELECTION:{ if (PLAYER_SELECTED_TARGET>=0) { @@ -3714,6 +3787,27 @@ public: void audioFadeIn() { audioFade=false; } + sound::PlayingWave playMusic(sound::Wave*sound,bool loop=true,float spd=1) { + audioFadeIn(); + if (SOUND_IS_PLAYING) { + stopMusic(); + } + SOUND_IS_PLAYING=true; + CURRENT_BGM=engine.PlayWaveform(sound,loop,spd); + return CURRENT_BGM; + } + void PlaySound(sound::Wave* sound,bool loop=false,float spd=1) { + audioFadeIn(); + if (LAST_FRAME_SOUND_PLAYED!=frameCount) { + engine.PlayWaveform(sound,loop,spd); + LAST_FRAME_SOUND_PLAYED=frameCount; + } + } + + void stopMusic() { + engine.StopWaveform(CURRENT_BGM); + SOUND_IS_PLAYING=false; + } void StopCutscene() { EndCutscene(); @@ -4401,6 +4495,11 @@ public: ResetTerminal(STORY_TEXT4+PLAYER_NAME+STORY_TEXT5); for (int i=0;ihp=CURRENT_ENCOUNTER.entities[i]->startingHP; + CURRENT_ENCOUNTER.entities[i]->spr=CURRENT_ENCOUNTER.entities[i]->startingspr; + CURRENT_ENCOUNTER.entities[i]->fixedTurnOrderInd=0; + CURRENT_ENCOUNTER.entities[i]->hidden=false; + CURRENT_ENCOUNTER.entities[i]->turnComplete=false; + CURRENT_ENCOUNTER.entities[i]->speed=0; } resetBattleState(); fadeOut(); diff --git a/Seasons_of_Loneliness b/Seasons_of_Loneliness index 5a5c6c5..d877d9b 100755 Binary files a/Seasons_of_Loneliness and b/Seasons_of_Loneliness differ diff --git a/Seasons_of_Loneliness.wasm b/Seasons_of_Loneliness.wasm index 5b20162..0d70660 100755 Binary files a/Seasons_of_Loneliness.wasm and b/Seasons_of_Loneliness.wasm differ diff --git a/assets/IntroFinal.wav b/assets/IntroFinal.wav new file mode 100644 index 0000000..4886188 Binary files /dev/null and b/assets/IntroFinal.wav differ diff --git a/assets/SeasonsOfLoneliness.wav b/assets/SeasonsOfLoneliness.wav index 4f243cd..d0ff588 100644 Binary files a/assets/SeasonsOfLoneliness.wav and b/assets/SeasonsOfLoneliness.wav differ diff --git a/assets/battle.wav b/assets/battle.wav new file mode 100644 index 0000000..d330f94 Binary files /dev/null and b/assets/battle.wav differ diff --git a/assets/card_flip.wav b/assets/card_flip.wav new file mode 100644 index 0000000..6ee5194 Binary files /dev/null and b/assets/card_flip.wav differ diff --git a/assets/dome.wav b/assets/dome.wav new file mode 100644 index 0000000..e7150cf Binary files /dev/null and b/assets/dome.wav differ diff --git a/assets/explode.wav b/assets/explode.wav new file mode 100644 index 0000000..91244d6 Binary files /dev/null and b/assets/explode.wav differ diff --git a/assets/explore.wav b/assets/explore.wav new file mode 100644 index 0000000..2f35b66 Binary files /dev/null and b/assets/explore.wav differ diff --git a/assets/finalBattle.wav b/assets/finalBattle.wav new file mode 100644 index 0000000..971b841 Binary files /dev/null and b/assets/finalBattle.wav differ diff --git a/assets/laserShoot.wav b/assets/laserShoot.wav new file mode 100644 index 0000000..f20ba41 Binary files /dev/null and b/assets/laserShoot.wav differ diff --git a/assets/msg.wav b/assets/msg.wav new file mode 100644 index 0000000..9499f4d Binary files /dev/null and b/assets/msg.wav differ diff --git a/assets/roboticNoise.wav b/assets/roboticNoise.wav new file mode 100644 index 0000000..a4a6481 Binary files /dev/null and b/assets/roboticNoise.wav differ diff --git a/assets/saw.wav b/assets/saw.wav new file mode 100644 index 0000000..5532eff Binary files /dev/null and b/assets/saw.wav differ diff --git a/assets/select.wav b/assets/select.wav new file mode 100644 index 0000000..86acc17 Binary files /dev/null and b/assets/select.wav differ diff --git a/assets/sonar.wav b/assets/sonar.wav new file mode 100644 index 0000000..39e1790 Binary files /dev/null and b/assets/sonar.wav differ diff --git a/assets/warning.wav b/assets/warning.wav new file mode 100644 index 0000000..488728f Binary files /dev/null and b/assets/warning.wav differ diff --git a/assets/weatherHeavy.wav b/assets/weatherHeavy.wav new file mode 100644 index 0000000..368686b Binary files /dev/null and b/assets/weatherHeavy.wav differ diff --git a/assets/weatherLight.wav b/assets/weatherLight.wav new file mode 100644 index 0000000..9643710 Binary files /dev/null and b/assets/weatherLight.wav differ diff --git a/data.h b/data.h index e7bf722..1f5d88b 100644 --- a/data.h +++ b/data.h @@ -88,7 +88,7 @@ std::string CREDITS_TEXT=R"( std::string THANKS_TEXT=R"( Thanks for -playing!)"; +Playing!)"; std::string STORY_DIALOG[]={R"( ???