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

📄 te_units.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	}
}

void SetupPackageControls (C_Window	*win, C_Base *caller)
	{
	C_Button	*btn;
	C_ListBox	*lbox;
	C_Clock		*clock;
	C_Text		*txt;
	C_EditBox	*edit;
	int			i;
	CampaignTime	takeoff,tot;

	if(!win)
		return;

	// Initial clock times based off of either current time or actual package statistics
	takeoff = TheCampaign.CurrentTime+2*CampaignMinutes;
	tot = TheCampaign.CurrentTime+30*CampaignMinutes;
	if (new_package && new_package->GetUnitElement(0))
		{
		// Set times based off of first flight in package
		Flight			flight = (Flight) new_package->GetUnitElement(0);
		WayPoint		w = flight->GetFirstUnitWP();
		if (w)
			takeoff = w->GetWPDepartureTime();
		while (w && !(w->GetWPFlags() & WPF_TARGET))
			w = w->GetNextWP();
		if (w)
			tot = w->GetWPArrivalTime();
		}

	if(!(TheCampaign.Flags & (CAMP_TACTICAL|CAMP_TACTICAL_EDIT)) ||
	  (EdittingPackage && !(TheCampaign.Flags & CAMP_TACTICAL_EDIT) && takeoff < TheCampaign.CurrentTime))
	{
		// Disable these controls in campaign, or in run mode if the package has departed
		btn=(C_Button*)win->FindControl(ADD_PACKAGE_FLIGHT);
		if(btn)
			btn->SetFlagBitOn(C_BIT_INVISIBLE);
		btn=(C_Button*)win->FindControl(DELETE_PACKAGE_FLIGHT);
		if(btn)
			btn->SetFlagBitOn(C_BIT_INVISIBLE);
		btn=(C_Button*)win->FindControl(PAK_TAKEOFF_LOCK);
		if(btn)
			btn->SetFlagBitOn(C_BIT_INVISIBLE);
		btn=(C_Button*)win->FindControl(PAK_TAKEOFF_INC);
		if(btn)
			btn->SetFlagBitOn(C_BIT_INVISIBLE);
		btn=(C_Button*)win->FindControl(PAK_TAKEOFF_DEC);
		if(btn)
			btn->SetFlagBitOn(C_BIT_INVISIBLE);
		btn=(C_Button*)win->FindControl(PAK_TOT_LOCK);
		if(btn)
			btn->SetFlagBitOn(C_BIT_INVISIBLE);
		btn=(C_Button*)win->FindControl(PAK_TOT_INC);
		if(btn)
			btn->SetFlagBitOn(C_BIT_INVISIBLE);
		btn=(C_Button*)win->FindControl(PAK_TOT_DEC);
		if(btn)
			btn->SetFlagBitOn(C_BIT_INVISIBLE);
		clock=(C_Clock*)win->FindControl(PAK_TAKEOFF_TIME);
		if(clock)
			clock->SetFlagBitOff(C_BIT_ENABLED);
		clock=(C_Clock*)win->FindControl(PAK_TOT_TIME);
		if(clock)
			clock->SetFlagBitOff(C_BIT_ENABLED);
	}
	else
	{
		// These controls are allowed in tactical engagement unless we're editing a package in run mode
		btn=(C_Button*)win->FindControl(ADD_PACKAGE_FLIGHT);
		if(btn)
			btn->SetFlagBitOff(C_BIT_INVISIBLE);
		btn=(C_Button*)win->FindControl(DELETE_PACKAGE_FLIGHT);
		if(btn)
			btn->SetFlagBitOff(C_BIT_INVISIBLE);
		btn=(C_Button*)win->FindControl(PAK_TAKEOFF_LOCK);
		if(btn)
			btn->SetFlagBitOff(C_BIT_INVISIBLE);
		btn=(C_Button*)win->FindControl(PAK_TAKEOFF_INC);
		if(btn)
			btn->SetFlagBitOff(C_BIT_INVISIBLE);
		btn=(C_Button*)win->FindControl(PAK_TAKEOFF_DEC);
		if(btn)
			btn->SetFlagBitOff(C_BIT_INVISIBLE);
		btn=(C_Button*)win->FindControl(PAK_TOT_LOCK);
		if(btn)
			btn->SetFlagBitOff(C_BIT_INVISIBLE);
		btn=(C_Button*)win->FindControl(PAK_TOT_INC);
		if(btn)
			btn->SetFlagBitOff(C_BIT_INVISIBLE);
		btn=(C_Button*)win->FindControl(PAK_TOT_DEC);
		if(btn)
			btn->SetFlagBitOff(C_BIT_INVISIBLE);
		clock=(C_Clock*)win->FindControl(PAK_TAKEOFF_TIME);
		if(clock)
			clock->SetFlagBitOn(C_BIT_ENABLED);
		clock=(C_Clock*)win->FindControl(PAK_TOT_TIME);
		if(clock)
			clock->SetFlagBitOn(C_BIT_ENABLED);
	}

	if (!EdittingPackage)
	{
		// These buttons are only allowed if creating a new package
		btn=(C_Button*)win->FindControl(CANCEL_PACK);
		if(btn)
			btn->SetFlagBitOff(C_BIT_INVISIBLE);
	}
	else
	{
		btn=(C_Button*)win->FindControl(CANCEL_PACK);
		if(btn)
			btn->SetFlagBitOn(C_BIT_INVISIBLE);
	}

	if (TheCampaign.Flags & CAMP_TACTICAL)
	{
		// These are allowed always in tactical engagement
		lbox=(C_ListBox*)win->FindControl(PACKAGE_PRIORITY_LIST);
		if(lbox)
			lbox->SetFlagBitOn(C_BIT_ENABLED);
	}
	else
	{
		lbox=(C_ListBox*)win->FindControl(PACKAGE_PRIORITY_LIST);
		if(lbox)
			lbox->SetFlagBitOff(C_BIT_ENABLED);
	}

	if(EdittingPackage && new_package)
	{
		_TCHAR buffer[40];

		txt=(C_Text*)win->FindControl(PACKAGE_DESIGNATOR);
		if(txt)
		{
			_stprintf(buffer,"%s %1ld",gStringMgr->GetString(TXT_PACKAGE),new_package->GetCampID());
			txt->SetText(buffer);
			txt->Refresh();
		}
	}
	else
	{
		txt=(C_Text*)win->FindControl(PACKAGE_DESIGNATOR);
		if(txt)
		{
			txt->SetText(TXT_ADD_PACKAGE_UC);
			txt->Refresh();
		}
	}

	// Set Package Type listbox
	lbox=(C_ListBox *)win->FindControl(TAC_PACKAGE_TYPE);
	if(lbox)
		{
		for (i=1;i<=ATO_OTHER;i++)
			lbox->AddItem(i,C_TYPE_ITEM,AtoMissStr[i]);
		}

	// Initialize takeoff time to now
	clock=(C_Clock*)win->FindControl(PAK_TAKEOFF_TIME);
	if (clock)
		{
		int				hr,min,sec;
		hr = takeoff / CampaignHours;
		hr = hr % 24;
		min = (takeoff / CampaignMinutes) % 60;
		sec = (takeoff / CampaignSeconds) % 60;
		clock->SetHour(hr);
		clock->SetMinute(min);
		clock->SetSecond(sec);
		clock->Refresh ();
		}

	// Initialize takeoff time to now plus estimated time to target
	clock=(C_Clock*)win->FindControl(PAK_TOT_TIME);
	if (clock)
		{
		int				hr,min,sec;
		hr = tot / CampaignHours;
		hr = hr % 24;
		min = (tot / CampaignMinutes) % 60;
		sec = (tot / CampaignSeconds) % 60;
		clock->SetHour(hr);
		clock->SetMinute(min);
		clock->SetSecond(sec);
		clock->Refresh ();
		}

	// Initial package day edit
	edit = (C_EditBox*)win->FindControl(PACKAGE_DAY);
	if (edit)
		edit->SetText((takeoff / CampaignDay) + 1);

	// Initialize priority list box
	lbox=(C_ListBox *)win->FindControl(PACKAGE_PRIORITY_LIST);
	if (lbox)
		{
		lbox->AddItem(1,C_TYPE_ITEM,"A");
		lbox->AddItem(2,C_TYPE_ITEM,"B");
		lbox->AddItem(3,C_TYPE_ITEM,"C");
		lbox->AddItem(4,C_TYPE_ITEM,"D");
		lbox->AddItem(5,C_TYPE_ITEM,"E");
		lbox->AddItem(6,C_TYPE_ITEM,"F");
		lbox->SetValue(1);
		}

	// Setup time lock buttons
	btn = (C_Button*)win->FindControl(PAK_TAKEOFF_LOCK);
	if (btn)
		btn->SetCallback(LockTakeoffTimeCB);

	btn = (C_Button*)win->FindControl(PAK_TOT_LOCK);
	if (btn)
		{
		btn->SetCallback(LockTimeOnTargetCB);
		if (!btn->GetState())
			LockTakeoffTimeCB (0,C_TYPE_LMOUSEUP,NULL);
		}

	// Setup cancel and ok
	btn=(C_Button*)win->FindControl(CANCEL_PACK);
	if(btn)
		btn->SetCallback(DiscardPackage);

	btn=(C_Button*)win->FindControl(OK_PACK);
	if(btn)
		btn->SetCallback(KeepPackage);

	btn=(C_Button*)win->FindControl(PAK_TOT_DEC);
	if(btn)
		btn->SetCallback(ChangePackTimeCB);

	btn=(C_Button*)win->FindControl(PAK_TOT_INC);
	if(btn)
		btn->SetCallback(ChangePackTimeCB);

	btn=(C_Button*)win->FindControl(PAK_TAKEOFF_DEC);
	if(btn)
		btn->SetCallback(ChangePackTimeCB);

	btn=(C_Button*)win->FindControl(PAK_TAKEOFF_INC);
	if(btn)
		btn->SetCallback(ChangePackTimeCB);

	if(caller->_GetCType_() != _CNTL_BUTTON_)
		gMainHandler->EnableWindowGroup(win->GetGroup());
	}

