Windows WIP.
This commit is contained in:
parent
c51b91cfe7
commit
e9788e390d
14 changed files with 476 additions and 282 deletions
|
@ -337,7 +337,7 @@ typedef struct
|
||||||
unsigned char ElapsedTime_Seconds;
|
unsigned char ElapsedTime_Seconds;
|
||||||
unsigned char Difficulty;
|
unsigned char Difficulty;
|
||||||
|
|
||||||
FILETIME TimeStamp;
|
time_t TimeStamp;
|
||||||
} SAVE_SLOT_HEADER;
|
} SAVE_SLOT_HEADER;
|
||||||
|
|
||||||
#define NUMBER_OF_SAVE_SLOTS 8
|
#define NUMBER_OF_SAVE_SLOTS 8
|
||||||
|
|
|
@ -69,8 +69,10 @@ typedef struct
|
||||||
{
|
{
|
||||||
char Name[MAX_SIZE_OF_USERS_NAME+1];
|
char Name[MAX_SIZE_OF_USERS_NAME+1];
|
||||||
|
|
||||||
SYSTEMTIME TimeLastUpdated;
|
time_t FileTime;
|
||||||
FILETIME FileTime;
|
|
||||||
|
// used to be an incomplete SYSTEMTIME struct, TimeLastUpdated
|
||||||
|
int unused[6];
|
||||||
|
|
||||||
/* KJL 15:14:12 10/12/98 - array to hold level completion data
|
/* KJL 15:14:12 10/12/98 - array to hold level completion data
|
||||||
3 species, pad out to 16 levels each */
|
3 species, pad out to 16 levels each */
|
||||||
|
|
|
@ -277,7 +277,9 @@ List<int> LoadedNPC::image_groups;
|
||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
extern BOOL Current_Level_Requires_Mirror_Image();
|
extern BOOL Current_Level_Requires_Mirror_Image();
|
||||||
|
extern int AllowGoldWeapons;
|
||||||
};
|
};
|
||||||
|
|
||||||
void InitNPCs(RIFFHANDLE h)
|
void InitNPCs(RIFFHANDLE h)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -572,8 +574,6 @@ void InitNPCs(RIFFHANDLE h)
|
||||||
|
|
||||||
if(AvP.PlayerType==I_Marine || Load_HNPC[HNPC_Marine])
|
if(AvP.PlayerType==I_Marine || Load_HNPC[HNPC_Marine])
|
||||||
{
|
{
|
||||||
extern int AllowGoldWeapons;
|
|
||||||
|
|
||||||
// if the mdisk.rif file exists, add it. Note: Only the Gold version
|
// if the mdisk.rif file exists, add it. Note: Only the Gold version
|
||||||
// has this file, so the OpenGameFile is called just to check if it
|
// has this file, so the OpenGameFile is called just to check if it
|
||||||
// is available.
|
// is available.
|
||||||
|
|
175
src/files.c
175
src/files.c
|
@ -1,6 +1,6 @@
|
||||||
#define _BSD_SOURCE
|
#define _BSD_SOURCE
|
||||||
|
|
||||||
//#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -533,6 +533,179 @@ int CloseGameDirectory(void *dir)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Game-specific helper function.
|
||||||
|
*/
|
||||||
|
static int try_game_directory(char *dir, char *file)
|
||||||
|
{
|
||||||
|
char tmppath[PATH_MAX];
|
||||||
|
|
||||||
|
strncpy(tmppath, dir, PATH_MAX-32);
|
||||||
|
tmppath[PATH_MAX-32] = 0;
|
||||||
|
strcat(tmppath, file);
|
||||||
|
|
||||||
|
return access(tmppath, R_OK) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Game-specific helper function.
|
||||||
|
*/
|
||||||
|
static int check_game_directory(char *dir)
|
||||||
|
{
|
||||||
|
if (!dir || !*dir) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!try_game_directory(dir, "/avp_huds")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!try_game_directory(dir, "/avp_huds/alien.rif")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!try_game_directory(dir, "/avp_rifs")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!try_game_directory(dir, "/avp_rifs/temple.rif")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!try_game_directory(dir, "/fastfile")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!try_game_directory(dir, "/fastfile/ffinfo.txt")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Game-specific initialization
|
||||||
|
*/
|
||||||
|
void InitGameDirectories(char *argv0)
|
||||||
|
{
|
||||||
|
extern char *SecondTex_Directory;
|
||||||
|
extern char *SecondSoundDir;
|
||||||
|
|
||||||
|
char tmppath[PATH_MAX];
|
||||||
|
char *homedir, *gamedir, *localdir, *tmp;
|
||||||
|
char *path;
|
||||||
|
size_t len, copylen;
|
||||||
|
|
||||||
|
SecondTex_Directory = "graphics/";
|
||||||
|
SecondSoundDir = "sound/";
|
||||||
|
|
||||||
|
homedir = getenv("HOME");
|
||||||
|
if (homedir == NULL)
|
||||||
|
homedir = ".";
|
||||||
|
localdir = (char *)malloc(strlen(homedir)+10);
|
||||||
|
strcpy(localdir, homedir);
|
||||||
|
strcat(localdir, "/");
|
||||||
|
strcat(localdir, ".avp");
|
||||||
|
|
||||||
|
tmp = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
1. $AVP_DATA overrides all
|
||||||
|
2. executable path from argv[0]
|
||||||
|
3. realpath of executable path from argv[0]
|
||||||
|
4. $PATH
|
||||||
|
5. current directory
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* 1. $AVP_DATA */
|
||||||
|
gamedir = getenv("AVP_DATA");
|
||||||
|
|
||||||
|
/* $AVP_DATA overrides all, so no check */
|
||||||
|
|
||||||
|
if (gamedir == NULL) {
|
||||||
|
/* 2. executable path from argv[0] */
|
||||||
|
tmp = strdup(argv0);
|
||||||
|
|
||||||
|
if (tmp == NULL) {
|
||||||
|
/* ... */
|
||||||
|
fprintf(stderr, "InitGameDirectories failure\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
gamedir = strrchr(tmp, '/');
|
||||||
|
|
||||||
|
if (gamedir) {
|
||||||
|
*gamedir = 0;
|
||||||
|
gamedir = tmp;
|
||||||
|
|
||||||
|
if (!check_game_directory(gamedir)) {
|
||||||
|
gamedir = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gamedir == NULL) {
|
||||||
|
/* 3. realpath of executable path from argv[0] */
|
||||||
|
|
||||||
|
assert(tmp != NULL);
|
||||||
|
|
||||||
|
gamedir = realpath(tmp, tmppath);
|
||||||
|
|
||||||
|
if (!check_game_directory(gamedir)) {
|
||||||
|
gamedir = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gamedir == NULL) {
|
||||||
|
/* 4. $PATH */
|
||||||
|
path = getenv("PATH");
|
||||||
|
if (path) {
|
||||||
|
while (*path) {
|
||||||
|
len = strcspn(path, ":");
|
||||||
|
|
||||||
|
copylen = min(len, PATH_MAX-1);
|
||||||
|
|
||||||
|
strncpy(tmppath, path, copylen);
|
||||||
|
tmppath[copylen] = 0;
|
||||||
|
|
||||||
|
if (check_game_directory(tmppath)) {
|
||||||
|
gamedir = tmppath;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
path += len;
|
||||||
|
path += strspn(path, ":");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gamedir == NULL) {
|
||||||
|
/* 5. current directory */
|
||||||
|
gamedir = ".";
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(gamedir != NULL);
|
||||||
|
|
||||||
|
/* last chance sanity check */
|
||||||
|
if (!check_game_directory(gamedir)) {
|
||||||
|
fprintf(stderr, "Unable to find the AvP gamedata.\n");
|
||||||
|
fprintf(stderr, "The directory last examined was: %s\n", gamedir);
|
||||||
|
fprintf(stderr, "Has the game been installed and\n");
|
||||||
|
fprintf(stderr, "are all game files lowercase?\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
SetGameDirectories(localdir, gamedir);
|
||||||
|
|
||||||
|
free(localdir);
|
||||||
|
if (tmp) {
|
||||||
|
free(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* delete some log files */
|
||||||
|
DeleteGameFile("dx_error.log");
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef FILES_DRIVER
|
#ifdef FILES_DRIVER
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,6 +37,7 @@ int CreateGameDirectory(const char *dirname);
|
||||||
void *OpenGameDirectory(const char *dirname, const char *pattern, int type);
|
void *OpenGameDirectory(const char *dirname, const char *pattern, int type);
|
||||||
GameDirectoryFile *ScanGameDirectory(void *dir);
|
GameDirectoryFile *ScanGameDirectory(void *dir);
|
||||||
int CloseGameDirectory(void *dir);
|
int CloseGameDirectory(void *dir);
|
||||||
|
void InitGameDirectories(char *argv0);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
};
|
};
|
||||||
|
|
41
src/fixer.h
41
src/fixer.h
|
@ -4,27 +4,31 @@
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
|
|
||||||
// just include the windows header to get everything.
|
// just include the windows header to get everything.
|
||||||
#undef Yes
|
#undef Yes // sigh
|
||||||
#undef No
|
#undef No // sigh
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
#include <mbstring.h>
|
#include <mbstring.h>
|
||||||
|
#define Yes 1 // sigh
|
||||||
|
#define No 0 // sigh
|
||||||
|
|
||||||
#pragma warning( disable: 4996 ) // unsafe function (strcpy, fopen, etc.) used
|
#pragma warning( disable: 4996 ) // unsafe function (strcpy, fopen, etc.) used
|
||||||
|
|
||||||
#define Yes 1
|
|
||||||
#define No 0
|
|
||||||
|
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
|
|
||||||
|
#if !defined(PATH_MAX)
|
||||||
|
#define PATH_MAX MAX_PATH
|
||||||
|
#endif
|
||||||
|
|
||||||
// gonna deal with this one later.
|
// gonna deal with this one later.
|
||||||
#define PACKED
|
#define PACKED
|
||||||
|
|
||||||
// unused directplay code.
|
|
||||||
typedef int DPID;
|
|
||||||
|
|
||||||
// not sure where this was originally defined.
|
// not sure where this was originally defined.
|
||||||
#define RGBA_MAKE(r, g, b, a) ((((a) << 24) | ((r) << 16) | ((g) << 8) | (b)))
|
#define RGBA_MAKE(r, g, b, a) ((((a) << 24) | ((r) << 16) | ((g) << 8) | (b)))
|
||||||
|
|
||||||
|
// unused placeholder directplay code.
|
||||||
|
typedef int DPID;
|
||||||
|
|
||||||
typedef struct DPNAME
|
typedef struct DPNAME
|
||||||
{
|
{
|
||||||
int dwSize;
|
int dwSize;
|
||||||
|
@ -125,6 +129,8 @@ extern "C" {
|
||||||
#define _tcslen strlen
|
#define _tcslen strlen
|
||||||
#define _tcscpy strcpy
|
#define _tcscpy strcpy
|
||||||
|
|
||||||
|
#define _snprintf snprintf
|
||||||
|
|
||||||
size_t _mbclen(const unsigned char *s);
|
size_t _mbclen(const unsigned char *s);
|
||||||
|
|
||||||
#define RGBA_MAKE(r, g, b, a) ((((a) << 24) | ((r) << 16) | ((g) << 8) | (b)))
|
#define RGBA_MAKE(r, g, b, a) ((((a) << 24) | ((r) << 16) | ((g) << 8) | (b)))
|
||||||
|
@ -137,6 +143,7 @@ typedef int HINSTANCE;
|
||||||
typedef int WPARAM;
|
typedef int WPARAM;
|
||||||
typedef int LPARAM;
|
typedef int LPARAM;
|
||||||
typedef int HANDLE;
|
typedef int HANDLE;
|
||||||
|
typedef int HRESULT;
|
||||||
|
|
||||||
typedef int BOOL;
|
typedef int BOOL;
|
||||||
typedef unsigned char BYTE;
|
typedef unsigned char BYTE;
|
||||||
|
@ -166,21 +173,6 @@ typedef __int64 int64_t;
|
||||||
typedef unsigned __int64 uint64_t;
|
typedef unsigned __int64 uint64_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef time_t FILETIME;
|
|
||||||
|
|
||||||
/* this SYSTEMTIME is incorrect, but it is also currently unused */
|
|
||||||
typedef struct SYSTEMTIME
|
|
||||||
{
|
|
||||||
int wYear; /* should be uint16_t, not int32_t */
|
|
||||||
int wMonth;
|
|
||||||
int wDay;
|
|
||||||
/* int wDayOfWeek; */
|
|
||||||
int wHour;
|
|
||||||
int wMinute;
|
|
||||||
int wSecond;
|
|
||||||
/* int wMilliseconds; */
|
|
||||||
} SYSTEMTIME;
|
|
||||||
|
|
||||||
#define VK_BACK 1
|
#define VK_BACK 1
|
||||||
#define VK_END 2
|
#define VK_END 2
|
||||||
#define VK_HOME 3
|
#define VK_HOME 3
|
||||||
|
@ -230,6 +222,7 @@ int SetEndOfFile(HANDLE file);
|
||||||
unsigned int timeGetTime();
|
unsigned int timeGetTime();
|
||||||
unsigned int GetTickCount();
|
unsigned int GetTickCount();
|
||||||
|
|
||||||
|
|
||||||
typedef struct DPNAME
|
typedef struct DPNAME
|
||||||
{
|
{
|
||||||
int dwSize;
|
int dwSize;
|
||||||
|
@ -240,8 +233,6 @@ typedef struct DPNAME
|
||||||
|
|
||||||
#define DP_OK 0
|
#define DP_OK 0
|
||||||
|
|
||||||
typedef int HRESULT;
|
|
||||||
|
|
||||||
#define DPRECEIVE_ALL 1
|
#define DPRECEIVE_ALL 1
|
||||||
#define DPSYS_ADDPLAYERTOGROUP 2
|
#define DPSYS_ADDPLAYERTOGROUP 2
|
||||||
#define DPSYS_CREATEPLAYERORGROUP 3
|
#define DPSYS_CREATEPLAYERORGROUP 3
|
||||||
|
|
282
src/main.c
282
src/main.c
|
@ -10,7 +10,7 @@
|
||||||
#ifndef _GNU_SOURCE
|
#ifndef _GNU_SOURCE
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
#endif
|
#endif
|
||||||
#include <getopt.h>
|
///#include <getopt.h>
|
||||||
|
|
||||||
#include "fixer.h"
|
#include "fixer.h"
|
||||||
|
|
||||||
|
@ -66,10 +66,10 @@ JOYINFOEX JoystickData;
|
||||||
JOYCAPS JoystickCaps;
|
JOYCAPS JoystickCaps;
|
||||||
|
|
||||||
/* defaults */
|
/* defaults */
|
||||||
static int WantFullscreen = 1;
|
static int WantFullscreen = 0;
|
||||||
int WantSound = 1;
|
int WantSound = 1;
|
||||||
static int WantCDRom = 1;
|
static int WantCDRom = 0;
|
||||||
static int WantJoystick = 1;
|
static int WantJoystick = 0;
|
||||||
|
|
||||||
/* originally was "/usr/lib/libGL.so.1:/usr/lib/tls/libGL.so.1:/usr/X11R6/lib/libGL.so" */
|
/* originally was "/usr/lib/libGL.so.1:/usr/lib/tls/libGL.so.1:/usr/X11R6/lib/libGL.so" */
|
||||||
static const char * opengl_library = NULL;
|
static const char * opengl_library = NULL;
|
||||||
|
@ -336,7 +336,7 @@ char *GetVideoModeDescription3()
|
||||||
{
|
{
|
||||||
static char buf[64];
|
static char buf[64];
|
||||||
|
|
||||||
snprintf(buf, 64, "%dx%d", VideoModeList[CurrentVideoMode].w, VideoModeList[CurrentVideoMode].h);
|
_snprintf(buf, 64, "%dx%d", VideoModeList[CurrentVideoMode].w, VideoModeList[CurrentVideoMode].h);
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
@ -1097,187 +1097,23 @@ void FlipBuffers()
|
||||||
|
|
||||||
char *AvpCDPath = 0;
|
char *AvpCDPath = 0;
|
||||||
|
|
||||||
static int try_game_directory(char *dir, char *file)
|
///static const struct option getopt_long_options[] = {
|
||||||
{
|
///{ "help", 0, NULL, 'h' },
|
||||||
char tmppath[PATH_MAX];
|
///{ "version", 0, NULL, 'v' },
|
||||||
|
///{ "fullscreen", 0, NULL, 'f' },
|
||||||
strncpy(tmppath, dir, PATH_MAX-32);
|
///{ "windowed", 0, NULL, 'w' },
|
||||||
tmppath[PATH_MAX-32] = 0;
|
///{ "nosound", 0, NULL, 's' },
|
||||||
strcat(tmppath, file);
|
///{ "nocdrom", 0, NULL, 'c' },
|
||||||
|
///{ "nojoy", 0, NULL, 'j' },
|
||||||
return access(tmppath, R_OK) == 0;
|
///{ "debug", 0, NULL, 'd' },
|
||||||
}
|
///{ "withgl", 1, NULL, 'g' },
|
||||||
|
////*
|
||||||
static int check_game_directory(char *dir)
|
///{ "loadrifs", 1, NULL, 'l' },
|
||||||
{
|
///{ "server", 0, someval, 1 },
|
||||||
if (!dir || !*dir) {
|
///{ "client", 1, someval, 2 },
|
||||||
return 0;
|
///*/
|
||||||
}
|
///{ NULL, 0, NULL, 0 },
|
||||||
|
///};
|
||||||
if (!try_game_directory(dir, "/avp_huds")) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!try_game_directory(dir, "/avp_huds/alien.rif")) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!try_game_directory(dir, "/avp_rifs")) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!try_game_directory(dir, "/avp_rifs/temple.rif")) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!try_game_directory(dir, "/fastfile")) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!try_game_directory(dir, "/fastfile/ffinfo.txt")) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InitGameDirectories(char *argv0)
|
|
||||||
{
|
|
||||||
extern char *SecondTex_Directory;
|
|
||||||
extern char *SecondSoundDir;
|
|
||||||
|
|
||||||
char tmppath[PATH_MAX];
|
|
||||||
char *homedir, *gamedir, *localdir, *tmp;
|
|
||||||
char *path;
|
|
||||||
size_t len, copylen;
|
|
||||||
|
|
||||||
SecondTex_Directory = "graphics/";
|
|
||||||
SecondSoundDir = "sound/";
|
|
||||||
|
|
||||||
homedir = getenv("HOME");
|
|
||||||
if (homedir == NULL)
|
|
||||||
homedir = ".";
|
|
||||||
localdir = (char *)malloc(strlen(homedir)+10);
|
|
||||||
strcpy(localdir, homedir);
|
|
||||||
strcat(localdir, "/");
|
|
||||||
strcat(localdir, ".avp");
|
|
||||||
|
|
||||||
tmp = NULL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
1. $AVP_DATA overrides all
|
|
||||||
2. executable path from argv[0]
|
|
||||||
3. realpath of executable path from argv[0]
|
|
||||||
4. $PATH
|
|
||||||
5. current directory
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* 1. $AVP_DATA */
|
|
||||||
gamedir = getenv("AVP_DATA");
|
|
||||||
|
|
||||||
/* $AVP_DATA overrides all, so no check */
|
|
||||||
|
|
||||||
if (gamedir == NULL) {
|
|
||||||
/* 2. executable path from argv[0] */
|
|
||||||
tmp = strdup(argv0);
|
|
||||||
|
|
||||||
if (tmp == NULL) {
|
|
||||||
/* ... */
|
|
||||||
fprintf(stderr, "InitGameDirectories failure\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
gamedir = strrchr(tmp, '/');
|
|
||||||
|
|
||||||
if (gamedir) {
|
|
||||||
*gamedir = 0;
|
|
||||||
gamedir = tmp;
|
|
||||||
|
|
||||||
if (!check_game_directory(gamedir)) {
|
|
||||||
gamedir = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gamedir == NULL) {
|
|
||||||
/* 3. realpath of executable path from argv[0] */
|
|
||||||
|
|
||||||
assert(tmp != NULL);
|
|
||||||
|
|
||||||
gamedir = realpath(tmp, tmppath);
|
|
||||||
|
|
||||||
if (!check_game_directory(gamedir)) {
|
|
||||||
gamedir = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gamedir == NULL) {
|
|
||||||
/* 4. $PATH */
|
|
||||||
path = getenv("PATH");
|
|
||||||
if (path) {
|
|
||||||
while (*path) {
|
|
||||||
len = strcspn(path, ":");
|
|
||||||
|
|
||||||
copylen = min(len, PATH_MAX-1);
|
|
||||||
|
|
||||||
strncpy(tmppath, path, copylen);
|
|
||||||
tmppath[copylen] = 0;
|
|
||||||
|
|
||||||
if (check_game_directory(tmppath)) {
|
|
||||||
gamedir = tmppath;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
path += len;
|
|
||||||
path += strspn(path, ":");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gamedir == NULL) {
|
|
||||||
/* 5. current directory */
|
|
||||||
gamedir = ".";
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(gamedir != NULL);
|
|
||||||
|
|
||||||
/* last chance sanity check */
|
|
||||||
if (!check_game_directory(gamedir)) {
|
|
||||||
fprintf(stderr, "Unable to find the AvP gamedata.\n");
|
|
||||||
fprintf(stderr, "The directory last examined was: %s\n", gamedir);
|
|
||||||
fprintf(stderr, "Has the game been installed and\n");
|
|
||||||
fprintf(stderr, "are all game files lowercase?\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
SetGameDirectories(localdir, gamedir);
|
|
||||||
|
|
||||||
free(localdir);
|
|
||||||
if (tmp) {
|
|
||||||
free(tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* delete some log files */
|
|
||||||
DeleteGameFile("dx_error.log");
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct option getopt_long_options[] = {
|
|
||||||
{ "help", 0, NULL, 'h' },
|
|
||||||
{ "version", 0, NULL, 'v' },
|
|
||||||
{ "fullscreen", 0, NULL, 'f' },
|
|
||||||
{ "windowed", 0, NULL, 'w' },
|
|
||||||
{ "nosound", 0, NULL, 's' },
|
|
||||||
{ "nocdrom", 0, NULL, 'c' },
|
|
||||||
{ "nojoy", 0, NULL, 'j' },
|
|
||||||
{ "debug", 0, NULL, 'd' },
|
|
||||||
{ "withgl", 1, NULL, 'g' },
|
|
||||||
/*
|
|
||||||
{ "loadrifs", 1, NULL, 'l' },
|
|
||||||
{ "server", 0, someval, 1 },
|
|
||||||
{ "client", 1, someval, 2 },
|
|
||||||
*/
|
|
||||||
{ NULL, 0, NULL, 0 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *usage_string =
|
static const char *usage_string =
|
||||||
"Aliens vs Predator Linux - http://www.icculus.org/avp/\n"
|
"Aliens vs Predator Linux - http://www.icculus.org/avp/\n"
|
||||||
|
@ -1296,43 +1132,43 @@ int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
opterr = 0;
|
/// opterr = 0;
|
||||||
while ((c = getopt_long(argc, argv, "hvfwscdg:", getopt_long_options, NULL)) != -1) {
|
/// while ((c = getopt_long(argc, argv, "hvfwscdg:", getopt_long_options, NULL)) != -1) {
|
||||||
switch(c) {
|
/// switch(c) {
|
||||||
case 'h':
|
/// case 'h':
|
||||||
printf("%s", usage_string);
|
/// printf("%s", usage_string);
|
||||||
exit(EXIT_SUCCESS);
|
/// exit(EXIT_SUCCESS);
|
||||||
case 'v':
|
/// case 'v':
|
||||||
printf("%s", AvPVersionString);
|
/// printf("%s", AvPVersionString);
|
||||||
exit(EXIT_SUCCESS);
|
/// exit(EXIT_SUCCESS);
|
||||||
case 'f':
|
/// case 'f':
|
||||||
WantFullscreen = 1;
|
/// WantFullscreen = 1;
|
||||||
break;
|
/// break;
|
||||||
case 'w':
|
/// case 'w':
|
||||||
WantFullscreen = 0;
|
/// WantFullscreen = 0;
|
||||||
break;
|
/// break;
|
||||||
case 's':
|
/// case 's':
|
||||||
WantSound = 0;
|
/// WantSound = 0;
|
||||||
break;
|
/// break;
|
||||||
case 'c':
|
/// case 'c':
|
||||||
WantCDRom = 0;
|
/// WantCDRom = 0;
|
||||||
break;
|
/// break;
|
||||||
case 'j':
|
/// case 'j':
|
||||||
WantJoystick = 0;
|
/// WantJoystick = 0;
|
||||||
break;
|
/// break;
|
||||||
case 'd': {
|
/// case 'd': {
|
||||||
extern int DebuggingCommandsActive;
|
/// extern int DebuggingCommandsActive;
|
||||||
DebuggingCommandsActive = 1;
|
/// DebuggingCommandsActive = 1;
|
||||||
}
|
/// }
|
||||||
break;
|
/// break;
|
||||||
case 'g':
|
/// case 'g':
|
||||||
opengl_library = optarg;
|
/// opengl_library = optarg;
|
||||||
break;
|
/// break;
|
||||||
default:
|
/// default:
|
||||||
printf("%s", usage_string);
|
/// printf("%s", usage_string);
|
||||||
exit(EXIT_FAILURE);
|
/// exit(EXIT_FAILURE);
|
||||||
}
|
/// }
|
||||||
}
|
/// }
|
||||||
|
|
||||||
InitGameDirectories(argv[0]);
|
InitGameDirectories(argv[0]);
|
||||||
|
|
||||||
|
|
|
@ -141,8 +141,9 @@ static int check_token(const char *string, const char *token)
|
||||||
|
|
||||||
void load_ogl_functions(int mode)
|
void load_ogl_functions(int mode)
|
||||||
{
|
{
|
||||||
const char * ogl_missing_func;
|
const char* ogl_missing_func;
|
||||||
|
const char* ext;
|
||||||
|
|
||||||
ogl_missing_func = NULL;
|
ogl_missing_func = NULL;
|
||||||
|
|
||||||
LoadOGLProc(PFNGLALPHAFUNCPROC, glAlphaFunc);
|
LoadOGLProc(PFNGLALPHAFUNCPROC, glAlphaFunc);
|
||||||
|
@ -244,7 +245,7 @@ void load_ogl_functions(int mode)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *ext = (const char *) pglGetString(GL_EXTENSIONS);
|
ext = (const char *) pglGetString(GL_EXTENSIONS);
|
||||||
|
|
||||||
ogl_have_paletted_texture = check_token(ext, "GL_EXT_paletted_texture");
|
ogl_have_paletted_texture = check_token(ext, "GL_EXT_paletted_texture");
|
||||||
ogl_have_secondary_color = check_token(ext, "GL_EXT_secondary_color");
|
ogl_have_secondary_color = check_token(ext, "GL_EXT_secondary_color");
|
||||||
|
@ -262,7 +263,7 @@ void load_ogl_functions(int mode)
|
||||||
if (!ogl_missing_func) {
|
if (!ogl_missing_func) {
|
||||||
GLint size;
|
GLint size;
|
||||||
|
|
||||||
pglColorTableEXT(GL_PROXY_TEXTURE_2D, GL_RGBA, 256, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
|
pglColorTableEXT(GL_PROXY_TEXTURE_2D, GL_RGBA, 256, GL_BGRA_EXT, GL_UNSIGNED_BYTE, NULL);
|
||||||
pglGetColorTableParameterivEXT(GL_PROXY_TEXTURE_2D, GL_COLOR_TABLE_WIDTH_EXT, &size);
|
pglGetColorTableParameterivEXT(GL_PROXY_TEXTURE_2D, GL_COLOR_TABLE_WIDTH_EXT, &size);
|
||||||
|
|
||||||
if (size != 256) {
|
if (size != 256) {
|
||||||
|
|
|
@ -99,7 +99,7 @@ typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, G
|
||||||
typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);
|
typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
#if defined(_MSC_VER)
|
||||||
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue);
|
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue);
|
||||||
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v);
|
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v);
|
||||||
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue);
|
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue);
|
||||||
|
@ -117,7 +117,7 @@ typedef void (APIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v);
|
||||||
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue);
|
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue);
|
||||||
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v);
|
typedef void (APIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v);
|
||||||
typedef void (APIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
|
typedef void (APIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
|
||||||
*/
|
#endif
|
||||||
|
|
||||||
extern PFNGLALPHAFUNCPROC pglAlphaFunc;
|
extern PFNGLALPHAFUNCPROC pglAlphaFunc;
|
||||||
extern PFNGLARRAYELEMENTPROC pglArrayElement;
|
extern PFNGLARRAYELEMENTPROC pglArrayElement;
|
||||||
|
|
|
@ -168,7 +168,7 @@ int PlatStartSoundSys()
|
||||||
attrlist[3] = AL_FALSE;
|
attrlist[3] = AL_FALSE;
|
||||||
attrlist[4] = 0;
|
attrlist[4] = 0;
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "'( (sampling-rate %d ))\n", AvpFrequency);
|
_snprintf(buf, sizeof(buf), "'( (sampling-rate %d ))\n", AvpFrequency);
|
||||||
|
|
||||||
AvpSoundDevice = alcOpenDevice(buf);
|
AvpSoundDevice = alcOpenDevice(buf);
|
||||||
if (AvpSoundDevice == NULL)
|
if (AvpSoundDevice == NULL)
|
||||||
|
|
|
@ -539,7 +539,7 @@ AwTl::SurfUnion AwBackupTexture::CreateTexture(AwTl::CreateTextureParms const &
|
||||||
y = m_nHeight-1;
|
y = m_nHeight-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i, rowcount = m_nHeight; rowcount; --rowcount, i++)
|
for (int i = 0, rowcount = m_nHeight; rowcount; --rowcount, i++)
|
||||||
{
|
{
|
||||||
PtrUnion src_rowP = GetRowPtr(y);
|
PtrUnion src_rowP = GetRowPtr(y);
|
||||||
db_assert1(src_rowP.voidP);
|
db_assert1(src_rowP.voidP);
|
||||||
|
|
|
@ -61,11 +61,8 @@ static HuffEncode EncodingTable[257];
|
||||||
|
|
||||||
/* KJL 17:16:03 17/09/98 - Compression */
|
/* KJL 17:16:03 17/09/98 - Compression */
|
||||||
static void PerformSymbolCensus(unsigned char *sourcePtr, int length);
|
static void PerformSymbolCensus(unsigned char *sourcePtr, int length);
|
||||||
#ifdef __WATCOMC__
|
|
||||||
static int HuffItemsSortSub(const void *cmp1, const void *cmp2);
|
static int HuffItemsSortSub(const void *cmp1, const void *cmp2);
|
||||||
#else
|
|
||||||
static int __cdecl HuffItemsSortSub(const void *cmp1, const void *cmp2);
|
static int __cdecl HuffItemsSortSub(const void *cmp1, const void *cmp2);
|
||||||
#endif
|
|
||||||
static void SortCensusData(void);
|
static void SortCensusData(void);
|
||||||
static void BuildHuffmanTree(void);
|
static void BuildHuffmanTree(void);
|
||||||
static void MakeHuffTreeFromHuffItems(HuffNode *base, HuffItem *source, int count);
|
static void MakeHuffTreeFromHuffItems(HuffNode *base, HuffItem *source, int count);
|
||||||
|
@ -125,11 +122,7 @@ static void PerformSymbolCensus(unsigned char *sourcePtr, int length)
|
||||||
while (--length);
|
while (--length);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __WATCOMC__
|
|
||||||
static int HuffItemsSortSub(const void *cmp1, const void *cmp2)
|
|
||||||
#else
|
|
||||||
static int __cdecl HuffItemsSortSub(const void *cmp1, const void *cmp2)
|
static int __cdecl HuffItemsSortSub(const void *cmp1, const void *cmp2)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
if (((HuffItem *)cmp1)->Count > ((HuffItem *)cmp2)->Count)
|
if (((HuffItem *)cmp1)->Count > ((HuffItem *)cmp2)->Count)
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -321,6 +314,7 @@ static int HuffEncodeBytes(int *dest, unsigned char *source, int count, HuffEnco
|
||||||
|
|
||||||
if (!count) return 0;
|
if (!count) return 0;
|
||||||
|
|
||||||
|
accum = 0;
|
||||||
start = dest;
|
start = dest;
|
||||||
sourcelim = sourceend = source + count;
|
sourcelim = sourceend = source + count;
|
||||||
available = 32;
|
available = 32;
|
||||||
|
@ -387,7 +381,7 @@ lpstart: val = *source++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*dest++ = accum >> available;
|
*dest++ = accum >> available;
|
||||||
return (dest - start) * 4;
|
return (int)((dest - start) * 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -398,11 +392,11 @@ lpstart: val = *source++;
|
||||||
/* KJL 17:16:24 17/09/98 - Decompression */
|
/* KJL 17:16:24 17/09/98 - Decompression */
|
||||||
static int DecodeTable[1<<MAX_DEPTH];
|
static int DecodeTable[1<<MAX_DEPTH];
|
||||||
|
|
||||||
static void MakeHuffmanDecodeTable(int *depth, int depthmax, unsigned char *list);
|
static void MakeHuffmanDecodeTable(const int *depth, int depthmax, const unsigned char *list);
|
||||||
static int HuffmanDecode(unsigned char *dest, int *source, int *table, int length);
|
static int HuffmanDecode(unsigned char *dest, const int *source, const int *table, int length);
|
||||||
|
|
||||||
|
|
||||||
extern char *HuffmanDecompress(HuffmanPackage *inpackage)
|
extern char *HuffmanDecompress(const HuffmanPackage *inpackage)
|
||||||
{
|
{
|
||||||
unsigned char *uncompressedData = NULL;
|
unsigned char *uncompressedData = NULL;
|
||||||
// Step 1: Make the decoding table
|
// Step 1: Make the decoding table
|
||||||
|
@ -418,12 +412,12 @@ extern char *HuffmanDecompress(HuffmanPackage *inpackage)
|
||||||
return (char*)uncompressedData;
|
return (char*)uncompressedData;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void MakeHuffmanDecodeTable(int *depth, int depthmax, unsigned char *list)
|
static void MakeHuffmanDecodeTable(const int *depth, int depthmax, const unsigned char *list)
|
||||||
{
|
{
|
||||||
int thisdepth, depthbit, repcount, repspace, lenbits, temp, count;
|
int thisdepth, depthbit, repcount, repspace, lenbits, temp, count;
|
||||||
int *outp;
|
int *outp;
|
||||||
int o = 0;
|
int o = 0;
|
||||||
unsigned char *p;
|
const unsigned char *p;
|
||||||
int *outtbl = DecodeTable;
|
int *outtbl = DecodeTable;
|
||||||
|
|
||||||
lenbits = 0;
|
lenbits = 0;
|
||||||
|
@ -431,7 +425,7 @@ static void MakeHuffmanDecodeTable(int *depth, int depthmax, unsigned char *list
|
||||||
repspace = 1;
|
repspace = 1;
|
||||||
thisdepth = 0;
|
thisdepth = 0;
|
||||||
depthbit = 4;
|
depthbit = 4;
|
||||||
p = (unsigned char *)list + 255;
|
p = list + 255;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
|
@ -476,17 +470,18 @@ static void MakeHuffmanDecodeTable(int *depth, int depthmax, unsigned char *list
|
||||||
|
|
||||||
#define EDXMASK ((((1 << (MAX_DEPTH + 1)) - 1) ^ 1) ^ -1)
|
#define EDXMASK ((((1 << (MAX_DEPTH + 1)) - 1) ^ 1) ^ -1)
|
||||||
|
|
||||||
static int HuffmanDecode(unsigned char *dest, int *source, int *table, int length)
|
static int HuffmanDecode(unsigned char *dest, const int *source, const int *table, int length)
|
||||||
{
|
{
|
||||||
unsigned char *start;
|
unsigned char *start;
|
||||||
int available, reserve, fill, wid;
|
int available, reserve, fill, wid;
|
||||||
unsigned int bits=0, resbits;
|
unsigned int bits=0, resbits;
|
||||||
unsigned char *p;
|
const unsigned char *p;
|
||||||
|
|
||||||
start = dest;
|
start = dest;
|
||||||
available = 0;
|
available = 0;
|
||||||
reserve = 0;
|
reserve = 0;
|
||||||
wid = 0;
|
wid = 0;
|
||||||
|
resbits = 0;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
available += wid;
|
available += wid;
|
||||||
|
@ -512,11 +507,11 @@ static int HuffmanDecode(unsigned char *dest, int *source, int *table, int lengt
|
||||||
{
|
{
|
||||||
bits >>= wid;
|
bits >>= wid;
|
||||||
*dest++ = p[1];
|
*dest++ = p[1];
|
||||||
lpent: p = (unsigned char *)(((short *)table)+(bits & ~EDXMASK));
|
lpent: p = (const unsigned char *)(((const short *)table)+(bits & ~EDXMASK));
|
||||||
}
|
}
|
||||||
while ((available -= (wid = *p)) >= 0 && (dest-start)!=length);
|
while ((available -= (wid = *p)) >= 0 && (dest-start)!=length);
|
||||||
|
|
||||||
}
|
}
|
||||||
while (available > -32 && (dest-start)!=length);
|
while (available > -32 && (dest-start)!=length);
|
||||||
return dest - start;
|
return (int)(dest - start);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MAX_DEPTH 11
|
#define MAX_DEPTH 11
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
char Identifier[8];
|
char Identifier[8];
|
||||||
|
@ -16,11 +17,12 @@ typedef struct
|
||||||
unsigned char ByteAssignment[256];
|
unsigned char ByteAssignment[256];
|
||||||
} HuffmanPackage;
|
} HuffmanPackage;
|
||||||
|
|
||||||
|
|
||||||
/* KJL 17:16:03 17/09/98 - Compression */
|
/* KJL 17:16:03 17/09/98 - Compression */
|
||||||
extern HuffmanPackage *HuffmanCompression(unsigned char *sourcePtr, int length);
|
extern HuffmanPackage *HuffmanCompression(unsigned char *sourcePtr, int length);
|
||||||
|
|
||||||
/* KJL 16:53:53 19/09/98 - Decompression */
|
/* KJL 16:53:53 19/09/98 - Decompression */
|
||||||
extern char *HuffmanDecompress(HuffmanPackage *inpackage);
|
extern char *HuffmanDecompress(const HuffmanPackage *inpackage);
|
||||||
|
|
||||||
|
|
||||||
#define COMPRESSED_RIF_IDENTIFIER "REBCRIF1"
|
#define COMPRESSED_RIF_IDENTIFIER "REBCRIF1"
|
||||||
|
|
193
src/winfiles.c
Normal file
193
src/winfiles.c
Normal file
|
@ -0,0 +1,193 @@
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include "files.h"
|
||||||
|
|
||||||
|
static char *local_dir;
|
||||||
|
static char *global_dir;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Sets the local and global directories used by the other functions.
|
||||||
|
Local = ~/.dir, where config and user-installed files are kept.
|
||||||
|
Global = installdir, where installed data is stored.
|
||||||
|
*/
|
||||||
|
int SetGameDirectories(const char *local, const char *global)
|
||||||
|
{
|
||||||
|
local_dir = _strdup(local);
|
||||||
|
global_dir = _strdup(global);
|
||||||
|
|
||||||
|
// TODO - create local directory if it doesn't exist
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define DIR_SEPARATOR "\\"
|
||||||
|
|
||||||
|
static char *FixFilename(const char *filename, const char *prefix, int force)
|
||||||
|
{
|
||||||
|
char *f, *ptr;
|
||||||
|
int flen;
|
||||||
|
int plen;
|
||||||
|
|
||||||
|
plen = strlen(prefix) + 1;
|
||||||
|
flen = strlen(filename) + plen + 1;
|
||||||
|
|
||||||
|
f = (char *)malloc(flen);
|
||||||
|
strcpy(f, prefix);
|
||||||
|
strcat(f, DIR_SEPARATOR);
|
||||||
|
strcat(f, filename);
|
||||||
|
|
||||||
|
/* only the filename part needs to be modified */
|
||||||
|
ptr = &f[plen+1];
|
||||||
|
|
||||||
|
while (*ptr) {
|
||||||
|
if ((*ptr == '/') || (*ptr == '\\') || (*ptr == ':')) {
|
||||||
|
*ptr = DIR_SEPARATOR[0];
|
||||||
|
} else if (*ptr == '\r' || *ptr == '\n') {
|
||||||
|
*ptr = 0;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
if (force) {
|
||||||
|
*ptr = tolower(*ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Open a file of type type, with mode mode.
|
||||||
|
|
||||||
|
Mode can be:
|
||||||
|
#define FILEMODE_READONLY 0x01
|
||||||
|
#define FILEMODE_WRITEONLY 0x02
|
||||||
|
#define FILEMODE_READWRITE 0x04
|
||||||
|
#define FILEMODE_APPEND 0x08
|
||||||
|
Type is (mode = ReadOnly):
|
||||||
|
#define FILETYPE_PERM 0x08 // try the global dir only
|
||||||
|
#define FILETYPE_OPTIONAL 0x10 // try the global dir first, then try the local dir
|
||||||
|
#define FILETYPE_CONFIG 0x20 // try the local dir only
|
||||||
|
|
||||||
|
Type is (mode = WriteOnly or ReadWrite):
|
||||||
|
FILETYPE_PERM: error
|
||||||
|
FILETYPE_OPTIONAL: error
|
||||||
|
FILETYPE_CONFIG: try the local dir only
|
||||||
|
*/
|
||||||
|
FILE *OpenGameFile(const char *filename, int mode, int type)
|
||||||
|
{
|
||||||
|
char *rfilename;
|
||||||
|
char *openmode;
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
if ((type != FILETYPE_CONFIG) && (mode != FILEMODE_READONLY))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
switch(mode) {
|
||||||
|
case FILEMODE_READONLY:
|
||||||
|
openmode = "rb";
|
||||||
|
break;
|
||||||
|
case FILEMODE_WRITEONLY:
|
||||||
|
openmode = "wb";
|
||||||
|
break;
|
||||||
|
case FILEMODE_READWRITE:
|
||||||
|
openmode = "w+";
|
||||||
|
break;
|
||||||
|
case FILEMODE_APPEND:
|
||||||
|
openmode = "ab";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type != FILETYPE_CONFIG) {
|
||||||
|
rfilename = FixFilename(filename, global_dir, 0);
|
||||||
|
|
||||||
|
fp = fopen(rfilename, openmode);
|
||||||
|
|
||||||
|
free(rfilename);
|
||||||
|
|
||||||
|
if (fp != NULL) {
|
||||||
|
return fp;
|
||||||
|
}
|
||||||
|
|
||||||
|
rfilename = FixFilename(filename, global_dir, 1);
|
||||||
|
|
||||||
|
fp = fopen(rfilename, openmode);
|
||||||
|
|
||||||
|
free(rfilename);
|
||||||
|
|
||||||
|
if (fp != NULL) {
|
||||||
|
return fp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type != FILETYPE_PERM) {
|
||||||
|
rfilename = FixFilename(filename, local_dir, 0);
|
||||||
|
|
||||||
|
fp = fopen(rfilename, openmode);
|
||||||
|
|
||||||
|
free(rfilename);
|
||||||
|
|
||||||
|
if (fp != NULL) {
|
||||||
|
return fp;
|
||||||
|
}
|
||||||
|
|
||||||
|
rfilename = FixFilename(filename, local_dir, 1);
|
||||||
|
|
||||||
|
fp = fopen(rfilename, openmode);
|
||||||
|
|
||||||
|
free(rfilename);
|
||||||
|
|
||||||
|
return fp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CloseGameFile(FILE *pfd)
|
||||||
|
{
|
||||||
|
return fclose(pfd);
|
||||||
|
}
|
||||||
|
|
||||||
|
int GetGameFileAttributes(const char *filename, int type)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DeleteGameFile(const char *filename)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CreateGameDirectory(const char *dirname)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *OpenGameDirectory(const char *dirname, const char *pattern, int type)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
GameDirectoryFile *ScanGameDirectory(void *dir)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CloseGameDirectory(void *dir)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitGameDirectories(char *argv0)
|
||||||
|
{
|
||||||
|
SetGameDirectories("local/", "./");
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue