Get scoreboard bar working

This commit is contained in:
elasota
2019-12-27 00:30:31 -05:00
parent 48f01567f7
commit 7bc647b026
9 changed files with 80 additions and 22 deletions

View File

@@ -50,7 +50,7 @@ extern Rect backSrcRect;
extern Rect mainWindowRect, houseRect; extern Rect mainWindowRect, houseRect;
extern houseHand thisHouse; extern houseHand thisHouse;
extern roomPtr thisRoom; extern roomPtr thisRoom;
extern WindowPtr mainWindow, coordWindow; extern WindowPtr mainWindow, coordWindow, boardWindow;
extern long theScore; extern long theScore;
extern short playOriginH, playOriginV; extern short playOriginH, playOriginV;
extern short thisRoomNumber, theMode, batteryTotal, bandsTotal; extern short thisRoomNumber, theMode, batteryTotal, bandsTotal;

View File

@@ -176,6 +176,7 @@ void VariableInit (void)
mirrorRgn = nil; mirrorRgn = nil;
mainWindow = nil; mainWindow = nil;
boardWindow = nil;
mapWindow = nil; mapWindow = nil;
toolsWindow = nil; toolsWindow = nil;
linkWindow = nil; linkWindow = nil;

View File

@@ -13,6 +13,8 @@
#include "House.h" #include "House.h"
#include "RectUtils.h" #include "RectUtils.h"
#include "PLKeyEncoding.h" #include "PLKeyEncoding.h"
#include "WindowDef.h"
#include "WindowManager.h"
#define kMainWindowID 128 #define kMainWindowID 128
@@ -37,7 +39,7 @@ Cursor diagCursor;
Rect workSrcRect; Rect workSrcRect;
GWorldPtr workSrcMap; GWorldPtr workSrcMap;
Rect mainWindowRect; Rect mainWindowRect;
WindowPtr mainWindow, menuWindow; WindowPtr mainWindow, menuWindow, boardWindow;
short isEditH, isEditV; short isEditH, isEditV;
short playOriginH, playOriginV; short playOriginH, playOriginV;
short splashOriginH, splashOriginV; short splashOriginH, splashOriginV;
@@ -221,6 +223,20 @@ void OpenMainWindow (void)
thisMac.screen.top, true); thisMac.screen.top, true);
ShowWindow(menuWindow); ShowWindow(menuWindow);
} }
if (boardWindow == nil)
{
PortabilityLayer::WindowManager *windowManager = PortabilityLayer::WindowManager::GetInstance();
Rect scorebarRect = thisMac.screen;
scorebarRect.bottom = scorebarRect.top + kScoreboardTall;
PortabilityLayer::WindowDef windowDef = PortabilityLayer::WindowDef::Create(scorebarRect, 0, true, false, 0, 0, PSTR("Scoreboard"));
boardWindow = windowManager->CreateWindow(windowDef);
if (boardWindow != nil)
windowManager->PutWindowBehind(boardWindow, PL_GetPutInFrontWindowPtr());
else
PL_NotYetImplemented_TODO("Errors");
}
mainWindowRect = thisMac.screen; mainWindowRect = thisMac.screen;
ZeroRectCorner(&mainWindowRect); ZeroRectCorner(&mainWindowRect);
mainWindowRect.bottom -= 20; // thisMac.menuHigh mainWindowRect.bottom -= 20; // thisMac.menuHigh
@@ -271,6 +287,10 @@ void CloseMainWindow (void)
if (mainWindow != nil) if (mainWindow != nil)
DisposeWindow(mainWindow); DisposeWindow(mainWindow);
mainWindow = nil; mainWindow = nil;
if (boardWindow != nil)
DisposeWindow(boardWindow);
boardWindow = nil;
} }
//-------------------------------------------------------------- ZoomBetweenWindows //-------------------------------------------------------------- ZoomBetweenWindows

View File

