@ -950,99 +950,17 @@ void AiL::ProximityKnockback(const vf2d pos,const float radius,const float knock
}
void AiL : : PopulateRenderLists ( ) {
monstersBeforeLower . clear ( ) ;
monstersAfterLower . clear ( ) ;
monstersBeforeUpper . clear ( ) ;
monstersAfterUpper . clear ( ) ;
bulletsLower . clear ( ) ;
bulletsUpper . clear ( ) ;
backgroundEffectsLower . clear ( ) ;
backgroundEffectsUpper . clear ( ) ;
foregroundEffectsLower . clear ( ) ;
foregroundEffectsUpper . clear ( ) ;
endZones . clear ( ) ;
upperEndZones . clear ( ) ;
dropsBeforeLower . clear ( ) ;
dropsAfterLower . clear ( ) ;
dropsBeforeUpper . clear ( ) ;
dropsAfterUpper . clear ( ) ;
tilesWithCollision . clear ( ) ;
tilesWithoutCollision . clear ( ) ;
Player * pl = GetPlayer ( ) ;
pl - > rendered = false ;
std : : sort ( MONSTER_LIST . begin ( ) , MONSTER_LIST . end ( ) , [ ] ( std : : shared_ptr < Monster > & m1 , std : : shared_ptr < Monster > & m2 ) { return m1 - > GetPos ( ) . y < m2 - > GetPos ( ) . y ; } ) ;
std : : sort ( ItemDrop : : drops . begin ( ) , ItemDrop : : drops . end ( ) , [ ] ( ItemDrop & id1 , ItemDrop & id2 ) { return id1 . GetPos ( ) . y < id2 . GetPos ( ) . y ; } ) ;
std : : sort ( BULLET_LIST . begin ( ) , BULLET_LIST . end ( ) , [ ] ( std : : unique_ptr < IBullet > & b1 , std : : unique_ptr < IBullet > & b2 ) { return b1 - > pos . y < b2 - > pos . y ; } ) ;
std : : sort ( foregroundEffects . begin ( ) , foregroundEffects . end ( ) , [ ] ( std : : unique_ptr < Effect > & e1 , std : : unique_ptr < Effect > & e2 ) { return e1 - > pos . y < e2 - > pos . y ; } ) ;
std : : sort ( backgroundEffects . begin ( ) , backgroundEffects . end ( ) , [ ] ( std : : unique_ptr < Effect > & e1 , std : : unique_ptr < Effect > & e2 ) { return e1 - > pos . y < e2 - > pos . y ; } ) ;
for ( auto it = MONSTER_LIST . begin ( ) ; it ! = MONSTER_LIST . end ( ) ; + + it ) {
Monster & m = * * it ;
if ( m . GetPos ( ) . y < pl - > GetPos ( ) . y ) { //This monster renders before the player does (behind the player)
if ( m . OnUpperLevel ( ) ) {
monstersBeforeUpper . push_back ( & m ) ;
} else {
monstersBeforeLower . push_back ( & m ) ;
}
} else { //This monster renders after the player does (in front of the player)
if ( m . OnUpperLevel ( ) ) {
monstersAfterUpper . push_back ( & m ) ;
} else {
monstersAfterLower . push_back ( & m ) ;
}
}
}
for ( int i = 0 ; i < ItemDrop : : drops . size ( ) ; i + + ) {
ItemDrop & drop = ItemDrop : : drops [ i ] ;
if ( drop . GetPos ( ) . y < pl - > GetPos ( ) . y ) { //This item drop renders before the player does (behind the player)
if ( drop . OnUpperLevel ( ) ) {
dropsBeforeUpper . push_back ( i ) ;
} else {
dropsBeforeLower . push_back ( i ) ;
}
} else { //This item drop renders after the player does (in front of the player)
if ( drop . OnUpperLevel ( ) ) {
dropsAfterUpper . push_back ( i ) ;
} else {
dropsAfterLower . push_back ( i ) ;
}
}
}
for ( auto it = BULLET_LIST . begin ( ) ; it ! = BULLET_LIST . end ( ) ; + + it ) {
IBullet * b = ( * it ) . get ( ) ;
if ( b - > OnUpperLevel ( ) ) {
bulletsUpper . push_back ( b ) ;
} else {
bulletsLower . push_back ( b ) ;
}
}
for ( auto it = foregroundEffects . begin ( ) ; it ! = foregroundEffects . end ( ) ; + + it ) {
Effect * e = ( * it ) . get ( ) ;
if ( e - > OnUpperLevel ( ) ) {
foregroundEffectsUpper . push_back ( e ) ;
} else {
foregroundEffectsLower . push_back ( e ) ;
}
}
for ( auto it = backgroundEffects . begin ( ) ; it ! = backgroundEffects . end ( ) ; + + it ) {
Effect * e = ( * it ) . get ( ) ;
if ( e - > OnUpperLevel ( ) ) {
backgroundEffectsUpper . push_back ( e ) ;
} else {
backgroundEffectsLower . push_back ( e ) ;
}
}
for ( const ZoneData & zone : GetZones ( ) . at ( " EndZone " ) ) {
if ( zone . isUpper ) {
upperEndZones . push_back ( zone ) ;
} else {
endZones . push_back ( zone ) ;
}
}
std : : ranges : : sort ( MONSTER_LIST , [ ] ( std : : shared_ptr < Monster > & m1 , std : : shared_ptr < Monster > & m2 ) { return m1 - > GetPos ( ) . y < m2 - > GetPos ( ) . y ; } ) ;
std : : ranges : : sort ( ItemDrop : : drops , [ ] ( ItemDrop & id1 , ItemDrop & id2 ) { return id1 . GetPos ( ) . y < id2 . GetPos ( ) . y ; } ) ;
std : : ranges : : sort ( BULLET_LIST , [ ] ( std : : unique_ptr < IBullet > & b1 , std : : unique_ptr < IBullet > & b2 ) { return b1 - > pos . y < b2 - > pos . y ; } ) ;
std : : ranges : : sort ( foregroundEffects , [ ] ( std : : unique_ptr < Effect > & e1 , std : : unique_ptr < Effect > & e2 ) { return e1 - > pos . y < e2 - > pos . y ; } ) ;
std : : ranges : : sort ( backgroundEffects , [ ] ( std : : unique_ptr < Effect > & e1 , std : : unique_ptr < Effect > & e2 ) { return e1 - > pos . y < e2 - > pos . y ; } ) ;
}
void AiL : : RenderTile ( vi2d pos , TilesheetData tileSheet , int tileSheetIndex , vi2d tileSheetPos ) {
@ -1107,6 +1025,25 @@ void AiL::RenderWorld(float fElapsedTime){
PopulateRenderLists ( ) ;
# pragma region Populate Render Lists
auto monstersBeforeUpper { MONSTER_LIST | std : : views : : filter ( [ & pl ] ( const std : : shared_ptr < Monster > & m ) { return m - > GetPos ( ) . y < pl - > GetPos ( ) . y & & m - > OnUpperLevel ( ) ; } ) } ;
auto monstersBeforeLower { MONSTER_LIST | std : : views : : filter ( [ & pl ] ( const std : : shared_ptr < Monster > & m ) { return m - > GetPos ( ) . y < pl - > GetPos ( ) . y & & ! m - > OnUpperLevel ( ) ; } ) } ;
auto monstersAfterUpper { MONSTER_LIST | std : : views : : filter ( [ & pl ] ( const std : : shared_ptr < Monster > & m ) { return m - > GetPos ( ) . y > = pl - > GetPos ( ) . y & & m - > OnUpperLevel ( ) ; } ) } ;
auto monstersAfterLower { MONSTER_LIST | std : : views : : filter ( [ & pl ] ( const std : : shared_ptr < Monster > & m ) { return m - > GetPos ( ) . y > = pl - > GetPos ( ) . y & & ! m - > OnUpperLevel ( ) ; } ) } ;
auto dropsBeforeUpper { ItemDrop : : drops | std : : views : : filter ( [ & pl ] ( const ItemDrop & drop ) { return drop . GetPos ( ) . y < pl - > GetPos ( ) . y & & drop . OnUpperLevel ( ) ; } ) } ;
auto dropsBeforeLower { ItemDrop : : drops | std : : views : : filter ( [ & pl ] ( const ItemDrop & drop ) { return drop . GetPos ( ) . y < pl - > GetPos ( ) . y & & ! drop . OnUpperLevel ( ) ; } ) } ;
auto dropsAfterUpper { ItemDrop : : drops | std : : views : : filter ( [ & pl ] ( const ItemDrop & drop ) { return drop . GetPos ( ) . y > = pl - > GetPos ( ) . y & & drop . OnUpperLevel ( ) ; } ) } ;
auto dropsAfterLower { ItemDrop : : drops | std : : views : : filter ( [ & pl ] ( const ItemDrop & drop ) { return drop . GetPos ( ) . y > = pl - > GetPos ( ) . y & & ! drop . OnUpperLevel ( ) ; } ) } ;
auto bulletsUpper { BULLET_LIST | std : : views : : filter ( [ ] ( const std : : unique_ptr < IBullet > & bullet ) { return bullet - > OnUpperLevel ( ) ; } ) } ;
auto bulletsLower { BULLET_LIST | std : : views : : filter ( [ ] ( const std : : unique_ptr < IBullet > & bullet ) { return ! bullet - > OnUpperLevel ( ) ; } ) } ;
auto foregroundEffectsUpper { foregroundEffects | std : : views : : filter ( [ ] ( const std : : unique_ptr < Effect > & effect ) { return effect - > OnUpperLevel ( ) ; } ) } ;
auto foregroundEffectsLower { foregroundEffects | std : : views : : filter ( [ ] ( const std : : unique_ptr < Effect > & effect ) { return ! effect - > OnUpperLevel ( ) ; } ) } ;
auto backgroundEffectsUpper { backgroundEffects | std : : views : : filter ( [ ] ( const std : : unique_ptr < Effect > & effect ) { return effect - > OnUpperLevel ( ) ; } ) } ;
auto backgroundEffectsLower { backgroundEffects | std : : views : : filter ( [ ] ( const std : : unique_ptr < Effect > & effect ) { return ! effect - > OnUpperLevel ( ) ; } ) } ;
auto upperEndZones { ZONE_LIST [ " EndZone " ] | std : : views : : filter ( [ ] ( const ZoneData & zone ) { return zone . isUpper ; } ) } ;
auto endZones { ZONE_LIST [ " EndZone " ] | std : : views : : filter ( [ ] ( const ZoneData & zone ) { return ! zone . isUpper ; } ) } ;
# pragma endregion
auto RenderPlayer = [ & ] ( vf2d pos , vf2d scale ) {
if ( player - > IsInvisible ( ) ) return ;
vf2d playerScale = vf2d ( player - > GetSizeMult ( ) , player - > GetSizeMult ( ) ) ;
@ -1458,7 +1395,7 @@ void AiL::RenderWorld(float fElapsedTime){
break ;
}
while ( dropsBeforeLowerIt ! = dropsBeforeLower . end ( ) ) {
const ItemDrop & drop = ItemDrop : : drops [ * dropsBeforeLowerIt ] ;
const ItemDrop & drop { * dropsBeforeLowerIt } ;
if ( drop . pos . y < topTileY ) {
drop . Draw ( ) ;
+ + dropsBeforeLowerIt ;
@ -1474,7 +1411,7 @@ void AiL::RenderWorld(float fElapsedTime){
+ + monstersBeforeLowerIt ;
}
while ( dropsBeforeLowerIt ! = dropsBeforeLower . end ( ) ) {
const ItemDrop & drop = ItemDrop : : drops [ * dropsBeforeLowerIt ] ;
const ItemDrop & drop { * dropsBeforeLowerIt } ;
drop . Draw ( ) ;
+ + dropsBeforeLowerIt ;
}
@ -1497,7 +1434,7 @@ void AiL::RenderWorld(float fElapsedTime){
break ;
}
while ( dropsAfterLowerIt ! = dropsAfterLower . end ( ) ) {
const ItemDrop & drop = ItemDrop : : drops [ * dropsAfterLowerIt ] ;
const ItemDrop & drop { * dropsAfterLowerIt } ;
if ( drop . pos . y < topTileY ) {
drop . Draw ( ) ;
+ + dropsAfterLowerIt ;
@ -1519,7 +1456,7 @@ void AiL::RenderWorld(float fElapsedTime){
+ + monstersBeforeLowerIt ;
}
while ( dropsBeforeLowerIt ! = dropsBeforeLower . end ( ) ) {
const ItemDrop & drop = ItemDrop : : drops [ * dropsBeforeLowerIt ] ;
const ItemDrop & drop { * dropsBeforeLowerIt } ;
drop . Draw ( ) ;
+ + dropsBeforeLowerIt ;
}
@ -1540,7 +1477,7 @@ void AiL::RenderWorld(float fElapsedTime){
break ;
}
while ( dropsAfterLowerIt ! = dropsAfterLower . end ( ) ) {
const ItemDrop & drop = ItemDrop : : drops [ * dropsAfterLowerIt ] ;
const ItemDrop & drop { * dropsAfterLowerIt } ;
if ( drop . pos . y < tile - > group - > GetCollisionRange ( ) . middle ( ) . y ) {
drop . Draw ( ) ;
+ + dropsAfterLowerIt ;
@ -1570,16 +1507,16 @@ void AiL::RenderWorld(float fElapsedTime){
# pragma endregion
# pragma region Remaining Rendering
while ( monstersBeforeLowerIt ! = monstersBeforeLower . end ( ) ) {
Monster * const m = * monstersBeforeLowerIt ;
m - > Draw ( ) ;
const Monster & m = * * monstersBeforeLowerIt ;
m . Draw ( ) ;
+ + monstersBeforeLowerIt ;
}
for ( const Effect * const e : backgroundEffectsLower ) {
for ( std : : unique_ptr < Effect > & e : backgroundEffectsLower ) {
e - > _Draw ( ) ;
}
while ( dropsBeforeLowerIt ! = dropsBeforeLower . end ( ) ) {
const int dropInd = * dropsBeforeLowerIt ;
ItemDrop : : drops [ dropInd ] . Draw ( ) ;
const ItemDrop & drop { * dropsBeforeLowerIt } ;
drop . Draw ( ) ;
+ + dropsBeforeLowerIt ;
}
if ( ! player - > rendered & & ! player - > upperLevel ) {
@ -1588,22 +1525,24 @@ void AiL::RenderWorld(float fElapsedTime){
vf2d shadowScale = vf2d { 8 * player - > GetSizeMult ( ) / 3.f , 1 } / std : : max ( 1.f , player - > GetZ ( ) / 24 ) ;
view . DrawDecal ( player - > GetPos ( ) - vf2d { 3 , 3 } * shadowScale / 2 + vf2d { 0 , 6 * player - > GetSizeMult ( ) } , GFX [ " circle.png " ] . Decal ( ) , shadowScale , BLACK ) ;
}
if ( player - > IsUsingAdditiveBlending ( ) ) SetDecalMode ( DecalMode : : ADDITIVE ) ;
else SetDecalMode ( DecalMode : : NORMAL ) ;
RenderPlayer ( player - > GetPos ( ) , { 1 , 1 } ) ;
}
while ( monstersAfterLowerIt ! = monstersAfterLower . end ( ) ) {
Monster * const m = * monstersAfterLowerIt ;
m - > Draw ( ) ;
const Monster & m = * * monstersAfterLowerIt ;
m . Draw ( ) ;
+ + monstersAfterLowerIt ;
}
while ( dropsAfterLowerIt ! = dropsAfterLower . end ( ) ) {
const int dropInd = * dropsAfterLowerIt ;
ItemDrop : : drops [ dropInd ] . Draw ( ) ;
const ItemDrop & drop { * dropsAfterLowerIt } ;
drop . Draw ( ) ;
+ + dropsAfterLowerIt ;
}
for ( const IBullet * const b : bulletsLower ) {
for ( std : : unique_ptr < IBullet > & b : bulletsLower ) {
b - > _Draw ( ) ;
}
for ( const Effect * const e : foregroundEffectsLower ) {
for ( std : : unique_ptr < Effect > & e : foregroundEffectsLower ) {
e - > _Draw ( ) ;
}
# pragma endregion
@ -1751,7 +1690,7 @@ void AiL::RenderWorld(float fElapsedTime){
break ;
}
while ( dropsBeforeUpperIt ! = dropsBeforeUpper . end ( ) ) {
const ItemDrop & drop = ItemDrop : : drops [ * dropsBeforeUpperIt ] ;
const ItemDrop & drop { * dropsBeforeUpperIt } ;
if ( drop . pos . y < topTileY ) {
drop . Draw ( ) ;
+ + dropsBeforeUpperIt ;
@ -1767,7 +1706,7 @@ void AiL::RenderWorld(float fElapsedTime){
+ + monstersBeforeUpperIt ;
}
while ( dropsBeforeUpperIt ! = dropsBeforeUpper . end ( ) ) {
const ItemDrop & drop = ItemDrop : : drops [ * dropsBeforeUpperIt ] ;
const ItemDrop & drop { * dropsBeforeUpperIt } ;
drop . Draw ( ) ;
+ + dropsBeforeUpperIt ;
}
@ -1776,6 +1715,8 @@ void AiL::RenderWorld(float fElapsedTime){
vf2d shadowScale = vf2d { 8 * player - > GetSizeMult ( ) / 3.f , 1 } / std : : max ( 1.f , player - > GetZ ( ) / 24 ) ;
view . DrawDecal ( player - > GetPos ( ) - vf2d { 3 , 3 } * shadowScale / 2 + vf2d { 0 , 6 * player - > GetSizeMult ( ) } , GFX [ " circle.png " ] . Decal ( ) , shadowScale , BLACK ) ;
}
if ( player - > IsUsingAdditiveBlending ( ) ) SetDecalMode ( DecalMode : : ADDITIVE ) ;
else SetDecalMode ( DecalMode : : NORMAL ) ;
RenderPlayer ( player - > GetPos ( ) , { 1 , 1 } ) ;
}
while ( monstersAfterUpperIt ! = monstersAfterUpper . end ( ) ) {
@ -1788,7 +1729,7 @@ void AiL::RenderWorld(float fElapsedTime){
break ;
}
while ( dropsAfterUpperIt ! = dropsAfterUpper . end ( ) ) {
const ItemDrop & drop = ItemDrop : : drops [ * dropsAfterUpperIt ] ;
const ItemDrop & drop { * dropsAfterUpperIt } ;
if ( drop . pos . y < topTileY ) {
drop . Draw ( ) ;
+ + dropsAfterUpperIt ;
@ -1812,7 +1753,7 @@ void AiL::RenderWorld(float fElapsedTime){
break ;
}
while ( dropsBeforeUpperIt ! = dropsBeforeUpper . end ( ) ) {
const ItemDrop & drop = ItemDrop : : drops [ * dropsBeforeUpperIt ] ;
const ItemDrop & drop { * dropsBeforeUpperIt } ;
if ( drop . pos . y < tile - > group - > GetCollisionRange ( ) . middle ( ) . y ) {
drop . Draw ( ) ;
+ + dropsBeforeUpperIt ;
@ -1828,7 +1769,7 @@ void AiL::RenderWorld(float fElapsedTime){
+ + monstersBeforeUpperIt ;
}
while ( dropsBeforeUpperIt ! = dropsBeforeUpper . end ( ) ) {
const ItemDrop & drop = ItemDrop : : drops [ * dropsBeforeUpperIt ] ;
const ItemDrop & drop { * dropsBeforeUpperIt } ;
drop . Draw ( ) ;
+ + dropsBeforeUpperIt ;
}
@ -1837,6 +1778,8 @@ void AiL::RenderWorld(float fElapsedTime){
vf2d shadowScale = vf2d { 8 * player - > GetSizeMult ( ) / 3.f , 1 } / std : : max ( 1.f , player - > GetZ ( ) / 24 ) ;
view . DrawDecal ( player - > GetPos ( ) - vf2d { 3 , 3 } * shadowScale / 2 + vf2d { 0 , 6 * player - > GetSizeMult ( ) } , GFX [ " circle.png " ] . Decal ( ) , shadowScale , BLACK ) ;
}
if ( player - > IsUsingAdditiveBlending ( ) ) SetDecalMode ( DecalMode : : ADDITIVE ) ;
else SetDecalMode ( DecalMode : : NORMAL ) ;
RenderPlayer ( player - > GetPos ( ) , { 1 , 1 } ) ;
}
while ( monstersAfterUpperIt ! = monstersAfterUpper . end ( ) ) {
@ -1849,7 +1792,7 @@ void AiL::RenderWorld(float fElapsedTime){
break ;
}
while ( dropsAfterUpperIt ! = dropsAfterUpper . end ( ) ) {
const ItemDrop & drop = ItemDrop : : drops [ * dropsAfterUpperIt ] ;
const ItemDrop & drop { * dropsAfterUpperIt } ;
if ( drop . pos . y < tile - > group - > GetCollisionRange ( ) . middle ( ) . y ) {
drop . Draw ( ) ;
+ + dropsAfterUpperIt ;
@ -1871,16 +1814,16 @@ void AiL::RenderWorld(float fElapsedTime){
# pragma endregion
# pragma region Remaining Upper Rendering
while ( monstersBeforeUpperIt ! = monstersBeforeUpper . end ( ) ) {
Monster * const m = * monstersBeforeUpperIt ;
m - > Draw ( ) ;
const Monster & m = * * monstersBeforeUpperIt ;
m . Draw ( ) ;
+ + monstersBeforeUpperIt ;
}
for ( const Effect * const e : backgroundEffectsUpper ) {
for ( std : : unique_ptr < Effect > & e : backgroundEffectsUpper ) {
e - > _Draw ( ) ;
}
while ( dropsBeforeUpperIt ! = dropsBeforeUpper . end ( ) ) {
const int dropInd = * dropsBeforeUpperIt ;
ItemDrop : : drops [ dropInd ] . Draw ( ) ;
const ItemDrop & drop { * dropsBeforeUpperIt } ;
drop . Draw ( ) ;
+ + dropsBeforeUpperIt ;
}
if ( ! player - > rendered & & player - > upperLevel ) {
@ -1892,19 +1835,19 @@ void AiL::RenderWorld(float fElapsedTime){
RenderPlayer ( player - > GetPos ( ) , { 1 , 1 } ) ;
}
while ( monstersAfterUpperIt ! = monstersAfterUpper . end ( ) ) {
Monster * const m = * monstersAfterUpperIt ;
m - > Draw ( ) ;
const Monster & m = * * monstersAfterUpperIt ;
m . Draw ( ) ;
+ + monstersAfterUpperIt ;
}
while ( dropsAfterUpperIt ! = dropsAfterUpper . end ( ) ) {
const int dropInd = * dropsAfterUpperIt ;
ItemDrop : : drops [ dropInd ] . Draw ( ) ;
const ItemDrop & drop { * dropsAfterUpperIt } ;
drop . Draw ( ) ;
+ + dropsAfterUpperIt ;
}
for ( const IBullet * const b : bulletsUpper ) {
for ( std : : unique_ptr < IBullet > & b : bulletsUpper ) {
b - > _Draw ( ) ;
}
for ( const Effect * const e : foregroundEffectsUpper ) {
for ( std : : unique_ptr < Effect > & e : foregroundEffectsUpper ) {
e - > _Draw ( ) ;
}
# pragma endregion