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

📄 munition.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
						}
						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 + -