void CMap::addNewObject(CGObjectInstance * obj) { if(obj->id != ObjectInstanceID(objects.size())) throw std::runtime_error("Invalid object instance id"); if(obj->instanceName == "") throw std::runtime_error("Object instance name missing"); auto it = instanceNames.find(obj->instanceName); if(it != instanceNames.end()) throw std::runtime_error("Object instance name duplicated:"+obj->instanceName); objects.push_back(obj); instanceNames[obj->instanceName] = obj; addBlockVisTiles(obj); if(obj->ID == Obj::TOWN) { towns.push_back(static_cast<CGTownInstance *>(obj)); } if(obj->ID == Obj::HERO) { heroesOnMap.push_back(static_cast<CGHeroInstance*>(obj)); } }
bool CRewardableObject::wasVisited(PlayerColor player) const { switch (visitMode) { case VISIT_UNLIMITED: case VISIT_BONUS: return false; case VISIT_ONCE: return vstd::contains(cb->getPlayer(player)->visitedObjects, ObjectInstanceID(id)); case VISIT_HERO: return false; case VISIT_PLAYER: return vstd::contains(cb->getPlayer(player)->visitedObjects, ObjectInstanceID(id)); default: return false; } }
void SetAvailableArtifacts::applyCl(CClient *cl) { if(id < 0) //artifact merchants globally { for(auto & elem : cl->playerint) elem.second->availableArtifactsChanged(nullptr); } else { const CGBlackMarket *bm = dynamic_cast<const CGBlackMarket *>(cl->getObj(ObjectInstanceID(id))); assert(bm); INTERFACE_CALL_IF_PRESENT(cl->getTile(bm->visitablePos())->visitableObjects.back()->tempOwner, availableArtifactsChanged, bm); } }
bool CRewardableObject::wasVisited(const CGHeroInstance * h) const { switch (visitMode) { case VISIT_UNLIMITED: return false; case VISIT_BONUS: return h->hasBonusFrom(Bonus::OBJECT, ID); case VISIT_HERO: return h->visitedObjects.count(ObjectInstanceID(id)); default: return wasVisited(h->tempOwner); } }
void RemoveBonus::applyCl(CClient *cl) { cl->invalidatePaths(); switch(who) { case HERO: { const CGHeroInstance *h = GS(cl)->getHero(ObjectInstanceID(id)); INTERFACE_CALL_IF_PRESENT(h->tempOwner, heroBonusChanged, h, bonus,false); } break; case PLAYER: { //const PlayerState *p = GS(cl)->getPlayer(id); INTERFACE_CALL_IF_PRESENT(PlayerColor(id), playerBonusChanged, bonus, false); } break; } }
void OpenWindow::applyCl(CClient *cl) { switch(window) { case RECRUITMENT_FIRST: case RECRUITMENT_ALL: { const CGDwelling *dw = dynamic_cast<const CGDwelling*>(cl->getObj(ObjectInstanceID(id1))); const CArmedInstance *dst = dynamic_cast<const CArmedInstance*>(cl->getObj(ObjectInstanceID(id2))); INTERFACE_CALL_IF_PRESENT(dst->tempOwner,showRecruitmentDialog, dw, dst, window == RECRUITMENT_FIRST ? 0 : -1); } break; case SHIPYARD_WINDOW: { const IShipyard *sy = IShipyard::castFrom(cl->getObj(ObjectInstanceID(id1))); INTERFACE_CALL_IF_PRESENT(sy->o->tempOwner, showShipyardDialog, sy); } break; case THIEVES_GUILD: { //displays Thieves' Guild window (when hero enters Den of Thieves) const CGObjectInstance *obj = cl->getObj(ObjectInstanceID(id2)); INTERFACE_CALL_IF_PRESENT(PlayerColor(id1), showThievesGuildWindow, obj); } break; case UNIVERSITY_WINDOW: { //displays University window (when hero enters University on adventure map) const IMarket *market = IMarket::castFrom(cl->getObj(ObjectInstanceID(id1))); const CGHeroInstance *hero = cl->getHero(ObjectInstanceID(id2)); INTERFACE_CALL_IF_PRESENT(hero->tempOwner,showUniversityWindow, market, hero); } break; case MARKET_WINDOW: { //displays Thieves' Guild window (when hero enters Den of Thieves) const CGObjectInstance *obj = cl->getObj(ObjectInstanceID(id1)); const CGHeroInstance *hero = cl->getHero(ObjectInstanceID(id2)); const IMarket *market = IMarket::castFrom(obj); INTERFACE_CALL_IF_PRESENT(cl->getTile(obj->visitablePos())->visitableObjects.back()->tempOwner, showMarketWindow, market, hero); } break; case HILL_FORT_WINDOW: { //displays Hill fort window const CGObjectInstance *obj = cl->getObj(ObjectInstanceID(id1)); const CGHeroInstance *hero = cl->getHero(ObjectInstanceID(id2)); INTERFACE_CALL_IF_PRESENT(cl->getTile(obj->visitablePos())->visitableObjects.back()->tempOwner, showHillFortWindow, obj, hero); } break; case PUZZLE_MAP: { INTERFACE_CALL_IF_PRESENT(PlayerColor(id1), showPuzzleMap); } break; case TAVERN_WINDOW: const CGObjectInstance *obj1 = cl->getObj(ObjectInstanceID(id1)), *obj2 = cl->getObj(ObjectInstanceID(id2)); INTERFACE_CALL_IF_PRESENT(obj1->tempOwner, showTavernWindow, obj2); break; } }
HeroPtr::HeroPtr() { h = nullptr; hid = ObjectInstanceID(); }