⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 munition.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
					if(Weapon)
						((DrawableBSP*)Rack->object)->AttachChild(((DrawableBSP*)Weapon->object),i);
					bits >>= 1;
					i++;
				}
			}
		}
	}
	else if(rail->weaponID)
	{
		if(rail->startBits)
		{
			weapPtr=&Falcon4ClassTable[rail->weaponID];
			Weapon=gUIViewer->LoadBSP((plane << 24) + (hardpoint << 16) + 1,weapPtr->visType[0]);
			if(Weapon)
				((DrawableBSP*)Plane->object)->AttachChild(((DrawableBSP*)Weapon->object),hardpoint-1);
		}
	}
}

void LoadHardPoint(long plane,long num,long center)
{
	Falcon4EntityClassType* classPtr;
	BSPLIST *Plane;
	BSPLIST *Rack;
	BSPLIST *Weapon;
	int i;

	Plane=gUIViewer->Find((plane << 24));
	if(Plane == NULL) return;
	if(!(VisFlag & (1 << num))) return;

	Rack=gUIViewer->Find((plane << 24) + (num << 16));

	for(i=0;i<LastCount[plane][num];i++)
	{
		Weapon=gUIViewer->Find((plane << 24) + (num << 16) + i + 1);
		if(Rack && Weapon)
		{
			if(LastCount[plane][num] == 2)
			{
				if(num > center)
				{
					if(!i)
						((DrawableBSP*)Rack->object)->DetachChild(((DrawableBSP*)Weapon->object),i+2);
					else
						((DrawableBSP*)Rack->object)->DetachChild(((DrawableBSP*)Weapon->object),i);
				}
				else
					((DrawableBSP*)Rack->object)->DetachChild(((DrawableBSP*)Weapon->object),i);
			}
			else
				((DrawableBSP*)Rack->object)->DetachChild(((DrawableBSP*)Weapon->object),i);
			gUIViewer->Remove((plane << 24) + (num << 16) + i + 1);
		}
		else if(Weapon)
		{
			((DrawableBSP*)Plane->object)->DetachChild(((DrawableBSP*)Weapon->object),num-1);
			gUIViewer->Remove((plane << 24) + (num << 16) + i + 1);
		}
		Weapon=NULL;
	}

	if(Rack)
	{
		((DrawableBSP*)Plane->object)->DetachChild(((DrawableBSP*)Rack->object),num-1);
		gUIViewer->Remove((plane << 24) + (num << 16));
		Rack=NULL;
	}
	if(RackFlag & (1 << num))
	{
		if(gCurStores[plane].WeaponCount[num] == 1)
			Rack=gUIViewer->LoadBSP((plane << 24) + (num << 16),VIS_SINGLE_RACK);
		else if(gCurStores[plane].WeaponCount[num] > 1)
			Rack=gUIViewer->LoadBSP((plane << 24) + (num << 16),VIS_TRIPLE_RACK);
		if(Rack)
			((DrawableBSP*)Plane->object)->AttachChild(((DrawableBSP*)Rack->object),num-1);
	}
	classPtr = &Falcon4ClassTable[WeaponDataTable[gCurStores[plane].WeaponID[num]].Index];
	if(classPtr)
	{
		for(i=0;i<gCurStores[plane].WeaponCount[num] && i < _WPN_MAX_;i++)
		{
			Weapon=gUIViewer->LoadBSP((plane << 24) + (num << 16) + i + 1,classPtr->visType[0]);
			if(Weapon)
			{
				if(Rack)
				{
					if(gCurStores[plane].WeaponCount[num] == 2)
					{
						if(num > center)
						{
							if(!i)
								((DrawableBSP*)Rack->object)->AttachChild(((DrawableBSP*)Weapon->object),i+2);
							else
								((DrawableBSP*)Rack->object)->AttachChild(((DrawableBSP*)Weapon->object),i);
						}
						else
							((DrawableBSP*)Rack->object)->AttachChild(((DrawableBSP*)Weapon->object),i);
					}
					else
						((DrawableBSP*)Rack->object)->AttachChild(((DrawableBSP*)Weapon->object),i);
				}
				else
					((DrawableBSP*)Plane->object)->AttachChild(((DrawableBSP*)Weapon->object),num-1);
			}
		}
		LastCount[plane][num]=gCurStores[plane].WeaponCount[num];
	}
}

