* main.c *
***********************************************************/
+#include "libgame/libgame.h"
+
#include "main.h"
#include "init.h"
#include "game.h"
#include "events.h"
-#include "sound.h"
#include "joystick.h"
-#include "misc.h"
-
-#if defined(PLATFORM_MSDOS)
-#include <fcntl.h>
-#endif
-Display *display;
-Visual *visual;
-int screen;
-DrawWindow window = None;
-GC gc, clip_gc[NUM_BITMAPS], tile_clip_gc;
+GC tile_clip_gc;
Bitmap pix[NUM_BITMAPS];
-Bitmap pix_masked[NUM_BITMAPS], tile_masked[NUM_TILES];
-Pixmap clipmask[NUM_BITMAPS], tile_clipmask[NUM_TILES];
-
-DrawBuffer drawto, drawto_field, backbuffer, fieldbuffer;
-Colormap cmap;
+Pixmap tile_clipmask[NUM_TILES];
+DrawBuffer drawto_field, fieldbuffer;
-int sound_pipe[2];
-int sound_device;
-char *sound_device_name = SOUND_DEVICE;
int joystick_device = 0;
char *joystick_device_name[MAX_PLAYERS] =
{
DEV_JOYSTICK_3
};
-char *program_name = NULL;
-
int game_status = MAINMENU;
boolean level_editor_test_game = FALSE;
boolean network_playing = FALSE;
-int button_status = MB_NOT_PRESSED;
-boolean motion_status = FALSE;
+
int key_joystick_mapping = 0;
int global_joystick_status = JOYSTICK_STATUS;
int joystick_status = JOYSTICK_STATUS;
-int sound_status = SOUND_STATUS;
-boolean sound_loops_allowed = FALSE;
-boolean fullscreen_available = FULLSCREEN_STATUS;
-boolean fullscreen_enabled = FALSE;
boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
int redraw_x1 = 0, redraw_y1 = 0;
-int redraw_mask;
-int redraw_tiles;
short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
int SBY_Upper, SBY_Lower;
int ZX,ZY, ExitX,ExitY;
int AllPlayersGone;
-int FrameCounter, TimeFrames, TimePlayed, TimeLeft;
+
+int TimeFrames, TimePlayed, TimeLeft;
boolean network_player_action_received = FALSE;
-struct LevelDirInfo *leveldir_first = NULL, *leveldir_current = NULL;
struct LevelInfo level;
struct PlayerInfo stored_player[MAX_PLAYERS], *local_player = NULL;
struct HiScore highscore[MAX_SCORE_ENTRIES];
-struct SoundInfo Sound[NUM_SOUNDS];
struct TapeInfo tape;
-struct OptionInfo options;
struct SetupInfo setup;
struct GameInfo game;
struct GlobalInfo global;
int num_element_info = sizeof(element_info)/sizeof(char *);
-
-/* +-----------------------------------------------------------------------+ */
-/* | SDL TEST STUFF | */
-/* +-----------------------------------------------------------------------+ */
-
-#if defined(TARGET_SDL)
-
-SDL_Surface *sdl_screen, *sdl_image_tmp, *sdl_image, *sdl_image_masked;
-SDL_Surface *sdl_image2_tmp, *sdl_image2, *sdl_image2_masked;
-
-void TEST_SDL_BLIT_RECT(int x, int y)
-{
- SDL_Rect rect_src, rect_dst;
-
- SDLCopyArea(pix_masked[PIX_HEROES], window,
- 8 * TILEX, 8 * TILEY, TILEX, TILEY, x, y);
- return;
-
- rect_src.x = 8 * TILEX;
- rect_src.y = 8 * TILEY;
- rect_src.w = TILEX;
- rect_src.h = TILEY;
-
- rect_dst.x = x;
- rect_dst.y = y;
- rect_dst.w = TILEX;
- rect_dst.h = TILEY;
-
- SDL_BlitSurface(sdl_image2_masked, &rect_src, sdl_screen, &rect_dst);
- SDL_UpdateRect(sdl_screen, x, y, TILEX, TILEY);
-}
-
-void TEST_SDL_INIT_DISPLAY()
-{
- SDL_Rect rect_src, rect_dst;
-
- if (SDL_Init(SDL_INIT_VIDEO) < 0)
- {
- fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError());
- exit(1);
- }
-
- /* automatically cleanup SDL stuff after exit() */
- atexit(SDL_Quit);
-
- if ((sdl_screen = SDL_SetVideoMode(WIN_XSIZE, WIN_YSIZE, 16, SDL_HWSURFACE))
- == NULL)
- {
- fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError());
- exit(1);
- }
-
- SDL_WM_SetCaption(WINDOW_TITLE_STRING, WINDOW_TITLE_STRING);
-
- if ((sdl_image_tmp = IMG_Load("graphics/RocksScreen.pcx")) == NULL)
- {
- fprintf(stderr, "IMG_Load() failed: %s\n", SDL_GetError());
- exit(1);
- }
-
- sdl_image = SDL_DisplayFormat(sdl_image_tmp);
-
- SDL_SetColorKey(sdl_image_tmp, SDL_SRCCOLORKEY,
- SDL_MapRGB(sdl_image_tmp->format, 0x00, 0x00, 0x00));
- sdl_image_masked = SDL_DisplayFormat(sdl_image_tmp);
-
- SDL_FreeSurface(sdl_image_tmp);
-
- if ((sdl_image2_tmp = IMG_Load("graphics/RocksHeroes.pcx")) == NULL)
- {
- fprintf(stderr, "IMG_Load() failed: %s\n", SDL_GetError());
- exit(1);
- }
-
- sdl_image2 = SDL_DisplayFormat(sdl_image2_tmp);
- SDL_FreeSurface(sdl_image2_tmp);
-
- sdl_image2_masked = SDL_DisplayFormat(sdl_image2);
- SDL_SetColorKey(sdl_image2_masked, SDL_SRCCOLORKEY,
- SDL_MapRGB(sdl_image2_masked->format, 0x00, 0x00, 0x00));
-
- rect_src.x = 0;
- rect_src.y = 0;
- rect_src.w = sdl_image->w;
- rect_src.h = sdl_image->h;
-
- rect_dst.x = 0;
- rect_dst.y = 0;
- rect_dst.w = sdl_image->w;
- rect_dst.h = sdl_image->h;
-
- SDL_BlitSurface(sdl_image, &rect_src, sdl_screen, &rect_dst);
-
- /*
- SDL_UpdateRect(sdl_screen, 0, 0, WIN_XSIZE, WIN_YSIZE);
- */
- /*
- SDL_UpdateRect(sdl_screen, 0, 0, 0, 0);
- */
- SDL_Flip(sdl_screen);
-
- /*
- SDL_Delay(5000);
- */
-}
-
-void TEST_SDL_EVENT_LOOP()
-{
- int quit_loop = 0;
-
- SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
-
- /*
- while (!quit_loop && SDL_WaitEvent(&event) >=0)
- */
-
- while (!quit_loop)
- {
- SDL_Event event;
-
- if (SDL_PollEvent(&event))
- {
- /* hier werden die Ereignisse behandelt */
- switch(event.type)
- {
- case SDL_QUIT:
- {
- quit_loop = 1;
- break;
- }
-
- case SDL_MOUSEBUTTONDOWN:
- {
- int x = event.button.x;
- int y = event.button.y;
-
- SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE);
-
- TEST_SDL_BLIT_RECT(x, y);
-
- printf("SDL_MOUSEBUTTONDOWN(%d, %d)\n", x, y);
- break;
- }
-
- case SDL_MOUSEBUTTONUP:
- {
- int x = event.button.x;
- int y = event.button.y;
-
- SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
-
- printf("SDL_MOUSEBUTTONUP(%d, %d)\n", x, y);
- break;
- }
-
- case SDL_MOUSEMOTION:
- {
- int x = event.motion.x;
- int y = event.motion.y;
-
- TEST_SDL_BLIT_RECT(x, y);
-
- printf("SDL_MOUSEMOTION(%d, %d)\n", x, y);
- break;
- }
-
- default:
- break;
- }
- }
-
- if (!SDL_PollEvent(NULL)) /* delay only if no pending events */
- {
- printf("waiting...\n");
- Delay(100);
- }
- }
-
- SDL_FreeSurface(sdl_image);
- SDL_Quit();
-}
-
-#define SCREEN_WIDTH 640
-#define SCREEN_HEIGHT 480
-
-void WatchJoysticks()
-{
- SDL_Surface *screen;
- const char *name;
- int i, done;
- SDL_Event event;
- int x, y, draw;
- SDL_Rect axis_area[2];
- int joystick_nr = 0;
- SDL_Joystick *joystick = Get_SDL_Joystick(joystick_nr);
-
- /* Set a video mode to display joystick axis position */
- screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16, 0);
- if ( screen == NULL ) {
- fprintf(stderr, "Couldn't set video mode: %s\n",SDL_GetError());
- return;
- }
-
- /* Print info about the joysticks we are watching */
- for (i=0; i<2; i++)
- {
- joystick = Get_SDL_Joystick(i);
-
- name = SDL_JoystickName(i);
- printf("Watching joystick %d: (%s)\n", i,
- name ? name : "Unknown Joystick");
- printf("Joystick has %d axes, %d hats, %d balls, and %d buttons\n",
- SDL_JoystickNumAxes(joystick),
- SDL_JoystickNumHats(joystick),
- SDL_JoystickNumBalls(joystick),
- SDL_JoystickNumButtons(joystick));
- }
-
- /* Initialize drawing rectangles */
- memset(axis_area, 0, (sizeof axis_area));
- draw = 0;
-
- /* Loop, getting joystick events! */
- done = 0;
- while ( ! done ) {
- while ( SDL_PollEvent(&event) ) {
- switch (event.type) {
- case SDL_JOYAXISMOTION:
- joystick_nr = event.jaxis.which;
- printf("Joystick %d axis %d value: %d\n",
- event.jaxis.which,
- event.jaxis.axis,
- event.jaxis.value);
- break;
- case SDL_JOYHATMOTION:
- joystick_nr = event.jaxis.which;
- printf("Joystick %d hat %d value:",
- event.jhat.which,
- event.jhat.hat);
- if ( event.jhat.value == SDL_HAT_CENTERED )
- printf(" centered");
- if ( event.jhat.value & SDL_HAT_UP )
- printf(" up");
- if ( event.jhat.value & SDL_HAT_RIGHT )
- printf(" right");
- if ( event.jhat.value & SDL_HAT_DOWN )
- printf(" down");
- if ( event.jhat.value & SDL_HAT_LEFT )
- printf(" left");
- printf("\n");
- break;
- case SDL_JOYBALLMOTION:
- joystick_nr = event.jaxis.which;
- printf("Joystick %d ball %d delta: (%d,%d)\n",
- event.jball.which,
- event.jball.ball,
- event.jball.xrel,
- event.jball.yrel);
- break;
- case SDL_JOYBUTTONDOWN:
- joystick_nr = event.jaxis.which;
- printf("Joystick %d button %d down\n",
- event.jbutton.which,
- event.jbutton.button);
- break;
- case SDL_JOYBUTTONUP:
- joystick_nr = event.jaxis.which;
- printf("Joystick %d button %d up\n",
- event.jbutton.which,
- event.jbutton.button);
- break;
- case SDL_KEYDOWN:
- if ( event.key.keysym.sym != SDLK_ESCAPE ) {
- break;
- }
- /* Fall through to signal quit */
- case SDL_QUIT:
- done = 1;
- break;
- default:
- break;
- }
- }
-
- joystick = Get_SDL_Joystick(joystick_nr);
-
- /* Update visual joystick state */
- for ( i=0; i<SDL_JoystickNumButtons(joystick); ++i ) {
- SDL_Rect area;
-
- area.x = i*34;
- area.y = SCREEN_HEIGHT-34;
- area.w = 32;
- area.h = 32;
- if (SDL_JoystickGetButton(joystick, i) == SDL_PRESSED) {
- SDL_FillRect(screen, &area, 0xFFFF);
- } else {
- SDL_FillRect(screen, &area, 0x0000);
- }
- SDL_UpdateRects(screen, 1, &area);
- }
-
- /* Erase previous axes */
- SDL_FillRect(screen, &axis_area[draw], 0x0000);
-
- /* Draw the X/Y axis */
- draw = !draw;
- x = (((int)SDL_JoystickGetAxis(joystick, 0))+32768);
- x *= SCREEN_WIDTH;
- x /= 65535;
- if ( x < 0 ) {
- x = 0;
- } else
- if ( x > (SCREEN_WIDTH-16) ) {
- x = SCREEN_WIDTH-16;
- }
- y = (((int)SDL_JoystickGetAxis(joystick, 1))+32768);
- y *= SCREEN_HEIGHT;
- y /= 65535;
- if ( y < 0 ) {
- y = 0;
- } else
- if ( y > (SCREEN_HEIGHT-16) ) {
- y = SCREEN_HEIGHT-16;
- }
- axis_area[draw].x = (Sint16)x;
- axis_area[draw].y = (Sint16)y;
- axis_area[draw].w = 16;
- axis_area[draw].h = 16;
- SDL_FillRect(screen, &axis_area[draw], 0xFFFF);
-
- SDL_UpdateRects(screen, 2, axis_area);
- }
-}
-
-void TEST_SDL_JOYSTICK()
-{
- const char *name;
- int i;
-
- /* Initialize SDL (Note: video is required to start event loop) */
- if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0 )
- {
- fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
- exit(1);
- }
-
- /* Print information about the joysticks */
- printf("There are %d joysticks attached\n", SDL_NumJoysticks());
- for ( i=0; i<SDL_NumJoysticks(); ++i )
- {
- name = SDL_JoystickName(i);
- printf("Joystick %d: %s\n",i,name ? name : "Unknown Joystick");
- }
-
- for (i=0; i<2; i++)
- {
- if (!Open_SDL_Joystick(i))
- printf("Couldn't open joystick %d: %s\n", i, SDL_GetError());
- }
-
- WatchJoysticks();
-
- for (i=0; i<2; i++)
- Close_SDL_Joystick(i);
-
- SDL_QuitSubSystem(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK);
-}
-
-#endif /* TARGET_SDL */
-
-/* +-----------------------------------------------------------------------+ */
-/* | SDL TEST STUFF | */
-/* +-----------------------------------------------------------------------+ */
-
-
+/* ========================================================================= */
+/* main() */
+/* ========================================================================= */
int main(int argc, char *argv[])
{
- program_name = (strrchr(argv[0],'/') ? strrchr(argv[0],'/') + 1 : argv[0]);
-
-#if defined(PLATFORM_MSDOS)
- _fmode = O_BINARY;
-#endif
+ InitCommandName(argv[0]);
+ InitExitFunction(CloseAllAndExit);
+ InitPlatformDependantStuff();
-#if 1
GetOptions(argv);
- OpenAll(argc,argv);
-#endif
-
-#if 0
-#ifdef TARGET_SDL
- /*
- TEST_SDL_BLIT_RECT((WIN_XSIZE - TILEX)/2, (WIN_YSIZE - TILEY)/2);
- TEST_SDL_EVENT_LOOP();
- */
- TEST_SDL_JOYSTICK();
- exit(0);
-#endif
-#endif
+ OpenAll();
EventLoop();
CloseAllAndExit(0);