PlaneObject::PlaneObject(Model *m): GameObject(m,2), m_gunPosition(0, 2.2f, 3.1f), m_enginePosition(0,0.0f, 3.3f), m_propOffset(0.4f), m_isPlaneAlive(true), m_maxTurnRate(kPi * 0.25f), m_maxPitchRate(kPi * 0.25f), m_maxBankRate(kPi * 0.25f), m_planeState(PS_FLYING), m_turnState(TS_STRAIGHT), m_pitchState(PS_LEVEL), m_moveState(MS_STOP), m_hp(4), m_maxHP(4) { assert(m); assert(m->getPartCount() >= 2); setModelOrientation(EulerAngles(kPi, 0.0f, 0.0f)); setPosition(0,m_propOffset,0,1); m_fSpeed = 0.0f; m_maxSpeed = 5.0f; m_className = "Plane"; m_type = ObjectTypes::PLANE; m_pitchRate = m_turnRate = 0.0f; m_smokeID = -1; m_reticleLockOnUpdated = false; m_timeSinceFired = gRenderer.getTime(); // load reticle texture m_reticleTexture = gRenderer.cacheTextureDX("reticle.png"); // load all textures that will be used on the plane. // Multiple textures are used throughout game play so the plane appears to // "take damage" m_allTextures.resize(5); m_allTextures[0] = "plane2life0.tga"; // when hp = 0 m_allTextures[1] = "plane2life1.tga"; // hp = 1 m_allTextures[2] = "plane2life2.tga"; // hp = 2 m_allTextures[3] = "plane2life3.tga"; // hp = 3 m_allTextures[4] = "plane2.tga"; // hp > 3 // cache all these for (int a =0; a < (int)m_allTextures.size(); a++) gRenderer.cacheTextureDX(m_allTextures[a].c_str()); m_allParticles.resize(5); m_allParticles[0] = "smokeveryheavy"; // when hp = 0 m_allParticles[1] = "smokeheavy"; // when hp = 0 m_allParticles[2] = "smokemedium"; // hp = 1 m_allParticles[3] = "smokelight"; // hp = 2 m_allParticles[4] = ""; // hp > 2 setTextureAndSmoke(); }
void PlaneObject::damage(int hp) { // if god mode is on leave if (!takeDamage) return; m_hp -= hp; setTextureAndSmoke(); // change to a texture with more damange on it if(m_isPlaneAlive && m_hp <= 0) { m_planeState = PS_CRASHING; m_velocity = Vector3::kForwardVector; m_eaOrient[0].pitch = degToRad(20); RotationMatrix r; r.setup(m_eaOrient[0]); m_velocity = r.objectToInertial(m_velocity); m_velocity *= m_maxSpeed * m_speedRatio * 20.0f; } }