void LoadFlight(VU_ID flightID)
{
	Flight flt;
	VehicleClassDataType*	vc;
	Falcon4EntityClassType* classPtr;
	BSPLIST *obj;
	int vid,v,i,j,ac,loads;

	if(gStores)
	{
		gStores->Cleanup();
		delete gStores;
	}

	memset(LastCount,0,sizeof(LastCount));

	gStores=new StoresList;

	flt=(Flight)FindUnit(flightID);
	if(flt == NULL) return;

	for(i=0;i<5;i++)
	{
		memset(&gCurStores[i],		0,	sizeof(LoadoutStruct));
		memset(&gOriginalStores[i],	0,	sizeof(LoadoutStruct));
	}

	vid = flt->GetVehicleID(0);
	vc = GetVehicleClassData(vid);
	classPtr = &Falcon4ClassTable[vid];

	gVCPtr=vc;
	gVehID=vid;

	RackFlag=vc->RackFlags;
	VisFlag=vc->VisibleFlags;
	g3dObjectID=classPtr->visType[0];

	for (i=HARDPOINT_MAX-1; i>=0; i--)
	{
		if (vc->Weapon[i] != 0)
			break;
	}
	if (i >= 0)
		i ++;
	else
		i = 0;

	HardPoints	= i;
	ac			= flt->GetTotalVehicles();
	loads		= flt->GetNumberOfLoadouts();

	ShiAssert( ac > 0 && loads > 0 );

	// save info from what is in the flight
	for (v=0; v<ac; v++)
	{
		if (v < loads)
			memcpy(&gCurStores[v], flt->GetLoadout(v), sizeof(LoadoutStruct));
		else
			memcpy(&gCurStores[v], flt->GetLoadout(0), sizeof(LoadoutStruct));
	}
	memcpy(&gCurStores[4], flt->GetLoadout(0), sizeof(LoadoutStruct));

	for(i = 0; i < 5; ++i) // save what we originally came into the screen with
	{
		gOriginalStores[i] = gCurStores[i];
	}

	gMainHandler->EnterCritical();

	for(i=0;i<PlaneCount;i++)
	{
		obj=gUIViewer->LoadBSP((i << 24),classPtr->visType[0],TRUE);

		ShiAssert(obj);

		if(!i)
			Object.PosZ=0;
		if (classPtr->visType[0] == VIS_F16C)
		{ // F16 switches/DOFS
			((DrawableBSP*)obj->object)->SetSwitchMask(1, 1); // Landing Gear stuff
			((DrawableBSP*)obj->object)->SetSwitchMask(2, 1); //
			((DrawableBSP*)obj->object)->SetSwitchMask(3, 1); //
			((DrawableBSP*)obj->object)->SetSwitchMask(4, 1); //

			//((DrawableBSP*)obj->object)->SetSwitchMask(8, TRUE); // Lights (other than landing)

			((DrawableBSP*)obj->object)->SetSwitchMask(10, 1); // Afterburner

			// More landing gear stuff
			((DrawableBSP*)obj->object)->SetDOFangle(19,90.0f * DTR);
			((DrawableBSP*)obj->object)->SetDOFangle(22,90.0f * DTR);
			((DrawableBSP*)obj->object)->SetDOFangle(20,75.0f * DTR);
			((DrawableBSP*)obj->object)->SetDOFangle(21,75.0f * DTR);
			((DrawableBSP*)obj->object)->SetDOFangle(23,75.0f * DTR);
			((DrawableBSP*)obj->object)->SetDOFangle(24,75.0f * DTR);
		}
		else if(classPtr->vuClassData.classInfo_[VU_TYPE] == TYPE_HELICOPTER)
		{
			((DrawableBSP*)obj->object)->SetSwitchMask(0, 2); // Turn on rotors
			if(!i)
				Object.PosZ=-5;
			if(classPtr->visType[0] == VIS_UH60L)
				((DrawableBSP*)obj->object)->SetSwitchMask(2, 1); // Landing Gear
		}
		else
		{ // Non F16 switches/DOFS
			((DrawableBSP*)obj->object)->SetSwitchMask(2, 1); // Landing Gear
			((DrawableBSP*)obj->object)->SetSwitchMask(1, 1); // Lights (other than landing)
		}


		// Figure out the weapons

		for(j=1;j<HardPoints;j++)
			GetRackAndWeapon(vc,static_cast<short>(vid),gCurStores[i].WeaponID[j],gCurStores[i].WeaponCount[j],static_cast<short>(j),static_cast<short>(HardPoints/2),&gCurRails[i].rail[j]);

		for(j=1;j<HardPoints;j++)
			LoadHardPoint(i,j,HardPoints/2,&gCurRails[i].rail[j]);
		
		if(!i)
		{
			Object.Heading=180.0f;
			Object.Pitch=-10.0f;
			Object.Distance=((DrawableBSP*)obj->object)->Radius()*3;
			Object.Direction=0.0f;

			Object.MinDistance=((DrawableBSP*)obj->object)->Radius()+20;
			Object.MaxDistance=((DrawableBSP*)obj->object)->Radius()*10;
			Object.MinPitch=0;
			Object.MaxPitch=0;
			Object.CheckPitch=FALSE;

			Object.PosX=0;
			Object.PosY=0;
		}
		PositandOrientSetData (Object.PosX, Object.PosY, Object.PosZ, 0.0f, 0.0f, 0.0f, &objPos,&objRot);
		((DrawableBSP*)obj->object)->Update(&objPos,&objRot);
	}
	TallyStores();
	gMainHandler->LeaveCritical();
}

