| 1 |
/////////////////////////////////////////////////////////// |
|---|
| 2 |
// MobSurgeon // |
|---|
| 3 |
// Ðåäàêòîð mob-îâ äëÿ Ïðîêëÿòûõ Çåìåëü // |
|---|
| 4 |
// Copyright (C) 2005-2007 Gipat Group // |
|---|
| 5 |
// Ðàñïðîñòðàíÿåòñÿ íà óñëîâèÿõ // |
|---|
| 6 |
// Gipat Group's opened EI-editor-utility license // |
|---|
| 7 |
// âåðñèè 1.0 // |
|---|
| 8 |
// // |
|---|
| 9 |
// www.gipatgroup.org // |
|---|
| 10 |
/////////////////////////////////////////////////////////// |
|---|
| 11 |
|
|---|
| 12 |
//Ê ðàáîòå íàä äàííûì ôàéëîì ïðèëîæèëè ðóêè, íîãè.... êîðî÷å àôôòàðû: |
|---|
| 13 |
// 1) Sagrer (sagrer@yandex.ru) |
|---|
| 14 |
|
|---|
| 15 |
//////////////////////////////////////////////////////////////////////// |
|---|
| 16 |
|
|---|
| 17 |
//--------------------------------------------------------------------------- |
|---|
| 18 |
|
|---|
| 19 |
|
|---|
| 20 |
#pragma hdrstop |
|---|
| 21 |
|
|---|
| 22 |
#include "MobFlameObj.h" |
|---|
| 23 |
#include "MobFormat.h" |
|---|
| 24 |
|
|---|
| 25 |
//--------------------------------------------------------------------------- |
|---|
| 26 |
|
|---|
| 27 |
#pragma package(smart_init) |
|---|
| 28 |
|
|---|
| 29 |
/////////////////////////////////// |
|---|
| 30 |
//TFlameObjBlock |
|---|
| 31 |
/////////////////////////////////// |
|---|
| 32 |
|
|---|
| 33 |
DWORD TFlameObjBlock::GetBlockSize() |
|---|
| 34 |
//Ñ÷èòàåò ñêîëüêî áóäåò âåñèòü áëîê â âèäå áàéòîâ. |
|---|
| 35 |
{ |
|---|
| 36 |
//Ïåðåìåííûå... |
|---|
| 37 |
DWORD Result = 40; |
|---|
| 38 |
int i; |
|---|
| 39 |
//44 - ìèíèìàëüíûé ðàçìåð áîíóñíîé ÷àñòè. |
|---|
| 40 |
|
|---|
| 41 |
//Ñòðîêè è ìàññèâû áàéòîâ, äèíàìè÷åñêèå ìàñèâû ñ ôèêñèðîâàííîé äëèíîé ýëåìåíòîâ... |
|---|
| 42 |
Result = Result + SoundStr.Length(); |
|---|
| 43 |
|
|---|
| 44 |
//È ïðèñîáà÷èòü ðàçìåð áàçîâîé ÷àñòè áëîêà ðàññ÷èòàâ åå |
|---|
| 45 |
//÷åðåç ôóíêöèþ ïðåäêà... |
|---|
| 46 |
Result = Result + TObjectObjBlock::GetBlockSize(); |
|---|
| 47 |
|
|---|
| 48 |
return Result; |
|---|
| 49 |
}; |
|---|
| 50 |
|
|---|
| 51 |
bool TFlameObjBlock::ReadBlock(byte *Buff, DWORD BuffSize, bool UseLog, TMob *PMobObj) |
|---|
| 52 |
//×èòàåò èíôó î ðû÷àãå â ñòðóêòóðó. |
|---|
| 53 |
{ |
|---|
| 54 |
//Ëîêàëüíûå ïåðåìåííûå... |
|---|
| 55 |
DWORD TempDW1, MinBlockSgn, MinBlockSize, TempDW2, i; |
|---|
| 56 |
bool Result = true; |
|---|
| 57 |
__int64 Cursor = 8; |
|---|
| 58 |
|
|---|
| 59 |
//×èòàòü ñàì áëîê â öèêëå. |
|---|
| 60 |
do |
|---|
| 61 |
{ |
|---|
| 62 |
//Ïðî÷èòàòü ñèãíàòóðó ïîäáëîêà... |
|---|
| 63 |
memcpy(&MinBlockSgn,&Buff[Cursor],4); |
|---|
| 64 |
Cursor = Cursor+4; |
|---|
| 65 |
//Òåïåðü â çàâèñèìîñòè îò òèïà ïîäáëîêà... |
|---|
| 66 |
if (MinBlockSgn == Flm_Sgn_Coords) |
|---|
| 67 |
{ |
|---|
| 68 |
//Òèïà êîîðäèíàòû |
|---|
| 69 |
//float X 3 |
|---|
| 70 |
|
|---|
| 71 |
//Ïðîñêî÷èòü äëèíó áëîêà... |
|---|
| 72 |
Cursor = Cursor+4; |
|---|
| 73 |
//Ïðî÷èòàòü çíà÷åíèÿ... |
|---|
| 74 |
memcpy(&CoordX,&Buff[Cursor],4); |
|---|
| 75 |
Cursor = Cursor+4; |
|---|
| 76 |
memcpy(&CoordY,&Buff[Cursor],4); |
|---|
| 77 |
Cursor = Cursor+4; |
|---|
| 78 |
memcpy(&CoordZ,&Buff[Cursor],4); |
|---|
| 79 |
Cursor = Cursor+4; |
|---|
| 80 |
} |
|---|
| 81 |
|
|---|
| 82 |
|
|---|
| 83 |
else if (MinBlockSgn == Flm_Sgn_FlameSize) |
|---|
| 84 |
{ |
|---|
| 85 |
//Òèïà ðàçìåð ôëåéìû |
|---|
| 86 |
//float |
|---|
| 87 |
|
|---|
| 88 |
//Ïðîñêî÷èòü äëèíó áëîêà... |
|---|
| 89 |
Cursor = Cursor+4; |
|---|
| 90 |
//Ïðî÷èòàòü çíà÷åíèå... |
|---|
| 91 |
memcpy(&FlameSize,&Buff[Cursor],4); |
|---|
| 92 |
Cursor = Cursor+4; |
|---|
| 93 |
} |
|---|
| 94 |
|
|---|
| 95 |
else if (MinBlockSgn == Flm_Sgn_SoundStr) |
|---|
| 96 |
{ |
|---|
| 97 |
//Íó òèïà çâóê äëÿ åòîãî ôëåéìà |
|---|
| 98 |
//String |
|---|
| 99 |
|
|---|
| 100 |
//Ïðî÷èòàòü äëèíó áëîêà... |
|---|
| 101 |
memcpy(&MinBlockSize,&Buff[Cursor],4); |
|---|
| 102 |
Cursor = Cursor+4; |
|---|
| 103 |
SoundStr.SetLength(MinBlockSize-8); |
|---|
| 104 |
|
|---|
| 105 |
if ((MinBlockSize-8) != 0) |
|---|
| 106 |
{ |
|---|
| 107 |
//Ïðî÷èòàòü çíà÷åíèå... |
|---|
| 108 |
memcpy(&SoundStr[1],&Buff[Cursor],(MinBlockSize-8)); |
|---|
| 109 |
Cursor = Cursor+(MinBlockSize-8); |
|---|
| 110 |
} |
|---|
| 111 |
else |
|---|
| 112 |
{ |
|---|
| 113 |
SoundStr = ""; |
|---|
| 114 |
}; |
|---|
| 115 |
} |
|---|
| 116 |
|
|---|
| 117 |
else if (MinBlockSgn == Obj_Sgn_BodyTextures) //×òî îçíà÷àåò ÷òî ýòî íà÷àëàñü áàçîâàÿ ÷àñòü áëîêà... |
|---|
| 118 |
{ |
|---|
| 119 |
//À òåïåðü - âûçâàòü ôóíêöèþ ïðåäêà ÷èòàþùóþ áàçîâóþ ÷àñòü áëîêà... |
|---|
| 120 |
MinBlockSize = GetNMobBlocksSize(Buff,Cursor-4,17); //Ïîñ÷èòàòü ñêîêà âåñèò áàçîâûé êóñîê |
|---|
| 121 |
TObjectObjBlock::ReadBlock(&Buff[Cursor-12],MinBlockSize+8,UseLog,PMobObj); |
|---|
| 122 |
Cursor = Cursor+MinBlockSize-4; //Ïðûãíóòü íà íà÷àëî ñëåä. áëîêà... |
|---|
| 123 |
}; |
|---|
| 124 |
|
|---|
| 125 |
} |
|---|
| 126 |
while (Cursor != BuffSize); |
|---|
| 127 |
|
|---|
| 128 |
StopLoadUnitBlock: //Ìåòêà äëÿ ñêà÷êà ñþäà ïðè ñáîå. |
|---|
| 129 |
; |
|---|
| 130 |
return Result; |
|---|
| 131 |
}; |
|---|
| 132 |
|
|---|
| 133 |
byte* TFlameObjBlock::GenBlock(DWORD& BlockSize) |
|---|
| 134 |
//Ãåíåðèðóåò áëîê... |
|---|
| 135 |
{ |
|---|
| 136 |
//Ïåðåìåííûå |
|---|
| 137 |
byte* Result = NULL; |
|---|
| 138 |
int i = 0; //ñ÷åò÷èê |
|---|
| 139 |
DWORD ChetireBaita, BlockSignature; |
|---|
| 140 |
DWORD Cursor = 0; |
|---|
| 141 |
|
|---|
| 142 |
//Èòàê, ïîåõàëè.  íà÷àëå âûäåëèòü ïàìÿòü ïîä áëîê... |
|---|
| 143 |
BlockSize = GetBlockSize(); |
|---|
| 144 |
Result = new byte[BlockSize]; |
|---|
| 145 |
|
|---|
| 146 |
//Çàòåì ñèãíàòóðà... |
|---|
| 147 |
memcpy(&Result[Cursor],&OB_Sgn_Flame,4); |
|---|
| 148 |
Cursor = Cursor+4; |
|---|
| 149 |
|
|---|
| 150 |
//Äëèíà áëîêà. |
|---|
| 151 |
memcpy(&Result[Cursor],&BlockSize,4); |
|---|
| 152 |
Cursor = Cursor+4; |
|---|
| 153 |
|
|---|
| 154 |
//Òèïà êîîðäèíàòû |
|---|
| 155 |
//float X 3 |
|---|
| 156 |
//Ñèãíàòóðà ïîäáëîêà |
|---|
| 157 |
memcpy(&Result[Cursor],&Flm_Sgn_Coords,4); |
|---|
| 158 |
Cursor = Cursor+4; |
|---|
| 159 |
//Äëèíà áëîêà... |
|---|
| 160 |
ChetireBaita = 20; |
|---|
| 161 |
memcpy(&Result[Cursor],&ChetireBaita,4); |
|---|
| 162 |
Cursor = Cursor+4; |
|---|
| 163 |
//Çíà÷åíèÿ |
|---|
| 164 |
memcpy(&Result[Cursor],&CoordX,4); |
|---|
| 165 |
Cursor = Cursor+4; |
|---|
| 166 |
memcpy(&Result[Cursor],&CoordY,4); |
|---|
| 167 |
Cursor = Cursor+4; |
|---|
| 168 |
memcpy(&Result[Cursor],&CoordZ,4); |
|---|
| 169 |
Cursor = Cursor+4; |
|---|
| 170 |
|
|---|
| 171 |
//Òèïà ðàçìåð ôëåéìû |
|---|
| 172 |
//float |
|---|
| 173 |
//Ñèãíàòóðà ïîäáëîêà |
|---|
| 174 |
memcpy(&Result[Cursor],&Flm_Sgn_FlameSize,4); |
|---|
| 175 |
Cursor = Cursor+4; |
|---|
| 176 |
//Äëèíà áëîêà... |
|---|
| 177 |
ChetireBaita = 12; |
|---|
| 178 |
memcpy(&Result[Cursor],&ChetireBaita,4); |
|---|
| 179 |
Cursor = Cursor+4; |
|---|
| 180 |
//Çíà÷åíèå |
|---|
| 181 |
memcpy(&Result[Cursor],&FlameSize,4); |
|---|
| 182 |
Cursor = Cursor+4; |
|---|
| 183 |
|
|---|
| 184 |
//Íó òèïà çâóê äëÿ åòîãî ôëåéìà |
|---|
| 185 |
//String |
|---|
| 186 |
//Ñèãíàòóðà ïîäáëîêà |
|---|
| 187 |
memcpy(&Result[Cursor],&Flm_Sgn_SoundStr,4); |
|---|
| 188 |
Cursor = Cursor+4; |
|---|
| 189 |
//Äëèíà áëîêà... |
|---|
| 190 |
ChetireBaita = 8+SoundStr.Length(); |
|---|
| 191 |
memcpy(&Result[Cursor],&ChetireBaita,4); |
|---|
| 192 |
Cursor = Cursor+4; |
|---|
| 193 |
//Çíà÷íèå... |
|---|
| 194 |
if (ChetireBaita > 8) |
|---|
| 195 |
{ |
|---|
| 196 |
memcpy(&Result[Cursor],&SoundStr[1],SoundStr.Length()); |
|---|
| 197 |
Cursor = Cursor+SoundStr.Length(); |
|---|
| 198 |
}; |
|---|
| 199 |
|
|---|
| 200 |
//À òåïåðü ïðèñîáà÷èòü áàçîâóþ ÷àñòü... |
|---|
| 201 |
TObjectObjBlock::GenBasePart(&Result[Cursor]); |
|---|
| 202 |
Cursor = Cursor+TObjectObjBlock::GetBlockSize()-8; |
|---|
| 203 |
|
|---|
| 204 |
//È âåðíóòü ðåçóëüòàò... |
|---|
| 205 |
return Result; |
|---|
| 206 |
}; |
|---|