1
0
Fork 0
mirror of https://github.com/k4zmu2a/SpaceCadetPinball.git synced 2024-11-23 01:10:19 +01:00

score, high_score ready.

Added dialog rc.
This commit is contained in:
oz 2020-12-12 16:36:20 +03:00
parent fe254ef03c
commit 2da95a2e8a
9 changed files with 720 additions and 39 deletions

Binary file not shown.

View file

@ -113,7 +113,219 @@ PBMSG_FT RCDATA "PB_MSGFT.bin"
// Icon with lowest ID value placed first to ensure application icon // Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems. // remains consistent on all systems.
ICON_1 ICON "icon_1.ico" ICON_1 ICON "icon_1.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
DIALOG_1 DIALOG 18, 18, 157, 78
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
CAPTION "About"
BEGIN
CTEXT "3D-Pinball for Windows",-1,11,6,135,8
CTEXT "Version 1.0",-1,40,37,76,8
ICON "ICON_1",-1,69,18,16,16
DEFPUSHBUTTON "Ok",1,66,60,24,12
END
DLG_HIGHSCORES DIALOGEX 20, 22, 274, 141
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "High Scores"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
DEFPUSHBUTTON "OK",DLG_HIGHSCORES_Ok,109,120,50,14
PUSHBUTTON "Cancel",DLG_HIGHSCORES_Cancel,163,120,50,14
PUSHBUTTON "&Clear",DLG_HIGHSCORES_Clear,217,120,50,14
LTEXT "Name",701,49,7,24,8
LTEXT "Score",702,200,7,20,8
LTEXT "Rank",703,13,7,20,8
RTEXT "1",704,13,31,16,12
RTEXT "2",705,13,47,16,12
RTEXT "3",706,13,63,16,12
RTEXT "4",707,13,79,16,12
RTEXT "5",708,13,95,16,12
LTEXT "",DLG_HIGHSCORES_StaticName1,49,31,120,12
LTEXT "",DLG_HIGHSCORES_StaticName2,49,47,120,12
LTEXT "",DLG_HIGHSCORES_StaticName3,49,63,120,12
LTEXT "",DLG_HIGHSCORES_StaticName4,49,79,120,12
LTEXT "",DLG_HIGHSCORES_StaticName5,49,95,120,12
RTEXT "",DLG_HIGHSCORES_Score1,180,31,58,12
RTEXT "",DLG_HIGHSCORES_Score2,180,47,58,12
RTEXT "",DLG_HIGHSCORES_Score3,180,63,58,12
RTEXT "",DLG_HIGHSCORES_Score4,180,79,58,12
RTEXT "",DLG_HIGHSCORES_Score5,180,95,58,12
EDITTEXT DLG_HIGHSCORES_EditName1,47,29,120,12,WS_DISABLED
EDITTEXT DLG_HIGHSCORES_EditName2,47,45,120,12,WS_DISABLED
EDITTEXT DLG_HIGHSCORES_EditName3,47,61,120,12,WS_DISABLED
EDITTEXT DLG_HIGHSCORES_EditName4,47,77,120,12,WS_DISABLED
EDITTEXT DLG_HIGHSCORES_EditName5,47,93,120,12,WS_DISABLED
CONTROL "",606,"Static",SS_BLACKFRAME,7,21,259,92
END
EDIT_COMPONENTS DIALOG 0, 0, 312, 94
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION | WS_SYSMENU
CAPTION "Edit Pinball Components FOR TESTING ONLY"
BEGIN
LISTBOX 100,1,12,68,79,LBS_SORT | WS_VSCROLL | WS_TABSTOP
DEFPUSHBUTTON "OK",1,81,75,41,14
GROUPBOX "",103,136,0,175,93
EDITTEXT 130,141,10,34,12
EDITTEXT 131,141,23,34,12
EDITTEXT 132,141,36,34,12
EDITTEXT 133,141,49,34,12
EDITTEXT 134,141,62,34,12
EDITTEXT 135,141,75,34,12
LTEXT "Text",136,178,12,130,8
LTEXT "Text",137,178,25,130,8
LTEXT "Text",138,178,38,130,8
LTEXT "Text",139,178,51,130,8
LTEXT "Text",140,178,64,130,8
LTEXT "Text",141,178,77,130,8
EDITTEXT 149,142,10,38,12
EDITTEXT 150,142,23,38,12
EDITTEXT 151,142,36,38,12
EDITTEXT 152,142,49,38,12
EDITTEXT 153,142,62,38,12
EDITTEXT 154,142,75,38,12
LTEXT "1",156,184,12,120,8
LTEXT "2",157,184,25,120,8
LTEXT "3",158,184,38,120,8
LTEXT "4",159,184,51,120,8
LTEXT "5",160,184,64,120,8
LTEXT "6",161,184,77,120,8
PUSHBUTTON "Reset",163,81,56,41,12
LTEXT "Text",164,146,26,162,8
LTEXT "Text",165,146,54,162,8
LTEXT "Text",166,146,81,162,8
PUSHBUTTON "Change...",167,245,10,62,14
PUSHBUTTON "Change...",168,245,38,62,14
PUSHBUTTON "Change...",169,245,65,62,14
CONTROL "Sound Effects",170,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,74,10,58,10
CONTROL "Physics",171,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,73,24,59,10
CONTROL "Scoring",172,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,73,38,40,10
LTEXT "Text",173,146,13,97,8
LTEXT "Text",174,146,41,97,8
LTEXT "Text",175,146,68,97,8
LTEXT "Components:",176,2,3,43,8
END
KEYMAPPER DIALOG 2, 9, 284, 183
STYLE DS_SETFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION | WS_SYSMENU
CAPTION "3D Pinball: Player Controls"
FONT 8, "MS Shell Dlg"
BEGIN
PUSHBUTTON "OK",1,119,163,50,14
PUSHBUTTON "Cancel",2,173,163,50,14
PUSHBUTTON "&Default",501,227,163,50,14
LTEXT "&Left Flipper",901,20,87,39,10
COMBOBOX 401,66,85,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Right &Flipper",902,146,87,44,10
COMBOBOX 402,192,85,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Left &Table Bump",904,20,107,34,17
COMBOBOX 404,66,108,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "&Right Table Bump",905,146,107,38,19
COMBOBOX 405,192,108,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "&BottomTable Bump",906,20,131,41,18
COMBOBOX 406,66,133,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "&Plunger",903,146,136,39,8
COMBOBOX 403,192,133,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "To change game controls, choose the control options you want, click the Arrow buttons to change specific keys, and then choose OK.",801,14,17,249,18
LTEXT "To restore 3D Pinball to its original settings, choose Default, and then choose OK. To use the Arrow keys on the numeric keypad, make sure NUMLOCK is off.",802,14,38,256,25
GROUPBOX "Control Options",908,7,71,269,87
GROUPBOX "Instructions",909,7,5,269,61
END
XXDLG_HIGHSCORES DIALOG 20, 22, 211, 116
STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "High Scores"
BEGIN
DEFPUSHBUTTON "OK",1,32,97,33,14,BS_LEFTTEXT
PUSHBUTTON "Cancel",2,89,97,33,14
PUSHBUTTON "&Clear",112,146,97,33,14
LTEXT "Name",-1,51,8,24,8
LTEXT "Score",-1,160,8,20,8
LTEXT "Rank",-1,15,8,20,8
RTEXT "1",-1,15,28,16,12
RTEXT "2",-1,15,40,16,12
RTEXT "3",-1,15,52,16,12
RTEXT "4",-1,15,64,16,12
RTEXT "5",-1,15,76,16,12
LTEXT "",401,51,28,88,12
LTEXT "",402,51,40,88,12
LTEXT "",403,51,52,88,12
LTEXT "",404,51,64,88,12
LTEXT "",405,51,76,88,12
RTEXT "",501,140,28,58,12
RTEXT "",502,140,40,58,12
RTEXT "",503,140,52,58,12
RTEXT "",504,140,64,58,12
RTEXT "",505,140,76,58,12
EDITTEXT 601,49,26,88,12,WS_DISABLED
EDITTEXT 602,49,38,88,12,WS_DISABLED
EDITTEXT 603,49,50,88,12,WS_DISABLED
EDITTEXT 604,49,62,88,12,WS_DISABLED
EDITTEXT 605,49,74,88,12,WS_DISABLED
CONTROL "",-1,"Static",SS_BLACKFRAME,9,22,195,69
END
XXKEYMAPPER DIALOG 2, 9, 277, 158
STYLE DS_SETFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION | WS_SYSMENU
CAPTION "3D Pinball: Player Controls"
FONT 8, "MS Shell Dlg"
BEGIN
PUSHBUTTON "OK",1,221,84,50,14
PUSHBUTTON "Cancel",2,221,105,50,14
PUSHBUTTON "Default",501,221,127,50,14
COMBOBOX 401,50,82,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
COMBOBOX 402,157,82,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
COMBOBOX 404,50,105,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
COMBOBOX 405,157,105,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
COMBOBOX 406,50,130,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
COMBOBOX 403,157,130,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
RTEXT "Plunger",811,114,133,39,8
RTEXT "Right Flipper",807,107,84,46,10
CTEXT "Left Table Bump",912,12,102,34,19
CTEXT "Right Table Bump",914,115,102,38,19
LTEXT "To change game controls, choose the control options you want, click the Arrow buttons to change specific keys, and then choose OK.",801,12,13,249,18
LTEXT "To restore 3D Pinball to its original settings, choose Default, and then choose OK. To use the Arrow keys on the numeric keypad, make sure NUMLOCK is off.",802,12,32,256,25
GROUPBOX "Control Options",908,5,67,214,87
RTEXT "Left Flipper",803,9,84,39,10
GROUPBOX "Instructions",909,5,1,265,61
CTEXT "BottomTable Bump",916,7,127,41,19
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
"DIALOG_1", DIALOG
BEGIN
END
"DLG_HIGHSCORES", DIALOG
BEGIN
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// AFX_DIALOG_LAYOUT
//
DLG_HIGHSCORES AFX_DIALOG_LAYOUT
BEGIN
0
END
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////

