Example #1
0
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;
}
Example #2
0
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;
            }
        }
    }    
}
Example #3
0
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!
            }
        }
    }    
}
Example #4
0
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;    
}
Example #5
0
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;
}
Example #6
0
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;
}
Example #7
0
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;
}
Example #8
0
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;    
}