diff --git a/src/fheroes2/ai/ai_hero_action.cpp b/src/fheroes2/ai/ai_hero_action.cpp index 47f3390186c..0f5070e7d89 100644 --- a/src/fheroes2/ai/ai_hero_action.cpp +++ b/src/fheroes2/ai/ai_hero_action.cpp @@ -542,7 +542,7 @@ namespace if ( destroy ) { setMonsterCountOnTile( tile, 0 ); - tile.RemoveObjectSprite(); + removeObjectSprite( tile ); tile.setAsEmpty(); } } @@ -555,7 +555,7 @@ namespace hero.GetKingdom().AddFundsResource( getFundsFromTile( tile ) ); } - tile.RemoveObjectSprite(); + removeObjectSprite( tile ); resetObjectInfoOnTile( tile ); hero.GetPath().Reset(); @@ -634,7 +634,7 @@ namespace kingdom.AddFundsResource( Funds( Resource::GOLD, gold ) ); } - tile.RemoveObjectSprite(); + removeObjectSprite( tile ); resetObjectInfoOnTile( tile ); DEBUG_LOG( DBG_AI, DBG_INFO, hero.GetName() ) @@ -756,7 +756,7 @@ namespace Maps::Tiles & tile = world.GetTiles( dst_index ); hero.GetKingdom().AddFundsResource( getFundsFromTile( tile ) ); - tile.RemoveObjectSprite(); + removeObjectSprite( tile ); resetObjectInfoOnTile( tile ); DEBUG_LOG( DBG_AI, DBG_INFO, hero.GetName() ) @@ -1308,7 +1308,7 @@ namespace // Remove genie lamp sprite if no genies are available to hire. if ( MP2::OBJ_GENIE_LAMP == objectType && ( availableTroopCount == recruitTroopCount ) ) { - tile.RemoveObjectSprite(); + removeObjectSprite( tile ); tile.setAsEmpty(); } @@ -1393,7 +1393,7 @@ namespace const Kingdom & kingdom = hero.GetKingdom(); if ( kingdom.IsVisitTravelersTent( getColorFromTile( tile ) ) ) { - tile.RemoveObjectSprite(); + removeObjectSprite( tile ); tile.setAsEmpty(); } @@ -1419,7 +1419,7 @@ namespace else hero.PickupArtifact( getArtifactFromTile( tile ) ); - tile.RemoveObjectSprite(); + removeObjectSprite( tile ); resetObjectInfoOnTile( tile ); DEBUG_LOG( DBG_AI, DBG_INFO, hero.GetName() ) @@ -1466,7 +1466,7 @@ namespace } if ( result && hero.PickupArtifact( art ) ) { - tile.RemoveObjectSprite(); + removeObjectSprite( tile ); resetObjectInfoOnTile( tile ); } } @@ -1540,7 +1540,7 @@ namespace if ( kingdom.GetHeroes().size() < Kingdom::GetMaxHeroes() ) { Maps::Tiles & tile = world.GetTiles( tileIndex ); - tile.RemoveObjectSprite(); + removeObjectSprite( tile ); tile.setAsEmpty(); Heroes * prisoner = world.FromJailHeroes( tileIndex ); diff --git a/src/fheroes2/gui/interface_gamearea.cpp b/src/fheroes2/gui/interface_gamearea.cpp index 577f5716176..6e606329557 100644 --- a/src/fheroes2/gui/interface_gamearea.cpp +++ b/src/fheroes2/gui/interface_gamearea.cpp @@ -48,6 +48,7 @@ #include "logging.h" #include "maps.h" #include "maps_tiles.h" +#include "maps_tiles_helper.h" #include "maps_tiles_render.h" #include "pal.h" #include "players.h" @@ -1074,7 +1075,7 @@ Interface::ObjectFadingOutInfo::~ObjectFadingOutInfo() Maps::Tiles & tile = world.GetTiles( tileId ); if ( tile.GetObject() == type ) { - tile.RemoveObjectSprite(); + removeObjectSprite( tile ); tile.setAsEmpty(); } } diff --git a/src/fheroes2/heroes/heroes.cpp b/src/fheroes2/heroes/heroes.cpp index 433a35b8904..913f14ffff0 100644 --- a/src/fheroes2/heroes/heroes.cpp +++ b/src/fheroes2/heroes/heroes.cpp @@ -1101,21 +1101,6 @@ void Heroes::ResetAction() ResetModes( ACTION ); } -uint32_t Heroes::GetCountArtifacts() const -{ - return bag_artifacts.CountArtifacts(); -} - -bool Heroes::HasUltimateArtifact() const -{ - return bag_artifacts.ContainUltimateArtifact(); -} - -bool Heroes::IsFullBagArtifacts() const -{ - return bag_artifacts.isFull(); -} - bool Heroes::PickupArtifact( const Artifact & art ) { if ( !art.isValid() ) { @@ -1392,11 +1377,6 @@ void Heroes::SetShipMaster( bool f ) f ? SetModes( SHIPMASTER ) : ResetModes( SHIPMASTER ); } -Skill::SecSkills & Heroes::GetSecondarySkills() -{ - return secondary_skills; -} - bool Heroes::HasSecondarySkill( int skill ) const { return Skill::Level::NONE != secondary_skills.GetLevel( skill ); @@ -1592,7 +1572,6 @@ void Heroes::LevelUpSecondarySkill( const HeroSeedsForLevelUp & seeds, int prima } } -/* apply penalty */ void Heroes::ApplyPenaltyMovement( uint32_t penalty ) { if ( move_point >= penalty ) diff --git a/src/fheroes2/heroes/heroes.h b/src/fheroes2/heroes/heroes.h index 908693c5e86..3b1588c2690 100644 --- a/src/fheroes2/heroes/heroes.h +++ b/src/fheroes2/heroes/heroes.h @@ -370,12 +370,28 @@ class Heroes final : public HeroBase, public ColorBase int GetLevelSkill( int ) const override; uint32_t GetSecondaryValues( int skill ) const override; void LearnSkill( const Skill::Secondary & ); - Skill::SecSkills & GetSecondarySkills(); + + Skill::SecSkills & GetSecondarySkills() + { + return secondary_skills; + } bool PickupArtifact( const Artifact & ); - bool HasUltimateArtifact() const; - uint32_t GetCountArtifacts() const; - bool IsFullBagArtifacts() const; + + bool HasUltimateArtifact() const + { + return bag_artifacts.ContainUltimateArtifact(); + } + + uint32_t GetCountArtifacts() const + { + return bag_artifacts.CountArtifacts(); + } + + bool IsFullBagArtifacts() const + { + return bag_artifacts.isFull(); + } int GetMobilityIndexSprite() const; diff --git a/src/fheroes2/maps/maps_tiles.cpp b/src/fheroes2/maps/maps_tiles.cpp index 81e14a003e1..98f7b50814c 100644 --- a/src/fheroes2/maps/maps_tiles.cpp +++ b/src/fheroes2/maps/maps_tiles.cpp @@ -1530,84 +1530,6 @@ void Maps::Tiles::updateObjectImageIndex( const uint32_t objectUid, const MP2::O } } -void Maps::Tiles::RemoveObjectSprite() -{ - switch ( GetObject() ) { - case MP2::OBJ_MONSTER: - Remove( _uid ); - break; - case MP2::OBJ_JAIL: - RemoveJailSprite(); - tilePassable = DIRECTION_ALL; - break; - case MP2::OBJ_ARTIFACT: { - const uint32_t uidArtifact = getObjectIdByObjectIcnType( MP2::OBJ_ICN_TYPE_OBJNARTI ); - Remove( uidArtifact ); - - if ( Maps::isValidDirection( _index, Direction::LEFT ) ) - world.GetTiles( Maps::GetDirectionIndex( _index, Direction::LEFT ) ).Remove( uidArtifact ); - break; - } - case MP2::OBJ_TREASURE_CHEST: - case MP2::OBJ_RESOURCE: { - const uint32_t uidResource = getObjectIdByObjectIcnType( MP2::OBJ_ICN_TYPE_OBJNRSRC ); - Remove( uidResource ); - - if ( Maps::isValidDirection( _index, Direction::LEFT ) ) - world.GetTiles( Maps::GetDirectionIndex( _index, Direction::LEFT ) ).Remove( uidResource ); - break; - } - case MP2::OBJ_BARRIER: - tilePassable = DIRECTION_ALL; - [[fallthrough]]; - default: - // remove shadow sprite from left cell - if ( Maps::isValidDirection( _index, Direction::LEFT ) ) - world.GetTiles( Maps::GetDirectionIndex( _index, Direction::LEFT ) ).Remove( _uid ); - - Remove( _uid ); - break; - } -} - -void Maps::Tiles::RemoveJailSprite() -{ - // remove left sprite - if ( Maps::isValidDirection( _index, Direction::LEFT ) ) { - const int32_t left = Maps::GetDirectionIndex( _index, Direction::LEFT ); - world.GetTiles( left ).Remove( _uid ); - - // remove left left sprite - if ( Maps::isValidDirection( left, Direction::LEFT ) ) - world.GetTiles( Maps::GetDirectionIndex( left, Direction::LEFT ) ).Remove( _uid ); - } - - // remove top sprite - if ( Maps::isValidDirection( _index, Direction::TOP ) ) { - const int32_t top = Maps::GetDirectionIndex( _index, Direction::TOP ); - Maps::Tiles & topTile = world.GetTiles( top ); - topTile.Remove( _uid ); - - if ( topTile.GetObject() == MP2::OBJ_JAIL ) { - topTile.setAsEmpty(); - topTile.FixObject(); - } - - // remove top left sprite - if ( Maps::isValidDirection( top, Direction::LEFT ) ) { - Maps::Tiles & leftTile = world.GetTiles( Maps::GetDirectionIndex( top, Direction::LEFT ) ); - leftTile.Remove( _uid ); - - if ( leftTile.GetObject() == MP2::OBJ_JAIL ) { - leftTile.setAsEmpty(); - leftTile.FixObject(); - } - } - } - - Remove( _uid ); -} - void Maps::Tiles::ClearFog( const int colors ) { _fogColors &= ~colors; diff --git a/src/fheroes2/maps/maps_tiles.h b/src/fheroes2/maps/maps_tiles.h index 3fbf754f8c7..b598c3c1355 100644 --- a/src/fheroes2/maps/maps_tiles.h +++ b/src/fheroes2/maps/maps_tiles.h @@ -159,6 +159,11 @@ namespace Maps return tilePassable; } + void resetPassability() + { + tilePassable = DIRECTION_ALL; + } + int GetGround() const; bool isWater() const @@ -291,7 +296,7 @@ namespace Maps void AddonsSort(); void Remove( uint32_t uniqID ); - void RemoveObjectSprite(); + void updateObjectImageIndex( const uint32_t objectUid, const MP2::ObjectIcnType objectIcnType, const int imageIndexOffset ); void replaceObject( const uint32_t objectUid, const MP2::ObjectIcnType originalObjectIcnType, const MP2::ObjectIcnType newObjectIcnType, const uint8_t originalImageIndex, const uint8_t newImageIndex ); @@ -367,7 +372,6 @@ namespace Maps // Set or remove a flag which belongs to UID of the object. void updateFlag( const int color, const uint8_t objectSpriteIndex, const uint32_t uid, const bool setOnUpperLayer ); - void RemoveJailSprite(); bool isTallObject() const; diff --git a/src/fheroes2/maps/maps_tiles_helper.cpp b/src/fheroes2/maps/maps_tiles_helper.cpp index 1bb614bf233..434758ffb4c 100644 --- a/src/fheroes2/maps/maps_tiles_helper.cpp +++ b/src/fheroes2/maps/maps_tiles_helper.cpp @@ -187,6 +187,46 @@ namespace tile.setObjectSpriteIndex( static_cast( mons.GetID() - 1 ) ); // ICN::MONS32 starts from PEASANT } + + void removeJailSprite( Maps::Tiles & tile ) + { + assert( tile.GetObject() == MP2::OBJ_JAIL ); + + // remove left sprite + if ( Maps::isValidDirection( tile.GetIndex(), Direction::LEFT ) ) { + const int32_t left = Maps::GetDirectionIndex( tile.GetIndex(), Direction::LEFT ); + world.GetTiles( left ).Remove( tile.GetObjectUID() ); + + // remove left left sprite + if ( Maps::isValidDirection( left, Direction::LEFT ) ) + world.GetTiles( Maps::GetDirectionIndex( left, Direction::LEFT ) ).Remove( tile.GetObjectUID() ); + } + + // remove top sprite + if ( Maps::isValidDirection( tile.GetIndex(), Direction::TOP ) ) { + const int32_t top = Maps::GetDirectionIndex( tile.GetIndex(), Direction::TOP ); + Maps::Tiles & topTile = world.GetTiles( top ); + topTile.Remove( tile.GetObjectUID() ); + + if ( topTile.GetObject() == MP2::OBJ_JAIL ) { + topTile.setAsEmpty(); + topTile.FixObject(); + } + + // remove top left sprite + if ( Maps::isValidDirection( top, Direction::LEFT ) ) { + Maps::Tiles & leftTile = world.GetTiles( Maps::GetDirectionIndex( top, Direction::LEFT ) ); + leftTile.Remove( tile.GetObjectUID() ); + + if ( leftTile.GetObject() == MP2::OBJ_JAIL ) { + leftTile.setAsEmpty(); + leftTile.FixObject(); + } + } + } + + tile.Remove( tile.GetObjectUID() ); + } } namespace Maps @@ -1723,4 +1763,44 @@ namespace Maps restoreMineObjectType( Direction::TOP_LEFT ); restoreMineObjectType( Direction::TOP_RIGHT ); } + + void removeObjectSprite( Tiles & tile ) + { + switch ( tile.GetObject() ) { + case MP2::OBJ_MONSTER: + tile.Remove( tile.GetObjectUID() ); + break; + case MP2::OBJ_JAIL: + removeJailSprite( tile ); + tile.resetPassability(); + break; + case MP2::OBJ_ARTIFACT: { + const uint32_t uidArtifact = tile.getObjectIdByObjectIcnType( MP2::OBJ_ICN_TYPE_OBJNARTI ); + tile.Remove( uidArtifact ); + + if ( Maps::isValidDirection( tile.GetIndex(), Direction::LEFT ) ) + world.GetTiles( Maps::GetDirectionIndex( tile.GetIndex(), Direction::LEFT ) ).Remove( uidArtifact ); + break; + } + case MP2::OBJ_TREASURE_CHEST: + case MP2::OBJ_RESOURCE: { + const uint32_t uidResource = tile.getObjectIdByObjectIcnType( MP2::OBJ_ICN_TYPE_OBJNRSRC ); + tile.Remove( uidResource ); + + if ( Maps::isValidDirection( tile.GetIndex(), Direction::LEFT ) ) + world.GetTiles( Maps::GetDirectionIndex( tile.GetIndex(), Direction::LEFT ) ).Remove( uidResource ); + break; + } + case MP2::OBJ_BARRIER: + tile.resetPassability(); + [[fallthrough]]; + default: + // remove shadow sprite from left cell + if ( Maps::isValidDirection( tile.GetIndex(), Direction::LEFT ) ) + world.GetTiles( Maps::GetDirectionIndex( tile.GetIndex(), Direction::LEFT ) ).Remove( tile.GetObjectUID() ); + + tile.Remove( tile.GetObjectUID() ); + break; + } + } } diff --git a/src/fheroes2/maps/maps_tiles_helper.h b/src/fheroes2/maps/maps_tiles_helper.h index b81ffea14dd..e7ca9010bf5 100644 --- a/src/fheroes2/maps/maps_tiles_helper.h +++ b/src/fheroes2/maps/maps_tiles_helper.h @@ -149,4 +149,6 @@ namespace Maps // tiles. The object type for the action tile (i.e. the main tile) remains unchanged and should be // updated separately. void restoreAbandonedMine( Tiles & tile, const int resource ); + + void removeObjectSprite( Tiles & tile ); }