void CMimrock::getTouchedBy(CSpriteObject &theObject)
{
    if( getActionStatus(A_MIMROCK_SIT) ) 
	return;
		
    if(dead || theObject.dead)
	return;
			
    CStunnable::getTouchedBy(theObject);
			
    // Was it a bullet? Than make it stunned.
    if( dynamic_cast<CBullet*>(&theObject) ) 
    {
	setAction( A_MIMROCK_STUNNED );
	honorPriority = false;
	theObject.dead = true;
	dead = true;
    }

			
		if( getActionNumber(A_MIMROCK_WALK) || getActionNumber(A_MIMROCK_JUMP) || getActionNumber(A_MIMROCK_BOUNCE) ) 
		{
			if( CPlayerBase *player = dynamic_cast<CPlayerBase*>(&theObject) ) 
				player->kill();
		}		
}
예제 #2
0
bool CWormmouth::isNearby(CSpriteObject &theObject)
{
	if(dead || theObject.dead )
		return false;


	if( CPlayerBase *player = dynamic_cast<CPlayerBase*>(&theObject) )
	{
		const int playerX = player->getXMidPos();
		const int playerY = player->getYMidPos();
		const int wormmouthX = getXMidPos();
		const int wormmouthY = getYMidPos();

		if( getActionNumber(A_WORMMOUTH_LOOK) )
		{
			if( playerX < wormmouthX && xDirection != LEFT )
				mTurnAround = true;
			else if( playerX > wormmouthX && xDirection != RIGHT )
				mTurnAround = true;
		}

		const int diffX = playerX - wormmouthX;
		const int diffY = playerY - wormmouthY;
		if( abs(diffX) < DIST_TO_EAT && abs(diffY) < DIST_TO_EAT
				&& !getActionNumber(A_WORMMOUTH_EAT) )
		{
			setAction(A_WORMMOUTH_EAT);
			playSound( SOUND_WORMOUTH_STRIKE );
		}

	}

	return true;
}
예제 #3
0
void CWormmouth::getTouchedBy(CSpriteObject &theObject)
{
	if(dead || theObject.dead )
		return;


	CStunnable::getTouchedBy(theObject);


	// Was it a bullet? Than make it stunned.
	if( dynamic_cast<CBullet*>(&theObject) )
	{
		setAction( A_WORMMOUTH_STUNNED );
		dead = true;
		theObject.dead = true;
		if(!processActionRoutine())
				exists = false;
		performCollisions();
		processGettingStunned();
	}


	if( !getActionNumber(A_WORMMOUTH_EAT) )
		return;


	if( CPlayerBase *player = dynamic_cast<CPlayerBase*>(&theObject) )
	{
		player->kill();
	}
}
예제 #4
0
bool CLick::isNearby(CObject &theObject)
{
	if( CPlayerBase *player = dynamic_cast<CPlayerBase*>(&theObject) )
	{
		const int dx = player->getXMidPos() - getXMidPos();

		if( dx<-CSF_DISTANCE_TO_FOLLOW_TOLERANCE )
			m_hDir = LEFT;
		else if( dx>+CSF_DISTANCE_TO_FOLLOW_TOLERANCE )
			m_hDir = RIGHT;

		if(getActionNumber(A_LICK_LAND))
		{
			int absdx = (dx<0) ? -dx : dx;

			if( absdx < CSF_MIN_DISTANCE_TO_BREATHE )
			{
				setAction(A_LICK_BREATHE);
				playSound(SOUND_LICK_FIREBREATH);
				mp_processState = (void (CStunnable::*)()) (&CLick::processBreathe);
				m_timer = LICK_BREATHE_TIMER;
			}
		}

	}

	return true;
}
예제 #5
0
bool CRoboRed::isNearby(CSpriteObject &theObject)
{
    if( dynamic_cast<CPlayerLevel*>(&theObject) )
    {
        mLookTimer++;
        if(mLookTimer < TIME_UNTIL_LOOK)
            return true;

        mLookTimer = 0;

        mKeenNearby = false;

        const int objX = theObject.getXMidPos();
        const int roboX = getXMidPos();
        const int dx = objX - roboX;

        if( theObject.getYDownPos() > getYUpPos() && theObject.getYUpPos() < getYDownPos() )
        {
            if(getActionNumber(A_RED_PAUSE))
            {
                if( theObject.getXMidPos() < getXMidPos() )
                    xDirection = LEFT;
                else
                    xDirection = RIGHT;
            }

            if( std::abs(dx) < CSF_DISTANCE_TO_SHOOT )
            {
                mKeenNearby = true;
            }
        }
    }

    return true;
}
예제 #6
0
void CAmpton::process()
{
	performCollisions();
	
	if(!getActionNumber(A_AMPTON_POLE_SLIDE))
	  performGravityMid();

	if(!dead) // If we is dead, there is no way to continue moving or turning
	{	
	  if( blockedl )
	  {
	    if(xDirection == LEFT)
	      setAction(A_AMPTON_TURN);
	    
	    xDirection = RIGHT;
	  }
	  else if(blockedr)
	  {
	    if(xDirection == RIGHT)
	      setAction(A_AMPTON_TURN);
	    
	    xDirection = LEFT;
	  }
	}
	
	if(!processActionRoutine())
	    exists = false;
	
	(this->*mp_processState)();
}
void CGrabbiter::getTouchedBy(CSpriteObject& theObject)
{
    if(getActionNumber(A_GRABBITER_NAPPING))
    {
	return;
    }
    
    
    if( CPlayerBase *player = dynamic_cast<CPlayerBase*>(&theObject) )
    {
        const int diffX = getXMidPos()-player->getXMidPos();
        player->moveXDir(-diffX/4);

        if(player->m_Inventory.Item.m_special.ep6.sandwich > 0)
        {
            player->m_Inventory.Item.m_special.ep6.sandwich--;

            // Show grabbiter message
            showMsg( g_pBehaviorEngine->getString("KEEN_GRABBITER_SLEEPY") );

            setAction(A_GRABBITER_NAPPING);
            playSound(SOUND_GRABBITER_SLEEP);
        }
        else
        {
            // Sound play
            g_pSound->playSound(SOUND_GRABBITER_HUNGRY, PLAY_PAUSEALL);

            // Show grabbiter message
            showMsg( g_pBehaviorEngine->getString("KEEN_GRABBITER_HUNGRY") );
        }
    }
}
예제 #8
0
bool CDevilSprite::isNearby(CSpriteObject &theObject)
{
	if( CPlayerBase *player = dynamic_cast<CPlayerBase*>(&theObject) )
	{
		const int dx = player->getXMidPos() - getXMidPos();
		const int dy = player->getYMidPos() - getYMidPos();


		if( dx<0 )
			xDirection = LEFT;
		else
			xDirection = RIGHT;

		if(getActionNumber(A_SPRITE_MOVE))
		{
			int absdx = (dx<0) ? -dx : dx;
			int absdy = (dy<0) ? -dy : dy;

			if( absdx < CSF_MIN_DISTANCE_X_TO_LOOK &&
			    absdy < CSF_MIN_DISTANCE_Y_TO_LOOK )
			{
				setAction(A_SPRITE_LOOK);
				mp_processState = &CDevilSprite::processLook;
				m_timer = SPRITE_LOOK_DELAY;
			}
		}
	}
	return true;
}
예제 #9
0
void COrbatrix::getTouchedBy(CSpriteObject& theObject)
{
    if(dead || theObject.dead)
        return;

    // Was it a bullet, make it zap/zot
    if( dynamic_cast<CBullet*>(&theObject) )
    {
        setAction(A_ORBATRIX_FLOAT);
        theObject.dead = true;
        return;
    }
    
    if( CPlayerBase *player = dynamic_cast<CPlayerBase*>(&theObject) )
    {
        if(!mGivesKey)
        {
            // Only kill Keen, if Orbatrix bounces
            if(getActionNumber(A_ORBATRIX_BOUNCE))
            {
                player->kill();
            }
        }
        else
        {
            stItemGalaxy &Item = player->m_Inventory.Item;
            Item.m_gem.red++;
            spawnObj(new CItemEffect(mp_Map, 0, getXPosition(), getYPosition(), got_sprite_item_pics[2][2], FADEOUT));
            dead = true;
            exists = false;
        }
    }
}
예제 #10
0
void CBullet::getTouchedBy(CSpriteObject& theObject)
{
    if( getActionNumber(A_KEENSHOT_IMPACT) )
        return;

    if( CPlayerLevel *player = dynamic_cast<CPlayerLevel*>(&theObject) )
    {
        if(mReversed) // Happens usually in Episode 6
        {
            player->stun();
            mIsDead = true;
            setAction(A_KEENSHOT_IMPACT);
        }

        // Friendly fire?
        const auto optFFire = gBehaviorEngine.mOptions[GameOption::ALLOWPKING];

        if(!optFFire.value)
        {
            return;
        }

        if( player->getSpriteVariantId() != getSpriteVariantId() )
        {
            player->kill(false);
        }
    }
}
예제 #11
0
void CArachnut::process()
{
	performCollisions();
	performGravityLow();

	if( blockedl )
		xDirection = RIGHT;
	else if( blockedr )
		xDirection = LEFT;

	if( getActionStatus(A_ARACHNUT_WALK) )
		setAction(A_ARACHNUT_WALK);

	if( getActionNumber(A_ARACHNUT_WALK) )
	{
		// Move normally in the direction
		if( xDirection == RIGHT )
			moveRight( WALK_SPEED );
		else
			moveLeft( WALK_SPEED );
	}


	if(!processActionRoutine())
			exists = false;
}
예제 #12
0
int CAmpton::checkSolidD( int x1, int x2, int y2, const bool push_mode )
{	
  if(getActionNumber(A_AMPTON_WALK))
  {
	if(turnAroundOnCliff( x1, x2, y2 ))
	  setAction(A_AMPTON_TURN);
  }
	
  return CGalaxySpriteObject::checkSolidD(x1, x2, y2, push_mode);
}
예제 #13
0
void CDopeFish::getTouchedBy(CSpriteObject &theObject)
{
	if(theObject.dead)
		return;

	if(CPlayerBase *Player = dynamic_cast<CPlayerBase*>(&theObject))
	{
		if( getActionNumber(A_DOPEFISH_EAT) )
			Player->getEaten();
	}
}
예제 #14
0
void CBullet::process()
{
    if( !getActionNumber(A_KEENSHOT_IMPACT) && (blockedd || blockedu || blockedl || blockedr || onslope) )
    {
        setAction(A_KEENSHOT_IMPACT);
        playSound( SOUND_SHOT_HIT );
        dead = true;
    }

    processActionRoutine();
}
예제 #15
0
void CSkypest::getTouchedBy(CSpriteObject &theObject)
{
	if(dead || theObject.dead )
		return;

	// When Keen touches the Council Member exit the level and add one to the council list
	if( CPlayerLevel *Player = dynamic_cast<CPlayerLevel*>(&theObject) )
	{
		// Check if player is using pogo and Skypest is licking
		if( getActionNumber(A_SKYPEST_LICKEYES) && Player->isPogoing() )
		{
			dead = true;
			playSound(SOUND_SQUISH_SKYPEST);
			setAction(A_SKYPEST_SQUISHED);
		}
		else if( getActionNumber(A_SKYPEST_FLY) )
		{
			// else Keen will die
			Player->kill();
		}
	}
}
예제 #16
0
bool CDopeFish::isNearby(CSpriteObject &theObject)
{
	if( dynamic_cast<CPlayerBase*>(&theObject) ||
		dynamic_cast<CSchoolFish*>(&theObject) )
	{
		const int objX = theObject.getXMidPos();
		const int objY = theObject.getYMidPos();
		const int fishX = getXMidPos();
		const int fishY = getYMidPos();
		const int dx = objX - fishX;
		const int dy = objY - fishY;


		if( objX < fishX - CSF_DISTANCE_TO_FOLLOW ||
			objX > fishX + CSF_DISTANCE_TO_FOLLOW )
			return false;

		if( objY < fishY - CSF_DISTANCE_TO_FOLLOW ||
			objY > fishY + CSF_DISTANCE_TO_FOLLOW )
			return false;


		if( dx<-CSF_DISTANCE_TO_FOLLOW_TOLERANCE )
			xDirection = LEFT;
		else if( dx>+CSF_DISTANCE_TO_FOLLOW_TOLERANCE )
			xDirection = RIGHT;

		if( dy<-CSF_DISTANCE_TO_FOLLOW_TOLERANCE )
			yDirection = (rand()%5) ? UP : DOWN;
		else if( dy>+CSF_DISTANCE_TO_FOLLOW_TOLERANCE )
			yDirection = (rand()%5) ? DOWN : UP;

		if(getActionNumber(A_DOPEFISH_SWIM))
		{
			int absdx = (dx<0) ? -dx : dx;
			int absdy = (dy<0) ? -dy : dy;

			if( absdx < CSF_MIN_DISTANCE_TO_CHARGE &&
			    absdy < CSF_MIN_DISTANCE_TO_CHARGE )
			{
				setAction(A_DOPEFISH_EAT);
				mp_processState = &CDopeFish::processEat;
				m_eatTimer = DOPE_EAT_TIMER;
			}
		}

	}

	return true;
}
예제 #17
0
void CWormmouth::process()
{
	if( getActionNumber(A_WORMMOUTH_MOVE) || getActionNumber(A_WORMMOUTH_STUNNED) )
	{
	    performCollisions();
	    performGravityLow();
	}


	(this->*mp_processState)();

	if( getActionNumber(A_WORMMOUTH_STUNNED) )
		return;

	if( blockedl )
		xDirection = RIGHT;
	else if(blockedr)
		xDirection = LEFT;

	if(!processActionRoutine())
		exists = false;
	
}
예제 #18
0
void CBlueBird::getTouchedBy(CSpriteObject &theObject)
{
	if( theObject.dead )
		return;

	if( CBullet *bullet = dynamic_cast<CBullet*>(&theObject) )
	{
		bullet->setAction(A_KEENSHOT_IMPACT);
		bullet->playSound( SOUND_SHOT_HIT );
		bullet->dead = true;
		inhibitfall = false;
		setAction(A_EAGLE_STUNNED);
	}
	
	// Only kill the player if the bird is flying or walking
	
	if( getActionNumber(A_EAGLE_WALKING) || getActionNumber(A_EAGLE_FLYING) )
	{
	    if( CPlayerBase *player = dynamic_cast<CPlayerBase*>(&theObject) )
	    {
		player->kill();
	    }
	}
}
예제 #19
0
void CRoboRed::getTouchedBy(CSpriteObject &theObject)
{
    if(dead || theObject.dead)
        return;

    CStunnable::getTouchedBy(theObject);

    // Was it a bullet?
    if( dynamic_cast<CBullet*>(&theObject) && !getActionNumber(A_RED_SHOOT) )
    {
        setAction(A_RED_PAUSE);
    }

    if( CPlayerBase *player = dynamic_cast<CPlayerBase*>(&theObject) )
    {
        player->kill();
    }
}
예제 #20
0
void CArachnut::getTouchedBy(CSpriteObject &theObject)
{
	if( theObject.mIsDead || getActionStatus(A_ARACHNUT_STUNNED) )
		return;

	if( CBullet *bullet = dynamic_cast<CBullet*>(&theObject) )
	{
		bullet->setAction(A_KEENSHOT_IMPACT);
		bullet->playSound( SOUND_SHOT_HIT );
		setAction(A_ARACHNUT_STUNNED);
	}
	
	if(getActionNumber(A_ARACHNUT_STUNNED))
	    return;

	if( CPlayerBase *player = dynamic_cast<CPlayerBase*>(&theObject) )
	{
		player->kill();
	}
}
예제 #21
0
bool CLick::isNearby(CSpriteObject &theObject)
{    
    const bool odd = getProbability(80);
    
    
    if( CPlayerBase *player = dynamic_cast<CPlayerBase*>(&theObject) )
    {
	const int dy = abs(player->getYMidPos() - getYMidPos());
	const int dx = player->getXMidPos() - getXMidPos();
	
	if( dy > CSF_MIN_DISTANCE_TO_BREATHE )
	    return false;
	
	if( dx<-CSF_DISTANCE_TO_FOLLOW_TOLERANCE && odd )
	    xDirection = LEFT;
	else if( dx>+CSF_DISTANCE_TO_FOLLOW_TOLERANCE && odd )
	    xDirection = RIGHT;
	
	if(getActionNumber(A_LICK_LAND))
	{
	    int absdx = (dx<0) ? -dx : dx;
	    
	    if( absdx < CSF_DISTANCE_TO_FOLLOW_TOLERANCE )
		keenNear = true;
	    else
		keenNear = false;
	    
	    
	    if( absdx < CSF_MIN_DISTANCE_TO_BREATHE && odd )
	    {
		setAction(A_LICK_BREATHE);
		playSound(SOUND_LICK_FIREBREATH);
		m_timer = LICK_BREATHE_TIMER;
	    }
	}
	
    }
    
    return true;
}
예제 #22
0
void CRocket::getTouchedBy(CSpriteObject& theObject)
{
	if(getActionNumber(A_ROCKET_FLY))
		return;

	if( CPlayerBase *player = dynamic_cast<CPlayerBase*>(&theObject) )
	{
	    if(player->m_Inventory.Item.m_special.ep6.rocketKeycard > 0)
	    {
		setAction(A_ROCKET_FLY);
		playSound(SOUND_ROCKET_LAUNCH);
		mpCarriedPlayer = player;
		mpCarriedPlayer->solid = false;
		mpCarriedPlayer->dontdraw = true;
	    }
	    else
	    {
		    // Tell the player he cannot climb yet
            showMsgWithBmp(gpBehaviorEngine->getString("KEEN_KEYCARD_REQUIRED"), 29, RIGHT);
		    player->moveYDir((1<<CSF)/2);		
	    }
	}
}
예제 #23
0
void CBullet::process()
{
    /*int trans = transluceny;
    
    if( trans > 30 )    
	trans -= 10;
    else
	trans = 30;
        
    transluceny = trans;*/
    
    
	if( !getActionNumber(A_KEENSHOT_IMPACT) && (blockedd || blockedu || blockedl || blockedr || onslope) )
	{
		setAction(A_KEENSHOT_IMPACT);
		playSound( SOUND_SHOT_HIT );
		dead = true;
	}

	if(!processActionRoutine())
			exists = false;

}
예제 #24
0
void CLick::getTouchedBy(CSpriteObject &theObject)
{
	if(dead || theObject.dead)
		return;

	CStunnable::getTouchedBy(theObject);

	// Was it a bullet? Than make it stunned.
	if( dynamic_cast<CBullet*>(&theObject) )
	{
		setAction( A_LICK_STUNNED );
		theObject.dead = true;
		dead = true;
	}

	if( CPlayerBase *player = dynamic_cast<CPlayerBase*>(&theObject) )
	{
		if(getActionNumber(A_LICK_BREATHE))
		{
			player->kill();
		}
	}
}
예제 #25
0
void CBullet::getTouchedBy(CSpriteObject& theObject)
{
    if( getActionNumber(A_KEENSHOT_IMPACT) )
        return;

    if( CPlayerLevel *player = dynamic_cast<CPlayerLevel*>(&theObject) )
    {
        if(mReversed) // Happens usually in Episode 6
        {
            player->stun();
            dead = true;
            setAction(A_KEENSHOT_IMPACT);
        }

        // Friendly fire?
        if(!g_pBehaviorEngine->m_option[OPT_ALLOWPKING].value)
            return;

        if( player->getSpriteVariantId() != getSpriteVariantId() )
        {
            player->kill();
        }
    }
}
예제 #26
0
void CPlayerDive::processDiving()
{
	// In case noclipping was triggered, make it solid, or remove it...
	if(m_Cheatmode.noclipping)
	{
		solid = !solid;
		m_Cheatmode.noclipping = false;
	}


	// If Player presses Jump button, make Keen swim faster
	if(g_pInput->getPressedCommand(IC_JUMP))
	{
		// Slow down the swim speed, by time

		if(getActionNumber(A_KEENSWIM_MOVE))
			setActionForce(A_KEENSWIM_MOVE+1);
		else
			setActionForce(A_KEENSWIM_MOVE);

		if(m_swimupspeed<MAXMOVESPEED)
			m_swimupspeed = MAXMOVESPEED;
	}

	// Swimming - Left and Right
	if(g_pInput->getHoldedCommand(IC_LEFT))
	{
		if(!g_pInput->getHoldedCommand(IC_UP) && !g_pInput->getHoldedCommand(IC_DOWN))
			m_vDir = NONE;

		moveLeft(MOVESPEED+m_swimupspeed);
		m_hDir = LEFT;
	}
	else if(g_pInput->getHoldedCommand(IC_RIGHT))
	{
		if(!g_pInput->getHoldedCommand(IC_UP) && !g_pInput->getHoldedCommand(IC_DOWN))
			m_vDir = NONE;

		moveRight(MOVESPEED+m_swimupspeed);
		m_hDir = RIGHT;
	}

	// Up and down swimming
	if( m_swimupspeed>0 && g_pInput->getHoldedCommand(IC_UP))
	{
		moveUp(MOVESPEED+m_swimupspeed);
		m_vDir = UP;
	}
	else if(g_pInput->getHoldedCommand(IC_DOWN))
	{
		moveDown(MOVESPEED+m_swimupspeed);
		m_vDir = DOWN;
	}
	else
	{
		moveDown(WATERFALLSPEED+m_swimupspeed);
		m_vDir = DOWN;
	}


	// Slow down the swim speed, by time
	if(m_swimupspeed>0)
	{
		m_swimupspeed--;
		if(m_swimupspeed<0)
			m_swimupspeed = 0;
	}

	if( m_breathtimer >= BREATH_TIME )
	{
		playSound(SOUND_BUBBLE);
		int dir_offset = (m_hDir==RIGHT) ? +(1<<CSF) : -(1<<CSF) ;
		CBubbles *Bubble = new CBubbles(mp_Map, getXMidPos()+dir_offset, getYMidPos(), false);
		g_pBehaviorEngine->m_EventList.add( new EventSpawnObject( Bubble ) );
		m_breathtimer = 0;
	}
	else
		m_breathtimer++;

	m_camera.process();
	m_camera.processEvents();
}