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

📄 priority.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// Priorities window stuff here

#include <windows.h>
#include "vu2.h"
#include "gtmobj.h"
#include "objectiv.h"
#include "falcsess.h"
#include "campmap.h"
#include "chandler.h"
#include "ui95_ext.h"
#include "userids.h"
#include "textids.h"
#include "ClassTbl.h"

#pragma warning(disable : 4127)

extern C_Handler *gMainHandler;

enum
{
	MAX_PAKS=50,
};

void CloseWindowCB(long,short,C_Base *);
IMAGE_RSC *CreateOccupationMap(long ID,long w,long h,long palsize);
void SendPrimaryObjectiveList (uchar teammask);

// Temporary storage for PAK priorities (so we can undo) [0]=value,[1]=TRUE if we changed the value
static short PAKPriorities[MAX_PAKS][NUM_TEAMS][2];

// Calculated Palette for PAKMap settings
static WORD PAKPalette[101];

IMAGE_RSC *PAKMap=NULL;

static long CurrentPAK=0;
static char BlinkPAK=0;

void InitPAKNames()
{
	C_Window *win;
	C_ListBox *lbox;
	long idx;
	_TCHAR buffer[70];
	VuListIterator poit(POList);
	Objective o;

	win=gMainHandler->FindWindow(STRAT_WIN);
	if(win)
	{
		lbox=(C_ListBox*)win->FindControl(PAK_TITLE);
		if(lbox)
		{
			lbox->RemoveAllItems();

			// search list...
			idx=1;
			o = (Objective) poit.GetFirst();
			while(o)
			{
				_stprintf(buffer,"%s %1ld:",gStringMgr->GetString(TXT_PAK),idx);   
				o->GetName(&buffer[_tcsclen(buffer)],50,TRUE);
				lbox->AddItem(idx,C_TYPE_ITEM,buffer);
				o = (Objective) poit.GetNext();
				idx++;
			}
		}
	}
}

void MakePAKPalette()
{
	short i;

	for(i=0;i<101;i++)
		PAKPalette[100 - i]=UI95_RGB24Bit(0x000000ff | (((i*255)/100) << 8) | (((i*255)/100) << 16));
}

void InitPAKMap()
{
	C_Window *win;
	C_Bitmap *bmp;

	if(!PAKMap)
	{
		SetCursor(gCursors[CRSR_WAIT]);
		MakePAKPalette();
		PAKMap=CreateOccupationMap(1,256,256,MAX_PAKS);
		if(PAKMap)
		{
			PAKMap->Header->flags |= _RSC_USECOLORKEY_;
			MakeCampMap(MAP_PAK,(uchar*)PAKMap->Owner->GetData(),256*256);

			win=gMainHandler->FindWindow(STRAT_WIN);
			if(win)
			{
				bmp=(C_Bitmap*)win->FindControl(PAK_REGION);
				if(bmp)
					bmp->SetImage(PAKMap);
			}
		}
		SetCursor(gCursors[CRSR_F16]);
	}
}

void PositionSlider(long value,C_Slider *slider)
{
	long range,pos,maxval;

	if(slider)
	{
		range = slider->GetSliderMax()-slider->GetSliderMin();
		maxval= max(1,slider->GetSteps());

		pos  = range * value / maxval;
		pos += slider->GetSliderMin();

		slider->Refresh();
		slider->SetSliderPos(pos);
		slider->Refresh();
	}
}

long SliderValue(C_Slider *slider)
{
	long range,pos,maxval,value;
	if(slider)
	{
		range = slider->GetSliderMax()-slider->GetSliderMin();
		maxval= max(1,slider->GetSteps());

		pos=slider->GetSliderPos() - slider->GetSliderMin();
		value = pos * maxval / range;

		return(value);
	}
	return(0);
}

void ResetToDefaults()
{
	POData POD;
	long i;
	VuListIterator poit(POList);
	Objective o;

	o = (Objective) poit.GetFirst();
	while(o)
	{
		POD=GetPOData(o);
		if(POD)
		{
			for(i=0;i<NUM_TEAMS;i++)
//				POD->player_priority[i]=POD->air_priority[i];
				POD->player_priority[i] = -1;
			POD->flags &= ~GTMOBJ_PLAYER_SET_PRIORITY;
		}
		o = (Objective) poit.GetNext();
	}

	for(i=0;i<NUM_TEAMS;i++)
	{
		memcpy(TeamInfo[i]->SetAllObjTypePriority(),DefaultObjtypePriority[TAT_INTERDICT-1],sizeof(uchar)*MAX_TGTTYPE);
		memcpy(TeamInfo[i]->SetAllUnitTypePriority(),DefaultUnittypePriority[TAT_INTERDICT-1],sizeof(uchar)*MAX_UNITTYPE);
		memcpy(TeamInfo[i]->SetAllMissionPriority(),DefaultMissionPriority[TAT_INTERDICT-1],sizeof(uchar)*AMIS_OTHER);
	}
}

