/* NOTE: -- Loads files of a "MAP". -- TEST mode. -- Creates BMP a file - complete image of a card of a level game Z. -- Work in MSVisual C++ -- Comment in Russian. The author BallWin 2008 */ //************************************************************************** // Специализированные Функции для обработки Z-map файлов //************************************************************************** BYTE* CObrabotkaIMG::Load_Map_File(CString s_patch) { // Обрабатываем загружаемый МАР файл CFile fileMAP(s_patch, CFile::modeRead); MAP_FILE map_file; //структура для данных уровня //инициализируем буферы для номеров блоков и дополнительных данных карты уровня, //получаем на них указатели и фиксируем map_file.buf_data_G = (BYTE*)GlobalAlloc (GMEM_FIXED , 16384); GlobalLock(map_file.buf_data_G); map_file.buf_data_Dop = (BYTE*)GlobalAlloc (GMEM_FIXED , 16384); GlobalLock(map_file.buf_data_Dop); CString strBUFF; LPTSTR lpstrBUFF = strBUFF.GetBuffer(4); CString strBUFF_2; char buf[1];//буфер - приемник short long char* pbuf = (char*)buf; int k; int met = 0; //метка //Заполняем структуру открываемого МАР файла // 1. Получаем названия файлов текстурных карт for(int i=10097; i < 10122; i++) // снимаем 25 символов { fileMAP.Seek(i,CFile::begin); // fileMAP.Read(pbuf,1); k = (int)buf[0]; if(k == 1) { met = 1; } if(k != 0 && met == 0) { map_file.texture_map1 += buf[0]; } if(k != 0 && k != 1 && met == 1) { map_file.texture_map2 += buf[0]; } } // 2. Получаем размеры карты (в цифрах) fileMAP.Seek(10125,CFile::begin); //10125 - байт ширины, 10127 - высоты fileMAP.Read(pbuf,1); map_file.shirina_map = (int)buf[0]; //сразу преобразуется шестн. в десятичное fileMAP.Seek(10127,CFile::begin); //10125 - байт ширины, 10127 - высоты fileMAP.Read(pbuf,1); map_file.visota_map = (int)buf[0]; // 3. Копируем в структуру графические данные fileMAP.Seek(10129,CFile::begin); fileMAP.Read(map_file.buf_data_G,16384); // 4. Копируем в структуру дополнительные данные fileMAP.Seek(26513,CFile::begin); fileMAP.Read(map_file.buf_data_Dop,16384); fileMAP.Close(); //************************************************ // Получаем из данных растровую картинку //тестовый прогон // 1. Загружаем обе текстурные карты для этой планеты CString str_patchTextureMap1; CString str_patchTextureMap2; //** --- ТУТ меняем место,откуда загружать карту (сам файл записан в структуре файла МАР) // "C:\\z\\LEVEL01\\" // "D:\\Work_Z\\RAZDEL\\RES_ZEditor\\Bitmap\\"; CString str_pt = "D:\\Work_Z\\RAZDEL\\RES_ZEditor\\Bitmap\\"; //место, откуда брать текстуры if(map_file.texture_map1.Find("CITY") != -1) //надо заменить в названиях файлов LBM на BMP { str_patchTextureMap1 = str_pt + "CITY.bmp"; str_patchTextureMap2 = str_pt + "CITY2.bmp"; } if(map_file.texture_map1.Find("DESERT") != -1) { str_patchTextureMap1 = str_pt + "DESERT.bmp"; str_patchTextureMap2 = str_pt + "DESERT2.bmp"; } if(map_file.texture_map1.Find("VOLCAN") != -1) { str_patchTextureMap1 = str_pt + "VOLCAN.bmp"; str_patchTextureMap2 = str_pt + "VOLCAN2.bmp"; } if(map_file.texture_map1.Find("JUNGLE") != -1) { str_patchTextureMap1 = str_pt + "JUNGLE.bmp"; str_patchTextureMap2 = str_pt + "JUNGLE2.bmp"; } if(map_file.texture_map1.Find("ARTIC") != -1) //именно ARTIC, с ошибкой записали разрабы! { str_patchTextureMap1 = str_pt + "ARTIC.bmp"; str_patchTextureMap2 = str_pt + "ARTIC2.bmp"; } //Получили пути и названия файлов текстурных карт CString* pstr_pTexture1 = &str_patchTextureMap1; CString* pstr_pTexture2 = &str_patchTextureMap2; //************************************************ //Получаем заголовки текстурных карт (с таблицей палитры вместе) CFile fileTextureMAP1(str_patchTextureMap1, CFile::modeRead); CFile fileTextureMAP2(str_patchTextureMap2, CFile::modeRead); BYTE* p_FileTexture1 = (BYTE*)GlobalAlloc (GMEM_FIXED , 65078); //известный размер текст.карт 320х200=6400 if(p_FileTexture1 == NULL) { MessageBox(" Память не выделена, p_FileTexture1"); } GlobalLock(p_FileTexture1); BYTE* p_FileTexture2 = (BYTE*)GlobalAlloc (GMEM_FIXED , 65078); //известный размер текст.карт 320х200=6400 if(p_FileTexture2 == NULL) { MessageBox(" Память не выделена, p_FileTexture2"); } GlobalLock(p_FileTexture2); fileTextureMAP1.Read(p_FileTexture1,65078); fileTextureMAP2.Read(p_FileTexture2,65078); fileTextureMAP1.Close(); fileTextureMAP2.Close(); //объявляем структуры для файлов текстур и заполняем их TEXTURE_MAP texMAP_stuct1; TEXTURE_MAP texMAP_stuct2; texMAP_stuct1.blok_FileHeader = (LPBITMAPFILEHEADER)p_FileTexture1; texMAP_stuct1.blok_Info = (LPBITMAPINFO)(p_FileTexture1+14); texMAP_stuct1.blok_FileHeader->bfSize = 16*16+1078; texMAP_stuct1.blok_Info->bmiHeader.biHeight = 16; texMAP_stuct1.blok_Info->bmiHeader.biWidth = 16; texMAP_stuct1.blok_Info->bmiHeader.biSizeImage = 16*16; BYTE* p_buffRGB = &texMAP_stuct1.blok_RGBtable[0]; memcpy(p_buffRGB, p_FileTexture1+54, 1024); texMAP_stuct2.blok_FileHeader = (LPBITMAPFILEHEADER)p_FileTexture2; texMAP_stuct2.blok_Info = (LPBITMAPINFO)(p_FileTexture2+14); texMAP_stuct2.blok_FileHeader->bfSize = 16*16+1078; texMAP_stuct2.blok_Info->bmiHeader.biHeight = 16; texMAP_stuct2.blok_Info->bmiHeader.biWidth = 16; texMAP_stuct2.blok_Info->bmiHeader.biSizeImage = 16*16; p_buffRGB = &texMAP_stuct2.blok_RGBtable[0]; memcpy(p_buffRGB, p_FileTexture2+54, 1024); //Заполняем структуру текстурной карты, где вначале идут заголовки //BMP-типа с исправлеными данными под блок (16х16, 256), а потом //последовательно данные блоков от 00 до 239 BYTE* p_lpHeadBMPblok = (BYTE*)GlobalAlloc (GMEM_FIXED , 1078); //заголовок для бмп любого блока memcpy(p_lpHeadBMPblok,texMAP_stuct1.blok_FileHeader,14); //в данном случае для техт.карты 1 memcpy(p_lpHeadBMPblok+14,texMAP_stuct1.blok_Info,40); memcpy(p_lpHeadBMPblok+54,texMAP_stuct1.blok_RGBtable,1024); //********************************************* //Разбиваем и загружаем первую текстурную карту: //а)копируем графические данные текстурной карты в общий буфер BYTE* p_grafikaTK = (BYTE*)GlobalAlloc (GMEM_FIXED , 64000); //известный размер текст.карт 320х200=6400 if(p_grafikaTK == NULL) { MessageBox(" Память не выделена"); } GlobalLock(p_grafikaTK); memcpy(p_grafikaTK,p_FileTexture1+1078,64000); //засандалили данные графики в буфер //b) инициализируем все буфры блоков структуры for(int ddd=0; ddd<240; ddd++) { texMAP_stuct1.blok[ddd] = (BYTE*)GlobalAlloc (GMEM_FIXED , 256); GlobalLock(texMAP_stuct1.blok[ddd]); } int koef; int str_pix; int nbs = 0; int sme = 63680; //отняли сразу 320 //с) копируем графические данные каждого блока в соотв. буфер for(int line = 0; line <12; line ++) //линия блоков { for(str_pix = 0; str_pix<16; str_pix++) //строки пикселей линии блоков { for(koef=0; koef<20; koef++) { memcpy(texMAP_stuct1.blok[nbs+ koef]+240-16*str_pix, p_grafikaTK + sme +16* koef, 16); } sme -=320; } nbs+= koef; } //------------------------------------------------- //Проделываем то же самое со второй текстурной картой и //её структурой memcpy(p_grafikaTK,p_FileTexture2+1078,64000); //засандалили данные графики в буфер //b) инициализируем все буфры блоков структуры for( ddd=0; ddd<240; ddd++) { texMAP_stuct2.blok[ddd] = (BYTE*)GlobalAlloc (GMEM_FIXED , 256); GlobalLock(texMAP_stuct1.blok[ddd]); } nbs = 0; sme = 63680; //с) копируем графические данные каждого блока в соотв. буфер for(line = 0; line <12; line ++) //линия блоков { for(str_pix = 0; str_pix<16; str_pix++) //строки пикселей линии блоков { for(koef=0; koef<20; koef++) { memcpy(texMAP_stuct2.blok[nbs+ koef]+240-16*str_pix, p_grafikaTK + sme +16* koef, 16); } sme -=320; } nbs+= koef; } //******************************************************************** //СТРОИМ битмап уровня по данным МАР-файла из графических блоков обеих //текстурных карт //******************************************************************** // map_file.shirina_map; //в блоках! // map_file.visota_map; //сколько линий блоков в карте уровня /* в тесте обрабатываем 1 линию блоков (т.е. 16 строк пикселей) сразу за один проход обрабатываем одну строку по всем блокам */ CString str_TXT; CString str_Temp; sme =0; nbs = 0; BYTE* buf_imgmap = (BYTE*)GlobalAlloc (GMEM_FIXED, map_file.shirina_map*map_file.visota_map*256); //60 блоков int nom_bk_str = 0; BYTE nom_bl_MAP; BYTE nom_dopDATA_MAP; for(line=0; line=128) { memmove(buf_imgmap + map_file.shirina_map * map_file.visota_map*256 - 256*map_file.shirina_map + nom_bk_str*16 + str_pix*map_file.shirina_map*16 - sme, texMAP_stuct2.blok[nom_bl_MAP] + 16*str_pix,16); } else { memmove(buf_imgmap + map_file.shirina_map * map_file.visota_map*256 -256*map_file.shirina_map + nom_bk_str*16 + str_pix*map_file.shirina_map*16 - sme, texMAP_stuct1.blok[nom_bl_MAP] + 16*str_pix,16); } if(str_pix == 0) { str_Temp.Format("g%i d%i, ", nom_bl_MAP, nom_dopDATA_MAP); str_TXT += str_Temp; } } } nbs+= (nom_bk_str+128-map_file.shirina_map); sme +=256*map_file.shirina_map; str_TXT += "\n\n"; } //тестовый прогон texMAP_stuct1.blok_Info->bmiHeader.biHeight = map_file.visota_map*16; texMAP_stuct1.blok_Info->bmiHeader.biWidth = map_file.shirina_map*16; texMAP_stuct1.blok_Info->bmiHeader.biSizeImage = texMAP_stuct1.blok_Info->bmiHeader.biHeight * texMAP_stuct1.blok_Info->bmiHeader.biWidth; texMAP_stuct1.blok_FileHeader->bfSize = texMAP_stuct1.blok_Info->bmiHeader.biSizeImage+1078; memcpy(p_lpHeadBMPblok,texMAP_stuct1.blok_FileHeader,14); //любая текстурная карта этой планеты memcpy(p_lpHeadBMPblok+14,texMAP_stuct1.blok_Info,40); memcpy(p_lpHeadBMPblok+54,texMAP_stuct1.blok_RGBtable,1024); CFile lineBMP_00("lineBMP_00.bmp",CFile::modeCreate|CFile::modeReadWrite); lineBMP_00.Write(p_lpHeadBMPblok,1078); lineBMP_00.Write(buf_imgmap,texMAP_stuct1.blok_Info->bmiHeader.biSizeImage); lineBMP_00.Close(); int dlina = str_TXT.GetLength(); CFile txtGD("txtGD.txt",CFile::modeCreate|CFile::modeWrite); txtGD.Write(str_TXT,dlina); txtGD.Close(); }