@@ -10,6 +10,7 @@
#include "PLPasStr.h" #include "PLPasStr.h"
#include "Externs.h" #include "Externs.h"
#include "Environ.h" #include "Environ.h"
#include "MenuManager.h"
#include "RectUtils.h" #include "RectUtils.h"
@@ -53,12 +54,12 @@ extern Boolean evenFrame, onePlayerLeft;
void MarkScoreboardPortDirty(void) void MarkScoreboardPortDirty(void)
{ {
GetWindowPort(mainWindow)->m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents); GetWindowPort(boardWindow)->m_port.SetDirty(PortabilityLayer::QDPortDirtyFlag_Contents);
} }
//-------------------------------------------------------------- RefreshScoreboard //-------------------------------------------------------------- RefreshScoreboard
void RefreshScoreboard (short mode) void RefreshScoreboard (SInt16 mode)
{ {
doRollScore = true; doRollScore = true;
@@ -67,7 +68,7 @@ void RefreshScoreboard (short mode)
RefreshPoints(); RefreshPoints();
CopyBits((BitMap *)*GetGWorldPixMap(boardSrcMap), CopyBits((BitMap *)*GetGWorldPixMap(boardSrcMap),
GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), GetPortBitMapForCopyBits(GetWindowPort(boardWindow)),
&boardSrcRect, &boardDestRect, srcCopy, 0L); &boardSrcRect, &boardDestRect, srcCopy, 0L);
MarkScoreboardPortDirty(); MarkScoreboardPortDirty();
@@ -75,6 +76,8 @@ void RefreshScoreboard (short mode)
QuickBatteryRefresh(false); QuickBatteryRefresh(false);
QuickBandsRefresh(false); QuickBandsRefresh(false);
QuickFoilRefresh(false); QuickFoilRefresh(false);
PortabilityLayer::MenuManager::GetInstance()->SetMenuVisible(false);
} }
//-------------------------------------------------------------- HandleDynamicScoreboard //-------------------------------------------------------------- HandleDynamicScoreboard
@@ -195,8 +198,6 @@ void RefreshRoomTitle (short mode)
CopyBits((BitMap *)*GetGWorldPixMap(boardTSrcMap), CopyBits((BitMap *)*GetGWorldPixMap(boardTSrcMap),
(BitMap *)*GetGWorldPixMap(boardSrcMap), (BitMap *)*GetGWorldPixMap(boardSrcMap),
&boardTSrcRect, &boardTDestRect, srcCopy, nil); &boardTSrcRect, &boardTDestRect, srcCopy, nil);
MarkScoreboardPortDirty();
} }
//-------------------------------------------------------------- RefreshNumGliders //-------------------------------------------------------------- RefreshNumGliders
@@ -236,8 +237,6 @@ void RefreshNumGliders (void)
CopyBits((BitMap *)*GetGWorldPixMap(boardGSrcMap), CopyBits((BitMap *)*GetGWorldPixMap(boardGSrcMap),
(BitMap *)*GetGWorldPixMap(boardSrcMap), (BitMap *)*GetGWorldPixMap(boardSrcMap),
&boardGSrcRect, &boardGDestRect, srcCopy, nil); &boardGSrcRect, &boardGDestRect, srcCopy, nil);
MarkScoreboardPortDirty();
} }
//-------------------------------------------------------------- RefreshPoints //-------------------------------------------------------------- RefreshPoints
@@ -275,8 +274,6 @@ void RefreshPoints (void)
&boardPSrcRect, &boardPDestRect, srcCopy, nil); &boardPSrcRect, &boardPDestRect, srcCopy, nil);
displayedScore = theScore; displayedScore = theScore;
MarkScoreboardPortDirty();
} }
//-------------------------------------------------------------- QuickGlidersRefresh //-------------------------------------------------------------- QuickGlidersRefresh
@@ -310,7 +307,7 @@ void QuickGlidersRefresh (void)
ForeColor(blackColor); ForeColor(blackColor);
CopyBits((BitMap *)*GetGWorldPixMap(boardGSrcMap), CopyBits((BitMap *)*GetGWorldPixMap(boardGSrcMap),
GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), GetPortBitMapForCopyBits(GetWindowPort(boardWindow)),
&boardGSrcRect, &boardGQDestRect, srcCopy, nil); &boardGSrcRect, &boardGQDestRect, srcCopy, nil);
MarkScoreboardPortDirty(); MarkScoreboardPortDirty();
@@ -347,7 +344,7 @@ void QuickScoreRefresh (void)
ForeColor(blackColor); ForeColor(blackColor);
CopyBits((BitMap *)*GetGWorldPixMap(boardPSrcMap), CopyBits((BitMap *)*GetGWorldPixMap(boardPSrcMap),
GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), GetPortBitMapForCopyBits(GetWindowPort(boardWindow)),
&boardPSrcRect, &boardPQDestRect, srcCopy, nil); &boardPSrcRect, &boardPQDestRect, srcCopy, nil);
MarkScoreboardPortDirty(); MarkScoreboardPortDirty();
@@ -360,7 +357,7 @@ void QuickBatteryRefresh (Boolean flash)
if ((batteryTotal > 0) && (!flash)) if ((batteryTotal > 0) && (!flash))
{ {
CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap), CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap),
GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), GetPortBitMapForCopyBits(GetWindowPort(boardWindow)),
&badgesBadgesRects[kBatteryBadge], &badgesBadgesRects[kBatteryBadge],
&badgesDestRects[kBatteryBadge], &badgesDestRects[kBatteryBadge],
srcCopy, nil); srcCopy, nil);
@@ -368,7 +365,7 @@ void QuickBatteryRefresh (Boolean flash)
else if ((batteryTotal < 0) && (!flash)) else if ((batteryTotal < 0) && (!flash))
{ {
CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap), CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap),
GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), GetPortBitMapForCopyBits(GetWindowPort(boardWindow)),
&badgesBadgesRects[kHeliumBadge], &badgesBadgesRects[kHeliumBadge],
&badgesDestRects[kHeliumBadge], &badgesDestRects[kHeliumBadge],
srcCopy, nil); srcCopy, nil);
@@ -376,7 +373,7 @@ void QuickBatteryRefresh (Boolean flash)
else else
{ {
CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap), CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap),
GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), GetPortBitMapForCopyBits(GetWindowPort(boardWindow)),
&badgesBlankRects[kBatteryBadge], &badgesBlankRects[kBatteryBadge],
&badgesDestRects[kBatteryBadge], &badgesDestRects[kBatteryBadge],
srcCopy, nil); srcCopy, nil);
@@ -392,7 +389,7 @@ void QuickBandsRefresh (Boolean flash)
if ((bandsTotal > 0) && (!flash)) if ((bandsTotal > 0) && (!flash))
{ {
CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap), CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap),
GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), GetPortBitMapForCopyBits(GetWindowPort(boardWindow)),
&badgesBadgesRects[kBandsBadge], &badgesBadgesRects[kBandsBadge],
&badgesDestRects[kBandsBadge], &badgesDestRects[kBandsBadge],
srcCopy, nil); srcCopy, nil);
@@ -400,7 +397,7 @@ void QuickBandsRefresh (Boolean flash)
else else
{ {
CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap), CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap),
GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), GetPortBitMapForCopyBits(GetWindowPort(boardWindow)),
&badgesBlankRects[kBandsBadge], &badgesBlankRects[kBandsBadge],
&badgesDestRects[kBandsBadge], &badgesDestRects[kBandsBadge],
srcCopy, nil); srcCopy, nil);
@@ -416,7 +413,7 @@ void QuickFoilRefresh (Boolean flash)
if ((foilTotal > 0) && (!flash)) if ((foilTotal > 0) && (!flash))
{ {
CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap), CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap),
GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), GetPortBitMapForCopyBits(GetWindowPort(boardWindow)),
&badgesBadgesRects[kFoilBadge], &badgesBadgesRects[kFoilBadge],
&badgesDestRects[kFoilBadge], &badgesDestRects[kFoilBadge],
srcCopy, nil); srcCopy, nil);
@@ -424,7 +421,7 @@ void QuickFoilRefresh (Boolean flash)
else else
{ {
CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap), CopyBits((BitMap *)*GetGWorldPixMap(badgeSrcMap),
GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), GetPortBitMapForCopyBits(GetWindowPort(boardWindow)),
&badgesBlankRects[kFoilBadge], &badgesBlankRects[kFoilBadge],
&badgesDestRects[kFoilBadge], &badgesDestRects[kFoilBadge],
srcCopy, nil); srcCopy, nil);

