This evolves and hopefully eases the game-build requirements by
removing game-compile dependencies on any header files generated
by the makedefs utility, including:
date.h dependency and its inclusion is removed and comparable functionality
is produced at runtime via new file src/date.c.
pm.h dependency and its inclusion is removed and comparable functionality is
produced by moving the monster definitions from monst.c into new header
file called monsters.h and altering them slightly. The former pm.h header
file #define PM_ values are now replaced with appropriate emitted enum
entries during the compiler preprocessing.
onames.h dependency and its inclusion is removed and comparable functionality
is produced by moving the object definitions from objects.c into new header
file called objects.h and altering them slightly. The former onames.h header
file #define values are now replaced with appropriate emitted enum entries
during the compiler preprocessing.
artilist.h has been slightly altered, and the former onames.h artifact-related
header file #define ART_ values are now replaced with appropriate emitted enum
entries during the compiler preprocessing.
makedefs can still produce date.h (makedefs -v), pm.h (makedefs -p), and
onames.h (makedefs -o) for reference purposes. They won't be used during
the compiler.
The other uses for makedefs remain. They are used to prepare external
file content that the game utilizes, not prerequisite code for the
compile:
makedefs -d (database)
makedefs -r (rumors)
makedefs -h (oracles)
makedefs -s (epitaphs, engravings, bogusmons)
date.c
Pull the code for date/time stamping from mdlib.c into date.c.
Set date.o to be dependent on source files, header files, and .o files
so that date.o is rebuilt from date.c when any of those changes, thus
ensuring an accurate date/time stamp. It also includes git sha
functionality formerly done by makedefs writing #define directives
into include/date.h. For unix it passes the git info on
the compile line for date.c (via sys/unix/hints/linux.2020, macOS.2020)
nethack --dumpenums (optional, but on by default)
Allow developer to obtain some internal enum values from NetHack
without having to resort to an external utility such as
makedefs.
Uncomment #define NODUMPENUMS in config.h to disable this.
The updates to sys/windows/Makefile.gcc have not been tested yet.
289 lines
8.9 KiB
C
289 lines
8.9 KiB
C
/* NetHack 3.7 mhsplash.c $NHDT-Date: 1596498360 2020/08/03 23:46:00 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.36 $ */
|
|
/* Copyright (C) 2001 by Alex Kompel */
|
|
/* NetHack may be freely redistributed. See license for details. */
|
|
|
|
#include "win10.h"
|
|
#include "winMS.h"
|
|
#include "resource.h"
|
|
#include "mhsplash.h"
|
|
#include "mhmsg.h"
|
|
#include "mhfont.h"
|
|
#include "config.h"
|
|
#if !defined(VERSION_MAJOR)
|
|
#include "patchlevel.h"
|
|
#endif
|
|
#include "dlb.h"
|
|
|
|
#define LLEN 128
|
|
|
|
PNHWinApp GetNHApp(void);
|
|
|
|
INT_PTR CALLBACK NHSplashWndProc(HWND, UINT, WPARAM, LPARAM);
|
|
|
|
#define SPLASH_WIDTH_96DPI 440
|
|
#define SPLASH_HEIGHT_96DPI 322
|
|
#define SPLASH_OFFSET_X_96DPI 10
|
|
#define SPLASH_OFFSET_Y_96DPI 10
|
|
#define SPLASH_VERSION_X_96DPI 280
|
|
#define SPLASH_VERSION_Y_96DPI 0
|
|
|
|
typedef struct {
|
|
int boarder_width;
|
|
int boarder_height;
|
|
int client_width;
|
|
int client_height;
|
|
int ok_control_width;
|
|
int ok_control_height;
|
|
int ok_control_offset_x;
|
|
int ok_control_offset_y;
|
|
int text_control_width;
|
|
int text_control_height;
|
|
int text_control_offset_x;
|
|
int text_control_offset_y;
|
|
int window_width;
|
|
int window_height;
|
|
int width;
|
|
int height;
|
|
int offset_x;
|
|
int offset_y;
|
|
int version_x;
|
|
int version_y;
|
|
HFONT hFont;
|
|
} SplashData;
|
|
|
|
static void
|
|
mswin_set_splash_data(HWND hWnd, SplashData * sd, double scale)
|
|
{
|
|
RECT client_rect;
|
|
RECT window_rect;
|
|
RECT ok_control_rect;
|
|
RECT text_control_rect;
|
|
|
|
GetClientRect(hWnd, &client_rect);
|
|
GetWindowRect(hWnd, &window_rect);
|
|
GetWindowRect(GetDlgItem(hWnd, IDOK), &ok_control_rect);
|
|
GetWindowRect(GetDlgItem(hWnd, IDC_EXTRAINFO), &text_control_rect);
|
|
|
|
sd->boarder_width = (window_rect.right - window_rect.left) -
|
|
(client_rect.right - client_rect.left);
|
|
sd->boarder_height = (window_rect.bottom - window_rect.top) -
|
|
(client_rect.bottom - client_rect.top);
|
|
|
|
sd->ok_control_width = ok_control_rect.right - ok_control_rect.left;
|
|
sd->ok_control_height = ok_control_rect.bottom - ok_control_rect.top;
|
|
|
|
sd->width = (int)(scale * SPLASH_WIDTH_96DPI);
|
|
sd->height = (int)(scale * SPLASH_HEIGHT_96DPI);
|
|
sd->offset_x = (int)(scale * SPLASH_OFFSET_X_96DPI);
|
|
sd->offset_y = (int)(scale * SPLASH_OFFSET_Y_96DPI);
|
|
sd->version_x = (int)(scale * SPLASH_VERSION_X_96DPI);
|
|
sd->version_y = (int)(scale * SPLASH_VERSION_Y_96DPI);
|
|
|
|
sd->client_width = sd->width + sd->offset_x * 2;
|
|
sd->client_height = sd->height + sd->ok_control_height +
|
|
sd->offset_y * 3;
|
|
|
|
sd->window_width = sd->client_width + sd->boarder_width;
|
|
sd->window_height = sd->client_height + sd->boarder_height;
|
|
|
|
sd->ok_control_offset_x = (sd->client_width - sd->ok_control_width) / 2;
|
|
sd->ok_control_offset_y = sd->client_height - sd->ok_control_height - sd->offset_y;
|
|
|
|
sd->text_control_width = sd->client_width - sd->offset_x * 2;
|
|
sd->text_control_height = text_control_rect.bottom - text_control_rect.top;
|
|
|
|
sd->text_control_offset_x = sd->offset_x;
|
|
sd->text_control_offset_y = sd->ok_control_offset_y - sd->offset_y -
|
|
sd->text_control_height;
|
|
|
|
if (sd->hFont != NULL)
|
|
DeleteObject(sd->hFont);
|
|
|
|
sd->hFont = mswin_create_splashfont(hWnd);
|
|
|
|
MoveWindow(hWnd, window_rect.left, window_rect.top,
|
|
sd->window_width, sd->window_height, TRUE);
|
|
|
|
MoveWindow(GetDlgItem(hWnd, IDOK),
|
|
sd->ok_control_offset_x, sd->ok_control_offset_y,
|
|
sd->ok_control_width, sd->ok_control_height, TRUE);
|
|
|
|
MoveWindow(GetDlgItem(hWnd, IDC_EXTRAINFO),
|
|
sd->text_control_offset_x, sd->text_control_offset_y,
|
|
sd->text_control_width, sd->text_control_height, TRUE);
|
|
|
|
}
|
|
|
|
void
|
|
mswin_display_splash_window(BOOL show_ver)
|
|
{
|
|
MSG msg;
|
|
strbuf_t strbuf;
|
|
|
|
strbuf_init(&strbuf);
|
|
|
|
HWND hWnd = CreateDialog(GetNHApp()->hApp, MAKEINTRESOURCE(IDD_SPLASH),
|
|
GetNHApp()->hMainWnd, NHSplashWndProc);
|
|
if (!hWnd)
|
|
panic("Cannot create Splash window");
|
|
|
|
MonitorInfo monitorInfo;
|
|
win10_monitor_info(hWnd, &monitorInfo);
|
|
|
|
SplashData splashData;
|
|
memset(&splashData, 0, sizeof(splashData));
|
|
mswin_set_splash_data(hWnd, &splashData, monitorInfo.scale);
|
|
|
|
SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR) &splashData);
|
|
|
|
GetNHApp()->hPopupWnd = hWnd;
|
|
|
|
int left = monitorInfo.left + (monitorInfo.width - splashData.window_width) / 2;
|
|
int top = monitorInfo.top + (monitorInfo.height - splashData.window_height) / 2;
|
|
MoveWindow(hWnd, left, top, splashData.window_width, splashData.window_height, TRUE);
|
|
|
|
/* Fill the text control */
|
|
strbuf_reserve(&strbuf, BUFSIZ);
|
|
Sprintf(strbuf.str, "%s\n%s\n%s\n%s\n\n", COPYRIGHT_BANNER_A,
|
|
COPYRIGHT_BANNER_B, nomakedefs.copyright_banner_c, COPYRIGHT_BANNER_D);
|
|
|
|
if (show_ver) {
|
|
/* Show complete version information */
|
|
dlb *f;
|
|
char verbuf[BUFSZ];
|
|
/* int verstrsize = 0; */
|
|
|
|
getversionstring(verbuf);
|
|
strbuf_append(&strbuf, verbuf);
|
|
strbuf_append(&strbuf, "\n\n");
|
|
|
|
/* Add compile options */
|
|
f = dlb_fopen(OPTIONS_USED, RDTMODE);
|
|
if (f) {
|
|
char line[LLEN + 1];
|
|
|
|
while (dlb_fgets(line, LLEN, f))
|
|
strbuf_append(&strbuf, line);
|
|
(void) dlb_fclose(f);
|
|
}
|
|
} else {
|
|
/* Show news, if any */
|
|
if (iflags.news) {
|
|
FILE *nf;
|
|
|
|
iflags.news = 0; /* prevent newgame() from re-displaying news */
|
|
/* BUG: this relies on current working directory */
|
|
nf = fopen(NEWS, "r");
|
|
if (nf != NULL) {
|
|
char line[LLEN + 1];
|
|
|
|
while (fgets(line, LLEN, nf))
|
|
strbuf_append(&strbuf, line);
|
|
(void) fclose(nf);
|
|
} else {
|
|
strbuf_append(&strbuf, "No news.");
|
|
}
|
|
}
|
|
}
|
|
|
|
strbuf_nl_to_crlf(&strbuf);
|
|
SetWindowText(GetDlgItem(hWnd, IDC_EXTRAINFO), strbuf.str);
|
|
strbuf_empty(&strbuf);
|
|
ShowWindow(hWnd, SW_SHOW);
|
|
|
|
while (IsWindow(hWnd) && GetMessage(&msg, NULL, 0, 0) != 0) {
|
|
if (!IsDialogMessage(hWnd, &msg)) {
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
}
|
|
|
|
GetNHApp()->hPopupWnd = NULL;
|
|
DeleteObject(splashData.hFont);
|
|
}
|
|
|
|
INT_PTR CALLBACK
|
|
NHSplashWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
|
|
switch (message) {
|
|
case WM_INITDIALOG: {
|
|
HDC hdc = GetDC(hWnd);
|
|
cached_font * font = mswin_get_font(NHW_TEXT, ATR_NONE, hdc, FALSE);
|
|
/* set text control font */
|
|
SendMessage(hWnd, WM_SETFONT, (WPARAM)font->hFont, 0);
|
|
ReleaseDC(hWnd, hdc);
|
|
|
|
SetFocus(GetDlgItem(hWnd, IDOK));
|
|
} break;
|
|
|
|
case WM_PAINT: {
|
|
char VersionString[BUFSZ];
|
|
RECT rt;
|
|
HDC hdcBitmap;
|
|
HANDLE OldBitmap;
|
|
HANDLE OldFont;
|
|
PAINTSTRUCT ps;
|
|
|
|
SplashData *splashData = (SplashData *) GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
|
|
|
HDC hdc = BeginPaint(hWnd, &ps);
|
|
/* Show splash graphic */
|
|
|
|
hdcBitmap = CreateCompatibleDC(hdc);
|
|
SetBkMode(hdc, OPAQUE);
|
|
OldBitmap = SelectObject(hdcBitmap, GetNHApp()->bmpSplash);
|
|
(*GetNHApp()->lpfnTransparentBlt)(hdc,
|
|
splashData->offset_x, splashData->offset_y,
|
|
splashData->width, splashData->height, hdcBitmap,
|
|
0, 0, SPLASH_WIDTH_96DPI, SPLASH_HEIGHT_96DPI,
|
|
TILE_BK_COLOR);
|
|
|
|
SelectObject(hdcBitmap, OldBitmap);
|
|
DeleteDC(hdcBitmap);
|
|
|
|
SetBkMode(hdc, TRANSPARENT);
|
|
/* Print version number */
|
|
|
|
SetTextColor(hdc, RGB(0, 0, 0));
|
|
rt.right = rt.left = splashData->offset_x + splashData->version_x;
|
|
rt.bottom = rt.top = splashData->offset_y + splashData->version_y;
|
|
Sprintf(VersionString, "%d.%d.%d", VERSION_MAJOR, VERSION_MINOR,
|
|
PATCHLEVEL);
|
|
OldFont = SelectObject(hdc, splashData->hFont);
|
|
DrawText(hdc, VersionString, strlen(VersionString), &rt,
|
|
DT_LEFT | DT_NOPREFIX | DT_CALCRECT);
|
|
DrawText(hdc, VersionString, strlen(VersionString), &rt,
|
|
DT_LEFT | DT_NOPREFIX);
|
|
EndPaint(hWnd, &ps);
|
|
} break;
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam)) {
|
|
case IDCANCEL:
|
|
case IDOK:
|
|
mswin_window_mark_dead(mswin_winid_from_handle(hWnd));
|
|
if (GetNHApp()->hMainWnd == hWnd)
|
|
GetNHApp()->hMainWnd = NULL;
|
|
DestroyWindow(hWnd);
|
|
SetFocus(GetNHApp()->hMainWnd);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
|
|
case WM_DPICHANGED: {
|
|
SplashData *splashData = (SplashData *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
|
|
|
MonitorInfo monitorInfo;
|
|
win10_monitor_info(hWnd, &monitorInfo);
|
|
|
|
mswin_set_splash_data(hWnd, splashData, monitorInfo.scale);
|
|
|
|
InvalidateRect(hWnd, NULL, TRUE);
|
|
} break;
|
|
|
|
}
|
|
return FALSE;
|
|
}
|