Beispiel #1
0
void isdf07Mission::CommandShab() {
	char tempstr[128];
	switch (shabState) {
		case 0: //setup the first batch of enemies
			shabEnemy1 = BuildObject("fvsent", comp_team, spawn1);
			shabEnemy2 = BuildObject("fvsent", comp_team, spawn2);
			Attack(shabEnemy1, shabayev, 1);
			Attack(shabEnemy2, shabayev, 1);
			Attack(shabayev, shabEnemy1, 1);
			shabState++;
			break;
		case 1: //do nothing until the first enemy gets killed
			if (!IsAlive(shabEnemy1)) {
				if (IsAlive(shabEnemy2)) {
					Attack(shabayev, shabEnemy2, 1);
					shabState++;
				}
				else {
					shabState++;
				}
			}

			if (gunTowBuilt) { //If shab can't kill anybody do it for her
				Damage(shabEnemy1, 3000);
				if (IsAlive(shabEnemy2)) {
					Damage(shabEnemy2, 3000);
				}
				ClearObjectives();
				AddObjective("isdf0707.otf", WHITE);
				Goto(shabayev, "tree_point", 1);
				AudioMessage("isdf0728.wav");
				shabState = 3;
				BugFix=GetTime()+60.0f;
			}

			break;
		case 2: //go NEAR the ruin when all of the enemies are killed
			if ((missionState>8) && (IsAlive(shabEnemy2))) { //If shab can't kill anybody do it for her
				Damage(shabEnemy2, 3000);
			}
			if ((!IsAlive(shabEnemy1)) && (!IsAlive(shabEnemy2)) && (!gunTowBuilt)) {
				shabEnemy2 = BuildObject("fvsent", 2, spawn1);
				Attack(shabayev, shabEnemy2, 1);
				Attack(shabEnemy2, shabayev, 1);

			}
			if ((!IsAlive(shabEnemy1)) && (!IsAlive(shabEnemy2)) && (gunTowBuilt)) {
				ClearObjectives();
				AddObjective("isdf0710.otf", WHITE);
				AudioMessage("isdf0728.wav");
				Goto(shabayev, "tree_point", 1);
				BugFix=GetTime()+20.0f;
				shabState++;
			}
			break;
		case 3: //hop out of the vehicle when near the ruin
			if (GetTime()>BugFix)
			{
				Goto(shabayev,"tree_point");
				BugFix=GetTime()+10.0f;	
			}
			if (((GetDistance(shabayev, "tree_point") < 25.0)) && ((!IsAlive(enemy1)) || (!IsAlive(enemy2))))
			{
				ClearObjectives();
				AudioMessage("isdf0725.wav");

				AddObjective("isdf0707.otf", WHITE);
				justHoped = true;
				HopOut(shabayev);
//				SetObjectiveOn(shabOnFoot);
				hunter=	BuildObject("fvsent",comp_team,"hunter");
	//			Patrol(temp,"hunter_path");
				Attack(hunter,shabayev); // blow up shabs craft
				CameraReady();
				reminderTimer=GetTime()+60.0f;
				shabState++;
			}
			break;
		case 4:
			oldPlayer=HoppedOutOf(shabOnFoot);	// because shab becomes 0
			{
				Vector pos;
				pos = GetPosition(oldPlayer);
				CameraObject(oldPlayer,2,5,-7,oldPlayer);		
				LookAt(shabOnFoot, ruins, 1);
				RemoveObject(oldPlayer);
				oldPlayer=BuildObject("petank",1,pos);
			}
			shabState++;
			break;
		case 5:
			if (movie_counter<70)
			{
				CameraObject(oldPlayer,2,2,-7,oldPlayer);
				movie_counter++;
			}
			else
			{
				RemoveObject(oldPlayer);
				Handle temp=BuildObject("ibnav",1,"tree_point");
				TranslateString2(tempstr, sizeof(tempstr), "Mission0701");  // Rescue
				SetObjectiveName(temp,tempstr);
				SetObjectiveOn(temp);
				CameraFinish();
				shabState++;
			}
			break;
		case 6: //order the player to get out of his vehicle once he gets close
			if ((!IsAround(shabayev)) && (!ship_blown_up))
			{
				Patrol(hunter,"hunter_path");
				SetIndependence(hunter,0);
				ship_blown_up=true;

			}

			if ((!IsAlive(shabOnFoot) && (!shab_dead)))	
			{
				AudioMessage("isdf0732.wav");
				ClearObjectives();
				AddObjective("isdf05l1.otf",RED,15.0f);
				FailMission(GetTime()+5.0f,"isdf05l1.otf");
				shab_dead=true;
			}

			if (GetTime()>reminderTimer) {
				AudioMessage("isdf0725.wav");
				reminderTimer=GetTime()+60.0f;
			}
			
			if ((GetDistance(shabOnFoot, player) < 50.0)) {

				//RemoveObject(shabayev);
				Attack(shabEnemy1,shabayev);
				Attack(shabEnemy2,shabayev);
				ClearObjectives();
				AudioMessage("isdf0729.wav");
				AddObjective("isdf0708.otf", WHITE);
				shabState++;
			}
			break;

		case 7: //send shab to get the relic
			if ((!IsAlive(shabOnFoot) && (!shab_dead)))	
			{
				AudioMessage("isdf0732.wav");
				ClearObjectives();
				AddObjective("isdf05l1.otf",RED,15.0f);
				FailMission(GetTime()+5.0f,"isdf05l1.otf");
				shab_dead=true;
			}
			if (playerOnFoot) {
				Attack(shabEnemy1,oldPlayer);
				Attack(shabEnemy2,oldPlayer);
				Goto(shabOnFoot, ruins, 1);
				//we should start the patrols here
				shabState++;
			}
			break;
		case 8: //get shab hurt
			if ((!IsAlive(shabOnFoot) && (!shab_dead)))	
			{
				AudioMessage("isdf0732.wav");
				ClearObjectives();
				AddObjective("isdf05l1.otf",RED,15.0f);
				FailMission(GetTime()+5.0f,"isdf05l1.otf");
				shab_dead=true;
			}

			if ((GetDistance(shabOnFoot, ruins) < 20.0f) || (GetDistance(player,ruins)<10.0f))
			{
				if (winMission == false) {
					AudioMessage("isdf0731.wav"); // wrong file name
					SucceedMission(GetTime()+5.0f,"isdf07w1.txt");
					winMission = true;
				}
			}
			break;
		case 9: //hide shab
			
			break;
		case 10: //play closing cineractive
		// The following is an example of how to play a movie in a script.
			moviePlaying = PlayMovie("temp");
			if (!moviePlaying) {
				missionState++;
				moviePlaying = true;
				//IFace_SetInteger("script.mission.state", 1);
			}
			break;
	}

	if (GetHealth(shabayev) < 0.7f) { //keep shab alive
		AddHealth(shabayev, 100);
	}

	if ((GetAmmo(shabayev)) < 0.5f) {
		AddAmmo(shabayev, 500);
	}
	if ((justHoped) && (!IsAlive(shabOnFoot)))
	{
		int i;
		i=1;
		// Houston we have a problem
	}

}
void ACMIView::Draw()
{
	static int lastButton = -1;
	Tpoint
		pos;

	Trotation
		rot;

	int i, numEntities;
	SimTapeEntity *ep;
	SimTapeEntity *targep;
	int targindex;

	TCHAR speedstring[20];
	TCHAR altitudestring[20];
	TCHAR headingstring[20];

	float ACMI_heading=0;
	float ACMI_altitude=0;
	float mph			= 0.0f;

	Tpoint posb;
	ThreeDVertex spos;

	if(TapeHasLoaded() && Tape() != NULL && Tape()->IsLoaded())
	{	
		gMainHandler->Unlock(); // Make surface available...

		// pos = _camPos;
		pos.x = 0.0f;
		pos.y = 0.0f;
		pos.z = 0.0f;
		rot = _camRot;

		// make sure the internal hud view object isn't displayed
		if((_cameraState == INTERNAL_CAM) )
			Tape()->RemoveEntityFromFrame( CameraObject() );

		// edg: ?????
		/*
		** Remove Bing-ism
		** causing a crash ....
		if(TESTBUTTONPUSH == 0 && TESTBUTTONPUSH != lastButton)
		{
			lastButton = TESTBUTTONPUSH;
			TheTerrTextures.SetOverrideTexture( wireTexture.TexHandle() );
			Viewpoint()->Update(&pos);
			_renderer->StartFrame();
			_renderer->DrawScene(&pos, &rot);
			_renderer->PostSceneCloudOcclusion();
			_renderer->FinishFrame();
			Viewpoint()->Update(&_camWorldPos);
		}
		*/

		//JAM 16Dec03
		if(DisplayOptions.bZBuffering)
			_renderer->context.SetZBuffering(TRUE);

		// start the render frame + Draw
		_renderer->context.StartFrame();
		_renderer->StartDraw();

		// render the 3d view
		_renderer->DrawScene(&pos, &rot);

		//JAM 12Dec03 - ZBUFFERING OFF
		if(DisplayOptions.bZBuffering)
			_renderer->context.FlushPolyLists();

//		_renderer->PostSceneCloudOcclusion();

		// now we do post-3d rendering
		// this includes putting in things like alt poles( shouldn't really
		// be done here), crapola hud, and some label stuff.  We need
		// to traverse the entity list on the tape in order to do this

		numEntities = Tape()->NumEntities();

		// 1st pass, turn off target boxes (bleck)
		for(i = 0; i < numEntities; i++)
		{
			// get the entity
			ep = Tape()->GetSimTapeEntity( i );
			// do these only for aircraft
			if ( ep->flags & ENTITY_FLAG_AIRCRAFT )
			{
				// default target box to off
				((DrawablePoled *)ep->objBase->drawPointer)->SetTarget( FALSE );
			}
		}

		for(i = 0; i < numEntities; i++)
		{
			// get the entity
			ep = Tape()->GetSimTapeEntity( i );

			// is it in existance at the moment?
			// also no poles or anything on chaff and flares
			if ( (ep->flags & ( ENTITY_FLAG_CHAFF | ENTITY_FLAG_FLARE ) ) ||
				 !Tape()->IsEntityInFrame( i ) )
			{
				continue;
			}

			// get world pos and screen pos of object
			ep->objBase->drawPointer->GetPosition(&pos);
			_renderer->TransformPoint( &pos, &spos);


			// radar target line
			if ( _doLockLine == 1 )
			{
				targindex = Tape()->GetEntityCurrentTarget( i );
				if ( targindex != -1 )
				{
					// get the target entity
					targep = Tape()->GetSimTapeEntity( targindex );
					ep->objBase->drawPointer->GetPosition(&pos);
					targep->objBase->drawPointer->GetPosition(&posb);

					rot = ((DrawableBSP *)ep->objBase->drawPointer)->orientation;

					// start line out in front of aircraft
					pos.x += rot.M11 * ep->objBase->drawPointer->Radius();
					pos.y += rot.M21 * ep->objBase->drawPointer->Radius();
					pos.z += rot.M31 * ep->objBase->drawPointer->Radius();


					// do target boxes and lines
					if ( _cameraState != FREE_CAM )//&& targindex == CameraObject() )//me123 we wanna see all lock lines
					{
						// current attached camera object is target
						if ( targep->flags & ENTITY_FLAG_AIRCRAFT ) 
						{
							((DrawablePoled *)targep->objBase->drawPointer)->SetTarget( TRUE );
							((DrawablePoled *)targep->objBase->drawPointer)->SetTargetBoxColor( 0xff00ffff );
						}
						
						_renderer->SetColor (0xff00ffff);
						_renderer->Render3DLine( &pos, &posb);

					} 
					else if ( _cameraState != FREE_CAM && i == CameraObject() )
					{
						// current attached camera object's target
						if ( targep->flags & ENTITY_FLAG_AIRCRAFT ) 
						{
							((DrawablePoled *)targep->objBase->drawPointer)->SetTarget( TRUE );
							((DrawablePoled *)targep->objBase->drawPointer)->SetTargetBoxColor( 0xffffffff );
						}
						_renderer->SetColor (0xffffffff);
						_renderer->Render3DLine( &pos, &posb);
					} 
					else if ( _cameraState == FREE_CAM )
					{
						_renderer->SetColor (0xff00ffff);
						_renderer->Render3DLine( &pos, &posb);
					} 

				} // if target
			} // if radar lines on


			// if we're in internal cam and we're the target object
			// display the "hud"
			if((_cameraState == INTERNAL_CAM) && i == CameraObject())
			{
			
				//HEADING
				ACMI_heading = ep->yaw * RTD;
				if ( ACMI_heading < 0.0f )
					ACMI_heading += 360.0f;
	
				// ALTITUDE
				ACMI_altitude = -(ep->z);
	
				// SPEED
				// mph=ep->aveSpeed * FTPSEC_TO_KNOTS;
				mph = CalcKIAS( ep->aveSpeed, -ep->z );
	
	
				// WIRE COCKPIT.
				if(GLOBAL_WIRE_COCKPIT == 1)
				{
					_renderer->SetColor (0xff00ff00);
					_renderer->Line( -.8f,-1.0f,-0.5f,-0.5f );
					_renderer->Line( -0.5f,-0.5f,0.5f,-0.5f );
					//_renderer->Line(  0.5f,-0.5f,1.0f,-1.3f );
					_renderer->Line(  0.5f,-0.5f,1.0f,-1.4f );
													
					_renderer->Line(  -0.5f,-0.5f,-.5f,.5f );
					_renderer->Line(  -.5f,.5f, .5f,.5f );
					_renderer->Line(  .5f,.5f, .5f,-.5f );
					if (g_bNewAcmiHud) {
						sprintf(speedstring,"%0.0f",mph);
						sprintf(altitudestring,"%0.0f",ACMI_altitude);
						sprintf(headingstring,"%0.0f",ACMI_heading);
						int ofont = _renderer->CurFont();
						_renderer->SetFont(2);
						_renderer->TextLeft(-0.48f, 0, speedstring);
						_renderer->TextRight(0.48f, 0, altitudestring);
						_renderer->TextCenter(0, 0.48f, headingstring);
						_renderer->TextCenter(0, -0.45f, ((DrawableBSP*)ep->objBase->drawPointer)->Label());
						_renderer->SetFont(ofont);
					} else {
						sprintf(speedstring,"%s: %0.0f",gStringMgr->GetString(TXT_AIRSPEED),mph);
						sprintf(altitudestring,"%s: %0.0f",gStringMgr->GetString(TXT_ALTITUDE),ACMI_altitude);
						sprintf(headingstring,"%s: %0.0f",gStringMgr->GetString(TXT_HEADING),ACMI_heading);
						_renderer->ScreenText(250.0f,160.0f,((DrawableBSP*)ep->objBase->drawPointer)->Label(),0);
						_renderer->ScreenText(250.0f,170.0f,speedstring,0);
						_renderer->ScreenText(250.0f,180.0f,altitudestring,0);
						_renderer->ScreenText(250.0f,190.0f,headingstring,0);
					}
					_renderer->SetColor (0xffff0000);
				}
			}
		}

		// tell renderer we're done
		_renderer->EndDraw();
		_renderer->context.FinishFrame(NULL);
		if(_takeScreenShot)
		{
			TakeScreenShot();
		}
		gMainHandler->Lock();

		// update the entities
		// MUST be done after render
		Tape()->UpdateSimTapeEntities();

	}
}
/*
** Name: UpdateViewPosRot
** Description:
**		Updates the view world position and rotation depending on
**		the camera setting and what we're tracking and panner positions
*/
void ACMIView::UpdateViewPosRot( void )
{
	int camObj;
	int trackObj;
	SimTapeEntity *camEnt;
	SimTapeEntity *trackEnt;
	Tpoint dPos;
	float dT;
	float dRoll;
	float dist;
	float objScale;

	// get any camera objects we might need
	camObj = CameraObject();
	trackObj = TrackingObject();
	camEnt = Tape()->GetSimTapeEntity( camObj );
	trackEnt = Tape()->GetSimTapeEntity( trackObj );

	// get current scaling
	objScale = Tape()->GetObjScale();


	// if we're not in free camera mode, our world position is
	// based on the camera object
	if ( _cameraState != FREE_CAM )
	{
		_camWorldPos.x = camEnt->x;
		_camWorldPos.y = camEnt->y;
		_camWorldPos.z = camEnt->z;
	}

	// first pass:
	// 	get yaw pitch and roll for camera
	switch(_cameraState)
	{
		case INTERNAL_CAM:			//internal
			_camYaw = camEnt->yaw;
			_camPitch = camEnt->pitch;
			_camRoll = camEnt->roll;
			break;
		case EXTERNAL_CAM:			// orbit
			_camYaw += _pannerAz;
			_camPitch += _pannerEl;
			_camRoll = 0.0f;
			_camRange += _pannerX;
			if ( _camRange > -50.0f )
				_camRange = -50.0f;
			break;
		case TRACKING_CAM:			// tracking
			_camYaw += _pannerAz;
			_camPitch += _pannerEl;
			_camRoll = 0.0f;
			_camRange += _pannerX;
			if ( _camRange > -50.0f )
				_camRange = -50.0f;
			break;
		case CHASE_CAM:			//Chase
			_camRange += _pannerX;
			if ( _camRange > -50.0f )
				_camRange = -50.0f;

			// where we want camera to be
			_chaseX = camEnt->objBase->dmx[0][0] * _camRange * objScale;
			_chaseY = camEnt->objBase->dmx[0][1] * _camRange * objScale;
			_chaseZ = camEnt->objBase->dmx[0][2] * _camRange * objScale;

			dT = Tape()->GetDeltaSimTime();
			if ( dT <= 0.0f )
				dT = 0.1f;

			// "spring" constants for camera roll and move
			#define KMOVE			0.29f
			#define KROLL			0.30f
		
			// convert frame loop time to secs from ms
			// dT = (float)frameTime * 0.001;
		
			// get the diff between desired and current camera pos
			dPos.x = _chaseX - _camPos.x;
			dPos.y = _chaseY - _camPos.y;
			dPos.z = _chaseZ - _camPos.z;
		
			// send the camera thataway
			_camPos.x += dPos.x * dT * KMOVE;
			_camPos.y += dPos.y * dT * KMOVE;
			_camPos.z += dPos.z * dT * KMOVE;
		
			// "look at" vector
			dPos.x = -_camPos.x;
			dPos.y = -_camPos.y;
			dPos.z = -_camPos.z;

			// get new camera roll
			dRoll = camEnt->roll - _camRoll;

			// roll in shortest direction
			if ( fabs( dRoll ) > 180.0f * DTR )
			{
				if ( dRoll < 0.0f )
					dRoll = 360.0f * DTR + camEnt->roll - _camRoll;
				else
					dRoll = -360.0f * DTR + camEnt->roll - _camRoll;
			}
		
			// apply roll
			_camRoll += dRoll * dT * KROLL;
		
			// keep chase cam roll with +/- 180
			if ( _camRoll > 1.0f * PI )
				_camRoll -= 2.0f * PI;
			else if ( _camRoll < -1.0f * PI )
				_camRoll += 2.0f * PI;
		
			// now get yaw and pitch based on look at vector
			dist = (float)sqrt( dPos.x * dPos.x + dPos.y * dPos.y + dPos.z * dPos.z );
			_camPitch	= (float)-asin( dPos.z/dist );
			_camYaw	= (float)atan2( dPos.y, dPos.x );

			break;
		case SAT_CAM:		// Satellite
			_camYaw += _pannerAz;
			_camPitch += _pannerEl;
			if ( _camPitch > -45.0f * DTR )
				_camPitch = -45.0f * DTR;
			else if ( _camPitch < -90.0f * DTR )
				_camPitch = -90.0f * DTR;
			_camRoll = 0.0f;
			_camRange += _pannerX * 100.0f;
			if ( _camRange > -1000.0f )
				_camRange = -1000.0f;
			break;
		case ISO_CAM:		// ISOMETRIC
			_camYaw += _pannerAz;
			_camPitch += _pannerEl;
			if ( _camPitch > -15.0f * DTR )
				_camPitch = -15.0f * DTR;
			else if ( _camPitch < -60.0f * DTR )
				_camPitch = -60.0f * DTR;
			_camRoll = 0.0f;
			_camRange += _pannerX * 100.0f;
			if ( _camRange > -50.0f )
				_camRange = -50.0f;
			break;
		case FREE_CAM:			// Free
			_camYaw += _pannerAz;
			_camPitch += _pannerEl;
			_camRoll = 0.0f;
			_pannerX *= 20.0f;
			_pannerY *= 20.0f;
			_pannerZ *= 20.0f;
			// head in the direction we're currently facing (ie based on
			// current cam rotation
			_camWorldPos.x += _camRot.M11 * _pannerX + _camRot.M12 * _pannerY + _camRot.M13 * _pannerZ;
			_camWorldPos.y += _camRot.M21 * _pannerX + _camRot.M22 * _pannerY + _camRot.M23 * _pannerZ;
			_camWorldPos.z += _camRot.M31 * _pannerX + _camRot.M32 * _pannerY + _camRot.M33 * _pannerZ;
			break;
		default:
			_camYaw = camEnt->yaw;
			_camPitch = camEnt->pitch;
			_camRoll = camEnt->roll;
			break;
	};

	// second pass:
	//		create the rotation matrix
	float costha,sintha,cosphi,sinphi,cospsi,sinpsi;

	costha = (float)cos(_camPitch);
	sintha = (float)sin(_camPitch);
	cosphi = (float)cos(_camRoll);
	sinphi = (float)sin(_camRoll);
	cospsi = (float)cos(_camYaw);
	sinpsi = (float)sin(_camYaw);

	_camRot.M11 = cospsi*costha;
	_camRot.M21 = sinpsi*costha;
	_camRot.M31 = -sintha;

	_camRot.M12 = -sinpsi*cosphi + cospsi*sintha*sinphi;
	_camRot.M22 = cospsi*cosphi + sinpsi*sintha*sinphi;
	_camRot.M32 = costha*sinphi;

	_camRot.M13 = sinpsi*sinphi + cospsi*sintha*cosphi;
	_camRot.M23 = -cospsi*sinphi + sinpsi*sintha*cosphi;
	_camRot.M33 = costha*cosphi;

	// third pass:
	//		Set the relative camera positiion
	switch(_cameraState)
	{
		case INTERNAL_CAM:			//internal
			_camPos.x = 0.0f;
			_camPos.y = 0.0f;
			_camPos.z = 0.0f;
			break;
		case EXTERNAL_CAM:			// orbit
			_camPos.x = _camRot.M11 * _camRange * objScale;
			_camPos.y = _camRot.M21 * _camRange * objScale;
			_camPos.z = _camRot.M31 * _camRange * objScale;
			break;
		case TRACKING_CAM:			// orbit
			if ( camObj == trackObj )
			{
				_camPos.x = _camRot.M11 * _camRange * objScale;
				_camPos.y = _camRot.M21 * _camRange * objScale;
				_camPos.z = _camRot.M31 * _camRange * objScale;
			}
			else
			{
				// line up a vector between cam and track obj and place
				// camera on the vector, slightly up
				dPos.x = trackEnt->x - camEnt->x;
				dPos.y = trackEnt->y - camEnt->y;
				dPos.z = trackEnt->z - camEnt->z;
				dist = 1.0F/(float)sqrt( dPos.x * dPos.x + dPos.y * dPos.y + dPos.z * dPos.z );
				_camPos.x = dPos.x * dist * _camRange * objScale;
				_camPos.y = dPos.y * dist * _camRange * objScale;
				_camPos.z = dPos.z * dist * _camRange *objScale + _camRange * 0.2f;
			}
			break;
		case CHASE_CAM:			//Chase
			break;
		case SAT_CAM:		// Satellite
			_camPos.x = _camRot.M11 * _camRange;
			_camPos.y = _camRot.M21 * _camRange;
			_camPos.z = _camRot.M31 * _camRange;
			break;
		case ISO_CAM:		// ISOMETRIC
			_camPos.x = _camRot.M11 * _camRange;
			_camPos.y = _camRot.M21 * _camRange;
			_camPos.z = _camRot.M31 * _camRange;
			break;
		case FREE_CAM:			// Free
			_camPos.x = 0.0f;
			_camPos.y = 0.0f;
			_camPos.z = 0.0f;
			break;
		default:
			_camPos.x = 0.0f;
			_camPos.y = 0.0f;
			_camPos.z = 0.0f;
			break;
	};

	// fourth pass
	//		if we're tracking an object we need to set a new rotation
	//		matrix
	// determine if we're tracking an object or not
	if (  _cameraState == TRACKING_CAM && camObj != trackObj )
	{
		// get the diff between desired and current camera pos
		// for look at vector
		dPos.x = trackEnt->x - (_camPos.x + _camWorldPos.x);
		dPos.y = trackEnt->y - (_camPos.y + _camWorldPos.y);
		dPos.z = trackEnt->z - (_camPos.z + _camWorldPos.z);

		// now get yaw and pitch based on look at vector
		dist = (float)sqrt( dPos.x * dPos.x + dPos.y * dPos.y + dPos.z * dPos.z );
		float p	= (float)-asin( dPos.z/dist );
		float y	= (float)atan2( dPos.y, dPos.x );

		costha = (float)cos(p);
		sintha = (float)sin(p);
		cosphi = (float)(1.0f);
		sinphi = (float)(0.0f);
		cospsi = (float)cos(y);
		sinpsi = (float)sin(y);
	
		_camRot.M11 = cospsi*costha;
		_camRot.M21 = sinpsi*costha;
		_camRot.M31 = -sintha;
	
		_camRot.M12 = -sinpsi*cosphi + cospsi*sintha*sinphi;
		_camRot.M22 = cospsi*cosphi + sinpsi*sintha*sinphi;
		_camRot.M32 = costha*sinphi;
	
		_camRot.M13 = sinpsi*sinphi + cospsi*sintha*cosphi;
		_camRot.M23 = -cospsi*sinphi + sinpsi*sintha*cosphi;
		_camRot.M33 = costha*cosphi;
	}


	// reset panning
	ResetPanner();

}
Beispiel #4
0
void isdf05Mission::Execute(void)
{

	/*
	a) The player is asked to patrol around the base

	(through steps b-d sent & scouts attack)

	b) Once the base is secure, the player is supposed
	to look for scrap veins and send a scavenger (twice)

	c)Eventually you get to some turrets.  
	Shebayev detaches some mortar bikes to help you take 
	out the turrets.  

	d) Once the turrets are destroyed you need to
	deploy

	e) Follow Manson to the teleporter?  Drop off a bomb
	*/
	char tempstr[128];
	Handle nearguy = 0;
	// this is the start of the mission
	if (!start_done)
	{

		/*
		Alright Sgt Cooke, this looks like
		a good place to establish a base.  
		Patrol the area around this recycler.  
		If it looks safe, deploy the recycler.  
		*/
		shabayev = BuildObject("ivtan5",1,"shab_start");//"patrol_east");
		constructor = BuildObject("ivcons",1,"spawn_constructor");
		Stop(constructor,1);
		scav_comp= GetHandle("scav3");
		SetGroup(scav_comp,-1);
		Handle temppool=GetHandle("poolx");
		Goto(scav_comp,temppool,1);
		//	SetPlan("isdf05.aip",3);  // build stuff
		AudioMessage("isdf0500.wav");
		SetObjectiveOn(shabayev);
		SetObjectiveName(shabayev,"Cmdr. Shabayev");


		audmsg=AudioMessage("isdf0501.wav");
		patrol_phase=true;
		start_done = true;

		Handle tempscav=GetHandle("ivscav1");
		KillPilot(tempscav);
		tempscav=GetHandle("ivscav2");
		KillPilot(tempscav);
		//		Handle fv=BuildObject("fvarch",2,"scrap_field1");
		//		SetSkill(fv,3);
		SetSkill(shabayev,3);
		//		Patrol(shabayev,"patrol1",1);
		//		Attack(shabayev,fv,1);
		recy=BuildObject("ivrec5",1,"recy_start");
		//		Goto(recy,"recy_deploy");
		Dropoff(recy, "recy_deploy");
		Follow(shabayev,recy,1);
		SetScrap(1,40);
		SetScrap(3,40);  // allied resources
	}

	/*
	Here is where you put what happens every frame.  
	*/

	player = GetPlayerHandle();
	if ((!IsAlive(shabayev) && (!shab_dead)))
	{
		AudioMessage("isdf0732.wav");
		ClearObjectives();
		AddObjective("isdf05l1.otf",RED,15.0f);
		FailMission(GetTime()+5.0f,"isdf05l1.otf");
		shab_dead=true;
	}

	// determining if the player is out of his ship
	if (IsOdf(player,"isuser"))
	{
		if (!out_of_ship) GiveWeapon(player, "igsatc");
		out_of_ship = true;
	}
	else
	{
		out_of_ship = false;
	}

	if ((GetDistance(player,"spawn2")<150.f) && (!warning_message))
	{
		AudioMessage("isdf0520.wav");
		/*
		Stay away from those alien structures
		they aren't 
		vital to our mission-
		but they may be dangerous. 
		*/
		warning_message=true;
	}
	// this is checking to make sure the player does not attack his wingman /////////
	if ((!in_combat) && (!fire_message))
	{
		if ((IsAlive(shabayev)) && (IsAlive(player)))
		{
			if (GetTime() - GetLastFriendShot(shabayev) < .2f)
			{
				AudioMessage("ff01.wav"); // (shab) watch your firing!
				fire_reset = GetTime() + 2.f;
				fire_message = true;
			}
		}

		if ((IsAlive(manson)) && (IsAlive(player)))
		{
			if (GetTime() - GetLastFriendShot(manson) < .2f)
			{
				AudioMessage("isdf0555.wav"); // (manson) watch your firing!
				fire_reset = GetTime() + 2.f;
				fire_message = true;
			}
		}
	}

	if ((fire_message) && (fire_reset < GetTime()))
	{
		fire_reset = GetTime() + 999999.9f;
		fire_message = false;
	}
	if ((!IsAlive(constructor)) && (mission_state<10))
	{
		// the constructor is dead, you lose
		mission_state=12;
	}

	switch (mission_state)
	{
	case 0:

		// Shabayev starts the base
		if (GetDistance(recy,"recy_deploy") < 25.0)
		{
			//				Dropoff(recy,"recy_deploy");
			Patrol(shabayev,"patrol1",1);
			SetIndependence(shabayev,1);
			ClearObjectives();
			AddObjective("isdf0501.otf", WHITE, 10.0f);
			patrol_reminder_time=GetTime()+30.0f;
			MoviePlaying=true;
			CameraReady();
			// but danger looms..
			atk1=BuildObject("fvscout",2,"spawn1");
			wasDead1=false;
			Attack(atk1,player);
			mission_state++;
		}
		break;

	case 1:
		if (MoviePlaying)
		{
			//CameraObject(recycler,5,5,5,recycler);
			MoviePlaying = PlayMovie("isdf0501.cin");	
			//		if (IsAudioMessageDone(audmsg)) {
			if (!MoviePlaying)
			{
				//	MoviePlaying=false;
				CameraFinish();
				Build(constructor,"ibpge5",1);
				drop_off=true;
				Attack(shabayev,atk1);
				mission_state++;
			}
		}
		ReallyKillCineractive = 0;
		break;

	case 2: // patrol_phase

		// Kick this out a few extra times.
		if((ReallyKillCineractive == 0) || (ReallyKillCineractive == 10) || 
			(ReallyKillCineractive == 20))
			CameraFinish();
		ReallyKillCineractive++;

		if (drop_off)
		{
			Dropoff(constructor,"pgen1",1);
			drop_off=false;
			Handle temp=GetHandle("unnamed_ivdrop");
			Attack(shabayev,atk1,1);
			RemoveObject(temp);
		}

		if (!IsAlive(atk1))
		{
			wait_count++;
			if (wait_count==250)
			{
				wasDead1=false;
				wasDead2=false;
				raid1=BuildObject("fvsent",2,"raid1");
				Goto(raid1,recy);
				raid2=BuildObject("fvtank",2,"raid2");
				Goto(raid2,recy);
				//				raid3=BuildObject("fvsent",2,"raid3");
				//				Goto(raid3,recy);
				//				raid4=BuildObject("fvtank",2,"raid4");
				//				Goto(raid4,recy);
				ClearObjectives();
				AddObjective("isdf0517.otf",WHITE,10.0f);
				Goto(shabayev,constructor);
				AudioMessage("isdf0543.wav");
				mission_state++;
				wait_count=0;
			}
		}
		break;

	case 3:
		if (power2)
		{
			Dropoff(constructor,"pgen2",1);
			power2=false;
		}
		if (com1)
		{
			Dropoff(constructor,"rbunker1",1);
			com1=false;
		}
		if (!IsAliveAndPilot(raid1)) {
			wasDead1=true;	
		}
		if (!IsAliveAndPilot(raid2)) {
			wasDead2=true;
		}
		if ((wasDead1) && (wasDead2))
		{
			if (raid_count==1)  // should be 2
			{
				/*
				Now look for scrap veins
				around the base.  
				If you find one mark it with 
				a nav beacon.  
				*/
				scout_phase=true;
				ClearObjectives();
				AddObjective("isdf0507.otf",WHITE,5.0f);
				SetObjectiveOff(shabayev);
				nav1=BuildObject("ibnav",1,"scrap_field1");
				TranslateString2(tempstr, sizeof(tempstr), "Mission0501");  // tempstr
				SetObjectiveName(nav1,tempstr);
				SetObjectiveOn(nav1);
				//					SetObjectiveName(pool1,"bio-metal");
				//					SetObjectiveOn(pool1);

				AudioMessage("isdf0507.wav");	
				// Add an attacked for spice
				Handle atk1=BuildObject("fvscout",2,"spawn1");
				Goto(atk1,"attack1");
				Patrol(shabayev,"patrol1",1);
				SetIndependence(shabayev,1);
				// AudioMessage(
				// You go on John, I'll guard the base
				mission_state++;
			}
			else
			{
				wait_count++;
				if (wait_count==400)
				{
					if  (pgen2==NULL)
					{	
						// was follow
						Goto(shabayev,constructor,1);
						Build(constructor,"ibpge5");
						power2=true;
					}
					else 
					{
						//was Follow
						Goto(shabayev,constructor,1);
						Build(constructor,"ibcbu5");
						com1=true;
					}
					raid_count++;
					AddHealth(constructor,500);
					AddHealth(shabayev,500);
					raid1=BuildObject("fvtank",2,"raid1");
					Goto(raid1,recy);
					raid2=BuildObject("fvtank",2,"raid2");
					Goto(raid2,recy);
					wasDead1=false;
					wasDead2=false;
					//					raid3=BuildObject("fvsent",2,"raid3");
					//					Goto(raid3,recy);
					//					raid4=BuildObject("fvtank",2,"raid4");
					//					Goto(raid4,recy);
					wait_count=0;
				}
			}
		}

		break;

	case 4: 	
		// there is one, mark it with the geyser
		// mark that with a power up
		// good, now find another.  
		if ((GetDistance(player,pool1)<75.0f) && (!found_field1))
		{
			// there is a field, deploy the scavenger

			AudioMessage("isdf0508.wav");
			found_field1=true;
		}
		if (scav2_deployed) // any scav is deployed
		{
			mission_state++;
			scav1_deployed=true;
			ClearObjectives();
			AddObjective("isdf0508.otf",WHITE,10.0f);
			/*
			SetObjectiveOff(pool1);
			SetObjectiveName(pool2,"bio-metal 1");
			SetObjectiveOn(pool2);
			*/
			nav2=BuildObject("ibnav",1,"scrap_field3");
			TranslateString2(tempstr, sizeof(tempstr), "Mission0502");  // Bio-Metal 2
			SetObjectiveName(nav2,tempstr);
			SetObjectiveOff(nav1);
			SetObjectiveOn(nav2);
			AudioMessage("isdf0509.wav");  // good job
			if (!found_field1)
			{
				AudioMessage("isdf0519.wav");
				/*
				Don't send out scavengers unescorted.  
				Be sure to stay with them.
				*/
			}
		}
		break;

	case 5:
		if ((scav2_deployed) && (!found_field3) && (GetDistance(player,"scrap_field3")<225.0f))
		{
			found_field3=true;
			/*
			Watch out!
			That field looks hot.  
			*/
			AudioMessage("isdf0512.wav");
			ClearObjectives();
			AddObjective("isdf0511.otf",RED,10.0f);
			mortar_delay=GetTime()+15.0f;
		}
		nearguy=GetNearestEnemy(player);
		if ((found_field3) && (GetTime()>mortar_delay)
			&& (GetDistance(player,nearguy)>150.0f))
		{
			/*
			Cineractive
			Cooke, I'm sending you
			force to help 
			you take out those turrets!
			Here are some mortar bikes.  
			*/

			Build(constructor,"ibfact5",1);
			factory=true;

			audmsg=AudioMessage("isdf0527.wav");
			//was AudioMessage("isdf0513.wav");
			ClearObjectives();
			AddObjective("isdf0516.otf",WHITE,10.0f);
			/*
			int grp=GetFirstEmptyGroup();			
			mbike1=BuildObject("ivmbike",1,"patrol_south");
			SetGroup(mbike1,grp);
			Follow(mbike1,player,0);
			Handle mb=BuildObject("ivmbike",1,"patrol_east");
			SetGroup(mb,grp);
			Follow(mb,player,0);
			mb=BuildObject("ivmbike",1,"patrol_west");
			SetGroup(mb,grp);
			Follow(mb,player,0);
			mb=BuildObject("ivmbike",1,"patrol_north");
			SetGroup(mb,grp);
			Follow(mb,player,0);
			*/
			mission_state++;
			CameraReady();
			MoviePlaying=true;
		}
		break;

	case 6:// attack phase 
		/*
		First check to see if you blew up
		sturret1-4
		then create Manson
		at manson_start
		"Good job Cooke, you show promise"
		Then follow Manson (he's an objective)
		into the base
		When you get close
		lets run past those towers

		when you get there
		hop out and use your demolition charge

		Then run away.  Everything blows up.  
		*/
		if (factory)
		{
			Dropoff(constructor,"fact");
			factory=false;
		}
		if (MoviePlaying)
		{
			CameraObject(constructor,1,11,22,constructor);
			if (IsAudioMessageDone(audmsg))
			{
				MoviePlaying=false;
				CameraFinish();
			}
		}

		if ((!killed_turrets) &&
			(!IsAlive(sturret1)) && 
			(!IsAlive(sturret2)) &&
			(!IsAlive(sturret3)) && (!IsAlive(sturret4))
			&&
			(!IsAlive(sturret5)) && (!IsAlive(sturret6)))
		{
			AudioMessage("isdf0514.wav"); // you show promise
			killed_turrets=true;
			ClearObjectives();
			AddObjective("isdf0512.otf",WHITE,10.0f);
			manson_shows=GetTime()+10.0f;
			manson=BuildObject("ivtank",3,"manson_start");
			SetObjectiveName(manson, "Maj. Manson");
			Handle minion=BuildObject("ivtank",3,"manson_escort1");
			SetObjectiveName(minion, "Sgt. Zdarko");
			Follow(minion,manson);
			minion=BuildObject("ivtank",3,"manson_escort2");
			SetObjectiveName(minion, "Sgt. Masiker");
			Follow(minion,manson);
		}
		if ((killed_turrets) && (!manson_message) && 
			(GetTime()>manson_shows))
		{
			/*
			We found the objective, 
			follow me
			*/
			AudioMessage("isdf0515.wav");
			SetObjectiveOff(nav2);
			SetObjectiveOn(manson);
			ClearObjectives();
			AddObjective("isdf0518.otf",WHITE,10.0f);
			manson_message=true;
			mission_state++;
		}
		break;

	case 7:
		if (GetDistance(player,manson)<50.0f)
		{
			ClearObjectives();
			AddObjective("isdf0513.otf",WHITE,10.0f);
			SetIndependence(manson,0);
			SetAvoidType(manson,0);
			AudioMessage("isdf0539a.wav");
			Goto(manson,"manson_path1");				
			mission_state++;
		}	
		break;

	case 8:
		AddHealth(manson,100); // we don't want him to die here
		if ((wait_up) && (GetDistance(player,manson)<100.0f))
		{
			// right now this goes off too 
			// soon.   You go on to path 2 before 1 is doen
			// But at least it makes sure
			// you are close once.  
			wait_up=false;
			Goto(manson,"manson_path2");
		}
		if ((!gun_tower_message) && (GetDistance(manson,"guntower2")<200.0f))
		{
			/*
			There are gun towers ahead
			let's try to go past fast.  
			*/
			AudioMessage("isdf0516.wav");
			gun_tower_message=true;
			ClearObjectives();
			AddObjective("isdf0514.otf",WHITE,10.0f);
			gun_tower_counter=0;
		}
		if (gun_tower_message) 
		{
			gun_tower_counter++;
			if (gun_tower_counter>450)  // you are on a timer
			{
				AudioMessage("isdf0529.wav");
				ClearObjectives();
				AddObjective("isdf0520.otf",RED,10.0f);
				FailMission(GetTime()+10.0f,"isdf0520.otf");
				mission_state=12;
			}
			if (gun_tower_counter==300)
			{
				AudioMessage("isdf0528.wav");
			}
		}
		if ((gun_tower_message) && (!hop_out_message) &&
			(GetDistance(player,teleportal)<100.0f))
		{
			/* 
			Get out and use your
			demolition charge on
			that building
			*/
			AudioMessage("isdf0173.wav");  // that looks like one of ours?
			AudioMessage("isdf0517.wav");
			hop_out_message=true;
			SetObjectiveOff(manson);
			SetObjectiveOn(teleportal);
			TranslateString2(tempstr, sizeof(tempstr), "Mission0503");  // Excavator
			SetObjectiveName(teleportal,tempstr);
			ClearObjectives();
			AddObjective("isdf0515.otf",WHITE,10.0f);
			SetIndependence(manson,1);
			mission_state++;
		}
		break;

	case 9:
		if ((!out_of_ship_ever) && (out_of_ship)) {
			out_of_ship_ever=true;
			ClearObjectives();
			AddObjective("isdf0521.otf",WHITE,5.0f);
		}
		if (!IsAlive(teleportal))
		{
			if (out_of_ship_ever)
			{
				AudioMessage("isdf0518.wav");
				SucceedMission(GetTime()+10.0f,"isdf05w1.txt");
				mission_state++;
			}
			else
			{
				AudioMessage("isdf0521.wav");
				/*
				I said use your
				demolition charge
				*/
				FailMission(GetTime()+10.0f,"isdfl1.txt");
				mission_state++;
			}
		}
		break;

	case 12:
		/*
		If you lose the constructor
		this condition occurs.  
		*/
		AudioMessage("isdf0522.wav");
		ClearObjectives();
		AddObjective("isdf0519.otf",RED,10.0f);
		FailMission(GetTime()+10.0f,"isdf0519.otf");
		mission_state++;
		break;
	case 13:
		// waiting for the end of the world.  
		break;
	}



	/*
	the lurkers
	*/
	if ((lurker1==NULL) && (GetDistance(player,"lurker1")<150.0f))
	{
		lurker1=BuildObject("fvsent",2,"lurker1");
	}
	if ((lurker2==NULL) && (GetDistance(player,"lurker2")<150.0f))
	{
		lurker2=BuildObject("fvsent",2,"lurker1");
	}
	if ((lurker3==NULL) && (GetDistance(player,"lurker3")<150.0f))
	{
		lurker3=BuildObject("fvsent",2,"lurker3");
	}
	if ((lurker4==NULL) && (GetDistance(player,"lurker4")<150.0f))
	{
		lurker4=BuildObject("fvsent",2,"lurker4");
	}
}