Example #1
0
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());
}
Example #2
0
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();
	
}
Example #4
0
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
}
Example #5
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;
}
Example #7
0
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));
}
Example #8
0
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;
}
Example #10
0
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);
}
Example #11
0
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);
	}
}
Example #12
0
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;
}
Example #13
0
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;
}
Example #14
0
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;
}
Example #15
0
void Viewport::ZoomXTo (float zx) {
    DoAdjust(XPos(), YPos(), zx, YMag());
}
Example #16
0
void Viewport::ZoomTo (float zx, float zy) {
    DoAdjust(XPos(), YPos(), zx, zy);
}
Example #17
0
void Viewport::ScrollYBy (float dpy) {
    DoAdjust(XPos(), YPos() + dpy, XMag(), YMag());
}
Example #18
0
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++;
}
Example #20
0
void Viewport::ZoomYBy (float dzy) {
    DoAdjust(XPos(), YPos(), XMag(), YMag() * dzy);
}
Example #21
0
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];
}
Example #22
0
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();
}
Example #23
0
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);
   }
}
Example #24
0
void Viewport::ZoomYTo (float zy) {
    DoAdjust(XPos(), YPos(), XMag(), zy);
}
Example #25
0
void Viewport::ZoomXBy (float dzx) {
    DoAdjust(XPos(), YPos(), XMag() * dzx, YMag());
}
Example #26
0
void Viewport::AdjustBy (float dpx, float dpy, float dzx, float dzy) {
    DoAdjust(XPos() + dpx, YPos() + dpy, XMag() * dzx, YMag() * dzy);
}
Example #27
0
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();
}
Example #28
0
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++;
}
Example #30
0
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
			}
		}
}