/////////////////////////////////////////////////////////// // 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 "MobFlameObj.h" #include "MobFormat.h" //--------------------------------------------------------------------------- #pragma package(smart_init) /////////////////////////////////// //TFlameObjBlock /////////////////////////////////// DWORD TFlameObjBlock::GetBlockSize() //Считает сколько будет весить блок в виде байтов. { //Переменные... DWORD Result = 40; int i; //44 - минимальный размер бонусной части. //Строки и массивы байтов, динамические масивы с фиксированной длиной элементов... Result = Result + SoundStr.Length(); //И присобачить размер базовой части блока рассчитав ее //через функцию предка... Result = Result + TObjectObjBlock::GetBlockSize(); return Result; }; bool TFlameObjBlock::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 == Flm_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 == Flm_Sgn_FlameSize) { //Типа размер флеймы //float //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значение... memcpy(&FlameSize,&Buff[Cursor],4); Cursor = Cursor+4; } else if (MinBlockSgn == Flm_Sgn_SoundStr) { //Ну типа звук для етого флейма //String //Прочитать длину блока... memcpy(&MinBlockSize,&Buff[Cursor],4); Cursor = Cursor+4; SoundStr.SetLength(MinBlockSize-8); if ((MinBlockSize-8) != 0) { //Прочитать значение... memcpy(&SoundStr[1],&Buff[Cursor],(MinBlockSize-8)); Cursor = Cursor+(MinBlockSize-8); } else { SoundStr = ""; }; } 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* TFlameObjBlock::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_Flame,4); Cursor = Cursor+4; //Длина блока. memcpy(&Result[Cursor],&BlockSize,4); Cursor = Cursor+4; //Типа координаты //float X 3 //Сигнатура подблока memcpy(&Result[Cursor],&Flm_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; //Типа размер флеймы //float //Сигнатура подблока memcpy(&Result[Cursor],&Flm_Sgn_FlameSize,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 12; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&FlameSize,4); Cursor = Cursor+4; //Ну типа звук для етого флейма //String //Сигнатура подблока memcpy(&Result[Cursor],&Flm_Sgn_SoundStr,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 8+SoundStr.Length(); memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значние... if (ChetireBaita > 8) { memcpy(&Result[Cursor],&SoundStr[1],SoundStr.Length()); Cursor = Cursor+SoundStr.Length(); }; //А теперь присобачить базовую часть... TObjectObjBlock::GenBasePart(&Result[Cursor]); Cursor = Cursor+TObjectObjBlock::GetBlockSize()-8; //И вернуть результат... return Result; };