View file

@ -1,16 +1,306 @@
#include "pch.h" #include "pch.h"
#include "high_score.h" #include "high_score.h"
int high_score::read(CHAR* table, int* ptrToSmth) #include "fullscrn.h"
#include "memory.h"
#include "options.h"
#include "pinball.h"
#include "resource.h"
#include "winmain.h"
int high_score::dlg_enter_name;
int high_score::dlg_score;
int high_score::position;
LPCSTR high_score::default_name;
high_score_struct* high_score::dlg_hst;
winhelp_entry high_score::winHelpArgs[21]
{ {
winhelp_entry{0x70, 0x3E9},
winhelp_entry{0x191, 0x3EB},
winhelp_entry{0x1F5, 0x3EB},
winhelp_entry{0x259, 0x3EB},
winhelp_entry{0x192, 0x3EB},
winhelp_entry{0x193, 0x3EB},
winhelp_entry{0x194, 0x3EB},
winhelp_entry{0x195, 0x3EB},
winhelp_entry{0x1F6, 0x3EB},
winhelp_entry{0x1F7, 0x3EB},
winhelp_entry{0x1F8, 0x3EB},
winhelp_entry{0x1F9, 0x3EB},
winhelp_entry{0x2BD, 0x3EB},
winhelp_entry{0x2BE, 0x3EB},
winhelp_entry{0x2BF, 0x3EB},
winhelp_entry{0x2C0, 0x3EB},
winhelp_entry{0x2C1, 0x3EB},
winhelp_entry{0x2C2, 0x3EB},
winhelp_entry{0x2C3, 0x3EB},
winhelp_entry{0x2C4, 0x3EB},
winhelp_entry{0, 0},
};
int high_score::read(high_score_struct* table, int* ptrToSmth)
{
char Buffer[20];
int scoreSum = 0;
clear_table(table);
char* buf1 = memory::allocate(300u);
if (!buf1)
return 1;
char* buf2 = memory::allocate(300u);
int position = 0;
high_score_struct* tablePtr = table;
const CHAR* optPath = pinball::get_rc_string(166, 0);
do
{
_itoa_s(position, Buffer, 10);
lstrcatA(Buffer, ".Name");
options::get_string(optPath, Buffer, buf1, pinball::WindowName, 32);
buf1[32] = 0;
lstrcpyA(tablePtr->Name, buf1);
_itoa_s(position, Buffer, 10);
lstrcatA(Buffer, ".Score");
options::get_string(optPath, Buffer, buf1, pinball::WindowName, 300);
tablePtr->Score = atol(buf1);
for (int i = lstrlenA(tablePtr->Name); --i >= 0; scoreSum += tablePtr->Name[i])
{
}
scoreSum += tablePtr->Score;
++position;
++tablePtr;
}
while (position < 5);
scramble_number_string(scoreSum, buf1);
options::get_string(optPath, "Verification", buf2, pinball::WindowName, 300);
if (lstrcmpA(buf1, buf2))
clear_table(table);
memory::free(buf1);
memory::free(buf2);
return 0; return 0;
} }
int high_score::write(CHAR* table, int* ptrToSmth) int high_score::write(high_score_struct* table, int* ptrToSmth)
{ {
char Buffer[20];
high_score_struct* tablePtr = table;
int scoreSum = 0;
CHAR* buf = memory::allocate(300u);
if (!buf)
return 1;
int position = 0;
const CHAR* optPath = pinball::get_rc_string(166, 0);
do
{
_itoa_s(position, Buffer, 10);
lstrcatA(Buffer, ".Name");
options::set_string(optPath, Buffer, tablePtr->Name);
_itoa_s(position, Buffer, 10);
lstrcatA(Buffer, ".Score");
_ltoa_s(tablePtr->Score, buf, 300, 10);
options::set_string(optPath, Buffer, buf);
for (int i = lstrlenA(tablePtr->Name); --i >= 0; scoreSum += tablePtr->Name[i])
{
}
scoreSum += tablePtr->Score;
++position;
++tablePtr;
}
while (position < 5);
scramble_number_string(scoreSum, buf);
options::set_string(optPath, "Verification", buf);
memory::free(buf);
return 0; return 0;
} }
void high_score::show_high_score_dialog(CHAR* table) void high_score::clear_table(high_score_struct* table)
{ {
for (int index = 5; index; --index)
{
table->Score = -999;
table->Name[0] = 0;
++table;
}
}
int high_score::get_score_position(high_score_struct* table, int score)
{
if (score <= 0)
return -1;
for (int position = 0; position < 5; position++)
{
if (table[position].Score < score)
return position;
}
return -1;
}
int high_score::place_new_score_into(high_score_struct* table, int score, LPSTR scoreStr, int position)
{
if (position >= 0)
{
if (position <= 4)
{
high_score_struct* tablePtr = table + 4;
int index = 5 - position;
do
{
--index;
memcpy(tablePtr, &tablePtr[-1], sizeof(high_score_struct));
--tablePtr;
}
while (index);
}
high_score_struct* posTable = &table[position];
posTable->Score = score;
if (lstrlenA(scoreStr) >= 31)
scoreStr[31] = 0;
lstrcpyA(posTable->Name, scoreStr);
posTable->Name[31] = 0;
}
return position;
}
void high_score::scramble_number_string(int Value, char* Buffer)
{
_ltoa_s(Value, Buffer, 300, 10);
}
void high_score::show_high_score_dialog(high_score_struct* table)
{
dlg_enter_name = 0;
dlg_score = 0;
dlg_hst = table;
DialogBoxParamA(winmain::hinst, "dlg_highscores", winmain::hwnd_frame, HighScore, 0);
}
void high_score::show_and_set_high_score_dialog(high_score_struct* table, int score, int pos, LPCSTR defaultName)
{
position = pos;
dlg_score = score;
dlg_hst = table;
dlg_enter_name = 1;
default_name = defaultName;
while (DialogBoxParamA(winmain::hinst, "dlg_highscores", winmain::hwnd_frame, HighScore, 0))
{
}
}
INT_PTR __stdcall high_score::HighScore(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HWND parent;
int nIDDlgItem;
CHAR String1[256];
CHAR name[32];
switch (msg)
{
case WM_CLOSE:
SendMessageA(hWnd, WM_COMMAND, WM_DESTROY, 0);
break;
case WM_HELP:
WinHelpA(*(HWND*)(lParam + 12), "pinball.hlp", HELP_WM_HELP, (ULONG_PTR)winHelpArgs);
break;
case WM_CONTEXTMENU:
WinHelpA((HWND)wParam, "pinball.hlp", HELP_CONTEXTMENU, (ULONG_PTR)winHelpArgs);
break;
case WM_INITDIALOG:
show_high_scores(hWnd, dlg_hst);
for (nIDDlgItem = DLG_HIGHSCORES_EditName1; nIDDlgItem < 611; ++nIDDlgItem)
{
ShowWindow(GetDlgItem(hWnd, nIDDlgItem), 0);
}
if (dlg_enter_name == 1)
{
if (position == -1)
{
dlg_enter_name = 0;
return 1;
}
HWND nameTextBox = GetDlgItem(hWnd, position + DLG_HIGHSCORES_EditName1);
ShowWindow(nameTextBox, 5);
EnableWindow(nameTextBox, 1);
SetFocus(nameTextBox);
if (default_name)
{
SetWindowTextA(nameTextBox, default_name);
SendMessageA(nameTextBox, EM_SETSEL, 0, -1);
}
SendMessageA(nameTextBox, EM_SETLIMITTEXT, 31u, 0);
}
else
{
SetFocus(hWnd);
}
parent = GetParent(hWnd);
if (parent)
fullscrn::center_in(parent, hWnd);
return 0;
case WM_COMMAND:
switch (wParam)
{
case DLG_HIGHSCORES_Ok:
if (dlg_enter_name != 1)
{
break;
}
GetDlgItemTextA(hWnd, position + DLG_HIGHSCORES_EditName1, name, 32);
name[31] = 0;
place_new_score_into(dlg_hst, dlg_score, name, position);
break;
case DLG_HIGHSCORES_Cancel:
break;
case DLG_HIGHSCORES_Clear:
lstrcpyA(String1, pinball::get_rc_string(41, 0));
if (MessageBoxA(hWnd, pinball::get_rc_string(40, 0), String1, MB_DEFBUTTON2 | MB_OKCANCEL) == 1)
{
clear_table(dlg_hst);
if (dlg_enter_name)
EndDialog(hWnd, 1);
else
EndDialog(hWnd, 0);
}
return 0;
default:
return 0;
}
dlg_enter_name = 0;
EndDialog(hWnd, 0);
return 1;
}
return 0;
}
void high_score::show_high_scores(HWND hDlg, high_score_struct* table)
{
high_score_struct* tablePtr = table;
int nextPosition = 0;
for (int i = 0; i < 5; ++i)
{
if (dlg_enter_name == 1 && position == i)
{
hsdlg_show_score(hDlg, " ", dlg_score, i);
nextPosition = 1;
}
hsdlg_show_score(hDlg, tablePtr->Name, tablePtr->Score, i + nextPosition);
++tablePtr;
}
}
void high_score::hsdlg_show_score(HWND hDlg, LPCSTR name, int score, int position)
{
CHAR scoreStr[36];
if (position < 5)
{
score::string_format(score, scoreStr);
if (scoreStr[0])
{
SetWindowTextA(GetDlgItem(hDlg, position + DLG_HIGHSCORES_StaticName1), name);
SetWindowTextA(GetDlgItem(hDlg, position + DLG_HIGHSCORES_Score1), scoreStr);
}
}
} }