void TurnOffHQButton()
{
	C_Window *win;
	C_Button *btn;

	win=gMainHandler->FindWindow(STRAT_WIN);
	if(win)
	{
		btn=(C_Button*)win->FindControl(HQ_FLAG);
		if(btn)
		{
			btn->SetState(0);
			btn->Refresh();
		}
	}
}

void TurnOnHQButton()
{
	C_Window *win;
	C_Button *btn;

	win=gMainHandler->FindWindow(STRAT_WIN);
	if(win)
	{
		btn=(C_Button*)win->FindControl(HQ_FLAG);
		if(btn)
		{
			btn->SetState(1);
			btn->Refresh();
		}
	}
}

// Just turn off HQ Flag if slider moved
void PriSliderCB(long,short hittype,C_Base *)
{
	if(hittype != C_TYPE_LMOUSEDOWN)
		return;

	TurnOffHQButton();
}

// Copies Kevin's priority stuff into the Window's controls
void LoadTargetPriorities()
{
	C_Window *win;
	C_Slider *sldr;
	long value;
	int team = FalconLocalSession->GetTeam();

	win=gMainHandler->FindWindow(STRAT_WIN);
	if(win)
	{
		// Target Type priorities
		// Aircraft
		sldr=(C_Slider*)win->FindControl(TARGET_1);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			// Aircraft is based solely on ESCORT Priority.. For lack of a better variable
			value = TeamInfo[team]->GetMissionPriority(AMIS_ESCORT);
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Air fields
		sldr=(C_Slider*)win->FindControl(TARGET_2);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = TeamInfo[team]->GetObjTypePriority(TYPE_AIRBASE);
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Air defense
		sldr=(C_Slider*)win->FindControl(TARGET_3);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = TeamInfo[team]->GetUnitTypePriority(STYPE_UNIT_AIR_DEFENSE);
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Radar
		sldr=(C_Slider*)win->FindControl(TARGET_4);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = TeamInfo[team]->GetObjTypePriority(TYPE_RADAR);
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Army
		sldr=(C_Slider*)win->FindControl(TARGET_5);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = (TeamInfo[team]->GetObjTypePriority(TYPE_ARMYBASE) + TeamInfo[team]->GetObjTypePriority(TYPE_FORTIFICATION))/2;
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// CCC
		sldr=(C_Slider*)win->FindControl(TARGET_6);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = TeamInfo[team]->GetObjTypePriority(TYPE_COM_CONTROL);
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Infrastructure
		sldr=(C_Slider*)win->FindControl(TARGET_7);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = (	TeamInfo[team]->GetObjTypePriority(TYPE_ROAD) + 
						TeamInfo[team]->GetObjTypePriority(TYPE_BRIDGE) +
						TeamInfo[team]->GetObjTypePriority(TYPE_RAIL_TERMINAL)  ) / 3;
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Logistics
		sldr=(C_Slider*)win->FindControl(TARGET_8);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = TeamInfo[team]->GetObjTypePriority(TYPE_DEPOT);
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// War production
		sldr=(C_Slider*)win->FindControl(TARGET_9);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = (	TeamInfo[team]->GetObjTypePriority(TYPE_CHEMICAL) + 
						TeamInfo[team]->GetObjTypePriority(TYPE_FACTORY) +
						TeamInfo[team]->GetObjTypePriority(TYPE_NUCLEAR) +
						TeamInfo[team]->GetObjTypePriority(TYPE_POWERPLANT) +
						TeamInfo[team]->GetObjTypePriority(TYPE_REFINERY)  ) / 5;
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Naval bases
		sldr=(C_Slider*)win->FindControl(TARGET_10);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = TeamInfo[team]->GetObjTypePriority(TYPE_PORT);
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Armored Units
		sldr=(C_Slider*)win->FindControl(TARGET_11);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = (	TeamInfo[team]->GetUnitTypePriority(STYPE_UNIT_ARMOR) +  
						TeamInfo[team]->GetUnitTypePriority(STYPE_UNIT_ARMORED_CAV) ) / 2;
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Infantry Units
		sldr=(C_Slider*)win->FindControl(TARGET_12);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = (	TeamInfo[team]->GetUnitTypePriority(STYPE_UNIT_INFANTRY) + 
						TeamInfo[team]->GetUnitTypePriority(STYPE_UNIT_MARINE) +
						TeamInfo[team]->GetUnitTypePriority(STYPE_UNIT_MECHANIZED) +
						TeamInfo[team]->GetUnitTypePriority(STYPE_UNIT_AIRMOBILE) +
						TeamInfo[team]->GetUnitTypePriority(STYPE_UNIT_RESERVE) ) / 5;
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Artillery Units
		sldr=(C_Slider*)win->FindControl(TARGET_13);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = (	TeamInfo[team]->GetUnitTypePriority(STYPE_UNIT_ROCKET) + 
						TeamInfo[team]->GetUnitTypePriority(STYPE_UNIT_SP_ARTILLERY) +
						TeamInfo[team]->GetUnitTypePriority(STYPE_UNIT_SS_MISSILE) +
						TeamInfo[team]->GetUnitTypePriority(STYPE_UNIT_TOWED_ARTILLERY) ) / 4;
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Support units
		sldr=(C_Slider*)win->FindControl(TARGET_14);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = (	TeamInfo[team]->GetUnitTypePriority(STYPE_UNIT_ENGINEER) + 
						TeamInfo[team]->GetUnitTypePriority(STYPE_UNIT_HQ) ) / 2;
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Naval Units
		sldr=(C_Slider*)win->FindControl(TARGET_15);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = TeamInfo[team]->GetUnitTypePriority(MAX_UNITTYPE-1); 
//			value = TeamInfo[team]->GetMissionPriority(AMIS_ASHIP);		// Conflicts with mission priorities
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
	}
}