// KCK: This is called when we've decided to add a package -
// i.e: when we're in package create mode and clicked on the map
void tactical_add_package (VU_ID id,C_Base *caller)
{
	C_Window	*win=NULL;
	C_TreeList	*tree=NULL;
	CampEntity	ent=NULL;
	GridIndex	x=0,y=0;
	float		mx,my,maxy,scale;

	EdittingPackage=0;
	WeAreAddingPackage=1;
	if(caller->_GetCType_() == _CNTL_POPUPLIST_)
	{
		gPopupMgr->GetCurrentXY (&x, &y);
		gMapMgr->GetMapRelativeXY (&x, &y);
	}
	else if(caller->_GetCType_() == _CNTL_MAP_MOVER_)
	{
		x=static_cast<short>(((C_MapMover*)caller)->GetRelX() + caller->GetX() + caller->Parent_->GetX());
		y=static_cast<short>(((C_MapMover*)caller)->GetRelY() + caller->GetY() + caller->Parent_->GetY());
		gMapMgr->GetMapRelativeXY (&x, &y);
	}

	gTakeoffTime = gPackageTOT = 0;
	new_package = NULL;
	gNewSelectFlight=FalconNullId;
	scale = gMapMgr->GetMapScale ();
	maxy = gMapMgr->GetMaxY ();

	mx = x / scale;
	my = maxy - y / scale;

	// Determine target (or target location)
	ent=(CampEntity) vuDatabase->Find(id);
	if (ent)
		{
		gLastTarget = new_package_target = ent;
		new_package_target->GetLocation(&MapX,&MapY);
		}
	else
		{
		MapX = SimToGrid (mx);
		MapY = SimToGrid (my);
		new_package_target = NULL;
		}

	// Determine default mission type
	if (!gLastAircraftType)
		gLastAircraftType = GetClassID(DOMAIN_AIR,CLASS_UNIT,TYPE_SQUADRON,STYPE_UNIT_FIGHTER_BOMBER,SPTYPE_F16C,VU_ANY,VU_ANY,VU_ANY) + VU_LAST_ENTITY_TYPE;
	gLastRole = GetMissionFromTarget (gSelectedTeam, gLastAircraftType-VU_LAST_ENTITY_TYPE, ent);
	
	win=gMainHandler->FindWindow(PACKAGE_WIN);
	if(win)
	{
		// Clear any old flight trees
		tree=(C_TreeList *)win->FindControl(ATO_PACKAGE_TREE);
		if(tree)
		{
			tree->DeleteBranch(tree->GetRoot());
			tree->RecalcSize();
			tree->Parent_->RefreshClient(tree->GetClient());
		}
		SetupPackageControls (win, caller);
	}

	tactical_update_package();
}

