Add powerup tips fix a billion things. Yes.

sigonasr2 6 months ago
parent d92e0b86ae
commit b32faf1cda
  1. 2
      assets/PBData
  2. BIN
      assets/button3.png
  3. BIN
      assets/fallometer_outline.png
  4. BIN
      assets/highlight_button3.png
  5. BIN
      assets/highlight_smallbutton3.png
  6. BIN
      assets/highlight_trackselectbutton.png
  7. BIN
      assets/smallbutton3.png
  8. BIN
      assets/sounds/new_record.wav
  9. BIN
      assets/trackselectbutton.png
  10. 16
      src/Hamster.cpp
  11. 1
      src/Hamster.h
  12. 4
      src/HamsterGame.cpp
  13. 6
      src/HamsterGame.h
  14. 6
      src/HamsterJet.cpp
  15. 156
      src/Menu.cpp
  16. 10
      src/Powerup.cpp
  17. 1
      src/Powerup.h

@ -1 +1 @@
41481 54006 53138 73057 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 1 0.6 OneLoneHam Black 38582 54006 53138 73057 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 1 0.6 OneLoneHam Black

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

@ -320,6 +320,7 @@ void Hamster::MoveHamstersToSpawn(const geom2d::rect<int>startingLoc){
for(HamsterPersistentData&data:persistentData){ for(HamsterPersistentData&data:persistentData){
Hamster&newHamster{HAMSTER_LIST.emplace_back(vf2d{},data.colorFilename,data.IsPlayerControlled)}; Hamster&newHamster{HAMSTER_LIST.emplace_back(vf2d{},data.colorFilename,data.IsPlayerControlled)};
newHamster.points=data.points; newHamster.points=data.points;
newHamster.aiLevel=data.aiLevel;
} }
for(Hamster&hamster:HAMSTER_LIST){ for(Hamster&hamster:HAMSTER_LIST){
@ -418,6 +419,13 @@ void Hamster::DrawOverlay(){
} }
HamsterGame::Game().DrawShadowStringDecal(HamsterGame::SCREEN_FRAME.pos+vf2d{3*16.f+8.f,HamsterGame::SCREEN_FRAME.size.y-12.f},"\"R\" - BOOST",YELLOW,fmod(HamsterGame::Game().GetRuntime(),2.f)<1.f?RED:BLACK); HamsterGame::Game().DrawShadowStringDecal(HamsterGame::SCREEN_FRAME.pos+vf2d{3*16.f+8.f,HamsterGame::SCREEN_FRAME.size.y-12.f},"\"R\" - BOOST",YELLOW,fmod(HamsterGame::Game().GetRuntime(),2.f)<1.f?RED:BLACK);
} }
if(HamsterGame::Game().collectedPowerupTimer>0.f){
vf2d powerupInfoStrSize{HamsterGame::Game().GetTextSizeProp(HamsterGame::Game().powerupHelpDisplay)};
uint8_t alpha{255U};
if(HamsterGame::Game().collectedPowerupTimer<1.f)alpha=uint8_t(util::lerp(0,255,HamsterGame::Game().collectedPowerupTimer));
HamsterGame::Game().DrawShadowRotatedStringPropDecal(HamsterGame::SCREEN_FRAME.middle()+vf2d{0.f,-HamsterGame::SCREEN_FRAME.size.y/2+powerupInfoStrSize.y+4.f},HamsterGame::Game().powerupHelpDisplay,0.f,powerupInfoStrSize/2,{255,255,255,alpha},{0,0,0,alpha});
}
} }
const Animate2D::Frame&Hamster::GetCurrentAnimation()const{ const Animate2D::Frame&Hamster::GetCurrentAnimation()const{
@ -542,6 +550,10 @@ void Hamster::HandleCollision(){
if(powerup.GetType()==Powerup::JET)HamsterGame::PlaySFX(pos,"obtain_jet.wav"); if(powerup.GetType()==Powerup::JET)HamsterGame::PlaySFX(pos,"obtain_jet.wav");
else HamsterGame::PlaySFX(pos,"collect_powerup.wav"); else HamsterGame::PlaySFX(pos,"collect_powerup.wav");
powerup.OnPowerupObtain(*this); powerup.OnPowerupObtain(*this);
if(IsPlayerControlled){
HamsterGame::Game().collectedPowerupTimer=5.f;
HamsterGame::Game().powerupHelpDisplay=Powerup::powerupInfo[powerup.GetType()];
}
} }
} }
for(Checkpoint&checkpoint:Checkpoint::GetCheckpoints()){ for(Checkpoint&checkpoint:Checkpoint::GetCheckpoints()){
@ -1050,4 +1062,8 @@ const int Hamster::GetFinishedTime()const{
const std::string&Hamster::GetHamsterImage()const{ const std::string&Hamster::GetHamsterImage()const{
return colorFilename; return colorFilename;
}
void Hamster::ClearHamsters(){
HAMSTER_LIST.clear();
} }

@ -194,4 +194,5 @@ public:
PlayerControlled IsPlayerControlled; PlayerControlled IsPlayerControlled;
const int GetFinishedTime()const; const int GetFinishedTime()const;
const std::string&GetHamsterImage()const; const std::string&GetHamsterImage()const;
static void ClearHamsters();
}; };

@ -165,6 +165,8 @@ void HamsterGame::LoadGraphics(){
_LoadImage("smallhighlight_button.png"); _LoadImage("smallhighlight_button.png");
_LoadImage("trackselectbutton.png"); _LoadImage("trackselectbutton.png");
_LoadImage("highlight_trackselectbutton.png"); _LoadImage("highlight_trackselectbutton.png");
_LoadImage("smallbutton3.png");
_LoadImage("highlight_smallbutton3.png");
} }
void HamsterGame::LoadAnimations(){ void HamsterGame::LoadAnimations(){
@ -254,6 +256,7 @@ void HamsterGame::UpdateGame(const float fElapsedTime){
} }
vEye.z+=(Hamster::GetPlayer().GetZ()+zoom-vEye.z)*fLazyFollowRate*fElapsedTime; vEye.z+=(Hamster::GetPlayer().GetZ()+zoom-vEye.z)*fLazyFollowRate*fElapsedTime;
speedometerDisplayAmt+=(Hamster::GetPlayer().GetSpeed()-speedometerDisplayAmt)*fLazyFollowRate*fElapsedTime; speedometerDisplayAmt+=(Hamster::GetPlayer().GetSpeed()-speedometerDisplayAmt)*fLazyFollowRate*fElapsedTime;
collectedPowerupTimer-=fElapsedTime;
if(GetMouseWheel()>0){ if(GetMouseWheel()>0){
radarScale=std::clamp(radarScale/2.f,9.f,144.f); radarScale=std::clamp(radarScale/2.f,9.f,144.f);
@ -652,6 +655,7 @@ void HamsterGame::SavePB(const std::string&mapName,int ms){
file<<Game().bgmVol<<" "<<Game().sfxVol<<" "<<Game().playerName<<" "<<Game().hamsterColor; file<<Game().bgmVol<<" "<<Game().sfxVol<<" "<<Game().playerName<<" "<<Game().hamsterColor;
file.close(); file.close();
#endif #endif
self->obtainedNewPB=true;
} }
} }

