📄 cmap.cpp
字号:
{
Map_=new C_ScaleBitmap;
Map_->Setup(5551200,0,MapID);
}
Map_->SetImage(MapID);
maxy=(float)(Map_->GetH())*FEET_PER_PIXEL;
MinZoomLevel_=Map_->GetW()/_MIN_ZOOM_LEVEL_;
MaxZoomLevel_=Map_->GetW()/_MAX_ZOOM_LEVEL_;
ZoomStep_=(MinZoomLevel_ - MaxZoomLevel_) / 64;
if(Map_ && DrawWindow_)
{
DrawRect_=DrawWindow_->ClientArea_[0];
CalculateDrawingParams();
}
}
void C_Map::SetWindow(C_Window *win)
{
if(win)
{
if(DrawWindow_)
RemoveListsFromWindow();
DrawWindow_=win;
if (DrawWindow_)
{
DrawRect_=DrawWindow_->ClientArea_[0];
AddListsToWindow();
CalculateDrawingParams();
}
}
}
void C_Map::SetupOverlay()
{
if(Map_)
Map_->InitOverlay();
}
void C_Map::SetWPZWindow(C_Window *win)
{
WPZWindow_=win;
}
void C_Map::SetZoomLevel(short zoom)
{
if(zoom >= _MIN_ZOOM_LEVEL_ && zoom <= _MAX_ZOOM_LEVEL_ && zoom != ZoomLevel_ && Map_)
{
ZoomLevel_=Map_->GetW()/zoom;
CalculateDrawingParams();
}
}
void C_Map::ZoomIn()
{
long tempzoom;
tempzoom=ZoomLevel_-(ZoomStep_ + (ZoomLevel_>>6));
if(tempzoom > MinZoomLevel_)
tempzoom=MinZoomLevel_;
if(tempzoom < MaxZoomLevel_)
tempzoom=MaxZoomLevel_;
if(tempzoom != ZoomLevel_)
{
ZoomLevel_=tempzoom;
CalculateDrawingParams();
}
}
void C_Map::ZoomOut()
{
long tempzoom;
tempzoom=ZoomLevel_+(ZoomStep_ + (ZoomLevel_>>6));
if(tempzoom > MinZoomLevel_)
tempzoom=MinZoomLevel_;
if(tempzoom < MaxZoomLevel_)
tempzoom=MaxZoomLevel_;
if(tempzoom != ZoomLevel_)
{
ZoomLevel_=tempzoom;
CalculateDrawingParams();
}
}
void C_Map::SetMapCenter(long x,long y)
{
CenterX_=static_cast<float>(x);
CenterY_=static_cast<float>(y);
if(CenterX_ < 0) CenterX_=0;
if(CenterX_ >= 2048) CenterX_=2047;
if(CenterY_ < 0) CenterY_=0;
if(CenterY_ >= 2048) CenterY_=2047;
CalculateDrawingParams();
}
void C_Map::MoveCenter(long x,long y)
{
float distance;
if(Map_ == NULL || DrawWindow_ == NULL)
return;
if(!x && !y)
return;
distance=(float)(MapRect_.right-MapRect_.left)/(DrawWindow_->ClientArea_[0].right-DrawWindow_->ClientArea_[0].left);
CenterX_+= (float)x*distance;
CenterY_+= (float)y*distance;
if(CenterX_ < 0) CenterX_=0;
if(CenterX_ >= 2048) CenterX_=2047;
if(CenterY_ < 0) CenterY_=0;
if(CenterY_ >= 2048) CenterY_=2047;
CalculateDrawingParams();
}
void C_Map::TurnOnNames()
{
short i,j,k;
for(i=0;i<_MAX_TEAMS_;i++)
{
for(j=0;j<_MAP_NUM_OBJ_TYPES_;j++)
Team_[i].Objectives->Type[j]->SetFlagBitOff(C_BIT_NOLABEL);
for(j=0;j<_MAP_NUM_NAV_TYPES_;j++)
Team_[i].NavalUnits->Type[j]->SetFlagBitOff(C_BIT_NOLABEL);
for(j=0;j<_MAP_NUM_GND_TYPES_;j++)
for(k=0;k<_MAP_NUM_GND_LEVELS_;k++)
Team_[i].Units->Type[j]->Levels[k]->SetFlagBitOff(C_BIT_NOLABEL);
for(j=0;j<_MAP_NUM_AIR_TYPES_;j++)
Team_[i].AirUnits->Type[j]->SetFlagBitOff(C_BIT_NOLABEL);
}
flags_ |= I_NEED_TO_DRAW_MAP;
}
void C_Map::TurnOnBoundaries()
{
}
void C_Map::TurnOnArrows()
{
}
void C_Map::TurnOffNames()
{
short i,j,k;
for(i=0;i<_MAX_TEAMS_;i++)
{
for(j=0;j<_MAP_NUM_OBJ_TYPES_;j++)
Team_[i].Objectives->Type[j]->SetFlagBitOn(C_BIT_NOLABEL);
for(j=0;j<_MAP_NUM_NAV_TYPES_;j++)
Team_[i].NavalUnits->Type[j]->SetFlagBitOn(C_BIT_NOLABEL);
for(j=0;j<_MAP_NUM_GND_TYPES_;j++)
for(k=0;k<_MAP_NUM_GND_LEVELS_;k++)
Team_[i].Units->Type[j]->Levels[k]->SetFlagBitOn(C_BIT_NOLABEL);
for(j=0;j<_MAP_NUM_AIR_TYPES_;j++)
Team_[i].AirUnits->Type[j]->SetFlagBitOn(C_BIT_NOLABEL);
}
flags_ |= I_NEED_TO_DRAW_MAP;
}
void C_Map::TurnOffBoundaries()
{
}
void C_Map::TurnOffArrows()
{
}
void C_Map::SetObjCallbacks(long type,void (*cb)(long,short,C_Base *))
{
long i;
if(type < _MAP_NUM_OBJ_TYPES_)
{
for(i=0;i<_MAX_TEAMS_;i++)
if(Team_[i].Objectives->Type[type])
Team_[i].Objectives->Type[type]->SetCallback(cb);
}
}
void C_Map::SetAllObjCallbacks(void (*cb)(long,short,C_Base *))
{
long i,j;
for(i=0;i<_MAX_TEAMS_;i++)
for(j=0;j<_MAP_NUM_OBJ_TYPES_;j++)
if(Team_[i].Objectives->Type[j])
Team_[i].Objectives->Type[j]->SetCallback(cb);
}
void C_Map::SetAllAirUnitCallbacks(void (*cb)(long,short,C_Base*))
{
long i,j;
for(i=0;i<_MAX_TEAMS_;i++)
for(j=0;j<_MAP_NUM_AIR_TYPES_;j++)
if(Team_[i].AirUnits->Type[j])
Team_[i].AirUnits->Type[j]->SetCallback(cb);
}
void C_Map::SetAllGroundUnitCallbacks(void (*cb)(long,short,C_Base*))
{
long i,j,k;
for(i=0;i<_MAX_TEAMS_;i++)
for(j=0;j<_MAP_NUM_GND_TYPES_;j++)
for(k=0;k<_MAP_NUM_GND_LEVELS_;k++)
if(Team_[i].Units->Type[j])
if(Team_[i].Units->Type[j]->Levels[k])
Team_[i].Units->Type[j]->Levels[k]->SetCallback(cb);
}
void C_Map::SetAllNavalUnitCallbacks(void (*cb)(long,short,C_Base*))
{
long i,j;
for(i=0;i<_MAX_TEAMS_;i++)
for(j=0;j<_MAP_NUM_NAV_TYPES_;j++)
if(Team_[i].NavalUnits->Type[j])
Team_[i].NavalUnits->Type[j]->SetCallback(cb);
}
void C_Map::SetAirUnitCallbacks(long type,void (*cb)(long,short,C_Base*))
{
long i;
for(i=0;i<_MAX_TEAMS_;i++)
if(Team_[i].AirUnits->Type[type])
Team_[i].AirUnits->Type[type]->SetCallback(cb);
}
void C_Map::SetGroundUnitCallbacks(long level,long type,void (*cb)(long,short,C_Base*))
{
long i;
for(i=0;i<_MAX_TEAMS_;i++)
if(Team_[i].Units->Type[type])
if(Team_[i].Units->Type[type]->Levels[level])
Team_[i].Units->Type[type]->Levels[level]->SetCallback(cb);
}
void C_Map::SetNavalUnitCallbacks(long type,void (*cb)(long,short,C_Base*))
{
long i;
for(i=0;i<_MAX_TEAMS_;i++)
if(Team_[i].NavalUnits->Type[type])
Team_[i].NavalUnits->Type[type]->SetCallback(cb);
}
C_MapIcon *C_Map::GetObjIconList(long team,long type)
{
return(Team_[team].Objectives->Type[type]);
}
void C_Map::AddListsToWindow()
{
short i,j,k;
long Font=6;
if(Map_ == NULL)
{
Map_=new C_ScaleBitmap;
Map_->Setup(5551000,0,MapID);
}
DrawWindow_->AddControl(Map_);
// Although The Threats are created here... they don't actually get put into a window
if(!BullsEye_)
{
BullsEye_=new C_BullsEye;
BullsEye_->Setup(5550900,0);
BullsEye_->SetColor(0x005500);
BullsEye_->SetFlagBitOn(C_BIT_INVISIBLE);
}
DrawWindow_->AddControl(BullsEye_);
for(i=0;i<_MAX_TEAMS_;i++)
{
if(Team_[i].Threats == NULL)
{
Team_[i].Threats=new THR_LIST;
for(j=0;j<_MAP_NUM_THREAT_TYPES_;j++)
{
Team_[i].Threats->Type[j]=new C_Threat;
Team_[i].Threats->Type[j]->Setup(0,0);
if(ThreatMask_ & (1 << j))
{
Team_[i].Threats->Flags[j]=1;
Team_[i].Threats->Type[j]->SetFlagBitOff(C_BIT_INVISIBLE);
}
else
{
Team_[i].Threats->Flags[j]=0;
Team_[i].Threats->Type[j]->SetFlagBitOn(C_BIT_INVISIBLE);
}
}
SetTeamFlags(i,GetTeamFlags(i) | _MAP_THREATS_);
}
if(Team_[i].Objectives == NULL)
{
Team_[i].Objectives=new OBJ_LIST;
for(j=0;j<_MAP_NUM_OBJ_TYPES_;j++)
{
Team_[i].Objectives->Type[j]=new C_MapIcon;
Team_[i].Objectives->Type[j]->Setup(5551000+i+j*10,j);
Team_[i].Objectives->Type[j]->SetFont(Font);
Team_[i].Objectives->Type[j]->SetTeam(i);
Team_[i].Objectives->Type[j]->SetMainImage(ObjIconIDs_[i][0],ObjIconIDs_[i][1]);
if(j == FindTypeIndex(_UNIT_PACKAGE,OBJ_TypeList,_MAP_NUM_OBJ_TYPES_))
Team_[i].Objectives->Type[j]->SetMenu(PACKAGE_POP);
else if(j == FindTypeIndex(_UNIT_SQUADRON,OBJ_TypeList,_MAP_NUM_OBJ_TYPES_))
Team_[i].Objectives->Type[j]->SetMenu(SQUADRON_POP);
else
Team_[i].Objectives->Type[j]->SetMenu(OBJECTIVE_POP);
Team_[i].Objectives->Type[j]->SetCursorID(CRSR_F16_RM);
Team_[i].Objectives->Type[j]->SetFlagBitOn(C_BIT_NOLABEL);
if(ObjectiveMask_ & (1 << j))
{
Team_[i].Objectives->Flags[j]=1;
Team_[i].Objectives->Type[j]->SetFlagBitOff(C_BIT_INVISIBLE);
}
else
{
Team_[i].Objectives->Flags[j]=0;
Team_[i].Objectives->Type[j]->SetFlagBitOn(C_BIT_INVISIBLE);
}
}
SetTeamFlags(i,GetTeamFlags(i) | _MAP_OBJECTIVES_);
}
for(j=0;j<_MAP_NUM_OBJ_TYPES_;j++)
DrawWindow_->AddControl(Team_[i].Objectives->Type[j]);
}
for(i=0;i<_MAX_TEAMS_;i++)
{
if(Team_[i].NavalUnits == NULL)
{
Team_[i].NavalUnits=new NAV_LIST;
for(j=0;j<_MAP_NUM_NAV_TYPES_;j++)
{
Team_[i].NavalUnits->Type[j]=new C_MapIcon;
Team_[i].NavalUnits->Type[j]->Setup(5551800+i+j*10,j);
Team_[i].NavalUnits->Type[j]->SetMainImage(NavyIconIDs_[i][0],NavyIconIDs_[i][1]);
Team_[i].NavalUnits->Type[j]->SetFont(Font);
Team_[i].NavalUnits->Type[j]->SetTeam(i);
Team_[i].NavalUnits->Type[j]->SetMenu(NAVAL_POP);
Team_[i].NavalUnits->Type[j]->SetCallback(UnitCB);
Team_[i].NavalUnits->Type[j]->SetCursorID(CRSR_F16_RM);
Team_[i].NavalUnits->Type[j]->SetFlagBitOn(C_BIT_NOLABEL);
if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
Team_[i].NavalUnits->Type[j]->SetFlagBitOn(C_BIT_DRAGABLE);
else
Team_[i].NavalUnits->Type[j]->SetFlagBitOff(C_BIT_DRAGABLE);
if(NavalUnitMask_ & (1 << j))
{
Team_[i].NavalUnits->Flags[j]=1;
Team_[i].NavalUnits->Type[j]->SetFlagBitOff(C_BIT_INVISIBLE);
}
else
{
Team_[i].NavalUnits->Flags[j]=0;
Team_[i].NavalUnits->Type[j]->SetFlagBitOn(C_BIT_INVISIBLE);
}
}
SetTeamFlags(i,GetTeamFlags(i) | _MAP_NAVAL_UNITS_);
}
for(j=0;j<_MAP_NUM_NAV_TYPES_;j++)
DrawWindow_->AddControl(Team_[i].NavalUnits->Type[j]);
}
for(i=0;i<_MAX_TEAMS_;i++)
{
if(Team_[i].Units == NULL)
{
Team_[i].Units=new GND_LIST;
for(j=0;j<_MAP_NUM_GND_TYPES_;j++)
{
Team_[i].Units->Flags[j]=0;
Team_[i].Units->Type[j]=new GND_SIZE;
for(k=0;k<_MAP_NUM_GND_LEVELS_;k++)
{
Team_[i].Units->Type[j]->Flags[k]=0;
Team_[i].Units->Type[j]->Levels[k]=new C_MapIcon;
Team_[i].Units->Type[j]->Levels[k]->Setup(static_cast<short>(5551300+i+j*10+k*100),static_cast<short>(j + (k << 8)));
Team_[i].Units->Type[j]->Levels[k]->SetMainImage(ArmyIconIDs_[i][0],ArmyIconIDs_[i][1]);
Team_[i].Units->Type[j]->Levels[k]->SetFont(Font);
Team_[i].Units->Type[j]->Levels[k]->SetTeam(i);
Team_[i].Units->Type[j]->Levels[k]->SetMenu(UNIT_POP);
Team_[i].Units->Type[j]->Levels[k]->SetCursorID(CRSR_F16_RM);
Team_[i].Units->Type[j]->Levels[k]->SetFlagBitOn(C_BIT_NOLABEL);
Team_[i].Units->Type[j]->Levels[k]->SetCallback (UnitCB);
if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
Team_[i].Units->Type[j]->Levels[k]->SetFlagBitOn(C_BIT_DRAGABLE);
else
Team_[i].Units->Type[j]->Levels[k]->SetFlagBitOff(C_BIT_DRAGABLE);
if(UnitMask_ & (1 << j))
{
Team_[i].Units->Type[j]->Flags[k]=1;
Team_[i].Units->Type[j]->Levels[k]->SetFlagBitOff(C_BIT_INVISIBLE);
}
else
{
Team_[i].Units->Type[j]->Flags[k]=0;
Team_[i].Units->Type[j]->Levels[k]->SetFlagBitOn(C_BIT_INVISIBLE);
}
}
}
SetUnitLevel(0);
SetTeamFlags(i,GetTeamFlags(i) | _MAP_UNITS_);
}
for(j=0;j<_MAP_NUM_GND_TYPES_;j++)
for(k=0;k<_MAP_NUM_GND_LEVELS_;k++)
DrawWindow_->AddControl(Team_[i].Units->Type[j]->Levels[k]);
}
if(CurIcons_ == NULL)
{
CurIcons_=new C_DrawList;
CurIcons_->Setup(5553000,0);
}
DrawWindow_->AddControl(CurIcons_);
for(i=0;i<_MAX_TEAMS_;i++)
{
if(Team_[i].Waypoints == NULL)
{
Team_[i].Waypoints=new C_Waypoint;
Team_[i].Waypoints->Setup(5551272+i,C_TYPE_DRAGXY);
Team_[i].Waypoints->SetCallback (WaypointCB);
Team_[i].Waypoints->SetFont(Font);
Team_[i].Waypoints->SetFlagBitOn(C_BIT_TOP);
Team_[i].Waypoints->SetCursorID(CRSR_STEERPOINT);
SetTeamFlags(i,GetTeamFlags(i) | _MAP_WAYPOINTS_);
}
DrawWindow_->AddControl(Team_[i].Waypoints);
}
// Current Waypoints (After the other waypoints... so they show up infront... (behind the airplanes though))
if(!CurWP_)
{
CurWP_=new C_Waypoint;
CurWP_->Setup(5555000,C_TYPE_DRAGXY);
CurWP_->SetFlagBitOn(C_BIT_DRAGABLE);
CurWP_->SetCallback (WaypointCB);
CurWP_->SetFont(Font);
CurWP_->SetFlagBitOn(C_BIT_TOP);
CurWP_->SetCursorID(CRSR_STEERPOINT);
}
DrawWindow_->AddControl(CurWP_);
for(i=0;i<_MAX_TEAMS_;i++)
{
if(Team_[i].AirUnits == NULL)
{
Team_[i].AirUnits=new AIR_LIST;
for(j=0;j<_MAP_NUM_AIR_TYPES_;j++)
{
Team_[i].AirUnits->Type[j]=new C_MapIcon;
Team_[i].AirUnits->Type[j]->Setup(5551200+i+j*10,j);
Team_[i].AirUnits->Type[j]->SetFont(Font);
Team_[i].AirUnits->Type[j]->SetTeam(i);
Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_0,AirIconIDs_[i][0][0],AirIconIDs_[i][0][1]);
Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_1,AirIconIDs_[i][1][0],AirIconIDs_[i][1][1]);
Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_2,AirIconIDs_[i][2][0],AirIconIDs_[i][2][1]);
Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_3,AirIconIDs_[i][3][0],AirIconIDs_[i][3][1]);
Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_4,AirIconIDs_[i][4][0],AirIconIDs_[i][4][1]);
Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_5,AirIconIDs_[i][5][0],AirIconIDs_[i][5][1]);
Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_6,AirIconIDs_[i][6][0],AirIconIDs_[i][6][1]);
Team_[i].AirUnits->Type[j]->SetMainImage(C_STATE_7,AirIconIDs_[i][7][0],AirIconIDs_[i][7][1]);
Team_[i].AirUnits->Type[j]->SetFlagBitOn(C_BIT_NOLABEL);
if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
Team_[i].AirUnits->Type[j]->SetFlagBitOn(C_BIT_DRAGABLE);
else
Team_[i].AirUnits->Type[j]->SetFlagBitOff(C_BIT_DRAGABLE);
Team_[i].AirUnits->Type[j]->SetCursorID(CRSR_F16_RM);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -