void CAutoRay::process() { if( (mp_Map->getAnimtiletimer()%GUNFIRE_TIMER) == 0 ) { unsigned int x,y; CRay *NewRay; x = getXPosition(); y = getYPosition(); if (m_type==VERTICAL) { NewRay = new CRay(mp_Map, x+(4<<STC), y+(1<<CSF), CENTER, DOWN, getSpriteVariantId(), OBJ_AUTORAY_V, m_index, 124); NewRay->sprite = RAY_VERT_EP3; NewRay->m_VertDir = DOWN; } else { NewRay = new CRay(mp_Map, x+(1<<CSF), y+(4<<STC), CENTER, DOWN, getSpriteVariantId(), OBJ_AUTORAY, m_index, 124); NewRay->sprite = ENEMYRAYEP3; NewRay->m_HorDir = RIGHT; } g_pBehaviorEngine->EventList().spawnObj(NewRay); if(!silent) { playSound(SOUND_TANK_FIRE); silent = true; } } }
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 CRay::getTouchedBy(CVorticonSpriteObject &theObject) { if( !theObject.dead && !theObject.dying ) { if(theObject.canbezapped && state == RAY_STATE_FLY ) { // Check, if it's not form the same object if(theObject.m_type != owner.obj_type) { state = RAY_STATE_SETZAPZOT; canbezapped = false; theObject.getShotByRay(owner.obj_type); } else { if(theObject.getSpriteVariantId() != getSpriteVariantId()) { if(!g_pBehaviorEngine->m_option[OPT_ALLOWPKING].value) return; state = RAY_STATE_SETZAPZOT; canbezapped = false; theObject.getShotByRay(owner.obj_type); } } } } }
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(); } } }
// AI for the Spark object in the Tantalus Ray Machine's of ep2 void CSpark::process() { int mx,my,x,y; mx = getXPosition() >> CSF; my = getYPosition() >> CSF; if (state==SPARK_ANIMATE) { sprite = SPARK_BASEFRAME + frame; } else { sprite = BLANKSPRITE; } switch(state) { case SPARK_ANIMATE: if (timer > SPARK_ANIMRATE) { frame++; if (frame > 3) frame = 0; timer = 0; } else timer++; if ( mHealthPoints <= 0 && state == SPARK_ANIMATE ) { playSound(SOUND_SHOT_HIT); // break the glass and blow out the electric arcs mp_Map->setTile(mx - 2, my, 492, true); mp_Map->setTile(mx - 1, my, 546, true); mp_Map->setTile(mx, my, 547, true); mp_Map->setTile(mx + 1, my, 548, true); mp_Map->setTile(mx + 2, my, 492, true); // remove the unneeded dome tiles mp_Map->setTile(mx - 1, my-1, BG_GREY, true); mp_Map->setTile(mx, my-1, BG_GREY, true); mp_Map->setTile(mx + 1, my-1, BG_GREY, true); // break the switch mp_Map->setTile(mx - 3, my + 4, 506, true); // meltdown! state = SPARK_BLOWUP1; timer = 0; blowy = 0; } break; case SPARK_BLOWUP1: // one by one blow out the purple thingies below the device if (timer > SPARK_BLOW_DELAY) { timer = 0; my = my+3+blowy; mp_Map->setTile(mx, my, 505, true); // spawn a ZAP! or a ZOT! CRay *newobject = new CRay(mp_Map, mx<<CSF, my<<CSF, CENTER, DOWN, getSpriteVariantId()); newobject->state = CRay::RAY_STATE_SETZAPZOT; newobject->setOwner(m_type, m_index); gEventManager.add( new EventSpawnObject(newobject) ); playSound(SOUND_SHOT_HIT); blowy++; if (blowy >= 3) { state = SPARK_BLOWUP2; blowx = 0; } } else timer++; break; case SPARK_BLOWUP2: // blow out the glowing cells if (timer > SPARK_BLOW_DELAY) { if (blowx >= 4) { // done blowing up the glowcells // static the targeting display mx = mx - 7; my = my + 2; for(y=0;y<3;y++) { for(x=0;x<3;x++) { mp_Map->setTile(mx+x,my+y,533, true); } } exists = false; return; } timer = 0; mx = mx + blowx + 3; for(y=3;y<6;y++) { //my = my+3+y; //my = my+y; mp_Map->setTile(mx, my+y, 549, true); // spawn a ZAP! or a ZOT! CRay *newobject = new CRay(mp_Map, mx<<CSF, (my+y)<<CSF, CENTER, DOWN, getSpriteVariantId()); newobject->setOwner(m_type ,m_index); newobject->state = CRay::RAY_STATE_SETZAPZOT; playSound(SOUND_SHOT_HIT); gEventManager.add(new EventSpawnObject(newobject)); } blowx++; } else timer++; break; default: break; } // end of state switch for SE_SPARK }
void CVorticonElite::process() { if (mHealthPoints <= 0 && state != VORTELITE_DYING) { animtimer = 0; frame = 0; state = VORTELITE_DYING; dying = true; if (onscreen) playSound(SOUND_VORT_DIE); } if(state == VORTELITE_CHARGE) { m_speed = CHARGE_SPEED; } else if(state == VORTELITE_WALK) { m_speed = WALK_SPEED; } reprocess: ; switch(state) { case VORTELITE_CHARGE: case VORTELITE_WALK: if (movedir==LEFT) { // move left sprite = VORTELITE_WALK_LEFT_FRAME + frame; if (!blockedl) { xinertia = -m_speed; } else { movedir = RIGHT; // if we only traveled a tiny amount before hitting a wall, we've // probably fallen into a small narrow area, and we need to try // to jump out of it if (dist_traveled < VORTELITE_TRAPPED_DIST && !mp_Map->m_Dark && blockedd) { initiatejump(); goto reprocess; } else if(mp_Map->m_Dark) { dist_traveled = 0; } } } else { // move right sprite = VORTELITE_WALK_RIGHT_FRAME + frame; if (!blockedr) { xinertia = m_speed; } else { movedir = LEFT; // if we only traveled a tiny amount before hitting a wall, we've // probably fallen into a small narrow area, and we need to try // to jump out of it if (dist_traveled < VORTELITE_TRAPPED_DIST && !mp_Map->m_Dark && blockedd) { initiatejump(); goto reprocess; } else if(mp_Map->m_Dark) { dist_traveled = 0; } } } // walk animation if (animtimer > VORTELITE_WALK_ANIM_TIME) { if (frame>=3) frame=0; else frame++; animtimer = 0; } else animtimer++; break; case VORTELITE_JUMP: if (movedir == RIGHT) { if (!blockedr) moveRight(m_speed); } else { if (!blockedl) moveLeft(m_speed); } if (blockedd && yinertia >= 0) { // The Vorticon Has landed after the jump! state = VORTELITE_WALK; goto reprocess; } break; case VORTELITE_ABOUTTOFIRE: if (movedir==RIGHT) { sprite = VORTELITE_FIRE_RIGHT_FRAME; } else { sprite = VORTELITE_FIRE_LEFT_FRAME; } if (timer > VORTELITE_HOLD_GUN_OUT_TIME) { timer = 0; state = VORTELITE_FIRED; CRay *newobject; if (movedir==RIGHT) newobject = new CRay(mp_Map, getXRightPos()+1, getYPosition()+(9<<STC), RIGHT, CENTER, getSpriteVariantId()); else newobject = new CRay(mp_Map, getXLeftPos()-1, getYPosition()+(9<<STC), LEFT, CENTER, getSpriteVariantId()); newobject->setOwner( m_type, m_index); newobject->sprite = ENEMYRAYEP2; // don't shoot other vorticon elite spawnObj(newobject); if (onscreen) playSound(SOUND_KEEN_FIRE); } else timer++; break; case VORTELITE_FIRED: if (movedir==RIGHT) { sprite = VORTELITE_FIRE_RIGHT_FRAME; } else { sprite = VORTELITE_FIRE_LEFT_FRAME; } if (timer > VORTELITE_HOLD_GUN_AFTER_FIRE_TIME) { timer = 0; frame = 0; timesincefire = 0; state = VORTELITE_WALK; } else timer++; break; case VORTELITE_DYING: sprite = VORTELITE_DYING_FRAME; if (animtimer > VORTELITE_DIE_ANIM_TIME) { sprite = VORTELITE_DEAD_FRAME; dead = true; } else { animtimer++; } break; default: break; } }