From 4ba5c0d72c882b97236879fa8676766b1afe8d68 Mon Sep 17 00:00:00 2001 From: Ben Lankamp Date: Sat, 4 Jul 2020 01:17:53 +0200 Subject: [PATCH 1/3] * Added LCW_Uncomp from Chronoshift * Added better sidebar tiling graphics by Thomson26 * Changed alignment of elements based on new graphics --- POWERHD.SHP | Bin 0 -> 2419 bytes SIDEFILLER.SHP | Bin 0 -> 9621 bytes SIDEHD.SHP | Bin 0 -> 4207 bytes code/redalert/lcw.h | 3 +- code/redalert/lzw.cpp | 235 +++++++++++++++++++++++++++++++++++++- code/redalert/power.cpp | 19 ++- code/redalert/power.h | 1 + code/redalert/shape.cpp | 2 +- code/redalert/sidebar.cpp | 39 +++++-- code/redalert/sidebar.h | 3 + 10 files changed, 286 insertions(+), 16 deletions(-) create mode 100644 POWERHD.SHP create mode 100644 SIDEFILLER.SHP create mode 100644 SIDEHD.SHP diff --git a/POWERHD.SHP b/POWERHD.SHP new file mode 100644 index 0000000000000000000000000000000000000000..83427e59dfae3631b6768c5c05026dc97ce09f75 GIT binary patch literal 2419 zcmZuzZ;Ts96`%FmcPV7obGPI8L_o7{YgpHq+lAf{hy$C%QVEJ2CsFPa>q0JIqNqXW zN~P9S3-bKkUEeM4wMay1B(4nt@%>41_Z6Zx2>JyfR6zx;kS;u@LG%MF z?Y!NYd2imldGGfd6OA5%me9Yl2+bnY8~uMZ`=Na4p?vm{QSbkrWhtXLR!Z1f?V3pc zSV>J+sFaN;jH?xQEAO`S>9f<7mSBZYBb3*nN! z6me|FQA154qLon8aqx_TqP=hDn+!mfQY<&{dg50e5KN^ z&@`o$g$25j9H^~O3iH~cOjD4wpQcuo*K05CNS$yanMn z1>-V)@E>szCDvm_w9oZe9(yqtg7>(zLT`znX{i%RhkG)tiHQ(W-JZ_CVQwGEFneb% zvs9P)ycDP-nzoHv+!nhzly7x>!eu^u275biWWxH^Z!?)CTz6+s-PpV6xyQhQVX+?a zGQS5;n;VA7Y`2cr*0Uz;HZOZkY2!K*e#iBO2Tk({rcm8If9I5mW`?ItrhKBMEqSlE zb;X3l?U<)IEiBbH24-+?{nw^c`8+e;h7EDI4o0jcBDBhfCEs)2S|ZF|B3$QvODMZJ zd?Xu|n4Ni!NmyI^o?qHLnjLLp^GFr~GIRTI)+d=?Ewx~nqw^cDW{oemz{b`uvUq<; zShVxItjcS_n`p-PJ|6eI&wqFGpIMRT{PsVxsGjq1CpWF5h~g+}5j>y$0Mwfk$MLjJ zR2=8E^a&ad>l>GHOu-`2@cA5z!g0U8JBIQ;$-eKlSd=Sqt&x{|26jZ4L{~9EKMA`b z!PB|FpcNJj-_D_FOk@z`quf)dbnD+aX6Ihs0wFQ+uY?cG<=%wgFSdBBjkgM0kP;?} zLn3Vz#ku$KQ7E7xPm-N0V>};Vj|TxtnT^MH24n9G#@x=xqx)Y+*T(Lzp&yOi|0^^- zF-Vf#ag<*UVr|<|5X2Ni?g!dd*xK2P-r0-pe+@yihO+2>Xh74;K=T_DkVW7RmHQu2 z{(risK$k1+-*x|l-erAExQaJEK)&a~ms<4Vywo~Qf?$!zem`%I4v;0SX(;Xldn|yE z2N1W&CwLq-IJ{)=1gx-Ny=$l-=_m1Mrr&a{t!oCJ;r;%`YX({yDY)a1T#IWh;;*ni zDzRkI+xffUcNaYtp`R}j9*rg)g`+K@^^GSo?##NE;dy!I8yTirYwMK^I@TJV%!cRP z{RRy#x4dB`vqX%Kg9k0B2G~oI_{9I^=HD{-^;W&*v843JkbnB$Gs70W%;Q69;`+`H%;D4K_Lofbz3qc0k7KCyWc{+~663Qh zFw3QoS;m`-2UmWa4z_nP7R9(o-=FZ$GhaQEH4E}3|b7p(PtIrBN$wi6S5oHQ<#8jo6_SJj;tHYTxbU9uEpv9F z*_2X84I8rB;as3YOrt-uhAA*fI0sr0P`P^HE$jpy|8avx|FJD7}D ScpSir%WTCR-7FkNd;bAz`08~4 literal 0 HcmV?d00001 diff --git a/SIDEFILLER.SHP b/SIDEFILLER.SHP new file mode 100644 index 0000000000000000000000000000000000000000..c1f1b9015cfbc3ba7cd3e682e0a7a0f5e24ded35 GIT binary patch literal 9621 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 z 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 literal 0 HcmV?d00001 diff --git a/SIDEHD.SHP b/SIDEHD.SHP new file mode 100644 index 0000000000000000000000000000000000000000..00e628d5284a51111256de9abb36360c0d6bf0a7 GIT binary patch literal 4207 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 + uint8_t* putend = putstart + bytes; + uint8_t* putp = putstart; + const uint8_t* getp = static_cast(src); + // const uint8_t *getstart = getp; + + // If first byte is 0, the all offsets are relative to current position. Otherwise some are absolute to the start of the + // buffer, meaning only ~64KB can be compressed effectively. Compressor implemented in this file uses size to determine + // compression scheme used. + if (*getp == 0) { + // captainslog_debug("LCW Relative Decompression... "); + getp++; + + while (putp < putend) { + uint8_t flag; + uint16_t cpysize; + uint16_t offset; + + flag = *getp++; + + if (flag & 0x80) { + if (flag & 0x40) { + cpysize = (flag & 0x3F) + 3; + // long set 0b11111110 + if (flag == 0xFE) { + cpysize = *getp++; + cpysize += (*getp++) << 8; + + if (cpysize > putend - putp) { + cpysize = putend - putp; + } + + // captainslog_debug("0b11111110 Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 3, dest - + // start, cpysize); + memset(putp, (*getp++), cpysize); + putp += cpysize; + } + else { + uint8_t* s; + // long move, abs 0b11111111 + if (flag == 0xFF) { + cpysize = *getp++; + cpysize += (*getp++) << 8; + + if (cpysize > putend - putp) { + cpysize = putend - putp; + } + + offset = *getp++; + offset += (*getp++) << 8; + + // extended format for VQA32 and large WSA files. + s = putp - offset; + + // captainslog_debug("0b11111111 Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart - + // 5, dest - start, cpysize, offset); + for (; cpysize > 0; --cpysize) { + *putp++ = *s++; + } + // short move abs 0b11?????? + } + else { + if (cpysize > putend - putp) { + cpysize = putend - putp; + } + + offset = *getp++; + offset += (*getp++) << 8; + + // extended format for VQA32 and large WSA files. + s = putp - offset; + + // captainslog_debug("0b11?????? Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart - + // 3, dest - start, cpysize, offset); + for (; cpysize > 0; --cpysize) { + *putp++ = *s++; + } + } + } + // short copy 0b10?????? + } + else { + if (flag == 0x80) { + // captainslog_debug("0b10?????? Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 1, dest - + // start, 0); + return putp - putstart; + } + + cpysize = flag & 0x3F; + + if (cpysize > putend - putp) { + cpysize = putend - putp; + } + + // captainslog_debug("0b10?????? Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 1, dest - start, + // cpysize); + for (; cpysize > 0; --cpysize) { + *putp++ = *getp++; + } + } + // short move rel 0b0??????? + } + else { + cpysize = (flag >> 4) + 3; + + if (cpysize > putend - putp) { + cpysize = putend - putp; + } + + offset = ((flag & 0xF) << 8) + (*getp++); + // captainslog_debug("0b0??????? Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart - 2, dest - + // start, cpysize, offset); + for (; cpysize > 0; --cpysize) { + *putp = *(putp - offset); + putp++; + } + } + } + } + else { + // captainslog_debug("LCW Decompression... "); + + while (putp < putend) { + uint8_t flag; + uint16_t cpysize; + uint16_t offset; + + flag = *getp++; + + if (flag & 0x80) { + if (flag & 0x40) { + cpysize = (flag & 0x3F) + 3; + // long set 0b11111110 + if (flag == 0xFE) { + cpysize = *getp++; + cpysize += (*getp++) << 8; + + if (cpysize > putend - putp) { + cpysize = putend - putp; + } + + // captainslog_debug("0b11111110 Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 3, dest - + // start, cpysize); + memset(putp, (*getp++), cpysize); + putp += cpysize; + } + else { + uint8_t* s; + // long move, abs 0b11111111 + if (flag == 0xFF) { + cpysize = *getp++; + cpysize += (*getp++) << 8; + + if (cpysize > putend - putp) { + cpysize = putend - putp; + } + + offset = *getp++; + offset += (*getp++) << 8; + s = putstart + offset; + + // captainslog_debug("0b11111111 Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart - + // 5, dest - start, cpysize, offset); + for (; cpysize > 0; --cpysize) { + *putp++ = *s++; + } + // short move abs 0b11?????? + } + else { + if (cpysize > putend - putp) { + cpysize = putend - putp; + } + + offset = *getp++; + offset += (*getp++) << 8; + s = putstart + offset; + + // captainslog_debug("0b11?????? Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart - + // 3, dest - start, cpysize, offset); + for (; cpysize > 0; --cpysize) { + *putp++ = *s++; + } + } + } + // short copy 0b10?????? + } + else { + if (flag == 0x80) { + // captainslog_debug("0b10?????? Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 1, dest - + // start, 0); + return putp - putstart; + } + + cpysize = flag & 0x3F; + + if (cpysize > putend - putp) { + cpysize = putend - putp; + } + + // captainslog_debug("0b10?????? Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 1, dest - start, + // cpysize); + for (; cpysize > 0; --cpysize) { + *putp++ = *getp++; + } + } + // short move rel 0b0??????? + } + else { + cpysize = (flag >> 4) + 3; + + if (cpysize > putend - putp) { + cpysize = putend - putp; + } + + offset = ((flag & 0xF) << 8) + (*getp++); + // captainslog_debug("0b0??????? Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart - 2, dest - + // start, cpysize, offset); + for (; cpysize > 0; --cpysize) { + *putp = *(putp - offset); + putp++; + } + } + } + } + + return putp - putstart; +} \ No newline at end of file diff --git a/code/redalert/power.cpp b/code/redalert/power.cpp index 8c4edea..195068d 100644 --- a/code/redalert/power.cpp +++ b/code/redalert/power.cpp @@ -50,6 +50,8 @@ void const* PowerClass::PowerShape; void const* PowerClass::PowerBarShape; +void const* PowerClass::PowerBarShapeHD; + PowerClass::PowerButtonClass PowerClass::PowerButton; @@ -139,8 +141,12 @@ void PowerClass::One_Time(void) PowerButton.Y = POWER_Y * RESFACTOR; PowerButton.Width = (POWER_WIDTH * RESFACTOR) - 1; PowerButton.Height = ScreenHeight - (POWER_Y * RESFACTOR);// POWER_HEIGHT* RESFACTOR; + PowerShape = MFCD::Retrieve("POWER.SHP"); PowerBarShape = MFCD::Retrieve("POWERBAR.SHP"); + + RawFileClass powerShapeFile("POWERHD.SHP"); + if (powerShapeFile.Is_Available()) PowerBarShapeHD = Load_Alloc_Data(powerShapeFile); } @@ -187,17 +193,20 @@ void PowerClass::Draw_It(bool complete) /* ** Hires power strip is too big to fit into a shape so it is in two parts */ - CC_Draw_Shape(PowerBarShape, 0, ScreenWidth - (640 - (240 * RESFACTOR)), (88 * RESFACTOR), WINDOW_MAIN, flags | SHAPE_NORMAL | SHAPE_WIN_REL, remap); + CC_Draw_Shape(PowerBarShapeHD, 0, ScreenWidth - (640 - (240 * RESFACTOR)), (84 * RESFACTOR), WINDOW_MAIN, flags | SHAPE_NORMAL | SHAPE_WIN_REL, remap); - int bottomOfBar = (88 * RESFACTOR) + 56; + int bottomOfBar = (84 * RESFACTOR) + 56; - while (bottomOfBar < PowerButton.Height + 42) + while (bottomOfBar < PowerButton.Height + 32) { - CC_Draw_Shape(PowerBarShape, 1, ScreenWidth - (640 - (240 * RESFACTOR)), bottomOfBar, WINDOW_MAIN, flags | SHAPE_NORMAL | SHAPE_WIN_REL, remap); + CC_Draw_Shape(PowerBarShapeHD, 1, ScreenWidth - (640 - (240 * RESFACTOR)), bottomOfBar, WINDOW_MAIN, flags | SHAPE_NORMAL | SHAPE_WIN_REL, remap); bottomOfBar += 8 * RESFACTOR; } - int bottom = bottomOfBar + (28 * RESFACTOR); + // bottom + CC_Draw_Shape(PowerBarShapeHD, 2, ScreenWidth - (640 - (240 * RESFACTOR)), bottomOfBar, WINDOW_MAIN, flags | SHAPE_NORMAL | SHAPE_WIN_REL, remap); + + int bottom = bottomOfBar + (36 * RESFACTOR); /* ** Determine how much the power production exceeds or falls short diff --git a/code/redalert/power.h b/code/redalert/power.h index d030986..1ec9aaa 100644 --- a/code/redalert/power.h +++ b/code/redalert/power.h @@ -113,6 +113,7 @@ class PowerClass : public RadarClass */ static void const * PowerShape; static void const * PowerBarShape; + static void const * PowerBarShapeHD; }; #endif diff --git a/code/redalert/shape.cpp b/code/redalert/shape.cpp index 14dbc28..4a1b343 100644 --- a/code/redalert/shape.cpp +++ b/code/redalert/shape.cpp @@ -1138,7 +1138,7 @@ void* Build_Frame2(void* shape, uint16_t frame, void* buffer) frame_data = &shape_data[(le32toh(offset_buff[0]) & 0xFFFFFF) + 768]; } - frame_size = LCW_Uncomp(frame_data, buffer, frame_size); + frame_size = LCW_Uncomp_CS(frame_data, buffer, frame_size); } else { // captainslog_debug("Decoding XOR frame."); diff --git a/code/redalert/sidebar.cpp b/code/redalert/sidebar.cpp index d73928f..8cec147 100644 --- a/code/redalert/sidebar.cpp +++ b/code/redalert/sidebar.cpp @@ -83,6 +83,9 @@ void* SidebarClass::SidebarShape = NULL; void* SidebarClass::SidebarMiddleShape = NULL; void* SidebarClass::SidebarBottomShape = NULL; +void* SidebarClass::SidebarShapeHD = NULL; +void* SidebarClass::SidebarFillerHD = NULL; + /*************************************************************************** ** This holds the translucent table for use with the construction clock @@ -122,6 +125,8 @@ SidebarClass::StripClass::SelectButton[COLUMNS][MAX_VISIBLE]; ** Shape data pointers */ void* SidebarClass::StripClass::LogoShapes = NULL; +void* SidebarClass::StripClass::LogoShapesHD = NULL; + void const* SidebarClass::StripClass::ClockShapes; void const* SidebarClass::StripClass::SpecialShapes[SPC_COUNT]; @@ -252,6 +257,16 @@ void SidebarClass::One_Time(void) if (SidebarShape == NULL) { SidebarShape = (void*)MFCD::Retrieve("SIDEBAR.SHP"); } + + if (SidebarShapeHD == NULL) { + RawFileClass sideBarFile("SIDEHD.SHP"); + if (sideBarFile.Is_Available() ) SidebarShapeHD = Load_Alloc_Data(sideBarFile); + } + + if (SidebarFillerHD == NULL) { + RawFileClass sideBarFillerFile("SIDEFILLER.SHP"); + if (sideBarFillerFile.Is_Available()) SidebarFillerHD = Load_Alloc_Data(sideBarFillerFile); + } } @@ -774,17 +789,27 @@ void SidebarClass::Draw_It(bool complete) /* ** Draw the outline box around the sidebar buttons. */ - int shape = complete ? 0 : 1; - CC_Draw_Shape(SidebarShape, 0, SIDE_X * RESFACTOR, 8 * RESFACTOR, WINDOW_MAIN, SHAPE_WIN_REL); - CC_Draw_Shape(SidebarMiddleShape, shape, SIDE_X * RESFACTOR, (8 + 80) * RESFACTOR, WINDOW_MAIN, SHAPE_WIN_REL); + int topY = 90 * RESFACTOR; + int frameNr = 0; - CC_Draw_Shape(SidebarBottomShape, shape, SIDE_X * RESFACTOR, ScreenHeight - (80 * RESFACTOR) + 3, WINDOW_MAIN, SHAPE_WIN_REL); + for (int i = 0; i < Column[0].MaxButtonsVisible; i++) + { + CC_Draw_Shape(SidebarShapeHD, frameNr, SIDE_X * RESFACTOR, topY, WINDOW_MAIN, SHAPE_WIN_REL, 0); + topY += 24 * RESFACTOR; + + if (topY > ScreenHeight) break; + if (frameNr < 6) frameNr++; + } + + topY += 10 * RESFACTOR; + CC_Draw_Shape(SidebarFillerHD, 0, SIDE_X * RESFACTOR, topY, WINDOW_MAIN, SHAPE_WIN_REL, 0); Repair.Draw_Me(true); Upgrade.Draw_Me(true); Zoom.Draw_Me(true); + LogicPage->Unlock(); } } @@ -1312,6 +1337,7 @@ void SidebarClass::StripClass::Reload_LogoShapes(void) "stripna.shp", //HOUSE_GOOD "stripus.shp", //HOUSE_BAD }; + int houseloaded = 0; /* @@ -1697,9 +1723,6 @@ void SidebarClass::StripClass::Draw_It(bool complete) /* ** New sidebar needs to be drawn not filled */ - if (BuildableCount < MaxButtonsVisible) { - CC_Draw_Shape(LogoShapes, ID, X + (2 * RESFACTOR), Y, WINDOW_MAIN, SHAPE_WIN_REL | SHAPE_NORMAL, 0); - } /* ** Redraw the scroll buttons. @@ -2511,4 +2534,4 @@ void SidebarClass::Zoom_Mode_Control(void) } } #endif -} \ No newline at end of file +} diff --git a/code/redalert/sidebar.h b/code/redalert/sidebar.h index ce75364..3993e67 100644 --- a/code/redalert/sidebar.h +++ b/code/redalert/sidebar.h @@ -108,6 +108,8 @@ class SidebarClass: public PowerClass }; static void * SidebarShape; + static void * SidebarShapeHD; + static void * SidebarFillerHD; static void * SidebarMiddleShape; //Only used in Win95 version static void * SidebarBottomShape; //Only used in Win95 version @@ -319,6 +321,7 @@ class SidebarClass: public PowerClass ** placeholder pieces on the side bar. */ static void * LogoShapes; + static void * LogoShapesHD; /* ** This points to the animation sequence of frames used to mark the passage of time From 9b8fbe098b96f7c81f40914849251c0eacdb9d2b Mon Sep 17 00:00:00 2001 From: Ben Lankamp Date: Sat, 4 Jul 2020 11:24:07 +0200 Subject: [PATCH 2/3] Last touches on power and side bar. --- code/redalert/power.cpp | 9 +++++---- code/redalert/sidebar.cpp | 7 ++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/code/redalert/power.cpp b/code/redalert/power.cpp index 195068d..c9b6a67 100644 --- a/code/redalert/power.cpp +++ b/code/redalert/power.cpp @@ -193,14 +193,15 @@ void PowerClass::Draw_It(bool complete) /* ** Hires power strip is too big to fit into a shape so it is in two parts */ - CC_Draw_Shape(PowerBarShapeHD, 0, ScreenWidth - (640 - (240 * RESFACTOR)), (84 * RESFACTOR), WINDOW_MAIN, flags | SHAPE_NORMAL | SHAPE_WIN_REL, remap); + CC_Draw_Shape(PowerBarShapeHD, 0, ScreenWidth - (640 - (240 * RESFACTOR)), (88 * RESFACTOR), WINDOW_MAIN, flags | SHAPE_NORMAL | SHAPE_WIN_REL, remap); - int bottomOfBar = (84 * RESFACTOR) + 56; + + int bottomOfBar = (88 + 56) * RESFACTOR; - while (bottomOfBar < PowerButton.Height + 32) + while ( bottomOfBar < ( PowerButton.Height - 56 ) ) { CC_Draw_Shape(PowerBarShapeHD, 1, ScreenWidth - (640 - (240 * RESFACTOR)), bottomOfBar, WINDOW_MAIN, flags | SHAPE_NORMAL | SHAPE_WIN_REL, remap); - bottomOfBar += 8 * RESFACTOR; + bottomOfBar += 56 * RESFACTOR; } // bottom diff --git a/code/redalert/sidebar.cpp b/code/redalert/sidebar.cpp index 8cec147..27dec7c 100644 --- a/code/redalert/sidebar.cpp +++ b/code/redalert/sidebar.cpp @@ -778,8 +778,6 @@ void SidebarClass::Draw_It(bool complete) // hack: black background for the sidebar GL_FillRect(TBLACK, SIDE_X * RESFACTOR, 8 * RESFACTOR, SIDE_WIDTH * RESFACTOR, ScreenHeight); - PowerClass::Draw_It(complete); - BStart(BENCH_SIDEBAR); if (IsSidebarActive && (IsToRedraw || complete) && !Debug_Map) { @@ -803,7 +801,7 @@ void SidebarClass::Draw_It(bool complete) if (frameNr < 6) frameNr++; } - topY += 10 * RESFACTOR; + topY += 11 * RESFACTOR; CC_Draw_Shape(SidebarFillerHD, 0, SIDE_X * RESFACTOR, topY, WINDOW_MAIN, SHAPE_WIN_REL, 0); Repair.Draw_Me(true); @@ -814,6 +812,9 @@ void SidebarClass::Draw_It(bool complete) } } + // Draw power on top + PowerClass::Draw_It(complete); + /* ** Draw the side strip elements by calling their respective draw functions. */ From 02af11fa1adb06fd84c7820a28c57a9061d72daa Mon Sep 17 00:00:00 2001 From: Ben Lankamp Date: Sat, 4 Jul 2020 11:44:16 +0200 Subject: [PATCH 3/3] Draw Powerbar first, buttons + addon (filler) are drawn on top of that. --- code/redalert/sidebar.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/redalert/sidebar.cpp b/code/redalert/sidebar.cpp index 27dec7c..e32f644 100644 --- a/code/redalert/sidebar.cpp +++ b/code/redalert/sidebar.cpp @@ -778,6 +778,9 @@ void SidebarClass::Draw_It(bool complete) // hack: black background for the sidebar GL_FillRect(TBLACK, SIDE_X * RESFACTOR, 8 * RESFACTOR, SIDE_WIDTH * RESFACTOR, ScreenHeight); + // Draw power on top + PowerClass::Draw_It(complete); + BStart(BENCH_SIDEBAR); if (IsSidebarActive && (IsToRedraw || complete) && !Debug_Map) { @@ -812,9 +815,6 @@ void SidebarClass::Draw_It(bool complete) } } - // Draw power on top - PowerClass::Draw_It(complete); - /* ** Draw the side strip elements by calling their respective draw functions. */