View file

@ -1,8 +1,38 @@
#pragma once #pragma once
struct high_score_struct
{
char Name[32];
int Score;
};
struct winhelp_entry
{
int ControlId;
int ContextId;
};
class high_score class high_score
{ {
public: public:
static int read(CHAR* table, int* ptrToSmth); static int read(high_score_struct* table, int* ptrToSmth);
static int write(CHAR* table, int* ptrToSmth); static int write(high_score_struct* table, int* ptrToSmth);
static void show_high_score_dialog(CHAR* table); static void clear_table(high_score_struct* table);
static int get_score_position(high_score_struct* table, int score);
static int place_new_score_into(high_score_struct* table, int score, LPSTR scoreStr, int position);
static void scramble_number_string(int Value, char* Buffer);
static void show_high_score_dialog(high_score_struct* table);
static void show_and_set_high_score_dialog(high_score_struct* table, int score, int pos, LPCSTR defaultName);
static INT_PTR __stdcall HighScore(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
static void show_high_scores(HWND hDlg, high_score_struct* table);
static void hsdlg_show_score(HWND hDlg, LPCSTR name, int score, int position);
private :
static int dlg_enter_name;
static int dlg_score;
static int position;
static LPCSTR default_name;
static high_score_struct* dlg_hst;
static winhelp_entry winHelpArgs[21];
}; };

View file

@ -19,7 +19,7 @@ datFileStruct* pb::record_table = nullptr;
int pb::time_ticks = 0, pb::demo_mode = 0, pb::cheat_mode = 0, pb::game_mode = 2, pb::mode_countdown_, pb:: int pb::time_ticks = 0, pb::demo_mode = 0, pb::cheat_mode = 0, pb::game_mode = 2, pb::mode_countdown_, pb::
ball_speed_limit, pb::state; ball_speed_limit, pb::state;
float pb::time_now, pb::time_next; float pb::time_now, pb::time_next;
char pb::highscore_table[32]; high_score_struct pb::highscore_table[5];
int pb::init() int pb::init()
{ {

View file

@ -1,4 +1,5 @@
#pragma once #pragma once
#include "high_score.h"
#include "partman.h" #include "partman.h"
#include "TPinballTable.h" #include "TPinballTable.h"
@ -35,6 +36,6 @@ public:
private : private :
static int demo_mode, mode_countdown_; static int demo_mode, mode_countdown_;
static float time_now, time_next; static float time_now, time_next;
static char highscore_table[32]; static high_score_struct highscore_table[5];
static int state; static int state;
}; };

View file

@ -4,7 +4,9 @@
// //
#define IDS_STRING101 0 #define IDS_STRING101 0
#define IDS_STRING102 1 #define IDS_STRING102 1
#define DLG_HIGHSCORES_Ok 1
#define IDS_STRING103 2 #define IDS_STRING103 2
#define DLG_HIGHSCORES_Cancel 2
#define IDS_STRING104 3 #define IDS_STRING104 3
#define IDS_STRING105 4 #define IDS_STRING105 4
#define IDS_STRING106 5 #define IDS_STRING106 5
@ -119,6 +121,7 @@
#define IDS_STRING211 110 #define IDS_STRING211 110
#define IDS_STRING212 111 #define IDS_STRING212 111
#define IDS_STRING213 112 #define IDS_STRING213 112
#define DLG_HIGHSCORES_Clear 112
#define IDS_STRING214 113 #define IDS_STRING214 113
#define IDS_STRING215 114 #define IDS_STRING215 114
#define IDS_STRING216 115 #define IDS_STRING216 115
@ -199,22 +202,36 @@
#define Menu1_Music 202 #define Menu1_Music 202
#define Menu1_Help_Topics 301 #define Menu1_Help_Topics 301
#define Menu1_Launch_Ball 401 #define Menu1_Launch_Ball 401
#define DLG_HIGHSCORES_StaticName1 401
#define Menu1_Pause_Resume_Game 402 #define Menu1_Pause_Resume_Game 402
#define DLG_HIGHSCORES_StaticName2 402
#define Menu1_Full_Screen 403 #define Menu1_Full_Screen 403
#define DLG_HIGHSCORES_StaticName3 403
#define Menu1_Demo 404 #define Menu1_Demo 404
#define DLG_HIGHSCORES_StaticName4 404
#define Menu1_Select_Table 405 #define Menu1_Select_Table 405
#define DLG_HIGHSCORES_StaticName5 405
#define Menu1_Player_Controls 406 #define Menu1_Player_Controls 406
#define Menu1_1Player 408 #define Menu1_1Player 408
#define Menu1_2Players 409 #define Menu1_2Players 409
#define Menu1_3Players 410 #define Menu1_3Players 410
#define Menu1_4Players 411 #define Menu1_4Players 411
#define ID_GAME_D 40003 #define DLG_HIGHSCORES_Score1 501
#define DLG_HIGHSCORES_Score2 502
#define DLG_HIGHSCORES_Score3 503
#define DLG_HIGHSCORES_Score4 504
#define DLG_HIGHSCORES_Score5 505
#define DLG_HIGHSCORES_EditName1 601
#define DLG_HIGHSCORES_EditName2 602
#define DLG_HIGHSCORES_EditName3 603
#define DLG_HIGHSCORES_EditName4 604
#define DLG_HIGHSCORES_EditName5 605
// Next default values for new objects // Next default values for new objects
// //
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 201 #define _APS_NEXT_RESOURCE_VALUE 203
#define _APS_NEXT_COMMAND_VALUE 40004 #define _APS_NEXT_COMMAND_VALUE 40004
#define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_SYMED_VALUE 101

View file

@ -3,6 +3,7 @@
#include "loader.h" #include "loader.h"
#include "memory.h" #include "memory.h"
#include "partman.h" #include "partman.h"
#include "TDrain.h"
#include "winmain.h" #include "winmain.h"
score_msg_font_type* score::msg_fontp; score_msg_font_type* score::msg_fontp;
@ -17,7 +18,7 @@ scoreStruct* score::create(LPCSTR fieldName, gdrv_bitmap8* renderBgBmp)
scoreStruct* score = (scoreStruct*)memory::allocate(sizeof(scoreStruct)); scoreStruct* score = (scoreStruct*)memory::allocate(sizeof(scoreStruct));
if (!score) if (!score)
return nullptr; return nullptr;
score->Unknown1 = -9999; score->Score = -9999;
score->BackgroundBmp = renderBgBmp; score->BackgroundBmp = renderBgBmp;
__int16* shortArr = (__int16*)partman::field_labeled(loader::loader_table, fieldName, datFieldTypes::ShortArray); __int16* shortArr = (__int16*)partman::field_labeled(loader::loader_table, fieldName, datFieldTypes::ShortArray);
if (!shortArr) if (!shortArr)
@ -26,20 +27,17 @@ scoreStruct* score::create(LPCSTR fieldName, gdrv_bitmap8* renderBgBmp)
return nullptr; return nullptr;
} }
int groupIndex = *shortArr++; int groupIndex = *shortArr++;
score->Short1 = *shortArr++; score->OffsetX = *shortArr++;
score->Short2 = *shortArr++; score->OffsetY = *shortArr++;
score->Short3 = *shortArr++; score->Width = *shortArr++;
score->Short4 = *shortArr; score->Height = *shortArr;
char** bmpPtr = &score->Bitmap8Bit1;
int index = 10; for (int index = 0; index < 10; index++)
do
{ {
*bmpPtr = partman::field(loader::loader_table, groupIndex, datFieldTypes::Bitmap8bit); score->CharBmp[index] = reinterpret_cast<gdrv_bitmap8*>(partman::field(
++bmpPtr; loader::loader_table, groupIndex, datFieldTypes::Bitmap8bit));
++groupIndex; ++groupIndex;
--index;
} }
while (index);
return score; return score;
} }
@ -150,3 +148,141 @@ void score::unload_msg_font()
msg_fontp = nullptr; msg_fontp = nullptr;
} }
} }
void score::erase(scoreStruct* score, int blitFlag)
{
if (score)
{
if (score->BackgroundBmp)
gdrv::copy_bitmap(
&render::vscreen,
score->Width,
score->Height,
score->OffsetX,
score->OffsetY,
score->BackgroundBmp,
score->OffsetX,
score->OffsetY);
else
gdrv::fill_bitmap(&render::vscreen, score->Width, score->Height, score->OffsetX, score->OffsetY, 0);
if (blitFlag)
gdrv::blit(
&render::vscreen,
score->OffsetX,
score->OffsetY,
score->OffsetX + render::vscreen.XPosition,
score->OffsetY + render::vscreen.YPosition,
score->Width,
score->Height);
}
}
void score::set(scoreStruct* score, int value)
{
if (score)
{
score->Score = value;
score->DirtyFlag = true;
}
}
void score::update(scoreStruct* score)
{
char scoreBuf[12];
if (score && score->DirtyFlag && score->Score <= 1000000000)
{
score->DirtyFlag = false;
int x = score->Width + score->OffsetX;
int y = score->OffsetY;
erase(score, 0);
if (score->Score >= 0)
{
_ltoa_s(score->Score, scoreBuf, 10);
int len = strlen(scoreBuf);
for (int index = len - 1; index >= 0; index--)
{
unsigned char curChar = scoreBuf[index];
curChar -= '0';
gdrv_bitmap8* bmp = score->CharBmp[curChar];
x -= bmp->Width;
int height = bmp->Height;
int width = bmp->Width;
if (render::background_bitmap)
gdrv::copy_bitmap_w_transparency(&render::vscreen, width, height, x, y, bmp, 0, 0);
else
gdrv::copy_bitmap(&render::vscreen, width, height, x, y, bmp, 0, 0);
}
}
gdrv::blit(
&render::vscreen,
score->OffsetX,
score->OffsetY,
score->OffsetX + render::vscreen.XPosition,
score->OffsetY + render::vscreen.YPosition,
score->Width,
score->Height);
}
}
void score::string_format(int score, char* str)
{
CHAR separator[12];
if (score == -999)
{
*str = 0;
}
else
{
lstrcpyA(separator, ",");
HKEY phkResult;
DWORD dwDisposition;
if (!RegCreateKeyExA(
HKEY_CURRENT_USER,
"Control Panel\\International",
0,
nullptr,
0,
KEY_ALL_ACCESS,
nullptr,
&phkResult,
&dwDisposition))
{
DWORD cbData = 10;
RegQueryValueExA(phkResult, "sThousand", nullptr, nullptr, (LPBYTE)separator, &cbData);
RegCloseKey(phkResult);
}
int scoreMillions = score % 1000000000 / 1000000;
if (score / 1000000000 <= 0)
{
if (static_cast<int>(scoreMillions) <= 0)
{
if (score % 1000000 / 1000 <= 0)
sprintf_s(str, 36, "%ld", score);
else
sprintf_s(str, 36, "%ld%s%03ld", score % 1000000 / 1000, separator, score % 1000);
}
else
{
sprintf_s(str, 36, "%ld%s%03ld%s%03ld", scoreMillions, separator, score % 1000000 / 1000, separator,
score % 1000);
}
}
else
{
sprintf_s(
str,
36,
"%ld%s%03ld%s%03ld%s%03ld",
score / 1000000000,
separator,
scoreMillions,
separator,
score % 1000000 / 1000,
separator,
score % 1000);
}
}
}

