Legends-of-Azeroth-Pandaria-5.4.8
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_DEPRECATE21
22#include "adt.h"23
24// Helper
25int holetab_h[4] = {0x1111, 0x2222, 0x4444, 0x8888};26int holetab_v[4] = {0x000F, 0x00F0, 0x0F00, 0xF000};27
28u_map_fcc MHDRMagic = { {'R','D','H','M'} };29u_map_fcc MCINMagic = { {'N','I','C','M'} };30u_map_fcc MH2OMagic = { {'O','2','H','M'} };31u_map_fcc MCNKMagic = { {'K','N','C','M'} };32u_map_fcc MCVTMagic = { {'T','V','C','M'} };33u_map_fcc MCLQMagic = { {'Q','L','C','M'} };34u_map_fcc MFBOMagic = { { 'O','B','F','M' } };35
36bool isHole(int holes, int i, int j)37{
38int testi = i / 2;39int testj = j / 4;40if(testi > 3) testi = 3;41if(testj > 3) testj = 3;42return (holes & holetab_h[testi] & holetab_v[testj]) != 0;43}
44
45//
46// Adt file loader class
47//
48ADT_file::ADT_file()49{
50a_grid = 0;51}
52
53ADT_file::~ADT_file()54{
55free();56}
57
58void ADT_file::free()59{
60a_grid = 0;61FileLoader::free();62}
63
64//
65// Adt file check function
66//
67bool ADT_file::prepareLoadedData()68{
69// Check parent70if (!FileLoader::prepareLoadedData())71return false;72
73// Check and prepare MHDR74a_grid = (adt_MHDR*)(GetData()+8+version->size);75if (!a_grid->prepareLoadedData())76return false;77
78// funny offsets calculations because there is no mapping for them and they have variable lengths79uint8* ptr = (uint8*)a_grid + a_grid->size + 8;80uint32 mcnk_count = 0;81memset(cells, 0, ADT_CELLS_PER_GRID * ADT_CELLS_PER_GRID * sizeof(adt_MCNK*));82memset(cellsMcvt, 0, ADT_CELLS_PER_GRID * ADT_CELLS_PER_GRID * sizeof(adt_MCVT*));83
84while (ptr < GetData() + GetDataSize())85{86uint32 header = *(uint32*)ptr;87uint32 size = *(uint32*)(ptr + 4);88if (header == MCNKMagic.fcc)89{90cells[mcnk_count / ADT_CELLS_PER_GRID][mcnk_count % ADT_CELLS_PER_GRID] = (adt_MCNK*)ptr;91size_t chunkSize = sizeof(adt_MCNK);92
93// Fill sub chunk94while (chunkSize < size)95{96uint32 subHeader = *(uint32*)(ptr + chunkSize);97uint32 subSize = *(uint32*)(ptr + chunkSize + 4);98
99if (subHeader == MCVTMagic.fcc)100{101cellsMcvt[(mcnk_count) / ADT_CELLS_PER_GRID][(mcnk_count) % ADT_CELLS_PER_GRID] = (adt_MCVT*)(ptr + chunkSize);102break;103}104
105chunkSize += subSize + 8;106}107
108++mcnk_count;109}110
111// move to next chunk112ptr += size + 8;113}114
115if (mcnk_count != ADT_CELLS_PER_GRID * ADT_CELLS_PER_GRID)116return false;117
118return true;119}
120
121bool adt_MHDR::prepareLoadedData()122{
123if (fcc != MHDRMagic.fcc)124return false;125
126if (size != sizeof(adt_MHDR) - 8)127return false;128
129// Check and prepare MCIN130if (offsMCIN && !getMCIN()->prepareLoadedData())131return false;132
133// Check and prepare MH2O134if (offsMH2O && !getMH2O()->prepareLoadedData())135return false;136
137return true;138}
139
140bool adt_MCIN::prepareLoadedData()141{
142if (fcc != MCINMagic.fcc)143return false;144
145// Check cells data146for (int i = 0; i < ADT_CELLS_PER_GRID; i++)147for (int j = 0; j < ADT_CELLS_PER_GRID; j++)148if (cells[i][j].offsMCNK && !getMCNK(i, j)->prepareLoadedData())149return false;150
151return true;152}
153
154bool adt_MH2O::prepareLoadedData()155{
156if (fcc != MH2OMagic.fcc)157return false;158
159// Check liquid data160// for (int i=0; i<ADT_CELLS_PER_GRID;i++)
161// for (int j=0; j<ADT_CELLS_PER_GRID;j++)
162
163return true;164}
165
166bool adt_MCNK::prepareLoadedData()167{
168if (fcc != MCNKMagic.fcc)169return false;170
171// Check height map172if (offsMCVT && !getMCVT()->prepareLoadedData())173return false;174// Check liquid data175if (offsMCLQ && !getMCLQ()->prepareLoadedData())176return false;177
178return true;179}
180
181bool adt_MCVT::prepareLoadedData()182{
183if (fcc != MCVTMagic.fcc)184return false;185
186if (size != sizeof(adt_MCVT)-8)187return false;188
189return true;190}
191
192bool adt_MCLQ::prepareLoadedData()193{
194if (fcc != MCLQMagic.fcc)195return false;196
197return true;198}
199
200bool adt_MFBO::prepareLoadedData()201{
202return fcc == MFBOMagic.fcc;203}
204