/***********************************************************
* Rocks'n'Diamonds -- McDuffin Strikes Back! *
*----------------------------------------------------------*
-* (c) 1995-2000 Artsoft Entertainment *
+* (c) 1995-2001 Artsoft Entertainment *
* Holger Schemel *
* Detmolder Strasse 189 *
* 33604 Bielefeld *
* init.c *
***********************************************************/
-#include <signal.h>
-
#include "libgame/libgame.h"
#include "init.h"
#include "tape.h"
#include "tools.h"
#include "files.h"
-#include "joystick.h"
#include "network.h"
#include "netserv.h"
static void InitLevelInfo(void);
static void InitNetworkServer(void);
static void InitSound(void);
-static void InitSoundServer(void);
static void InitGfx(void);
static void InitGfxBackground(void);
static void InitGadgets(void);
InitProgramInfo(UNIX_USERDATA_DIRECTORY,
PROGRAM_TITLE_STRING, WINDOW_TITLE_STRING,
ICON_TITLE_STRING, X11_ICON_FILENAME, X11_ICONMASK_FILENAME,
- MSDOS_POINTER_FILENAME);
+ MSDOS_POINTER_FILENAME,
+ COOKIE_PREFIX, GAME_VERSION_ACTUAL);
InitPlayerInfo();
InitCounter();
InitSound();
- InitSoundServer();
InitJoysticks();
InitRND(NEW_RANDOMIZE);
local_player = &stored_player[0];
for (i=0; i<MAX_PLAYERS; i++)
- {
- stored_player[i].joystick_fd = -1; /* joystick device closed */
stored_player[i].connected = FALSE;
- }
local_player->connected = TRUE;
OpenAudio();
- AllocSoundArray(NUM_SOUNDS);
-
for(i=0; i<NUM_SOUNDS; i++)
{
- if (!LoadSound(i, sound_name[i]))
+ if (!LoadSound(sound_name[i]))
{
audio.sound_available = FALSE;
audio.loops_available = FALSE;
return;
}
}
-}
-
-void InitSoundServer()
-{
- if (!audio.sound_available)
- return;
-
-#if !defined(TARGET_SDL)
-#if defined(PLATFORM_UNIX)
-
- if (pipe(audio.soundserver_pipe) < 0)
- {
- Error(ERR_WARN, "cannot create pipe - no sounds");
- audio.sound_available = FALSE;
- return;
- }
-
- if ((audio.soundserver_pid = fork()) < 0)
- {
- Error(ERR_WARN, "cannot create sound server process - no sounds");
- audio.sound_available = FALSE;
- return;
- }
-
- if (audio.soundserver_pid == 0) /* we are child */
- {
- SoundServer();
-
- /* never reached */
- exit(0);
- }
- else /* we are parent */
- close(audio.soundserver_pipe[0]); /* no reading from pipe needed */
-
-#else /* !PLATFORM_UNIX */
-
- SoundServer();
-
-#endif /* !PLATFORM_UNIX */
-#endif /* !TARGET_SDL */
-}
-
-void InitJoysticks()
-{
-#if defined(TARGET_SDL)
- static boolean sdl_joystick_subsystem_initialized = FALSE;
-#endif
-
- int i;
-
- if (global_joystick_status == JOYSTICK_OFF)
- return;
-
- joystick_status = JOYSTICK_OFF;
-
-#if defined(TARGET_SDL)
-
- if (!sdl_joystick_subsystem_initialized)
- {
- sdl_joystick_subsystem_initialized = TRUE;
-
- if (SDL_Init(SDL_INIT_JOYSTICK) < 0)
- {
- Error(ERR_EXIT, "SDL_Init() failed: %s", SDL_GetError());
- return;
- }
- }
-
- for (i=0; i<MAX_PLAYERS; i++)
- {
- char *device_name = setup.input[i].joy.device_name;
- int joystick_nr = getJoystickNrFromDeviceName(device_name);
-
- if (joystick_nr >= SDL_NumJoysticks())
- joystick_nr = -1;
-
- /* misuse joystick file descriptor variable to store joystick number */
- stored_player[i].joystick_fd = joystick_nr;
-
- /* this allows subsequent calls to 'InitJoysticks' for re-initialization */
- if (Check_SDL_JoystickOpened(joystick_nr))
- Close_SDL_Joystick(joystick_nr);
-
- if (!setup.input[i].use_joystick)
- continue;
-
- if (!Open_SDL_Joystick(joystick_nr))
- {
- Error(ERR_WARN, "cannot open joystick %d", joystick_nr);
- continue;
- }
-
- joystick_status = JOYSTICK_AVAILABLE;
- }
-
-#else /* !TARGET_SDL */
-
-#if defined(PLATFORM_UNIX)
- for (i=0; i<MAX_PLAYERS; i++)
- {
- char *device_name = setup.input[i].joy.device_name;
-
- /* 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;
- }
-
- 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 /* !PLATFORM_UNIX */
-
- /* try to access two joysticks; if that fails, try to access just one */
- if (install_joystick(JOY_TYPE_2PADS) == 0 ||
- install_joystick(JOY_TYPE_AUTODETECT) == 0)
- joystick_status = JOYSTICK_AVAILABLE;
-
- /*
- load_joystick_data(JOYSTICK_FILENAME);
- */
-
- for (i=0; i<MAX_PLAYERS; i++)
- {
- char *device_name = setup.input[i].joy.device_name;
- int joystick_nr = getJoystickNrFromDeviceName(device_name);
-
- if (joystick_nr >= num_joysticks)
- joystick_nr = -1;
- /* misuse joystick file descriptor variable to store joystick number */
- stored_player[i].joystick_fd = joystick_nr;
- }
-#endif
+ num_bg_loops = LoadMusic();
-#endif /* !TARGET_SDL */
+ StartSoundserver();
}
void InitGfx()
};
#endif
-#ifdef TARGET_X11
+#if defined(TARGET_X11_NATIVE)
static struct
{
int start;
InitFontInfo(pix[PIX_BIGFONT], pix[PIX_MEDIUMFONT], pix[PIX_SMALLFONT]);
+ /* initialize pixmap array for special X11 tile clipping to Pixmap 'None' */
+ for(i=0; i<NUM_TILES; i++)
+ tile_clipmask[i] = None;
+
#if defined(TARGET_X11)
+ /* This stuff is needed because X11 (XSetClipOrigin(), to be precise) is
+ often very slow when preparing a masked XCopyArea() for big Pixmaps.
+ To prevent this, create small (tile-sized) mask Pixmaps which will then
+ be set much faster with XSetClipOrigin() and speed things up a lot. */
+
/* create graphic context structures needed for clipping */
clip_gc_values.graphics_exposures = False;
clip_gc_valuemask = GCGraphicsExposures;
}
}
- /* initialize pixmap array to Pixmap 'None' */
- for(i=0; i<NUM_TILES; i++)
- tile_clipmask[i] = None;
-
+#if defined(TARGET_X11_NATIVE)
/* create only those clipping Pixmaps we really need */
for(i=0; tile_needs_clipping[i].start>=0; i++)
{
src_x, src_y, TILEX, TILEY, 0, 0);
}
}
+#endif /* TARGET_X11_NATIVE */
#endif /* TARGET_X11 */
}
EL_AMOEBE_VOLL,
EL_AMOEBE_BD
};
- static int ep_amoebalive_num = sizeof(ep_amoebalive)/sizeof(int);
+ static int ep_amoebalive_num = SIZEOF_ARRAY_INT(ep_amoebalive);
static int ep_amoeboid[] =
{
EL_AMOEBE_VOLL,
EL_AMOEBE_BD
};
- static int ep_amoeboid_num = sizeof(ep_amoeboid)/sizeof(int);
+ static int ep_amoeboid_num = SIZEOF_ARRAY_INT(ep_amoeboid);
static int ep_schluessel[] =
{
EL_EM_KEY_3,
EL_EM_KEY_4
};
- static int ep_schluessel_num = sizeof(ep_schluessel)/sizeof(int);
+ static int ep_schluessel_num = SIZEOF_ARRAY_INT(ep_schluessel);
static int ep_pforte[] =
{
EL_TUBE_RIGHT_UP,
EL_TUBE_RIGHT_DOWN
};
- static int ep_pforte_num = sizeof(ep_pforte)/sizeof(int);
+ static int ep_pforte_num = SIZEOF_ARRAY_INT(ep_pforte);
static int ep_solid[] =
{
EL_AMOEBE_BD,
EL_MORAST_VOLL,
EL_MORAST_LEER,
+ EL_QUICKSAND_FILLING,
+ EL_QUICKSAND_EMPTYING,
EL_MAGIC_WALL_OFF,
EL_MAGIC_WALL_EMPTY,
EL_MAGIC_WALL_FULL,
EL_TUBE_RIGHT_UP,
EL_TUBE_RIGHT_DOWN
};
- static int ep_solid_num = sizeof(ep_solid)/sizeof(int);
+ static int ep_solid_num = SIZEOF_ARRAY_INT(ep_solid);
static int ep_massive[] =
{
EL_TUBE_RIGHT_UP,
EL_TUBE_RIGHT_DOWN
};
- static int ep_massive_num = sizeof(ep_massive)/sizeof(int);
+ static int ep_massive_num = SIZEOF_ARRAY_INT(ep_massive);
static int ep_slippery[] =
{
EL_PEARL,
EL_CRYSTAL
};
- static int ep_slippery_num = sizeof(ep_slippery)/sizeof(int);
+ static int ep_slippery_num = SIZEOF_ARRAY_INT(ep_slippery);
static int ep_enemy[] =
{
EL_SP_SNIKSNAK,
EL_SP_ELECTRON
};
- static int ep_enemy_num = sizeof(ep_enemy)/sizeof(int);
+ static int ep_enemy_num = SIZEOF_ARRAY_INT(ep_enemy);
static int ep_mauer[] =
{
EL_EMC_WALL_7,
EL_EMC_WALL_8
};
- static int ep_mauer_num = sizeof(ep_mauer)/sizeof(int);
+ static int ep_mauer_num = SIZEOF_ARRAY_INT(ep_mauer);
static int ep_can_fall[] =
{
EL_SPRING,
EL_DX_SUPABOMB
};
- static int ep_can_fall_num = sizeof(ep_can_fall)/sizeof(int);
+ static int ep_can_fall_num = SIZEOF_ARRAY_INT(ep_can_fall);
static int ep_can_smash[] =
{
EL_SPRING,
EL_DX_SUPABOMB
};
- static int ep_can_smash_num = sizeof(ep_can_smash)/sizeof(int);
+ static int ep_can_smash_num = SIZEOF_ARRAY_INT(ep_can_smash);
static int ep_can_change[] =
{
EL_EDELSTEIN_LILA,
EL_DIAMANT
};
- static int ep_can_change_num = sizeof(ep_can_change)/sizeof(int);
+ static int ep_can_change_num = SIZEOF_ARRAY_INT(ep_can_change);
static int ep_can_move[] =
{
EL_BALLOON,
EL_SPRING_MOVING
};
- static int ep_can_move_num = sizeof(ep_can_move)/sizeof(int);
+ static int ep_can_move_num = SIZEOF_ARRAY_INT(ep_can_move);
static int ep_could_move[] =
{
EL_PACMAN_LEFT,
EL_PACMAN_DOWN
};
- static int ep_could_move_num = sizeof(ep_could_move)/sizeof(int);
+ static int ep_could_move_num = SIZEOF_ARRAY_INT(ep_could_move);
static int ep_dont_touch[] =
{
EL_BUTTERFLY,
EL_FIREFLY
};
- static int ep_dont_touch_num = sizeof(ep_dont_touch)/sizeof(int);
+ static int ep_dont_touch_num = SIZEOF_ARRAY_INT(ep_dont_touch);
static int ep_dont_go_to[] =
{
EL_TRAP_ACTIVE,
EL_LANDMINE
};
- static int ep_dont_go_to_num = sizeof(ep_dont_go_to)/sizeof(int);
+ static int ep_dont_go_to_num = SIZEOF_ARRAY_INT(ep_dont_go_to);
static int ep_mampf2[] =
{
EL_PEARL,
EL_CRYSTAL
};
- static int ep_mampf2_num = sizeof(ep_mampf2)/sizeof(int);
+ static int ep_mampf2_num = SIZEOF_ARRAY_INT(ep_mampf2);
static int ep_bd_element[] =
{
EL_AMOEBE_BD,
EL_CHAR_FRAGE
};
- static int ep_bd_element_num = sizeof(ep_bd_element)/sizeof(int);
+ static int ep_bd_element_num = SIZEOF_ARRAY_INT(ep_bd_element);
static int ep_sb_element[] =
{
EL_SPIELFIGUR,
EL_INVISIBLE_STEEL
};
- static int ep_sb_element_num = sizeof(ep_sb_element)/sizeof(int);
+ static int ep_sb_element_num = SIZEOF_ARRAY_INT(ep_sb_element);
static int ep_gem[] =
{
EL_EDELSTEIN_GELB,
EL_EDELSTEIN_ROT,
EL_EDELSTEIN_LILA,
- EL_DIAMANT,
- EL_SP_INFOTRON
+ EL_DIAMANT
};
- static int ep_gem_num = sizeof(ep_gem)/sizeof(int);
+ static int ep_gem_num = SIZEOF_ARRAY_INT(ep_gem);
static int ep_inactive[] =
{
EL_EMC_WALL_7,
EL_EMC_WALL_8
};
- static int ep_inactive_num = sizeof(ep_inactive)/sizeof(int);
+ static int ep_inactive_num = SIZEOF_ARRAY_INT(ep_inactive);
static int ep_explosive[] =
{
EL_SP_ELECTRON,
EL_DX_SUPABOMB
};
- static int ep_explosive_num = sizeof(ep_explosive)/sizeof(int);
+ static int ep_explosive_num = SIZEOF_ARRAY_INT(ep_explosive);
static int ep_mampf3[] =
{
EL_PEARL,
EL_CRYSTAL
};
- static int ep_mampf3_num = sizeof(ep_mampf3)/sizeof(int);
+ static int ep_mampf3_num = SIZEOF_ARRAY_INT(ep_mampf3);
static int ep_pushable[] =
{
EL_SPRING,
EL_DX_SUPABOMB
};
- static int ep_pushable_num = sizeof(ep_pushable)/sizeof(int);
+ static int ep_pushable_num = SIZEOF_ARRAY_INT(ep_pushable);
static int ep_player[] =
{
EL_SPIELER3,
EL_SPIELER4
};
- static int ep_player_num = sizeof(ep_player)/sizeof(int);
+ static int ep_player_num = SIZEOF_ARRAY_INT(ep_player);
static int ep_has_content[] =
{
EL_AMOEBE_VOLL,
EL_AMOEBE_BD
};
- static int ep_has_content_num = sizeof(ep_has_content)/sizeof(int);
+ static int ep_has_content_num = SIZEOF_ARRAY_INT(ep_has_content);
static int ep_eatable[] =
{
EL_TRAP_INACTIVE,
EL_SAND_INVISIBLE
};
- static int ep_eatable_num = sizeof(ep_eatable)/sizeof(int);
+ static int ep_eatable_num = SIZEOF_ARRAY_INT(ep_eatable);
static int ep_sp_element[] =
{
/* more than one murphy in a level results in an inactive clone */
EL_SP_MURPHY_CLONE
};
- static int ep_sp_element_num = sizeof(ep_sp_element)/sizeof(int);
+ static int ep_sp_element_num = SIZEOF_ARRAY_INT(ep_sp_element);
static int ep_quick_gate[] =
{
EL_SWITCHGATE_OPEN,
EL_TIMEGATE_OPEN
};
- static int ep_quick_gate_num = sizeof(ep_quick_gate)/sizeof(int);
+ static int ep_quick_gate_num = SIZEOF_ARRAY_INT(ep_quick_gate);
static int ep_over_player[] =
{
EL_TUBE_RIGHT_UP,
EL_TUBE_RIGHT_DOWN
};
- static int ep_over_player_num = sizeof(ep_over_player)/sizeof(int);
+ static int ep_over_player_num = SIZEOF_ARRAY_INT(ep_over_player);
static int ep_active_bomb[] =
{
EL_DYNABOMB_ACTIVE_3,
EL_DYNABOMB_ACTIVE_4
};
- static int ep_active_bomb_num = sizeof(ep_active_bomb)/sizeof(int);
+ static int ep_active_bomb_num = SIZEOF_ARRAY_INT(ep_active_bomb);
static int ep_belt[] =
{
EL_BELT4_MIDDLE,
EL_BELT4_RIGHT,
};
- static int ep_belt_num = sizeof(ep_belt)/sizeof(int);
+ static int ep_belt_num = SIZEOF_ARRAY_INT(ep_belt);
static int ep_belt_switch[] =
{
EL_BELT4_SWITCH_MIDDLE,
EL_BELT4_SWITCH_RIGHT,
};
- static int ep_belt_switch_num = sizeof(ep_belt_switch)/sizeof(int);
+ static int ep_belt_switch_num = SIZEOF_ARRAY_INT(ep_belt_switch);
static int ep_tube[] =
{
EL_TUBE_RIGHT_UP,
EL_TUBE_RIGHT_DOWN
};
- static int ep_tube_num = sizeof(ep_tube)/sizeof(int);
+ static int ep_tube_num = SIZEOF_ARRAY_INT(ep_tube);
static long ep1_bit[] =
{
&ep_belt_switch_num,
&ep_tube_num
};
- static int num_properties1 = sizeof(ep1_num)/sizeof(int *);
- static int num_properties2 = sizeof(ep2_num)/sizeof(int *);
+ static int num_properties1 = SIZEOF_ARRAY(ep1_num, int *);
+ static int num_properties2 = SIZEOF_ARRAY(ep2_num, int *);
for(i=0; i<MAX_ELEMENTS; i++)
{
StopSounds();
FreeSounds(NUM_SOUNDS);
-
-#if !defined(TARGET_SDL)
- if (audio.soundserver_pid)
- kill(audio.soundserver_pid, SIGTERM);
-#endif
+ CloseAudio();
for(i=0; i<NUM_BITMAPS; i++)
FreeBitmap(pix[i]);
-
- KeyboardAutoRepeatOn();
-
CloseVideoDisplay();
ClosePlatformDependantStuff();