Scenario 1 implemented.

master
sigonasr2 1 year ago
parent 7e63a0a875
commit f840213233
  1. 2
      olcCodeJam2023Entry/Info.txt
  2. 91
      olcCodeJam2023Entry/Scenario.cpp
  3. 7
      olcCodeJam2023Entry/Scenario.h
  4. 1
      olcCodeJam2023Entry/Sound.h
  5. 6
      olcCodeJam2023Entry/Textbox.cpp
  6. 1
      olcCodeJam2023Entry/Textbox.h
  7. 29
      olcCodeJam2023Entry/VirusAttack.cpp
  8. 3
      olcCodeJam2023Entry/VirusAttack.h
  9. 6
      olcCodeJam2023Entry/olcUTIL_Camera2D.h

@ -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.

@ -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;
} }
} }

@ -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{

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

@ -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;

@ -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);

@ -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(){

@ -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;

@ -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
{ {

Loading…
Cancel
Save