void tactical_edit_package (VU_ID id,C_Base *caller)
{
	C_Window	*win;
	C_TreeList	*tree;
	Flight		flight;

	new_package = (Package) vuDatabase->Find(id);
	if (!new_package)
		return;

	EdittingPackage=1;
	WeAreAddingPackage=1;
	gTakeoffTime = gPackageTOT = 0;
	gNewSelectFlight=FalconNullId;

	gLastTarget = new_package_target = (CampBaseClass*) vuDatabase->Find(new_package->GetMissionRequest()->targetID);
	if (new_package_target)
		new_package_target->GetLocation(&MapX,&MapY);
	else
		new_package->GetLocation(&MapX,&MapY);

	// Determine default mission type
	flight = (Flight)new_package->GetFirstUnitElement();
	if (flight)
		gLastRole = flight->GetUnitMission();

	tactical_update_package();

	win=gMainHandler->FindWindow(PACKAGE_WIN);
	if(win)
		{
		// Clear any old flight trees
		tree=(C_TreeList *)win->FindControl(ATO_PACKAGE_TREE);
		if(tree)
			{
			C_ATO_Flight *atoflt;
			TREELIST *item;

			tree->DeleteBranch(tree->GetRoot());
			tree->RecalcSize();
			tree->Parent_->RefreshClient(tree->GetClient());
			tree->SetCallback(tactical_new_flight_select);
		
			// Add current flights
			flight = (Flight)new_package->GetFirstUnitElement();
			while (flight)
			{
				atoflt=BuildATOFlightInfo(flight);
				if(atoflt)
				{
					item=tree->CreateItem(flight->GetCampID(),C_TYPE_ITEM,atoflt);
					if(item)
						tree->AddItem (tree->GetRoot(), item);
				}
				flight = (Flight)new_package->GetNextUnitElement();
			}
			tree->RecalcSize();
			tree->Parent_->RefreshClient(tree->GetClient());
		}
	}
	SetupPackageControls (win, caller);
}

