bool CThunderCloud::isNearby(CSpriteObject &theObject) { if( CPlayerLevel *player = dynamic_cast<CPlayerLevel*>(&theObject) ) { const unsigned int cloudX = getXMidPos(); const unsigned int playXLeft = player->getXMidPos() - DIST_TO_AWAKE; const unsigned int playXRight = player->getXMidPos() + DIST_TO_AWAKE; if( playXLeft < cloudX && playXRight > cloudX ) { if( getActionStatus(A_CLOUD_ASLEEP) && getProbability(180) ) setAction(A_CLOUD_WAKING); } else { if( !getActionStatus(A_CLOUD_ASLEEP) ) { setAction(A_CLOUD_ASLEEP); setActionSprite(); return true; } } if( getActionStatus(A_CLOUD_WAKING) ) { if( player->getXMidPos() < getXMidPos() ) xDirection = LEFT; else xDirection = RIGHT; } if( getActionStatus(A_CLOUD_MOVING) ) { if( mpBolt == nullptr && player->getYMidPos() > getYMidPos() ) { const unsigned int playXStrikeLeft = player->getXMidPos() - DIST_TO_STRIKE; const unsigned int playXStrikeRight = player->getXMidPos() + DIST_TO_STRIKE; if( playXStrikeLeft < cloudX && playXStrikeRight > cloudX && (mTimer>TIME_TO_STRIKE_2 || (mSecondTry && mTimer>TIME_TO_STRIKE_1) ) ) { mTimer = 0; mSecondTry = !mSecondTry; setAction(A_CLOUD_STRIKING); playSound(SOUND_THUNDERCLOUD_STRIKE); mpBolt = new CThunderBolt( mp_Map, getXLeftPos() + (12<<STC), getYDownPos() + (32<<STC), mSprVar ); spawnObj( mpBolt ); } } } } return true; }
CCouncilMember::CCouncilMember(CMap *pmap, Uint32 x, Uint32 y) : CObject(pmap, x, y, OBJ_NONE) { m_ActionBaseOffset = 0x1FB8; setActionForce(A_COUNCIL_MEMBER_MOVE); setActionSprite(); calcBouncingBoxes(); }
CBullet::CBullet(CMap *pmap, const Uint16 foeID, const Uint32 x, const Uint32 y, const int xDir, const int yDir, const int sprVar) : CGalaxySpriteObject(pmap, foeID, x, y, sprVar), mReversed(false) { xDirection = xDir; yDirection = yDir; const size_t ep = g_pBehaviorEngine->getEpisode(); setupGalaxyObjectOnMap(bulletActionMap[ep-4], A_KEENSHOT_MOVING); setActionSprite(); calcBoundingBoxes(); playSound( SOUND_KEEN_FIRE ); }
void CThunderCloud::processStriking() { if( getActionStatus(A_CLOUD_STRIKING+1) ) { setAction(A_CLOUD_STRIKING); } if( mpBolt == NULL && mTimer > STRIKE_TIME) { mTimer = 0; setAction(A_CLOUD_MOVING); setActionSprite(); } }
CBullet::CBullet(CMap *pmap, const Uint32 x, const Uint32 y, const direction_t dir) : CObject(pmap, x, y, OBJ_RAY) { m_hDir = NONE; m_vDir = NONE; if(dir == LEFT || dir == RIGHT) m_hDir = dir; else if(dir == UP || dir == DOWN) m_vDir = dir; setupGalaxyObjectOnMap(0x1738, A_KEENSHOT_MOVING); setActionSprite(); calcBouncingBoxes(); playSound( SOUND_KEEN_FIRE ); }
CSlicestar::CSlicestar(CMap *pmap, const Uint16 foeID, const Uint32 x, const Uint32 y, const bool useBlocker, direction_t horDir, direction_t verDir) : CStunnable(pmap, foeID, x, y), mUseBlocker(useBlocker) { m_ActionBaseOffset = 0x23BC; xDirection = horDir; yDirection = verDir; setActionForce(A_SLICESTAR_MOVE); setActionSprite(); calcBoundingBoxes(); }
CRedShot::CRedShot(CMap* pmap, const Uint16 foeID, const Uint32 x, const Uint32 y, const int xDir, const int yDir) : CStunnable(pmap, foeID, x, y), mTimer(0) { xDirection = xDir; yDirection = yDir; mActionMap[A_REDSHOT_MOVE] = (GASOFctr) &CRedShot::processMove; mActionMap[A_REDSHOT_SMASH] = (GASOFctr) &CRedShot::smash; setupGalaxyObjectOnMap(0x27AC, A_REDSHOT_MOVE); setActionSprite(); calcBoundingBoxes(); }
CBullet::CBullet(CMap *pmap, const Uint16 foeID, const Uint32 x, const Uint32 y, const int xDir, const int yDir) : CGalaxySpriteObject(pmap, foeID, x, y) { xDirection = xDir; yDirection = yDir; const size_t ep = g_pBehaviorEngine->getEpisode(); setupGalaxyObjectOnMap(bulletActionMap[ep-4], A_KEENSHOT_MOVING); setActionSprite(); calcBoundingBoxes(); playSound( SOUND_KEEN_FIRE ); // For testing sounds. /*g_pSound->playStereosoundSlot(slot, PLAY_NOW, 0); printf("Sound %d played!\n", slot-64); slot++;*/ }
void CGalaxySpriteObject::setupGalaxyObjectOnMap(const size_t ActionBaseOffset, const size_t ActionNumber ) { m_ActionBaseOffset = ActionBaseOffset; m_climbing = false; m_jumped = false; setActionForce(ActionNumber); setActionSprite(); calcBoundingBoxes(); alignToTile(); performCollisions(); if(!processActionRoutine()) exists = false; }
CVarPlatform::CVarPlatform(CMap *pmap, const Uint16 foeID, Uint32 x, Uint32 y, const direction_t horidir, const direction_t vertdir, const int actionOffset, const int sprVar) : CGalaxySpriteObject(pmap, foeID, x, y, sprVar), CPlatform(pmap, foeID, x, y), CMoveTarget(m_Pos, xDirection, yDirection) { m_ActionBaseOffset = actionOffset; setActionForce(A_PLATFORM_MOVE); setActionSprite(); xDirection = horidir; yDirection = vertdir; solid = false; // I think they must be false, because some plats like those in Keen6 // should only obey to the set markers calcBoundingBoxes(); }
/** * Called when Flag is flying to the pole */ void CFlag::processFlipping() { if(m_Pos != m_destination) { Vector2D<int> dir = m_destination - m_Pos; const float length = dir.GetLength(); Vector2D<float> base_dir( dir.x/length, dir.y/length ); if( fabs(length) < SPEED ) { moveTo(m_destination); } else { moveDir(base_dir*SPEED); } } else { setAction(A_FLAG_WAVE); setActionSprite(); g_pSound->playSound( SOUND_FLAG_LAND ); const auto episode = gpBehaviorEngine->getEpisode(); if(episode == 6) { Vector2D<int> tilePos = m_Pos; tilePos.y = getYDownPos(); Uint32 new_tile_no = mp_Map->getPlaneDataAt(1, tilePos)+1; tilePos = tilePos>>CSF; mp_Map->setTile(tilePos.x, tilePos.y, new_tile_no, true); } mp_Map->unlock(); }