@ -130,6 +130,8 @@ public:
static void PlaySFX(const std::string&filename); static void PlaySFX(const std::string&filename);
static void PlaySFX(vf2d pos,const std::string&filename); static void PlaySFX(vf2d pos,const std::string&filename);
const float GetPlayerDifferentialTime()const; const float GetPlayerDifferentialTime()const;
float collectedPowerupTimer{};
std::string powerupHelpDisplay;
private: private:
void UpdateGame(const float fElapsedTime); void UpdateGame(const float fElapsedTime);
void DrawGame(); void DrawGame();
@ -169,10 +171,12 @@ private:
GameMode mode{GameMode::SINGLE_RACE}; GameMode mode{GameMode::SINGLE_RACE};
HamsterNet net; HamsterNet net;
float countdownTimer{}; float countdownTimer{};
bool obtainedNewPB{false};
using Points=int; using Points=int;
using HamsterInd=size_t; using HamsterInd=size_t;
using FinishTime=int; using FinishTime=int;
std::vector<std::pair<Points,HamsterInd>>grandPrixPoints; std::unordered_map<HamsterInd,Points>grandPrixPoints;
std::vector<std::pair<Points,HamsterInd>>pointsList;
std::vector<std::pair<FinishTime,HamsterInd>>racerList; std::vector<std::pair<FinishTime,HamsterInd>>racerList;
#ifndef __EMSCRIPTEN__ #ifndef __EMSCRIPTEN__
#ifndef __DEBUG__ #ifndef __DEBUG__

