/////////////////////////////////////////////////////////// // MobSurgeon // // Редактор mob-ов для Проклятых Земель // // Copyright (C) 2005-2007 Gipat Group // // Распространяется на условиях // // Gipat Group's opened EI-editor-utility license // // версии 1.0 // // // // www.gipatgroup.org // /////////////////////////////////////////////////////////// //К работе над данным файлом приложили руки, ноги.... короче аффтары: // 1) Sagrer (sagrer@yandex.ru) //////////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------------- #pragma hdrstop #include "MobParticle2Obj.h" #include "MobFormat.h" //--------------------------------------------------------------------------- #pragma package(smart_init) /////////////////////////////////// //TParticle2ObjBlock /////////////////////////////////// DWORD TParticle2ObjBlock::GetBlockSize() //Считает сколько будет весить блок в виде байтов. { //Переменные... DWORD Result = 126; int i; //126 - минимальный размер без учета длины вариабельных переменных. //Строки и массивы байтов... Result = Result + NameStr.Length() + UnknStr1.Length(); //Более сложные массивы... for (i = 0; i < SoundStr_s->Length; i++) { Result = Result + SoundStr_s->operator[](i).Length() + 8; }; //Поскольку базовая часть у этого типа объекта не используется - //просто присобачить длину сигнатуры и размера блока - 8 байт. Result = Result + 8; return Result; }; bool TParticle2ObjBlock::ReadBlock(byte *Buff, DWORD BuffSize, bool UseLog, TMob *PMobObj) //Читает инфу о рычаге в структуру. { //Локальные переменные... DWORD TempDW1, MinBlockSgn, MinBlockSize, TempDW2, i; bool Result = true; __int64 Cursor = 8; //Читать сам блок в цикле. do { //Прочитать сигнатуру подблока... memcpy(&MinBlockSgn,&Buff[Cursor],4); Cursor = Cursor+4; //Теперь в зависимости от типа подблока... if (MinBlockSgn == Ptl2_Sgn_SoundStr_s) { //Типа массив строк на звуки //DynamicArray //Создать в памяти массив. SoundStr_s = new DynamicArray ; //Прочитать длину блока... memcpy(&MinBlockSize,&Buff[Cursor],4); Cursor = Cursor+4; //Прочитать количество доспехов memcpy(&TempDW1,&Buff[Cursor],4); Cursor = Cursor+4; if (TempDW1 != 0) { //Если есть доспехи... //Выделить память... SoundStr_s->Length = TempDW1; i = -1; do { //Циклически их типа прочитать... TempDW1 = TempDW1-1; //Прямо тут - потому что нумерация в массиве с нуля начинается i = i+1; Cursor = Cursor+4; //Проскочить сигнатуру //Прочитать длину строки... memcpy(&TempDW2,&Buff[Cursor],4); Cursor = Cursor+4; //Прочитать строку... if ((TempDW2 - 8) != 0) { SoundStr_s->operator[](i).SetLength((TempDW2 - 8)); memcpy(&SoundStr_s->operator[](i)[1],&Buff[Cursor],(TempDW2 - 8)); Cursor = Cursor+(TempDW2 - 8); } else { SoundStr_s->operator[](i) = ""; }; } while (TempDW1 != 0); } else { //Если нету доспехов... SoundStr_s->Length = 0; }; } else if (MinBlockSgn == Ptl2_Sgn_ID) { //Типа идешник //DWORD //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значение... memcpy(&ID,&Buff[Cursor],4); Cursor = Cursor+4; } else if (MinBlockSgn == Ptl2_Sgn_Coords) { //Координаты //float X 3 //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значения... memcpy(&CoordX,&Buff[Cursor],4); Cursor = Cursor+4; memcpy(&CoordY,&Buff[Cursor],4); Cursor = Cursor+4; memcpy(&CoordZ,&Buff[Cursor],4); Cursor = Cursor+4; } else if (MinBlockSgn == Ptl2_Sgn_UnknDw1) { //Неизвестный DW 1 //DWORD //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значение... memcpy(&UnknDW1,&Buff[Cursor],4); Cursor = Cursor+4; } else if (MinBlockSgn == Ptl2_Sgn_UnknDw2) { //Неизвестный DW 2 //DWORD //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значение... memcpy(&UnknDW2,&Buff[Cursor],4); Cursor = Cursor+4; } else if (MinBlockSgn == Ptl2_Sgn_NameStr) { //Ну типа это имя партикла //String //Прочитать длину блока... memcpy(&MinBlockSize,&Buff[Cursor],4); Cursor = Cursor+4; NameStr.SetLength(MinBlockSize-8); if ((MinBlockSize-8) != 0) { //Прочитать значение... memcpy(&NameStr[1],&Buff[Cursor],(MinBlockSize-8)); Cursor = Cursor+(MinBlockSize-8); } else { NameStr = ""; }; } else if (MinBlockSgn == Ptl2_Sgn_UnknStr1) { //Неизвестная строка 1 //String //Прочитать длину блока... memcpy(&MinBlockSize,&Buff[Cursor],4); Cursor = Cursor+4; UnknStr1.SetLength(MinBlockSize-8); if ((MinBlockSize-8) != 0) { //Прочитать значение... memcpy(&UnknStr1[1],&Buff[Cursor],(MinBlockSize-8)); Cursor = Cursor+(MinBlockSize-8); } else { UnknStr1 = ""; }; } else if (MinBlockSgn == Ptl2_Sgn_UnknDw3) { //Неизвестный DW 3 //DWORD //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значение... memcpy(&UnknDW3,&Buff[Cursor],4); Cursor = Cursor+4; } else if (MinBlockSgn == Ptl2_Sgn_UnknDw4) { //Неизвестный DW 4 //DWORD //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значение... memcpy(&UnknDW4,&Buff[Cursor],4); Cursor = Cursor+4; } else if (MinBlockSgn == Ptl2_Sgn_UnknByte1) { //Неизвестный byte 1 //byte Cursor = Cursor+4; //Проскочить длину блока - она фиксирована. //Прочитать значение... memcpy(&UnknByte1,&Buff[Cursor],1); Cursor = Cursor+1; } else if (MinBlockSgn == Ptl2_Sgn_UnknByte2) { //Неизвестный byte 2 //byte Cursor = Cursor+4; //Проскочить длину блока - она фиксирована. //Прочитать значение... memcpy(&UnknByte2,&Buff[Cursor],1); Cursor = Cursor+1; }; } while (Cursor != BuffSize); StopLoadUnitBlock: //Метка для скачка сюда при сбое. ; return Result; }; byte* TParticle2ObjBlock::GenBlock(DWORD& BlockSize) //Генерирует блок... { //Переменные byte* Result = NULL; int i = 0; //счетчик DWORD ChetireBaita, BlockSignature; DWORD Cursor = 0; //Итак, поехали. В начале выделить память под блок... BlockSize = GetBlockSize(); Result = new byte[BlockSize]; //Затем сигнатура... memcpy(&Result[Cursor],&OB_Sgn_Particle2,4); Cursor = Cursor+4; //Длина блока. memcpy(&Result[Cursor],&BlockSize,4); Cursor = Cursor+4; //Типа массив строк на звуки //DynamicArray //Сигнатура подблока memcpy(&Result[Cursor],&Ptl2_Sgn_SoundStr_s,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 0; for (i = 0; i < SoundStr_s->Length; i++) { ChetireBaita = ChetireBaita + SoundStr_s->operator[](i).Length() + 8; }; ChetireBaita = ChetireBaita + 12; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Количество элементов в блоке... ChetireBaita = SoundStr_s->Length; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Собсно содержимое... for (i = 0; i < SoundStr_s->Length; i++) { //Сигнатура подблока memcpy(&Result[Cursor],&Ptl2_Sgn_SoundStr_s,4); Cursor = Cursor+4; //Длина подблока... ChetireBaita = 8+SoundStr_s->operator[](i).Length(); memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значние... if (SoundStr_s->operator[](i).Length() > 0) { memcpy(&Result[Cursor],&SoundStr_s->operator[](i)[1],SoundStr_s->operator[](i).Length()); Cursor = Cursor+SoundStr_s->operator[](i).Length(); }; }; //Типа идешник //DWORD //Сигнатура подблока memcpy(&Result[Cursor],&Ptl2_Sgn_ID,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 12; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&ID,4); Cursor = Cursor+4; //Координаты //float X 3 //Сигнатура подблока memcpy(&Result[Cursor],&Ptl2_Sgn_Coords,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 20; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значения memcpy(&Result[Cursor],&CoordX,4); Cursor = Cursor+4; memcpy(&Result[Cursor],&CoordY,4); Cursor = Cursor+4; memcpy(&Result[Cursor],&CoordZ,4); Cursor = Cursor+4; //Неизвестный DW 1 //DWORD //Сигнатура подблока memcpy(&Result[Cursor],&Ptl2_Sgn_UnknDw1,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 12; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&UnknDW1,4); Cursor = Cursor+4; //Неизвестный DW 2 //DWORD //Сигнатура подблока memcpy(&Result[Cursor],&Ptl2_Sgn_UnknDw2,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 12; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&UnknDW2,4); Cursor = Cursor+4; //Ну типа это имя партикла //String //Сигнатура подблока memcpy(&Result[Cursor],&Ptl2_Sgn_NameStr,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 8+NameStr.Length(); memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значние... if (ChetireBaita > 8) { memcpy(&Result[Cursor],&NameStr[1],NameStr.Length()); Cursor = Cursor+NameStr.Length(); }; //Неизвестная строка 1 //String //Сигнатура подблока memcpy(&Result[Cursor],&Ptl2_Sgn_UnknStr1,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 8+UnknStr1.Length(); memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значние... if (ChetireBaita > 8) { memcpy(&Result[Cursor],&UnknStr1[1],UnknStr1.Length()); Cursor = Cursor+UnknStr1.Length(); }; //Неизвестный DW 3 //DWORD //Сигнатура подблока memcpy(&Result[Cursor],&Ptl2_Sgn_UnknDw3,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 12; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&UnknDW3,4); Cursor = Cursor+4; //Неизвестный DW 4 //DWORD //Сигнатура подблока memcpy(&Result[Cursor],&Ptl2_Sgn_UnknDw4,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 12; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&UnknDW4,4); Cursor = Cursor+4; //Неизвестный byte 1 //byte //Сигнатура подблока memcpy(&Result[Cursor],&Ptl2_Sgn_UnknByte1,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 9; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&UnknByte1,1); Cursor = Cursor+1; //Неизвестный byte 2 //byte //Сигнатура подблока memcpy(&Result[Cursor],&Ptl2_Sgn_UnknByte2,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 9; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&UnknByte2,1); Cursor = Cursor+1; //И вернуть результат... return Result; };