Fixed some typos, updated areaflags enum

This commit is contained in:
tomrus88 2008-12-04 22:56:06 +03:00
parent 99db25c9eb
commit a69bc59f1d
4 changed files with 79 additions and 72 deletions

Binary file not shown.

View file

@ -15,7 +15,6 @@
#include "adt.h" #include "adt.h"
#include "mpq_libmpq.h" #include "mpq_libmpq.h"
//#include <windows.h>
unsigned int iRes=256; unsigned int iRes=256;
extern uint16 *areas; extern uint16 *areas;
@ -64,7 +63,7 @@ bool LoadADT(char* filename)
//if(fourcc==0x4d564552) // MVER //if(fourcc==0x4d564552) // MVER
if(fourcc==0x4d43494e) // MCIN if(fourcc==0x4d43494e) // MCIN
{ {
for (int i=0; i<256; i++) for (int i=0; i<256; ++i)
{ {
mf.read(&mcnk_offsets[i],4); mf.read(&mcnk_offsets[i],4);
mf.read(&mcnk_sizes[i],4); mf.read(&mcnk_sizes[i],4);
@ -86,40 +85,41 @@ bool LoadADT(char* filename)
uint32 header_pos = 0; uint32 header_pos = 0;
LiqOffsData = new MH2O_offsData; LiqOffsData = new MH2O_offsData;
LiqChunkData1 = new MH2O_Data1; LiqChunkData1 = new MH2O_Data1;
ChunkLiqHeght = new float[81]; ChunkLiqHeight = new float[81];
for(;chunk_num < 256; chunk_num++) for(;chunk_num < 256; ++chunk_num)
{ {
mf.read(LiqOffsData,12); mf.read(LiqOffsData,12);
header_pos = mf.getPos(); header_pos = mf.getPos();
if(LiqOffsData->offsData1 !=0) // åñëè äàííûå â Data1 î âîäå åñòü, òî èõ íàäî êîíâåðòèðîâàòü if(LiqOffsData->offsData1 !=0) // åñëè äàííûå â Data1 î âîäå åñòü, òî èõ íàäî êîíâåðòèðîâàòü
{ {
mf.seek(base_pos + LiqOffsData->offsData1);// ïåðåõîäèì ïî ñìåùåíèþ èç offsData1 ÎÒ ÍÀ×ÀËÀ êóñêà // ïåðåõîäèì ïî ñìåùåíèþ èç offsData1 ÎÒ ÍÀ×ÀËÀ êóñêà
mf.seek(base_pos + LiqOffsData->offsData1);
mf.read(LiqChunkData1,24); // ñ÷èòûâàåì ñàìè äàííûå â ñòðóêòóðó òèïà MH2O_Data1 mf.read(LiqChunkData1,24); // ñ÷èòûâàåì ñàìè äàííûå â ñòðóêòóðó òèïà MH2O_Data1
// çàíîñèì äàííûå ôëàãà äëÿ êóñêà // çàíîñèì äàííûå ôëàãà äëÿ êóñêà
if(LiqChunkData1->flags & 4 || LiqChunkData1->flags & 8) if(LiqChunkData1->flags & 4 || LiqChunkData1->flags & 8)
MapLiqFlag[chunk_num] |=1; MapLiqFlag[chunk_num] |= 1;
if(LiqChunkData1->flags & 16) if(LiqChunkData1->flags & 16)
MapLiqFlag[chunk_num] |=2; MapLiqFlag[chunk_num] |= 2;
// ïðåäâàðèòåëüíî çàïîëíÿåì âåñü êóñîê äàííûìè - íåò âîäû // ïðåäâàðèòåëüíî çàïîëíÿåì âåñü êóñîê äàííûìè - íåò âîäû
for(int j=0;j<81;j++) for(int j=0;j<81;++j)
{ {
ChunkLiqHeght[j] = -999999; // no liquid/water ChunkLiqHeight[j] = -999999; // no liquid/water
} }
// òåïåðü âû÷èñëÿåì òå ÷òî ñ âîäîé è ïåðåçàïèñûâàåì èõ â êóñêå // òåïåðü âû÷èñëÿåì òå ÷òî ñ âîäîé è ïåðåçàïèñûâàåì èõ â êóñêå
for(int b=0; b <= LiqChunkData1->height; b++) for(int b=0; b <= LiqChunkData1->height; ++b)
{ {
for(int c=LiqChunkData1->xOffset; c <= (LiqChunkData1->xOffset+LiqChunkData1->width); c++) for(int c=LiqChunkData1->xOffset; c <= (LiqChunkData1->xOffset+LiqChunkData1->width); ++c)
{ {
int n = (9*(LiqChunkData1->yOffset + b))+c; int n = (9*(LiqChunkData1->yOffset + b))+c;
ChunkLiqHeght[n] = LiqChunkData1->heightLevel1; ChunkLiqHeight[n] = LiqChunkData1->heightLevel1;
} }
} }
mf.seek(header_pos); // è íå çàáûòü âåðíóòüñÿ íà èñõîäíóþ ïîçèöèþ èìåííî Â ÕÈÄÅÐÅ mf.seek(header_pos); // è íå çàáûòü âåðíóòüñÿ íà èñõîäíóþ ïîçèöèþ èìåííî Â ÕÈÄÅÐÅ
} }
else // åñëè äàííûõ â Data1 íåò, òî íàäî çàïîëíèòü âåñü êóñîê, íî äàííûìè - íåò âîäû else // åñëè äàííûõ â Data1 íåò, òî íàäî çàïîëíèòü âåñü êóñîê, íî äàííûìè - íåò âîäû
{ {
for(int j=0; j<81; j++) for(int j=0; j<81; ++j)
ChunkLiqHeght[j] = -999999; // no liquid/water ChunkLiqHeight[j] = -999999; // no liquid/water
} }
if(!(chunk_num%16)) if(!(chunk_num%16))
m = 1024*(chunk_num/16); // ñìåùåíèå ïî ðÿäàì êóñêîâ ñ ïåðåêðûòèåì = 1024 m = 1024*(chunk_num/16); // ñìåùåíèå ïî ðÿäàì êóñêîâ ñ ïåðåêðûòèåì = 1024
@ -128,17 +128,17 @@ bool LoadADT(char* filename)
// ýòî àíàëîã ñòàðîãî îáðåçàíèÿ ãðàíè÷íûõ ïðàâûõ-áîêîâûõ è íèæíèõ äàííûõ // ýòî àíàëîã ñòàðîãî îáðåçàíèÿ ãðàíè÷íûõ ïðàâûõ-áîêîâûõ è íèæíèõ äàííûõ
for(int p=0;p<72;p+=9) // íèæíèå 8 íå çàíîñèì òê îíè äóáëèðóåòñÿ ñëåä êóñêîì for(int p=0;p<72;p+=9) // íèæíèå 8 íå çàíîñèì òê îíè äóáëèðóåòñÿ ñëåä êóñêîì
{ {
for(int s=0; s<8; s++) // 9 çíà÷åíèå â ñòðîêå íå çàíîñèì òê îíî äóáëèðóåòñÿ ñëåä êóñêîì, à â ïðàâûõ-áîêîâûõ îáðåçàåòñÿ äëÿ 128õ128 for(int s=0; s<8; ++s) // 9 çíà÷åíèå â ñòðîêå íå çàíîñèì òê îíî äóáëèðóåòñÿ ñëåä êóñêîì, à â ïðàâûõ-áîêîâûõ îáðåçàåòñÿ äëÿ 128õ128
{ {
MapLiqHeight[k] = ChunkLiqHeght[p+s];// :) MapLiqHeight[k] = ChunkLiqHeight[p+s];
k++; ++k;
} }
k=k+120; k=k+120;
} }
} }
delete LiqOffsData; delete LiqOffsData;
delete LiqChunkData1; delete LiqChunkData1;
delete []ChunkLiqHeght; delete []ChunkLiqHeight;
} }
//case 0x4d434e4b: // MCNK //case 0x4d434e4b: // MCNK
@ -149,13 +149,13 @@ bool LoadADT(char* filename)
//printf("Loading chunks info\n"); //printf("Loading chunks info\n");
// read individual map chunks // read individual map chunks
for (int j=0; j<16; j++) for (int j=0; j<16; ++j)
{ {
for (int i=0; i<16; i++) for (int i=0; i<16; ++i)
{ {
mf.seek((int)mcnk_offsets[j*16+i]); mf.seek((int)mcnk_offsets[j*16+i]);
LoadMapChunk(mf,&(mcells->ch[i][j])); LoadMapChunk(mf,&(mcells->ch[i][j]));
chunk_num++; ++chunk_num;
} }
} }
mf.close(); mf.close();
@ -171,8 +171,7 @@ bool isHole(int holes, int i, int j)
return (holes & holetab_h[testi] & holetab_v[testj])!=0; return (holes & holetab_h[testi] & holetab_v[testj])!=0;
} }
inline inline void LoadMapChunk(MPQFile & mf, chunk*_chunk)
void LoadMapChunk(MPQFile & mf, chunk*_chunk)
{ {
float h; float h;
uint32 fourcc; uint32 fourcc;
@ -196,8 +195,7 @@ void LoadMapChunk(MPQFile & mf, chunk*_chunk)
int chunkflags = header.flags; int chunkflags = header.flags;
float zmin=999999999.0f; float zmin=999999999.0f;
float zmax=-999999999.0f; float zmax=-999999999.0f;
//must be there, bl!zz uses some crazy format // must be there, bl!zz uses some crazy format
//int nTextures;
while (mf.getPos() < lastpos) while (mf.getPos() < lastpos)
{ {
mf.read(&fourcc,4); mf.read(&fourcc,4);
@ -205,8 +203,8 @@ void LoadMapChunk(MPQFile & mf, chunk*_chunk)
size_t nextpos = mf.getPos() + size; size_t nextpos = mf.getPos() + size;
if(fourcc==0x4d435654) // MCVT if(fourcc==0x4d435654) // MCVT
{ {
for (int j=0; j<17; j++) for (int j=0; j<17; ++j)
for (int i=0; i<((j%2)?8:9); i++) for (int i=0; i<((j%2)?8:9); ++i)
{ {
mf.read(&h,4); mf.read(&h,4);
float z=h+ybase; float z=h+ybase;
@ -236,32 +234,31 @@ void LoadMapChunk(MPQFile & mf, chunk*_chunk)
else if(fourcc==0x4d434c51 && !MH2O_presence) // íå áóäåì ó÷èòûâàòü åñëè óæå áûëè äàííûå â MH2O, ïåðåñòðàõîâêà :) // MCLQ else if(fourcc==0x4d434c51 && !MH2O_presence) // íå áóäåì ó÷èòûâàòü åñëè óæå áûëè äàííûå â MH2O, ïåðåñòðàõîâêà :) // MCLQ
{ {
// liquid / water level // liquid / water level
//bool haswater;
char fcc1[5]; char fcc1[5];
mf.read(fcc1,4); mf.read(fcc1,4);
flipcc(fcc1); flipcc(fcc1);
fcc1[4]=0; fcc1[4]=0;
ChunkLiqHeght = new float[81]; ChunkLiqHeight = new float[81];
if (!strcmp(fcc1,"MCSE")) if (!strcmp(fcc1,"MCSE"))
{ {
for(int j=0;j<81;j++) for(int j=0;j<81;++j)
{ {
ChunkLiqHeght[j] = -999999; // no liquid/water ChunkLiqHeight[j] = -999999; // no liquid/water
} }
} }
else else
{ {
float maxheight; float maxheight;
mf.read(&maxheight, 4); mf.read(&maxheight, 4);
for(int j=0;j<81;j++) for(int j=0;j<81;++j)
{ {
mf.read(&h, 4); mf.read(&h, 4);
mf.read(&h, 4); mf.read(&h, 4);
if(h > maxheight) if(h > maxheight)
ChunkLiqHeght[j] = -999999; ChunkLiqHeight[j] = -999999;
else else
ChunkLiqHeght[j] = h; ChunkLiqHeight[j] = h;
} }
if(chunkflags & 4 || chunkflags & 8) if(chunkflags & 4 || chunkflags & 8)
@ -276,14 +273,14 @@ void LoadMapChunk(MPQFile & mf, chunk*_chunk)
for(int p=0;p<72;p+=9) for(int p=0;p<72;p+=9)
{ {
for(int s=0; s<8; s++) for(int s=0; s<8; ++s)
{ {
MapLiqHeight[k] = ChunkLiqHeght[p+s]; // :) MapLiqHeight[k] = ChunkLiqHeight[p+s];
k++; ++k;
} }
k=k+120; k=k+120;
} }
delete []ChunkLiqHeght; delete []ChunkLiqHeight;
break; break;
} }
mf.seek(nextpos); mf.seek(nextpos);
@ -296,19 +293,18 @@ double solve (vec *v,vec *p)
double b = v[0].z *(v[1].x - v[2].x) + v[1].z *(v[2].x - v[0].x) + v[2].z *(v[0].x - v[1].x); double b = v[0].z *(v[1].x - v[2].x) + v[1].z *(v[2].x - v[0].x) + v[2].z *(v[0].x - v[1].x);
double c = v[0].x *(v[1].y - v[2].y) + v[1].x *(v[2].y - v[0].y) + v[2].x *(v[0].y - v[1].y); double c = v[0].x *(v[1].y - v[2].y) + v[1].x *(v[2].y - v[0].y) + v[2].x *(v[0].y - v[1].y);
double d = v[0].x *(v[1].y*v[2].z - v[2].y*v[1].z) + v[1].x* (v[2].y*v[0].z - v[0].y*v[2].z) + v[2].x* (v[0].y*v[1].z - v[1].y*v[0].z); double d = v[0].x *(v[1].y*v[2].z - v[2].y*v[1].z) + v[1].x* (v[2].y*v[0].z - v[0].y*v[2].z) + v[2].x* (v[0].y*v[1].z - v[1].y*v[0].z);
//-d // -d
//plane equation ax+by+cz+d=0 // plane equation ax+by+cz+d=0
return ((a*p->x+c*p->z-d)/b); return ((a*p->x+c*p->z-d)/b);
} }
inline inline double GetZ(double x, double z)
double GetZ(double x,double z)
{ {
vec v[3]; vec v[3];
vec p; vec p;
{ {
//find out quadrant // find out quadrant
int xc=(int)(x/UNITSIZE); int xc=(int)(x/UNITSIZE);
int zc=(int)(z/UNITSIZE); int zc=(int)(z/UNITSIZE);
if(xc>127)xc=127; if(xc>127)xc=127;
@ -353,27 +349,26 @@ double GetZ(double x,double z)
} }
} }
inline inline void TransformData()
void TransformData()
{ {
cell= new Cell; cell= new Cell;
for(int x=0;x<128;x++) for(int x=0;x<128;++x)
{ {
for(int y=0;y<128;y++) for(int y=0;y<128;++y)
{ {
cell->v8[x][y] = (float)mcells->ch[x/8][y/8].v8[x%8][y%8]; cell->v8[x][y] = (float)mcells->ch[x/8][y/8].v8[x%8][y%8];
cell->v9[x][y] = (float)mcells->ch[x/8][y/8].v9[x%8][y%8]; cell->v9[x][y] = (float)mcells->ch[x/8][y/8].v9[x%8][y%8];
} }
//extra 1 point on bounds // extra 1 point on bounds
cell->v9[x][128] = (float)mcells->ch[x/8][15].v9[x%8][8]; cell->v9[x][128] = (float)mcells->ch[x/8][15].v9[x%8][8];
//x==y // x==y
cell->v9[128][x] = (float)mcells->ch[15][x/8].v9[8][x%8]; cell->v9[128][x] = (float)mcells->ch[15][x/8].v9[8][x%8];
} }
//and the last 1 // and the last 1
cell->v9[128][128] = (float)mcells->ch[15][15].v9[8][8]; cell->v9[128][128] = (float)mcells->ch[15][15].v9[8][8];
delete mcells; delete mcells;
@ -385,8 +380,10 @@ bool ConvertADT(char * filename,char * filename2)
{ {
MapLiqHeight = new float[16384]; MapLiqHeight = new float[16384];
MapLiqFlag = new char[256]; MapLiqFlag = new char[256];
for(int j=0; j<256; j++) for(int j = 0; j < 256; ++j)
MapLiqFlag[j] = 0; MapLiqFlag[j] = 0;
for(int j = 0; j < 16384; ++j)
MapLiqHeight[j] = -999999;
if(!LoadADT(filename)) if(!LoadADT(filename))
{ {
@ -407,9 +404,9 @@ bool ConvertADT(char * filename,char * filename2)
// write magic header // write magic header
fwrite(MAP_MAGIC,1,8,output); fwrite(MAP_MAGIC,1,8,output);
for(unsigned int x=0;x<16;x++) for(unsigned int x=0;x<16;++x)
{ {
for(unsigned int y=0;y<16;y++) for(unsigned int y=0;y<16;++y)
{ {
if(mcells->ch[y][x].area_id && mcells->ch[y][x].area_id <= maxAreaId) if(mcells->ch[y][x].area_id && mcells->ch[y][x].area_id <= maxAreaId)
{ {
@ -426,16 +423,17 @@ bool ConvertADT(char * filename,char * filename2)
} }
} }
fwrite(MapLiqFlag,1,256,output); //!!!!!!!! fwrite(MapLiqFlag,1,256,output);
delete [] MapLiqFlag; delete [] MapLiqFlag;
fwrite(MapLiqHeight,sizeof(float),16384,output); //!!!!!!!! fwrite(MapLiqHeight,sizeof(float),16384,output);
delete [] MapLiqHeight; delete [] MapLiqHeight;
TransformData(); TransformData();
for(unsigned int x=0;x<iRes;x++) for(unsigned int x=0;x<iRes;++x)
for(unsigned int y=0;y<iRes;y++) {
for(unsigned int y=0;y<iRes;++y)
{ {
float z=(float)GetZ( float z=(float)GetZ(
(((double)(y))*TILESIZE)/((double)(iRes-1)), (((double)(y))*TILESIZE)/((double)(iRes-1)),
@ -443,6 +441,7 @@ bool ConvertADT(char * filename,char * filename2)
fwrite(&z,1,sizeof(z),output); fwrite(&z,1,sizeof(z),output);
} }
}
fclose(output); fclose(output);
delete cell; delete cell;

View file

@ -105,7 +105,7 @@ class MPQFile;
bool MH2O_presence; bool MH2O_presence;
MH2O_offsData *LiqOffsData; MH2O_offsData *LiqOffsData;
MH2O_Data1 *LiqChunkData1; MH2O_Data1 *LiqChunkData1;
float *ChunkLiqHeght, *MapLiqHeight; float *ChunkLiqHeight, *MapLiqHeight;
char* MapLiqFlag; char* MapLiqFlag;
uint32 k, m, chunk_num; uint32 k, m, chunk_num;
void LoadMapChunk(MPQFile &, chunk*); void LoadMapChunk(MPQFile &, chunk*);

View file

@ -176,25 +176,33 @@ enum AchievementCriteriaTypes
enum AreaFlags enum AreaFlags
{ {
AREA_FLAG_SNOW = 0x00000001, // snow (only Dun Morogh, Naxxramas, Razorfen Downs and Winterspring) AREA_FLAG_SNOW = 0x00000001, // snow (only Dun Morogh, Naxxramas, Razorfen Downs and Winterspring)
AREA_FLAG_UNK1 = 0x00000002, // unknown, (only Naxxramas and Razorfen Downs) AREA_FLAG_UNK1 = 0x00000002, // may be necropolis?
AREA_FLAG_UNK2 = 0x00000004, // Only used on development map AREA_FLAG_UNK2 = 0x00000004, // Only used for areas on map 571 (development before)
AREA_FLAG_SLAVE_CAPITAL = 0x00000008, // slave capital city flag? AREA_FLAG_SLAVE_CAPITAL = 0x00000008, // city and city subsones
AREA_FLAG_UNK3 = 0x00000010, // unknown AREA_FLAG_UNK3 = 0x00000010, // can't find common meaning
AREA_FLAG_SLAVE_CAPITAL2 = 0x00000020, // slave capital city flag? AREA_FLAG_SLAVE_CAPITAL2 = 0x00000020, // slave capital city flag?
AREA_FLAG_UNK4 = 0x00000040, // many zones have this flag AREA_FLAG_UNK4 = 0x00000040, // many zones have this flag
AREA_FLAG_ARENA = 0x00000080, // arena, both instanced and world arenas AREA_FLAG_ARENA = 0x00000080, // arena, both instanced and world arenas
AREA_FLAG_CAPITAL = 0x00000100, // main capital city flag AREA_FLAG_CAPITAL = 0x00000100, // main capital city flag
AREA_FLAG_CITY = 0x00000200, // only for one zone named "City" (where it located?) AREA_FLAG_CITY = 0x00000200, // only for one zone named "City" (where it located?)
AREA_FLAG_OUTLAND = 0x00000400, // outland zones? (only Eye of the Storm not have this flag, but have 0x00004000 flag) AREA_FLAG_OUTLAND = 0x00000400, // expansion zones? (only Eye of the Storm not have this flag, but have 0x00004000 flag)
AREA_FLAG_SANCTUARY = 0x00000800, // sanctuary area (PvP disabled) AREA_FLAG_SANCTUARY = 0x00000800, // sanctuary area (PvP disabled)
AREA_FLAG_NEED_FLY = 0x00001000, // only Netherwing Ledge, Socrethar's Seat, Tempest Keep, The Arcatraz, The Botanica, The Mechanar, Sorrow Wing Point, Dragonspine Ridge, Netherwing Mines, Dragonmaw Base Camp, Dragonmaw Skyway AREA_FLAG_NEED_FLY = 0x00001000, // only Netherwing Ledge, Socrethar's Seat, Tempest Keep, The Arcatraz, The Botanica, The Mechanar, Sorrow Wing Point, Dragonspine Ridge, Netherwing Mines, Dragonmaw Base Camp, Dragonmaw Skyway
AREA_FLAG_UNUSED1 = 0x00002000, // not used now (no area/zones with this flag set in 2.4.2) AREA_FLAG_UNUSED1 = 0x00002000, // not used now (no area/zones with this flag set in 3.0.3)
AREA_FLAG_OUTLAND2 = 0x00004000, // outland zones? (only Circle of Blood Arena not have this flag, but have 0x00000400 flag) AREA_FLAG_OUTLAND2 = 0x00004000, // expansion zones? (only Circle of Blood Arena not have this flag, but have 0x00000400 flag)
AREA_FLAG_PVP = 0x00008000, // pvp objective area? (Death's Door also has this flag although it's no pvp object area) AREA_FLAG_PVP = 0x00008000, // pvp objective area? (Death's Door also has this flag although it's no pvp object area)
AREA_FLAG_ARENA_INSTANCE = 0x00010000, // used by instanced arenas only AREA_FLAG_ARENA_INSTANCE = 0x00010000, // used by instanced arenas only
AREA_FLAG_UNUSED2 = 0x00020000, // not used now (no area/zones with this flag set in 2.4.2) AREA_FLAG_UNUSED2 = 0x00020000, // not used now (no area/zones with this flag set in 3.0.3)
AREA_FLAG_UNK5 = 0x00040000, // just used for Amani Pass, Hatchet Hills AREA_FLAG_UNK5 = 0x00040000, // only used for Amani Pass, Hatchet Hills
AREA_FLAG_LOWLEVEL = 0x00100000 // used for some starting areas with area_level <=15 AREA_FLAG_UNK6 = 0x00080000, // Valgarde and Acherus: The Ebon Hold
AREA_FLAG_LOWLEVEL = 0x00100000, // used for some starting areas with area_level <=15
AREA_FLAG_TOWN = 0x00200000, // small towns with Inn
AREA_FLAG_UNK7 = 0x00400000, // Warsong Hold, Acherus: The Ebon Hold, New Agamand Inn, Vengeance Landing Inn
AREA_FLAG_UNK8 = 0x00800000, // Westguard Inn, Acherus: The Ebon Hold, Valgarde
AREA_FLAG_OUTDOOR_PVP = 0x01000000, // Wintergrasp and it's subzones
AREA_FLAG_UNK9 = 0x02000000, // unknown
AREA_FLAG_UNK10 = 0x04000000, // unknown
AREA_FLAG_OUTDOOR_PVP2 = 0x08000000 // Wintergrasp and it's subzones
}; };
enum FactionTemplateFlags enum FactionTemplateFlags