Merge pull request #8567 from archimede67/editor-fix-automapper-issues

[Editor] Fix various automapper issues
This commit is contained in:
Dennis Felsing 2024-07-06 21:22:29 +00:00 committed by GitHub
commit aee9c7222f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -293,10 +293,18 @@ void CAutoMapper::Load(const char *pTileName)
{ {
for(const auto &Index : vNewIndexList) for(const auto &Index : vNewIndexList)
{ {
if(Value == CPosRule::INDEX && Index.m_Id == 0) if(Index.m_Id == 0 && Value == CPosRule::INDEX)
{
// Skip full tiles if we have a rule "POS 0 0 INDEX 0"
// because that forces the tile to be empty
pCurrentIndex->m_SkipFull = true; pCurrentIndex->m_SkipFull = true;
else }
else if((Index.m_Id > 0 && Value == CPosRule::INDEX) || (Index.m_Id == 0 && Value == CPosRule::NOTINDEX))
{
// Skip empty tiles if we have a rule "POS 0 0 INDEX i" where i > 0
// or if we have a rule "POS 0 0 NOTINDEX 0"
pCurrentIndex->m_SkipEmpty = true; pCurrentIndex->m_SkipEmpty = true;
}
} }
} }
} }
@ -334,14 +342,25 @@ void CAutoMapper::Load(const char *pTileName)
for(auto &IndexRule : Run.m_vIndexRules) for(auto &IndexRule : Run.m_vIndexRules)
{ {
bool Found = false; bool Found = false;
// Search for the exact rule "POS 0 0 INDEX 0" which corresponds to the default rule
for(const auto &Rule : IndexRule.m_vRules) for(const auto &Rule : IndexRule.m_vRules)
{ {
if(Rule.m_X == 0 && Rule.m_Y == 0) if(Rule.m_X == 0 && Rule.m_Y == 0 && Rule.m_Value == CPosRule::INDEX)
{ {
Found = true; for(const auto &Index : Rule.m_vIndexList)
{
if(Index.m_Id == 0)
Found = true;
}
break; break;
} }
if(Found)
break;
} }
// If the default rule was not found, and we require it, then add it
if(!Found && IndexRule.m_DefaultRule) if(!Found && IndexRule.m_DefaultRule)
{ {
std::vector<CIndexInfo> vNewIndexList; std::vector<CIndexInfo> vNewIndexList;
@ -353,6 +372,7 @@ void CAutoMapper::Load(const char *pTileName)
IndexRule.m_SkipEmpty = true; IndexRule.m_SkipEmpty = true;
IndexRule.m_SkipFull = false; IndexRule.m_SkipFull = false;
} }
if(IndexRule.m_SkipEmpty && IndexRule.m_SkipFull) if(IndexRule.m_SkipEmpty && IndexRule.m_SkipFull)
{ {
IndexRule.m_SkipEmpty = false; IndexRule.m_SkipEmpty = false;
@ -475,14 +495,15 @@ void CAutoMapper::Proceed(CLayerTiles *pLayer, int ConfigId, int Seed, int SeedO
for(int x = 0; x < pLayer->m_Width; x++) for(int x = 0; x < pLayer->m_Width; x++)
{ {
CTile *pTile = &(pLayer->m_pTiles[y * pLayer->m_Width + x]); CTile *pTile = &(pLayer->m_pTiles[y * pLayer->m_Width + x]);
const CTile *pReadTile = &(pReadLayer->m_pTiles[y * pLayer->m_Width + x]);
Editor()->m_Map.OnModify(); Editor()->m_Map.OnModify();
for(size_t i = 0; i < pRun->m_vIndexRules.size(); ++i) for(size_t i = 0; i < pRun->m_vIndexRules.size(); ++i)
{ {
CIndexRule *pIndexRule = &pRun->m_vIndexRules[i]; CIndexRule *pIndexRule = &pRun->m_vIndexRules[i];
if(pIndexRule->m_SkipEmpty && pTile->m_Index == 0) // skip empty tiles if(pIndexRule->m_SkipEmpty && pReadTile->m_Index == 0) // skip empty tiles
continue; continue;
if(pIndexRule->m_SkipFull && pTile->m_Index != 0) // skip full tiles if(pIndexRule->m_SkipFull && pReadTile->m_Index != 0) // skip full tiles
continue; continue;
bool RespectRules = true; bool RespectRules = true;