@ -28,9 +28,7 @@ struct FloatingNumber {
uint32_t time ;
uint32_t time ;
uint32_t lastMerge ;
uint32_t lastMerge ;
UiFlags style ;
UiFlags style ;
DamageType type ;
int id ;
int value ;
size_t index ;
bool reverseDirection ;
bool reverseDirection ;
} ;
} ;
@ -47,142 +45,45 @@ void ClearExpiredNumbers()
}
}
}
}
GameFontTables GetGameFontSizeByDamage ( int value )
GameFontTables GetGameFontSize ( UiFlags flags )
{
{
value > > = 6 ;
if ( HasAnyOf ( flags , UiFlags : : FontSize30 ) )
if ( value > = 300 )
return GameFont30 ;
return GameFont30 ;
if ( value > = 100 )
if ( HasAnyOf ( flags , UiFlags : : FontSize24 ) )
return GameFont24 ;
return GameFont24 ;
return GameFont12 ;
return GameFont12 ;
}
}
UiFlags GetFontSizeByDamage ( int value )
} // namespace
{
value > > = 6 ;
if ( value > = 300 )
return UiFlags : : FontSize30 ;
if ( value > = 100 )
return UiFlags : : FontSize24 ;
return UiFlags : : FontSize12 ;
}
void UpdateFloatingData ( FloatingNumber & num )
{
if ( num . value > 0 & & num . value < 64 ) {
num . text = fmt : : format ( " {:.2f} " , num . value / 64.0 ) ;
} else {
num . text = StrCat ( num . value > > 6 ) ;
}
num . style & = ~ ( UiFlags : : FontSize12 | UiFlags : : FontSize24 | UiFlags : : FontSize30 ) ;
num . style | = GetFontSizeByDamage ( num . value ) ;
switch ( num . type ) {
case DamageType : : Physical :
num . style | = UiFlags : : ColorGold ;
break ;
case DamageType : : Fire :
num . style | = UiFlags : : ColorUiSilver ; // UiSilver appears dark red ingame
break ;
case DamageType : : Lightning :
num . style | = UiFlags : : ColorBlue ;
break ;
case DamageType : : Magic :
num . style | = UiFlags : : ColorOrange ;
break ;
case DamageType : : Acid :
num . style | = UiFlags : : ColorYellow ;
break ;
}
}
void AddFloatingNumber ( Point pos , Displacement offset , DamageType type , int value , size_t index , bool damageToPlayer )
void AddFloatingNumber ( Point pos , Displacement offset , std : : string text , UiFlags style , int id , bool reverseDirection )
{
{
// 45 deg angles to avoid jitter caused by px alignment
const Displacement goodAngles [ ] = {
{ 0 , - 140 } ,
{ 100 , - 100 } ,
{ - 100 , - 100 } ,
} ;
Displacement endOffset ;
Displacement endOffset ;
if ( * GetOptions ( ) . Gameplay . enableFloatingNumbers = = FloatingNumbers : : Random ) {
if ( ! reverseDirection )
endOffset = goodAngles [ rand ( ) % 3 ] ;
endOffset = { 0 , - 140 } ;
} else if ( * GetOptions ( ) . Gameplay . enableFloatingNumbers = = FloatingNumbers : : Vertical ) {
else
endOffset = goodAngles [ 0 ] ;
endOffset = { 0 , 140 } ;
}
if ( damageToPlayer )
endOffset = - endOffset ;
for ( auto & num : FloatingQueue ) {
for ( auto & num : FloatingQueue ) {
if ( num . reverseDirection = = damageToPlayer & & num . type = = type & & num . in dex = = in dex & & ( SDL_GetTicks ( ) - static_cast < int > ( num . lastMerge ) ) < = 100 ) {
if ( id ! = 0 & & num . id = = id & & ( SDL_GetTicks ( ) - static_cast < int > ( num . lastMerge ) ) < = 100 ) {
num . value + = value ;
num . text = text ;
num . lastMerge = SDL_GetTicks ( ) ;
num . lastMerge = SDL_GetTicks ( ) ;
UpdateFloatingData ( num ) ;
num . style = style ;
num . startPos = pos ;
return ;
return ;
}
}
}
}
FloatingNumber num {
FloatingNumber num {
pos , offset , endOffset , " " ,
pos , offset , endOffset , text ,
static_cast < uint32_t > ( SDL_GetTicks ( ) + 2500 ) ,
static_cast < uint32_t > ( SDL_GetTicks ( ) + 2500 ) ,
static_cast < uint32_t > ( SDL_GetTicks ( ) ) ,
static_cast < uint32_t > ( SDL_GetTicks ( ) ) ,
UiFlags : : Outlined , type , value , index , damageToPlayer
style | UiFlags : : Outlined , id , reverseDirection
} ;
} ;
UpdateFloatingData ( num ) ;
FloatingQueue . push_back ( num ) ;
FloatingQueue . push_back ( num ) ;
}
}
} // namespace
void AddFloatingNumber ( DamageType damageType , const Monster & monster , int damage )
{
if ( * GetOptions ( ) . Gameplay . enableFloatingNumbers = = FloatingNumbers : : Off )
return ;
Displacement offset = { } ;
if ( monster . isWalking ( ) ) {
offset = GetOffsetForWalking ( monster . animInfo , monster . direction ) ;
if ( monster . mode = = MonsterMode : : MoveSideways ) {
if ( monster . direction = = Direction : : West )
offset - = Displacement { 64 , 0 } ;
else
offset + = Displacement { 64 , 0 } ;
}
}
if ( monster . animInfo . sprites ) {
const ClxSprite sprite = monster . animInfo . currentSprite ( ) ;
offset . deltaY - = sprite . height ( ) / 2 ;
}
AddFloatingNumber ( monster . position . tile , offset , damageType , damage , monster . getId ( ) , false ) ;
}
void AddFloatingNumber ( DamageType damageType , const Player & player , int damage )
{
if ( * GetOptions ( ) . Gameplay . enableFloatingNumbers = = FloatingNumbers : : Off )
return ;
Displacement offset = { } ;
if ( player . isWalking ( ) ) {
offset = GetOffsetForWalking ( player . AnimInfo , player . _pdir ) ;
if ( player . _pmode = = PM_WALK_SIDEWAYS ) {
if ( player . _pdir = = Direction : : West )
offset - = Displacement { 64 , 0 } ;
else
offset + = Displacement { 64 , 0 } ;
}
}
AddFloatingNumber ( player . position . tile , offset , damageType , damage , player . getId ( ) , true ) ;
}
void DrawFloatingNumbers ( const Surface & out , Point viewPosition , Displacement offset )
void DrawFloatingNumbers ( const Surface & out , Point viewPosition , Displacement offset )
{
{
if ( * GetOptions ( ) . Gameplay . enableFloatingNumbers = = FloatingNumbers : : Off )
return ;
for ( auto & floatingNum : FloatingQueue ) {
for ( auto & floatingNum : FloatingQueue ) {
Displacement worldOffset = viewPosition - floatingNum . startPos ;
Displacement worldOffset = viewPosition - floatingNum . startPos ;
worldOffset = worldOffset . worldToScreen ( ) + offset + Displacement { TILE_WIDTH / 2 , - TILE_HEIGHT / 2 } + floatingNum . startOffset ;
worldOffset = worldOffset . worldToScreen ( ) + offset + Displacement { TILE_WIDTH / 2 , - TILE_HEIGHT / 2 } + floatingNum . startOffset ;
@ -193,7 +94,7 @@ void DrawFloatingNumbers(const Surface &out, Point viewPosition, Displacement of
Point screenPosition { worldOffset . deltaX , worldOffset . deltaY } ;
Point screenPosition { worldOffset . deltaX , worldOffset . deltaY } ;
const int lineWidth = GetLineWidth ( floatingNum . text , GetGameFontSizeByDamage ( floatingNum . valu e) ) ;
const int lineWidth = GetLineWidth ( floatingNum . text , GetGameFontSize ( floatingNum . styl e) ) ;
screenPosition . x - = lineWidth / 2 ;
screenPosition . x - = lineWidth / 2 ;
const uint32_t timeLeft = floatingNum . time - SDL_GetTicks ( ) ;
const uint32_t timeLeft = floatingNum . time - SDL_GetTicks ( ) ;
const float mul = 1 - ( timeLeft / 2500.0f ) ;
const float mul = 1 - ( timeLeft / 2500.0f ) ;