From ee069c90bb7d669fd1401d2ad36b4ba98da79da7 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Tue, 4 Aug 2020 18:42:30 -0700 Subject: [PATCH] Added Tiberian Sun shroud borders for fog of war. --- EXPAND3.mix | Bin 2837633 -> 2894624 bytes code/redalert/display.cpp | 35 +++++++++++++++++++++++++++-------- code/redalert/globals.cpp | 1 + code/redalert/winstub.cpp | 29 +++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/EXPAND3.mix b/EXPAND3.mix index 7cd09ea5870bb90a471a32e7816fd74cd29809ee..74239a4823db4f0141dbade1186e94c49dfcdce4 100644 GIT binary patch delta 56850 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 delta 612 zcmXBQPe_wt90&04`);du>NNlL$8_&DXVZ-oBa=1PqJ!BMWl)E9Y34yX)M240WUGvd z*kKie6;|S)Bs8WmmIhJOib%CS1NdCIrA^ z!lK&-X;O2mv|f!X5um(rERy_WKz0ULJ<)Y<;ey7Gl zffoB(nxcc>^{5R3xA)7B{9ko=br|rC_K&5n30SrOFO1$d^G^jp1>Bil`4+!#M0?l3P8-%44?Yey2V6Gz@`2{=y^cV4%z$EJCp$zx==943*maCLzGrP4%4NJKXR)1VPo=poF zVs`4_b8pBbDlJ{9KW9TVqEcq^;TONpCMsLJVZPAwx=Z}OMKdJnYEQ{Cl@jhumi10# zxF256`BS$L{gEOG_-*>l0;g{qkJkL9Tid$ZK7f-p;9WN qa@tH=Xe(`_3ffMUR7HA{$v{RjQ8k&VhIWvJYN?K_3A@wQR`d^_!o8vZ diff --git a/code/redalert/display.cpp b/code/redalert/display.cpp index 30f624c..6f66e39 100644 --- a/code/redalert/display.cpp +++ b/code/redalert/display.cpp @@ -256,7 +256,22 @@ void DisplayClass::One_Time(void) TransIconsetHD[1] = Image_LoadImage("ui/trans/trans1.png"); TransIconsetHD[2] = Image_LoadImage("ui/trans/trans2.png"); - ShadowShapes = Image_LoadImage("ui/shroud.png"); + //ShadowShapes = Image_LoadImage("ui/shroud.png"); + const void* ShadowShapeBuffers = MFCD::Retrieve("shroud.shp"); + int ShadowShapeWidth = Get_Build_Frame_Width(ShadowShapeBuffers, -1); + int ShadowShapeHeight = Get_Build_Frame_Height(ShadowShapeBuffers, -1); + + CCGlobalShroudRender = true; + INT_PTR shapeptr = Build_Frame(ShadowShapeBuffers, 0, _ShapeBuffer); + ShadowShapes = Image_CreateImageFrom8Bit("ShadowShapes", ShadowShapeWidth, ShadowShapeHeight, (unsigned char *)shapeptr); + + int numFrames = Get_Build_Frame_Count(ShadowShapeBuffers); + for (int i = 1; i < numFrames; i++) { + shapeptr = Build_Frame(ShadowShapeBuffers, i, _ShapeBuffer); + Image_Add8BitImage(ShadowShapes, 0, i, ShadowShapeWidth, ShadowShapeHeight, (unsigned char*)shapeptr, NULL, NULL); + } + CCGlobalShroudRender = false; + Image_t* sceneAlbedoTexture = Image_CreateBlankImage("sceneAlbedoTexture", ScreenWidth, ScreenHeight, true); Image_t* sceneDepthTexture = Image_CreateDepthImage("sceneDepthTexture", ScreenWidth, ScreenHeight); @@ -1917,17 +1932,18 @@ void DisplayClass::CacheVisibleCells(void) { if (Coord_To_Pixel(coord, xpixel, ypixel)) { CellClass* cellptr = &(*this)[coord]; if ((cellptr->Is_Mapped(PlayerPtr) && cellptr->Is_Visible(PlayerPtr)) || Debug_Unshroud) { - if (!(Cell_Shadow(cell, PlayerPtr) >= 0 && !Debug_Unshroud)) { + cellptr->visibleFrame = g_startFrameTime; + cellptr->x_world_pos = xpixel; + cellptr->y_world_pos = ypixel; + cellDisplayCache[numCachedDisplayCells++].ptr = cellptr; + } + else { + if (Cell_Shadow(cell, PlayerPtr) >= 0) { cellptr->visibleFrame = g_startFrameTime; cellptr->x_world_pos = xpixel; cellptr->y_world_pos = ypixel; cellDisplayCache[numCachedDisplayCells++].ptr = cellptr; } - else { - IsShadowPresent = true; - } - } - else { IsShadowPresent = true; } @@ -2282,6 +2298,7 @@ void DisplayClass::Redraw_OIcons(void) *=============================================================================================*/ void DisplayClass::Redraw_Shadow(void) { + GL_EnableBlend(GL_BLEND_MULT); if (IsShadowPresent) { for (int y = -Coord_YLepton(TacticalCoord); y <= TacLeptonHeight; y += CELL_LEPTON_H) { for (int x = -Coord_XLepton(TacticalCoord); x <= TacLeptonWidth; x += CELL_LEPTON_W) { @@ -2316,13 +2333,15 @@ void DisplayClass::Redraw_Shadow(void) //} if (shadow >= 0) { - CC_DrawHD_Shape(ShadowShapes, 0, xpixel, ypixel, WINDOW_TACTICAL, SHAPE_GHOST, NULL, ShadowTrans); + CC_DrawHD_Shape(ShadowShapes, shadow, xpixel, ypixel, WINDOW_TACTICAL, SHAPE_GHOST, NULL, ShadowTrans); } } } } } } + + GL_EnableBlend(GL_BLEND_NONE); } diff --git a/code/redalert/globals.cpp b/code/redalert/globals.cpp index 4648741..8c5d2b0 100644 --- a/code/redalert/globals.cpp +++ b/code/redalert/globals.cpp @@ -552,6 +552,7 @@ HouseClass * PlayerPtr; PaletteClass CCPalette; void* CCGlobalOveridePalette = NULL; bool CCGlobalShadowRender = false; +bool CCGlobalShroudRender = false; int CCPaletteHouseColor = 0; PaletteClass GamePalette; //PaletteClass InGamePalette; diff --git a/code/redalert/winstub.cpp b/code/redalert/winstub.cpp index ea13471..79a8443 100644 --- a/code/redalert/winstub.cpp +++ b/code/redalert/winstub.cpp @@ -572,6 +572,22 @@ Image_t* Image_CreateImageFrom8Bit(const char* name, int Width, int Height, unsi } } + if (CCGlobalShroudRender) { + if (c != 254) + { + r = min(c * 2, 255); + g = min(c * 2, 255); + b = min(c * 2, 255); + a = 255; + } + else { + r = g = b = 0; + a = 0; + } + + + } + buffer[(i * 4) + 0] = r; buffer[(i * 4) + 1] = g; buffer[(i * 4) + 2] = b; @@ -631,6 +647,19 @@ void Image_Add8BitImage(Image_t *image, int HouseId, int ShapeID, int Width, int a = 255; } + if(CCGlobalShroudRender) { + if (c != 254) + { + r = min(c * 2, 255); + g = min(c * 2, 255); + b = min(c * 2, 255); + a = 255; + } + else { + r = g = b = 0; + a = 0; + } + } buffer[(i * 4) + 0] = r; buffer[(i * 4) + 1] = g;