View file

@ -3,23 +3,14 @@
struct scoreStruct struct scoreStruct
{ {
int Unknown1; int Score;
int Unknown2; bool DirtyFlag;
gdrv_bitmap8* BackgroundBmp; gdrv_bitmap8* BackgroundBmp;
int Short1; int OffsetX;
int Short2; int OffsetY;
int Short3; int Width;
int Short4; int Height;
char* Bitmap8Bit1; gdrv_bitmap8* CharBmp[10];
char* Bitmap8Bit2;
char* Bitmap8Bit3;
char* Bitmap8Bit4;
char* Bitmap8Bit5;
char* Bitmap8Bit6;
char* Bitmap8Bit7;
char* Bitmap8Bit8;
char* Bitmap8Bit9;
char* Bitmap8Bit10;
}; };
struct score_msg_font_type struct score_msg_font_type
@ -47,4 +38,8 @@ public:
static scoreStruct* dup(scoreStruct* score, int scoreIndex); static scoreStruct* dup(scoreStruct* score, int scoreIndex);
static void load_msg_font(LPCSTR lpName); static void load_msg_font(LPCSTR lpName);
static void unload_msg_font(); static void unload_msg_font();
static void erase(scoreStruct* score, int blitFlag);
static void set(scoreStruct* score, int value);
static void update(scoreStruct* score);
static void string_format(int score, char* str);
}; };