#include "Scenario.h" #include "TileManager.h" Scenario::Scenario(std::vector>&units,std::vector>&IMAGES,std::vector>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) :units(units),IMAGES(IMAGES),SOUNDS(SOUNDS),objective(objective),game(game),flags(flags){} Scenario::~Scenario(){}; void Scenario::_Start(){ state=0; camera=utils::Camera2D{game.GetPGE()->GetScreenSize(),game.GetWorldOffset()}; camera.SetLazyFollowRate(2); camera.SetMode(utils::Camera2D::Mode::LazyFollow); targetPos={96,96}; box.SetVisible(false); initialWaitTime=3; camera.SetTarget(targetPos); missionCompletedTimer=0; transitionToNextLevel=false; Start(); } void Scenario::Start(){}; void Scenario::_Update(){ initialWaitTime=std::max(0.f,initialWaitTime-game.GetPGE()->GetElapsedTime()); missionFinishWaitTime=std::max(0.f,missionFinishWaitTime-game.GetPGE()->GetElapsedTime()); if(missionCompleted){ missionCompletedTimer+=game.GetPGE()->GetElapsedTime(); } else { missionCompleted=MissionCompleted(); } if(initialWaitTime==0){ Update(); } }; bool Scenario::MissionCompleted(){return false;} void Scenario::Update(){}; void Scenario::Draw(){ if(objective.length()>0){ game.GetPGE()->DrawShadowStringDecal({4,24},"Objective:"); game.GetPGE()->DrawShadowStringDecal({6,36},objective); game.GetPGE()->DrawShadowStringDecal({4,24},missionCompleted?"Objective Complete!":"Objective:",missionCompleted?GREEN:WHITE); vf2d textSize=game.GetPGE()->GetTextSize(objective); game.GetPGE()->DrawShadowStringDecal({6,36},objective,missionCompleted?GREEN:WHITE); if(missionCompleted&&missionFinishWaitTime==0){ game.GetPGE()->FillRectDecal(vf2d{6,36}+vf2d{0,textSize.y/2-1},{textSize.x,3}); std::string continueText="< Press [Spacebar] to continue >"; vf2d textScale={2,3}; vf2d textSize=game.GetPGE()->GetTextSizeProp(continueText)*textScale; game.GetPGE()->DrawShadowStringPropDecal(game.GetPGE()->GetScreenSize()/2-textSize/2+vf2d{0,72},continueText,{255,255,255,uint8_t(abs(sin(2*missionCompletedTimer))*255)},{0,0,0,uint8_t(abs(sin(2*missionCompletedTimer))*255)},textScale); if(game.GetPGE()->GetKey(SPACE).bPressed){ transitionToNextLevel=true; } } } Resources temp={0,0,0,0,0}; box.UpdateAndDraw({24,64},game.GetPGE(),temp,IMAGES,0,0); } void Scenario::SetCameraTarget(vf2d pos){ targetPos=pos; camera.SetTarget(targetPos); camera.Update(game.GetPGE()->GetElapsedTime()); game.SetWorldOffset(camera.GetViewPosition()); } void Scenario::SetObjective(std::string objective){ this->objective=objective; } Stage1::Stage1(std::vector>&units,std::vector>&IMAGES,std::vector>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) :Scenario(units,IMAGES,SOUNDS,objective,game,flags){} void Stage1::Start(){ flags.unitMetersGreyedOut=true; flags.playerInControl=false; nextLevel=LevelName::STAGE2; }; void Scenario::DisplayBox(std::string text,bool scaryHoodedFigure){ box.Initialize(text,{24,64},"",scaryHoodedFigure?IMAGES[SPOOK_HOODED_FIGURE].get():IMAGES[HOODED_FIGURE].get(),{378,28},SOUNDS[Sound::VOICEOVER].get()); } void Stage1::Update(){ switch(state){ case 0:{ DisplayBox("Hello Hacker, thank you for taking on this request for me."); if(box.bPressed){ state=1; } }break; case 1:{ DisplayBox("It appears we have no time to waste, many sectors are already infected and the virus spread will just keep getting worse."); if(box.bPressed){ state=2; SOUNDS[Sound::PING]->PlayCentered(); for(int y=-1;y<=1;y++){ for(int x=-1;x<=1;x++){ vi2d basePos={320+x*96,320+y*96}; TileManager::visibleTiles[{basePos.x/96,basePos.y/96}]=30; } } } }break; case 2:{ SetCameraTarget({320,320}); if(camera.ReachedTarget()){ state=3; } }break; case 3:{ DisplayBox("Your mission is to take out all the RAM banks from the system, this will stop any further creation and spread of viruses."); if(box.bPressed){ state=4; } }break; case 4:{ SetCameraTarget({128,128}); if(camera.ReachedTarget()){ state=5; } }break; case 5:{ DisplayBox("The yellow bar represent units' allocated Health memory. Take out the enemies' and make sure you always have at least 1 bit of it."); if(box.bPressed){ state=6; } }break; case 6:{ DisplayBox("Drag over your target unit and then select a target location via right-click."); if(box.bPressed){ state=7; } }break; case 7:{ SetObjective("Defeat the RAM bank"); DisplayBox("That should be all you need for now. I'll be back after my coffee break."); if(box.bPressed){ state=8; box.SetVisible(false); flags.playerInControl=true; } }break; case 8:{ }break; } }; bool Stage1::MissionCompleted(){ for(auto&u:units){ if(!u->IsFriendly()&&u->IsRAMBank()){ return false; } } return true; } Stage2::Stage2(std::vector>&units,std::vector>&IMAGES,std::vector>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) :Scenario(units,IMAGES,SOUNDS,objective,game,flags){} void Stage2::Start(){ nextLevel=LevelName::STAGE3; }; void Stage2::Update(){ switch(state){ case 0:{ }break; } }; bool Stage2::MissionCompleted(){ return false; } Stage3::Stage3(std::vector>&units,std::vector>&IMAGES,std::vector>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) :Scenario(units,IMAGES,SOUNDS,objective,game,flags){} void Stage3::Start(){ nextLevel=LevelName::STAGE4; }; void Stage3::Update(){ switch(state){ case 0:{ }break; } }; bool Stage3::MissionCompleted(){ return false; } Stage4::Stage4(std::vector>&units,std::vector>&IMAGES,std::vector>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) :Scenario(units,IMAGES,SOUNDS,objective,game,flags){} void Stage4::Start(){ nextLevel=LevelName::STAGE5; }; void Stage4::Update(){ switch(state){ case 0:{ }break; } }; bool Stage4::MissionCompleted(){ return false; } Stage5::Stage5(std::vector>&units,std::vector>&IMAGES,std::vector>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) :Scenario(units,IMAGES,SOUNDS,objective,game,flags){} void Stage5::Start(){ nextLevel=LevelName::STAGE6; }; void Stage5::Update(){ switch(state){ case 0:{ }break; } }; bool Stage5::MissionCompleted(){ return false; } Stage6::Stage6(std::vector>&units,std::vector>&IMAGES,std::vector>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) :Scenario(units,IMAGES,SOUNDS,objective,game,flags){} void Stage6::Start(){ nextLevel=LevelName::STAGE7; }; void Stage6::Update(){ switch(state){ case 0:{ }break; } }; bool Stage6::MissionCompleted(){ return false; } Stage7::Stage7(std::vector>&units,std::vector>&IMAGES,std::vector>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) :Scenario(units,IMAGES,SOUNDS,objective,game,flags){} void Stage7::Start(){ nextLevel=LevelName::STAGE8; }; void Stage7::Update(){ switch(state){ case 0:{ }break; } }; bool Stage7::MissionCompleted(){ return false; } Stage8::Stage8(std::vector>&units,std::vector>&IMAGES,std::vector>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) :Scenario(units,IMAGES,SOUNDS,objective,game,flags){} void Stage8::Start(){ nextLevel=LevelName::FINISH; }; void Stage8::Update(){ switch(state){ case 0:{ }break; } }; bool Stage8::MissionCompleted(){ return false; }