void SetPlaneToArm(long Plane,BOOL ArmIt)
{
	int i;
	PlaneEditList[Plane]=ArmIt;

	for(i=0;i<PlaneCount;i++)
		if(PlaneEditList[i])
		{
			FirstPlane=i;
			return;
		}
}

BOOL MuniTimeCB(C_Base *control)
{
	C_Window *win;
	Flight flt;
	long takeoff;
	C_Text *txt;
	_TCHAR buf[200];

	if((vuxGameTime - control->GetUserNumber(0)) < VU_TICS_PER_SECOND)
		return(FALSE);

	control->SetUserNumber(0,vuxGameTime);

	txt=(C_Text*)control;

	if(txt)
	{
		flt=(Flight)vuDatabase->Find(gLoadoutFlightID);

		if (flt)
		{
			// update weapon loadout if things have changed
			int numac = flt->GetTotalVehicles();
			int loads = flt->GetNumberOfLoadouts();
			bool ref  = false;

			for (int aci = 0; aci < numac; aci++)
			{
				if (aci < loads)
				{
					LoadoutStruct flightLOS;
					
					memcpy(&flightLOS, flt->GetLoadout(aci), sizeof(LoadoutStruct));

					for (int hpi = 0; hpi < HARDPOINT_MAX ; ++hpi)
					{
						if ((gOriginalStores[aci].WeaponID[hpi]		!= flightLOS.WeaponID[hpi]) || 
							(gOriginalStores[aci].WeaponCount[hpi]	!= flightLOS.WeaponCount[hpi]))
						{
							// update the info for the loadout
							gOriginalStores[aci].WeaponID[hpi]		= flightLOS.WeaponID[hpi]; 
							gOriginalStores[aci].WeaponCount[hpi]	= flightLOS.WeaponCount[hpi];
							gCurStores[aci].WeaponID[hpi]			= flightLOS.WeaponID[hpi]; 
							gCurStores[aci].WeaponCount[hpi]		= flightLOS.WeaponCount[hpi];

							ref = true;
						}
					}
				}
			}

			// check flight time till launch
			if (TheCampaign.Flags & CAMP_TACTICAL_EDIT)
			{
				takeoff=1;
			}
			else
			{
				takeoff=(flt->GetFirstUnitWP()->GetWPDepartureTime() - vuxGameTime);
			}

			if((takeoff / VU_TICS_PER_SECOND) > 120)
			{
				GetTimeString(takeoff,buf);
				txt->Refresh();
				txt->SetText(buf);
				if((takeoff / VU_TICS_PER_SECOND) > 240)
					txt->SetFGColor(0x00ff00);
				else if((takeoff / VU_TICS_PER_SECOND) > 180)
					txt->SetFGColor(0x00ffff);
				else
					txt->SetFGColor(0x0000ff);
				txt->Refresh();
			}
			else
			{
				txt->SetFlagBitOff(C_BIT_TIMER);
				txt->Refresh();
				txt->SetText(TXT_INFLIGHT);
				txt->SetFGColor(0x0000ff);
				txt->Refresh();
				win=txt->GetParent();
				if(win)
					win->DisableCluster(-100);
				win->RefreshWindow();
			}

			if (ref)
			{
//				win=txt->GetParent();

//				if (win)
//				{
					SetCurrentLoadout();
					control->Parent_->RefreshClient(2);
//					win->ScanClientAreas();
//					win->RefreshWindow();
//				}
			}
		}
		else
		{
			txt->SetFlagBitOff(C_BIT_TIMER);
			txt->Refresh();
			txt->SetText(" ");
			txt->Refresh();
		}
	}
	return(TRUE);
}

