Files
nethack/win/win32/winhack.c
nethack.allison 80a0fbd62b win32 argc fix
fix a problem when NetHack directory contains spaces.
2002-02-08 02:37:08 +00:00

209 lines
4.8 KiB
C

/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */
// winhack.cpp : Defines the entry point for the application.
//
#include <process.h>
#include "winMS.h"
#include "hack.h"
#include "dlb.h"
#include "resource.h"
#include "mhmain.h"
#include "mhmap.h"
#ifdef OVL0
#define SHARED_DCL
#else
#define SHARED_DCL extern
#endif
extern void FDECL(nethack_exit,(int));
// Global Variables:
NHWinApp _nethack_app;
#ifdef __BORLANDC__
#define _stricmp(s1,s2) stricmp(s1,s2)
#define _strdup(s1) strdup(s1)
#endif
// Foward declarations of functions included in this code module:
BOOL InitInstance(HINSTANCE, int);
extern void FDECL(pcmain, (int,char **));
static void __cdecl mswin_moveloop(void *);
static BOOL initMapTiles(void);
#define MAX_CMDLINE_PARAM 255
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
INITCOMMONCONTROLSEX InitCtrls;
int argc;
char* argv[MAX_CMDLINE_PARAM];
size_t len;
TCHAR *p, *p2;
TCHAR wbuf[BUFSZ];
char buf[BUFSZ];
/* init applicatio structure */
_nethack_app.hApp = hInstance;
_nethack_app.hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_NETHACKW);
_nethack_app.hMainWnd = NULL;
_nethack_app.hPopupWnd = NULL;
_nethack_app.bmpTiles = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_TILES));
if( _nethack_app.bmpTiles==NULL ) panic("cannot load tiles bitmap");
_nethack_app.bmpPetMark = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_PETMARK));
if( _nethack_app.bmpPetMark==NULL ) panic("cannot load pet mark bitmap");
_nethack_app.bmpMapTiles = _nethack_app.bmpTiles;
_nethack_app.mapTile_X = TILE_X;
_nethack_app.mapTile_Y = TILE_Y;
_nethack_app.mapTilesPerLine = TILES_PER_LINE;
_nethack_app.bNoHScroll = FALSE;
_nethack_app.bNoVScroll = FALSE;
_nethack_app.saved_text = strdup("");
// init controls
ZeroMemory(&InitCtrls, sizeof(InitCtrls));
InitCtrls.dwSize = sizeof(InitCtrls);
InitCtrls.dwICC = ICC_LISTVIEW_CLASSES;
InitCommonControlsEx(&InitCtrls);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
/* get command line parameters */
argc = 0;
p = GetCommandLine();
if (p && *p == _T('"')) {
p2 = _tcschr(p + 1, _T('"'));
p = p2 + 2;
argc = 1;
}
p = _tcstok(p, TEXT(" "));
for( ; p && argc<MAX_CMDLINE_PARAM; argc++ ) {
len = _tcslen(p);
if( len>0 ) {
argv[argc] = _strdup( NH_W2A(p, buf, BUFSZ) );
} else {
argv[argc] = "";
}
p = _tcstok(NULL, TEXT(" "));
}
GetModuleFileName(NULL, wbuf, BUFSZ);
argv[0] = _strdup(NH_W2A(wbuf, buf, BUFSZ));
pcmain(argc,argv);
/* initialize map tiles bitmap */
initMapTiles();
moveloop();
return 0;
}
//
// FUNCTION: InitInstance(HANDLE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hWnd = mswin_init_main_window();
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
_nethack_app.hMainWnd = hWnd;
return TRUE;
}
PNHWinApp GetNHApp()
{
return &_nethack_app;
}
BOOL initMapTiles(void)
{
HBITMAP hBmp;
BITMAP bm;
TCHAR wbuf[MAX_PATH];
int tl_num;
SIZE map_size;
extern int total_tiles_used;
/* no file - no tile */
if( !(iflags.wc_tile_file && *iflags.wc_tile_file) )
return TRUE;
/* load bitmap */
hBmp = LoadImage(
GetNHApp()->hApp,
NH_A2W(iflags.wc_tile_file, wbuf, MAX_PATH),
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE | LR_DEFAULTSIZE
);
if( hBmp==NULL ) {
raw_print("Cannot load tiles from the file. Reverting back to default.");
return FALSE;
}
/* calculate tile dimensions */
GetObject(hBmp, sizeof(BITMAP), (LPVOID)&bm);
if( bm.bmWidth%iflags.wc_tile_width ||
bm.bmHeight%iflags.wc_tile_height ) {
DeleteObject(hBmp);
raw_print("Tiles bitmap does not match tile_width and tile_height options. Reverting back to default.");
return FALSE;
}
tl_num = (bm.bmWidth/iflags.wc_tile_width)*
(bm.bmHeight/iflags.wc_tile_height);
if( tl_num<total_tiles_used ) {
DeleteObject(hBmp);
raw_print("Number of tiles in the bitmap is less than required by the game. Reverting back to default.");
return FALSE;
}
/* set the tile information */
if( GetNHApp()->bmpMapTiles!=GetNHApp()->bmpTiles ) {
DeleteObject(GetNHApp()->bmpMapTiles);
}
GetNHApp()->bmpMapTiles = hBmp;
GetNHApp()->mapTile_X = iflags.wc_tile_width;
GetNHApp()->mapTile_Y = iflags.wc_tile_height;
GetNHApp()->mapTilesPerLine = bm.bmWidth / iflags.wc_tile_width;
map_size.cx = GetNHApp()->mapTile_X * COLNO;
map_size.cy = GetNHApp()->mapTile_Y * ROWNO;
mswin_map_stretch(
mswin_hwnd_from_winid(WIN_MAP),
&map_size,
TRUE
);
return TRUE;
}