1 | #define __STORMLIB_SELF__ |
---|
2 | |
---|
3 | #include "wdtfile.h" |
---|
4 | #include "adtfile.h" |
---|
5 | |
---|
6 | |
---|
7 | char * wdtGetPlainName(char * FileName) |
---|
8 | { |
---|
9 | char * szTemp; |
---|
10 | |
---|
11 | if((szTemp = strrchr(FileName, '\\')) != NULL) |
---|
12 | FileName = szTemp + 1; |
---|
13 | return FileName; |
---|
14 | } |
---|
15 | |
---|
16 | WDTFile::WDTFile(char* file_name, char* file_name1):WDT(file_name) |
---|
17 | { |
---|
18 | filename.append(file_name1,strlen(file_name1)); |
---|
19 | } |
---|
20 | |
---|
21 | bool WDTFile::init(char *map_id) |
---|
22 | { |
---|
23 | |
---|
24 | if (WDT.isEof()) |
---|
25 | { |
---|
26 | //printf("Can't find WDT file.\n"); |
---|
27 | return false; |
---|
28 | } |
---|
29 | |
---|
30 | char fourcc[5]; |
---|
31 | size_t size; |
---|
32 | |
---|
33 | |
---|
34 | const char dirname[] = "buildings\\dir"; |
---|
35 | FILE *dirfile; |
---|
36 | dirfile = fopen(dirname, "ab"); |
---|
37 | if(!dirfile) |
---|
38 | { |
---|
39 | printf("Can't open dirfile!'%s'\n"); |
---|
40 | return false; |
---|
41 | } |
---|
42 | |
---|
43 | |
---|
44 | while (!WDT.isEof()) |
---|
45 | { |
---|
46 | WDT.read(fourcc,4); |
---|
47 | WDT.read(&size, 4); |
---|
48 | |
---|
49 | flipcc(fourcc); |
---|
50 | fourcc[4] = 0; |
---|
51 | |
---|
52 | size_t nextpos = WDT.getPos() + size; |
---|
53 | |
---|
54 | if (!strcmp(fourcc,"MAIN")) |
---|
55 | { |
---|
56 | } |
---|
57 | if (!strcmp(fourcc,"MWMO")) |
---|
58 | { |
---|
59 | // global map objects |
---|
60 | if (size) |
---|
61 | { |
---|
62 | char *buf = new char[size]; |
---|
63 | WDT.read(buf, size); |
---|
64 | char *p=buf; |
---|
65 | int q = 0; |
---|
66 | gWmoInstansName = new string[size]; |
---|
67 | while (p<buf+size) |
---|
68 | { |
---|
69 | string path(p); |
---|
70 | char* s=wdtGetPlainName(p); |
---|
71 | fixnamen(s,strlen(s)); |
---|
72 | p=p+strlen(p)+1; |
---|
73 | gWmoInstansName[q++] = s; |
---|
74 | } |
---|
75 | delete[] buf; |
---|
76 | } |
---|
77 | } |
---|
78 | else |
---|
79 | if (!strcmp(fourcc,"MODF")) |
---|
80 | { |
---|
81 | // global wmo instance data |
---|
82 | if (size) |
---|
83 | { |
---|
84 | gnWMO = (int)size / 64; |
---|
85 | string gWMO_mapname; |
---|
86 | string fake_mapname; |
---|
87 | fake_mapname = "65 65 "; |
---|
88 | //gWMO_mapname = fake_mapname + filename; |
---|
89 | gWMO_mapname = fake_mapname + std::string(map_id); |
---|
90 | for (int i=0; i<gnWMO; i++) |
---|
91 | { |
---|
92 | int id; |
---|
93 | WDT.read(&id, 4); |
---|
94 | WMOInstance inst(WDT,gWmoInstansName[id].c_str(),gWMO_mapname.c_str(), dirfile); |
---|
95 | } |
---|
96 | delete[] gWmoInstansName; |
---|
97 | } |
---|
98 | } |
---|
99 | WDT.seek((int)nextpos); |
---|
100 | } |
---|
101 | |
---|
102 | WDT.close(); |
---|
103 | fclose(dirfile); |
---|
104 | return true; |
---|
105 | } |
---|
106 | |
---|
107 | WDTFile::~WDTFile(void) |
---|
108 | { |
---|
109 | WDT.close(); |
---|
110 | } |
---|
111 | |
---|
112 | ADTFile* WDTFile::GetMap(int x, int z) |
---|
113 | { |
---|
114 | if(!(x>=0 && z >= 0 && x<64 && z<64)) return NULL; |
---|
115 | |
---|
116 | char name[512]; |
---|
117 | |
---|
118 | sprintf(name,"World\\Maps\\%s\\%s_%d_%d.adt", filename.c_str(), filename.c_str(), x, z); |
---|
119 | return new ADTFile(name); |
---|
120 | } |
---|