Legends-of-Azeroth-Pandaria-5.4.8

Форк
0
203 строки · 4.9 Кб
1
/*
2
 * Copyright (C) 2005-2013 MaNGOS <http://www.getmangos.com/>
3
 * Copyright (C) 2008-2013 Trinity <http://www.trinitycore.org/>
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 2 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
 */
19

20
#define _CRT_SECURE_NO_DEPRECATE
21

22
#include "adt.h"
23

24
// Helper
25
int holetab_h[4] = {0x1111, 0x2222, 0x4444, 0x8888};
26
int holetab_v[4] = {0x000F, 0x00F0, 0x0F00, 0xF000};
27

28
u_map_fcc MHDRMagic = { {'R','D','H','M'} };
29
u_map_fcc MCINMagic = { {'N','I','C','M'} };
30
u_map_fcc MH2OMagic = { {'O','2','H','M'} };
31
u_map_fcc MCNKMagic = { {'K','N','C','M'} };
32
u_map_fcc MCVTMagic = { {'T','V','C','M'} };
33
u_map_fcc MCLQMagic = { {'Q','L','C','M'} };
34
u_map_fcc MFBOMagic = { { 'O','B','F','M' } };
35

36
bool isHole(int holes, int i, int j)
37
{
38
    int testi = i / 2;
39
    int testj = j / 4;
40
    if(testi > 3) testi = 3;
41
    if(testj > 3) testj = 3;
42
    return (holes & holetab_h[testi] & holetab_v[testj]) != 0;
43
}
44

45
//
46
// Adt file loader class
47
//
48
ADT_file::ADT_file()
49
{
50
    a_grid = 0;
51
}
52

53
ADT_file::~ADT_file()
54
{
55
    free();
56
}
57

58
void ADT_file::free()
59
{
60
    a_grid = 0;
61
    FileLoader::free();
62
}
63

64
//
65
// Adt file check function
66
//
67
bool ADT_file::prepareLoadedData()
68
{
69
    // Check parent
70
    if (!FileLoader::prepareLoadedData())
71
        return false;
72

73
    // Check and prepare MHDR
74
    a_grid = (adt_MHDR*)(GetData()+8+version->size);
75
    if (!a_grid->prepareLoadedData())
76
        return false;
77

78
    // funny offsets calculations because there is no mapping for them and they have variable lengths
79
    uint8* ptr = (uint8*)a_grid + a_grid->size + 8;
80
    uint32 mcnk_count = 0;
81
    memset(cells, 0, ADT_CELLS_PER_GRID * ADT_CELLS_PER_GRID * sizeof(adt_MCNK*));
82
    memset(cellsMcvt, 0, ADT_CELLS_PER_GRID * ADT_CELLS_PER_GRID * sizeof(adt_MCVT*));
83

84
    while (ptr < GetData() + GetDataSize())
85
    {
86
        uint32 header = *(uint32*)ptr;
87
        uint32 size = *(uint32*)(ptr + 4);
88
        if (header == MCNKMagic.fcc)
89
        {
90
            cells[mcnk_count / ADT_CELLS_PER_GRID][mcnk_count % ADT_CELLS_PER_GRID] = (adt_MCNK*)ptr;
91
            size_t chunkSize = sizeof(adt_MCNK);
92

93
            // Fill sub chunk
94
            while (chunkSize < size)
95
            {
96
                uint32 subHeader = *(uint32*)(ptr + chunkSize);
97
                uint32 subSize = *(uint32*)(ptr + chunkSize + 4);
98

99
                if (subHeader == MCVTMagic.fcc)
100
                {
101
                    cellsMcvt[(mcnk_count) / ADT_CELLS_PER_GRID][(mcnk_count) % ADT_CELLS_PER_GRID] = (adt_MCVT*)(ptr + chunkSize);
102
                    break;
103
                }
104

105
                chunkSize += subSize + 8;
106
            }
107

108
            ++mcnk_count;
109
        }
110

111
        // move to next chunk
112
        ptr += size + 8;
113
    }
114

115
    if (mcnk_count != ADT_CELLS_PER_GRID * ADT_CELLS_PER_GRID)
116
        return false;
117

118
    return true;
119
}
120

121
bool adt_MHDR::prepareLoadedData()
122
{
123
    if (fcc != MHDRMagic.fcc)
124
        return false;
125

126
    if (size != sizeof(adt_MHDR) - 8)
127
        return false;
128

129
    // Check and prepare MCIN
130
    if (offsMCIN && !getMCIN()->prepareLoadedData())
131
        return false;
132

133
    // Check and prepare MH2O
134
    if (offsMH2O && !getMH2O()->prepareLoadedData())
135
        return false;
136

137
    return true;
138
}
139

140
bool adt_MCIN::prepareLoadedData()
141
{
142
    if (fcc != MCINMagic.fcc)
143
        return false;
144

145
    // Check cells data
146
    for (int i = 0; i < ADT_CELLS_PER_GRID; i++)
147
        for (int j = 0; j < ADT_CELLS_PER_GRID; j++)
148
            if (cells[i][j].offsMCNK && !getMCNK(i, j)->prepareLoadedData())
149
                return false;
150

151
    return true;
152
}
153

154
bool adt_MH2O::prepareLoadedData()
155
{
156
    if (fcc != MH2OMagic.fcc)
157
        return false;
158

159
    // Check liquid data
160
//    for (int i=0; i<ADT_CELLS_PER_GRID;i++)
161
//        for (int j=0; j<ADT_CELLS_PER_GRID;j++)
162

163
    return true;
164
}
165

166
bool adt_MCNK::prepareLoadedData()
167
{
168
    if (fcc != MCNKMagic.fcc)
169
        return false;
170

171
    // Check height map
172
    if (offsMCVT && !getMCVT()->prepareLoadedData())
173
        return false;
174
    // Check liquid data
175
    if (offsMCLQ && !getMCLQ()->prepareLoadedData())
176
        return false;
177

178
    return true;
179
}
180

181
bool adt_MCVT::prepareLoadedData()
182
{
183
    if (fcc != MCVTMagic.fcc)
184
        return false;
185

186
    if (size != sizeof(adt_MCVT)-8)
187
        return false;
188

189
    return true;
190
}
191

192
bool adt_MCLQ::prepareLoadedData()
193
{
194
    if (fcc != MCLQMagic.fcc)
195
        return false;
196

197
    return true;
198
}
199

200
bool adt_MFBO::prepareLoadedData()
201
{
202
    return fcc == MFBOMagic.fcc;
203
}
204

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.