void Open_Flight_WindowCB(long,short hittype,C_Base *control)
{
	if(hittype != C_TYPE_LMOUSEUP)
		return;

	if (new_package_target)
		tactical_add_flight(new_package_target->Id(),control);
	else
		tactical_add_flight(FalconNullId,control);
}

void EditFlightInPackage(long,short hittype,C_Base *)
{
	if(hittype != C_TYPE_LMOUSEUP)
		return;
}

void DeleteFlightFromPackage(long,short hittype,C_Base *control)
{
	Flight flt;
	C_TreeList *tree;

	if(hittype != C_TYPE_LMOUSEUP)
		return;

	tree=(C_TreeList*)control->Parent_->FindControl(ATO_PACKAGE_TREE);
	if(tree)
	{
		flt=(Flight)vuDatabase->Find(gNewSelectFlight);
		if(flt)
		{
			tree->DeleteItem(flt->GetCampID());
			//flt->DisposeWayPoints();
			gMapMgr->SetCurrentWaypointList(flt->Id());
			RegroupFlight(flt);
			flt->Remove();
			gNewSelectFlight=FalconNullId;
			tree->RecalcSize();
			tree->Parent_->RefreshClient(tree->GetClient());
		}
	}
}

void DiscardPackage(long,short hittype,C_Base *control)
{
	if(hittype != C_TYPE_LMOUSEUP)
		return;

//	if(!EdittingPackage)
//	{
		gNewSelectFlight=FalconNullId;
		if (new_package)
		{
			new_package->KillUnit();
			new_package->Remove();
		}
//	}
	EdittingPackage=0;
	new_package=NULL;
	WeAreAddingPackage=0;
	gMainHandler->DisableWindowGroup(control->Parent_->GetGroup());
}

void KeepPackage(long ID,short hittype,C_Base *control)
{
	if(hittype != C_TYPE_LMOUSEUP)
		return;

	if (new_package && !new_package->GetFirstUnitElement())
		DiscardPackage(ID,hittype,control);

	gNewSelectFlight=FalconNullId;
	if(new_package)
	{
		// If we're a client creating a package on the fly, we need to set the owner
		// to the host and send a full update
		new_package->SetFinal(1);
		if (!FalconLocalGame->IsLocal())
			{
			FalconSessionEntity	*host = (FalconSessionEntity*) vuDatabase->Find(FalconLocalGame->OwnerId());
			FalconEntity		*element;
			new_package->DoFullUpdate();
			new_package->FalconEntity::SetOwner(host);
			element = (FalconEntity*) new_package->GetFirstUnitElement();

⌨️ 快捷键说明

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