View File

@@ -129,6 +129,7 @@ namespace PortabilityLayer
void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) override; void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) override;
void DrawMenuBar() override; void DrawMenuBar() override;
void SetMenuVisible(bool isVisible) override;
void RenderFrame(IGpDisplayDriver *displayDriver) override; void RenderFrame(IGpDisplayDriver *displayDriver) override;
@@ -189,6 +190,7 @@ namespace PortabilityLayer
Menu **m_lastMenu; Menu **m_lastMenu;
bool m_haveMenuBarLayout; bool m_haveMenuBarLayout;
bool m_haveIcon; bool m_haveIcon;
bool m_menuBarVisible;
uint8_t m_iconColors[16 * 16]; uint8_t m_iconColors[16 * 16];
uint8_t m_iconMask[32]; uint8_t m_iconMask[32];
@@ -207,6 +209,7 @@ namespace PortabilityLayer
, m_haveMenuBarLayout(false) , m_haveMenuBarLayout(false)
, m_haveIcon(false) , m_haveIcon(false)
, m_iconGraphic(nullptr) , m_iconGraphic(nullptr)
, m_menuBarVisible(true)
{ {
} }
@@ -707,8 +710,16 @@ namespace PortabilityLayer
m_menuBarGraf->m_port.SetDirty(QDPortDirtyFlag_Contents); m_menuBarGraf->m_port.SetDirty(QDPortDirtyFlag_Contents);
} }
void MenuManagerImpl::SetMenuVisible(bool isVisible)
{
m_menuBarVisible = isVisible;
}
void MenuManagerImpl::RenderFrame(IGpDisplayDriver *displayDriver) void MenuManagerImpl::RenderFrame(IGpDisplayDriver *displayDriver)
{ {
if (!m_menuBarVisible)
return;
if (m_menuBarGraf) if (m_menuBarGraf)
{ {
m_menuBarGraf->PushToDDSurface(displayDriver); m_menuBarGraf->PushToDDSurface(displayDriver);

View File

@@ -30,6 +30,7 @@ namespace PortabilityLayer
virtual void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) = 0; virtual void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) = 0;
virtual void DrawMenuBar() = 0; virtual void DrawMenuBar() = 0;
virtual void SetMenuVisible(bool isVisible) = 0;
virtual void RenderFrame(IGpDisplayDriver *displayDriver) = 0; virtual void RenderFrame(IGpDisplayDriver *displayDriver) = 0;

View File

@@ -897,7 +897,11 @@ short StringWidth(const PLPasStr &str)
if (!rfont) if (!rfont)
return 0; return 0;
return rfont->MeasureString(str.UChars(), str.Length()); const size_t width = rfont->MeasureString(str.UChars(), str.Length());
if (width > SHRT_MAX)
return SHRT_MAX;
return static_cast<short>(width);
} }
void GetMouse(Point *point) void GetMouse(Point *point)

