mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-10 23:01:59 +00:00
- Added simulation of Heretic's startup screen.
SVN r438 (trunk)
This commit is contained in:
parent
ec2e63c6d3
commit
dbe2593500
8 changed files with 630 additions and 170 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
January 5, 2007
|
||||||
|
- Added simulation of Heretic's startup screen.
|
||||||
|
- Changed copyright notice for i_main.cpp, since none of it is really id's
|
||||||
|
code.
|
||||||
|
|
||||||
January 5, 2007 (Changes by Graf Zahl)
|
January 5, 2007 (Changes by Graf Zahl)
|
||||||
- Added customizable border textures. They will be defined with the
|
- Added customizable border textures. They will be defined with the
|
||||||
MAPINFO keyword 'bordertexture' and are settable per map.
|
MAPINFO keyword 'bordertexture' and are settable per map.
|
||||||
|
|
|
@ -2109,7 +2109,7 @@ void D_DoomMain (void)
|
||||||
FActorInfo::StaticGameSet ();
|
FActorInfo::StaticGameSet ();
|
||||||
ST_Progress ();
|
ST_Progress ();
|
||||||
|
|
||||||
Printf ("R_Init: Init %s refresh subsystem\n", GameNames[gameinfo.gametype]);
|
Printf ("R_Init: Init %s refresh subsystem.\n", GameNames[gameinfo.gametype]);
|
||||||
R_Init ();
|
R_Init ();
|
||||||
|
|
||||||
Printf ("DecalLibrary: Load decals.\n");
|
Printf ("DecalLibrary: Load decals.\n");
|
||||||
|
|
|
@ -1,24 +1,38 @@
|
||||||
// Emacs style mode select -*- C++ -*-
|
/*
|
||||||
//-----------------------------------------------------------------------------
|
** i_main.cpp
|
||||||
//
|
** System-specific startup code. Eventually calls D_DoomMain.
|
||||||
// $Id: i_main.c,v 1.8 1998/05/15 00:34:03 killough Exp $
|
**
|
||||||
//
|
**---------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
** Copyright 1998-2007 Randy Heit
|
||||||
//
|
** All rights reserved.
|
||||||
// This source is available for distribution and/or modification
|
**
|
||||||
// only under the terms of the DOOM Source Code License as
|
** Redistribution and use in source and binary forms, with or without
|
||||||
// published by id Software. All rights reserved.
|
** modification, are permitted provided that the following conditions
|
||||||
//
|
** are met:
|
||||||
// The source is distributed in the hope that it will be useful,
|
**
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
** 1. Redistributions of source code must retain the above copyright
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
|
** notice, this list of conditions and the following disclaimer.
|
||||||
// for more details.
|
** 2. Redistributions in binary form must reproduce the above copyright
|
||||||
//
|
** notice, this list of conditions and the following disclaimer in the
|
||||||
//
|
** documentation and/or other materials provided with the distribution.
|
||||||
// DESCRIPTION:
|
** 3. The name of the author may not be used to endorse or promote products
|
||||||
// Main program, simply calls D_DoomMain high level loop.
|
** derived from this software without specific prior written permission.
|
||||||
//
|
**
|
||||||
//-----------------------------------------------------------------------------
|
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
**---------------------------------------------------------------------------
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
// HEADER FILES ------------------------------------------------------------
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -37,13 +51,36 @@
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "w_wad.h"
|
#include "w_wad.h"
|
||||||
|
|
||||||
|
// MACROS ------------------------------------------------------------------
|
||||||
|
|
||||||
|
// The maximum number of functions that can be registered with atterm.
|
||||||
|
#define MAX_TERMS 32
|
||||||
|
|
||||||
|
// TYPES -------------------------------------------------------------------
|
||||||
|
|
||||||
|
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
|
||||||
|
|
||||||
|
extern "C" int cc_install_handlers(int, int*, const char*, int(*)(char*, char*));
|
||||||
|
|
||||||
|
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
||||||
|
|
||||||
|
// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
|
||||||
|
|
||||||
|
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
||||||
|
|
||||||
|
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
||||||
|
|
||||||
|
// The command line arguments.
|
||||||
DArgs Args;
|
DArgs Args;
|
||||||
|
|
||||||
#define MAX_TERMS 32
|
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
||||||
void (*TermFuncs[MAX_TERMS]) ();
|
|
||||||
const char *TermNames[MAX_TERMS];
|
static void (*TermFuncs[MAX_TERMS]) ();
|
||||||
|
static const char *TermNames[MAX_TERMS];
|
||||||
static int NumTerms;
|
static int NumTerms;
|
||||||
|
|
||||||
|
// CODE --------------------------------------------------------------------
|
||||||
|
|
||||||
void addterm (void (*func) (), const char *name)
|
void addterm (void (*func) (), const char *name)
|
||||||
{
|
{
|
||||||
// Make sure this function wasn't already registered.
|
// Make sure this function wasn't already registered.
|
||||||
|
@ -85,7 +122,6 @@ static void STACK_ARGS NewFailure ()
|
||||||
I_FatalError ("Failed to allocate memory from system heap");
|
I_FatalError ("Failed to allocate memory from system heap");
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" int cc_install_handlers(int, int*, const char*, int(*)(char*, char*));
|
|
||||||
static int DoomSpecificInfo (char *buffer, char *end)
|
static int DoomSpecificInfo (char *buffer, char *end)
|
||||||
{
|
{
|
||||||
const char *arg;
|
const char *arg;
|
||||||
|
|
|
@ -1,26 +1,38 @@
|
||||||
// Emacs style mode select -*- C++ -*-
|
/*
|
||||||
//-----------------------------------------------------------------------------
|
** i_main.cpp
|
||||||
//
|
** System-specific startup code. Eventually calls D_DoomMain.
|
||||||
// $Id:$
|
**
|
||||||
//
|
**---------------------------------------------------------------------------
|
||||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
** Copyright 1998-2007 Randy Heit
|
||||||
//
|
** All rights reserved.
|
||||||
// This source is available for distribution and/or modification
|
**
|
||||||
// only under the terms of the DOOM Source Code License as
|
** Redistribution and use in source and binary forms, with or without
|
||||||
// published by id Software. All rights reserved.
|
** modification, are permitted provided that the following conditions
|
||||||
//
|
** are met:
|
||||||
// The source is distributed in the hope that it will be useful,
|
**
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
** 1. Redistributions of source code must retain the above copyright
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
|
** notice, this list of conditions and the following disclaimer.
|
||||||
// for more details.
|
** 2. Redistributions in binary form must reproduce the above copyright
|
||||||
//
|
** notice, this list of conditions and the following disclaimer in the
|
||||||
// $Log:$
|
** documentation and/or other materials provided with the distribution.
|
||||||
//
|
** 3. The name of the author may not be used to endorse or promote products
|
||||||
// DESCRIPTION:
|
** derived from this software without specific prior written permission.
|
||||||
// Main program, simply calls D_DoomMain high level loop.
|
**
|
||||||
//
|
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
//-----------------------------------------------------------------------------
|
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
**---------------------------------------------------------------------------
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
// HEADER FILES ------------------------------------------------------------
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#define _WIN32_WINNT 0x0501
|
#define _WIN32_WINNT 0x0501
|
||||||
|
@ -67,24 +79,39 @@
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
// MACROS ------------------------------------------------------------------
|
||||||
|
|
||||||
|
// The main window's title.
|
||||||
#define WINDOW_TITLE GAMESIG " " DOTVERSIONSTR " (" __DATE__ ")"
|
#define WINDOW_TITLE GAMESIG " " DOTVERSIONSTR " (" __DATE__ ")"
|
||||||
|
|
||||||
|
// The maximum number of functions that can be registered with atterm.
|
||||||
|
#define MAX_TERMS 32
|
||||||
|
|
||||||
|
// TYPES -------------------------------------------------------------------
|
||||||
|
|
||||||
|
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
|
||||||
|
|
||||||
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
|
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
|
||||||
|
|
||||||
void CreateCrashLog (char *custominfo, DWORD customsize);
|
void CreateCrashLog (char *custominfo, DWORD customsize);
|
||||||
extern void DisplayCrashLog ();
|
void DisplayCrashLog ();
|
||||||
|
extern BYTE *ST_Util_BitsForBitmap (BITMAPINFO *bitmap_info);
|
||||||
|
|
||||||
|
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
||||||
|
|
||||||
|
// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
|
||||||
|
|
||||||
|
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
||||||
|
|
||||||
extern EXCEPTION_POINTERS CrashPointers;
|
extern EXCEPTION_POINTERS CrashPointers;
|
||||||
|
extern BITMAPINFO *StartupBitmap;
|
||||||
|
extern UINT TimerPeriod;
|
||||||
|
extern HCURSOR TheArrowCursor, TheInvisibleCursor;
|
||||||
|
|
||||||
// Will this work with something besides VC++?
|
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
||||||
// Answer: yes it will.
|
|
||||||
// Which brings up the question, what won't it work with?
|
|
||||||
//
|
|
||||||
//extern int __argc;
|
|
||||||
//extern char **__argv;
|
|
||||||
|
|
||||||
|
// The command line arguments.
|
||||||
DArgs Args;
|
DArgs Args;
|
||||||
|
|
||||||
const char WinClassName[] = "ZDoomMainWindow";
|
|
||||||
|
|
||||||
HINSTANCE g_hInst;
|
HINSTANCE g_hInst;
|
||||||
DWORD SessionID;
|
DWORD SessionID;
|
||||||
HANDLE MainThread;
|
HANDLE MainThread;
|
||||||
|
@ -100,30 +127,23 @@ HWND ErrorPane, ProgressBar, NetStartPane, StartupScreen;
|
||||||
HFONT GameTitleFont;
|
HFONT GameTitleFont;
|
||||||
LONG GameTitleFontHeight;
|
LONG GameTitleFontHeight;
|
||||||
|
|
||||||
extern struct
|
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
||||||
{
|
|
||||||
BITMAPINFOHEADER Header;
|
|
||||||
RGBQUAD Colors[16];
|
|
||||||
} StartupBitmapInfo;
|
|
||||||
extern BYTE *StartupBitmapBits;
|
|
||||||
|
|
||||||
HMODULE hwtsapi32; // handle to wtsapi32.dll
|
static const char WinClassName[] = "ZDoomMainWindow";
|
||||||
|
static HMODULE hwtsapi32; // handle to wtsapi32.dll
|
||||||
extern UINT TimerPeriod;
|
static void (*TermFuncs[MAX_TERMS])(void);
|
||||||
extern HCURSOR TheArrowCursor, TheInvisibleCursor;
|
|
||||||
|
|
||||||
#define MAX_TERMS 32
|
|
||||||
void (*TermFuncs[MAX_TERMS])(void);
|
|
||||||
static int NumTerms;
|
static int NumTerms;
|
||||||
|
|
||||||
//===========================================================================
|
// CODE --------------------------------------------------------------------
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// atterm
|
// atterm
|
||||||
//
|
//
|
||||||
// Our own atexit because atexit can be problematic under Linux, though I
|
// Our own atexit because atexit can be problematic under Linux, though I
|
||||||
// forget the circumstances that cause trouble.
|
// forget the circumstances that cause trouble.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void atterm (void (*func)(void))
|
void atterm (void (*func)(void))
|
||||||
{
|
{
|
||||||
|
@ -143,13 +163,13 @@ void atterm (void (*func)(void))
|
||||||
TermFuncs[NumTerms++] = func;
|
TermFuncs[NumTerms++] = func;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// popterm
|
// popterm
|
||||||
//
|
//
|
||||||
// Removes the most recently register atterm function.
|
// Removes the most recently register atterm function.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void popterm ()
|
void popterm ()
|
||||||
{
|
{
|
||||||
|
@ -157,11 +177,11 @@ void popterm ()
|
||||||
NumTerms--;
|
NumTerms--;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// call_terms
|
// call_terms
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
static void STACK_ARGS call_terms (void)
|
static void STACK_ARGS call_terms (void)
|
||||||
{
|
{
|
||||||
|
@ -179,26 +199,26 @@ static int STACK_ARGS NewFailure (size_t size)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// UnCOM
|
// UnCOM
|
||||||
//
|
//
|
||||||
// Called by atterm if CoInitialize() succeeded.
|
// Called by atterm if CoInitialize() succeeded.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
static void UnCOM (void)
|
static void UnCOM (void)
|
||||||
{
|
{
|
||||||
CoUninitialize ();
|
CoUninitialize ();
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// UnWTS
|
// UnWTS
|
||||||
//
|
//
|
||||||
// Called by atterm if RegisterSessionNotification() succeeded.
|
// Called by atterm if RegisterSessionNotification() succeeded.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
static void UnWTS (void)
|
static void UnWTS (void)
|
||||||
{
|
{
|
||||||
|
@ -215,14 +235,14 @@ static void UnWTS (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// LayoutErrorPane
|
// LayoutErrorPane
|
||||||
//
|
//
|
||||||
// Lays out the error pane to the desired width, returning the required
|
// Lays out the error pane to the desired width, returning the required
|
||||||
// height.
|
// height.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
static int LayoutErrorPane (HWND pane, int w)
|
static int LayoutErrorPane (HWND pane, int w)
|
||||||
{
|
{
|
||||||
|
@ -282,14 +302,14 @@ static int LayoutErrorPane (HWND pane, int w)
|
||||||
return margin.top*3 + textheight + rectc.bottom;
|
return margin.top*3 + textheight + rectc.bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// LayoutNetStartPane
|
// LayoutNetStartPane
|
||||||
//
|
//
|
||||||
// Lays out the network startup pane to the specified width, returning
|
// Lays out the network startup pane to the specified width, returning
|
||||||
// its required height.
|
// its required height.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
int LayoutNetStartPane (HWND pane, int w)
|
int LayoutNetStartPane (HWND pane, int w)
|
||||||
{
|
{
|
||||||
|
@ -325,14 +345,14 @@ int LayoutNetStartPane (HWND pane, int w)
|
||||||
return margin.top*4 + staticheight + barheight + rectc.bottom;
|
return margin.top*4 + staticheight + barheight + rectc.bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// LayoutMainWindow
|
// LayoutMainWindow
|
||||||
//
|
//
|
||||||
// Lays out the main window with the game title and log controls and
|
// Lays out the main window with the game title and log controls and
|
||||||
// possibly the error pane and progress bar.
|
// possibly the error pane and progress bar.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void LayoutMainWindow (HWND hWnd, HWND pane)
|
void LayoutMainWindow (HWND hWnd, HWND pane)
|
||||||
{
|
{
|
||||||
|
@ -389,14 +409,14 @@ void LayoutMainWindow (HWND hWnd, HWND pane)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// LConProc
|
// LConProc
|
||||||
//
|
//
|
||||||
// The main window's WndProc during startup. During gameplay, the WndProc
|
// The main window's WndProc during startup. During gameplay, the WndProc
|
||||||
// in i_input.cpp is used instead.
|
// in i_input.cpp is used instead.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
LRESULT CALLBACK LConProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
LRESULT CALLBACK LConProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
|
@ -506,8 +526,8 @@ LRESULT CALLBACK LConProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
// Windows expects DIBs to be bottom-up but ours is top-down,
|
// Windows expects DIBs to be bottom-up but ours is top-down,
|
||||||
// so flip it vertically while drawing it.
|
// so flip it vertically while drawing it.
|
||||||
StretchDIBits (drawitem->hDC, rect.left, rect.bottom - 1, rect.right - rect.left, rect.top - rect.bottom,
|
StretchDIBits (drawitem->hDC, rect.left, rect.bottom - 1, rect.right - rect.left, rect.top - rect.bottom,
|
||||||
0, 0, StartupBitmapInfo.Header.biWidth, StartupBitmapInfo.Header.biHeight,
|
0, 0, StartupBitmap->bmiHeader.biWidth, StartupBitmap->bmiHeader.biHeight,
|
||||||
StartupBitmapBits, (BITMAPINFO *)&StartupBitmapInfo, DIB_RGB_COLORS, SRCCOPY);
|
ST_Util_BitsForBitmap(StartupBitmap), StartupBitmap, DIB_RGB_COLORS, SRCCOPY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -529,13 +549,13 @@ LRESULT CALLBACK LConProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
return DefWindowProc (hWnd, msg, wParam, lParam);
|
return DefWindowProc (hWnd, msg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// ErrorPaneProc
|
// ErrorPaneProc
|
||||||
//
|
//
|
||||||
// DialogProc for the error pane.
|
// DialogProc for the error pane.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
INT_PTR CALLBACK ErrorPaneProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
|
INT_PTR CALLBACK ErrorPaneProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
|
@ -574,14 +594,14 @@ INT_PTR CALLBACK ErrorPaneProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lPara
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// I_SetWndProc
|
// I_SetWndProc
|
||||||
//
|
//
|
||||||
// Sets the main WndProc, hides all the child windows, and starts up
|
// Sets the main WndProc, hides all the child windows, and starts up
|
||||||
// in-game input.
|
// in-game input.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void I_SetWndProc()
|
void I_SetWndProc()
|
||||||
{
|
{
|
||||||
|
@ -595,13 +615,13 @@ void I_SetWndProc()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// RestoreConView
|
// RestoreConView
|
||||||
//
|
//
|
||||||
// Returns the main window to its startup state.
|
// Returns the main window to its startup state.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void RestoreConView()
|
void RestoreConView()
|
||||||
{
|
{
|
||||||
|
@ -623,17 +643,20 @@ void RestoreConView()
|
||||||
ShowWindow (ConWindow, SW_SHOW);
|
ShowWindow (ConWindow, SW_SHOW);
|
||||||
ShowWindow (GameTitleWindow, SW_SHOW);
|
ShowWindow (GameTitleWindow, SW_SHOW);
|
||||||
// Make sure the progress bar isn't visible.
|
// Make sure the progress bar isn't visible.
|
||||||
|
if (ST_Done != NULL)
|
||||||
|
{
|
||||||
ST_Done();
|
ST_Done();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// ShowErrorPane
|
// ShowErrorPane
|
||||||
//
|
//
|
||||||
// Shows an error message, preferably in the main window, but it can
|
// Shows an error message, preferably in the main window, but it can
|
||||||
// use a normal message box too.
|
// use a normal message box too.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void ShowErrorPane(const char *text)
|
void ShowErrorPane(const char *text)
|
||||||
{
|
{
|
||||||
|
@ -671,11 +694,11 @@ void ShowErrorPane(const char *text)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// DoMain
|
// DoMain
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void DoMain (HINSTANCE hInstance)
|
void DoMain (HINSTANCE hInstance)
|
||||||
{
|
{
|
||||||
|
@ -871,13 +894,13 @@ void DoMain (HINSTANCE hInstance)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// DoomSpecificInfo
|
// DoomSpecificInfo
|
||||||
//
|
//
|
||||||
// Called by the crash logger to get application-specific information.
|
// Called by the crash logger to get application-specific information.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void DoomSpecificInfo (char *buffer)
|
void DoomSpecificInfo (char *buffer)
|
||||||
{
|
{
|
||||||
|
@ -947,36 +970,36 @@ extern FILE *Logfile;
|
||||||
// To make this work with MinGW, you will need to use inline assembly
|
// To make this work with MinGW, you will need to use inline assembly
|
||||||
// because GCC offers no native support for Windows' SEH.
|
// because GCC offers no native support for Windows' SEH.
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// SleepForever
|
// SleepForever
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void SleepForever ()
|
void SleepForever ()
|
||||||
{
|
{
|
||||||
Sleep (INFINITE);
|
Sleep (INFINITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// ExitMessedUp
|
// ExitMessedUp
|
||||||
//
|
//
|
||||||
// An exception occurred while exiting, so don't do any standard processing.
|
// An exception occurred while exiting, so don't do any standard processing.
|
||||||
// Just die.
|
// Just die.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
LONG WINAPI ExitMessedUp (LPEXCEPTION_POINTERS foo)
|
LONG WINAPI ExitMessedUp (LPEXCEPTION_POINTERS foo)
|
||||||
{
|
{
|
||||||
ExitProcess (1000);
|
ExitProcess (1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// ExitFatally
|
// ExitFatally
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void CALLBACK ExitFatally (ULONG_PTR dummy)
|
void CALLBACK ExitFatally (ULONG_PTR dummy)
|
||||||
{
|
{
|
||||||
|
@ -987,11 +1010,11 @@ void CALLBACK ExitFatally (ULONG_PTR dummy)
|
||||||
exit (-1);
|
exit (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// CatchAllExceptions
|
// CatchAllExceptions
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
LONG WINAPI CatchAllExceptions (LPEXCEPTION_POINTERS info)
|
LONG WINAPI CatchAllExceptions (LPEXCEPTION_POINTERS info)
|
||||||
{
|
{
|
||||||
|
@ -1027,13 +1050,13 @@ LONG WINAPI CatchAllExceptions (LPEXCEPTION_POINTERS info)
|
||||||
return EXCEPTION_CONTINUE_EXECUTION;
|
return EXCEPTION_CONTINUE_EXECUTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// infiniterecursion
|
// infiniterecursion
|
||||||
//
|
//
|
||||||
// Debugging routine for testing the crash logger.
|
// Debugging routine for testing the crash logger.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
static void infiniterecursion(int foo)
|
static void infiniterecursion(int foo)
|
||||||
|
@ -1045,11 +1068,11 @@ static void infiniterecursion(int foo)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// WinMain
|
// WinMain
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE nothing, LPSTR cmdline, int nCmdShow)
|
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE nothing, LPSTR cmdline, int nCmdShow)
|
||||||
{
|
{
|
||||||
|
@ -1113,14 +1136,14 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE nothing, LPSTR cmdline, int n
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// CCMD crashout
|
// CCMD crashout
|
||||||
//
|
//
|
||||||
// Debugging routine for testing the crash logger.
|
// Debugging routine for testing the crash logger.
|
||||||
// Useless in a debug build, because that doesn't enable the crash logger.
|
// Useless in a debug build, because that doesn't enable the crash logger.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
#ifndef _DEBUG
|
#ifndef _DEBUG
|
||||||
#include "c_dispatch.h"
|
#include "c_dispatch.h"
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
#include "gi.h"
|
#include "gi.h"
|
||||||
#include "w_wad.h"
|
#include "w_wad.h"
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
|
#include "m_alloc.h"
|
||||||
|
|
||||||
// MACROS ------------------------------------------------------------------
|
// MACROS ------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -65,12 +66,37 @@
|
||||||
#define ST_NETNOTCH_HEIGHT 16
|
#define ST_NETNOTCH_HEIGHT 16
|
||||||
#define ST_MAX_NETNOTCHES 8
|
#define ST_MAX_NETNOTCHES 8
|
||||||
|
|
||||||
|
#define TEXT_FONT_HEIGHT 14
|
||||||
|
#define TEXT_FONT_NAME "vga-rom-font.14"
|
||||||
|
|
||||||
|
#define THERM_X 14
|
||||||
|
#define THERM_Y 14
|
||||||
|
#define THERM_LEN 51
|
||||||
|
#define THERM_COLOR 0xAA // light green
|
||||||
|
|
||||||
|
// Text mode color values
|
||||||
|
#define LO 85
|
||||||
|
#define MD 170
|
||||||
|
#define HI 255
|
||||||
|
|
||||||
// TYPES -------------------------------------------------------------------
|
// TYPES -------------------------------------------------------------------
|
||||||
|
|
||||||
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
|
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
|
||||||
|
|
||||||
extern void ST_Util_PlanarToChunky4 (BYTE *dest, const BYTE *src, int width, int height);
|
bool ST_Util_CreateStartupWindow ();
|
||||||
extern void ST_Util_DrawBlock (BYTE *dest, const BYTE *src, int bytewidth, int height, int destpitch);
|
void ST_Util_SizeWindowForBitmap ();
|
||||||
|
BITMAPINFO *ST_Util_CreateBitmap (int width, int height, int color_bits);
|
||||||
|
BYTE *ST_Util_BitsForBitmap (BITMAPINFO *bitmap_info);
|
||||||
|
void ST_Util_FreeBitmap (BITMAPINFO *bitmap_info);
|
||||||
|
void ST_Util_PlanarToChunky4 (BYTE *dest, const BYTE *src, int width, int height);
|
||||||
|
void ST_Util_DrawBlock (BYTE *dest, const BYTE *src, int bytewidth, int height, int destpitch);
|
||||||
|
void ST_Util_ClearBlock (BYTE *dest, BYTE fill, int bytewidth, int height, int destpitch);
|
||||||
|
void ST_Util_InvalidateRect (HWND hwnd, BITMAPINFO *bitmap_info, int left, int top, int right, int bottom);
|
||||||
|
BYTE *ST_Util_LoadFont (const char *filename, int height);
|
||||||
|
void ST_Util_FreeFont (BYTE *font);
|
||||||
|
BITMAPINFO *ST_Util_AllocTextBitmap (const BYTE *font);
|
||||||
|
void ST_Util_DrawTextScreen (BITMAPINFO *bitmap_info, const BYTE *text_screen, const BYTE *font);
|
||||||
|
void ST_Util_DrawChar (BITMAPINFO *screen, const BYTE *font, int x, int y, BYTE charnum, BYTE attrib);
|
||||||
|
|
||||||
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
||||||
|
|
||||||
|
@ -91,10 +117,13 @@ static void ST_Hexen_Init ();
|
||||||
static void ST_Hexen_Done ();
|
static void ST_Hexen_Done ();
|
||||||
static void ST_Hexen_Progress ();
|
static void ST_Hexen_Progress ();
|
||||||
|
|
||||||
|
static void ST_Heretic_Init ();
|
||||||
|
static void ST_Heretic_Progress ();
|
||||||
|
|
||||||
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
||||||
|
|
||||||
extern HINSTANCE g_hInst;
|
extern HINSTANCE g_hInst;
|
||||||
extern HWND Window, ConWindow, ProgressBar, NetStartPane, StartupScreen;
|
extern HWND Window, ConWindow, ProgressBar, NetStartPane, StartupScreen, GameTitleWindow;
|
||||||
extern void LayoutMainWindow (HWND hWnd, HWND pane);
|
extern void LayoutMainWindow (HWND hWnd, HWND pane);
|
||||||
|
|
||||||
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
||||||
|
@ -107,19 +136,35 @@ void (*ST_NetMessage)(const char *format, ...);
|
||||||
void (*ST_NetDone)();
|
void (*ST_NetDone)();
|
||||||
bool (*ST_NetLoop)(bool (*timer_callback)(void *), void *userdata);
|
bool (*ST_NetLoop)(bool (*timer_callback)(void *), void *userdata);
|
||||||
|
|
||||||
struct
|
BITMAPINFO *StartupBitmap;
|
||||||
{
|
|
||||||
BITMAPINFOHEADER Header;
|
|
||||||
RGBQUAD Colors[16];
|
|
||||||
} StartupBitmapInfo;
|
|
||||||
BYTE *StartupBitmapBits;
|
|
||||||
|
|
||||||
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
||||||
|
|
||||||
static int MaxPos, CurPos, NotchPos;
|
static int MaxPos, CurPos, NotchPos;
|
||||||
static int NetMaxPos, NetCurPos;
|
static int NetMaxPos, NetCurPos;
|
||||||
static LRESULT NetMarqueeMode;
|
static LRESULT NetMarqueeMode;
|
||||||
static RGBQUAD StartupPalette[16];
|
static int ThermX, ThermY, ThermWidth, ThermHeight;
|
||||||
|
|
||||||
|
static const RGBQUAD TextModePalette[16] =
|
||||||
|
{
|
||||||
|
{ 0, 0, 0, 0 }, // 0 black
|
||||||
|
{ MD, 0, 0, 0 }, // 1 blue
|
||||||
|
{ 0, MD, 0, 0 }, // 2 green
|
||||||
|
{ MD, MD, 0, 0 }, // 3 cyan
|
||||||
|
{ 0, 0, MD, 0 }, // 4 red
|
||||||
|
{ MD, 0, MD, 0 }, // 5 magenta
|
||||||
|
{ 0, MD, MD, 0 }, // 6 brown
|
||||||
|
{ MD, MD, MD, 0 }, // 7 light gray
|
||||||
|
|
||||||
|
{ LO, LO, LO, 0 }, // 8 dark gray
|
||||||
|
{ HI, LO, LO, 0 }, // 9 light blue
|
||||||
|
{ LO, HI, LO, 0 }, // A light green
|
||||||
|
{ HI, HI, LO, 0 }, // B light cyan
|
||||||
|
{ LO, LO, HI, 0 }, // C light red
|
||||||
|
{ HI, LO, HI, 0 }, // D light magenta
|
||||||
|
{ LO, HI, HI, 0 }, // E yellow
|
||||||
|
{ HI, HI, HI, 0 }, // F white
|
||||||
|
};
|
||||||
|
|
||||||
// Hexen's notch graphics, converted to chunky pixels.
|
// Hexen's notch graphics, converted to chunky pixels.
|
||||||
|
|
||||||
|
@ -191,6 +236,10 @@ void ST_Init(int maxProgress)
|
||||||
{
|
{
|
||||||
ST_Hexen_Init ();
|
ST_Hexen_Init ();
|
||||||
}
|
}
|
||||||
|
else if (gameinfo.gametype == GAME_Heretic)
|
||||||
|
{
|
||||||
|
ST_Heretic_Init ();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ST_Basic_Init ();
|
ST_Basic_Init ();
|
||||||
|
@ -494,20 +543,12 @@ static void ST_Hexen_Init ()
|
||||||
{
|
{
|
||||||
int startup_lump = Wads.CheckNumForName ("STARTUP");
|
int startup_lump = Wads.CheckNumForName ("STARTUP");
|
||||||
|
|
||||||
if (startup_lump < 0 || Wads.LumpLength (startup_lump) != 153648)
|
if (startup_lump < 0 || Wads.LumpLength (startup_lump) != 153648 || !ST_Util_CreateStartupWindow())
|
||||||
{
|
{
|
||||||
ST_Basic_Init ();
|
ST_Basic_Init ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
StartupScreen = CreateWindowEx (WS_EX_NOPARENTNOTIFY, "STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_OWNERDRAW, 0, 0, 0, 0, Window, NULL, g_hInst, NULL);
|
|
||||||
if (StartupScreen == NULL)
|
|
||||||
{
|
|
||||||
ST_Basic_Init ();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
SetWindowLong (StartupScreen, GWL_ID, IDC_STATIC_STARTUP);
|
|
||||||
|
|
||||||
BYTE startup_screen[153648];
|
BYTE startup_screen[153648];
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
|
@ -519,20 +560,9 @@ static void ST_Hexen_Init ()
|
||||||
|
|
||||||
color.rgbReserved = 0;
|
color.rgbReserved = 0;
|
||||||
|
|
||||||
// Initialize the bitmap info header.
|
StartupBitmap = ST_Util_CreateBitmap (640, 480, 4);
|
||||||
StartupBitmapInfo.Header.biSize = sizeof(BITMAPINFOHEADER);
|
|
||||||
StartupBitmapInfo.Header.biWidth = 640;
|
|
||||||
StartupBitmapInfo.Header.biHeight = 480;
|
|
||||||
StartupBitmapInfo.Header.biPlanes = 1;
|
|
||||||
StartupBitmapInfo.Header.biBitCount = 4;
|
|
||||||
StartupBitmapInfo.Header.biCompression = 0;
|
|
||||||
StartupBitmapInfo.Header.biSizeImage = 153600;
|
|
||||||
StartupBitmapInfo.Header.biXPelsPerMeter = 0;
|
|
||||||
StartupBitmapInfo.Header.biYPelsPerMeter = 0;
|
|
||||||
StartupBitmapInfo.Header.biClrUsed = 16;
|
|
||||||
StartupBitmapInfo.Header.biClrImportant = 16;
|
|
||||||
|
|
||||||
// Initialize the bitmap header.
|
// Initialize the bitmap palette.
|
||||||
for (int i = 0; i < 16; ++i)
|
for (int i = 0; i < 16; ++i)
|
||||||
{
|
{
|
||||||
color.rgbRed = startup_screen[i*3+0];
|
color.rgbRed = startup_screen[i*3+0];
|
||||||
|
@ -540,15 +570,15 @@ static void ST_Hexen_Init ()
|
||||||
color.rgbBlue = startup_screen[i*3+2];
|
color.rgbBlue = startup_screen[i*3+2];
|
||||||
// Convert from 6-bit per component to 8-bit per component.
|
// Convert from 6-bit per component to 8-bit per component.
|
||||||
quad = (quad << 2) | ((quad >> 4) & 0x03030303);
|
quad = (quad << 2) | ((quad >> 4) & 0x03030303);
|
||||||
StartupBitmapInfo.Colors[i] = color;
|
StartupBitmap->bmiColors[i] = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fill in the bitmap data. Convert to chunky, because I can't figure out
|
// Fill in the bitmap data. Convert to chunky, because I can't figure out
|
||||||
// if Windows actually supports planar images or not, despite the presence
|
// if Windows actually supports planar images or not, despite the presence
|
||||||
// of biPlanes in the BITMAPINFOHEADER.
|
// of biPlanes in the BITMAPINFOHEADER.
|
||||||
StartupBitmapBits = new BYTE[640*480/2];
|
ST_Util_PlanarToChunky4 (ST_Util_BitsForBitmap(StartupBitmap), startup_screen + 48, 640, 480);
|
||||||
ST_Util_PlanarToChunky4 (StartupBitmapBits, startup_screen + 48, 640, 480);
|
|
||||||
|
|
||||||
|
ST_Util_SizeWindowForBitmap ();
|
||||||
LayoutMainWindow (Window, NULL);
|
LayoutMainWindow (Window, NULL);
|
||||||
InvalidateRect (StartupScreen, NULL, TRUE);
|
InvalidateRect (StartupScreen, NULL, TRUE);
|
||||||
|
|
||||||
|
@ -581,6 +611,11 @@ static void ST_Hexen_Done()
|
||||||
DestroyWindow (StartupScreen);
|
DestroyWindow (StartupScreen);
|
||||||
StartupScreen = NULL;
|
StartupScreen = NULL;
|
||||||
}
|
}
|
||||||
|
if (StartupBitmap != NULL)
|
||||||
|
{
|
||||||
|
ST_Util_FreeBitmap (StartupBitmap);
|
||||||
|
StartupBitmap = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -594,7 +629,6 @@ static void ST_Hexen_Done()
|
||||||
static void ST_Hexen_Progress()
|
static void ST_Hexen_Progress()
|
||||||
{
|
{
|
||||||
int notch_pos, x, y;
|
int notch_pos, x, y;
|
||||||
RECT rect;
|
|
||||||
|
|
||||||
if (CurPos < MaxPos)
|
if (CurPos < MaxPos)
|
||||||
{
|
{
|
||||||
|
@ -606,13 +640,9 @@ static void ST_Hexen_Progress()
|
||||||
{
|
{
|
||||||
x = ST_PROGRESS_X + ST_NOTCH_WIDTH * NotchPos;
|
x = ST_PROGRESS_X + ST_NOTCH_WIDTH * NotchPos;
|
||||||
y = ST_PROGRESS_Y;
|
y = ST_PROGRESS_Y;
|
||||||
ST_Util_DrawBlock (StartupBitmapBits + x / 2 + y * 320, NotchBits, ST_NOTCH_WIDTH / 2, ST_NOTCH_HEIGHT, 320);
|
ST_Util_DrawBlock (ST_Util_BitsForBitmap(StartupBitmap) + x / 2 + y * 320,
|
||||||
GetClientRect (StartupScreen, &rect);
|
NotchBits, ST_NOTCH_WIDTH / 2, ST_NOTCH_HEIGHT, 320);
|
||||||
rect.left = x * rect.right / 640 - 1;
|
ST_Util_InvalidateRect (StartupScreen, StartupBitmap, x, y, x + ST_NOTCH_WIDTH, y + ST_NOTCH_HEIGHT);
|
||||||
rect.top = y * rect.bottom / 480 - 1;
|
|
||||||
rect.right = (x + ST_NOTCH_WIDTH) * rect.right / 640 + 1;
|
|
||||||
rect.bottom = (y + ST_NOTCH_HEIGHT) * rect.bottom / 480 + 1;
|
|
||||||
InvalidateRect (StartupScreen, &rect, FALSE);
|
|
||||||
}
|
}
|
||||||
S_Sound (CHAN_BODY, "StartupTick", 1, ATTN_NONE);
|
S_Sound (CHAN_BODY, "StartupTick", 1, ATTN_NONE);
|
||||||
}
|
}
|
||||||
|
@ -620,6 +650,161 @@ static void ST_Hexen_Progress()
|
||||||
I_GetEvent ();
|
I_GetEvent ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// ST_Heretic_Init
|
||||||
|
//
|
||||||
|
// Shows the Hexen startup screen. If the screen doesn't appear to be
|
||||||
|
// valid, it falls back to ST_Basic_Init.
|
||||||
|
//
|
||||||
|
// The loading screen is an 80x25 text screen with character data and
|
||||||
|
// attributes intermixed, which means it must be exactly 4000 bytes long.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
static void ST_Heretic_Init ()
|
||||||
|
{
|
||||||
|
int loading_lump = Wads.CheckNumForName ("LOADING");
|
||||||
|
BYTE loading_screen[4000];
|
||||||
|
BYTE *font;
|
||||||
|
|
||||||
|
if (loading_lump < 0 || Wads.LumpLength (loading_lump) != 4000 || !ST_Util_CreateStartupWindow())
|
||||||
|
{
|
||||||
|
ST_Basic_Init ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
font = ST_Util_LoadFont (TEXT_FONT_NAME, TEXT_FONT_HEIGHT);
|
||||||
|
if (font == NULL)
|
||||||
|
{
|
||||||
|
DestroyWindow (StartupScreen);
|
||||||
|
ST_Basic_Init ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Wads.ReadLump (loading_lump, loading_screen);
|
||||||
|
StartupBitmap = ST_Util_AllocTextBitmap (font);
|
||||||
|
ST_Util_DrawTextScreen (StartupBitmap, loading_screen, font);
|
||||||
|
ST_Util_FreeFont (font);
|
||||||
|
|
||||||
|
ST_Util_SizeWindowForBitmap ();
|
||||||
|
LayoutMainWindow (Window, NULL);
|
||||||
|
InvalidateRect (StartupScreen, NULL, TRUE);
|
||||||
|
|
||||||
|
ThermX = THERM_X * 4;
|
||||||
|
ThermY = THERM_Y * TEXT_FONT_HEIGHT;
|
||||||
|
ThermWidth = THERM_LEN * 4;
|
||||||
|
ThermHeight = TEXT_FONT_HEIGHT;
|
||||||
|
|
||||||
|
ST_Done = ST_Hexen_Done;
|
||||||
|
ST_Progress = ST_Heretic_Progress;
|
||||||
|
ST_NetInit = ST_Basic_NetInit;
|
||||||
|
ST_NetProgress = ST_Basic_NetProgress;
|
||||||
|
ST_NetMessage = ST_Basic_NetMessage;
|
||||||
|
ST_NetDone = ST_Basic_NetDone;
|
||||||
|
ST_NetLoop = ST_Basic_NetLoop;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// ST_Heretic_Progress
|
||||||
|
//
|
||||||
|
// Bumps the progress meter one notch.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
static void ST_Heretic_Progress()
|
||||||
|
{
|
||||||
|
int notch_pos;
|
||||||
|
|
||||||
|
if (CurPos < MaxPos)
|
||||||
|
{
|
||||||
|
CurPos++;
|
||||||
|
notch_pos = (CurPos * ThermWidth) / MaxPos;
|
||||||
|
if (notch_pos != NotchPos && (!(notch_pos & 7) || CurPos == MaxPos))
|
||||||
|
{ // Time to draw another notch.
|
||||||
|
int left = NotchPos + ThermX;
|
||||||
|
int top = ThermY;
|
||||||
|
int right = notch_pos + ThermX;
|
||||||
|
int bottom = top + ThermHeight;
|
||||||
|
ST_Util_ClearBlock (ST_Util_BitsForBitmap(StartupBitmap) + left + top * 320, THERM_COLOR, right - left, bottom - top, 320);
|
||||||
|
ST_Util_InvalidateRect (StartupScreen, StartupBitmap, left*2, top, right*2, bottom);
|
||||||
|
NotchPos = notch_pos;
|
||||||
|
Sleep (20);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
I_GetEvent ();
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// ST_Util_CreateStartupWindow
|
||||||
|
//
|
||||||
|
// Creates the static control that will draw the startup screen.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
bool ST_Util_CreateStartupWindow ()
|
||||||
|
{
|
||||||
|
StartupScreen = CreateWindowEx (WS_EX_NOPARENTNOTIFY, "STATIC", NULL,
|
||||||
|
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_OWNERDRAW,
|
||||||
|
0, 0, 0, 0, Window, NULL, g_hInst, NULL);
|
||||||
|
if (StartupScreen == NULL)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
SetWindowLong (StartupScreen, GWL_ID, IDC_STATIC_STARTUP);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// ST_Util_SizeWindowForBitmap
|
||||||
|
//
|
||||||
|
// Resizes the main window so that the startup bitmap will be draw 1:1.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void ST_Util_SizeWindowForBitmap ()
|
||||||
|
{
|
||||||
|
DEVMODE displaysettings;
|
||||||
|
int w, h, cx, cy, x, y;
|
||||||
|
RECT rect;
|
||||||
|
|
||||||
|
GetClientRect (GameTitleWindow, &rect);
|
||||||
|
w = StartupBitmap->bmiHeader.biWidth + GetSystemMetrics (SM_CXSIZEFRAME)*2;
|
||||||
|
h = StartupBitmap->bmiHeader.biHeight + rect.bottom
|
||||||
|
+ GetSystemMetrics (SM_CYSIZEFRAME) * 2 + GetSystemMetrics (SM_CYCAPTION);
|
||||||
|
|
||||||
|
// Resize the window, but keep its center point the same, unless that
|
||||||
|
// puts it partially offscreen.
|
||||||
|
memset (&displaysettings, 0, sizeof(displaysettings));
|
||||||
|
displaysettings.dmSize = sizeof(displaysettings);
|
||||||
|
EnumDisplaySettings (NULL, ENUM_CURRENT_SETTINGS, &displaysettings);
|
||||||
|
GetWindowRect (Window, &rect);
|
||||||
|
cx = (rect.left + rect.right) / 2;
|
||||||
|
cy = (rect.top + rect.bottom) / 2;
|
||||||
|
x = cx - w / 2;
|
||||||
|
y = cy - h / 2;
|
||||||
|
if (x + w > (int)displaysettings.dmPelsWidth)
|
||||||
|
{
|
||||||
|
x = displaysettings.dmPelsWidth - w;
|
||||||
|
}
|
||||||
|
if (x < 0)
|
||||||
|
{
|
||||||
|
x = 0;
|
||||||
|
}
|
||||||
|
if (y + h > (int)displaysettings.dmPelsHeight)
|
||||||
|
{
|
||||||
|
y = displaysettings.dmPelsHeight - h;
|
||||||
|
}
|
||||||
|
if (y < 0)
|
||||||
|
{
|
||||||
|
y = 0;
|
||||||
|
}
|
||||||
|
MoveWindow (Window, x, y, w, h, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// ST_Util_PlanarToChunky4
|
// ST_Util_PlanarToChunky4
|
||||||
|
@ -692,3 +877,212 @@ void ST_Util_DrawBlock (BYTE *dest, const BYTE *src, int bytewidth, int height,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// ST_Util_ClearBlock
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void ST_Util_ClearBlock (BYTE *dest, BYTE fill, int bytewidth, int height, int destpitch)
|
||||||
|
{
|
||||||
|
while (height > 0)
|
||||||
|
{
|
||||||
|
memset (dest, fill, bytewidth);
|
||||||
|
dest += destpitch;
|
||||||
|
height--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// ST_Util_CreateBitmap
|
||||||
|
//
|
||||||
|
// Creates a BITMAPINFOHEADER, RGBQUAD, and pixel data arranged
|
||||||
|
// consecutively in memory (in other words, a normal Windows BMP file).
|
||||||
|
// The BITMAPINFOHEADER will be filled in, and the caller must fill
|
||||||
|
// in the color and pixel data.
|
||||||
|
//
|
||||||
|
// You must pass 4 or 8 for color_bits.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
BITMAPINFO *ST_Util_CreateBitmap (int width, int height, int color_bits)
|
||||||
|
{
|
||||||
|
DWORD size_image = (width * height) >> int(color_bits == 4);
|
||||||
|
BITMAPINFO *bitmap_info = (BITMAPINFO *)M_Malloc (sizeof(BITMAPINFOHEADER) +
|
||||||
|
(sizeof(RGBQUAD) << color_bits) + size_image);
|
||||||
|
|
||||||
|
// Initialize the header.
|
||||||
|
bitmap_info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||||
|
bitmap_info->bmiHeader.biWidth = width;
|
||||||
|
bitmap_info->bmiHeader.biHeight = height;
|
||||||
|
bitmap_info->bmiHeader.biPlanes = 1;
|
||||||
|
bitmap_info->bmiHeader.biBitCount = color_bits;
|
||||||
|
bitmap_info->bmiHeader.biCompression = 0;
|
||||||
|
bitmap_info->bmiHeader.biSizeImage = size_image;
|
||||||
|
bitmap_info->bmiHeader.biXPelsPerMeter = 0;
|
||||||
|
bitmap_info->bmiHeader.biYPelsPerMeter = 0;
|
||||||
|
bitmap_info->bmiHeader.biClrUsed = 1 << color_bits;
|
||||||
|
bitmap_info->bmiHeader.biClrImportant = 0;
|
||||||
|
|
||||||
|
return bitmap_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// ST_Util_BitsForBitmap
|
||||||
|
//
|
||||||
|
// Given a bitmap created by ST_Util_CreateBitmap, returns the start
|
||||||
|
// address for the pixel data for the bitmap.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
BYTE *ST_Util_BitsForBitmap (BITMAPINFO *bitmap_info)
|
||||||
|
{
|
||||||
|
return (BYTE *)bitmap_info + sizeof(BITMAPINFOHEADER) + (sizeof(RGBQUAD) << bitmap_info->bmiHeader.biBitCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// ST_Util_FreeBitmap
|
||||||
|
//
|
||||||
|
// Frees all the data for a bitmap created by ST_Util_CreateBitmap.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void ST_Util_FreeBitmap (BITMAPINFO *bitmap_info)
|
||||||
|
{
|
||||||
|
free (bitmap_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// ST_Util_InvalidateRect
|
||||||
|
//
|
||||||
|
// Invalidates the portion of the window that the specified rect of the
|
||||||
|
// bitmap appears in.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void ST_Util_InvalidateRect (HWND hwnd, BITMAPINFO *bitmap_info, int left, int top, int right, int bottom)
|
||||||
|
{
|
||||||
|
RECT rect;
|
||||||
|
|
||||||
|
GetClientRect (hwnd, &rect);
|
||||||
|
rect.left = left * rect.right / bitmap_info->bmiHeader.biWidth - 1;
|
||||||
|
rect.top = top * rect.bottom / bitmap_info->bmiHeader.biHeight - 1;
|
||||||
|
rect.right = right * rect.right / bitmap_info->bmiHeader.biWidth + 1;
|
||||||
|
rect.bottom = bottom * rect.bottom / bitmap_info->bmiHeader.biHeight + 1;
|
||||||
|
InvalidateRect (hwnd, &rect, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// ST_Util_LoadFont
|
||||||
|
//
|
||||||
|
// Loads a monochrome fixed-width font. Every character is one byte
|
||||||
|
// (eight pixels) wide.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
BYTE *ST_Util_LoadFont (const char *filename, int height)
|
||||||
|
{
|
||||||
|
int lumpnum, lumplen;
|
||||||
|
BYTE *font;
|
||||||
|
|
||||||
|
lumpnum = Wads.CheckNumForFullName (filename);
|
||||||
|
if (lumpnum < 0)
|
||||||
|
{ // font not found
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
lumplen = Wads.LumpLength (lumpnum);
|
||||||
|
if (lumplen != height << 8)
|
||||||
|
{ // font is a bad size
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
font = new BYTE[lumplen + 1];
|
||||||
|
font[0] = height; // Store font height in the first byte.
|
||||||
|
Wads.ReadLump (lumpnum, font + 1);
|
||||||
|
return font;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ST_Util_FreeFont (BYTE *font)
|
||||||
|
{
|
||||||
|
delete[] font;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// ST_Util_AllocTextBitmap
|
||||||
|
//
|
||||||
|
// Returns a bitmap properly sized to hold an 80x25 display of characters
|
||||||
|
// using the specified font.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
BITMAPINFO *ST_Util_AllocTextBitmap (const BYTE *font)
|
||||||
|
{
|
||||||
|
BITMAPINFO *bitmap = ST_Util_CreateBitmap (80 * 8, 25 * font[0], 4);
|
||||||
|
memcpy (bitmap->bmiColors, TextModePalette, sizeof(TextModePalette));
|
||||||
|
return bitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// ST_Util_DrawTextScreen
|
||||||
|
//
|
||||||
|
// Draws the text screen to the bitmap. The bitmap must be the proper size
|
||||||
|
// for the font.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void ST_Util_DrawTextScreen (BITMAPINFO *bitmap_info, const BYTE *text_screen, const BYTE *font)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
for (y = 0; y < 25; ++y)
|
||||||
|
{
|
||||||
|
for (x = 0; x < 80; ++x)
|
||||||
|
{
|
||||||
|
ST_Util_DrawChar (bitmap_info, font, x, y, text_screen[0], text_screen[1]);
|
||||||
|
text_screen += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// ST_Util_DrawChar
|
||||||
|
//
|
||||||
|
// Draws a character on the bitmap. X and Y specify the character cell,
|
||||||
|
// and fg and bg are 4-bit colors.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void ST_Util_DrawChar (BITMAPINFO *screen, const BYTE *font, int x, int y, BYTE charnum, BYTE attrib)
|
||||||
|
{
|
||||||
|
const BYTE bg_left = attrib & 0xF0;
|
||||||
|
const BYTE fg = attrib & 0x0F;
|
||||||
|
const BYTE fg_left = fg << 4;
|
||||||
|
const BYTE bg = bg_left >> 4;
|
||||||
|
const BYTE color_array[4] = { bg_left | bg, attrib, fg_left | bg, fg_left | fg };
|
||||||
|
const BYTE *src = font + 1 + charnum * font[0];
|
||||||
|
int pitch = screen->bmiHeader.biWidth >> 1;
|
||||||
|
BYTE *dest = ST_Util_BitsForBitmap(screen) + x*4 + y * font[0] * pitch;
|
||||||
|
|
||||||
|
for (y = font[0]; y > 0; --y)
|
||||||
|
{
|
||||||
|
BYTE srcbyte = *src++;
|
||||||
|
|
||||||
|
// Pixels 0 and 1
|
||||||
|
dest[0] = color_array[(srcbyte >> 6) & 3];
|
||||||
|
// Pixels 2 and 3
|
||||||
|
dest[1] = color_array[(srcbyte >> 4) & 3];
|
||||||
|
// Pixels 4 and 5
|
||||||
|
dest[2] = color_array[(srcbyte >> 2) & 3];
|
||||||
|
// Pixels 6 and 7
|
||||||
|
dest[3] = color_array[(srcbyte) & 3];
|
||||||
|
dest += pitch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
BIN
wadsrc/vga-rom.f14
Normal file
BIN
wadsrc/vga-rom.f14
Normal file
Binary file not shown.
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
@zdoom.pk3
|
@zdoom.pk3
|
||||||
|
|
||||||
|
vga-rom-font.14 vga-rom.f14
|
||||||
|
|
||||||
graphics/invgemr2.lmp invgemr2.lmp
|
graphics/invgemr2.lmp invgemr2.lmp
|
||||||
graphics/invgemr1.lmp invgemr1.lmp
|
graphics/invgemr1.lmp invgemr1.lmp
|
||||||
graphics/invgeml2.lmp invgeml2.lmp
|
graphics/invgeml2.lmp invgeml2.lmp
|
||||||
|
|
Loading…
Reference in a new issue