void TaskForceClass::GetRealPosition (float *x, float *y, float *z) { // This will use the last move time to determine the real x,y & z of the unit float movetime = (float)(SimLibElapsedTime - last_move) / VU_TICS_PER_SECOND; float speed; float heading; float dist; int h = GetNextMoveDirection(); mlTrig sincos; if (h < 0 || h > 7 || SimLibElapsedTime < last_move) { *x = XPos(); *y = YPos(); *z = TheMap.GetMEA(XPos(),YPos()); return; } speed = (float) GetUnitSpeed() * KPH_TO_FPS; dist = speed * movetime; heading = h * 45.0F * DTR; mlSinCos(&sincos, heading); *x = XPos() + dist * sincos.cos; *y = YPos() + dist * sincos.sin; *z = TheMap.GetMEA(XPos(),YPos()); }
TString MillePedeTrees::DelRphi(const TString &tree1, const TString &tree2) const { // distance vector in rphi/xy plane times unit vector e_phi = (-y/r, x/r) // tree2 gives reference for e_phi const TString deltaX = Parenth(tree1 + XPos() += (Min() += tree2) += XPos()); const TString deltaY = Parenth(tree1 + YPos() += (Min() += tree2) += YPos()); // (delta_x * (-y) + delta_y * x) / r // protect against possible sign of RPos: return Parenth(Parenth(deltaX + Mal() += ("-" + tree2) += YPos() += Plu() += deltaY + Mal() += tree2 + XPos() ) += Div() += Sqrt(RPos2(tree2)) //RPos(tree2) ); }
void FlareClass::UpdateTrail (void) { Tpoint newPoint; newPoint.x = XPos(); newPoint.y = YPos(); newPoint.z = ZPos(); // I-Hawk - Removed, flare's trail isn't managed here anymore but from PS /* OTWDriver.AddTrailHead (trail, newPoint.x, newPoint.y, newPoint.z); // OTWDriver.TrimTrail(trail, 25); // MLR 12/14/2003 - removed // DrawableParticleSys::PS_UpdateTrail((PS_PTR)trail, XPos(), YPos(), ZPos()); //trail = (DrawableTrail*)DrawableParticleSys::PS_EmitTrail((TRAIL_HANDLE)trail, TRAIL_FLARE, XPos(), YPos(), ZPos()); trailGlow->SetPosition( &newPoint ); trailSphere->SetPosition( &newPoint ); ((Drawable2D *)drawPointer)->SetPosition( &newPoint ); */ if (SimLibElapsedTime - timeOfDeath > 10 * SEC_TO_MSEC){ SetDead (TRUE); } BombClass::UpdateTrail(); }
TString MillePedeTrees::Theta(const TString &tree) const { // protect against possible sign in RPos by using Sqrt(RPos2(tree)) return Fun("TMath::ATan2", Sqrt(RPos2(tree)) += "," + tree + ZPos()) // theta, cf. TVector3::Theta += "*(" + XPos() += "!=0.&&" + YPos() += "!=0.&&" + ZPos() += "!=0.)"; // guard against |p|=0 }
void HelicopterClass::ShowDamage (void) { if ( pctStrength < 0.65f && pctStrength > 0.0f) { if ( sfxTimer > ( max( pctStrength, 0.1f) + PRANDFloatPos() * 0.3f ) ) { Tpoint pos, vec; // reset the timer sfxTimer = 0.0f; pos.x = XPos(); pos.y = YPos(); pos.z = ZPos(); vec.x = PRANDFloat() * 40.0f; vec.y = PRANDFloat() * 40.0f; vec.z = PRANDFloat() * 40.0f; OTWDriver.AddSfxRequest( new SfxClass(SFX_TRAILSMOKE, // type SFX_MOVES, // flags &pos, // world pos &vec, // vector 2.5f, // time to live 10.5f + (1.0F-pctStrength)*30.0f ) ); // scale } } }
int FlareClass::Exec(){ if (trail){ // I-Hawk - Removed, flare's trail isn't managed here anymore but from PS //UpdateTrail(); if (SimLibElapsedTime - timeOfDeath > 10 * SEC_TO_MSEC){ SetDead (TRUE); } } BombClass::Exec(); if(IsExploding()) { SetFlag( SHOW_EXPLOSION ); SetDead(TRUE); return TRUE; } // MLR 2003-11-15 flares were going thru the ground { float z; z = OTWDriver.GetGroundLevel(XPos(), YPos()); if(ZPos() > z) { int gtype = OTWDriver.GetGroundType(XPos(),YPos()); switch(gtype) { case COVERAGE_WATER: case COVERAGE_RIVER: case COVERAGE_SWAMP: // flare went into water. SetDead(TRUE); break; default: // give em a slight bounce. SetDelta((SM_SCALAR)(XDelta() * .25), (SM_SCALAR)(YDelta() * .25), (SM_SCALAR)(-ZDelta() * .25)); SetPosition(XPos(),YPos(),z); break; } } } SetDelta (XDelta() * 0.99F, YDelta() * 0.99F, ZDelta() * 0.99F); return TRUE; }
TString MillePedeTrees::RPos2(const TString &tree) const { const TString x(tree + XPos()); const TString y(tree + YPos()); return Parenth((x + Mal() += x) + Plu() += (y + Mal() += y)); }
void EjectedPilotClass::ApplyDamage(FalconDamageMessage *damageMsg) { if(_stage >= PD_CHUTE_OPENING) { SimMoverClass::ApplyDamage(damageMsg); if(_collapseChute == FALSE) { // PlayRadioMessage (rcAIRMANDOWNB) // _flightId is the VU_ID of the flight the pilot ejected from Flight flight; flight = (Flight) vuDatabase->Find(_flightId); if(flight) { FalconRadioChatterMessage *radioMessage = new FalconRadioChatterMessage( flight->Id(), FalconLocalSession ); radioMessage->dataBlock.from = flight->Id(); radioMessage->dataBlock.to = MESSAGE_FOR_TEAM; radioMessage->dataBlock.voice_id = flight->GetFlightLeadVoiceID(); radioMessage->dataBlock.message = rcAIRMANDOWNB; //M.N. changed to 32767 -> flexibly use randomized values of max available eval indexes radioMessage->dataBlock.edata[0] = 32767; FalconSendMessage(radioMessage, FALSE); } F4Assert(_deathMsg == NULL); // Create death message. _deathMsg = new FalconDeathMessage (Id(), FalconLocalGame); // ahhhhhhhhhhhhhhhhh #ifdef MLR_NEWSNDCODE SoundPos.Sfx( SFX_SCREAM, 0, 1, 0); #else F4SoundFXSetPos( SFX_SCREAM, TRUE, XPos(), YPos(), ZPos(), 1.0f , 0 , XDelta(),YDelta(),ZDelta()); #endif _deathMsg->dataBlock.damageType = damageMsg->dataBlock.damageType; _deathMsg->dataBlock.dEntityID = Id(); _deathMsg->dataBlock.dCampID = 0; _deathMsg->dataBlock.dSide = GetCountry(); _deathMsg->dataBlock.dPilotID = pilotSlot; _deathMsg->dataBlock.dIndex = Type(); _deathMsg->dataBlock.fEntityID = damageMsg->dataBlock.fEntityID; _deathMsg->dataBlock.fCampID = damageMsg->dataBlock.fCampID; _deathMsg->dataBlock.fSide = damageMsg->dataBlock.fSide; _deathMsg->dataBlock.fPilotID = damageMsg->dataBlock.fPilotID; _deathMsg->dataBlock.fIndex = damageMsg->dataBlock.fIndex; _deathMsg->dataBlock.fWeaponID = damageMsg->dataBlock.fWeaponID; _deathMsg->dataBlock.fWeaponUID = damageMsg->dataBlock.fWeaponUID; } _collapseChute = TRUE; } }
void FlareClass::ExtraGraphics() { #if 0 Falcon4EntityClassType* classPtr; OTWDriver.RemoveObject(drawPointer, TRUE); drawPointer = NULL; classPtr = &Falcon4ClassTable[displayIndex]; OTWDriver.CreateVisualObject (this, classPtr->visType[0], OTWDriver.Scale()); BombClass::ExtraGraphics(); OTWDriver.RemoveObject(drawPointer, TRUE); drawPointer = NULL; classPtr = &Falcon4ClassTable[displayIndex]; OTWDriver.CreateVisualObject(this, classPtr->visType[0], OTWDriver.Scale()); #else BombClass::ExtraGraphics(); if (drawPointer){ OTWDriver.RemoveObject(drawPointer, TRUE); drawPointer = NULL; } Falcon4EntityClassType* classPtr = &Falcon4ClassTable[displayIndex]; OTWDriver.CreateVisualObject(this, classPtr->visType[0], OTWDriver.Scale()); #endif Tpoint newPoint = { XPos(), YPos(), ZPos() }; Tpoint vec = { XDelta(), YDelta(), ZDelta() }; //I-Hawk - Added vector to support new PS flare movement //RV - I-Hawk - PS flare effect call, to replace the old Flare effect /* OTWDriver.AddSfxRequest(new SfxClass( SFX_LIGHT_DEBRIS, // type SFX_MOVES, &newPoint, // world pos &vec, 1.0f, // time to live 1.0f) ); // scale */ DrawableParticleSys::PS_AddParticleEx( (SFX_FLARE_GFX + 1), &newPoint, &vec ); // I-Hawk - Removed, Not used anymore /* if(!g_bDisableMissleEngGlow) // MLR 2003-11-15 disable that shit-o star effect { OTWDriver.InsertObject(trailGlow); OTWDriver.InsertObject(trailSphere); }*/ // I-Hawk - Removed, old flare graphics stuff //OTWDriver.RemoveObject(drawPointer, TRUE); //drawPointer = new Drawable2D( DRAW2D_FLARE, 2.0f, &newPoint ); //OTWDriver.InsertObject(drawPointer); timeOfDeath = SimLibElapsedTime; }
void Viewport::Resize () { canvas->SetBackground(output->GetBgColor()); float px = XPos(); float py = YPos(); float zx = XMag(); float zy = YMag(); perspective->curwidth = xmax+1; perspective->curheight = ymax+1; perspective->lx = round(0.90 * perspective->curwidth); perspective->ly = round(0.90 * perspective->curheight); DoAdjust(px, py, zx, zy); }
void EjectedPilotClass::SetModel(int model){ Trotation rot; Tpoint pos; // Destroy the current bsp. if(drawPointer) { drawPointer->GetPosition (&pos); OTWDriver.RemoveObject(drawPointer, TRUE); drawPointer = NULL; } else { pos.x = XPos(); pos.y = YPos(); pos.z = ZPos(); } // Set our new model. _model = model; // Create the new bsp. _rot.GetTrotation(rot); if ( _md[_model].bsp == VIS_GUYDIE || _md[_model].bsp == VIS_DOWN_PILOT ) { if (pos.z > 0.0F) pos.z = 0.0F; drawPointer = new DrawableGuys(_md[_model].bsp, &pos, Yaw(), 1, 1.0 ); ((DrawableBSP *)drawPointer)->SetSwitchMask( 0, 1 ); ((DrawableBSP *)drawPointer)->SetSwitchMask( 1, 1 ); } /* ** edg: better to show nothing than the crappy oval shadow else if ( _md[_model].bsp == VIS_EJECT1 ) { drawPointer = new DrawableShadowed(_md[_model].bsp, &pos, &rot, 1.0, VIS_PCHUTESH); } */ else { drawPointer = new DrawableBSP(_md[_model].bsp, &pos, &rot, 1.0 ); } F4Assert(drawPointer != NULL); // Set the label. if(drawPointer && strlen(_label) > 0) { drawPointer->SetLabel(_label, _labelColor); OTWDriver.InsertObject(drawPointer); } }
void EjectedPilotClass::InitSafeLanding() { F4Assert(_md != NULL); // PlayRadioMessage (rcAIRMANDOWND) // _aircraft is pointer to the plane the pilot came from. // check _aircraft->flightPtr for someone in the flight to see the landing Flight flight; flight = (Flight) vuDatabase->Find(_flightId); if(flight) { FalconRadioChatterMessage *radioMessage = new FalconRadioChatterMessage( flight->Id(), FalconLocalGame ); radioMessage->dataBlock.from = flight->Id(); radioMessage->dataBlock.to = MESSAGE_FOR_TEAM; radioMessage->dataBlock.voice_id = flight->GetFlightLeadVoiceID(); radioMessage->dataBlock.message = rcAIRMANDOWND; radioMessage->dataBlock.edata[0] = flight->callsign_id; radioMessage->dataBlock.edata[1] = flight->GetFlightLeadCallNumber(); radioMessage->dataBlock.edata[2] = SimToGrid(YPos()); // MN Fix - need SimToGrid, not FloatToInt32 as previoiusly..and reversed X/YPos radioMessage->dataBlock.edata[3] = SimToGrid(XPos()); FalconSendMessage(radioMessage, FALSE); } // Set the new BSP. SetModel(MD_SAFE_LANDING); // Zero the pitch and roll. ZeroPitchAndRoll(); // Set angular velocity to 0. _aVel[I_ROLL] = 0.0; _aVel[I_PITCH] = 0.0; _aVel[I_YAW] = 0.0; // Set translational velocity to 0. _vel[I_X] = 0.0; _vel[I_Y] = 0.0; _vel[I_Z] = 0.0; // for new set Z on ground _pos[I_Z] = OTWDriver.GetGroundLevel(_pos[I_X], _pos[I_Y]) - 3.0f; // Set the time that we hit ground _hitGroundTime = _runTime; _stageTimer = 0.0f; }
void EjectedPilotClass::InitFreeFallWithSeat() { // PlayRadioMessage (rcAIRMANDOWNA) // PlayRadioMessage (rcAIRMANDOWNE) // PlayRadioMessage (rcAIRMANDOWNF) // _aircraft is pointer to the plane the pilot came from. // check _aircraft->flightPtr for someone in the flight to see the chute // Randomize these three (i think) Flight flight; flight = (Flight) vuDatabase->Find(_flightId); if(flight) { FalconRadioChatterMessage *radioMessage = new FalconRadioChatterMessage( flight->Id(), FalconLocalGame ); radioMessage->dataBlock.from = flight->Id(); radioMessage->dataBlock.to = MESSAGE_FOR_TEAM; radioMessage->dataBlock.voice_id = flight->GetFlightLeadVoiceID(); if(rand() %2) { radioMessage->dataBlock.message = rcAIRMANDOWNE; radioMessage->dataBlock.edata[0] = SimToGrid(YPos());// MN Fix - need SimToGrid, not FloatToInt32 as previoiusly.. radioMessage->dataBlock.edata[1] = SimToGrid(XPos()); } else { radioMessage->dataBlock.message = rcAIRMANDOWNA; } FalconSendMessage(radioMessage, FALSE); } // Pitch and roll should be zero. ZeroPitchAndRoll(); // Set angular velocity to 0, except for yaw. _aVel[I_ROLL] = 0.0; _aVel[I_PITCH] = 0.0; _aVel[I_YAW] = PI/6.0; _stageTimer = 0.0f; }
void EjectedPilotClass::InitChuteOpening() { // Set the new BSP. SetModel(MD_PILOT_AND_OPEN_CHUTE); // Set the orientation to upright _rot[I_ROLL] = 0.0; _rot[I_PITCH] = 0.0; _rot[I_YAW] = _vel.Heading(); // Set angular velocity to 0. _aVel[I_ROLL] = 0.0; _aVel[I_PITCH] = 0.0; _aVel[I_YAW] = 0.0; // play the sound #ifdef MLR_NEWSNDCODE SoundPos.Sfx( SFX_CHUTE, 0, 1.0f , 0 ); #else F4SoundFXSetPos( SFX_CHUTE, TRUE, XPos(), YPos(), ZPos(), 1.0f , 0 , XDelta(),YDelta(),ZDelta()); #endif _stageTimer = 0.0f; }
void Viewport::ZoomXTo (float zx) { DoAdjust(XPos(), YPos(), zx, YMag()); }
void Viewport::ZoomTo (float zx, float zy) { DoAdjust(XPos(), YPos(), zx, zy); }
void Viewport::ScrollYBy (float dpy) { DoAdjust(XPos(), YPos() + dpy, XMag(), YMag()); }
void Viewport::ScrollXBy (float dpx) { DoAdjust(XPos() + dpx, YPos(), XMag(), YMag()); }
void AircraftClass::DropChaff (void) { vector pos, posDelta; int type; BombClass *weapon; if (counterMeasureStation[CHAFF_STATION].weaponCount > 0) { if (this == FalconLocalSession->GetPlayerEntity()) g_intellivibeData.ChaffDropped++; /* pos.x = XPos(); pos.y = YPos(); pos.z = ZPos(); posDelta.x = XDelta() * 0.75F; posDelta.y = YDelta() * 0.75F; posDelta.z = ZDelta() * 0.75F; */ // new positional Dispensers int NumToLaunch = 1; if(af->auxaeroData->Chaff.Sequence==2) { NumToLaunch=af->auxaeroData->Chaff.Count; } int i; for(i=0;i<NumToLaunch && counterMeasureStation[CHAFF_STATION].weaponCount > 0;i++) { counterMeasureStation[CHAFF_STATION].weaponCount--; Tpoint work; MatrixMult( &((DrawableBSP*)af->platform->drawPointer)->orientation, &af->auxaeroData->Chaff.Pos[chaffDispenser], &work ); pos.x=work.x + XPos(); pos.y=work.y + YPos(); pos.z=work.z + ZPos(); MatrixMult( &((DrawableBSP*)af->platform->drawPointer)->orientation, &af->auxaeroData->Chaff.Vec[chaffDispenser], &work ); posDelta.x=work.x + XDelta(); posDelta.y=work.y + YDelta(); posDelta.z=work.z + ZDelta(); switch(af->auxaeroData->Chaff.Sequence) { case 0: // alternate dispensers; case 2: chaffDispenser++; if(chaffDispenser>=af->auxaeroData->Chaff.Count) chaffDispenser=0; break; case 1: // use 1 dispenser, then move to the next default: chaffUsed++; if(chaffUsed>=af->auxaeroData->Chaff.Decoys[chaffDispenser]) { chaffUsed=0; chaffDispenser++; if(chaffDispenser>=af->auxaeroData->Chaff.Count) chaffDispenser=0; } break; } // TODO: Use a different (much higher drag) type for the chaff //type = GetClassID (DOMAIN_AIR, CLASS_SFX, TYPE_CHAFF, STYPE_CHAFF, SPTYPE_CHAFF1, VU_ANY, VU_ANY, VU_ANY) + VU_LAST_ENTITY_TYPE; // JB 010220 type = GetClassID (DOMAIN_AIR, CLASS_VEHICLE, TYPE_BOMB, STYPE_CHAFF, SPTYPE_CHAFF1, VU_ANY, VU_ANY, VU_ANY) + VU_LAST_ENTITY_TYPE; // JB 010220 weapon = new ChaffClass(type); weapon->Init(); weapon->SetParent(this); weapon->Start(&pos, &posDelta, 0.2f); vuDatabase->/*Quick*/Insert(weapon); weapon->Wake(); } SetChaffExpireTime( SimLibElapsedTime + ChaffTime ); SetNewestChaffID( weapon->Id() ); } //MI for EWS stuff if(g_bRealisticAvionics && this == FalconLocalSession->GetPlayerEntity()) { if(counterMeasureStation[CHAFF_STATION].weaponCount == 0) { SoundPos.Sfx(af->auxaeroData->sndBBChaffFlareOut); //make sure we don't get here again, no sounds from now on counterMeasureStation[CHAFF_STATION].weaponCount--; } else if(OTWDriver.pCockpitManager->mpIcp->ChaffBingo == counterMeasureStation[CHAFF_STATION].weaponCount) { if(OTWDriver.pCockpitManager->mpIcp->EWS_BINGO_ON) SoundPos.Sfx(af->auxaeroData->sndBBChaffFlareLow); } //MI Moved further down /*if(counterMeasureStation[CHAFF_STATION].weaponCount > 0) F4SoundFXSetDist(SFX_BB_CHAFLARE, FALSE, 0.0f, 1.0f);*/ } // If this is the player and they want unlimited chaff, let 'em have it if (IsSetFlag(MOTION_OWNSHIP) && PlayerOptions.UnlimitedChaff()) counterMeasureStation[CHAFF_STATION].weaponCount++; }
void Viewport::ZoomYBy (float dzy) { DoAdjust(XPos(), YPos(), XMag(), YMag() * dzy); }
void EjectedPilotClass::GetFocusPoint(BIG_SCALAR &x, BIG_SCALAR &y, BIG_SCALAR &z){ SIM_FLOAT startTime, totalTime; EP_VECTOR deltaFocusPoint, finalFocus, pos; Trotation rot; Tpoint modelSpaceOffset, worldSpaceOffset; F4Assert(_model != MD_START); /* x = XPos() + _md[_model].focusOffset[I_X]; y = YPos() + _md[_model].focusOffset[I_Y]; z = ZPos() + _md[_model].focusOffset[I_Z]; return; switch(_stage) { case PD_FREE_FALL_WITH_OPEN_CHUTE : case PD_FREE_FALL_WITH_COLLAPSED_CHUTE : case PD_SAFE_LANDING : case PD_CRASH_LANDING : x = XPos() + _md[_model].focusOffset[I_X]; y = YPos() + _md[_model].focusOffset[I_Y]; z = ZPos() + _md[_model].focusOffset[I_Z]; break; case PD_JETTISON_CANOPY : case PD_EJECT_SEAT : case PD_FREE_FALL_WITH_SEAT : case PD_CHUTE_OPENING : default : x = XPos(); y = YPos(); z = ZPos(); break; } return; */ // Get the model space offset here. We should linearly interpolate // over time so that the focus point doesnt jump around. startTime = ModelCreateTime(_model); totalTime = ( _model >= MD_PILOT_AND_OPEN_CHUTE ? 5.0F : ModelCreateTime(_model + 1) - startTime ); F4Assert(totalTime > 0.0F); finalFocus = ( _model >= MD_PILOT_AND_OPEN_CHUTE ? _md[_model].focusOffset : _md[_model + 1].focusOffset ); if(_runTime > startTime + totalTime) { _focusPoint = finalFocus; } else if(_runTime > startTime) { //XX deltaFocusPoint = finalFocus - _focusPoint; deltaFocusPoint = finalFocus; deltaFocusPoint -= _focusPoint; deltaFocusPoint *= (_runTime - startTime) / totalTime; _focusPoint += deltaFocusPoint; } _focusPoint.GetTpoint(modelSpaceOffset); // Transform the model space offset into a world space offset. _rot.GetTrotation(rot); MatrixMult ( &rot, &modelSpaceOffset, &worldSpaceOffset ); // Find the focus point in world space by adding the world space // offset to the position pos = EP_VECTOR(XPos(), YPos(), ZPos()); pos += EP_VECTOR(worldSpaceOffset); // return our result x = (BIG_SCALAR)pos[I_X]; y = (BIG_SCALAR)pos[I_Y]; z = (BIG_SCALAR)pos[I_Z]; }
int EjectedPilotClass::Exec() { ACMIGenPositionRecord genPos; ACMISwitchRecord acmiSwitch; SoundPos.UpdatePos(this); if (IsDead()) return TRUE; // Call superclass Exec. SimMoverClass::Exec(); if (!SimDriver.MotionOn()) return IsLocal(); if (_delayTime > SimLibElapsedTime) { // not time yet RunJettisonCanopy(); // stay with it return IsLocal(); } // Advance time AdvanceTime(); // Simulate the ejected pilot here. switch(_stage) { case PD_JETTISON_CANOPY : { RunJettisonCanopy(); break; } case PD_EJECT_SEAT : { RunEjectSeat(); break; } case PD_FREE_FALL_WITH_SEAT : { RunFreeFall(); break; } case PD_CHUTE_OPENING : { RunFreeFall(); // Here we run our little switch based animation... static const int NUM_FRAMES = 31; float percent = (_runTime - StageEndTime(_stage-1)) / (StageEndTime(_stage) - StageEndTime(_stage-1)); int frame = FloatToInt32(percent * (NUM_FRAMES-0.5f)); if ( frame < 0 ) frame = 0; else if ( frame > NUM_FRAMES ) frame = NUM_FRAMES; percent = ((_runTime - _deltaTime ) - StageEndTime(_stage-1)) / (StageEndTime(_stage) - StageEndTime(_stage-1)); int prevframe = FloatToInt32(percent * ((float)NUM_FRAMES-0.5f)); if ( prevframe < 0 ) prevframe = 0; else if ( prevframe > NUM_FRAMES ) prevframe = NUM_FRAMES; if ( gACMIRec.IsRecording() && prevframe != frame) { acmiSwitch.hdr.time = SimLibElapsedTime * MSEC_TO_SEC + OTWDriver.todOffset; acmiSwitch.data.type = Type(); acmiSwitch.data.uniqueID = ACMIIDTable->Add(Id(),NULL,0);//.num_; acmiSwitch.data.switchNum = 0; acmiSwitch.data.prevSwitchVal = 1<<prevframe; acmiSwitch.data.switchVal = 1<<frame; gACMIRec.SwitchRecord( &acmiSwitch ); } if ( drawPointer ) ((DrawableBSP*)drawPointer)->SetSwitchMask( 0, 1<<frame ); break; } case PD_FREE_FALL_WITH_OPEN_CHUTE : { RunFreeFallWithOpenChute(); break; } case PD_FREE_FALL_WITH_COLLAPSED_CHUTE : { RunFreeFall(); break; } case PD_SAFE_LANDING : { RunSafeLanding(); _stageTimer += _deltaTime; static const int NUM_FRAMES = 13; float percent = _stageTimer/2.0f; int frame = FloatToInt32(percent * ((float)NUM_FRAMES-0.5f)); if ( frame < 0 ) frame = 0; else if ( frame > NUM_FRAMES ) frame = NUM_FRAMES; if ( drawPointer ) ((DrawableBSP*)drawPointer)->SetSwitchMask( 0, 1<<frame ); break; } case PD_CRASH_LANDING : { RunCrashLanding(); _stageTimer += _deltaTime; static const int NUM_FRAMES = 12; float percent = _stageTimer/2.0f; int frame = FloatToInt32(percent * ((float)NUM_FRAMES-0.5f)); if ( frame < 0 ) frame = 0; else if ( frame > NUM_FRAMES ) frame = NUM_FRAMES; if ( drawPointer ) ((DrawableBSP*)drawPointer)->SetSwitchMask( 0, 1<<frame ); break; } default : { ShiWarning ("Bad Eject Mode"); } } // Make sure all components of orientation are in range ( 0 <= n <= TWO_PI). FixOrientationRange(); // Update shared data. SetPosition(_pos[I_X], _pos[I_Y], _pos[I_Z]); SetDelta(_vel[I_X], _vel[I_Y], _vel[I_Z]); SetYPR(_rot[I_YAW], _rot[I_PITCH], _rot[I_ROLL]); SetYPRDelta(_aVel[I_YAW], _aVel[I_PITCH], _aVel[I_ROLL]); if (gACMIRec.IsRecording() && (SimLibFrameCount & 3 ) == 0) { genPos.hdr.time = SimLibElapsedTime * MSEC_TO_SEC + OTWDriver.todOffset; genPos.data.type = Type(); genPos.data.uniqueID = ACMIIDTable->Add(Id(),NULL,TeamInfo[GetTeam()]->GetColor());//.num_; genPos.data.x = XPos(); genPos.data.y = YPos(); genPos.data.z = ZPos(); genPos.data.roll = Roll(); genPos.data.pitch = Pitch(); genPos.data.yaw = Yaw(); // remove genPos.data.teamColor = TeamInfo[GetTeam()]->GetColor(); gACMIRec.GenPositionRecord( &genPos ); } // Update matrices for geometry. CalcTransformMatrix((SimMoverClass *)this); // See if it hit the ground. if ( _hitGround == FALSE ) _hitGround = HasHitGround(); /* ** We now do completion in the safe or crash landing stages ** (by calling HitGround() ) if (HasHitGround()) { HitGround(); } */ // Display some debug data. #if DEBUG_EJECTION_SEQUENCE SpewDebugData(); #endif // DEBUG_EJECTION_SEQUENCE return IsLocal(); }
void EjectedPilotClass::InitLocalData(AircraftClass *ac, int mode, int no){ DrawableBSP *acBSP; int labelLen; _delayTime = SimLibElapsedTime + no * 2 * CampaignSeconds; // Initialize position, rotation, velocity, angular velocity. if (ac) { _pos = EP_VECTOR(ac->XPos(),ac->YPos(),ac->ZPos()); _rot[I_ROLL] = ac->Roll(); _rot[I_PITCH] = ac->Pitch(); _rot[I_YAW] = ac->Yaw(); _vel = EP_VECTOR(ac->XDelta(),ac->YDelta(),ac->ZDelta()); _aVel[I_ROLL] = ac->RollDelta(); _aVel[I_PITCH] = ac->PitchDelta(); _aVel[I_YAW] = ac->YawDelta(); } else { _pos = EP_VECTOR(XPos(),YPos(),ZPos()); _rot[I_ROLL] = Roll(); _rot[I_PITCH] = Pitch(); _rot[I_YAW] = Yaw(); _vel = EP_VECTOR(XDelta(),YDelta(),ZDelta()); _aVel[I_ROLL] = RollDelta(); _aVel[I_PITCH] = PitchDelta(); _aVel[I_YAW] = YawDelta(); } // Play with this value to change the signature of an // ejected pilot on the IR. SetPowerOutput(0); // sfr: not setters on this anymore //SetVt(0); //SetKias(0); // Initialize physical data. _pd = NULL; _stage = PD_START; // Initialize model data to NULL. _md = NULL; _model = MD_START; // Set the ejection mode. SetMode(mode); // Initialize run time and delta time. _runTime = 0.0; _deltaTime = 0.0; // We just set the type flag to "FalconSimEntity". SetTypeFlag(FalconEntity::FalconSimEntity); // Is it ourselves - Find out from the aircraft. if (ac && no == 0){ _isPlayer = (SimDriver.GetPlayerEntity() == ac) ? TRUE : FALSE; } else { _isPlayer = FALSE; } // Is it a player - Find out from the aircraft. if (ac){ _isDigital = ac->IsDigital() ? TRUE : FALSE; } else{ _isDigital = TRUE; } // Set team/country if (ac){ SetCountry (ac->GetCountry()); } _endStageTimeAdjust = ( IsDigiPilot() ? 0.0F : _pd->humanPilotEndStageTimeAdjust ); // It hasn't hit the ground yet. _hitGround = FALSE; // The chute isn't collapsed yet. _collapseChute = FALSE; _chuteCollapsedTime = 1000000.0; // No death message yet. _deathMsg = NULL; // Update shared data. SetPosition(_pos[I_X], _pos[I_Y], _pos[I_Z]); SetDelta(_vel[I_X], _vel[I_Y], _vel[I_Z]); SetYPR(_rot[I_YAW], _rot[I_PITCH], _rot[I_ROLL]); SetYPRDelta(_aVel[I_YAW], _aVel[I_PITCH], _aVel[I_ROLL]); // Update matrices for geometry. CalcTransformMatrix((SimMoverClass *)this); // Set up our label. if (ac) { acBSP = (DrawableBSP *)ac->drawPointer; if(acBSP != NULL) { strncpy(_label, acBSP->Label(), 32); labelLen = strlen(acBSP->Label()); if (no == 0){ strncat(_label, " Pilot", 32 - labelLen); } else { char crewstr[20]; sprintf (crewstr, " Crew%d", no); strncat(_label, crewstr, 32 - labelLen); } _label[31] = 0; _labelColor = acBSP->LabelColor(); } else { _label[0] = 0; _labelColor = 0; } } else { strcpy(_label, "Pilot"); labelLen = strlen(_label); _labelColor = 0;//acBSP->LabelColor(); } _execCalledFromAircraft = FALSE; // Point to the aircraft that I ejected from. if (ac) { _aircraftId = ac->Id(); _flightId = ac->GetCampaignObject()->Id(); } // Update exec transfer synching data. _lastFrameCount = 0; // _execCount = 0; // Act like a bomb, so nobody sees you // edg: yuck, we now have an eject pilot motion SetFlag(MOTION_BMB_AI); SetFlag(MOTION_EJECT_PILOT); if (IsLocal()) { SimVuDriver *drive = new SimVuDriver(this); drive->ExecDR(SimLibElapsedTime); SetDriver (drive); } }
void Viewport::ZoomYTo (float zy) { DoAdjust(XPos(), YPos(), XMag(), zy); }
void Viewport::ZoomXBy (float dzx) { DoAdjust(XPos(), YPos(), XMag() * dzx, YMag()); }
void Viewport::AdjustBy (float dpx, float dpy, float dzx, float dzy) { DoAdjust(XPos() + dpx, YPos() + dpy, XMag() * dzx, YMag() * dzy); }
void Experiment1_1::DrawScatterPlot() { max_Data = makeVector2f(Data[0][0], Data[0][1]); min_Data = makeVector2f(Data[0][0], Data[0][1]); for(int i=0;i<(int)Data.size();i++) { if(i>0) { if (Data[i][0] > max_Data [0]) { max_Data[0]=Data[i][0]; } if (Data[i][1] > max_Data [1]) { max_Data[1]=Data[i][1]; } if (Data[i][0] < min_Data [0]) { min_Data[0]=Data[i][0]; } if (Data[i][1] < min_Data [1]) { min_Data[1]=Data[i][1]; } } } DataColorRange = makeVector2f(max_Data[0]-min_Data[0], max_Data[1]-min_Data[1]); if (max_Data[0]<0) max_Data[0]=0; if (max_Data[1]<0) max_Data[1]=0; if (min_Data[0]>0) min_Data[0]=0; if (min_Data[1]>0) min_Data[1]=0; for(int i=0;i<(int)Data.size();i++) { Point2D NewPoint(Data[i][0], Data[i][1]); NewPoint.color = makeVector4f(Data[i][0]/DataColorRange[0], Data[i][1]/DataColorRange[1], 0.5 /*((float) i)/Data.size()*/, 1); viewer->addPoint(NewPoint); } //Axes Point2D Origin(0, 0); Origin.color = makeVector4f(1,1,1,1); Origin.size = 10; const int idOrigin = viewer->addPoint(Origin); Point2D XNeg(min_Data[0], 0); Point2D XPos(max_Data[0], 0); XNeg.color = makeVector4f(1,0,0,1); XPos.color = makeVector4f(1,0,0,1); XNeg.size = 10; XPos.size = 10; const int idXNeg = viewer->addPoint(XNeg); const int idXPos = viewer->addPoint(XPos); Point2D YNeg(0, min_Data[1]); Point2D YPos(0, max_Data[1]); YPos.color = makeVector4f(0,1,0,1); YNeg.color = makeVector4f(0,1,0,1); YPos.size = 10; YNeg.size = 10; const int idYPos = viewer->addPoint(YNeg); const int idYNeg = viewer->addPoint(YPos); //X-Axis Line Axis; Axis.vertices[0] = idXNeg; Axis.vertices[1] = idXPos; Axis.color = makeVector4f(1,1,1,1); Axis.thickness = 3; viewer->addLine(Axis); //Y-Axis Axis.vertices[0] = idYNeg; Axis.vertices[1] = idYPos; viewer->addLine(Axis); // display changes viewer->refresh(); }
void Viewport::ScrollXTo (float px) { DoAdjust(px, YPos(), XMag(), YMag()); }
void AircraftClass::DropFlare (void) { vector pos, posDelta; int type; BombClass *weapon; if (counterMeasureStation[FLARE_STATION].weaponCount > 0) { if (this == FalconLocalSession->GetPlayerEntity()) g_intellivibeData.FlareDropped++; { static int chaffsid=0; // just need a fake id so multiple chaffs can play at once. chaffsid = (chaffsid + 1) & 0xf; SoundPos.Sfx( af->auxaeroData->sndBBFlare, chaffsid); } /* pos.x = XPos(); pos.y = YPos(); pos.z = ZPos(); posDelta.x = XDelta() * 0.75F; posDelta.y = YDelta() * 0.75F; posDelta.z = ZDelta() * 0.75F; */ // MLR 2003-11-16 New positional dispensers int NumToLaunch = 1; if(af->auxaeroData->Flare.Sequence==2) { NumToLaunch=af->auxaeroData->Flare.Count; } int i; for(i=0;i<NumToLaunch && counterMeasureStation[FLARE_STATION].weaponCount > 0;i++) { counterMeasureStation[FLARE_STATION].weaponCount--; Tpoint work; MatrixMult( &((DrawableBSP*)af->platform->drawPointer)->orientation, &af->auxaeroData->Flare.Pos[flareDispenser], &work ); pos.x=work.x + XPos(); pos.y=work.y + YPos(); pos.z=work.z + ZPos(); MatrixMult( &((DrawableBSP*)af->platform->drawPointer)->orientation, &af->auxaeroData->Flare.Vec[flareDispenser], &work ); posDelta.x=work.x + XDelta(); posDelta.y=work.y + YDelta(); posDelta.z=work.z + ZDelta(); switch(af->auxaeroData->Flare.Sequence) { case 0: // alternate dispensers; case 2: flareDispenser++; if(flareDispenser>=af->auxaeroData->Flare.Count) flareDispenser=0; break; case 1: // use 1 dispenser, then move to the next default: flareUsed++; if(flareUsed>=af->auxaeroData->Flare.Decoys[flareDispenser]) { flareUsed=0; flareDispenser++; if(flareDispenser>=af->auxaeroData->Flare.Count) flareDispenser=0; } break; } //type = GetClassID (DOMAIN_AIR, CLASS_VEHICLE, TYPE_BOMB, STYPE_BOMB_IRON, SPTYPE_MK82, VU_ANY, VU_ANY, VU_ANY) + VU_LAST_ENTITY_TYPE; // JB 010220 type = GetClassID (DOMAIN_AIR, CLASS_VEHICLE, TYPE_BOMB, STYPE_FLARE1, SPTYPE_CHAFF1 + 1, VU_ANY, VU_ANY, VU_ANY) + VU_LAST_ENTITY_TYPE; // JB 010220 weapon = new FlareClass (type); weapon->Init(); weapon->SetParent(this); weapon->Start(&pos, &posDelta, 0.2f); vuDatabase->/*Quick*/Insert(weapon); weapon->Wake(); } SetFlareExpireTime( SimLibElapsedTime + FlareTime ); SetNewestFlareID( weapon->Id() ); } //MI for EWS stuff if(g_bRealisticAvionics && this == FalconLocalSession->GetPlayerEntity()) { if(counterMeasureStation[FLARE_STATION].weaponCount == 0) { //F4SoundFXSetDist(af->auxaeroData->sndBBChaffFlareOut, TRUE, 0.0f, 1.0f); SoundPos.Sfx(af->auxaeroData->sndBBChaffFlareOut); //make sure we don't get here again, no sounds from now on counterMeasureStation[FLARE_STATION].weaponCount--; } else if(OTWDriver.pCockpitManager->mpIcp->FlareBingo == counterMeasureStation[FLARE_STATION].weaponCount) { if(OTWDriver.pCockpitManager->mpIcp->EWS_BINGO_ON) SoundPos.Sfx(af->auxaeroData->sndBBChaffFlareLow); //F4SoundFXSetDist( af->auxaeroData->sndBBChaffFlareLow, TRUE, 0.0f, 1.0f ); } //MI moved further down /*else if(counterMeasureStation[FLARE_STATION].weaponCount > 0) F4SoundFXSetDist(SFX_BB_CHAFLARE, FALSE, 0.0f, 1.0f);*/ } // If this is the player and they want unlimited chaff, let 'em have it if (IsSetFlag(MOTION_OWNSHIP) && PlayerOptions.UnlimitedChaff()) counterMeasureStation[FLARE_STATION].weaponCount++; }
void HelicopterClass::RunExplosion (void) { int i; Tpoint pos; Falcon4EntityClassType *classPtr; SimBaseClass *tmpSimBase; Tpoint tp = Origin; Trotation tr = IMatrix; // F4PlaySound (SFX_DEF[SFX_OWNSHIP_BOOM].handle); //F4SoundFXSetPos( SFX_BOOMA1 + PRANDInt5(), TRUE, XPos(), YPos(), ZPos(), 1.0f ); SoundPos.Sfx( SFX_BOOMA1 + PRANDInt5() ); // MLR 5/16/2004 - // 1st do primary explosion pos.x = XPos(); pos.y = YPos(); pos.z = ZPos(); if ( OnGround( ) ) { pos.z = OTWDriver.GetGroundLevel( pos.x, pos.y ) - 4.0f; SetDelta( XDelta() * 0.1f, YDelta() * 0.1f, -50.0f ); OTWDriver.AddSfxRequest( new SfxClass (SFX_GROUND_EXPLOSION, // type &pos, // world pos 1.2f, // time to live 100.0f ) ); // scale } else { OTWDriver.AddSfxRequest( new SfxClass (SFX_AIR_HANGING_EXPLOSION, // type &pos, // world pos 2.0f, // time to live 200.0f + 200 * PRANDFloatPos() ) ); // scale } classPtr = (Falcon4EntityClassType*)EntityType(); // Add the parts (appairently hardcoded at 4) // Recoded by KCK on 6/23 to remove damage station BS for (i=0; i<4; i++) { tmpSimBase = new SimBaseClass(Type()); CalcTransformMatrix (tmpSimBase); OTWDriver.CreateVisualObject(tmpSimBase, classPtr->visType[i+2], &tp, &tr, OTWDriver.Scale()); tmpSimBase->SetPosition (pos.x, pos.y, pos.z); if (!i) { tmpSimBase->SetDelta (XDelta(), YDelta(), ZDelta()); } if (!OnGround()) { tmpSimBase->SetDelta ( XDelta() + 50.0f * PRANDFloat(), YDelta() + 50.0f * PRANDFloat(), ZDelta() + 50.0f * PRANDFloat() ); } else { tmpSimBase->SetDelta ( XDelta() + 50.0f * PRANDFloat(), YDelta() + 50.0f * PRANDFloat(), ZDelta() - 50.0f * PRANDFloatPos() ); } tmpSimBase->SetYPR (Yaw(), Pitch(), Roll()); if (!i) { // First peice is more steady and is flaming tmpSimBase->SetYPRDelta ( 0.0F, 0.0F, 10.0F + PRANDFloat() * 30.0F * DTR); OTWDriver.AddSfxRequest( new SfxClass (SFX_FLAMING_PART, // type SFX_MOVES | SFX_USES_GRAVITY | SFX_EXPLODE_WHEN_DONE, tmpSimBase, // sim base * 3.0f + PRANDFloatPos() * 4.0F, // time to live 1.0F ) ); // scale } else { // spin piece a random amount tmpSimBase->SetYPRDelta ( PRANDFloat() * 30.0F * DTR, PRANDFloat() * 30.0F * DTR, PRANDFloat() * 30.0F * DTR); OTWDriver.AddSfxRequest( new SfxClass (SFX_SMOKING_PART, // type SFX_MOVES | SFX_USES_GRAVITY | SFX_BOUNCES | SFX_EXPLODE_WHEN_DONE, tmpSimBase, // sim base * 4.0f * PRANDFloatPos() + (float)((i+1)*(i+1)), // time to live 1.0 ) ); // scale } } }