Support for text dialog, audio handling, and click to continue support.
This commit is contained in:
parent
1493faa8e5
commit
7e63a0a875
@ -40,5 +40,7 @@ enum Image{
|
|||||||
GUIDE,
|
GUIDE,
|
||||||
ROUND_BAR,
|
ROUND_BAR,
|
||||||
SEGMENT_BAR,
|
SEGMENT_BAR,
|
||||||
|
HOODED_FIGURE,
|
||||||
|
SPOOK_HOODED_FIGURE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,9 +1,14 @@
|
|||||||
#include "Scenario.h"
|
#include "Scenario.h"
|
||||||
|
|
||||||
Scenario::Scenario(VirusAttack*game)
|
Scenario::Scenario(VirusAttack*game)
|
||||||
:game(game){}
|
:game(game){
|
||||||
|
dialog.SetVisible(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scenario::Start(){}
|
||||||
|
|
||||||
void Scenario::_Update(){
|
void Scenario::_Update(){
|
||||||
|
initialWaitTimer=std::max(0.f,initialWaitTimer-game->GetElapsedTime());
|
||||||
Update();
|
Update();
|
||||||
}
|
}
|
||||||
void Scenario::_Draw(){
|
void Scenario::_Draw(){
|
||||||
@ -13,10 +18,18 @@ void Scenario::_Draw(){
|
|||||||
Stage1::Stage1(VirusAttack*game)
|
Stage1::Stage1(VirusAttack*game)
|
||||||
:Scenario(game){}
|
:Scenario(game){}
|
||||||
|
|
||||||
|
void Stage1::Start(){
|
||||||
|
game->unitMetersGreyedOut=true;
|
||||||
|
game->playerInControl=false;
|
||||||
|
}
|
||||||
|
|
||||||
void Stage1::Update(){
|
void Stage1::Update(){
|
||||||
|
switch(state){
|
||||||
|
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());
|
||||||
|
}break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void Stage1::Draw(){
|
void Stage1::Draw(){
|
||||||
|
dialog.UpdateAndDraw({24,64},game,game->player_resources,game->IMAGES,game->GetTotalUsedMemory(),game->currentLevel->availableMemory);
|
||||||
}
|
}
|
@ -2,19 +2,24 @@
|
|||||||
#include "VirusAttack.h"
|
#include "VirusAttack.h"
|
||||||
|
|
||||||
class Scenario{
|
class Scenario{
|
||||||
VirusAttack*game;
|
|
||||||
public:
|
public:
|
||||||
Scenario(VirusAttack*game);
|
Scenario(VirusAttack*game);
|
||||||
|
virtual void Start();
|
||||||
void _Update();
|
void _Update();
|
||||||
virtual void Update()=0;
|
virtual void Update()=0;
|
||||||
void _Draw();
|
void _Draw();
|
||||||
virtual void Draw()=0;
|
virtual void Draw()=0;
|
||||||
protected:
|
protected:
|
||||||
|
VirusAttack*game;
|
||||||
|
int state=0;
|
||||||
|
Textbox dialog;
|
||||||
|
float initialWaitTimer=3;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Stage1:public Scenario{
|
class Stage1:public Scenario{
|
||||||
public:
|
public:
|
||||||
Stage1(VirusAttack*game);
|
Stage1(VirusAttack*game);
|
||||||
|
void Start()override;
|
||||||
void Update()override;
|
void Update()override;
|
||||||
void Draw()override;
|
void Draw()override;
|
||||||
};
|
};
|
@ -6,4 +6,5 @@ enum class Sound{
|
|||||||
COSMOS,
|
COSMOS,
|
||||||
BOSS1,
|
BOSS1,
|
||||||
BOSS2,
|
BOSS2,
|
||||||
|
VOICEOVER,
|
||||||
};
|
};
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
Textbox::Textbox(){};
|
Textbox::Textbox(){};
|
||||||
|
|
||||||
void Textbox::Initialize(std::string text,vf2d pos,std::string headerText,vf2d maxSize,std::vector<Memory>resourceCost,float letterDisplayDelay)
|
void Textbox::Initialize(std::string text,vf2d pos,std::string headerText,Renderable*boxImg,vf2d maxSize,Audio*dialogSound,std::vector<Memory>resourceCost,float letterDisplayDelay)
|
||||||
{
|
{
|
||||||
if(GetCurrentString()!=text){ //Make sure this is actually a new textbox
|
if(GetCurrentString()!=text){ //Make sure this is actually a new textbox
|
||||||
SetDefaults();
|
SetDefaults();
|
||||||
@ -13,6 +13,14 @@ void Textbox::Initialize(std::string text,vf2d pos,std::string headerText,vf2d m
|
|||||||
this->maxSize=maxSize;
|
this->maxSize=maxSize;
|
||||||
this->resourceCost=resourceCost;
|
this->resourceCost=resourceCost;
|
||||||
this->letterDisplayDelay=letterDisplayDelay;
|
this->letterDisplayDelay=letterDisplayDelay;
|
||||||
|
this->boxImg=boxImg;
|
||||||
|
if(this->dialogSound!=nullptr){
|
||||||
|
this->dialogSound->Stop(soundHandle);
|
||||||
|
}
|
||||||
|
if(dialogSound!=nullptr){
|
||||||
|
this->dialogSound=dialogSound;
|
||||||
|
soundHandle=this->dialogSound->PlayCentered(1,audioVolume,true);
|
||||||
|
}
|
||||||
visible=true;
|
visible=true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -28,11 +36,20 @@ void Textbox::SetDefaults(){
|
|||||||
displayHeaderText="";
|
displayHeaderText="";
|
||||||
text="";
|
text="";
|
||||||
headerText="";
|
headerText="";
|
||||||
|
audioVolume=0;
|
||||||
|
continueWordTimer=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Textbox::Update(PixelGameEngine*pge){
|
void Textbox::Update(PixelGameEngine*pge){
|
||||||
if(!visible)return;
|
if(!visible){
|
||||||
|
if(dialogSound!=nullptr){
|
||||||
|
audioVolume=std::max(0.f,audioVolume-pge->GetElapsedTime()*2);
|
||||||
|
dialogSound->SetVolume(soundHandle,audioVolume);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
lastLetterTime-=pge->GetElapsedTime();
|
lastLetterTime-=pge->GetElapsedTime();
|
||||||
|
continueWordTimer+=pge->GetElapsedTime();
|
||||||
if(lastLetterTime<=0){
|
if(lastLetterTime<=0){
|
||||||
if(textboxMarker<int(text.length()-1)){
|
if(textboxMarker<int(text.length()-1)){
|
||||||
std::string tempText=displayText;
|
std::string tempText=displayText;
|
||||||
@ -61,6 +78,19 @@ void Textbox::Update(PixelGameEngine*pge){
|
|||||||
WrapText(tempHeaderText,headerText,displayHeaderText,lastHeaderWordMarker,lastHeaderWord);
|
WrapText(tempHeaderText,headerText,displayHeaderText,lastHeaderWordMarker,lastHeaderWord);
|
||||||
}
|
}
|
||||||
textboxMarker++;
|
textboxMarker++;
|
||||||
|
if(dialogSound!=nullptr){
|
||||||
|
audioVolume=std::min(1.f,audioVolume+0.01f*2);
|
||||||
|
dialogSound->SetVolume(soundHandle,audioVolume);
|
||||||
|
audioFadeOutDelay=2;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if(dialogSound!=nullptr){
|
||||||
|
audioFadeOutDelay=std::max(0.f,audioFadeOutDelay-0.01f);
|
||||||
|
if(audioFadeOutDelay<=0){
|
||||||
|
audioVolume=std::max(0.f,audioVolume-0.01f*2);
|
||||||
|
dialogSound->SetVolume(soundHandle,audioVolume);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
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;
|
||||||
@ -70,29 +100,46 @@ void Textbox::Update(PixelGameEngine*pge){
|
|||||||
|
|
||||||
void Textbox::Draw(PixelGameEngine*pge,Resources&resources,std::map<Image,std::unique_ptr<Renderable>>&IMAGES,int totalUsedMemory,int memoryLimit){
|
void Textbox::Draw(PixelGameEngine*pge,Resources&resources,std::map<Image,std::unique_ptr<Renderable>>&IMAGES,int totalUsedMemory,int memoryLimit){
|
||||||
if(visible){
|
if(visible){
|
||||||
geom2d::rect<float>boxRect={pos-vf2d{3,3},maxSize+vf2d{6,6}};
|
geom2d::rect<float>boundingRect={pos-vf2d{3,3},maxSize+vf2d{6,6}};
|
||||||
if(resourceCost.size()>0){
|
if(resourceCost.size()>0){
|
||||||
boxRect.size.x+=36;
|
boundingRect.size.x+=36;
|
||||||
boxRect.size.y=std::max(36.f,boxRect.size.y);
|
boundingRect.size.y=std::max(36.f,boundingRect.size.y);
|
||||||
}
|
}
|
||||||
if(boxRect.bottom().start.y>=pge->ScreenHeight()){
|
if(boxImg!=nullptr){
|
||||||
boxRect.pos-={0,boxRect.bottom().start.y-pge->ScreenHeight()};
|
boundingRect.size.x+=26;
|
||||||
}
|
}
|
||||||
if(boxRect.right().start.x>=pge->ScreenWidth()){
|
if(boundingRect.bottom().start.y>=pge->ScreenHeight()){
|
||||||
boxRect.pos-={boxRect.right().start.x-pge->ScreenWidth(),0};
|
boundingRect.pos-={0,boundingRect.bottom().start.y-pge->ScreenHeight()};
|
||||||
}
|
}
|
||||||
if(boxRect.top().start.y<0){
|
if(boundingRect.right().start.x>=pge->ScreenWidth()){
|
||||||
boxRect.pos+={0,-boxRect.top().start.y};
|
boundingRect.pos-={boundingRect.right().start.x-pge->ScreenWidth(),0};
|
||||||
}
|
}
|
||||||
if(boxRect.left().start.x<0){
|
if(boundingRect.top().start.y<0){
|
||||||
boxRect.pos+={-boxRect.left().start.x,0};
|
boundingRect.pos+={0,-boundingRect.top().start.y};
|
||||||
|
}
|
||||||
|
if(boundingRect.left().start.x<0){
|
||||||
|
boundingRect.pos+={-boundingRect.left().start.x,0};
|
||||||
|
}
|
||||||
|
geom2d::rect<float>textboxRect=boundingRect;
|
||||||
|
if(boxImg!=nullptr){
|
||||||
|
textboxRect.pos.x+=26;
|
||||||
|
textboxRect.size.x-=50;
|
||||||
|
}
|
||||||
|
pge->FillRectDecal(boundingRect.pos,maxSize+vf2d{6,6},backCol);
|
||||||
|
pge->DrawRectDecal(boundingRect.pos+vf2d{1,1},maxSize+vf2d{4,4},WHITE);
|
||||||
|
pge->DrawDecal(boundingRect.pos+vf2d{3,3},IMAGES[MATRIX]->Decal(),{0.375,0.375},DARK_GREY);
|
||||||
|
if(boxImg!=nullptr){
|
||||||
|
pge->DrawDecal(boundingRect.pos+vf2d{3,3},boxImg->Decal());
|
||||||
|
}
|
||||||
|
pge->DrawRectDecal(boundingRect.pos+vf2d{3,3},{24,24},YELLOW);
|
||||||
|
pge->DrawShadowStringPropDecal(textboxRect.pos+vf2d{3,3},displayHeaderText,{245, 218, 66});
|
||||||
|
pge->DrawShadowStringPropDecal(textboxRect.pos+vf2d{3.f,float(3+pge->GetTextSizeProp(displayHeaderText).y)},displayText,{220,220,220});
|
||||||
|
if(textboxMarker==int(text.length()-1)){
|
||||||
|
std::string continueText="Click to Continue";
|
||||||
|
pge->DrawShadowStringPropDecal(textboxRect.pos+textboxRect.size-vf2d(pge->GetTextSizeProp(continueText))*vf2d{0.6,1}-vf2d{5,-9},continueText,{255,255,255,uint8_t(abs(sin(2*continueWordTimer))*255)},{0,0,0,uint8_t(abs(sin(2*continueWordTimer))*255)},{0.6,1});
|
||||||
}
|
}
|
||||||
pge->FillRectDecal(boxRect.pos,maxSize+vf2d{6,6},backCol);
|
|
||||||
pge->DrawRectDecal(boxRect.pos+vf2d{1,1},maxSize+vf2d{4,4},WHITE);
|
|
||||||
pge->DrawShadowStringPropDecal(boxRect.pos+vf2d{3,3},displayHeaderText,{245, 218, 66});
|
|
||||||
pge->DrawShadowStringPropDecal(boxRect.pos+vf2d{3.f,float(3+pge->GetTextSizeProp(displayHeaderText).y)},displayText,{220,220,220});
|
|
||||||
if(resourceCost.size()>0){
|
if(resourceCost.size()>0){
|
||||||
geom2d::rect<float>resourceBoxRect={boxRect.pos+vf2d{6+maxSize.x,0},{36,42}};
|
geom2d::rect<float>resourceBoxRect={textboxRect.pos+vf2d{6+maxSize.x,0},{36,42}};
|
||||||
pge->FillRectDecal(resourceBoxRect.pos,resourceBoxRect.size,backCol);
|
pge->FillRectDecal(resourceBoxRect.pos,resourceBoxRect.size,backCol);
|
||||||
pge->DrawRectDecal(resourceBoxRect.pos+vf2d{1,1},resourceBoxRect.size-vf2d{2,2},WHITE);
|
pge->DrawRectDecal(resourceBoxRect.pos+vf2d{1,1},resourceBoxRect.size-vf2d{2,2},WHITE);
|
||||||
vf2d contentPos=resourceBoxRect.pos+vf2d{3,3};
|
vf2d contentPos=resourceBoxRect.pos+vf2d{3,3};
|
||||||
|
@ -9,12 +9,18 @@ class Textbox{
|
|||||||
std::string displayHeaderText="";
|
std::string displayHeaderText="";
|
||||||
std::string text="";
|
std::string text="";
|
||||||
std::string displayText="";
|
std::string displayText="";
|
||||||
|
Renderable*boxImg;
|
||||||
|
Audio*dialogSound;
|
||||||
|
int soundHandle=-1;
|
||||||
|
float audioFadeOutDelay=2;
|
||||||
vf2d pos={};
|
vf2d pos={};
|
||||||
vf2d maxSize={};
|
vf2d maxSize={};
|
||||||
|
float audioVolume=0;
|
||||||
float lastLetterTime=0;
|
float lastLetterTime=0;
|
||||||
float letterDisplayDelay=0.01;
|
float letterDisplayDelay=0.01;
|
||||||
int textboxMarker=-1;
|
int textboxMarker=-1;
|
||||||
int lastWordMarker=-1;
|
int lastWordMarker=-1;
|
||||||
|
float continueWordTimer=0;
|
||||||
std::string lastWord="";
|
std::string lastWord="";
|
||||||
int lastHeaderWordMarker=-1;
|
int lastHeaderWordMarker=-1;
|
||||||
std::string lastHeaderWord="";
|
std::string lastHeaderWord="";
|
||||||
@ -23,7 +29,7 @@ class Textbox{
|
|||||||
Pixel backCol=CONSTANT::MESSAGE_BOX_DEFAULT_BACKCOL;
|
Pixel backCol=CONSTANT::MESSAGE_BOX_DEFAULT_BACKCOL;
|
||||||
public:
|
public:
|
||||||
Textbox();
|
Textbox();
|
||||||
void Initialize(std::string text,vf2d pos={},std::string headerText="",vf2d maxSize={120,1},std::vector<Memory>resourceCost={},float letterDisplayDelay=0.01);
|
void Initialize(std::string text,vf2d pos={},std::string headerText="",Renderable*boxImg=nullptr,vf2d maxSize={120,1},Audio*dialogSound=nullptr,std::vector<Memory>resourceCost={},float letterDisplayDelay=0.01);
|
||||||
|
|
||||||
void UpdateAndDraw(vf2d pos,PixelGameEngine*pge,Resources&resources,std::map<Image,std::unique_ptr<Renderable>>&IMAGES,int totalUsedMemory,int memoryLimit);
|
void UpdateAndDraw(vf2d pos,PixelGameEngine*pge,Resources&resources,std::map<Image,std::unique_ptr<Renderable>>&IMAGES,int totalUsedMemory,int memoryLimit);
|
||||||
std::string&GetCurrentString();
|
std::string&GetCurrentString();
|
||||||
|
@ -483,7 +483,7 @@ void Unit::Draw(TileTransformedView&game,std::map<Image,std::unique_ptr<Renderab
|
|||||||
|
|
||||||
void Unit::DrawHud(TileTransformedView&game,std::map<Image,std::unique_ptr<Renderable>>&IMAGES){}
|
void Unit::DrawHud(TileTransformedView&game,std::map<Image,std::unique_ptr<Renderable>>&IMAGES){}
|
||||||
|
|
||||||
void Unit::_DrawHud(TileTransformedView&game,std::map<Image,std::unique_ptr<Renderable>>&IMAGES){
|
void Unit::_DrawHud(TileTransformedView&game,std::map<Image,std::unique_ptr<Renderable>>&IMAGES,bool unitMetersGreyedOut){
|
||||||
DrawHud(game,IMAGES);
|
DrawHud(game,IMAGES);
|
||||||
int initialBarX=ghostPos.x-GetMemorySize()/2*CONSTANT::BAR_SQUARE_SIZE.x-CONSTANT::BAR_SQUARE_SIZE.x/2;
|
int initialBarX=ghostPos.x-GetMemorySize()/2*CONSTANT::BAR_SQUARE_SIZE.x-CONSTANT::BAR_SQUARE_SIZE.x/2;
|
||||||
int initialBarY=ghostPos.y-CONSTANT::BAR_SQUARE_SIZE.y-img.Sprite()->height/2-2;
|
int initialBarY=ghostPos.y-CONSTANT::BAR_SQUARE_SIZE.y-img.Sprite()->height/2-2;
|
||||||
@ -495,16 +495,16 @@ void Unit::_DrawHud(TileTransformedView&game,std::map<Image,std::unique_ptr<Rend
|
|||||||
col=CONSTANT::HEALTH_COLOR;
|
col=CONSTANT::HEALTH_COLOR;
|
||||||
}
|
}
|
||||||
if(range.index==i&&range.size>0){
|
if(range.index==i&&range.size>0){
|
||||||
col=CONSTANT::RANGE_COLOR;
|
col=unitMetersGreyedOut?VERY_DARK_GREY:CONSTANT::RANGE_COLOR;
|
||||||
}
|
}
|
||||||
if(atkSpd.index==i&&atkSpd.size>0){
|
if(atkSpd.index==i&&atkSpd.size>0){
|
||||||
col=CONSTANT::ATKSPD_COLOR;
|
col=unitMetersGreyedOut?VERY_DARK_GREY:CONSTANT::ATKSPD_COLOR;
|
||||||
}
|
}
|
||||||
if(moveSpd.index==i&&moveSpd.size>0){
|
if(moveSpd.index==i&&moveSpd.size>0){
|
||||||
col=CONSTANT::MOVESPD_COLOR;
|
col=unitMetersGreyedOut?VERY_DARK_GREY:CONSTANT::MOVESPD_COLOR;
|
||||||
}
|
}
|
||||||
if(procedure.index==i&&procedure.size>0){
|
if(procedure.index==i&&procedure.size>0){
|
||||||
col=CONSTANT::PROCEDURE_COLOR;
|
col=unitMetersGreyedOut?VERY_DARK_GREY:CONSTANT::PROCEDURE_COLOR;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -514,19 +514,19 @@ void Unit::_DrawHud(TileTransformedView&game,std::map<Image,std::unique_ptr<Rend
|
|||||||
}
|
}
|
||||||
if(GetAtkSpd()>0){
|
if(GetAtkSpd()>0){
|
||||||
game.FillRectDecal(vf2d{float(initialBarX)+atkSpd.index*CONSTANT::BAR_SQUARE_SIZE.x,
|
game.FillRectDecal(vf2d{float(initialBarX)+atkSpd.index*CONSTANT::BAR_SQUARE_SIZE.x,
|
||||||
float(initialBarY)}-vf2d{0,1},CONSTANT::BAR_SQUARE_SIZE+vf2d{CONSTANT::BAR_SQUARE_SIZE.x*atkSpd.size-1,2},CONSTANT::ATKSPD_COLOR);
|
float(initialBarY)}-vf2d{0,1},CONSTANT::BAR_SQUARE_SIZE+vf2d{CONSTANT::BAR_SQUARE_SIZE.x*atkSpd.size-1,2},unitMetersGreyedOut?VERY_DARK_GREY:CONSTANT::ATKSPD_COLOR);
|
||||||
}
|
}
|
||||||
if(GetMoveSpd()>0){
|
if(GetMoveSpd()>0){
|
||||||
game.FillRectDecal(vf2d{float(initialBarX)+moveSpd.index*CONSTANT::BAR_SQUARE_SIZE.x,
|
game.FillRectDecal(vf2d{float(initialBarX)+moveSpd.index*CONSTANT::BAR_SQUARE_SIZE.x,
|
||||||
float(initialBarY)}-vf2d{0,1},CONSTANT::BAR_SQUARE_SIZE+vf2d{CONSTANT::BAR_SQUARE_SIZE.x*moveSpd.size-1,2},CONSTANT::MOVESPD_COLOR);
|
float(initialBarY)}-vf2d{0,1},CONSTANT::BAR_SQUARE_SIZE+vf2d{CONSTANT::BAR_SQUARE_SIZE.x*moveSpd.size-1,2},unitMetersGreyedOut?VERY_DARK_GREY:CONSTANT::MOVESPD_COLOR);
|
||||||
}
|
}
|
||||||
if(GetProcedure()>0){
|
if(GetProcedure()>0){
|
||||||
game.FillRectDecal(vf2d{float(initialBarX)+procedure.index*CONSTANT::BAR_SQUARE_SIZE.x,
|
game.FillRectDecal(vf2d{float(initialBarX)+procedure.index*CONSTANT::BAR_SQUARE_SIZE.x,
|
||||||
float(initialBarY)}-vf2d{0,1},CONSTANT::BAR_SQUARE_SIZE+vf2d{CONSTANT::BAR_SQUARE_SIZE.x*procedure.size-1,2},CONSTANT::PROCEDURE_COLOR);
|
float(initialBarY)}-vf2d{0,1},CONSTANT::BAR_SQUARE_SIZE+vf2d{CONSTANT::BAR_SQUARE_SIZE.x*procedure.size-1,2},unitMetersGreyedOut?VERY_DARK_GREY:CONSTANT::PROCEDURE_COLOR);
|
||||||
}
|
}
|
||||||
if(GetRange()>0){
|
if(GetRange()>0){
|
||||||
game.FillRectDecal(vf2d{float(initialBarX)+range.index*CONSTANT::BAR_SQUARE_SIZE.x,
|
game.FillRectDecal(vf2d{float(initialBarX)+range.index*CONSTANT::BAR_SQUARE_SIZE.x,
|
||||||
float(initialBarY)}-vf2d{0,1},CONSTANT::BAR_SQUARE_SIZE+vf2d{CONSTANT::BAR_SQUARE_SIZE.x*range.size-1,2},CONSTANT::RANGE_COLOR);
|
float(initialBarY)}-vf2d{0,1},CONSTANT::BAR_SQUARE_SIZE+vf2d{CONSTANT::BAR_SQUARE_SIZE.x*range.size-1,2},unitMetersGreyedOut?VERY_DARK_GREY:CONSTANT::RANGE_COLOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i=0;i<GetMemorySize();i++){
|
for(int i=0;i<GetMemorySize();i++){
|
||||||
|
@ -54,7 +54,7 @@ public:
|
|||||||
virtual void Attack(Unit&victim,std::vector<std::shared_ptr<Unit>>&otherUnits)=0;
|
virtual void Attack(Unit&victim,std::vector<std::shared_ptr<Unit>>&otherUnits)=0;
|
||||||
virtual void Draw(TileTransformedView&game,std::map<Image,std::unique_ptr<Renderable>>&IMAGES);
|
virtual void Draw(TileTransformedView&game,std::map<Image,std::unique_ptr<Renderable>>&IMAGES);
|
||||||
virtual void DrawHud(TileTransformedView&game,std::map<Image,std::unique_ptr<Renderable>>&IMAGES);
|
virtual void DrawHud(TileTransformedView&game,std::map<Image,std::unique_ptr<Renderable>>&IMAGES);
|
||||||
void _DrawHud(TileTransformedView&game,std::map<Image,std::unique_ptr<Renderable>>&IMAGES);
|
void _DrawHud(TileTransformedView&game,std::map<Image,std::unique_ptr<Renderable>>&IMAGES,bool unitMetersGreyedOut);
|
||||||
virtual void OnDeath(std::map<Sound,std::unique_ptr<Audio>>&SOUNDS);
|
virtual void OnDeath(std::map<Sound,std::unique_ptr<Audio>>&SOUNDS);
|
||||||
bool IsFriendly();
|
bool IsFriendly();
|
||||||
bool IsSelected();
|
bool IsSelected();
|
||||||
|
@ -62,6 +62,8 @@ void VirusAttack::InitializeImages(){
|
|||||||
LoadImage(GUIDE,"assets/guide.png");
|
LoadImage(GUIDE,"assets/guide.png");
|
||||||
LoadImage(ROUND_BAR,"assets/round_bar.png");
|
LoadImage(ROUND_BAR,"assets/round_bar.png");
|
||||||
LoadImage(SEGMENT_BAR,"assets/segmentBar.png",false,false);
|
LoadImage(SEGMENT_BAR,"assets/segmentBar.png",false,false);
|
||||||
|
LoadImage(HOODED_FIGURE,"assets/hooded_figure.png");
|
||||||
|
LoadImage(SPOOK_HOODED_FIGURE,"assets/spook_hooded_figure.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
void VirusAttack::InitializeLevelData(){
|
void VirusAttack::InitializeLevelData(){
|
||||||
@ -144,6 +146,7 @@ bool VirusAttack::OnUserCreate(){
|
|||||||
testBox.SetVisible(false);
|
testBox.SetVisible(false);
|
||||||
memoryAllocatorBox.Initialize(CONSTANT::MEMORY_ALLOCATOR_BOX_DISPLAY_STRING,{},CONSTANT::MEMORY_ALLOCATOR_BOX_HEADER_STRING);
|
memoryAllocatorBox.Initialize(CONSTANT::MEMORY_ALLOCATOR_BOX_DISPLAY_STRING,{},CONSTANT::MEMORY_ALLOCATOR_BOX_HEADER_STRING);
|
||||||
memoryAllocatorBox.SetVisible(false);
|
memoryAllocatorBox.SetVisible(false);
|
||||||
|
platformCreationBox.SetVisible(false);
|
||||||
|
|
||||||
IMAGES[MINIMAP_OUTLINE]=std::make_unique<Renderable>();
|
IMAGES[MINIMAP_OUTLINE]=std::make_unique<Renderable>();
|
||||||
IMAGES[MINIMAP_OUTLINE]->Create(64,64);
|
IMAGES[MINIMAP_OUTLINE]->Create(64,64);
|
||||||
@ -160,7 +163,7 @@ bool VirusAttack::OnUserCreate(){
|
|||||||
InitializeLevelData();
|
InitializeLevelData();
|
||||||
|
|
||||||
LoadLevel(STAGE1);
|
LoadLevel(STAGE1);
|
||||||
|
currentLevel->scenario->Start();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,6 +246,9 @@ void VirusAttack::InitializeGUIs(){
|
|||||||
refresherButton=new QuickGUI::ImageButton(platformCreationList,*IMAGES[REFRESHER],{0.25,0.25},{float(ScreenWidth()-48),48.f+32*1},{20,20});
|
refresherButton=new QuickGUI::ImageButton(platformCreationList,*IMAGES[REFRESHER],{0.25,0.25},{float(ScreenWidth()-48),48.f+32*1},{20,20});
|
||||||
turretButton=new QuickGUI::ImageButton(platformCreationList,*IMAGES[TURRET],{0.25,0.25},{float(ScreenWidth()-48),48.f+32*2},{20,20});
|
turretButton=new QuickGUI::ImageButton(platformCreationList,*IMAGES[TURRET],{0.25,0.25},{float(ScreenWidth()-48),48.f+32*2},{20,20});
|
||||||
memoryGuardButton=new QuickGUI::ImageButton(platformCreationList,*IMAGES[MEMORY_GUARD],{0.25,0.25},{float(ScreenWidth()-48),48.f+32*3},{20,20});
|
memoryGuardButton=new QuickGUI::ImageButton(platformCreationList,*IMAGES[MEMORY_GUARD],{0.25,0.25},{float(ScreenWidth()-48),48.f+32*3},{20,20});
|
||||||
|
|
||||||
|
unitCreationList.DisplayAllControls(false);
|
||||||
|
platformCreationList.DisplayAllControls(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VirusAttack::InitializeScenarios(){
|
void VirusAttack::InitializeScenarios(){
|
||||||
@ -264,6 +270,7 @@ void VirusAttack::InitializeSounds(){
|
|||||||
LoadSound(Sound::COSMOS,"cosmos.mp3");
|
LoadSound(Sound::COSMOS,"cosmos.mp3");
|
||||||
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");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VirusAttack::UnitCreationClickHandled(){
|
bool VirusAttack::UnitCreationClickHandled(){
|
||||||
@ -296,7 +303,7 @@ bool VirusAttack::UnitCreationClickHandled(){
|
|||||||
#define EnableAndHoverCheck(UnitClass,Button,box) \
|
#define EnableAndHoverCheck(UnitClass,Button,box) \
|
||||||
Button->Enable(CanAfford(player_resources,UnitClass::resourceCost)); \
|
Button->Enable(CanAfford(player_resources,UnitClass::resourceCost)); \
|
||||||
if(Button->bHover){ \
|
if(Button->bHover){ \
|
||||||
box.Initialize(UnitClass::unitDescription, GetMousePos(), UnitClass::unitName,{120,36},UnitClass::resourceCost); \
|
box.Initialize(UnitClass::unitDescription, GetMousePos(), UnitClass::unitName,nullptr,{120,36},nullptr,UnitClass::resourceCost); \
|
||||||
hovering=true; \
|
hovering=true; \
|
||||||
if(CanAfford(player_resources,UnitClass::resourceCost)){ \
|
if(CanAfford(player_resources,UnitClass::resourceCost)){ \
|
||||||
box.SetBackgroundColor(CONSTANT::MESSAGE_BOX_DEFAULT_BACKCOL); \
|
box.SetBackgroundColor(CONSTANT::MESSAGE_BOX_DEFAULT_BACKCOL); \
|
||||||
@ -657,22 +664,17 @@ void VirusAttack::RenderCollectionPoints(CollectionPoint*cp){
|
|||||||
|
|
||||||
bool VirusAttack::OnUserUpdate(float fElapsedTime){
|
bool VirusAttack::OnUserUpdate(float fElapsedTime){
|
||||||
UpdateMatrixTexture(fElapsedTime);
|
UpdateMatrixTexture(fElapsedTime);
|
||||||
HandleDraggingSelection();
|
if(playerInControl){
|
||||||
HandleRightClickMove();
|
HandleDraggingSelection();
|
||||||
HandlePanAndZoom(fElapsedTime);
|
HandleRightClickMove();
|
||||||
HandleMinimapClick();
|
HandlePanAndZoom(fElapsedTime);
|
||||||
|
HandleMinimapClick();
|
||||||
|
}
|
||||||
currentLevel->scenario->_Update();
|
currentLevel->scenario->_Update();
|
||||||
AL.vecPos=game.ScreenToWorld(GetScreenSize()/2);
|
AL.vecPos=game.ScreenToWorld(GetScreenSize()/2);
|
||||||
AL.fSoundFXVolume=std::min(1.f,game.GetWorldScale().x);
|
AL.fSoundFXVolume=std::min(1.f,game.GetWorldScale().x);
|
||||||
AL.OnUserUpdate(fElapsedTime);
|
AL.OnUserUpdate(fElapsedTime);
|
||||||
|
|
||||||
if(GetKey(P).bPressed){
|
|
||||||
LoadLevel(STAGE1);
|
|
||||||
}
|
|
||||||
if(GetKey(O).bPressed){
|
|
||||||
LoadLevel(STAGE2);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(auto&tile:TileManager::visibleTiles){
|
for(auto&tile:TileManager::visibleTiles){
|
||||||
tile.second-=fElapsedTime;
|
tile.second-=fElapsedTime;
|
||||||
}
|
}
|
||||||
@ -760,7 +762,7 @@ bool VirusAttack::OnUserUpdate(float fElapsedTime){
|
|||||||
std::erase_if(resourceGainIcons,[](ResourceGainIcon&icon){return icon.lifetime<=0;});
|
std::erase_if(resourceGainIcons,[](ResourceGainIcon&icon){return icon.lifetime<=0;});
|
||||||
|
|
||||||
for(auto&u:units){
|
for(auto&u:units){
|
||||||
u->_DrawHud(game,IMAGES);
|
u->_DrawHud(game,IMAGES,unitMetersGreyedOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawSelectionRectangle();
|
DrawSelectionRectangle();
|
||||||
|
@ -84,6 +84,8 @@ private:
|
|||||||
float memoryDisplayDelay=0;
|
float memoryDisplayDelay=0;
|
||||||
bool memoryIncreased=true;
|
bool memoryIncreased=true;
|
||||||
float memoryChangeTimer=2;
|
float memoryChangeTimer=2;
|
||||||
|
bool unitMetersGreyedOut=false; //If true, all but health meters show up as dark grey.
|
||||||
|
bool playerInControl=true;
|
||||||
|
|
||||||
vf2d randomBackgroundOffset;
|
vf2d randomBackgroundOffset;
|
||||||
|
|
||||||
|
BIN
olcCodeJam2023Entry/assets/hooded_figure.png
Normal file
BIN
olcCodeJam2023Entry/assets/hooded_figure.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 779 B |
BIN
olcCodeJam2023Entry/assets/spook_hooded_figure.png
Normal file
BIN
olcCodeJam2023Entry/assets/spook_hooded_figure.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 827 B |
@ -104,7 +104,7 @@ public:
|
|||||||
// Instruct Audio Listener to load this sound (if not loaded already)
|
// Instruct Audio Listener to load this sound (if not loaded already)
|
||||||
void LoadAudioSample(int ID, const char* fileName);
|
void LoadAudioSample(int ID, const char* fileName);
|
||||||
|
|
||||||
void PlayCentered(float speed = 1.0f, float vol = 1.0f, bool looping = false, bool paused = false);
|
int PlayCentered(float speed = 1.0f, float vol = 1.0f, bool looping = false, bool paused = false);
|
||||||
|
|
||||||
// Play the Audio Sample, with given parameters
|
// Play the Audio Sample, with given parameters
|
||||||
int Play(vf2d pos, float speed = 1.0f, float vol = 1.0f, bool looping = false, bool paused = false);
|
int Play(vf2d pos, float speed = 1.0f, float vol = 1.0f, bool looping = false, bool paused = false);
|
||||||
@ -122,6 +122,7 @@ public:
|
|||||||
|
|
||||||
// Adjust Volume
|
// Adjust Volume
|
||||||
void SetVolume(float vol, float minVol = 0.0f, float maxVol = 1.0f);
|
void SetVolume(float vol, float minVol = 0.0f, float maxVol = 1.0f);
|
||||||
|
void SetVolume(int handle,float vol);
|
||||||
|
|
||||||
// Set Default Parameters
|
// Set Default Parameters
|
||||||
void SetDefaults(float speed, float vol, float minVol, float maxVol, bool looping);
|
void SetDefaults(float speed, float vol, float minVol, float maxVol, bool looping);
|
||||||
@ -140,7 +141,7 @@ void olcPGEX_AudioSource::LoadAudioSample(int ID, const char* fileName)
|
|||||||
AL->LoadAudioSample(ID, fileName);
|
AL->LoadAudioSample(ID, fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void olcPGEX_AudioSource::PlayCentered(float speed, float vol, bool looping, bool paused)
|
int olcPGEX_AudioSource::PlayCentered(float speed, float vol, bool looping, bool paused)
|
||||||
{
|
{
|
||||||
// Set parameters
|
// Set parameters
|
||||||
fPlaySpeed = speed;
|
fPlaySpeed = speed;
|
||||||
@ -158,6 +159,7 @@ void olcPGEX_AudioSource::PlayCentered(float speed, float vol, bool looping, boo
|
|||||||
|
|
||||||
// Update Play status
|
// Update Play status
|
||||||
bIsPlaying = true;
|
bIsPlaying = true;
|
||||||
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
int olcPGEX_AudioSource::Play(vf2d pos, float speed, float vol, bool looping, bool paused)
|
int olcPGEX_AudioSource::Play(vf2d pos, float speed, float vol, bool looping, bool paused)
|
||||||
@ -231,6 +233,15 @@ void olcPGEX_AudioSource::ModulateAudio(float minPlaySpeed, float maxPlaySpeed,
|
|||||||
AL->soloud.setRelativePlaySpeed(handle, fPlaySpeed);
|
AL->soloud.setRelativePlaySpeed(handle, fPlaySpeed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void olcPGEX_AudioSource::SetVolume(int handle,float vol)
|
||||||
|
{
|
||||||
|
// Set volume
|
||||||
|
fVolume = vol;
|
||||||
|
|
||||||
|
// Instruct the Audio Listener to apply the volume change
|
||||||
|
AL->soloud.setVolume(handle, fVolume);
|
||||||
|
}
|
||||||
|
|
||||||
void olcPGEX_AudioSource::SetVolume(float vol, float minVol, float maxVol)
|
void olcPGEX_AudioSource::SetVolume(float vol, float minVol, float maxVol)
|
||||||
{
|
{
|
||||||
// Set volume
|
// Set volume
|
||||||
|
Loading…
x
Reference in New Issue
Block a user