View File

@@ -1,9 +1,12 @@
#include "WindowDef.h" #include "WindowDef.h"
#include "IOStream.h" #include "IOStream.h"
#include "CoreDefs.h" #include "CoreDefs.h"
#include "PLPasStr.h"
#include <algorithm>
namespace PortabilityLayer namespace PortabilityLayer
{ {
bool WindowDef::Deserialize(IOStream *stream) bool WindowDef::Deserialize(IOStream *stream)
{ {
struct WindowDefPart1 struct WindowDefPart1
@@ -40,4 +43,21 @@ namespace PortabilityLayer
return true; return true;
} }
WindowDef WindowDef::Create(const Rect &initialRect, int16_t wdefID, bool isVisible, bool hasCloseBox, uint32_t refConstant, uint16_t positionSpec, const PLPasStr &title)
{
WindowDef wdef;
wdef.m_initialRect = initialRect;
wdef.m_wdefResID = wdefID;
wdef.m_visibilityStatus = isVisible ? 1 : 0;
wdef.m_hasCloseBox = hasCloseBox ? 1 : 0;
wdef.m_referenceConstant = refConstant;
wdef.m_positionSpec = positionSpec;
const uint8_t titleLength = static_cast<uint8_t>(std::max<size_t>(255, title.Length()));
wdef.m_title[0] = titleLength;
memcpy(wdef.m_title + 1, title.UChars(), titleLength);
return wdef;
}
} }

View File

@@ -3,6 +3,8 @@
#include "SharedTypes.h" #include "SharedTypes.h"
#include "PascalStr.h" #include "PascalStr.h"
class PLPasStr;
namespace PortabilityLayer namespace PortabilityLayer
{ {
class IOStream; class IOStream;
@@ -18,5 +20,7 @@ namespace PortabilityLayer
uint8_t m_title[256]; uint8_t m_title[256];
bool Deserialize(IOStream *stream); bool Deserialize(IOStream *stream);
static WindowDef Create(const Rect &initialRect, int16_t wdefID, bool isVisible, bool hasCloseBox, uint32_t refConstant, uint16_t positionSpec, const PLPasStr &title);
}; };
} }