radarhandler.h

来自「这是整套横扫千军3D版游戏的源码」· C头文件 代码 · 共 86 行

H
86
字号
#ifndef RADARHANDLER_H
#define RADARHANDLER_H

#include <boost/noncopyable.hpp>

#include "Object.h"
#include "Sim/Units/Unit.h"

#define RADAR_SIZE 8

class CRadarHandler : public boost::noncopyable
{
	CR_DECLARE(CRadarHandler);

public:
	CRadarHandler(bool circularRadar);
	~CRadarHandler();

	void MoveUnit(CUnit* unit);
	void RemoveUnit(CUnit* unit);

	bool InRadar(const float3& pos, int allyteam) {
		const int gx = (int)pos.x / (SQUARE_SIZE * RADAR_SIZE);
		const int gz = (int)pos.z / (SQUARE_SIZE * RADAR_SIZE);
		const int square = max(0, min(ysize - 1, gz)) * xsize +
		                   max(0, min(xsize - 1, gx));
		if (pos.y < -0.5f) {
			return (sonarMaps[allyteam][square] && !commonSonarJammerMap[square]);
		}
		else if (!circularRadar && pos.y > +0.5f) {
			return (airRadarMaps[allyteam][square] && !commonJammerMap[square]);
		}
		else {
			return (radarMaps[allyteam][square] && !commonJammerMap[square]);
		}
	}

	bool InRadar(const CUnit* unit, int allyteam) {
		if(unit->stealth)
			return false;
		int square=max(0,min(ysize-1,(int)unit->pos.z/(SQUARE_SIZE*RADAR_SIZE)))*xsize+max(0,min(xsize-1,(int)unit->pos.x/(SQUARE_SIZE*RADAR_SIZE)));
		if(unit->isUnderWater){
			return (!!sonarMaps[allyteam][square]) && !commonSonarJammerMap[square];
		}
		if(!circularRadar && unit->useAirLos){
			return airRadarMaps[allyteam][square] && !commonJammerMap[square];
		} else {
			return (radarMaps[allyteam][square] || (unit->pos.y<=1 && sonarMaps[allyteam][square])) && !commonJammerMap[square];
		}
	}

	bool InSeismicDistance(const CUnit* unit, int allyteam) {
		int square=max(0,min(ysize-1,(int)unit->pos.z/(SQUARE_SIZE*RADAR_SIZE)))*xsize+max(0,min(xsize-1,(int)unit->pos.x/(SQUARE_SIZE*RADAR_SIZE)));
		return !!seismicMaps[allyteam][square];
	}

	bool circularRadar;

	std::vector<unsigned short> radarMaps[MAX_TEAMS];
	std::vector<unsigned short> airRadarMaps[MAX_TEAMS];
	std::vector<unsigned short> sonarMaps[MAX_TEAMS];
	std::vector<unsigned short> jammerMaps[MAX_TEAMS];
	std::vector<unsigned short> seismicMaps[MAX_TEAMS];
	std::vector<unsigned short> commonJammerMap;
	std::vector<unsigned short> commonSonarJammerMap;
	float radarErrorSize[MAX_TEAMS];
	float baseRadarErrorSize;

	int xsize;
	int ysize;

	float targFacEffect;

protected:
	void AddMapArea(int2 pos, int radius, std::vector<unsigned short>& map, int amount);

	void SafeLosRadarAdd(CUnit* unit);

private:
	void Serialize(creg::ISerializer& s);
};

extern CRadarHandler* radarhandler;

#endif /* RADARHANDLER_H */

⌨️ 快捷键说明

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