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

📄 cmap.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					}
					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 + -