Files
mir_server/Gateway/common/gameMap/game_map.h

143 lines
3.0 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#ifndef _GAME_MAP_H_
#define _GAME_MAP_H_
/*************************************************************
* <EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ȡ<EFBFBD>󽫲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>ͼƬ<EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽڱ<EFBFBD>ʾһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ֵΪ1<EFBFBD><EFBFBD>ʱ<EFBFBD>򣬱<EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD>
*
************************************************************/
//<2F><>ǰ<EFBFBD><C7B0>ͼ<EFBFBD><EFBFBD><E6B1BE>
const unsigned int MapFileVersion_Current = 0x0102;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>
const unsigned int MAPFLAG_MOVEABLE = 0x8000;
/*
* <EFBFBD><EFBFBD>ͼ<EFBFBD>ļ<EFBFBD>ͷ<EFBFBD>
*/
#pragma pack(push, 1)
struct MAPFILE_HEADER_NEW
{
char hdr_[5]; //"map"
int ver_;
unsigned char grid_size_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>64<36><34><EFBFBD><EFBFBD>
int pxi_width_; // <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>С
int pix_height_;
int width_; //<2F><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
int height_; //<2F><>ͼ<EFBFBD>߶<EFBFBD>
};
struct MAPFILE_HEADER
{
unsigned int version_; //<2F>ļ<EFBFBD><C4BC>汾0x0101
int width_; //<2F><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
int height_; //<2F><>ͼ<EFBFBD>߶<EFBFBD>
int bg_img_; //<2F><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
unsigned int data_size_; //<2F><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6>ֽڳ<D6BD><DAB3><EFBFBD>
unsigned char reseve_[32];
};
// <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>Ľṹ
struct MAPGrid
{
unsigned short bg_img_; // <20><><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
unsigned short ft_img_; // ǰ<><C7B0>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
unsigned short flag_; // <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־λ
unsigned char obj_root_; // <20>زķ<D8B2><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned char reseve_; // ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
unsigned short effect_id_; // <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>Чid
unsigned short width_; // <20><>Ч<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
unsigned short height_; // <20><>Ч<EFBFBD>ĸ߶<C4B8>
} ;
enum GripFlag
{
gfBlock = 0, //<2F>
gfCanMove = 1, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gfThrough = 2, //͸<><CDB8><EFBFBD><EFBFBD>
gfNofly = 3, //<2F><EFBFBD>Ҳ<EFBFBD><D2B2>ܷ<EFBFBD>Ծ
};
struct MAPGrid_NEW
{
unsigned char flag_; // 0=<3D><EFBFBD><E8B5B5>1=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,2=͸<><CDB8><EFBFBD><EFBFBD>,3=<3D><EFBFBD>Ҳ<EFBFBD><D2B2>ܷ<EFBFBD>Ծ
};
#pragma pack(pop)
class GameMap
{
private:
static BaseAllocator mapAlloc_;
protected:
unsigned int width_; // <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
unsigned int height_; // <20><>ͼ<EFBFBD>߶<EFBFBD>
int* moveable_index_; // ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ŀ<EFBFBD><C4BF>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʡ<EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>ʱûʹ<C3BB>õ<EFBFBD>
int moveable_ount_; // <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
GameMap();
virtual ~GameMap();
/* <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC>ص<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD> */
bool LoadFromStream(stream::BaseStream& stream, bool newver);
/* <20><><EFBFBD>ļ<EFBFBD><C4BC>м<EFBFBD><D0BC>ص<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD> */
bool LoadFromFile(const char* fn, bool newver);
/* <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6>ĵ<EFBFBD>ͼ */
void initDefault(unsigned int w, unsigned int h);
/* <20><>ȡ<EFBFBD><C8A1>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD> */
inline int getWidth()
{
return width_;
}
/* <20><>ȡ<EFBFBD><C8A1>ͼ<EFBFBD>߶<EFBFBD> */
inline int getHeight()
{
return height_;
}
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
inline int getMoveableCount()
{
return moveable_ount_;
}
/* <20><>ȡ<EFBFBD><C8A1>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>Ԫ<EFBFBD><D4AA>Ŀ */
inline int getUnitCount() const
{
return width_ * height_;
}
inline int getPosIndex(unsigned int x, unsigned int y)
{
if (x >= width_ || y >= height_)
return -1;
return y * width_ + x;
}
/* <20>жϵ<D0B6>ͼ<EFBFBD><CDBC>x, y<><79><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>true<75><65>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD> */
inline bool canMove(unsigned int x, unsigned int y)
{
if (x >= width_ || y >= height_)
return false;
return moveable_index_[y * width_ + x] != -1;
}
int getMapPosValue(unsigned int x, unsigned int y)
{
if (x >= width_ || y >= height_)
return -1;
return moveable_index_[y * width_ + x] != -1 ? 0 : -1;
}
};
#endif