// Copies Kevin's priority stuff into the Window's controls
void LoadMissionPriorities()
{
	C_Window *win;
	C_Slider *sldr;
	long value;
	int team = FalconLocalSession->GetTeam();

	win=gMainHandler->FindWindow(STRAT_WIN);
	if(win)
	{
		// Mission Types
		// OCA
		sldr=(C_Slider*)win->FindControl(MISSION_1);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = (	TeamInfo[team]->GetMissionPriority(AMIS_OCASTRIKE) +
						TeamInfo[team]->GetMissionPriority(AMIS_SWEEP) ) / 2;
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// SAM Suppression
		sldr=(C_Slider*)win->FindControl(MISSION_2);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = (	TeamInfo[team]->GetMissionPriority(AMIS_SEADSTRIKE) +
						TeamInfo[team]->GetMissionPriority(AMIS_SEADESCORT) ) / 2;
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Interdiction
		sldr=(C_Slider*)win->FindControl(MISSION_3);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = (	TeamInfo[team]->GetMissionPriority(AMIS_SAD) +
						TeamInfo[team]->GetMissionPriority(AMIS_INT) +
						TeamInfo[team]->GetMissionPriority(AMIS_BAI)) / 3;
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// CAS
		sldr=(C_Slider*)win->FindControl(MISSION_4);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = (	TeamInfo[team]->GetMissionPriority(AMIS_ONCALLCAS) +
						TeamInfo[team]->GetMissionPriority(AMIS_PRPLANCAS) +
						TeamInfo[team]->GetMissionPriority(AMIS_CAS)) / 3;
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Strategic Strikes
		sldr=(C_Slider*)win->FindControl(MISSION_5);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = (	TeamInfo[team]->GetMissionPriority(AMIS_INTSTRIKE) +
						TeamInfo[team]->GetMissionPriority(AMIS_STRIKE) +
						TeamInfo[team]->GetMissionPriority(AMIS_DEEPSTRIKE)) / 3;
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// Anti shipping
		sldr=(C_Slider*)win->FindControl(MISSION_6);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = (	TeamInfo[team]->GetMissionPriority(AMIS_ASW) +
						TeamInfo[team]->GetMissionPriority(AMIS_ASHIP)) / 3;
			PositionSlider(value,sldr); // Value is in range of 0 -> 100
		}
		// DCA
		sldr=(C_Slider*)win->FindControl(MISSION_7);
		if(sldr)
		{
			sldr->SetCallback(PriSliderCB);
			value = (	TeamInfo[team]->GetMissionPriority(AMIS_BARCAP) +

⌨️ 快捷键说明

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