@ -223,6 +223,12 @@ void HamsterJet::DrawOverlay()const{
float meterHeight{meterEndY-meterStartY}; float meterHeight{meterEndY-meterStartY};
HamsterGame::Game().DrawPartialDecal(HamsterGame::SCREEN_FRAME.pos+vf2d{0,222}-vf2d{0,(fallSpd/5.f)*meterHeight},HamsterGame::GetGFX("fallometer.png").Decal(),vf2d{0,223}-vf2d{0,(fallSpd/5.f)*meterHeight},vf2d{float(HamsterGame::GetGFX("fallometer.png").Sprite()->width),(fallSpd/5.f)*meterHeight}); HamsterGame::Game().DrawPartialDecal(HamsterGame::SCREEN_FRAME.pos+vf2d{0,222}-vf2d{0,(fallSpd/5.f)*meterHeight},HamsterGame::GetGFX("fallometer.png").Decal(),vf2d{0,223}-vf2d{0,(fallSpd/5.f)*meterHeight},vf2d{float(HamsterGame::GetGFX("fallometer.png").Sprite()->width),(fallSpd/5.f)*meterHeight});
} }
if(state==HAMSTER_CONTROL){
const vf2d jetDisplayOffset{HamsterGame::SCREEN_FRAME.pos+vf2d{HamsterGame::SCREEN_FRAME.size.x,0.f}};
const std::string launchText{"(SPACE)x2\nto Land!"};
const vi2d launchTextSize{HamsterGame::Game().GetTextSize(launchText)};
HamsterGame::Game().DrawShadowRotatedStringDecal(jetDisplayOffset+vf2d{48.f,224.f},launchText,0.f,launchTextSize/2,WHITE,BLACK);
}
} }
void HamsterJet::SetPos(const vf2d pos){ void HamsterJet::SetPos(const vf2d pos){

@ -135,59 +135,123 @@ std::vector<Menu::Button>Menu::GetMenuButtons(const MenuType type){
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,64.f},"Quit","button.png","highlight_button.png",Pixel{165,208,96},Pixel{37,134,139},[this](Button&self){Transition(SHIFT_DOWN,QUIT,0.5f);}); buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,64.f},"Quit","button.png","highlight_button.png",Pixel{165,208,96},Pixel{37,134,139},[this](Button&self){Transition(SHIFT_DOWN,QUIT,0.5f);});
}break; }break;
case GRAND_PRIX:{ case GRAND_PRIX:{
buttons.emplace_back(HamsterGame::SCREEN_FRAME.pos+vf2d{60.f,HamsterGame::SCREEN_FRAME.size.y/2-36.f},"Grand Prix I - ","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){ buttons.emplace_back(HamsterGame::SCREEN_FRAME.pos+vf2d{60.f,HamsterGame::SCREEN_FRAME.size.y/2-36.f},"Grand Prix I (4 courses)","button3.png","highlight_button3.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageI.tmx"; selectedMap="StageI.tmx";
HamsterGame::Game().mode=HamsterGame::GameMode::GRAND_PRIX_1;
std::queue<std::string>mapList;
mapList.emplace("StageII.tmx");
mapList.emplace("StageIII.tmx");
mapList.emplace("StageIV.tmx");
HamsterGame::Game().SetMapSetList(mapList);
HamsterGame::Game().grandPrixPoints.clear();
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f); Transition(FADE_OUT,LOADING,0.5f);
}); });
buttons.emplace_back(vf2d{54.f,HamsterGame::SCREEN_FRAME.size.y-24.f},"< Back","button3.png","highlight_button3.png",Pixel{145,199,255},Pixel{145,199,255},[this](Button&self){Transition(SHIFT_RIGHT,MAIN_MENU,0.5f);}); buttons.emplace_back(HamsterGame::SCREEN_FRAME.pos+vf2d{60.f,HamsterGame::SCREEN_FRAME.size.y/2.f},"Grand Prix II (4 courses)","button3.png","highlight_button3.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageV.tmx";
HamsterGame::Game().mode=HamsterGame::GameMode::GRAND_PRIX_2;
std::queue<std::string>mapList;
mapList.emplace("StageVI.tmx");
mapList.emplace("StageVII.tmx");
mapList.emplace("StageVIII.tmx");
HamsterGame::Game().SetMapSetList(mapList);
HamsterGame::Game().grandPrixPoints.clear();
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f);
});
buttons.emplace_back(HamsterGame::SCREEN_FRAME.pos+vf2d{60.f,HamsterGame::SCREEN_FRAME.size.y/2+36.f},"Grand Prix III (4 courses)","button3.png","highlight_button3.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageIX.tmx";
HamsterGame::Game().mode=HamsterGame::GameMode::GRAND_PRIX_3;
std::queue<std::string>mapList;
mapList.emplace("StageX.tmx");
mapList.emplace("StageXI.tmx");
mapList.emplace("StageXII.tmx");
HamsterGame::Game().SetMapSetList(mapList);
HamsterGame::Game().grandPrixPoints.clear();
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f);
});
buttons.emplace_back(HamsterGame::SCREEN_FRAME.pos+vf2d{60.f,HamsterGame::SCREEN_FRAME.size.y/2+72.f},"Marathon (12 courses)","button3.png","highlight_button3.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageI.tmx";
HamsterGame::Game().mode=HamsterGame::GameMode::MARATHON;
std::queue<std::string>mapList;
mapList.emplace("StageII.tmx");
mapList.emplace("StageIII.tmx");
mapList.emplace("StageIV.tmx");
mapList.emplace("StageV.tmx");
mapList.emplace("StageVI.tmx");
mapList.emplace("StageVII.tmx");
mapList.emplace("StageVIII.tmx");
mapList.emplace("StageIX.tmx");
mapList.emplace("StageX.tmx");
mapList.emplace("StageXI.tmx");
mapList.emplace("StageXII.tmx");
HamsterGame::Game().SetMapSetList(mapList);
HamsterGame::Game().grandPrixPoints.clear();
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f);
});
buttons.emplace_back(vf2d{54.f,HamsterGame::SCREEN_FRAME.size.y-24.f},"< Back","smallbutton3.png","highlight_smallbutton3.png",Pixel{145,199,255},Pixel{145,199,255},[this](Button&self){Transition(SHIFT_RIGHT,MAIN_MENU,0.5f);});
}break; }break;
case SINGLE_RACE:{ case SINGLE_RACE:{
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f},"I - Welcome to Hamster Planet!","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){ buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f},"I - Welcome to Hamster Planet!","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageI.tmx"; selectedMap="StageI.tmx";
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f); Transition(FADE_OUT,LOADING,0.5f);
}); });
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*1},"II - Splitting Hairs","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){ buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*1},"II - Splitting Hairs","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageII.tmx"; selectedMap="StageII.tmx";
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f); Transition(FADE_OUT,LOADING,0.5f);
}); });
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*2},"III - The Stranger Lands","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){ buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*2},"III - The Stranger Lands","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageIII.tmx"; selectedMap="StageIII.tmx";
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f); Transition(FADE_OUT,LOADING,0.5f);
}); });
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*3},"IV - Jet Jet Go!","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){ buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*3},"IV - Jet Jet Go!","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageIV.tmx"; selectedMap="StageIV.tmx";
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f); Transition(FADE_OUT,LOADING,0.5f);
}); });
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*4},"V - Run Run Run!","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){ buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*4},"V - Run Run Run!","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageV.tmx"; selectedMap="StageV.tmx";
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f); Transition(FADE_OUT,LOADING,0.5f);
}); });
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*5},"VI - A Twisty Maze","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){ buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*5},"VI - A Twisty Maze","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageVI.tmx"; selectedMap="StageVI.tmx";
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f); Transition(FADE_OUT,LOADING,0.5f);
}); });
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*6},"VII - Dunescape","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){ buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*6},"VII - Dunescape","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageVII.tmx"; selectedMap="StageVII.tmx";
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f); Transition(FADE_OUT,LOADING,0.5f);
}); });
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*7},"VIII - Swamps of Travesty","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){ buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*7},"VIII - Swamps of Travesty","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageVIII.tmx"; selectedMap="StageVIII.tmx";
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f); Transition(FADE_OUT,LOADING,0.5f);
}); });
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*8},"IX - Wide Chasm","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){ buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*8},"IX - Wide Chasm","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageIX.tmx"; selectedMap="StageIX.tmx";
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f); Transition(FADE_OUT,LOADING,0.5f);
}); });
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*9},"X - Hamster Island","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){ buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*9},"X - Hamster Island","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageX.tmx"; selectedMap="StageX.tmx";
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f); Transition(FADE_OUT,LOADING,0.5f);
}); });
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*10},"XI - Lava Panic!","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){ buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*10},"XI - Lava Panic!","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageXI.tmx"; selectedMap="StageXI.tmx";
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f); Transition(FADE_OUT,LOADING,0.5f);
}); });
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*11},"XII - The Great Plunge","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){ buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-132.f+22.f*11},"XII - The Great Plunge","longbutton2.png","longhighlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){
selectedMap="StageXII.tmx"; selectedMap="StageXII.tmx";
Hamster::ClearHamsters();
Transition(FADE_OUT,LOADING,0.5f); Transition(FADE_OUT,LOADING,0.5f);
}); });
buttons.emplace_back(vf2d{54.f,HamsterGame::SCREEN_FRAME.size.y-12.f},"< Back","button4.png","highlight_button4.png",Pixel{220,185,155},Pixel{180,140,152},[this](Button&self){Transition(SHIFT_DOWN,MAIN_MENU,0.5f);}); buttons.emplace_back(vf2d{54.f,HamsterGame::SCREEN_FRAME.size.y-12.f},"< Back","button4.png","highlight_button4.png",Pixel{220,185,155},Pixel{180,140,152},[this](Button&self){Transition(SHIFT_DOWN,MAIN_MENU,0.5f);});
@ -254,34 +318,38 @@ std::vector<Menu::Button>Menu::GetMenuButtons(const MenuType type){
buttons.emplace_back(vf2d{54.f,HamsterGame::SCREEN_FRAME.size.y-24.f},"< Back","button2.png","highlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){Transition(SHIFT_LEFT,MAIN_MENU,0.5f);}); buttons.emplace_back(vf2d{54.f,HamsterGame::SCREEN_FRAME.size.y-24.f},"< Back","button2.png","highlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){Transition(SHIFT_LEFT,MAIN_MENU,0.5f);});
}break; }break;
case GAMEPLAY_RESULTS:{ case GAMEPLAY_RESULTS:{
switch(HamsterGame::Game().GetGameMode()){ int MAX_SIMULATION_COUNT{10000};
case HamsterGame::GameMode::SINGLE_RACE:{ HamsterGame::Game().playerDifferentialTime=0.f;
int MAX_SIMULATION_COUNT{10000}; while(MAX_SIMULATION_COUNT>0){
HamsterGame::Game().playerDifferentialTime=0.f; bool allHamstersFinished{true};
while(MAX_SIMULATION_COUNT>0){ for(Hamster&hamster:Hamster::GetHamsters()){
bool allHamstersFinished{true}; if(!hamster.CollectedAllCheckpoints())allHamstersFinished=false;
for(Hamster&hamster:Hamster::GetHamsters()){
if(!hamster.CollectedAllCheckpoints())allHamstersFinished=false;
}
if(allHamstersFinished)break;
HamsterGame::Game().SetElapsedTime(1/30.f);
HamsterGame::Game().UpdateGame(1/30.f);
HamsterGame::Game().playerDifferentialTime+=33;
MAX_SIMULATION_COUNT--;
}
HamsterGame::Game().racerList.clear();
for(size_t ind{0};Hamster&hamster:Hamster::GetHamsters()){
HamsterGame::Game().racerList.emplace_back(std::pair<HamsterGame::FinishTime,HamsterGame::HamsterInd>{hamster.GetFinishedTime(),ind});
ind++;
}
std::sort(HamsterGame::Game().racerList.begin(),HamsterGame::Game().racerList.end(),[](const std::pair<HamsterGame::FinishTime,HamsterGame::HamsterInd>&hamster1,const std::pair<HamsterGame::FinishTime,HamsterGame::HamsterInd>&hamster2){return hamster1.first<hamster2.first;});
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,HamsterGame::SCREEN_FRAME.size.y/2-40.f},"Track Select","trackselectbutton.png","highlight_trackselectbutton.png",Pixel{165,208,96},Pixel{37,134,139},[this](Button&self){Transition(FADE_OUT,SINGLE_RACE,1.f);});
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,HamsterGame::SCREEN_FRAME.size.y/2-16.f},"Retry","button.png","highlight_button.png",Pixel{165,208,96},Pixel{37,134,139},[this](Button&self){Transition(FADE_OUT,LOADING,1.f);});
}break;
default:{
//Show the points.
} }
if(allHamstersFinished)break;
HamsterGame::Game().SetElapsedTime(1/30.f);
HamsterGame::Game().UpdateGame(1/30.f);
HamsterGame::Game().playerDifferentialTime+=33;
MAX_SIMULATION_COUNT--;
}
HamsterGame::Game().racerList.clear();
for(size_t ind{0};Hamster&hamster:Hamster::GetHamsters()){
HamsterGame::Game().racerList.emplace_back(std::pair<HamsterGame::FinishTime,HamsterGame::HamsterInd>{hamster.GetFinishedTime(),ind});
ind++;
}
std::sort(HamsterGame::Game().racerList.begin(),HamsterGame::Game().racerList.end(),[](const std::pair<HamsterGame::FinishTime,HamsterGame::HamsterInd>&hamster1,const std::pair<HamsterGame::FinishTime,HamsterGame::HamsterInd>&hamster2){return hamster1.first<hamster2.first;});
if(HamsterGame::Game().mapSetList.size()>0){
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,HamsterGame::SCREEN_FRAME.size.y/2-24.f},"Continue","trackselectbutton.png","highlight_trackselectbutton.png",Pixel{165,208,96},Pixel{37,134,139},[this](Button&self){
selectedMap=HamsterGame::Game().mapSetList.front();
HamsterGame::Game().mapSetList.pop();
Transition(FADE_OUT,LOADING,1.f);
});
}else
if(HamsterGame::Game().GetGameMode()==HamsterGame::GameMode::SINGLE_RACE){
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,HamsterGame::SCREEN_FRAME.size.y/2-40.f},"Track Select","trackselectbutton.png","highlight_trackselectbutton.png",Pixel{165,208,96},Pixel{37,134,139},[this](Button&self){Transition(FADE_OUT,SINGLE_RACE,1.f);});
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,HamsterGame::SCREEN_FRAME.size.y/2-16.f},"Retry","button.png","highlight_button.png",Pixel{165,208,96},Pixel{37,134,139},[this](Button&self){Transition(FADE_OUT,LOADING,1.f);});
}else{
buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,HamsterGame::SCREEN_FRAME.size.y/2-40.f},"Grand Prix Select","trackselectbutton.png","highlight_trackselectbutton.png",Pixel{165,208,96},Pixel{37,134,139},[this](Button&self){Transition(FADE_OUT,GRAND_PRIX,1.f);});
} }
}break; }break;
} }
@ -294,10 +362,23 @@ void Menu::OnMenuTransition(){
menuButtons=GetMenuButtons(currentMenu); menuButtons=GetMenuButtons(currentMenu);
if(currentMenu!=GAMEPLAY&&currentMenu!=GAMEPLAY_RESULTS&&currentMenu!=AFTER_RACE_MENU)HamsterGame::Game().audio.Play(HamsterGame::Game().bgm["Trevor Lentz - Guinea Pig Hero.ogg"]); if(currentMenu!=GAMEPLAY&&currentMenu!=GAMEPLAY_RESULTS&&currentMenu!=AFTER_RACE_MENU)HamsterGame::Game().audio.Play(HamsterGame::Game().bgm["Trevor Lentz - Guinea Pig Hero.ogg"]);
switch(currentMenu){ switch(currentMenu){
case GAMEPLAY_RESULTS:{
const std::vector<int>pointTable{10,7,5,3,2,1};
for(size_t ind{0};const auto&[finishTime,hamsterInd]:HamsterGame::Game().racerList){
HamsterGame::Game().grandPrixPoints[hamsterInd]+=pointTable[ind];
ind++;
}
HamsterGame::Game().pointsList.clear();
for(const auto&[hamsterInd,points]:HamsterGame::Game().grandPrixPoints){
HamsterGame::Game().pointsList.emplace_back(std::pair<HamsterGame::Points,HamsterGame::HamsterInd>{points,hamsterInd});
}
std::sort(HamsterGame::Game().pointsList.begin(),HamsterGame::Game().pointsList.end(),[](const std::pair<HamsterGame::Points,HamsterGame::HamsterInd>&ham1,const std::pair<HamsterGame::Points,HamsterGame::HamsterInd>&ham2){return ham1.first>ham2.first;});
}break;
case LOADING:{ case LOADING:{
colorNumb=util::random()%8+1; colorNumb=util::random()%8+1;
loading=true; loading=true;
loadingPct=0.f; loadingPct=0.f;
HamsterGame::Game().operationsProgress=0;
HamsterGame::Game().LoadRace(selectedMap); HamsterGame::Game().LoadRace(selectedMap);
}break; }break;
case QUIT:{ case QUIT:{
@ -429,15 +510,30 @@ void Menu::Draw(HamsterGame&game,const MenuType menu,const vi2d pos){
} }
}break; }break;
case GAMEPLAY_RESULTS:{ case GAMEPLAY_RESULTS:{
const std::vector<int>pointTable{10,7,5,3,2,1};
for(size_t ind{0};const auto&[finishTime,hamsterInd]:HamsterGame::Game().racerList){ for(size_t ind{0};const auto&[finishTime,hamsterInd]:HamsterGame::Game().racerList){
const Hamster&hamster{Hamster::GetHamsters()[hamsterInd]}; const Hamster&hamster{Hamster::GetHamsters()[hamsterInd]};
if(hamster.IsPlayerControlled)game.FillRectDecal(vf2d{game.SCREEN_FRAME.pos.x+game.SCREEN_FRAME.size.x/2-64.f,game.SCREEN_FRAME.pos.y+game.SCREEN_FRAME.size.y/2-100.f+ind*16}-2.f,{164.f,12.f},{DARK_YELLOW.r,DARK_YELLOW.g,DARK_YELLOW.b,160});
game.DrawShadowStringDecal(vf2d{game.SCREEN_FRAME.pos.x+game.SCREEN_FRAME.size.x/2-64.f,game.SCREEN_FRAME.pos.y+game.SCREEN_FRAME.size.y/2-100.f+ind*16},std::format("{}.",ind+1)); game.DrawShadowStringDecal(vf2d{game.SCREEN_FRAME.pos.x+game.SCREEN_FRAME.size.x/2-64.f,game.SCREEN_FRAME.pos.y+game.SCREEN_FRAME.size.y/2-100.f+ind*16},std::format("{}.",ind+1));
game.DrawPartialRotatedDecal(vf2d{game.SCREEN_FRAME.pos.x+game.SCREEN_FRAME.size.x/2-64.f+24.f,game.SCREEN_FRAME.pos.y+game.SCREEN_FRAME.size.y/2-100.f+ind*16+6.f},game.GetGFX(hamster.GetHamsterImage()).Decal(),0.f,{8.f,6.f},{64.f,64.f},{16.f,12.f}); game.DrawPartialRotatedDecal(vf2d{game.SCREEN_FRAME.pos.x+game.SCREEN_FRAME.size.x/2-64.f+24.f,game.SCREEN_FRAME.pos.y+game.SCREEN_FRAME.size.y/2-100.f+ind*16+6.f},game.GetGFX(hamster.GetHamsterImage()).Decal(),0.f,{8.f,6.f},{64.f,64.f},{16.f,12.f});
std::string timeStr{util::timerStr(finishTime)}; std::string timeStr{util::timerStr(finishTime)};
vf2d timeStrSize{game.GetTextSize(timeStr)}; vf2d timeStrSize{game.GetTextSize(timeStr)};
game.DrawShadowStringDecal(vf2d{game.SCREEN_FRAME.pos.x+game.SCREEN_FRAME.size.x/2+64.f-timeStrSize.x,game.SCREEN_FRAME.pos.y+game.SCREEN_FRAME.size.y/2-100.f+ind*16},timeStr); game.DrawShadowStringDecal(vf2d{game.SCREEN_FRAME.pos.x+game.SCREEN_FRAME.size.x/2+64.f-timeStrSize.x,game.SCREEN_FRAME.pos.y+game.SCREEN_FRAME.size.y/2-100.f+ind*16},timeStr);
game.DrawShadowStringDecal(vf2d{game.SCREEN_FRAME.pos.x+game.SCREEN_FRAME.size.x/2+72.f,game.SCREEN_FRAME.pos.y+game.SCREEN_FRAME.size.y/2-100.f+ind*16},std::format("+{}",pointTable[ind]),YELLOW);
ind++; ind++;
} }
if(HamsterGame::Game().GetGameMode()!=HamsterGame::GameMode::SINGLE_RACE){
for(size_t ind{0};const auto&[points,hamsterInd]:HamsterGame::Game().pointsList){
const Hamster&hamster{Hamster::GetHamsters()[hamsterInd]};
if(hamster.IsPlayerControlled)game.FillRectDecal(vf2d{game.SCREEN_FRAME.pos.x+game.SCREEN_FRAME.size.x/2-64.f,game.SCREEN_FRAME.pos.y+game.SCREEN_FRAME.size.y/2+12.f+ind*16}-2.f,{132.f,12.f},{DARK_YELLOW.r,DARK_YELLOW.g,DARK_YELLOW.b,160});
game.DrawShadowStringDecal(vf2d{game.SCREEN_FRAME.pos.x+game.SCREEN_FRAME.size.x/2-64.f,game.SCREEN_FRAME.pos.y+game.SCREEN_FRAME.size.y/2+12.f+ind*16},std::format("{}.",ind+1));
game.DrawPartialRotatedDecal(vf2d{game.SCREEN_FRAME.pos.x+game.SCREEN_FRAME.size.x/2-64.f+24.f,game.SCREEN_FRAME.pos.y+game.SCREEN_FRAME.size.y/2+12.f+ind*16+6.f},game.GetGFX(hamster.GetHamsterImage()).Decal(),0.f,{8.f,6.f},{64.f,64.f},{16.f,12.f});
std::string pointsStr{std::to_string(points)};
vf2d pointsStrSize{game.GetTextSize(pointsStr)};
game.DrawShadowStringDecal(vf2d{game.SCREEN_FRAME.pos.x+game.SCREEN_FRAME.size.x/2+64.f-pointsStrSize.x,game.SCREEN_FRAME.pos.y+game.SCREEN_FRAME.size.y/2+12.f+ind*16},pointsStr,CYAN);
ind++;
}
}
DrawButtons(pos); DrawButtons(pos);
}break; }break;
case AFTER_RACE_MENU:{ case AFTER_RACE_MENU:{
@ -466,7 +562,7 @@ void Menu::Draw(HamsterGame&game,const MenuType menu,const vi2d pos){
void Menu::OnLevelLoaded(){ void Menu::OnLevelLoaded(){
loading=false; loading=false;
HamsterGame::Game().obtainedNewPB=false;
HamsterGame::Game().mapImage.Decal()->Update(); HamsterGame::Game().mapImage.Decal()->Update();
Powerup::Initialize(HamsterGame::Game().mapPowerupsTemp); Powerup::Initialize(HamsterGame::Game().mapPowerupsTemp);

@ -43,6 +43,16 @@ All rights reserved.
std::vector<Powerup>Powerup::powerupList; std::vector<Powerup>Powerup::powerupList;
std::unordered_map<int,std::pair<Powerup::PowerupType,Powerup::TileType>>Powerup::powerupIds; std::unordered_map<int,std::pair<Powerup::PowerupType,Powerup::TileType>>Powerup::powerupIds;
const vf2d Powerup::POWERUP_TILESET_STARTING_POS{144.f,816.f}; const vf2d Powerup::POWERUP_TILESET_STARTING_POS{144.f,816.f};
std::unordered_map<Powerup::PowerupType,std::string>Powerup::powerupInfo{
{WHEEL,"Vroom Vroom! Use R to boost!"},
{GRASS,"Speed up through Grass"},
{SAND,"Speed up through Sand"},
{SWAMP,"Cross Swamps without drowning!"},
{LAVA,"Walking on fire!"},
{FOREST,"Speed through trees"},
{ICE,"Less slippery, more speedy"},
{JET," Take off! Use <Space> x2. \n Watch your fuel! \nArrow Keys to control landing speed."},
};
std::unordered_map<Powerup::PowerupType,std::string>Powerup::powerupNames{ std::unordered_map<Powerup::PowerupType,std::string>Powerup::powerupNames{
{WHEEL,"WHEEL"}, {WHEEL,"WHEEL"},
{GRASS,"GRASS"}, {GRASS,"GRASS"},

@ -84,4 +84,5 @@ public:
static void DrawPowerups(TransformedView&tv); static void DrawPowerups(TransformedView&tv);
static const geom2d::rect<float>GetPowerupSubimageRect(const PowerupType powerupType); static const geom2d::rect<float>GetPowerupSubimageRect(const PowerupType powerupType);
void OnPowerupObtain(Hamster&pickupHamster); void OnPowerupObtain(Hamster&pickupHamster);
static std::unordered_map<PowerupType,std::string>powerupInfo;
}; };
Loading…
Cancel
Save