1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-06 09:09:40 +02:00

use subid

This commit is contained in:
Laserlicht
2024-10-01 20:44:08 +02:00
parent bd58caac13
commit e85e938865
3 changed files with 13 additions and 12 deletions

View File

@@ -43,7 +43,7 @@ AdventureMapShortcuts::AdventureMapShortcuts(AdventureMapInterface & owner)
: owner(owner) : owner(owner)
, state(EAdventureState::NOT_INITIALIZED) , state(EAdventureState::NOT_INITIALIZED)
, mapLevel(0) , mapLevel(0)
, searchLast(MapObjectID::NO_OBJ) , searchLast({MapObjectID::NO_OBJ, 0})
, searchPos(0) , searchPos(0)
{} {}
@@ -471,21 +471,22 @@ void AdventureMapShortcuts::search()
for(int y = 0; y < mapSizes.y; y++) for(int y = 0; y < mapSizes.y; y++)
for(int z = 0; z < mapSizes.z; z++) for(int z = 0; z < mapSizes.z; z++)
for(auto & obj : LOCPLINT->cb->getVisitableObjs(int3(x, y, z), false)) for(auto & obj : LOCPLINT->cb->getVisitableObjs(int3(x, y, z), false))
visitableObjInstances.push_back(obj->id); if(obj->ID != MapObjectID::MONSTER && obj->ID != MapObjectID::EVENT && obj->ID != MapObjectID::HERO)
visitableObjInstances.push_back(obj->id);
// count of elements for each group // count of elements for each group
std::map<MapObjectID, int> mapObjCount; std::map<std::pair<MapObjectID, MapObjectSubID>, int> mapObjCount;
for(auto & obj : visitableObjInstances) for(auto & obj : visitableObjInstances)
mapObjCount[LOCPLINT->cb->getObjInstance(obj)->getObjGroupIndex()]++; mapObjCount[{ LOCPLINT->cb->getObjInstance(obj)->getObjGroupIndex(), LOCPLINT->cb->getObjInstance(obj)->getObjTypeIndex() }]++;
// sort by name // sort by name
std::vector<std::pair<MapObjectID, int>> mapObjCountList; std::vector<std::pair<std::pair<MapObjectID, MapObjectSubID>, int>> mapObjCountList;
for (auto itr = mapObjCount.begin(); itr != mapObjCount.end(); ++itr) for (auto itr = mapObjCount.begin(); itr != mapObjCount.end(); ++itr)
mapObjCountList.push_back(*itr); mapObjCountList.push_back(*itr);
std::sort(mapObjCountList.begin(), mapObjCountList.end(), std::sort(mapObjCountList.begin(), mapObjCountList.end(),
[=](std::pair<MapObjectID, int>& a, std::pair<MapObjectID, int>& b) [=](std::pair<std::pair<MapObjectID, MapObjectSubID>, int>& a, std::pair<std::pair<MapObjectID, MapObjectSubID>, int>& b)
{ {
return VLC->objtypeh->getObjectName(a.first, 0) < VLC->objtypeh->getObjectName(b.first, 0); return VLC->objtypeh->getObjectName(a.first.first, a.first.second) < VLC->objtypeh->getObjectName(b.first.first, b.first.second);
} }
); );
@@ -498,7 +499,7 @@ void AdventureMapShortcuts::search()
// create texts // create texts
std::vector<std::string> texts; std::vector<std::string> texts;
for(auto & obj : mapObjCountList) for(auto & obj : mapObjCountList)
texts.push_back(VLC->objtypeh->getObjectName(obj.first, 0) + " (" + std::to_string(obj.second) + ")"); texts.push_back(VLC->objtypeh->getObjectName(obj.first.first, obj.first.second) + " (" + std::to_string(obj.second) + ")");
GH.windows().createAndPushWindow<CObjectListWindow>(texts, nullptr, CGI->generaltexth->translate("vcmi.adventureMap.search.hover"), CGI->generaltexth->translate("vcmi.adventureMap.search.help"), GH.windows().createAndPushWindow<CObjectListWindow>(texts, nullptr, CGI->generaltexth->translate("vcmi.adventureMap.search.hover"), CGI->generaltexth->translate("vcmi.adventureMap.search.help"),
[this, mapObjCountList, visitableObjInstances](int index) [this, mapObjCountList, visitableObjInstances](int index)
@@ -508,7 +509,7 @@ void AdventureMapShortcuts::search()
// filter for matching objects // filter for matching objects
std::vector<ObjectInstanceID> selVisitableObjInstances; std::vector<ObjectInstanceID> selVisitableObjInstances;
for(auto & obj : visitableObjInstances) for(auto & obj : visitableObjInstances)
if(selObj == LOCPLINT->cb->getObjInstance(obj)->getObjGroupIndex()) if(selObj == std::pair<MapObjectID, MapObjectSubID>{ LOCPLINT->cb->getObjInstance(obj)->getObjGroupIndex(), LOCPLINT->cb->getObjInstance(obj)->getObjTypeIndex() })
selVisitableObjInstances.push_back(obj); selVisitableObjInstances.push_back(obj);
if(searchPos + 1 < selVisitableObjInstances.size() && searchLast == selObj) if(searchPos + 1 < selVisitableObjInstances.size() && searchLast == selObj)
@@ -518,7 +519,7 @@ void AdventureMapShortcuts::search()
auto objInst = LOCPLINT->cb->getObjInstance(selVisitableObjInstances[searchPos]); auto objInst = LOCPLINT->cb->getObjInstance(selVisitableObjInstances[searchPos]);
owner.centerOnObject(objInst); owner.centerOnObject(objInst);
searchLast = objInst->getObjGroupIndex(); searchLast = { objInst->getObjGroupIndex(), objInst->getObjTypeIndex() };
}, lastSel); }, lastSel);
} }

View File

@@ -35,7 +35,7 @@ class AdventureMapShortcuts
EAdventureState state; EAdventureState state;
int mapLevel; int mapLevel;
MapObjectID searchLast; std::pair<MapObjectID, MapObjectSubID> searchLast;
int searchPos; int searchPos;
void showOverview(); void showOverview();

View File

@@ -353,7 +353,7 @@ TObjectTypeHandler CObjectClassesHandler::getHandlerFor(MapObjectID type, MapObj
return mapObjectTypes.front()->objectTypeHandlers.front(); return mapObjectTypes.front()->objectTypeHandlers.front();
auto subID = subtype.getNum(); auto subID = subtype.getNum();
if (type == Obj::PRISON || type == Obj::HERO_PLACEHOLDER) if (type == Obj::PRISON || type == Obj::HERO_PLACEHOLDER || type == Obj::SPELL_SCROLL)
subID = 0; subID = 0;
auto result = mapObjectTypes.at(type.getNum())->objectTypeHandlers.at(subID); auto result = mapObjectTypes.at(type.getNum())->objectTypeHandlers.at(subID);