diff --git a/hch/CObjectHandler.cpp b/hch/CObjectHandler.cpp index e4ce5ef3f..6a19f43c6 100644 --- a/hch/CObjectHandler.cpp +++ b/hch/CObjectHandler.cpp @@ -482,12 +482,24 @@ void CGObjectInstance::onHeroVisit( const CGHeroInstance * h ) const { switch(ID) { - case 95: - OpenWindow ow; - ow.window = OpenWindow::TAVERN_WINDOW; - ow.id1 = h->id; - ow.id2 = id; - cb->sendAndApply(&ow); + case 80: //Sanctuary + { + InfoWindow iw; + iw.player = h->tempOwner; + iw.soundID = soundBase::GETPROTECTION; + iw.text.addTxt(MetaString::ADVOB_TXT, 114); //You enter the sanctuary and immediately feel as if a great weight has been lifted off your shoulders. You feel safe here. + cb->sendAndApply(&iw); + } + break; + case 95: //Tavern + { + OpenWindow ow; + ow.window = OpenWindow::TAVERN_WINDOW; + ow.id1 = h->id; + ow.id2 = id; + cb->sendAndApply(&ow); + } + break; } } @@ -982,10 +994,10 @@ void CGHeroInstance::initObj() bonus.type = Bonus::PRIMARY_SKILL; //TODO: limit to specific creature type bonus.valType = Bonus::ADDITIVE_VALUE; bonus.subtype = 1; //attack - bonus.val = level * (*creatures)[it->additionalinfo]->attack / (*creatures)[it->additionalinfo]->level /20; + bonus.val = level * (*creatures)[it->additionalinfo]->attack / creLevel /20; speciality.bonuses.push_back (bonus); bonus.subtype = 2; //defense - bonus.val = level * (*creatures)[it->additionalinfo]->defence / (*creatures)[it->additionalinfo]->level /20; + bonus.val = level * (*creatures)[it->additionalinfo]->defence / creLevel /20; speciality.bonuses.push_back (bonus); bonus.type = Bonus::STACKS_SPEED; bonus.val = 1; //+1 speed diff --git a/lib/CGameState.cpp b/lib/CGameState.cpp index 897fa01fe..d8cea2ffa 100644 --- a/lib/CGameState.cpp +++ b/lib/CGameState.cpp @@ -2172,21 +2172,27 @@ void CGameState::calculatePaths(const CGHeroInstance *hero, CPathsInfo &out, int } else if(tinfo->visitable) { - for(size_t ii = 0; ii < tinfo->visitableObjects.size(); ii++) + //hero is protected in Sanctuary + if(tinfo->visitableObjects.front()->ID == 80 && tinfo->visitableObjects.back()->ID == HEROI_TYPE && tinfo->visitableObjects.back()->tempOwner != hero->tempOwner) + node.accessible = CGPathNode::BLOCKED; + else { - const CGObjectInstance * const obj = tinfo->visitableObjects[ii]; - if(obj->getPassableness() & 1<tempOwner) //special object instance specific passableness flag - overwrites other accessibility flags + for(size_t ii = 0; ii < tinfo->visitableObjects.size(); ii++) { - node.accessible = CGPathNode::ACCESSIBLE; - } - else if(obj->blockVisit) - { - node.accessible = CGPathNode::BLOCKVIS; - break; - } - else if(obj->ID != EVENTI_TYPE) //pathfinder should ignore placed events - { - node.accessible = CGPathNode::VISITABLE; + const CGObjectInstance * const obj = tinfo->visitableObjects[ii]; + if(obj->getPassableness() & 1<tempOwner) //special object instance specific passableness flag - overwrites other accessibility flags + { + node.accessible = CGPathNode::ACCESSIBLE; + } + else if(obj->blockVisit) + { + node.accessible = CGPathNode::BLOCKVIS; + break; + } + else if(obj->ID != EVENTI_TYPE) //pathfinder should ignore placed events + { + node.accessible = CGPathNode::VISITABLE; + } } } }