void DetermineWeight(VU_ID FlightID)
{
	VehicleClassDataType *vc;
	Falcon4EntityClassType *rackPtr,*weapPtr;
	WeaponClassDataType  *wc;
	STORESLIST *store;
	Flight flt;
	long i,j,vid,PlaneCount,count,bitflag;

	flt=(Flight)FindUnit(FlightID);
	if(!flt)
	{
		for(i=0;i<4;i++)
		{
			_MAX_WEIGHT_[i]=0;
			_CLEAN_WEIGHT_[i]=0;
			_DRAG_FACTOR_[i]=0;
			_MUNITIONS_WEIGHT_[i]=0;
			_FUEL_WEIGHT_[i]=0;
			_CURRENT_WEIGHT_[i]=0;
		}
		gFlightOverloaded=0;
		return;
	}
	vid = flt->GetVehicleID(0);
	PlaneCount=flt->GetTotalVehicles();
	vc = GetVehicleClassData(vid);
	gFlightOverloaded=0;
	for(i=0;i<4;i++)
	{
		_MAX_WEIGHT_[i]=vc->MaxWt;
		_CLEAN_WEIGHT_[i]=vc->EmptyWt;
		_DRAG_FACTOR_[i]=1;
		_MUNITIONS_WEIGHT_[i]=0;
		_FUEL_WEIGHT_[i]=vc->FuelWt;

		if(i < PlaneCount)
		{
			for(j=0;j<QuantityCount[i];j++)
			{
				store=gStores->Find(Quantity[i][0][j]);
				if(store)
				{
					if(store->Type == StoresList::_TYPE_FUEL_)
						_FUEL_WEIGHT_[i]+=store->Fuel * Quantity[i][1][j];
//					_MUNITIONS_WEIGHT_[i]+=store->Weight * Quantity[i][1][j];
//					_DRAG_FACTOR_[i]+=store->DragFactor * Quantity[i][1][j];
				}
			}

			// Add up Rack Weights
			for(j=1;j<HardPoints;j++)
			{
				if(gCurRails[i].rail[j].rackID)
				{
					rackPtr=&Falcon4ClassTable[gCurRails[i].rail[j].rackID];
					if(rackPtr)
					{
						wc=(WeaponClassDataType *)rackPtr->dataPtr;
						if(wc)
						{
							if(gCurRails[i].rail[j].weaponID)
								_MUNITIONS_WEIGHT_[i]+=(wc->Weight * 0.85);
							else
								_MUNITIONS_WEIGHT_[i]+=wc->Weight;
							_DRAG_FACTOR_[i]+=wc->DragIndex;
						}
					}
				}
			}

			// Add up visible stores weights
			for(j=1;j<HardPoints;j++)
			{
				if(gCurRails[i].rail[j].weaponID && gCurRails[i].rail[j].currentBits)
				{
					bitflag=gCurRails[i].rail[j].currentBits;
					count=0;
					while(bitflag)
					{
						if(bitflag & 1)
							count++;
						bitflag >>= 1;
					}

					weapPtr=&Falcon4ClassTable[gCurRails[i].rail[j].weaponID];
					if(weapPtr)
					{
						wc=(WeaponClassDataType *)weapPtr->dataPtr;
						if(wc)
						{
							_MUNITIONS_WEIGHT_[i]+=wc->Weight * count;
							_DRAG_FACTOR_[i]+=wc->DragIndex;
						}
					}
				}
			}

			// Add up internal stores weights
			for(j=1;j<HardPoints;j++)
			{
				if(!(vc->VisibleFlags & ( 1 << j)) && gCurStores[i].WeaponID[j])
				{
					store=gStores->Find(gCurStores[i].WeaponID[j]);
					if(store)
						_MUNITIONS_WEIGHT_[i]+=store->Weight * gCurStores[i].WeaponCount[j];
				}
			}
		}
		_CURRENT_WEIGHT_[i]=_CLEAN_WEIGHT_[i] + _MUNITIONS_WEIGHT_[i] + _FUEL_WEIGHT_[i];
		if(_CURRENT_WEIGHT_[i] > _MAX_WEIGHT_[i])
		{
			gFlightOverloaded |= 1 << i;
		}
	}
}

