Scenario 1 implemented.

This commit is contained in:
sigonasr2 2023-09-02 04:02:21 -05:00
parent 7e63a0a875
commit f840213233
9 changed files with 122 additions and 24 deletions

View File

@ -56,7 +56,7 @@ Stage 1:
The yellow bar represent a unit's Health memory allocation. Make sure there's always at least 1 bit of it. The yellow bar represent a unit's Health memory allocation. Make sure there's always at least 1 bit of it.
(Simulate dragging over unit and selection) (Simulate dragging over unit and selection)
Highlight over your target unit and then select a target location via right-click. Drag over your target unit and then select a target location via right-click.
That should be all you need for now. I'll be back after my coffee break. That should be all you need for now. I'll be back after my coffee break.

View File

@ -1,4 +1,5 @@
#include "Scenario.h" #include "Scenario.h"
#include "TileManager.h"
Scenario::Scenario(VirusAttack*game) Scenario::Scenario(VirusAttack*game)
:game(game){ :game(game){
@ -12,21 +13,109 @@ void Scenario::_Update(){
Update(); Update();
} }
void Scenario::_Draw(){ void Scenario::_Draw(){
if(game->objective.length()>0){
game->DrawShadowStringDecal({4,24},"Objective:");
game->DrawShadowStringDecal({6,36},game->objective);
}
Draw(); Draw();
} }
void Scenario::DisplayDialog(std::string dialogText,bool spooky){
dialog.Initialize(dialogText,{24,64},"",spooky?game->IMAGES[SPOOK_HOODED_FIGURE].get():game->IMAGES[HOODED_FIGURE].get(),{378,28},game->SOUNDS[Sound::VOICEOVER].get());
}
void Scenario::SetObjective(std::string objective){
game->objective=objective;
}
void Scenario::SetupCameraTarget(vf2d pos){
cameraTargetPos=pos;
camera.SetTarget(cameraTargetPos);
}
void Scenario::MoveCamera(){
game->game.SetWorldOffset(camera.GetViewPosition());
camera.Update(game->GetElapsedTime());
}
Stage1::Stage1(VirusAttack*game) Stage1::Stage1(VirusAttack*game)
:Scenario(game){} :Scenario(game){}
void Stage1::Start(){ void Stage1::Start(){
game->unitMetersGreyedOut=true; game->unitMetersGreyedOut=true;
game->playerInControl=false; game->playerInControl=false;
camera=utils::Camera2D(game->GetScreenSize(),game->game.GetWorldOffset());
camera.SetLazyFollowRate(1);
camera.SetMode(utils::Camera2D::Mode::LazyFollow);
} }
void Stage1::Update(){ void Stage1::Update(){
switch(state){ switch(state){
case 0:{ case 0:{
dialog.Initialize("Hello Hacker, thank you for taking on this request for me.",{24,64},"",game->IMAGES[HOODED_FIGURE].get(),{378,28},game->SOUNDS[Sound::VOICEOVER].get()); DisplayDialog("Hello Hacker, thank you for taking on this request for me.");
if(dialog.bPressed){
dialog.SetVisible(false);
state=1;
}
}break;
case 1:{
DisplayDialog("It appears we have no time to waste, most sectors are already infected and it will just keep getting worse over time.");
if(dialog.bPressed){
dialog.SetVisible(false);
state=2;
}
}break;
case 2:{
game->SOUNDS[Sound::PING]->PlayCentered();
SetupCameraTarget({320,320});
state=3;
}break;
case 3:{
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;
}
}
MoveCamera();
if(camera.ReachedTarget()){
state=4;
}
}break;
case 4:{
DisplayDialog("Your mission is to take out all the RAM banks from the system, this will stop any further creation and spread of viruses.");
if(dialog.bPressed){
dialog.SetVisible(false);
SetupCameraTarget({128,128});
state=5;
}
}break;
case 5:{
MoveCamera();
if(camera.ReachedTarget()){
state=6;
}
}break;
case 6:{
DisplayDialog("The yellow bars represent a unit's Health memory allocation. Make sure there's always at least 1 bit of it.");
if(dialog.bPressed){
state=7;
}
}break;
case 7:{
DisplayDialog("Drag over your target unit and then select a target location via right-click.");
if(dialog.bPressed){
state=8;
}
}break;
case 8:{
DisplayDialog("That should be all you need for now. I'll be back after my coffee break.");
SetObjective("Defeat the RAM bank");
if(dialog.bPressed){
dialog.SetVisible(false);
game->playerInControl=true;
state=9;
}
}break; }break;
} }
} }

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include "VirusAttack.h" #include "VirusAttack.h"
#include "olcUTIL_Camera2D.h"
class Scenario{ class Scenario{
public: public:
@ -9,11 +10,17 @@ public:
virtual void Update()=0; virtual void Update()=0;
void _Draw(); void _Draw();
virtual void Draw()=0; virtual void Draw()=0;
void DisplayDialog(std::string dialogText,bool spooky=false);
void SetObjective(std::string objective);
void SetupCameraTarget(vf2d pos);
void MoveCamera();
protected: protected:
VirusAttack*game; VirusAttack*game;
int state=0; int state=0;
Textbox dialog; Textbox dialog;
float initialWaitTimer=3; float initialWaitTimer=3;
utils::Camera2D camera;
vf2d cameraTargetPos={};
}; };
class Stage1:public Scenario{ class Stage1:public Scenario{

View File

@ -7,4 +7,5 @@ enum class Sound{
BOSS1, BOSS1,
BOSS2, BOSS2,
VOICEOVER, VOICEOVER,
PING,
}; };

View File

@ -38,6 +38,7 @@ void Textbox::SetDefaults(){
headerText=""; headerText="";
audioVolume=0; audioVolume=0;
continueWordTimer=0; continueWordTimer=0;
bPressed=false;
} }
void Textbox::Update(PixelGameEngine*pge){ void Textbox::Update(PixelGameEngine*pge){
@ -56,6 +57,10 @@ void Textbox::Update(PixelGameEngine*pge){
tempText+=text[textboxMarker+1]; tempText+=text[textboxMarker+1];
auto WrapText=[&](std::string&tempText,std::string&text,std::string&displayText,int&lastWordMarker,std::string&lastWord){ auto WrapText=[&](std::string&tempText,std::string&text,std::string&displayText,int&lastWordMarker,std::string&lastWord){
vf2d maxSize=this->maxSize;
if(boxImg!=nullptr){
maxSize-={26,0};
}
if(pge->GetTextSizeProp(tempText).x>=maxSize.x){ if(pge->GetTextSizeProp(tempText).x>=maxSize.x){
displayText=displayText.substr(0,lastWordMarker); displayText=displayText.substr(0,lastWordMarker);
displayText+='\n'; displayText+='\n';
@ -91,6 +96,7 @@ void Textbox::Update(PixelGameEngine*pge){
dialogSound->SetVolume(soundHandle,audioVolume); dialogSound->SetVolume(soundHandle,audioVolume);
} }
} }
bPressed=pge->GetMouse(0).bPressed||pge->GetMouse(1).bPressed;
} }
maxSize.y=std::max(maxSize.y,float(pge->GetTextSizeProp(displayHeaderText).y+pge->GetTextSizeProp(displayText).y)); maxSize.y=std::max(maxSize.y,float(pge->GetTextSizeProp(displayHeaderText).y+pge->GetTextSizeProp(displayText).y));
lastLetterTime=letterDisplayDelay; lastLetterTime=letterDisplayDelay;

View File

@ -37,6 +37,7 @@ public:
vf2d GetSize(); vf2d GetSize();
void SetBackgroundColor(Pixel col); void SetBackgroundColor(Pixel col);
bool IsVisible(); bool IsVisible();
bool bPressed=false;
private: private:
void Update(PixelGameEngine*pge); void Update(PixelGameEngine*pge);
void UpdatePosition(vf2d newPos); void UpdatePosition(vf2d newPos);

View File

@ -75,8 +75,8 @@ void VirusAttack::InitializeLevelData(){
levelData[stage].worldZoom={1,1}; levelData[stage].worldZoom={1,1};
levelData[stage].scenario=scenarios[0]; levelData[stage].scenario=scenarios[0];
levelData[stage].levelColor=DARK_RED; levelData[stage].levelColor=DARK_RED;
levelData[stage].size={64,64}; levelData[stage].size={24,24};
levelData[stage].bgm=Sound::BOSS2; levelData[stage].bgm=Sound::GRAVITY;
levelData[stage].player_starting_resources={500,500,500,500,500}; levelData[stage].player_starting_resources={500,500,500,500,500};
levelData[stage].enemy_starting_resources={0,0,0,0,0}; levelData[stage].enemy_starting_resources={0,0,0,0,0};
{ {
@ -84,26 +84,8 @@ void VirusAttack::InitializeLevelData(){
std::vector<CPData>&collectionPoints=levelData[stage].cpPlacement; std::vector<CPData>&collectionPoints=levelData[stage].cpPlacement;
units.push_back({UnitType::LeftShifter,vf2d{128,128},true}); units.push_back({UnitType::LeftShifter,vf2d{128,128},true});
units.push_back({UnitType::RightShifter,vf2d{129,129},true}); units.push_back({UnitType::LeftShifter,vf2d{128,128},true});
units.push_back({UnitType::BitRestorer,vf2d{130,130},true}); units.push_back({UnitType::RAMBank,vf2d{320,320},false});
units.push_back({UnitType::BitRestorer,vf2d{130,140},true});
units.push_back({UnitType::MemorySwapper,vf2d{131,131},true});
units.push_back({UnitType::Corrupter,vf2d{132,132},true});
units.push_back({UnitType::MemoryAllocator,vf2d{133,133},true});
units.push_back({UnitType::RAMBank,vf2d{134,134},true});
units.push_back({UnitType::MemoryGuard,vf2d{200,134},true});
for(int i=0;i<5;i++){
collectionPoints.push_back({vf2d{32.f+48*i,32.f},0,MemoryType(i)});
collectionPoints.push_back({vf2d{32.f,32.f+48*i},-PI/2,MemoryType(i)});
}
units.push_back({UnitType::RAMBank,vf2d{1200,1200},false});
units.push_back({UnitType::RightShifter,vf2d{1260,1200},false});
units.push_back({UnitType::RightShifter,vf2d{360,300},false});
units.push_back({UnitType::RightShifter,vf2d{361,300},false});
} }
} }
#pragma endregion #pragma endregion
@ -225,6 +207,8 @@ void VirusAttack::LoadLevel(LevelName level){
} }
randomBackgroundOffset={util::random(128),util::random(128)}; randomBackgroundOffset={util::random(128),util::random(128)};
objective="";
} }
void VirusAttack::InitializeGUIs(){ void VirusAttack::InitializeGUIs(){
@ -271,6 +255,7 @@ void VirusAttack::InitializeSounds(){
LoadSound(Sound::BOSS1,"boss1.mp3"); LoadSound(Sound::BOSS1,"boss1.mp3");
LoadSound(Sound::BOSS2,"boss2.mp3"); LoadSound(Sound::BOSS2,"boss2.mp3");
LoadSound(Sound::VOICEOVER,"voice.mp3"); LoadSound(Sound::VOICEOVER,"voice.mp3");
LoadSound(Sound::PING,"ping.mp3");
} }
bool VirusAttack::UnitCreationClickHandled(){ bool VirusAttack::UnitCreationClickHandled(){

View File

@ -26,6 +26,7 @@ struct Letter{
class VirusAttack : public olc::PixelGameEngine class VirusAttack : public olc::PixelGameEngine
{ {
friend class Scenario;
friend class Stage1; friend class Stage1;
private: private:
#ifdef SPLASH_ENABLED #ifdef SPLASH_ENABLED
@ -87,6 +88,8 @@ private:
bool unitMetersGreyedOut=false; //If true, all but health meters show up as dark grey. bool unitMetersGreyedOut=false; //If true, all but health meters show up as dark grey.
bool playerInControl=true; bool playerInControl=true;
std::string objective="";
vf2d randomBackgroundOffset; vf2d randomBackgroundOffset;
vf2d startingDragPos=CONSTANT::UNSELECTED; vf2d startingDragPos=CONSTANT::UNSELECTED;

View File

@ -147,6 +147,12 @@ namespace olc::utils
return m_bWorldBoundary; return m_bWorldBoundary;
} }
inline bool ReachedTarget() const
{
float dist=sqrt(pow(m_vPosition.x-GetTarget().x,2)+pow(m_vPosition.y-GetTarget().y,2));
return dist<=4;
}
// Get the world boundary rectangle position // Get the world boundary rectangle position
inline const olc::vf2d& GetWorldBoundaryPosition() const inline const olc::vf2d& GetWorldBoundaryPosition() const
{ {