From 9808598a075c6a5a6efb4d17abf96afe0ecc37a0 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Tue, 30 Jun 2020 11:52:05 -0700 Subject: [PATCH] Tiberian Sun tiles are now loaded. --- SCU01EA.INI | 17 +- cache.mix | Bin 0 -> 169176 bytes code/external/imgui/imgui_draw.cpp | 3 + code/redalert/cdata.cpp | 982 +++++------------------------ code/redalert/const.cpp | 6 +- code/redalert/defines.h | 251 ++++---- code/redalert/display.cpp | 6 +- code/redalert/image.h | 8 +- code/redalert/init.cpp | 9 + code/redalert/tdata.cpp | 774 +++++++++++------------ code/redalert/terrain.cpp | 9 +- code/redalert/tileset.cpp | 344 ++++------ code/redalert/win32lib/drawbuff.h | 2 +- code/redalert/winstub.cpp | 14 +- 14 files changed, 839 insertions(+), 1586 deletions(-) create mode 100644 cache.mix diff --git a/SCU01EA.INI b/SCU01EA.INI index b78850f..211d7ed 100644 --- a/SCU01EA.INI +++ b/SCU01EA.INI @@ -103,7 +103,7 @@ Allies=Special [Basic] Name=In the thick of it -Intro=AAGUN +Intro= Brief= Win= Lose= @@ -146,18 +146,7 @@ Height=30 2=8AgAcAACCBAP7/HwCA [UNITS] -0=USSR,4TNK,256,8637,0,Guard,None -1=USSR,4TNK,256,7999,0,Guard,None - -[STRUCTURES] -0=USSR,FACT,256,7863,0,None,0,0 -1=USSR,PROC,256,6843,0,None,0,0 -2=USSR,APWR,256,8133,0,None,0,0 -3=USSR,STEK,256,6723,0,None,0,0 -4=USSR,APWR,256,7113,0,None,0,0 -5=USSR,BARR,256,7883,0,None,0,0 -6=USSR,BIO,256,7095,0,None,0,0 -7=USSR,KENN,256,9035,0,None,0,0 +0=USSR,4TNK,256,7867,0,Guard,None [Base] Player=USSR @@ -173,5 +162,5 @@ Count=0 4=Direct Tanya to destroy the westmost power plants to take them off-line. [Digest] -1=PiAoEnI3N561zfpmapveIIQHqFE= +1=EwOfEw8wu+RAo5MXzV1zOUK2LeU= diff --git a/cache.mix b/cache.mix new file mode 100644 index 0000000000000000000000000000000000000000..0590bab3c6db71ad26a8664aad3b66644b15c98a GIT binary patch literal 169176 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 d TEMPLATE_SHORE41) + break; +// jmarshall end ((void const *&)tplate.ImageData) = NULL; if (tplate.Theater & (1<(this) + td.icons; - } - else { - return reinterpret_cast(this) + ra.icons; - } - } - - uint8_t* Get_Icon_Map() - { - if (td.icons == TD_TILESET_CHECK) { - return reinterpret_cast(this) + td.map; - } - else { - return reinterpret_cast(this) + ra.map; - } - } - - int16_t width; // always 24 (ICON_WIDTH) - int16_t height; // always 24 (ICON_HEIGHT) - int16_t count; // count of cells in set, not same as images - int16_t allocated; // is treated like a bool, always 0 in the file? - - union - { - struct - { - int32_t size; // filesize - int32_t icons; // always 0x00000020 - int32_t palettes; // seems to always be 0x00000000 - int32_t remaps; // unknown, bitfield? - int32_t trans_flag; // array of images length, unknown - int32_t map; // image index for each cell - } td; - - struct - { - int16_t map_width; // tile width in cells - int16_t map_height; // tile height in cells - int32_t size; // filesize - int32_t icons; // always 0x00000028 - int32_t palettes; // seems to always be 0x00000000 - int32_t remaps; // unknown, bitfield? - int32_t trans_flag; // array of images length, unknown - int32_t color_map; // terrain type index, ra only - int32_t map; // image index for each cell - } ra; - }; +struct IsoTileHeader_t { + int TileWidth; + int TileHeight; + int TileImageWidth; + int TileImageHeight; }; -static int IconEntry; -static void* IconData; -static IconControlType* LastIconset; -static uint8_t* StampPtr; -static uint8_t* TransFlagPtr; -static uint8_t* MapPtr; -static int IconWidth; -static int IconHeight; -static int IconSize; -static int IconCount; +byte TempTSStampData[48 * 24 * 4]; -void __cdecl Init_Stamps(IconControlType* iconset) -{ - if (iconset && LastIconset != iconset) { - IconCount = (iconset->count); - IconWidth = (iconset->width); - IconHeight = (iconset->height); - LastIconset = iconset; - IconSize = IconWidth * IconHeight; - - // TD and RA tileset headers are slightly different, so check a constant that only exists in one type. - if ((iconset->td.icons) == TD_TILESET_CHECK) { - MapPtr = reinterpret_cast(iconset) + (iconset->td.map); - StampPtr = reinterpret_cast(iconset) + (iconset->td.icons); - TransFlagPtr = reinterpret_cast(iconset) + (iconset->td.trans_flag); - } - else { - MapPtr = reinterpret_cast(iconset) + (iconset->ra.map); - StampPtr = reinterpret_cast(iconset) + (iconset->ra.icons); - TransFlagPtr = reinterpret_cast(iconset) + (iconset->ra.trans_flag); - } - } -} - -void __cdecl Buffer_Draw_Stamp2(GraphicViewPortClass& viewport, IconControlType* tileset, int icon, int x, int y, const void* remapper) +struct IsoTileImageHeader { - if (!tileset) { - return; + int TileX; + int TileY; + uint8_t* GetExtraData(IsoTile *tile) + { + return reinterpret_cast(tile) + ExtraOffset; } - if (LastIconset != tileset) { - Init_Stamps(tileset); + uint8_t* GetZData(IsoTile* tile) + { + return reinterpret_cast(tile) + ZDataoffset; + } + + uint8_t* GetExtraZData(IsoTile* tile) + { + return reinterpret_cast(tile) + ExtraZOffset; + } + + uint8_t* GetData() { + return reinterpret_cast(this) + sizeof(IsoTileImageHeader); } - int32_t icon_index = MapPtr != nullptr ? MapPtr[icon] : icon; + // https://xhp.xwis.net/documents/TMP_TS_Format.html + uint8_t* GetRasterizedData() { + memset(TempTSStampData, 0, sizeof(TempTSStampData)); + uint8_t* tileData = GetData(); + byte* w_line = TempTSStampData; + int x = 24; + int global_cx = 48; + int cx = 0; + for (int y = 0; y < 12; y++) + { + cx += 4; + x -= 2; + memcpy(w_line + x, tileData, cx); + tileData += cx; + w_line += global_cx; + } + for (; y < 23; y++) + { + cx -= 4; + x += 2; + memcpy(w_line + x, tileData, cx); + tileData += cx; + w_line += global_cx; + } - if (icon_index < IconCount) { - - int32_t fullpitch = viewport.Get_Full_Pitch(); //(viewport.Get_Pitch() + viewport.Get_XAdd() + viewport.Get_Width()); - uint8_t* dst = (x * 4) + (y * 4) * fullpitch + (uint8_t*)(viewport.Get_Offset()); - int32_t blitpitch = fullpitch - IconWidth; - uint8_t* src = &StampPtr[IconSize * icon_index]; - - if (remapper) { - const uint8_t* remap = static_cast(remapper); - for (int i = 0; i < IconHeight; ++i) { - for (int j = 0; j < IconWidth; ++j) { - uint8_t cur_byte = remap[*src++]; - - if (cur_byte) { - dst[0] = backbuffer_data_raw[(cur_byte * 3) + 0]; - dst[1] = backbuffer_data_raw[(cur_byte * 3) + 1]; - dst[2] = backbuffer_data_raw[(cur_byte * 3) + 2]; - dst[3] = 255; - } - - dst+=4; - } - - dst += blitpitch; - } - - } - else if (TransFlagPtr[icon_index]) { - for (int i = 0; i < IconHeight; ++i) { - for (int j = 0; j < IconWidth; ++j) { - uint8_t cur_byte = *src++; - - if (cur_byte) { - dst[0] = backbuffer_data_raw[(cur_byte * 3) + 0]; - dst[1] = backbuffer_data_raw[(cur_byte * 3) + 1]; - dst[2] = backbuffer_data_raw[(cur_byte * 3) + 2]; - dst[3] = 255; - } - - dst += 4; - } - - dst += blitpitch; - } - } - else { - for (int32_t i = 0; i < IconHeight; ++i) { - FastScanlinePaletteBlit(dst, src, IconWidth); - dst += fullpitch; - src += IconWidth * 4; - } - } + return TempTSStampData; } -} + + int32_t ExtraOffset; + int32_t ZDataoffset; + int32_t ExtraZOffset; + signed int ExtraX; + signed int ExtraY; + int ExtraWidth; + int ExtraHeight; + struct Flags + { + unsigned int HasExtraData : 1; //1 + unsigned int HasZData : 1; //2 + unsigned int HasDamagedData : 1; //4 + // invalid cause memory wasn'y cleared so all bitfields are at 0xCD by default + //unsigned int Bit8 : 1; //8 + //unsigned int Bit16 : 1; //16 + //unsigned int Bit32 : 1; //32 + //unsigned int Bit64 : 1; //64 + //unsigned int Bit128 : 1; //128 + + }; + unsigned char Height; + unsigned char TileType; + unsigned char RampType; + RGBClass LowRGB; + RGBClass HighRGB; + unsigned char Padding[3]; +}; + +class IsoTile { +public: + int TileImageWidth() { return header.TileImageWidth; } + int TileImageHeight() { return header.TileImageHeight; } + + IsoTileImageHeader *GetTileInfo(int idx) { + uint8_t* ptr = reinterpret_cast(this); + ptr += sizeof(IsoTileHeader_t); + uint32_t* offsets = (uint32_t*)ptr; + IsoTileImageHeader* tileImageHeaders = (IsoTileImageHeader * )(((uint8_t*)this) + offsets[idx]); + return tileImageHeaders; + } + int NumTiles(void) { return header.TileWidth * header.TileHeight; } +private: + IsoTileHeader_t header; +}; Image_t* Load_StampHD(int theater, const char* iconName, const void* icondata) { char filename[2048]; Image_t* image = NULL; - IconControlType* tileset = (IconControlType*)icondata; - - if (!tileset) { - return NULL; - } - - if (LastIconset != tileset) { - Init_Stamps(tileset); - } + IsoTile* isoTile = (IsoTile*)icondata; + if (!isoTile) { + return NULL; + } + // This is because were trying to avoid parsing the XML's and the filenames aren't consistant. const char* theaterName = Theaters[theater].Name; - for (int i = 0; i < IconCount; i++) + for (int i = 0; i < isoTile->NumTiles(); i++) { char filename[512]; char fixedIconName[512]; @@ -256,9 +197,9 @@ Image_t* Load_StampHD(int theater, const char* iconName, const void* icondata) { } void Get_Stamp_Size(const void* icondata, int* width, int* height) { - IconControlType* tileset = (IconControlType*)icondata; + IsoTile* isoTile = (IsoTile*)icondata; - if (!tileset) { + if (!isoTile) { for (int i = 0; i < MAX_IMAGE_SHAPES; i++) { *width = -1; *height = -1; @@ -266,37 +207,19 @@ void Get_Stamp_Size(const void* icondata, int* width, int* height) { return; } - if (LastIconset != tileset) { - Init_Stamps(tileset); - } - for (int i = 0; i < MAX_IMAGE_SHAPES; i++) { - width[i] = IconWidth; - height[i] = IconHeight; + width[i] = isoTile->TileImageWidth(); + height[i] = isoTile->TileImageHeight(); } } -Image_t * Load_Stamp(const char *name, const void* icondata) +Image_t * Load_Stamp(const char *name, const void* icondata, void* terrainPalette) { - IconControlType* tileset = (IconControlType*)icondata; - - if (!tileset) { - return NULL; - } - - if (LastIconset != tileset) { - Init_Stamps(tileset); - } - - - int icon_index = 0; - - if (icon_index >= IconCount) { + IsoTile* isoTile = (IsoTile*)icondata; + if (!isoTile) { return NULL; } - uint8_t* src = &StampPtr[IconSize * icon_index]; - // Check to see if the image is already loaded. { Image_t* image = Find_Image(name); @@ -305,30 +228,35 @@ Image_t * Load_Stamp(const char *name, const void* icondata) } } - Image_t *image = Image_CreateImageFrom8Bit(name, IconWidth, IconHeight, (unsigned char*)src); - image->IconMapPtr = MapPtr; - if (IconCount == 1) - return image; + uint8_t* src = isoTile->GetTileInfo(0)->GetRasterizedData(); + Image_t *image = Image_CreateImageFrom8Bit(name, isoTile->TileImageWidth(), isoTile->TileImageHeight(), (unsigned char*)src, NULL, (unsigned char *)terrainPalette); + if (image == NULL) { + return NULL; + } - for (int i = 1; i < IconCount; i++) { - icon_index = i; - src = &StampPtr[IconSize * icon_index]; - Image_Add8BitImage(image, 0, i, IconWidth, IconHeight, src, NULL); + image->isoTileInfo = isoTile; + + for (int i = 1; i < isoTile->NumTiles(); i++) { + src = isoTile->GetTileInfo(i)->GetRasterizedData(); + Image_Add8BitImage(image, 0, i, isoTile->TileImageWidth(), isoTile->TileImageHeight(), src, NULL, (unsigned char*)terrainPalette); } return image; } int Stamp_GetIconIndex(Image_t* iconImage, int icon) { - uint8_t* MapPtr = (uint8_t*)iconImage->IconMapPtr; - return MapPtr != nullptr ? MapPtr[icon] : icon; + return icon; } void __cdecl Buffer_Draw_Stamp_Clip2(GraphicViewPortClass& viewport, const void *icondata, int icon, int x, int y, const void* remapper, int left, int top, int right, int bottom) { Image_t* iconImage = (Image_t*)icondata; - uint8_t* MapPtr = (uint8_t * )iconImage->IconMapPtr; - int icon_index = MapPtr != nullptr ? MapPtr[icon] : icon; + IsoTile* isoTile = iconImage->isoTileInfo; + + if (icon > isoTile->NumTiles()) + icon = isoTile->NumTiles() - 1; + IsoTileImageHeader* isoStampImage = isoTile->GetTileInfo(icon); + int icon_index = icon; { int blit_height = CELL_PIXEL_H; int blit_width = CELL_PIXEL_W; @@ -339,14 +267,14 @@ void __cdecl Buffer_Draw_Stamp_Clip2(GraphicViewPortClass& viewport, const void int ystart = top + y; - if (xstart < width && ystart < height && IconHeight + ystart > top && IconWidth + xstart > left) { + if (xstart < width && ystart < height && iconImage->isoTileInfo->TileImageHeight() + ystart > top && iconImage->isoTileInfo->TileImageWidth() + xstart > left) { if (xstart < left) { // src += left - xstart; blit_width -= left - xstart; xstart = left; } - int src_pitch = IconWidth - blit_width; + int src_pitch = iconImage->isoTileInfo->TileImageWidth() - blit_width; if (blit_width + xstart > width) { src_pitch += blit_width - (width - xstart); @@ -354,7 +282,7 @@ void __cdecl Buffer_Draw_Stamp_Clip2(GraphicViewPortClass& viewport, const void } if (top > ystart) { - blit_height = IconHeight - (top - ystart); + blit_height = iconImage->isoTileInfo->TileImageHeight() - (top - ystart); // src += IconWidth * (top - ystart); ystart = top; } @@ -430,19 +358,19 @@ extern "C" void __cdecl Buffer_Draw_Stamp_Clip(void const* this_object, void con } extern "C" void __cdecl Buffer_Draw_Stamp(void const* thisptr, void const* icondata, int icon, int x_pixel, int y_pixel, void const* remap) { - Buffer_Draw_Stamp2(*((GraphicViewPortClass*)thisptr), (IconControlType*)icondata, icon, x_pixel, y_pixel, remap); + // NOT USED } uint8_t* Get_Icon_Set_Map(void* temp) { - if (temp != nullptr) { - if ((static_cast(temp)->td.icons) == TD_TILESET_CHECK) { - return static_cast(temp) + (static_cast(temp)->td.icons); - } - else { - return static_cast(temp) + (static_cast(temp)->ra.icons); - } - } + //if (temp != nullptr) { + // if ((static_cast(temp)->td.icons) == TD_TILESET_CHECK) { + // return static_cast(temp) + (static_cast(temp)->td.icons); + // } + // else { + // return static_cast(temp) + (static_cast(temp)->ra.icons); + // } + //} return nullptr; } diff --git a/code/redalert/win32lib/drawbuff.h b/code/redalert/win32lib/drawbuff.h index 67ba5fe..a90e02c 100644 --- a/code/redalert/win32lib/drawbuff.h +++ b/code/redalert/win32lib/drawbuff.h @@ -63,7 +63,7 @@ extern "C" { struct Image_t; -Image_t* Load_Stamp(const char* name, const void* icondata); +Image_t* Load_Stamp(const char* name, const void* icondata, void *terrainPalette); int Stamp_GetIconIndex(Image_t* iconImage, int icon); void Get_Stamp_Size(const void* icondata, int *width, int *height); Image_t* Load_StampHD(int theater, const char* iconName, const void *icondata); diff --git a/code/redalert/winstub.cpp b/code/redalert/winstub.cpp index 63cc9bc..0c02f7d 100644 --- a/code/redalert/winstub.cpp +++ b/code/redalert/winstub.cpp @@ -389,7 +389,7 @@ Image_t *Find_Image(const char* name) { return NULL; } -Image_t* Image_CreateImageFrom8Bit(const char* name, int Width, int Height, unsigned char *data, unsigned char* remap) { +Image_t* Image_CreateImageFrom8Bit(const char* name, int Width, int Height, unsigned char *data, unsigned char* remap, unsigned char* ccpalete) { int64_t hash = generateHashValue(name, strlen(name)); int image_table_size = loaded_images.size(); @@ -405,7 +405,9 @@ Image_t* Image_CreateImageFrom8Bit(const char* name, int Width, int Height, unsi } } - unsigned char* ccpalete = (unsigned char*)CCPalette.Get_Data(); + if (ccpalete == NULL) + ccpalete = (unsigned char*)CCPalette.Get_Data(); + Image_t* image = new Image_t(); unsigned char *buffer = new unsigned char[Width * Height * 4]; @@ -427,6 +429,9 @@ Image_t* Image_CreateImageFrom8Bit(const char* name, int Width, int Height, unsi b = 0; a = 128; } + else if (r == 0 && g == 0 && b == 0) { + r = g = b = a = 0; + } else if (c != 0) { a = 255; } @@ -459,9 +464,12 @@ Image_t* Image_CreateImageFrom8Bit(const char* name, int Width, int Height, unsi return image; } -void Image_Add8BitImage(Image_t *image, int HouseId, int ShapeID, int Width, int Height, unsigned char* data, unsigned char* remap) { +void Image_Add8BitImage(Image_t *image, int HouseId, int ShapeID, int Width, int Height, unsigned char* data, unsigned char* remap, unsigned char *palette) { unsigned char* buffer = new unsigned char[Width * Height * 4]; unsigned char* ccpalete = (unsigned char*)CCPalette.Get_Data(); + if (palette) { + ccpalete = palette; + } if (image->width != Width || image->height != Height) { assert(!"Image_Add8BitImage: Invalid new dimensions!");