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(); } }
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; }
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(); } }
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; }
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; }
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") ); } } }
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; }
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; } } }
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); } } }
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; }
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); }
void CDopeFish::getTouchedBy(CSpriteObject &theObject) { if(theObject.dead) return; if(CPlayerBase *Player = dynamic_cast<CPlayerBase*>(&theObject)) { if( getActionNumber(A_DOPEFISH_EAT) ) Player->getEaten(); } }
void CBullet::process() { if( !getActionNumber(A_KEENSHOT_IMPACT) && (blockedd || blockedu || blockedl || blockedr || onslope) ) { setAction(A_KEENSHOT_IMPACT); playSound( SOUND_SHOT_HIT ); dead = true; } processActionRoutine(); }
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(); } } }
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; }
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; }
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(); } } }
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(); } }
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(); } }
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; }
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); } } }
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; }
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(); } } }
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(); } } }
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(); }