From 9a4f3f0e6752d530065a748e0bfbc735422a70ab Mon Sep 17 00:00:00 2001 From: elasota Date: Thu, 2 Apr 2020 01:47:25 -0400 Subject: [PATCH] Fix candle flames and grease spill progression on res change --- GpApp/DynamicMaps.cpp | 3 ++- GpApp/GliderProtos.h | 7 +++--- GpApp/Grease.cpp | 40 +++++++++++++++++++++++++++--- GpApp/ObjectDraw.cpp | 28 ++++++++++++--------- GpApp/ObjectDrawAll.cpp | 54 +++++++++++++++++++++++++++++------------ GpApp/ObjectEdit.cpp | 4 +-- GpApp/RoomGraphics.cpp | 3 +++ 7 files changed, 103 insertions(+), 36 deletions(-) diff --git a/GpApp/DynamicMaps.cpp b/GpApp/DynamicMaps.cpp index e41c831..767b453 100644 --- a/GpApp/DynamicMaps.cpp +++ b/GpApp/DynamicMaps.cpp @@ -292,7 +292,7 @@ void BackUpFlames (Rect *src, short index) // Like the above function but this is called when the lighting changesÉ // in a room (lights go on or off). -void ReBackUpFlames (short where, short who) +void ReBackUpFlames (short where, short who, short h, short v) { short i, f; @@ -304,6 +304,7 @@ void ReBackUpFlames (short where, short who) { if (flames[f].who == i) { + QOffsetRect(&flames[f].dest, h - 8 - flames[f].dest.left, v - 15 - flames[f].dest.top); BackUpFlames(&flames[f].dest, i); return; } diff --git a/GpApp/GliderProtos.h b/GpApp/GliderProtos.h index 922e7cd..563bcc8 100644 --- a/GpApp/GliderProtos.h +++ b/GpApp/GliderProtos.h @@ -28,7 +28,7 @@ SInt16 ReBackUpSavedMap (Rect *, SInt16, SInt16); void RestoreFromSavedMap (SInt16, SInt16, Boolean); void AddSparkle (Rect *); void AddFlyingPoint (Rect *, SInt16, SInt16, SInt16); -void ReBackUpFlames (SInt16, SInt16); +void ReBackUpFlames (SInt16, SInt16, SInt16, SInt16); void AddCandleFlame (SInt16, SInt16, SInt16, SInt16); void ReBackUpTikiFlames (SInt16, SInt16); void AddTikiFlame (SInt16, SInt16, SInt16, SInt16); @@ -87,6 +87,7 @@ SInt16 ReBackUpGrease (SInt16 where, SInt16 who, SInt16 h, SInt16 v); SInt16 AddGrease (SInt16, SInt16, SInt16, SInt16, SInt16, Boolean); void SpillGrease (SInt16, SInt16); void RedrawAllGrease (void); +void FixupFallenGrease(SInt16 where, SInt16 who, SInt16 h, SInt16 v, Boolean *isDynamic); void DoHighScores (void); // --- HighScores.c void SortHighScores (void); @@ -261,8 +262,8 @@ void DrawBlueClock (Rect *); void DrawYellowClock (Rect *); void DrawCuckoo (Rect *); void DrawSimplePrizes (SInt16, Rect *); -void DrawGreaseRt (Rect *, SInt16, Boolean); -void DrawGreaseLf (Rect *, SInt16, Boolean); +void DrawGreaseRt (Rect *, SInt16, Boolean, Boolean); +void DrawGreaseLf (Rect *, SInt16, Boolean, Boolean); void DrawFoil (Rect *); void DrawInvisBonus (Rect *); void DrawSlider (Rect *); diff --git a/GpApp/Grease.cpp b/GpApp/Grease.cpp index 8e6fcda..efdb293 100644 --- a/GpApp/Grease.cpp +++ b/GpApp/Grease.cpp @@ -178,7 +178,13 @@ short ReBackUpGrease (short where, short who, short h, short v) { if ((grease[i].mode == kGreaseIdle) || (grease[i].mode == kGreaseFalling)) { - QOffsetRect(&grease[i].dest, h - grease[i].dest.left, v - grease[i].dest.top); + greasePtr greaseItem = &grease[i]; + const short hDelta = h - grease[i].dest.left; + const short vDelta = v - grease[i].dest.top; + QOffsetRect(&greaseItem->dest, hDelta, vDelta); + greaseItem->start += hDelta; + greaseItem->stop += hDelta; + src = grease[i].dest; BackupGrease(&src, grease[i].mapNum, grease[i].isRight); } @@ -269,10 +275,12 @@ void RedrawAllGrease (void) for (i = 0; i < numGrease; i++) { + if (grease[i].mode == kGreaseIdle) + continue; + src = hotSpots[grease[i].hotNum].bounds; if ((grease[i].where == thisRoomNumber) && - ((src.bottom - src.top) == 2) && - (grease[i].mode != kGreaseIdle)) + ((src.bottom - src.top) == 2)) { QOffsetRect(&src, playOriginH, playOriginV); @@ -288,3 +296,29 @@ void RedrawAllGrease (void) } } +void FixupFallenGrease(SInt16 where, SInt16 who, SInt16 h, SInt16 v, Boolean *isDynamic) +{ + short i; + + for (i = 0; i < numGrease; i++) + { + greasePtr greaseItem = grease + i; + if ((greaseItem->where == where) && (greaseItem->who == who)) + { + short hDelta = h - greaseItem->dest.left; + short vDelta = v - greaseItem->dest.top; + QOffsetRect(&greaseItem->dest, hDelta, vDelta); + greaseItem->start += hDelta; + greaseItem->stop += hDelta; + if (greaseItem->mode != kGreaseIdle) + { + hotPtr hotSpot = &hotSpots[greaseItem->hotNum]; + //QOffsetRect(&hotSpot->bounds, hDelta, vDelta); + } + *isDynamic = true; + return; + } + } + + *isDynamic = false; +} diff --git a/GpApp/ObjectDraw.cpp b/GpApp/ObjectDraw.cpp index 3946a6d..9edaef6 100644 --- a/GpApp/ObjectDraw.cpp +++ b/GpApp/ObjectDraw.cpp @@ -1224,7 +1224,7 @@ void DrawSimplePrizes (short what, Rect *theRect) //-------------------------------------------------------------- DrawGreaseRt -void DrawGreaseRt (Rect *theRect, short distance, Boolean state) +void DrawGreaseRt (Rect *theRect, short distance, Boolean state, Boolean drawSpill) { Rect spill, dest; @@ -1243,18 +1243,21 @@ void DrawGreaseRt (Rect *theRect, short distance, Boolean state) (BitMap *)*GetGWorldPixMap(bonusMaskMap), (BitMap *)*GetGWorldPixMap(backSrcMap), &greaseSrcRt[3], &greaseSrcRt[3], &dest); - - QSetRect(&spill, 0, -2, distance - 5, 0); - QOffsetRect(&spill, dest.right - 1, dest.bottom); - backSrcMap->SetForeColor(PortabilityLayer::RGBAColor::Create(0, 0, 0, 255)); - backSrcMap->FillRect(spill); + if (drawSpill) + { + QSetRect(&spill, 0, -2, distance - 5, 0); + QOffsetRect(&spill, dest.right - 1, dest.bottom); + + backSrcMap->SetForeColor(PortabilityLayer::RGBAColor::Create(0, 0, 0, 255)); + backSrcMap->FillRect(spill); + } } } //-------------------------------------------------------------- DrawGreaseLf -void DrawGreaseLf (Rect *theRect, short distance, Boolean state) +void DrawGreaseLf (Rect *theRect, short distance, Boolean state, Boolean drawSpill) { Rect spill, dest; DrawSurface *wasCPort; @@ -1275,11 +1278,14 @@ void DrawGreaseLf (Rect *theRect, short distance, Boolean state) (BitMap *)*GetGWorldPixMap(backSrcMap), &greaseSrcLf[3], &greaseSrcLf[3], &dest); - backSrcMap->SetForeColor(PortabilityLayer::RGBAColor::Create(0, 0, 0, 255)); + if (drawSpill) + { + backSrcMap->SetForeColor(PortabilityLayer::RGBAColor::Create(0, 0, 0, 255)); - QSetRect(&spill, -distance + 5, -2, 0, 0); - QOffsetRect(&spill, dest.left + 1, dest.bottom); - backSrcMap->FillRect(spill); + QSetRect(&spill, -distance + 5, -2, 0, 0); + QOffsetRect(&spill, dest.left + 1, dest.bottom); + backSrcMap->FillRect(spill); + } } } diff --git a/GpApp/ObjectDrawAll.cpp b/GpApp/ObjectDrawAll.cpp index 6a1b8e3..86bc8c8 100644 --- a/GpApp/ObjectDrawAll.cpp +++ b/GpApp/ObjectDrawAll.cpp @@ -73,11 +73,13 @@ void DrawARoomsObjects (short neighbor, Boolean redraw) DrawSimpleBlowers(thisObject.what, &itsRect); if (neighbor == kCentralRoom) { + const short h = itsRect.left + 10; + const short v = itsRect.top + 7; if (redraw) - ReBackUpFlames(localNumbers[neighbor], i); + ReBackUpFlames(localNumbers[neighbor], i, h, v); else AddCandleFlame(localNumbers[neighbor], i, - itsRect.left + 10, itsRect.top + 7); + h, v); } else { @@ -88,11 +90,13 @@ void DrawARoomsObjects (short neighbor, Boolean redraw) rectB.bottom += kFloorSupportTall; if (!SectRect(&rectA, &rectB, &whoCares)) { + const short h = itsRect.left + 10; + const short v = itsRect.top + 7; if (redraw) - ReBackUpFlames(localNumbers[neighbor], i); + ReBackUpFlames(localNumbers[neighbor], i, h, v); else AddCandleFlame(localNumbers[neighbor], i, - itsRect.left + 10, itsRect.top + 7); + h, v); } } } @@ -107,11 +111,13 @@ void DrawARoomsObjects (short neighbor, Boolean redraw) DrawSimpleBlowers(thisObject.what, &itsRect); if (neighbor == kCentralRoom) { + const short h = itsRect.left + 14; + const short v = itsRect.top + 7; if (redraw) - ReBackUpFlames(localNumbers[neighbor], i); + ReBackUpFlames(localNumbers[neighbor], i, h, v); else AddCandleFlame(localNumbers[neighbor], i, - itsRect.left + 14, itsRect.top + 7); + h, v); } else { @@ -122,11 +128,13 @@ void DrawARoomsObjects (short neighbor, Boolean redraw) rectB.bottom += kFloorSupportTall; if (!SectRect(&rectA, &rectB, &whoCares)) { + const short h = itsRect.left + 14; + const short v = itsRect.top + 7; if (redraw) - ReBackUpFlames(localNumbers[neighbor], i); + ReBackUpFlames(localNumbers[neighbor], i, h, v); else AddCandleFlame(localNumbers[neighbor], i, - itsRect.left + 14, itsRect.top + 7); + h, v); } } } @@ -141,11 +149,13 @@ void DrawARoomsObjects (short neighbor, Boolean redraw) DrawSimpleBlowers(thisObject.what, &itsRect); if (neighbor == kCentralRoom) { + const short h = itsRect.left + 9; + const short v = itsRect.top + 7; if (redraw) - ReBackUpFlames(localNumbers[neighbor], i); + ReBackUpFlames(localNumbers[neighbor], i, h, v); else AddCandleFlame(localNumbers[neighbor], i, - itsRect.left + 9, itsRect.top + 7); + h, v); } else { @@ -156,11 +166,13 @@ void DrawARoomsObjects (short neighbor, Boolean redraw) rectB.bottom += kFloorSupportTall; if (!SectRect(&rectA, &rectB, &whoCares)) { + const short h = itsRect.left + 9; + const short v = itsRect.top + 7; if (redraw) - ReBackUpFlames(localNumbers[neighbor], i); + ReBackUpFlames(localNumbers[neighbor], i, h, v); else AddCandleFlame(localNumbers[neighbor], i, - itsRect.left + 9, itsRect.top + 7); + h, v); } } } @@ -375,11 +387,16 @@ void DrawARoomsObjects (short neighbor, Boolean redraw) itsRect.left, itsRect.top, thisObject.data.c.length, true); if (dynamicNum != -1) - DrawGreaseRt(&itsRect, thisObject.data.c.length, true); + DrawGreaseRt(&itsRect, thisObject.data.c.length, true, false); } } else // fallen - DrawGreaseRt(&itsRect, thisObject.data.c.length, false); + { + Boolean isDynamic = false; + if (redraw) + FixupFallenGrease(localNumbers[neighbor], i, itsRect.left, itsRect.top, &isDynamic); + DrawGreaseRt(&itsRect, thisObject.data.c.length, false, !isDynamic); + } break; case kGreaseLf: @@ -396,11 +413,16 @@ void DrawARoomsObjects (short neighbor, Boolean redraw) itsRect.left, itsRect.top, thisObject.data.c.length, false); if (dynamicNum != -1) - DrawGreaseLf(&itsRect, thisObject.data.c.length, true); + DrawGreaseLf(&itsRect, thisObject.data.c.length, true, false); } } else - DrawGreaseLf(&itsRect, thisObject.data.c.length, false); + { + Boolean isDynamic = false; + if (redraw) + FixupFallenGrease(localNumbers[neighbor], i, itsRect.left, itsRect.top, &isDynamic); + DrawGreaseLf(&itsRect, thisObject.data.c.length, false, !isDynamic); + } break; case kFoil: diff --git a/GpApp/ObjectEdit.cpp b/GpApp/ObjectEdit.cpp index 02ab039..8d5a418 100644 --- a/GpApp/ObjectEdit.cpp +++ b/GpApp/ObjectEdit.cpp @@ -2388,7 +2388,7 @@ void DrawThisRoomsObjects (void) if (!thisRoom->objects[i].data.c.initial) QOffsetRect(&tempRect, -8, 0); DrawGreaseRt(&tempRect, thisRoom->objects[i].data.c.length, - thisRoom->objects[i].data.c.initial); + thisRoom->objects[i].data.c.initial, true); break; case kGreaseLf: @@ -2396,7 +2396,7 @@ void DrawThisRoomsObjects (void) if (!thisRoom->objects[i].data.c.initial) QOffsetRect(&tempRect, 8, 0); DrawGreaseLf(&tempRect, thisRoom->objects[i].data.c.length, - thisRoom->objects[i].data.c.initial); + thisRoom->objects[i].data.c.initial, true); break; case kFoil: diff --git a/GpApp/RoomGraphics.cpp b/GpApp/RoomGraphics.cpp index 27ab544..ec25ab5 100644 --- a/GpApp/RoomGraphics.cpp +++ b/GpApp/RoomGraphics.cpp @@ -128,6 +128,9 @@ void ResetLocale (Boolean soft) DrawFloorSupport(); RestoreWorkMap(); shadowVisible = IsShadowVisible(); + + if (soft) + RedrawAllGrease(); SetGraphicsPort(wasCPort); }