//void UpdateMunitionsWindowInfo(const VU_ID flightID)
//{
//}

void SetupMunitionsWindow(VU_ID FlightID)
{
	C_Window *win=NULL;
	C_Button *btn=NULL;
	C_Text *txt=NULL;
	Flight flt;
	long vid=0,status=0;
	_TCHAR buf[200];
	int i=0;
	long takeoff=0;
	VehicleClassDataType *vc=NULL;
	FalconSessionEntity *session=NULL;

	win=gMainHandler->FindWindow(MUNITIONS_WIN);
	if(win == NULL)
		return;

	flt=(Flight)FindUnit(FlightID);
	if(flt == NULL)
	{
		txt=(C_Text*)win->FindControl(FLIGHT_CALLSIGN);
		if(txt)
			txt->SetText(" ");
		txt=(C_Text*)win->FindControl(STATUS_FIELD);
		if(txt)
			txt->SetText(" ");
		for(i=0;i<4;i++)
			SetPlaneToArm(i,FALSE);
		btn=(C_Button *)win->FindControl(AIR_1);
		if(btn)
		{
			btn->Refresh();
			btn->SetState(0);
			btn->SetFlagBitOff(C_BIT_ENABLED);
			btn->SetAllLabel(" ");
			btn->Refresh();
		}
		btn=(C_Button *)win->FindControl(AIR_2);
		if(btn)
		{
			btn->Refresh();
			btn->SetState(0);
			btn->SetFlagBitOff(C_BIT_ENABLED);
			btn->SetAllLabel(" ");
			btn->Refresh();
		}
		btn=(C_Button *)win->FindControl(AIR_3);
		if(btn)
		{
			btn->Refresh();
			btn->SetState(0);
			btn->SetFlagBitOff(C_BIT_ENABLED);
			btn->SetAllLabel(" ");
			btn->Refresh();
		}
		btn=(C_Button *)win->FindControl(AIR_4);
		if(btn)
		{
			btn->Refresh();
			btn->SetState(0);
			btn->SetFlagBitOff(C_BIT_ENABLED);
			btn->SetAllLabel(" ");
			btn->Refresh();
		}
		win->DisableCluster(-100);
		return;
	}

	txt=(C_Text*)win->FindControl(FLIGHT_CALLSIGN);
	if(txt)
	{
		GetCallsign(flt, buf);
		txt->SetText(buf);
	}
	status=0;
	txt=(C_Text*)win->FindControl(STATUS_FIELD);
	if(txt)
	{
		txt->SetTimerCallback(MuniTimeCB);
		if ((!(TheCampaign.Flags & CAMP_TACTICAL_EDIT)) && (!(TheCampaign.Flags & CAMP_LIGHT)))
		{
			status=GetFlightStatusID(flt);
			if(!status)
			{
				takeoff=flt->GetFirstUnitWP()->GetWPDepartureTime() - vuxGameTime;
				if(takeoff < 120)
					status=1;
			}
		}

		if(status)
		{
			txt->SetText(TXT_INFLIGHT);
			txt->SetFGColor(0x0000ff);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -