/////////////////////////////////////////////////////////// // 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 "MobLeverObj.h" #include "MobFormat.h" //--------------------------------------------------------------------------- #pragma package(smart_init) /////////////////////////////////// //TLeverObjBlock /////////////////////////////////// DWORD TLeverObjBlock::GetBlockSize() //Считает сколько будет весить блок в виде байтов. { //Переменные... DWORD Result = 65; int i; //65 - минимальный размер бонусной части. //И присобачить размер базовой части блока рассчитав ее //через функцию предка... Result = Result + TObjectObjBlock::GetBlockSize(); return Result; }; bool TLeverObjBlock::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 == Lvr_Sgn_SwitchParams) { //Информация о включаемости рычага. //DWORD X 3 //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значения... memcpy(&AsOpen,&Buff[Cursor],4); Cursor = Cursor+4; memcpy(&Key,&Buff[Cursor],4); Cursor = Cursor+4; memcpy(&Sleigth,&Buff[Cursor],4); Cursor = Cursor+4; } else if (MinBlockSgn == Lvr_Sgn_UnknByte2) { //Неизвестное byte2. //byte //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значение... memcpy(&UncnByte2,&Buff[Cursor],1); Cursor = Cursor+1; } else if (MinBlockSgn == Lvr_Sgn_UnknByte3) { //Неизвестное byte3. //byte //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значение... memcpy(&UncnByte3,&Buff[Cursor],1); Cursor = Cursor+1; } else if (MinBlockSgn == Lvr_Sgn_UnknByte4) { //Неизвестное byte4. //byte //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значение... memcpy(&UncnByte4,&Buff[Cursor],1); Cursor = Cursor+1; } else if (MinBlockSgn == Lvr_Sgn_UnknByte5) { //Неизвестное byte5. //byte //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значение... memcpy(&UncnByte5,&Buff[Cursor],1); Cursor = Cursor+1; } else if (MinBlockSgn == Lvr_Sgn_UnknByte6) { //Неизвестное byte6. //byte //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значение... memcpy(&UncnByte6,&Buff[Cursor],1); Cursor = Cursor+1; } else if (MinBlockSgn == Obj_Sgn_BodyTextures) //Что означает что это началась базовая часть блока... { //А теперь - вызвать функцию предка читающую базовую часть блока... MinBlockSize = GetNMobBlocksSize(Buff,Cursor-4,17); //Посчитать скока весит базовый кусок TObjectObjBlock::ReadBlock(&Buff[Cursor-12],MinBlockSize+8,UseLog,PMobObj); Cursor = Cursor+MinBlockSize-4; //Прыгнуть на начало след. блока... }; } while (Cursor != BuffSize); StopLoadUnitBlock: //Метка для скачка сюда при сбое. ; return Result; }; byte* TLeverObjBlock::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_Lever,4); Cursor = Cursor+4; //Длина блока. memcpy(&Result[Cursor],&BlockSize,4); Cursor = Cursor+4; //Информация о включаемости рычага. //DWORD X 3 //Сигнатура подблока memcpy(&Result[Cursor],&Lvr_Sgn_SwitchParams,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 20; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значения memcpy(&Result[Cursor],&AsOpen,4); Cursor = Cursor+4; memcpy(&Result[Cursor],&Key,4); Cursor = Cursor+4; memcpy(&Result[Cursor],&Sleigth,4); Cursor = Cursor+4; //Неизвестное byte2. //byte //Сигнатура подблока memcpy(&Result[Cursor],&Lvr_Sgn_UnknByte2,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 9; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&UncnByte2,1); Cursor = Cursor+1; //Неизвестное byte3. //byte //Сигнатура подблока memcpy(&Result[Cursor],&Lvr_Sgn_UnknByte3,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 9; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&UncnByte3,1); Cursor = Cursor+1; //Неизвестное byte4. //byte //Сигнатура подблока memcpy(&Result[Cursor],&Lvr_Sgn_UnknByte4,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 9; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&UncnByte4,1); Cursor = Cursor+1; //Неизвестное byte5. //byte //Сигнатура подблока memcpy(&Result[Cursor],&Lvr_Sgn_UnknByte5,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 9; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&UncnByte5,1); Cursor = Cursor+1; //Неизвестное byte6. //byte //Сигнатура подблока memcpy(&Result[Cursor],&Lvr_Sgn_UnknByte6,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 9; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&UncnByte6,1); Cursor = Cursor+1; //А теперь присобачить базовую часть... TObjectObjBlock::GenBasePart(&Result[Cursor]); Cursor = Cursor+TObjectObjBlock::GetBlockSize()-8; //И вернуть результат... return Result; };