# 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 <EFBFBD> 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 + + ;
}