CHR_REF Passage::whoIsBlockingPassage( const CHR_REF isrc, IDSZ idsz, const BIT_FIELD targeting_bits, IDSZ require_item ) const { // Skip if the one who is looking doesn't exist if ( !_currentModule->getObjectHandler().exists( isrc ) ) return INVALID_CHR_REF; Object *psrc = _currentModule->getObjectHandler().get( isrc ); // Look at each character for ( CHR_REF character = 0; character < OBJECTS_MAX; character++ ) { if ( !_currentModule->getObjectHandler().exists( character ) ) continue; Object * pchr = _currentModule->getObjectHandler().get( character ); // dont do scenery objects unless we allow items if ( !HAS_SOME_BITS( targeting_bits, TARGET_ITEMS ) && ( CHR_INFINITE_WEIGHT == pchr->phys.weight ) ) continue; //Check if the object has the requirements if ( !chr_check_target( psrc, character, idsz, targeting_bits ) ) continue; //Now check if it actually is inside the passage area if ( objectIsInPassage( pchr->getPosX(), pchr->getPosY(), pchr->bump_1.size ) ) { // Found a live one, do we need to check for required items as well? if ( IDSZ_NONE == require_item ) { return character; } // It needs to have a specific item as well else { // I: Check left hand if ( chr_is_type_idsz( pchr->holdingwhich[SLOT_LEFT], require_item ) ) { // It has the item... return character; } // II: Check right hand if ( chr_is_type_idsz( pchr->holdingwhich[SLOT_RIGHT], require_item ) ) { // It has the item... return character; } // III: Check the pack for(const std::shared_ptr<Object> pitem : pchr->getInventory().iterate()) { if ( chr_is_type_idsz( pitem->getCharacterID(), require_item ) ) { // It has the ipacked in inventory... return character; } } } } } // No characters found return INVALID_CHR_REF; }
void Passage::makeShop(CHR_REF owner) { //Make sure owner is valid const std::shared_ptr<Object> &powner = _currentModule->getObjectHandler()[owner]; if ( !powner || powner->isTerminated() || !powner->isAlive() ) return; //Mark as shop _isShop = true; _shopOwner = owner; // flag every item in the shop as a shop item for(const std::shared_ptr<Object> &object : _currentModule->getObjectHandler().iterator()) { if (object->isTerminated()) continue; if ( object->isitem ) { if ( objectIsInPassage( object->getPosX(), object->getPosY(), object->bump_1.size ) ) { object->isshopitem = true; // Full value object->iskursed = false; // Shop items are never kursed object->nameknown = true; } } } }
void Passage::makeShop(ObjectRef owner) { //Make sure owner is valid const std::shared_ptr<Object> &powner = _module.getObjectHandler()[owner]; if ( !powner || powner->isTerminated() || !powner->isAlive() ) return; //Mark as shop _isShop = true; _shopOwner = owner; // flag every item in the shop as a shop item for(const std::shared_ptr<Object> &object : _module.getObjectHandler().iterator()) { if (object->isTerminated()) continue; if ( object->isitem ) { if (objectIsInPassage(object)) { object->isshopitem = true; // Full value object->iskursed = false; // Shop items are never kursed object->nameknown = true; // Identify it! } } } }
bool Passage::close() { //is it already closed? if(!isOpen()) { return true; } // don't compute all of this for nothing if (EMPTY_BIT_FIELD == _mask) { return true; } // check to see if a wall can close if (0 != HAS_SOME_BITS(_mask, MAPFX_IMPASS | MAPFX_WALL)) { std::vector<std::shared_ptr<Object>> crushedCharacters; // Make sure it isn't blocked for(const std::shared_ptr<Object> &object : _module.getObjectHandler().iterator()) { //Scenery can neither be crushed nor prevents doors from closing if(object->isScenery()) { continue; } if (object->canCollide()) { if (objectIsInPassage(object)) { if (!object->canbecrushed || (object->isAlive() && object->getProfile()->canOpenStuff())) { // Someone is blocking who can open stuff, stop here return false; } else { crushedCharacters.push_back(object); } } } } // Crush any unfortunate characters for(const std::shared_ptr<Object> &character : crushedCharacters) { SET_BIT( character->ai.alert, ALERTIF_CRUSHED ); } } // Close it off _open = false; for(const Index1D &fan : _passageFans) { _module.getMeshPointer()->add_fx(fan, _mask); } return true; }
ObjectRef Passage::whoIsBlockingPassage( ObjectRef objRef, const IDSZ2& idsz, const BIT_FIELD targeting_bits, const IDSZ2& require_item ) const { // Skip if the one who is looking doesn't exist if ( !_module.getObjectHandler().exists(objRef) ) return ObjectRef::Invalid; Object *psrc = _module.getObjectHandler().get(objRef); // Look at each character for(const std::shared_ptr<Object> &pchr : _module.getObjectHandler().iterator()) { if(pchr->isTerminated()) { continue; } // dont do scenery objects unless we allow items if (!HAS_SOME_BITS(targeting_bits, TARGET_ITEMS) && pchr->isScenery()) continue; //Check if the object has the requirements if ( !chr_check_target( psrc, pchr, idsz, targeting_bits ) ) continue; //Now check if it actually is inside the passage area if (objectIsInPassage(pchr)) { // Found a live one, do we need to check for required items as well? if ( IDSZ2::None == require_item ) { return pchr->getObjRef(); } // It needs to have a specific item as well else { // I: Check hands if(pchr->isWieldingItemIDSZ(require_item)) { return pchr->getObjRef(); } // II: Check the pack for(const std::shared_ptr<Object> pitem : pchr->getInventory().iterate()) { if ( pitem->getProfile()->hasTypeIDSZ(require_item) ) { // It has the required item in inventory... return pchr->getObjRef(); } } } } } // No characters found return ObjectRef::Invalid; }
bool Passage::checkPassageMusic(const std::shared_ptr<Object> &pchr) const { if (_music == INVALID_SOUND_ID) { return false; } if(!objectIsInPassage(pchr)) { return false; } // character is inside, start music track AudioSystem::get().playMusic(_music); return true; }
bool Passage::checkPassageMusic(const Object * pchr) const { if ( _music == INVALID_SOUND_ID || _music == AudioSystem::get().getCurrentMusicPlaying() ) { return false; } if(!objectIsInPassage(pchr->getPosX(), pchr->getPosY(), pchr->bump_1.size)) { return false; } // character is inside, start music track AudioSystem::get().playMusic(_music); return true; }
bool Passage::close() { //is it already closed? if(!isOpen()) { return true; } // don't compute all of this for nothing if ( EMPTY_BIT_FIELD == _mask ) { return true; } // check to see if a wall can close if ( 0 != HAS_SOME_BITS( _mask, MAPFX_IMPASS | MAPFX_WALL ) ) { std::vector<std::shared_ptr<Object>> crushedCharacters; // Make sure it isn't blocked for(const std::shared_ptr<Object> &object : _currentModule->getObjectHandler().iterator()) { if(object->isTerminated()) { continue; } //Don't do held items if (object->isBeingHeld()) continue; if ( 0.0f != object->bump_stt.size ) { if ( objectIsInPassage( object->getPosX(), object->getPosY(), object->bump_1.size ) ) { if ( !object->canbecrushed || ( object->isAlive() && object->getProfile()->canOpenStuff() ) ) { // Someone is blocking who can open stuff, stop here return false; } else { crushedCharacters.push_back(object); } } } } // Crush any unfortunate characters for(const std::shared_ptr<Object> &character : crushedCharacters) { SET_BIT( character->ai.alert, ALERTIF_CRUSHED ); } } // Close it off _open = false; for ( int y = _area._top; y <= _area._bottom; y++ ) { for ( int x = _area._left; x <= _area._right; x++ ) { TileIndex fan = _currentModule->getMeshPointer()->get_tile_int(PointGrid(x, y)); ego_mesh_add_fx( _currentModule->getMeshPointer(), fan, _mask ); } } return true; }