108 lines
4.3 KiB
C++
108 lines
4.3 KiB
C++
#pragma region License
|
||
/*
|
||
License (OLC-3)
|
||
~~~~~~~~~~~~~~~
|
||
|
||
Copyright 2024 Joshua Sigona <sigonasr2@gmail.com>
|
||
|
||
Redistribution and use in source and binary forms, with or without modification,
|
||
are permitted provided that the following conditions are met:
|
||
|
||
1. Redistributions or derivations of source code must retain the above copyright
|
||
notice, this list of conditions and the following disclaimer.
|
||
|
||
2. Redistributions or derivative works in binary form must reproduce the above
|
||
copyright notice. This list of conditions and the following disclaimer must be
|
||
reproduced in the documentation and/or other materials provided with the distribution.
|
||
|
||
3. Neither the name of the copyright holder nor the names of its contributors may
|
||
be used to endorse or promote products derived from this software without specific
|
||
prior written permission.
|
||
|
||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
SUCH DAMAGE.
|
||
|
||
Portions of this software are copyright <20> 2024 The FreeType
|
||
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
|
||
All rights reserved.
|
||
*/
|
||
#pragma endregion
|
||
|
||
#include "AdventuresInLestoria.h"
|
||
#include "LoadingScreen.h"
|
||
#include "util.h"
|
||
|
||
INCLUDE_game
|
||
INCLUDE_WINDOW_SIZE
|
||
INCLUDE_ANIMATION_DATA
|
||
|
||
bool LoadingScreen::loading=false;
|
||
int LoadingScreen::currentProgress=0;
|
||
int LoadingScreen::totalProgress=0;
|
||
std::queue<std::function<bool()>>LoadingScreen::loadingPhases;
|
||
bool LoadingScreen::showGhost=false;
|
||
bool LoadingScreen::showLarge=false;
|
||
|
||
void LoadingScreen::DeferLoad(std::function<bool()>waitCondition){
|
||
AddPhase(waitCondition);
|
||
}
|
||
|
||
void LoadingScreen::Update(){
|
||
if(loading){
|
||
if(loadingPhases.size()>0){
|
||
std::function<bool()>&loadFunc=loadingPhases.front();
|
||
if(loadFunc()){
|
||
currentProgress++;
|
||
loadingPhases.pop();
|
||
}
|
||
}else{
|
||
loading=false;
|
||
GameState::STATE->OnLevelLoad();
|
||
}
|
||
}
|
||
}
|
||
void LoadingScreen::Draw(){
|
||
if(loading){
|
||
game->FillRectDecal({0,0},WINDOW_SIZE,{VERY_DARK_GREEN.r,VERY_DARK_GREEN.g,VERY_DARK_GREEN.b,230});
|
||
|
||
game->FillRectDecal({22.f,WINDOW_SIZE.y-46.f},{(float(currentProgress)/totalProgress)*(WINDOW_SIZE.x-48.f)+4.f,28.f},VERY_DARK_GREEN/2);
|
||
|
||
game->FillRectDecal({24.f,WINDOW_SIZE.y-48.f},{(float(currentProgress)/totalProgress)*(WINDOW_SIZE.x-48.f),24.f},DARK_YELLOW);
|
||
game->DrawShadowStringPropDecal({24.f,WINDOW_SIZE.y-60.f},"Loading...",{170,210,0},BLACK,{1.f,1.5f});
|
||
|
||
vf2d playerScale=vf2d(game->GetPlayer()->GetSizeMult(),game->GetPlayer()->GetSizeMult());
|
||
float scale=1.f;
|
||
if(showLarge){
|
||
scale=2.f;
|
||
}
|
||
const std::vector<Buff>attackBuffs=game->GetPlayer()->GetStatBuffs({"Attack","Attack %"});
|
||
Pixel blendCol=attackBuffs.size()>0?Pixel{255,uint8_t(255*abs(sin(1.4*attackBuffs[0].duration))),uint8_t(255*abs(sin(1.4*attackBuffs[0].duration)))}:WHITE;
|
||
if(showGhost){
|
||
blendCol=BLACK;
|
||
}
|
||
game->GetPlayer()->GetWalkEAnimation();
|
||
Animate2D::FrameSequence&playerWalkE=ANIMATION_DATA[game->GetPlayer()->GetWalkEAnimation()];
|
||
game->DrawPartialRotatedDecal({(float(currentProgress)/totalProgress)*(WINDOW_SIZE.x-48.f),WINDOW_SIZE.y-36.f},playerWalkE.GetFrame(game->GetRunTime()).GetSourceImage()->Decal(),game->GetPlayer()->GetSpinAngle(),{12,12},playerWalkE.GetFrame(game->GetRunTime()).GetSourceRect().pos,playerWalkE.GetFrame(game->GetRunTime()).GetSourceRect().size,playerScale*scale,blendCol);
|
||
}
|
||
}
|
||
|
||
void LoadingScreen::Reset(){
|
||
currentProgress=0;
|
||
totalProgress=0;
|
||
showGhost=util::random()%6==0;
|
||
showLarge=util::random()%6==0;
|
||
while(loadingPhases.size()>0)ERR("WARNING! Previous loading phase was not properly cleared! This probably means some part of a previous load did not execute!");
|
||
}
|
||
|
||
void LoadingScreen::AddPhase(std::function<bool()>loadFunc){
|
||
loadingPhases.push(loadFunc);
|
||
totalProgress++;
|
||
} |