📄 cmap.cpp
字号:
}
else
detect->LowRadar=NULL;
}
return(Team_[Obj->GetTeam()].Objectives->Type[TypeID]->AddIconToList(Obj->GetCampID(),static_cast<short>(ObjType),ObjPtr->IconIndex,Obj->YPos(),maxy-Obj->XPos(),FALSE,Buffer,0,0,0,0,0,detect));
}
}
}
return(NULL);
}
MAPICONLIST *C_Map::AddDivision(Division div)
{
UnitClassDataType *UnitPtr;
Unit u;
MAPICONLIST *cur;
GridIndex x,y;
long UnitType,Type;
long totalstr,curstr,perc;
_TCHAR Buffer[40];
u=div->GetFirstUnitElement();
if(u)
{
UnitType=FindDivisionType(div->GetDivisionType()) & 0xffffff;
Type=FindTypeIndex(UnitType & 0x0fff,GND_TypeList,_MAP_NUM_GND_TYPES_);
// Figure out Status
curstr=u->GetTotalVehicles();
totalstr=u->GetFullstrengthVehicles();
if(totalstr < 1) totalstr=1;
perc=(curstr * 100)/totalstr;
if(perc > 100) perc=100;
cur=Team_[u->GetTeam()].Units->Type[Type]->Levels[0]->FindID(UR_DIVISION | div->nid);
if(cur == NULL)
{
div->GetName(Buffer,39,FALSE);
UnitPtr=u->GetUnitClassData();
div->GetLocation(&x,&y);
return(Team_[u->GetTeam()].Units->Type[Type]->Levels[0]->AddIconToList(UR_DIVISION | div->nid,static_cast<short>(Type | _UNIT_DIVISION),UnitPtr->IconIndex,x*FEET_PER_KM,maxy-y*FEET_PER_KM,FALSE,Buffer,div->nid,0,0,(long)perc,0));
}
}
return(NULL);
}
MAPICONLIST *C_Map::AddUnit(Unit u)
{
long UnitType,TypeID,LevelID = -1,brigid,batid,numarcs;//!
Unit upar;
UnitClassDataType *UnitPtr;
float totalstr,curstr,perc;
DETECTOR *detect;
float sam_short;
float sam_long;
float radar_short;
float radar_long;
_TCHAR Buffer[60];
UnitType=FindUnitType(u);
TypeID=-1;
// Figure out Status
curstr=(float)u->GetTotalVehicles();
totalstr=(float)u->GetFullstrengthVehicles();
if(totalstr < 1) totalstr=1;
perc=(curstr/totalstr) * 100.0f;
if(perc > 100.0f) perc=100.0f;
if(UnitType & _UNIT_GROUND_MASK)
{
TypeID=FindTypeIndex(UnitType & 0x0fff,GND_TypeList,_MAP_NUM_GND_TYPES_);
if(TypeID != -1)
LevelID=FindTypeIndex(UnitType & _UNIT_GROUND_MASK,GND_LevelList,_MAP_NUM_GND_LEVELS_);
else
LevelID = -1;
}
else if(UnitType & _UNIT_NAVAL_MASK)
{
TypeID=FindTypeIndex(UnitType & 0x0fff,NAV_TypeList,_MAP_NUM_NAV_TYPES_);
LevelID=1;
}
if(TypeID != -1 && LevelID != -1)
{
UnitPtr=u->GetUnitClassData();
if(UnitPtr)
{
if(UnitType & _UNIT_GROUND_MASK)
{
if(LevelID == 1)
{
brigid=u->GetUnitNameID();
batid=0;
}
else if(LevelID == 2)
{
upar=u->GetUnitParent();
if(upar)
brigid=upar->GetUnitNameID();
else
brigid=0;
batid=u->GetUnitNameID();
}
else
{
brigid=0;
batid=0;
}
detect=NULL;
if(u->IsBattalion())
{
radar_short=static_cast<float>(u->GetElectronicDetectionRange(LowAir));
radar_long=static_cast<float>(u->GetElectronicDetectionRange(Air));
sam_short=static_cast<float>(u->GetAproxWeaponRange(LowAir));
sam_long=static_cast<float>(u->GetAproxWeaponRange(Air));
if(radar_short || radar_long || sam_short || sam_long)
{
#ifdef USE_SH_POOLS
detect = (DETECTOR *)MemAllocPtr(UI_Pools[UI_GENERAL_POOL],sizeof(DETECTOR),FALSE);
#else
detect=new DETECTOR;
#endif
detect->HighSam=sam_long * KM_TO_FT;
detect->HighRadar=radar_long * KM_TO_FT;
detect->LowSam=sam_short * KM_TO_FT;
if(radar_short)
{
numarcs=u->GetNumberOfArcs();
numarcs=1; // TEMP kludge
#ifdef USE_SH_POOLS
detect->LowRadar = (ARC_LIST *)MemAllocPtr(UI_Pools[UI_GENERAL_POOL],sizeof(ARC_LIST),FALSE);
#else
detect->LowRadar=new ARC_LIST;
#endif
detect->LowRadar->numarcs=static_cast<short>(numarcs);
#ifdef USE_SH_POOLS
detect->LowRadar->arcs = (ARC_REC *)MemAllocPtr(UI_Pools[UI_GENERAL_POOL],sizeof(ARC_REC)*numarcs,FALSE);
#else
detect->LowRadar->arcs=new ARC_REC[numarcs];
#endif
// after getting rid of kludges...
// figure out how to do arcs right
// kludge
detect->LowRadar->arcs[0].arc=0;
detect->LowRadar->arcs[0].range=radar_short;
}
else
detect->LowRadar=NULL;
}
}
u->GetName(Buffer,49,FALSE);
return(Team_[u->GetTeam()].Units->Type[TypeID]->Levels[LevelID]->AddIconToList(u->GetCampID(),static_cast<short>(UnitType),UnitPtr->IconIndex,u->YPos(),static_cast<short>(maxy-u->XPos()),static_cast<short>(gMoveBattalion),Buffer,u->GetUnitDivision(),brigid,batid,(long)perc,0,detect));
}
else if(UnitType & _UNIT_NAVAL_MASK)
{
u->GetName(Buffer,49,FALSE);
return(Team_[u->GetTeam()].NavalUnits->Type[TypeID]->AddIconToList(u->GetCampID(),static_cast<short>(UnitType),UnitPtr->IconIndex,u->YPos(),static_cast<short>(maxy-u->XPos()),static_cast<short>(gMoveBattalion),Buffer,(long)perc,0));
}
}
}
return(NULL);
}
MAPICONLIST *C_Map::AddFlight(Flight flight)
{
long idx;
long TypeID;
UnitClassDataType *UnitPtr;
_TCHAR Buffer[40];
UnitPtr=flight->GetUnitClassData();
if(UnitPtr)
{
idx=GetAirIcon(flight->GetSType());
TypeID=FindTypeIndex(AirIcons[idx].UIType,AIR_TypeList,_MAP_NUM_AIR_TYPES_);
if(TypeID != -1)
{
if(UnitPtr->IconIndex)
{
GetCallsign(flight,Buffer);
return(Team_[flight->GetTeam()].AirUnits->Type[TypeID]->AddIconToList(flight->GetCampID(),static_cast<short>(AirIcons[idx].UIType),UnitPtr->IconIndex,flight->YPos(),static_cast<short>(maxy-flight->XPos()),static_cast<short>(gMoveBattalion),Buffer,0,((Flight)flight)->GetLastDirection()&0x7));
}
}
}
return(NULL);
}
MAPICONLIST *C_Map::AddSquadron(Squadron squadron)
{
long UnitType,TypeID;
UnitClassDataType *UnitPtr;
_TCHAR Buffer[40];
UnitType=GetObjectiveType(squadron);
TypeID=FindTypeIndex(UnitType,OBJ_TypeList,_MAP_NUM_OBJ_TYPES_);
if(TypeID != -1)
{
if(UnitType)
{
UnitPtr=squadron->GetUnitClassData();
if(UnitPtr)
{
squadron->GetName(Buffer,39,FALSE);
return(Team_[squadron->GetTeam()].Objectives->Type[TypeID]->AddIconToList(squadron->GetCampID(),static_cast<short>(UnitType),10117,squadron->YPos(),maxy-squadron->XPos(),FALSE,Buffer,0,0,0,0,0,NULL));
}
}
}
return(NULL);
}
MAPICONLIST *C_Map::AddPackage(Package package)
{
long UnitType,TypeID;
_TCHAR Buffer[32];
UnitType=GetObjectiveType(package);
TypeID=FindTypeIndex(UnitType,OBJ_TypeList,_MAP_NUM_OBJ_TYPES_);
if(TypeID != -1)
{
if(UnitType)
{
_stprintf(Buffer,"%s %1ld",gStringMgr->GetString(TXT_PACKAGE),package->GetCampID());
return(Team_[package->GetTeam()].Objectives->Type[TypeID]->AddIconToList(package->GetCampID(),static_cast<short>(UnitType),10118,package->YPos(),maxy-package->XPos(),FALSE,Buffer,0,0,0,0,0,NULL));
}
}
return(NULL);
}
MAPICONLIST *C_Map::AddVC(victory_condition *vc)
{
long TypeID;
_TCHAR Buffer[32];
CampEntity ent;
ent=(CampEntity)vuDatabase->Find(vc->get_vu_id());
if(ent)
{
if(!ent->IsUnit() && !ent->IsObjective())
return(NULL);
}
else
return(NULL);
TypeID=FindTypeIndex(_VC_CONDITION_,OBJ_TypeList,_MAP_NUM_OBJ_TYPES_);
if(TypeID != -1)
{
_stprintf(Buffer,"%s %1ld",gStringMgr->GetString(TXT_VC),vc->get_number());
return(Team_[vc->get_team()].Objectives->Type[TypeID]->AddIconToList(vc->get_number(),_VC_CONDITION_,10119,ent->YPos(),maxy-ent->XPos(),FALSE,Buffer,0,0,0,0,0,NULL));
}
return(NULL);
}
void C_Map::UpdateVC(victory_condition *vc)
{
long TypeID;
CampEntity ent;
MAPICONLIST *vcicon;
ent=(CampEntity)vuDatabase->Find(vc->get_vu_id());
if(ent)
{
if(!ent->IsUnit() && !ent->IsObjective())
ent=NULL;
}
TypeID=FindTypeIndex(_VC_CONDITION_,OBJ_TypeList,_MAP_NUM_OBJ_TYPES_);
if(TypeID != -1)
{
vcicon=Team_[vc->get_team()].Objectives->Type[TypeID]->FindID(vc->get_number());
if(!ent)
{
Team_[vc->get_team()].Objectives->Type[TypeID]->RemoveIcon(vc->get_number());
}
else if (vcicon)
{
vcicon->worldx=ent->YPos();
vcicon->worldy=maxy-ent->XPos();
vcicon->x=static_cast<short>(vcicon->worldx*scale_);
vcicon->y=static_cast<short>(vcicon->worldy*scale_);
}
}
}
void C_Map::RemoveVC(long team,long ID)
{
long TypeID;
F4CSECTIONHANDLE *Leave;
TypeID=FindTypeIndex(_VC_CONDITION_,OBJ_TypeList,_MAP_NUM_OBJ_TYPES_);
if(TypeID != -1)
{
Leave=UI_Enter(DrawWindow_);
Team_[team].Objectives->Type[TypeID]->RemoveIcon(ID);
UI_Leave(Leave);
}
}
void C_Map::BuildCurrentWPList(Unit unit)
{
WayPoint wp=NULL,prevwp=NULL,firstwp=NULL;
float x,y,z,tempx,tempy,tempz;
long normID,selID,othrID;
long i,numwp,xval;
long starttime,endtime;
long campID;
long UseFlag,ZDrag;
double distance;
float lx,ly,lz,dx,dy,dz;
WAYPOINTLIST *wpl=NULL;
CampEntity target;
short state;
_TCHAR buf[40];
VU_ID *tmpID=NULL;
UI_Refresher *gpsItem=NULL;
short airwps,lastwp;
if(unit == NULL) return;
if(unit->IsFlight() && !unit->Final()) return;
if(!CurWP_ || !CurWPZ_)
return;
airwps=static_cast<short>(unit->IsFlight());
if (!airwps)
{
firstwp=unit->GetCurrentUnitWP();
if (firstwp && firstwp->GetPrevWP())
firstwp = firstwp->GetPrevWP();
}
if (!firstwp || airwps)
firstwp=unit->GetFirstUnitWP();
if (!firstwp) return;
wp = firstwp;
starttime=wp->GetWPDepartureTime();
endtime=wp->GetWPDepartureTime();//so endtime has a value if it doesn't get otherwise initialized
campID=unit->GetCampID() << 8;
// set to 0 after Landing WP so we don't connect lines to following waypoints which are not on the agenda (Alt Land cit,Tanker etc)
UseFlag=C_BIT_USELINE;
prevwp=NULL;
numwp=0;
while(wp)
{
numwp++;
wp=wp->GetNextWP();
}
if(airwps)
{
CurWP_->SetMenu(STEERPOINT_POP);
CurWPZ_->SetMenu(STEERPOINT_POP);
}
else
{
CurWP_->SetMenu(0);
CurWPZ_->SetMenu(0);
}
CurIcons_->Cleanup();
CurIcons_->Setup(CurIcons_->GetID(),0);
if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
{
CurWP_->SetFlagBitOn(C_BIT_DRAGABLE);
CurWPZ_->SetFlagBitOn(C_BIT_DRAGABLE);
}
else
{
if(firstwp == unit->GetCurrentUnitWP() || !airwps)
{
CurWP_->SetFlagBitOn(C_BIT_DRAGABLE);
CurWPZ_->SetFlagBitOn(C_BIT_DRAGABLE);
}
else
{
CurWP_->SetFlagBitOff(C_BIT_DRAGABLE);
CurWPZ_->SetFlagBitOff(C_BIT_DRAGABLE);
}
}
i=1;
wp=firstwp;
while(wp)
{
wp->GetLocation(&x,&y,&z);
if(x < CurWPArea_.left || CurWPArea_.left < 0)
CurWPArea_.left=static_cast<long>(x);
if(x > CurWPArea_.right || CurWPArea_.right < 0)
CurWPArea_.right=static_cast<long>(x);
if(y < CurWPArea_.top || CurWPArea_.top < 0)
CurWPArea_.top=static_cast<long>(y);
if(y > CurWPArea_.bottom || CurWPArea_.bottom < 0)
CurWPArea_.bottom=static_cast<long>(y);
if(wp->GetWPFlags() & WPF_TARGET)
{
// Set 2d Waypoint
wpl=CurWP_->AddWaypointToList(0x20000000+campID+i,0,ASSIGNED_TGT_CUR,ASSIGNED_TGT_CUR,ASSIGNED_TGT_CUR,y,maxy-x,FALSE);
if(wpl)
{
CurWP_->SetWPGroup(campID+i,campID+i);
CurWP_->SetState(campID+i,0);
wpl->Flags &= ~C_BIT_ENABLED;
}
}
else if ((wp->GetWPAction () == WP_TAKEOFF) || (wp->GetWPAction () == WP_LAND))
{
// Set 2d Waypoint
wpl=CurWP_->AddWaypointToList(0x20000000+campID+i,0,HOME_BASE_CUR,HOME_BASE_CUR,HOME_BASE_CUR,y,maxy-x,FALSE);
if(wpl)
{
CurWP_->SetWPGroup(campID+i,campID+i);
CurWP_->SetState(campID+i,0);
wpl->Flags &= ~C_BIT_ENABLED;
}
}
target=wp->GetWPTarget();
if(target)
{ // use GPS to make visible
gpsItem=(UI_Refresher*)gGps->Find(target->GetCampID());
if(gpsItem && gpsItem->MapItem_)
CurIcons_->Add(gpsItem->MapItem_);
}
i++;
wp=wp->GetNextWP();
}
distance=0.0f;
wp=firstwp;
wp->GetLocation(&lx,&ly,&lz);
i=1;
lastwp=0;
while(wp)
{
if(!wp->GetNextWP())
lastwp=1;
if(wp->GetWPFlags() & WPF_TARGET)
{
normID=TGT_CUR;
selID=TGT_CUR_SEL;
othrID=TGT_CUR_ERROR;
}
else if(wp->GetWPFlags() & WPF_IP)
{
normID=IP_CUR;
selID=IP_CUR_SEL;
othrID=IP_CUR_ERROR;
}
else
{
normID=STPT_CUR;
selID=STPT_CUR_SEL;
othrID=STPT_CUR_ERROR;
}
if (unit->IsFlight() && !IsValidWP(wp,(Flight)unit))
state=2;
else if (wp == unit->GetCurrentUnitWP())
state=1;
else
state=0;
wp->GetLocation(&x,&y,&z); // Note: for Sim -> UI (UI's) X = (Sim's) Y, (UI's Y) = (Sim's) [max y] - X (UI's) Z = (Sim's) -Z
// Add Nub to insert a waypoint
if(UseFlag && prevwp && airwps)
{
prevwp->GetLocation(&tempx,&tempy,&tempz); // Note: for Sim -> UI (UI's) X = (Sim's) Y, (UI's Y) = (Sim's) [max y] - X (UI's) Z = (Sim's) -Z
dx=x-tempx;
dy=y-tempy;
_stprintf(buf,"%1.1f",sqrt(dx*dx + dy*dy) * FT_TO_NM);
Uni_Float(buf);
dx*=.5;
dy*=.5;
wpl=CurWP_->AddWaypointToList(0x40000000+campID+i,0,ADDLINE_CUR,ADDLINE_CUR_SEL,ADDLINE_CUR,tempy+dy,maxy-(tempx+dx),TRUE);
if(wpl)
{
CurWP_->SetWPGroup(0x40000000+campID+i,campID);
CurWP_->SetUserNumber(C_STATE_0, static_cast<long>(maxy));
CurWP_->SetLabel(0x40000000+campID+i,gStringMgr->GetText(gStringMgr->AddText(buf)));
CurWP_->SetTextOffset(0x40000000+campID+i,0,-15);
CurWP_->SetState(0x40000000+campID+i,state);
CurWP_->SetLabelColor(0x40000000+campID+i,0x00ffffff,0x0000ffff,0x000000ff);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -