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