#include "tools.h"
#include "files.h"
#include "joystick.h"
-#include "gfxload.h"
-#include "gifload.h"
+#include "image.h"
#include "network.h"
#include "netserv.h"
-#ifdef DEBUG
-/*
-#define DEBUG_TIMING
-*/
-#endif
-
struct PictureFileInfo
{
char *picture_filename;
InitCounter();
InitSound();
InitSoundServer();
- InitJoystick();
+ InitJoysticks();
InitRND(NEW_RANDOMIZE);
signal(SIGINT, CloseAllAndExit);
InitDisplay();
InitWindow(argc, argv);
+ print_debug("now map window");
+
XMapWindow(display, window);
XFlush(display);
+ print_debug("window mapped");
+
+ print_debug("now init gfx");
+
InitGfx();
+
+ print_debug("gfx initialized");
+
InitElementProperties();
DrawMainMenu();
{
int i;
- /* initialize local player's setup */
- setup.sound_on = TRUE;
- setup.sound_loops_on = FALSE;
- setup.sound_music_on = FALSE;
- setup.sound_simple_on = FALSE;
- setup.toons_on = TRUE;
- setup.direct_draw_on = FALSE;
- setup.scroll_delay_on = FALSE;
- setup.soft_scrolling_on = TRUE;
- setup.fading_on = FALSE;
- setup.autorecord_on = FALSE;
- setup.quick_doors = FALSE;
- setup.joystick_nr = 0;
-
/* choose default local player */
local_player = &stored_player[0];
- if (!LoadLevelInfo()) /* global level info */
- Error(ERR_EXIT, NULL);
-
- LoadPlayerInfo(PLAYER_SETUP); /* global setup info */
- LoadPlayerInfo(PLAYER_LEVEL); /* level specific info */
-
- /* after LoadPlayerInfo(), because it overwrites 'local_player' */
for (i=0; i<MAX_PLAYERS; i++)
{
+ stored_player[i].joystick_fd = -1; /* joystick device closed */
stored_player[i].connected = FALSE;
- stored_player[i].local = FALSE;
}
+
local_player->connected = TRUE;
- local_player->local = TRUE;
+
+ LoadLevelInfo(); /* global level info */
+ LoadSetup(); /* global setup info */
+ LoadLevelSetup(); /* info about last played level */
}
void InitNetworkServer()
{
+#ifndef MSDOS
int nr_wanted;
+#endif
if (!options.network)
return;
+#ifndef MSDOS
nr_wanted = Request("Choose player", REQ_PLAYER | REQ_STAY_CLOSED);
if (!ConnectToServer(options.server_host, options.server_port))
- Error(ERR_EXIT, "cannot connect to multiplayer server");
+ Error(ERR_EXIT, "cannot connect to network game server");
- SendToServer_Nickname(local_player->alias_name);
+ SendToServer_PlayerName(setup.player_name);
SendToServer_ProtocolVersion();
if (nr_wanted)
SendToServer_NrWanted(nr_wanted);
+#endif
}
void InitSound()
return;
#ifndef MSDOS
- if (access(sound_device_name,W_OK)<0)
+ if (access(sound_device_name, W_OK) != 0)
{
- Error(ERR_RETURN, "cannot access sound device - no sounds");
+ Error(ERR_WARN, "cannot access sound device - no sounds");
sound_status = SOUND_OFF;
return;
}
if ((sound_device = open(sound_device_name,O_WRONLY))<0)
{
- Error(ERR_RETURN, "cannot open sound device - no sounds");
+ Error(ERR_WARN, "cannot open sound device - no sounds");
sound_status = SOUND_OFF;
return;
}
#ifdef VOXWARE
sound_loops_allowed = TRUE;
+
+ /*
setup.sound_loops_on = TRUE;
+ */
+
#endif
#else
sound_loops_allowed = TRUE;
+
+ /*
setup.sound_loops_on = TRUE;
+ */
+
#endif
for(i=0; i<NUM_SOUNDS; i++)
#ifndef MSDOS
if (pipe(sound_pipe)<0)
{
- Error(ERR_RETURN, "cannot create pipe - no sounds");
+ Error(ERR_WARN, "cannot create pipe - no sounds");
sound_status = SOUND_OFF;
return;
}
if ((sound_process_id = fork()) < 0)
{
- Error(ERR_RETURN, "cannot create sound server process - no sounds");
+ Error(ERR_WARN, "cannot create sound server process - no sounds");
sound_status = SOUND_OFF;
return;
}
#endif
}
-void InitJoystick()
+void InitJoysticks()
{
+#ifndef MSDOS
+ int i;
+#endif
+
if (global_joystick_status == JOYSTICK_OFF)
return;
+ joystick_status = JOYSTICK_OFF;
+
#ifndef MSDOS
- if (access(joystick_device_name[setup.joystick_nr], R_OK) < 0)
+ for (i=0; i<MAX_PLAYERS; i++)
{
- Error(ERR_RETURN, "cannot access joystick device '%s'",
- joystick_device_name[setup.joystick_nr]);
- joystick_status = JOYSTICK_OFF;
- return;
- }
+ char *device_name = setup.input[i].joy.device_name;
- if ((joystick_device =
- open(joystick_device_name[setup.joystick_nr], O_RDONLY)) < 0)
- {
- Error(ERR_RETURN, "cannot open joystick device '%s'",
- joystick_device_name[setup.joystick_nr]);
- joystick_status = JOYSTICK_OFF;
- return;
- }
+ /* this allows subsequent calls to 'InitJoysticks' for re-initialization */
+ if (stored_player[i].joystick_fd != -1)
+ {
+ close(stored_player[i].joystick_fd);
+ stored_player[i].joystick_fd = -1;
+ }
- joystick_status = JOYSTICK_AVAILABLE;
- LoadJoystickData();
+ if (!setup.input[i].use_joystick)
+ continue;
+
+ if (access(device_name, R_OK) != 0)
+ {
+ Error(ERR_WARN, "cannot access joystick device '%s'", device_name);
+ continue;
+ }
+
+ if ((stored_player[i].joystick_fd = open(device_name, O_RDONLY)) < 0)
+ {
+ Error(ERR_WARN, "cannot open joystick device '%s'", device_name);
+ continue;
+ }
+
+ joystick_status = JOYSTICK_AVAILABLE;
+ }
#else
joystick_status = JOYSTICK_AVAILABLE;
#endif
void InitDisplay()
{
+#ifndef MSDOS
XVisualInfo vinfo_template, *vinfo;
int num_visuals;
+#endif
unsigned int depth;
/* connect to X server */
depth = DefaultDepth(display, screen);
cmap = DefaultColormap(display, screen);
+#ifndef MSDOS
/* look for good enough visual */
vinfo_template.screen = screen;
vinfo_template.class = (depth == 8 ? PseudoColor : TrueColor);
printf("Sorry, cannot get appropriate visual.\n");
exit(-1);
}
+#endif
}
void InitWindow(int argc, char *argv[])
{
unsigned int border_width = 4;
+ XGCValues gc_values;
+ unsigned long gc_valuemask;
+#ifndef MSDOS
+ XTextProperty windowName, iconName;
Pixmap icon_pixmap, iconmask_pixmap;
- unsigned int icon_width,icon_height;
- int icon_hot_x,icon_hot_y;
+ unsigned int icon_width, icon_height;
+ int icon_hot_x, icon_hot_y;
char icon_filename[256];
XSizeHints size_hints;
XWMHints wm_hints;
XClassHint class_hints;
- XTextProperty windowName, iconName;
- XGCValues gc_values;
- unsigned long gc_valuemask;
char *window_name = WINDOWTITLE_STRING;
char *icon_name = WINDOWTITLE_STRING;
long window_event_mask;
Atom proto_atom = None, delete_atom = None;
+#endif
int screen_width, screen_height;
int win_xpos = WIN_XPOS, win_ypos = WIN_YPOS;
unsigned long pen_fg = WhitePixel(display,screen);
unsigned long pen_bg = BlackPixel(display,screen);
+ const int width = WIN_XSIZE, height = WIN_YSIZE;
#ifndef MSDOS
static struct IconFileInfo icon_pic =
screen_width = XDisplayWidth(display, screen);
screen_height = XDisplayHeight(display, screen);
- width = WIN_XSIZE;
- height = WIN_YSIZE;
-
win_xpos = (screen_width - width) / 2;
win_ypos = (screen_height - height) / 2;
XChangeProperty(display, window, proto_atom, XA_ATOM, 32,
PropModePrepend, (unsigned char *) &delete_atom, 1);
- sprintf(icon_filename,"%s/%s",GFX_PATH,icon_pic.picture_filename);
+ sprintf(icon_filename, "%s/%s/%s",
+ options.base_directory, GRAPHICS_DIRECTORY,
+ icon_pic.picture_filename);
XReadBitmapFile(display,window,icon_filename,
&icon_width,&icon_height,
&icon_pixmap,&icon_hot_x,&icon_hot_y);
if (!icon_pixmap)
Error(ERR_EXIT, "cannot read icon bitmap file '%s'", icon_filename);
- sprintf(icon_filename,"%s/%s",GFX_PATH,icon_pic.picturemask_filename);
+ sprintf(icon_filename, "%s/%s/%s",
+ options.base_directory, GRAPHICS_DIRECTORY,
+ icon_pic.picturemask_filename);
XReadBitmapFile(display,window,icon_filename,
&icon_width,&icon_height,
&iconmask_pixmap,&icon_hot_x,&icon_hot_y);
gc_values.background = pen_bg;
gc_valuemask = GCGraphicsExposures | GCForeground | GCBackground;
gc = XCreateGC(display, window, gc_valuemask, &gc_values);
+
+
+
+ print_debug("OpenWindow finished");
}
void DrawInitText(char *text, int ypos, int color)
{ -1, 0 }
};
-#ifdef DEBUG_TIMING
- long count1, count2;
- count1 = Counter();
+#if DEBUG_TIMING
+ debug_print_timestamp(0, NULL); /* initialize timestamp function */
#endif
LoadGfx(PIX_SMALLFONT,&pic[PIX_SMALLFONT]);
if (i != PIX_SMALLFONT)
LoadGfx(i,&pic[i]);
-#ifdef DEBUG_TIMING
- count2 = Counter();
- printf("SUMMARY: %.2f SECONDS LOADING TIME\n",(float)(count2-count1)/1000.0);
+#if DEBUG_TIMING
+ debug_print_timestamp(0, "SUMMARY LOADING ALL GRAPHICS:");
#endif
-
pix[PIX_DB_BACK] = XCreatePixmap(display, window,
WIN_XSIZE,WIN_YSIZE,
XDefaultDepth(display,screen));
char basefilename[256];
char filename[256];
-#ifdef XPM_INCLUDE_FILE
+#ifdef USE_XPM_LIBRARY
int xpm_err, xbm_err;
unsigned int width,height;
int hot_x,hot_y;
char *picture_ext = ".xpm";
char *picturemask_ext = "Mask.xbm";
#else
- int gif_err;
+ int pcx_err;
+
+#if 1
+ char *picture_ext = ".pcx";
+#else
char *picture_ext = ".gif";
#endif
-#ifdef DEBUG_TIMING
- long count1, count2;
#endif
+
+ print_debug("now load pic:");
+
+
/* Grafik laden */
if (pic->picture_filename)
{
- sprintf(basefilename,"%s%s",pic->picture_filename,picture_ext);
- DrawInitText(basefilename,150,FC_YELLOW);
- sprintf(filename,"%s/%s",GFX_PATH,basefilename);
+ sprintf(basefilename, "%s%s", pic->picture_filename, picture_ext);
+ DrawInitText(basefilename, 150, FC_YELLOW);
+ sprintf(filename, "%s/%s/%s",
+ options.base_directory, GRAPHICS_DIRECTORY, basefilename);
#ifdef MSDOS
rest(100);
#endif MSDOS
-#ifdef DEBUG_TIMING
- count1 = Counter();
+#if DEBUG_TIMING
+ debug_print_timestamp(1, NULL); /* initialize timestamp function */
#endif
-#ifdef XPM_INCLUDE_FILE
+#ifdef USE_XPM_LIBRARY
xpm_att[pos].valuemask = XpmCloseness;
xpm_att[pos].closeness = 20000;
xpm_err = XpmReadFileToPixmap(display,window,filename,
&pix[pos],&shapemask,&xpm_att[pos]);
-
switch(xpm_err)
{
case XpmOpenFailed:
break;
}
-#ifdef DEBUG_TIMING
- count2 = Counter();
- printf("XPM LOADING %s IN %.2f SECONDS\n",
- filename,(float)(count2-count1)/1000.0);
+#if DEBUG_TIMING
+ printf("LOADING XPM FILE %s:", filename);
+ debug_print_timestamp(1, "");
#endif
-#else
+#else /* !USE_XPM_LIBRARY */
+
+
- gif_err = Read_GIF_to_Pixmaps(display, window, filename,
- &pix[pos], &clipmask[pos]);
+ print_debug(filename);
- switch(gif_err)
+
+
+ pcx_err = Read_PCX_to_Pixmap(display, window, gc, filename,
+ &pix[pos], &clipmask[pos]);
+
+
+ print_debug("ok-1");
+
+
+ switch(pcx_err)
{
- case GIF_Success:
+ case PCX_Success:
+ print_debug("Success");
break;
- case GIF_OpenFailed:
- Error(ERR_EXIT, "cannot open GIF file '%s'", filename);
- case GIF_ReadFailed:
- Error(ERR_EXIT, "cannot read GIF file '%s'", filename);
- case GIF_FileInvalid:
- Error(ERR_EXIT, "invalid GIF file '%s'", filename);
- case GIF_NoMemory:
- Error(ERR_EXIT, "not enough memory for GIF file '%s'", filename);
- case GIF_ColorFailed:
- Error(ERR_EXIT, "cannot get colors for GIF file '%s'", filename);
+ case PCX_OpenFailed:
+ print_debug("OpenFailed");
+ Error(ERR_EXIT, "cannot open PCX file '%s'", filename);
+ case PCX_ReadFailed:
+ print_debug("ReadFailed");
+ Error(ERR_EXIT, "cannot read PCX file '%s'", filename);
+ case PCX_FileInvalid:
+ print_debug("FileInvalid");
+ Error(ERR_EXIT, "invalid PCX file '%s'", filename);
+ case PCX_NoMemory:
+ print_debug("NoMemory");
+ Error(ERR_EXIT, "not enough memory for PCX file '%s'", filename);
+ case PCX_ColorFailed:
+ print_debug("ColorFailed");
+ Error(ERR_EXIT, "cannot get colors for PCX file '%s'", filename);
default:
+ print_debug("default");
break;
}
-#ifdef DEBUG_TIMING
- count2 = Counter();
- printf("GIF LOADING %s IN %.2f SECONDS\n",
- filename,(float)(count2-count1)/1000.0);
-#endif
+ print_debug("ok-2");
+#if DEBUG_TIMING
+ printf("SUMMARY LOADING PCX FILE %s:", filename);
+ debug_print_timestamp(1, "");
#endif
+#endif /* !USE_XPM_LIBRARY */
+
+
+ print_debug("-> 1");
+
+
+
if (!pix[pos])
Error(ERR_EXIT, "cannot get graphics for '%s'", pic->picture_filename);
+
+
+ print_debug("-> 2");
}
/* zugehörige Maske laden (wenn vorhanden) */
if (pic->picture_with_mask)
{
+#ifdef USE_XPM_LIBRARY
-#ifdef XPM_INCLUDE_FILE
+ sprintf(basefilename, "%s%s", pic->picture_filename, picturemask_ext);
+ DrawInitText(basefilename, 150, FC_YELLOW);
+ sprintf(filename, "%s/%s/%s",
+ options.base_directory, GRAPHICS_DIRECTORY, basefilename);
- sprintf(basefilename,"%s%s",pic->picture_filename,picturemask_ext);
- DrawInitText(basefilename,150,FC_YELLOW);
- sprintf(filename,"%s/%s",GFX_PATH,basefilename);
-
-#ifdef DEBUG_TIMING
- count1 = Counter();
+#if DEBUG_TIMING
+ debug_print_timestamp(1, NULL); /* initialize timestamp function */
#endif
xbm_err = XReadBitmapFile(display,window,filename,
&width,&height,&clipmask[pos],&hot_x,&hot_y);
-
switch(xbm_err)
{
case BitmapSuccess:
break;
}
-#ifdef DEBUG_TIMING
- count2 = Counter();
- printf("XBM LOADING %s IN %.2f SECONDS\n",
- filename,(float)(count2-count1)/1000.0);
+#if DEBUG_TIMING
+ printf("LOADING XBM FILE %s:", filename);
+ debug_print_timestamp(1, "");
#endif
-#endif
+#endif /* USE_XPM_LIBRARY */
+
+
+ if (!clipmask[pos])
+ print_debug("Oops -- no clipmask");
if (!clipmask[pos])
Error(ERR_EXIT, "cannot get clipmask for '%s'", pic->picture_filename);
}
+
+
+ print_debug("LoadGfx done");
}
void InitElementProperties()
{
if (pix[i])
{
-#ifdef XPM_INCLUDE_FILE
- if (i<NUM_PICTURES) /* XPM pictures */
+#ifdef USE_XPM_LIBRARY
+ if (i < NUM_PICTURES) /* XPM pictures */
{
XFreeColors(display,DefaultColormap(display,screen),
xpm_att[i].pixels,xpm_att[i].npixels,0);