📄 munition.cpp
字号:
}
else if(classPtr->vuClassData.classInfo_[VU_TYPE] == TYPE_BOMB)
{
wtype=StoresList::_TYPE_BOMB_;
slist=StoresList::_AIR_TO_GROUND_;
}
else if(classPtr->vuClassData.classInfo_[VU_TYPE] == TYPE_FUEL_TANK)
{
wtype=StoresList::_TYPE_FUEL_;
slist=StoresList::_OTHER_;
fuel=wc->Strength;
}
else
{
wtype=StoresList::_TYPE_OTHER_;
slist=StoresList::_OTHER_;
}
wpn=gStores->Create(vc->Weapon[i],wc->Name,wtype,wc->Weight,fuel,wc->DragIndex,static_cast<short>(avail)); // add stores wgt,drag factor
}
else
{
slist=StoresList::_OTHER_;
wpn=gStores->Create(vc->Weapon[i],wc->Name,StoresList::_TYPE_OTHER_,wc->Weight,fuel,wc->DragIndex,static_cast<short>(avail)); // add stores wgt,drag factor
}
gStores->Add(wpn,slist);
}
wpn->HardPoint[i]=vc->Weapons[i];
}
}
}
gStores->Sort();
}
void MakeStoresList(C_Window *win,long client)
{
C_ListBox *lbox;
C_Text *txt;
C_Button *btn;
C_Line *line;
STORESLIST *cur;
BOOL ShowLoadedOnly=FALSE,Drawit;
int GetType,x,y,i,j,hpnum,availID;
long color,avail;
_TCHAR buf[STRING_BUFFER_SIZE];
F4CSECTIONHANDLE *Leave;
if(win == NULL)
return;
Leave=UI_Enter(win);
DeleteGroupList(win->GetID());
win->ScanClientArea(client);
lbox=(C_ListBox*)win->FindControl(WEAPON_LIST_CTRL);
if(lbox)
{
switch(lbox->GetTextID())
{
case SHOW_LOADOUT:
GetType=StoresList::_ALL_;
ShowLoadedOnly=TRUE;
break;
case SHOW_AA:
GetType=StoresList::_AIR_TO_AIR_;
break;
case SHOW_AG:
GetType=StoresList::_AIR_TO_GROUND_;
break;
case SHOW_OTHER:
GetType=StoresList::_OTHER_;
break;
default:
GetType=StoresList::_ALL_;
}
}
else
GetType=StoresList::_ALL_;
y=1;
x=174+240-(HardPoints/2)*30+15*((HardPoints-1)&1);
// store's column headings
hpnum=1;
for(i=HardPoints-1;i>0;i--)
{
if(VisFlag & (1 << (HardPoints - i)))
_stprintf(buf,"%1d",hpnum++);
else
{
_tcscpy(buf,gStringMgr->GetString(TXT_INT));
ShiAssert (buf[STRING_BUFFER_SIZE-1] == 0);
buf[STRING_BUFFER_SIZE-1] = 0;
}
txt=new C_Text;
txt->Setup(C_DONT_CARE,0);
txt->SetFixedWidth(_tcsclen(buf)+1);
txt->SetText(buf);
txt->SetFont(win->Font_);
txt->SetXY(x+(i-1)*30-3+15+6,278);
txt->SetFGColor(0xad8041);
txt->SetFlagBitOn(C_BIT_ABSOLUTE|C_BIT_HCENTER);
txt->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
win->AddControl(txt);
}
// Vertical lines separation the stores
for(i=0;i<HardPoints;i++)
{
line=new C_Line;
line->Setup(C_DONT_CARE,C_TYPE_VERTICAL);
line->SetXY(x+i*30+6-3,294);
line->SetWH(1,103);
line->SetColor(0xad8041);
line->SetFlagBitOn(C_BIT_ABSOLUTE);
line->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
win->AddControl(line);
}
cur=gStores->GetFirst(GetType);
while(cur)
{
if(ShowLoadedOnly)
{
Drawit=FALSE;
for(i=0;i<PlaneCount && Drawit == FALSE;i++)
for(j=1;j<HardPoints && Drawit == FALSE;j++)
if(cur->ID == gCurStores[i].WeaponID[j] && gCurStores[i].WeaponCount[j])
Drawit=TRUE;
}
else
Drawit=TRUE;
if(Drawit)
{
// Store's name
txt=new C_Text;
txt->Setup(C_DONT_CARE,0);
txt->SetText(cur->Name);
txt->SetFont(win->Font_);
txt->SetXY(6,y+4);
txt->SetClient(static_cast<short>(client));
txt->SetFGColor(0xc0c0c0);
txt->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
win->AddControl(txt);
// # in stock
avail=TotalAvailable(static_cast<short>(cur->ID));
if(!avail)
{
availID=TXT_SUPPLY_OUT;
color=0x0000ff;
}
else if(avail < 700)
{
availID=TXT_SUPPLY_LOW;
color=0x00ffff;
}
else if(avail < 1500)
{
availID=TXT_SUPPLY_MEDIUM;
color=0xeeeeee;
}
else
{
availID=TXT_SUPPLY_HIGH;
color=0x00ff00;
}
txt=new C_Text;
txt->Setup((1 << 25) | cur->ID,0);
txt->SetText(availID);
txt->SetFont(win->Font_);
txt->SetXY(122,y+4);
txt->SetClient(static_cast<short>(client));
txt->SetFGColor(color);
txt->SetFlagBitOn(C_BIT_HCENTER);
txt->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
win->AddControl(txt);
// # on board
txt=new C_Text;
txt->Setup((1 << 24) | cur->ID,0);
txt->SetFixedWidth(5);
txt->SetText(" ");
txt->SetFont(win->Font_);
txt->SetXY(157,y+4);
txt->SetClient(static_cast<short>(client));
txt->SetFGColor(0xc0c0c0);
txt->SetFlagBitOn(C_BIT_HCENTER);
txt->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
win->AddControl(txt);
// configuration
for(i=1;i<HardPoints;i++)
{
if(cur->HardPoint[i])
{
btn=new C_Button;
btn->Setup(i << 16 | cur->ID,C_TYPE_CUSTOM,x+((HardPoints-i)-1)*30+1,y+4);
btn->SetUserNumber(1,cur->HardPoint[i]);
btn->SetUserNumber(2,1);
if(!(VisFlag & (1 << (i)))) // Internal stores
{
btn->SetBackImage(INT_EMPTY);
btn->SetImage(C_STATE_0,INT_EMPTY);
btn->SetImage(C_STATE_1,INT_DIFF); // should be diff
btn->SetImage(C_STATE_2,INT_FULL);
btn->SetImage(C_STATE_3,INT_DIFF);
btn->SetImage(C_STATE_DISABLED,INT_DIS);
}
else if(cur->Type == StoresList::_TYPE_GUN_)
{
btn->SetBackImage(SINGLE_EMPTY);
btn->SetImage(C_STATE_0,SINGLE_EMPTY);
btn->SetImage(C_STATE_1,SINGLE_EMPTY_DIFF); // should be diff
btn->SetImage(C_STATE_2,SINGLE_FULL);
btn->SetImage(C_STATE_3,SINGLE_DIFF);
btn->SetImage(C_STATE_DISABLED,SINGLE_DIS);
btn->SetUserNumber(1,1);
btn->SetUserNumber(2,cur->HardPoint[i]);
}
else switch(cur->HardPoint[i])
{
case 1:
switch(cur->Type)
{
case StoresList::_TYPE_FUEL_:
btn->SetBackImage(POD_EMPTY);
btn->SetImage(C_STATE_0,POD_EMPTY);
btn->SetImage(C_STATE_1,POD_EMPTY_DIFF); // should be diff
btn->SetImage(C_STATE_2,POD_FULL);
btn->SetImage(C_STATE_3,POD_DIFF);
btn->SetImage(C_STATE_DISABLED,POD_DIS);
break;
default:
btn->SetBackImage(SINGLE_EMPTY);
btn->SetImage(C_STATE_0,SINGLE_EMPTY);
btn->SetImage(C_STATE_1,SINGLE_EMPTY_DIFF); // should be diff
btn->SetImage(C_STATE_2,SINGLE_FULL);
btn->SetImage(C_STATE_3,SINGLE_DIFF);
btn->SetImage(C_STATE_DISABLED,SINGLE_DIS);
break;
}
break;
case 2:
switch(cur->Type)
{
case StoresList::_TYPE_MISSILE_:
btn->SetImage(C_STATE_2,LAU1_FULL);
btn->SetImage(C_STATE_3,LAU1_FULL_DIFF);
if(i > (HardPoints/2))
{
btn->SetBackImage(LAU2L_EMPTY);
btn->SetImage(C_STATE_0,LAU2L_EMPTY);
btn->SetImage(C_STATE_1,LAU2L_EMPTY_DIFF); // should be diff
btn->SetImage(C_STATE_4,LAU2L_FULL);
btn->SetImage(C_STATE_5,LAU2L_DIFF);
btn->SetImage(C_STATE_DISABLED,LAU2L_DIS);
}
else if (i == (HardPoints/2) && !(HardPoints & 1))
{
btn->SetBackImage(LAU2C_EMPTY);
btn->SetImage(C_STATE_0,LAU2C_EMPTY);
btn->SetImage(C_STATE_1,LAU2C_EMPTY_DIFF); // should be diff
btn->SetImage(C_STATE_4,LAU2C_FULL);
btn->SetImage(C_STATE_5,LAU2C_DIFF);
btn->SetImage(C_STATE_DISABLED,LAU2C_DIS);
}
else
{
btn->SetBackImage(LAU2R_EMPTY);
btn->SetImage(C_STATE_0,LAU2R_EMPTY);
btn->SetImage(C_STATE_1,LAU2R_EMPTY_DIFF); // should be diff
btn->SetImage(C_STATE_4,LAU2R_FULL);
btn->SetImage(C_STATE_5,LAU2R_DIFF);
btn->SetImage(C_STATE_DISABLED,LAU2R_DIS);
}
break;
default:
btn->SetImage(C_STATE_2,LAU1_FULL);
btn->SetImage(C_STATE_3,LAU1_FULL_DIFF);
if(i > (HardPoints/2))
{
btn->SetBackImage(TER2L_EMPTY);
btn->SetImage(C_STATE_0,TER2L_EMPTY);
btn->SetImage(C_STATE_1,TER2L_EMPTY_DIFF); // should be diff
btn->SetImage(C_STATE_4,TER2L_FULL);
btn->SetImage(C_STATE_5,TER2L_DIFF);
btn->SetImage(C_STATE_DISABLED,TER2L_DIS);
}
else
{
btn->SetBackImage(TER2R_EMPTY);
btn->SetImage(C_STATE_0,TER2R_EMPTY);
btn->SetImage(C_STATE_1,TER2R_EMPTY_DIFF); // should be diff
btn->SetImage(C_STATE_4,TER2R_FULL);
btn->SetImage(C_STATE_5,TER2R_DIFF);
btn->SetImage(C_STATE_DISABLED,TER2R_DIS);
}
break;
}
break;
case 3:
switch(cur->Type)
{
case StoresList::_TYPE_MISSILE_:
btn->SetBackImage(LAU3_EMPTY);
btn->SetImage(C_STATE_0,LAU3_EMPTY);
btn->SetImage(C_STATE_1,LAU3_EMPTY_DIFF); // should be diff
btn->SetImage(C_STATE_2,LAU1_FULL);
btn->SetImage(C_STATE_3,LAU1_FULL_DIFF);
if(i > (HardPoints/2))
{
btn->SetImage(C_STATE_4,LAU2L_FULL);
btn->SetImage(C_STATE_5,LAU2L_DIFF);
}
else if (i == (HardPoints/2) && !(HardPoints & 1))
{
btn->SetImage(C_STATE_4,LAU2C_FULL);
btn->SetImage(C_STATE_5,LAU2C_DIFF);
}
else
{
btn->SetImage(C_STATE_4,LAU2R_FULL);
btn->SetImage(C_STATE_5,LAU2R_DIFF);
}
btn->SetImage(C_STATE_6,LAU3_FULL);
btn->SetImage(C_STATE_7,LAU3_DIFF);
btn->SetImage(C_STATE_DISABLED,LAU3_DIS);
break;
default:
btn->SetBackImage(TER_EMPTY);
btn->SetImage(C_STATE_0,TER_EMPTY);
btn->SetImage(C_STATE_1,TER_EMPTY_DIFF); // should be diff
btn->SetImage(C_STATE_2,LAU1_FULL);
btn->SetImage(C_STATE_3,LAU1_FULL_DIFF);
if(i > (HardPoints/2))
{
btn->SetImage(C_STATE_4,TER2L_FULL);
btn->SetImage(C_STATE_5,TER2L_DIFF);
}
else
{
btn->SetImage(C_STATE_4,TER2R_FULL);
btn->SetImage(C_STATE_5,TER2R_DIFF);
}
btn->SetImage(C_STATE_6,TER_FULL);
btn->SetImage(C_STATE_7,TER_DIFF);
btn->SetImage(C_STATE_DISABLED,TER_DIS);
break;
}
break;
case 4:
btn->SetBackImage(QUAD_EMPTY);
btn->SetImage(C_STATE_0,QUAD_EMPTY);
btn->SetImage(C_STATE_1,QUAD_EMPTY_DIFF); // should be diff
if(i > (HardPoints/2))
{
btn->SetImage(C_STATE_2,QUAD1L);
btn->SetImage(C_STATE_3,QUAD1L_DIFF);
btn->SetImage(C_STATE_4,QUAD2L);
btn->SetImage(C_STATE_5,QUAD2L_DIFF);
btn->SetImage(C_STATE_6,QUAD3L);
btn->SetImage(C_STATE_7,QUAD3L_DIFF);
}
else
{
btn->SetImage(C_STATE_2,QUAD1R);
btn->SetImage(C_STATE_3,QUAD1R_DIFF);
btn->SetImage(C_STATE_4,QUAD2R);
btn->SetImage(C_STATE_5,QUAD2R_DIFF);
btn->SetImage(C_STATE_6,QUAD3R);
btn->SetImage(C_STATE_7,QUAD3R_DIFF);
}
btn->SetImage(C_STATE_8,QUAD_FULL);
btn->SetImage(C_STATE_9,QUAD_DIFF);
btn->SetImage(C_STATE_DISABLED,QUAD_DIS);
break;
case 5: case 6:
btn->SetBackImage(DOUBLE_TER_EMPTY);
btn->SetImage(C_STATE_0,DOUBLE_TER_EMPTY);
btn->SetImage(C_STATE_1,DOUBLE_TER_DIFF); // should be diff
btn->SetImage(C_STATE_2,LAU1_FULL);
btn->SetImage(C_STATE_3,LAU1_FULL_DIFF);
if(i > (HardPoints/2))
{
btn->SetImage(C_STATE_4,TER2L_FULL);
btn->SetImage(C_STATE_5,TER2L_DIFF);
btn->SetImage(C_STATE_10,DOUBLE_TER_5L);
btn->SetImage(C_STATE_11,DOUBLE_TER_5L_DIFF);
}
else
{
btn->SetImage(C_STATE_4,TER2R_FULL);
btn->SetImage(C_STATE_5,TER2R_DIFF);
btn->SetImage(C_STATE_10,DOUBLE_TER_5R);
btn->SetImage(C_STATE_11,DOUBLE_TER_5R_DIFF);
}
btn->SetImage(C_STATE_6,TER_FULL);
btn->SetImage(C_STATE_7,TER_DIFF);
btn->SetImage(C_STATE_8,DOUBLE_TER_4);
btn->SetImage(C_STATE_9,DOUBLE_TER_4_DIFF);
btn->SetImage(C_STATE_12,DOUBLE_TER_FULL);
btn->SetImage(C_STATE_13,DOUBLE_TER_DIFF);
btn->SetImage(C_STATE_DISABLED,DOUBLE_TER_DIS);
break;
default: //!!marked
btn->SetBackImage(POD_EMPTY);
btn->SetImage(C_STATE_0,POD_EMPTY);
btn->SetImage(C_STATE_1,POD_EMPTY_DIFF); // should be diff
btn->SetImage(C_STATE_2,POD_FULL);
btn->SetImage(C_STATE_3,POD_DIFF);
btn->SetImage(C_STATE_DISABLED,POD_DIS);
break;
}
btn->SetClient(static_cast<short>(client));
btn->SetFont(win->Font_);
btn->SetGroup(i);
if(!(VisFlag & (1 << (i)))) // Internal stores
btn->SetCallback(InternalArmPlaneCB);
else
btn->SetCallback(ArmPlaneCB);
btn->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
win->AddControl(btn);
}
}
line=new C_Line;
line->Setup(C_DONT_CARE,C_TYPE_HORIZONTAL);
line->SetXY(0,y+25);
line->SetWH(win->ClientArea_[1].right-win->ClientArea_[1].left+1,1);
line->SetColor(0xad8041);
line->SetClient(static_cast<short>(client));
line->SetUserNumber(_UI95_DELGROUP_SLOT_,_UI95_DELGROUP_ID_);
win->AddControl(line);
y+=26;
}
cur=gStores->GetNext();
}
SetCurrentLoadout();
win->ScanClientAreas();
win->RefreshWindow();
UI_Leave(Leave);
}
void RestoreStores(C_Window *win)
{
Flight flt;
int v,ac,loads;
short i,j;
F4CSECTIONHANDLE *Leave;
Leave=UI_Enter(win);
flt=(Flight)vuDatabase->Find(gLoadoutFlightID);
ac = flt->GetTotalVehicles();
loads = flt->GetNumberOfLoadouts();
ShiAssert( ac > 0 && loads > 0 );
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<4;i++)
{
for(j=0;j<HARDPOINT_MAX;j++)
{
if(j && j < HardPoints)
{
ClearHardPoint(i,j,HardPoints/2,&gCurRails[i].rail[j]);
if(GetRackAndWeapon(gVCPtr,static_cast<short>(gVehID),gCurStores[i].WeaponID[j],gCurStores[i].WeaponCount[j],static_cast<short>(j),static_cast<short>(HardPoints/2),&gCurRails[i].rail[j]))
LoadHardPoint(i,j,HardPoints/2,&gCurRails[i].rail[j]);
}
}
}
MakeStoresList(win,1);
win->RefreshWindow();
UI_Leave(Leave);
}
void ClearStores(C_Window *win)
{
int i,j;
for(i=0;i<4;i++)
{
if(PlaneEditList[i])
{
for(j=1;j<HARDPOINT_MAX;j++)
{
gCurStores[i].WeaponID[j]=0;
gCurStores[i].WeaponCount[j]=0;
if(j && j < HardPoints)
{
ClearHardPoint(i,j,HardPoints/2,&gCurRails[i].rail[j]);
}
}
memset(gCurRails[i].rail,0,sizeof(RailList));
}
}
MakeStoresList(win,1);
win->RefreshWindow();
}
void UseStores()
{
Flight flt;
int i,ac,hp,loads;
Squadron sq;
LoadoutStruct *loadout,*newloadout;
flt=(Flight)vuDatabase->Find(gLoadoutFlightID);
if (flt == NULL)
return;
sq = (Squadron) flt->GetUnitSquadron();
if (!sq)
return;
ac = flt->GetTotalVehicles();
loadout = flt->GetLoadout();
loads = flt->GetLoadouts();
if (loads < 1)
return;
// KCK: Need to rationalize the loadout structure
for (i=0; i<ac; i++)
{
for (hp=0; hp<HARDPOINT_MAX; hp++)
{
if (!gCurStores[i].WeaponCount[hp])
gCurStores[i].WeaponID[hp] = 0;
}
}
CampEnterCriticalSection();
// Notify the squadron that we're returning some weapons
if (loads < ac)
sq->UpdateSquadronStores (loadout[0].WeaponID, loadout[0].WeaponCount, 0, -ac);
else
{
for (i=0; i<loads; i++)
sq->UpdateSquadronStores (loadout[i].WeaponID, loadout[i].WeaponCount, 0, -1);
}
// Notify the squadron that we've used some weapons
for (i=0; i<ac; i++)
sq->UpdateSquadronStores (gCurStores[i].WeaponID, gCurStores[i].WeaponCount, 0, 1);
// KCK: Gilman wanted weapons used by the player to have a larger effect.. This isn't exactly very easy to
// do, because if they then change this loadout later, they won't be put back...
// i = FalconLocalSession->GetAircraftNum();
// if (i < PILOTS_PER_FLIGHT)
// UpdateSquadronStores (sq, gCurStores[i].WeaponID, gCurStores[i].WeaponCount, 0, 4);
// KCK: Flights optimize to use a single LoadoutStruct for all aircraft,
// After the player mucks with it, we're going to use one PER aircraft.
newloadout = new LoadoutStruct[ac];
for (i=0; i<ac; i++)
{
// Hardpoint 0 never changes (KCK: this seems like a weird way to do this,
// but Peter doesn't save off the gun loadout because he wants to be able to
// use the loadout for multiple aircraft -although, I have my doubts that
// that's possible).
newloadout[i].WeaponID[0] = loadout[0].WeaponID[0];
newloadout[i].WeaponCount[0] = loadout[0].WeaponCount[0];
for (hp=1; hp<HardPoints; hp++)
{
newloadout[i].WeaponID[hp] = gCurStores[i].WeaponID[hp];
newloadout[i].WeaponCount[hp] = gCurStores[i].WeaponCount[hp];
}
}
flt->SetLoadout(newloadout,ac);
CampLeaveCriticalSection();
// Update the mission evaluator
if (gLoadoutFlightID == FalconLocalSession->GetPlayerFlightID())
TheCampaign.MissionEvaluator->PreMissionEval(flt,FalconLocalSession->GetPilotSlot());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -