parent
64f6b44994
commit
7fd6cf677e
@ -0,0 +1,8 @@ |
|||||||
|
#pragma once |
||||||
|
|
||||||
|
struct GameFlags{ |
||||||
|
bool unitMetersGreyedOut=true;//If true, all but health meters show up as dark grey.
|
||||||
|
bool playerInControl=false; |
||||||
|
bool limitedBuildOptions=false; |
||||||
|
bool guideEnabled=true; |
||||||
|
}; |
@ -0,0 +1,7 @@ |
|||||||
|
#pragma once |
||||||
|
#include "MemoryType.h" |
||||||
|
|
||||||
|
struct Memory{ |
||||||
|
MemoryType type; |
||||||
|
int size; |
||||||
|
}; |
@ -1,101 +1,252 @@ |
|||||||
#include "Scenario.h" |
#include "Scenario.h" |
||||||
#include "VirusAttack.h" |
#include "TileManager.h" |
||||||
|
|
||||||
extern VirusAttack*game; |
|
||||||
|
|
||||||
Scenario::Scenario(){} |
Scenario::Scenario(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) |
||||||
|
:units(units),IMAGES(IMAGES),SOUNDS(SOUNDS),objective(objective),game(game),flags(flags){} |
||||||
Scenario::~Scenario(){}; |
Scenario::~Scenario(){}; |
||||||
void Scenario::_Start(){ |
void Scenario::_Start(){ |
||||||
state=0; |
state=0; |
||||||
camera=utils::Camera2D{game->gametv.GetWorldOffset(),game->currentLevel->cameraStart}; |
camera=utils::Camera2D{game.GetPGE()->GetScreenSize(),game.GetWorldOffset()}; |
||||||
camera.SetLazyFollowRate(2); |
camera.SetLazyFollowRate(2); |
||||||
camera.SetMode(utils::Camera2D::Mode::LazyFollow); |
camera.SetMode(utils::Camera2D::Mode::LazyFollow); |
||||||
targetPos={96,96}; |
targetPos={96,96}; |
||||||
box.SetVisible(false); |
box.SetVisible(false); |
||||||
initialWaitTime=3; |
initialWaitTime=3; |
||||||
camera.SetTarget(targetPos); |
camera.SetTarget(targetPos); |
||||||
|
missionCompletedTimer=0; |
||||||
|
transitionToNextLevel=false; |
||||||
Start(); |
Start(); |
||||||
} |
} |
||||||
void Scenario::Start(){}; |
void Scenario::Start(){}; |
||||||
void Scenario::_Update(){ |
void Scenario::_Update(){ |
||||||
initialWaitTime=std::max(0.f,initialWaitTime-game->GetElapsedTime()); |
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){ |
if(initialWaitTime==0){ |
||||||
Update(); |
Update(); |
||||||
} |
} |
||||||
}; |
}; |
||||||
|
bool Scenario::MissionCompleted(){return false;} |
||||||
void Scenario::Update(){}; |
void Scenario::Update(){}; |
||||||
Stage1::Stage1(){} |
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){ |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
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<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) |
||||||
|
:Scenario(units,IMAGES,SOUNDS,objective,game,flags){} |
||||||
void Stage1::Start(){ |
void Stage1::Start(){ |
||||||
game->unitMetersGreyedOut=true; |
flags.unitMetersGreyedOut=true; |
||||||
game->playerInControl=false; |
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(){ |
void Stage1::Update(){ |
||||||
switch(state){ |
switch(state){ |
||||||
case 0:{ |
case 0:{ |
||||||
|
DisplayBox("Hello Hacker, thank you for taking on this request for me."); |
||||||
}break; |
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<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) |
||||||
|
:Scenario(units,IMAGES,SOUNDS,objective,game,flags){} |
||||||
|
void Stage2::Start(){ |
||||||
|
nextLevel=LevelName::STAGE3; |
||||||
}; |
}; |
||||||
Stage2::Stage2(){} |
|
||||||
void Stage2::Start(){}; |
|
||||||
void Stage2::Update(){ |
void Stage2::Update(){ |
||||||
switch(state){ |
switch(state){ |
||||||
case 0:{ |
case 0:{ |
||||||
|
|
||||||
}break; |
}break; |
||||||
} |
} |
||||||
}; |
}; |
||||||
Stage3::Stage3(){} |
bool Stage2::MissionCompleted(){ |
||||||
void Stage3::Start(){}; |
return false; |
||||||
|
} |
||||||
|
Stage3::Stage3(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) |
||||||
|
:Scenario(units,IMAGES,SOUNDS,objective,game,flags){} |
||||||
|
void Stage3::Start(){ |
||||||
|
nextLevel=LevelName::STAGE4; |
||||||
|
}; |
||||||
void Stage3::Update(){ |
void Stage3::Update(){ |
||||||
switch(state){ |
switch(state){ |
||||||
case 0:{ |
case 0:{ |
||||||
|
|
||||||
}break; |
}break; |
||||||
} |
} |
||||||
}; |
}; |
||||||
Stage4::Stage4(){} |
bool Stage3::MissionCompleted(){ |
||||||
void Stage4::Start(){}; |
return false; |
||||||
|
} |
||||||
|
Stage4::Stage4(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) |
||||||
|
:Scenario(units,IMAGES,SOUNDS,objective,game,flags){} |
||||||
|
void Stage4::Start(){ |
||||||
|
nextLevel=LevelName::STAGE5; |
||||||
|
}; |
||||||
void Stage4::Update(){ |
void Stage4::Update(){ |
||||||
switch(state){ |
switch(state){ |
||||||
case 0:{ |
case 0:{ |
||||||
|
|
||||||
}break; |
}break; |
||||||
} |
} |
||||||
}; |
}; |
||||||
Stage5::Stage5(){} |
bool Stage4::MissionCompleted(){ |
||||||
void Stage5::Start(){}; |
return false; |
||||||
|
} |
||||||
|
Stage5::Stage5(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) |
||||||
|
:Scenario(units,IMAGES,SOUNDS,objective,game,flags){} |
||||||
|
void Stage5::Start(){ |
||||||
|
nextLevel=LevelName::STAGE6; |
||||||
|
}; |
||||||
void Stage5::Update(){ |
void Stage5::Update(){ |
||||||
switch(state){ |
switch(state){ |
||||||
case 0:{ |
case 0:{ |
||||||
|
|
||||||
}break; |
}break; |
||||||
} |
} |
||||||
}; |
}; |
||||||
Stage6::Stage6(){} |
bool Stage5::MissionCompleted(){ |
||||||
void Stage6::Start(){}; |
return false; |
||||||
|
} |
||||||
|
Stage6::Stage6(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) |
||||||
|
:Scenario(units,IMAGES,SOUNDS,objective,game,flags){} |
||||||
|
void Stage6::Start(){ |
||||||
|
nextLevel=LevelName::STAGE7; |
||||||
|
}; |
||||||
void Stage6::Update(){ |
void Stage6::Update(){ |
||||||
switch(state){ |
switch(state){ |
||||||
case 0:{ |
case 0:{ |
||||||
|
|
||||||
}break; |
}break; |
||||||
} |
} |
||||||
}; |
}; |
||||||
Stage7::Stage7(){} |
bool Stage6::MissionCompleted(){ |
||||||
void Stage7::Start(){}; |
return false; |
||||||
|
} |
||||||
|
Stage7::Stage7(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) |
||||||
|
:Scenario(units,IMAGES,SOUNDS,objective,game,flags){} |
||||||
|
void Stage7::Start(){ |
||||||
|
nextLevel=LevelName::STAGE8; |
||||||
|
}; |
||||||
void Stage7::Update(){ |
void Stage7::Update(){ |
||||||
switch(state){ |
switch(state){ |
||||||
case 0:{ |
case 0:{ |
||||||
|
|
||||||
}break; |
}break; |
||||||
} |
} |
||||||
}; |
}; |
||||||
Stage8::Stage8(){} |
bool Stage7::MissionCompleted(){ |
||||||
void Stage8::Start(){}; |
return false; |
||||||
|
} |
||||||
|
Stage8::Stage8(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags) |
||||||
|
:Scenario(units,IMAGES,SOUNDS,objective,game,flags){} |
||||||
|
void Stage8::Start(){ |
||||||
|
nextLevel=LevelName::FINISH; |
||||||
|
}; |
||||||
void Stage8::Update(){ |
void Stage8::Update(){ |
||||||
switch(state){ |
switch(state){ |
||||||
case 0:{ |
case 0:{ |
||||||
|
|
||||||
}break; |
}break; |
||||||
} |
} |
||||||
}; |
}; |
||||||
|
bool Stage8::MissionCompleted(){ |
||||||
|
return false; |
||||||
|
} |
@ -1,76 +1,105 @@ |
|||||||
#pragma once |
#pragma once |
||||||
#include "olcUTIL_Camera2D.h" |
#include "olcUTIL_Camera2D.h" |
||||||
#include "Textbox.h" |
#include "Textbox.h" |
||||||
|
#include "Unit.h" |
||||||
|
#include "olcPGEX_AudioSource.h" |
||||||
|
#include "olcPGEX_TransformedView.h" |
||||||
|
#include "GameFlags.h" |
||||||
|
#include "Level.h" |
||||||
|
|
||||||
class Scenario{ |
class Scenario{ |
||||||
public: |
public: |
||||||
Scenario(); |
Scenario(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags); |
||||||
virtual~Scenario(); |
virtual~Scenario(); |
||||||
void _Start(); |
void _Start(); |
||||||
|
void Draw(); |
||||||
virtual void Start(); |
virtual void Start(); |
||||||
void _Update(); |
void _Update(); |
||||||
|
bool transitionToNextLevel=false; |
||||||
|
LevelName nextLevel=LevelName::STAGE1; |
||||||
protected: |
protected: |
||||||
|
void DisplayBox(std::string text,bool scaryHoodedFigure=false); |
||||||
|
void SetCameraTarget(vf2d pos); |
||||||
|
void SetObjective(std::string objective); |
||||||
|
virtual bool MissionCompleted(); |
||||||
virtual void Update(); |
virtual void Update(); |
||||||
int state=0; |
int state=0; |
||||||
utils::Camera2D camera; |
utils::Camera2D camera; |
||||||
vf2d targetPos; |
vf2d targetPos; |
||||||
Textbox box; |
Textbox box; |
||||||
float initialWaitTime=3; |
float initialWaitTime=3; |
||||||
|
bool missionCompleted=false; |
||||||
|
float missionFinishWaitTime=3; |
||||||
|
float missionCompletedTimer=0; |
||||||
|
std::vector<std::shared_ptr<Unit>>&units; |
||||||
|
std::vector<std::unique_ptr<Renderable>>&IMAGES; |
||||||
|
std::vector<std::unique_ptr<Audio>>&SOUNDS; |
||||||
|
GameFlags&flags; |
||||||
|
std::string&objective; |
||||||
|
TileTransformedView&game; |
||||||
}; |
}; |
||||||
|
|
||||||
class Stage1:public Scenario{ |
class Stage1:public Scenario{ |
||||||
public: |
public: |
||||||
Stage1(); |
Stage1(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags); |
||||||
protected: |
protected: |
||||||
void Start(); |
void Start(); |
||||||
void Update(); |
void Update(); |
||||||
|
bool MissionCompleted(); |
||||||
}; |
}; |
||||||
class Stage2:public Scenario{ |
class Stage2:public Scenario{ |
||||||
public: |
public: |
||||||
Stage2(); |
Stage2(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags); |
||||||
protected: |
protected: |
||||||
void Start(); |
void Start(); |
||||||
void Update(); |
void Update(); |
||||||
|
bool MissionCompleted(); |
||||||
}; |
}; |
||||||
class Stage3:public Scenario{ |
class Stage3:public Scenario{ |
||||||
public: |
public: |
||||||
Stage3(); |
Stage3(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags); |
||||||
protected: |
protected: |
||||||
void Start(); |
void Start(); |
||||||
void Update(); |
void Update(); |
||||||
|
bool MissionCompleted(); |
||||||
}; |
}; |
||||||
class Stage4:public Scenario{ |
class Stage4:public Scenario{ |
||||||
public: |
public: |
||||||
Stage4(); |
Stage4(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags); |
||||||
protected: |
protected: |
||||||
void Start(); |
void Start(); |
||||||
void Update(); |
void Update(); |
||||||
|
bool MissionCompleted(); |
||||||
}; |
}; |
||||||
class Stage5:public Scenario{ |
class Stage5:public Scenario{ |
||||||
public: |
public: |
||||||
Stage5(); |
Stage5(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags); |
||||||
protected: |
protected: |
||||||
void Start(); |
void Start(); |
||||||
void Update(); |
void Update(); |
||||||
|
bool MissionCompleted(); |
||||||
}; |
}; |
||||||
class Stage6:public Scenario{ |
class Stage6:public Scenario{ |
||||||
public: |
public: |
||||||
Stage6(); |
Stage6(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags); |
||||||
protected: |
protected: |
||||||
void Start(); |
void Start(); |
||||||
void Update(); |
void Update(); |
||||||
|
bool MissionCompleted(); |
||||||
}; |
}; |
||||||
class Stage7:public Scenario{ |
class Stage7:public Scenario{ |
||||||
public: |
public: |
||||||
Stage7(); |
Stage7(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags); |
||||||
protected: |
protected: |
||||||
void Start(); |
void Start(); |
||||||
void Update(); |
void Update(); |
||||||
|
bool MissionCompleted(); |
||||||
}; |
}; |
||||||
class Stage8:public Scenario{ |
class Stage8:public Scenario{ |
||||||
public: |
public: |
||||||
Stage8(); |
Stage8(std::vector<std::shared_ptr<Unit>>&units,std::vector<std::unique_ptr<Renderable>>&IMAGES,std::vector<std::unique_ptr<Audio>>&SOUNDS,std::string&objective,TileTransformedView&game,GameFlags&flags); |
||||||
protected: |
protected: |
||||||
void Start(); |
void Start(); |
||||||
void Update(); |
void Update(); |
||||||
|
bool MissionCompleted(); |
||||||
}; |
}; |
@ -1,11 +1,13 @@ |
|||||||
#pragma once |
#pragma once |
||||||
|
|
||||||
enum class Sound:int{ |
namespace Sound{ |
||||||
HUM, |
enum Sound:int{ |
||||||
GRAVITY, |
HUM, |
||||||
COSMOS, |
GRAVITY, |
||||||
BOSS1, |
COSMOS, |
||||||
BOSS2, |
BOSS1, |
||||||
VOICEOVER, |
BOSS2, |
||||||
PING, |
VOICEOVER, |
||||||
}; |
PING, |
||||||
|
}; |
||||||
|
} |
Loading…
Reference in new issue