📄 munition.cpp
字号:
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 + -