X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fsetup.cpp;h=4bfd9c30b96025fb44da00d88b0a888f902f386c;hb=2ec1be264110139466ab70422b8f4fd9c22e5c8c;hp=6cc2e4ae59034ca3276bd227e018e090fb38e78d;hpb=e8ce5f3978548da90d41229cd7da36ef6eaebf99;p=supertux.git diff --git a/src/setup.cpp b/src/setup.cpp index 6cc2e4ae5..4bfd9c30b 100644 --- a/src/setup.cpp +++ b/src/setup.cpp @@ -1,17 +1,26 @@ -/* - setup.c - - Super Tux - Setup - - by Bill Kendrick - bill@newbreedsoftware.com - http://www.newbreedsoftware.com/supertux/ - - April 11, 2000 - March 15, 2004 -*/ +// $Id$ +// +// SuperTux - A Jump'n Run +// Copyright (C) 2000 Bill Kendrick +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include +#include +#include #include #include #include @@ -22,13 +31,13 @@ #include #endif -#ifndef WIN32 #include #include #include +#ifndef WIN32 #include -#include #endif +#include #include "defines.h" #include "globals.h" @@ -37,6 +46,23 @@ #include "texture.h" #include "menu.h" #include "gameloop.h" +#include "configfile.h" +#include "scene.h" +#include "worldmap.h" +#include "resources.h" +#include "intro.h" +#include "music_manager.h" + +#include "player.h" + +void display_text_file(char *filename); + +#ifdef WIN32 +#define mkdir(dir, mode) mkdir(dir) +// on win32 we typically don't want LFS paths +#undef DATA_PREFIX +#define DATA_PREFIX "./data/" +#endif /* Local function prototypes: */ @@ -49,14 +75,14 @@ int faccessible(const char *filename) struct stat filestat; if (stat(filename, &filestat) == -1) { - return NO; + return false; } else { if(S_ISREG(filestat.st_mode)) - return YES; + return true; else - return NO; + return false; } } @@ -67,12 +93,12 @@ int fwriteable(const char *filename) fi = fopen(filename, "wa"); if (fi == NULL) { - return NO; + return false; } - return YES; + return true; } -/* Makes sure a directory is created in either the SuperTux base directory or the SuperTux base directory.*/ +/* Makes sure a directory is created in either the SuperTux home directory or the SuperTux base directory.*/ int fcreatedir(const char* relative_dir) { char path[1024]; @@ -82,17 +108,47 @@ int fcreatedir(const char* relative_dir) snprintf(path, 1024, "%s/%s/", datadir.c_str(), relative_dir); if(mkdir(path,0755) != 0) { - return NO; + return false; } else { - return YES; + return true; } } else { - return YES; + return true; + } +} + +FILE * opendata(const char * rel_filename, const char * mode) +{ + char * filename = NULL; + FILE * fi; + + filename = (char *) malloc(sizeof(char) * (strlen(st_dir) + + strlen(rel_filename) + 1)); + + strcpy(filename, st_dir); + /* Open the high score file: */ + + strcat(filename, rel_filename); + + /* Try opening the file: */ + fi = fopen(filename, mode); + + if (fi == NULL) + { + fprintf(stderr, "Warning: Unable to open the file \"%s\" ", filename); + + if (strcmp(mode, "r") == 0) + fprintf(stderr, "for read!!!\n"); + else if (strcmp(mode, "w") == 0) + fprintf(stderr, "for write!!!\n"); } + free( filename ); + + return(fi); } /* Get all names of sub-directories in a certain directory. */ @@ -271,22 +327,16 @@ void st_directory_setup(void) strcat(st_save_dir,"/save"); /* Create them. In the case they exist they won't destroy anything. */ -#ifndef WIN32 mkdir(st_dir, 0755); mkdir(st_save_dir, 0755); sprintf(str, "%s/levels", st_dir); mkdir(str, 0755); -#else - mkdir(st_dir); - mkdir(st_save_dir); - sprintf(str, "%s/levels", st_dir); - mkdir(str); -#endif // User has not that a datadir, so we try some magic if (datadir.empty()) { +#ifndef WIN32 // Detect datadir char exe_file[PATH_MAX]; if (readlink("/proc/self/exe", exe_file, PATH_MAX) < 0) @@ -298,16 +348,19 @@ void st_directory_setup(void) { std::string exedir = std::string(dirname(exe_file)) + "/"; - datadir = exedir + "../data/"; // SuperTux run from source dir + datadir = exedir + "../data"; // SuperTux run from source dir if (access(datadir.c_str(), F_OK) != 0) { - datadir = exedir + "../share/supertux/"; // SuperTux run from PATH + datadir = exedir + "../share/supertux"; // SuperTux run from PATH if (access(datadir.c_str(), F_OK) != 0) { // If all fails, fall back to compiled path datadir = DATA_PREFIX; } } } +#else + datadir = DATA_PREFIX; +#endif } printf("Datadir: %s\n", datadir.c_str()); } @@ -315,157 +368,193 @@ void st_directory_setup(void) /* Create and setup menus. */ void st_menu(void) { - menu_init(&main_menu); - menu_additem(&main_menu,menu_item_create(MN_LABEL,"Main Menu",0,0)); - menu_additem(&main_menu,menu_item_create(MN_HL,"",0,0)); - menu_additem(&main_menu,menu_item_create(MN_ACTION,"Start Game",0,0)); - menu_additem(&main_menu,menu_item_create(MN_GOTO,"Load Game",0,&load_game_menu)); - menu_additem(&main_menu,menu_item_create(MN_GOTO,"Options",0,&options_menu)); - menu_additem(&main_menu,menu_item_create(MN_ACTION,"Level editor",0,0)); - menu_additem(&main_menu,menu_item_create(MN_ACTION,"Credits",0,0)); - menu_additem(&main_menu,menu_item_create(MN_HL,"",0,0)); - menu_additem(&main_menu,menu_item_create(MN_ACTION,"Quit",0,0)); - - menu_init(&options_menu); - menu_additem(&options_menu,menu_item_create(MN_LABEL,"Options",0,0)); - menu_additem(&options_menu,menu_item_create(MN_HL,"",0,0)); - menu_additem(&options_menu,menu_item_create(MN_TOGGLE,"Fullscreen",use_fullscreen,0)); - if(audio_device == YES) + main_menu = new Menu(); + options_menu = new Menu(); + options_keys_menu = new Menu(); + options_joystick_menu = new Menu(); + load_game_menu = new Menu(); + save_game_menu = new Menu(); + game_menu = new Menu(); + highscore_menu = new Menu(); + contrib_menu = new Menu(); + contrib_subset_menu = new Menu(); + worldmap_menu = new Menu(); + + main_menu->set_pos(screen->w/2, 335); + main_menu->additem(MN_GOTO, "Start Game",0,load_game_menu, MNID_STARTGAME); + main_menu->additem(MN_GOTO, "Contrib Levels",0,contrib_menu, MNID_CONTRIB); + main_menu->additem(MN_GOTO, "Options",0,options_menu, MNID_OPTIONMENU); + main_menu->additem(MN_ACTION,"Level editor",0,0, MNID_LEVELEDITOR); + main_menu->additem(MN_ACTION,"Credits",0,0, MNID_CREDITS); + main_menu->additem(MN_ACTION,"Quit",0,0, MNID_QUITMAINMENU); + + options_menu->additem(MN_LABEL,"Options",0,0); + options_menu->additem(MN_HL,"",0,0); +#ifndef NOOPENGL + options_menu->additem(MN_TOGGLE,"OpenGL",use_gl,0, MNID_OPENGL); +#else + options_menu->additem(MN_DEACTIVE,"OpenGL (not supported)",use_gl,MNID_OPENGL); +#endif + options_menu->additem(MN_TOGGLE,"Fullscreen",use_fullscreen,0, MNID_FULLSCREEN); + if(audio_device) { - menu_additem(&options_menu,menu_item_create(MN_TOGGLE,"Sound ",use_sound,0)); - menu_additem(&options_menu,menu_item_create(MN_TOGGLE,"Music ",use_music,0)); + options_menu->additem(MN_TOGGLE,"Sound ", use_sound,0, MNID_SOUND); + options_menu->additem(MN_TOGGLE,"Music ", use_music,0, MNID_MUSIC); } else { - menu_additem(&options_menu,menu_item_create(MN_DEACTIVE,"Sound ",use_sound,0)); - menu_additem(&options_menu,menu_item_create(MN_DEACTIVE,"Music ",use_music,0)); + options_menu->additem(MN_DEACTIVE,"Sound ", false,0, MNID_SOUND); + options_menu->additem(MN_DEACTIVE,"Music ", false,0, MNID_MUSIC); } - menu_additem(&options_menu,menu_item_create(MN_TOGGLE,"Show FPS ",show_fps,0)); - menu_additem(&options_menu,menu_item_create(MN_HL,"",0,0)); - menu_additem(&options_menu,menu_item_create(MN_BACK,"Back",0,0)); - - menu_init(&load_game_menu); - menu_additem(&load_game_menu,menu_item_create(MN_LABEL,"Load Game",0,0)); - menu_additem(&load_game_menu,menu_item_create(MN_HL,"",0,0)); - menu_additem(&load_game_menu,menu_item_create(MN_DEACTIVE,"Slot 1",0,0)); - menu_additem(&load_game_menu,menu_item_create(MN_DEACTIVE,"Slot 2",0,0)); - menu_additem(&load_game_menu,menu_item_create(MN_DEACTIVE,"Slot 3",0,0)); - menu_additem(&load_game_menu,menu_item_create(MN_DEACTIVE,"Slot 4",0,0)); - menu_additem(&load_game_menu,menu_item_create(MN_DEACTIVE,"Slot 5",0,0)); - menu_additem(&load_game_menu,menu_item_create(MN_HL,"",0,0)); - menu_additem(&load_game_menu,menu_item_create(MN_BACK,"Back",0,0)); - - menu_init(&save_game_menu); - menu_additem(&save_game_menu,menu_item_create(MN_LABEL,"Save Game",0,0)); - menu_additem(&save_game_menu,menu_item_create(MN_HL,"",0,0)); - menu_additem(&save_game_menu,menu_item_create(MN_DEACTIVE,"Slot 1",0,0)); - menu_additem(&save_game_menu,menu_item_create(MN_DEACTIVE,"Slot 2",0,0)); - menu_additem(&save_game_menu,menu_item_create(MN_DEACTIVE,"Slot 3",0,0)); - menu_additem(&save_game_menu,menu_item_create(MN_DEACTIVE,"Slot 4",0,0)); - menu_additem(&save_game_menu,menu_item_create(MN_DEACTIVE,"Slot 5",0,0)); - menu_additem(&save_game_menu,menu_item_create(MN_HL,"",0,0)); - menu_additem(&save_game_menu,menu_item_create(MN_BACK,"Back",0,0)); - - menu_init(&game_menu); - menu_additem(&game_menu,menu_item_create(MN_LABEL,"InGame Menu",0,0)); - menu_additem(&game_menu,menu_item_create(MN_HL,"",0,0)); - menu_additem(&game_menu,menu_item_create(MN_ACTION,"Return To Game",0,0)); - menu_additem(&game_menu,menu_item_create(MN_GOTO,"Save Game",0,&save_game_menu)); - menu_additem(&game_menu,menu_item_create(MN_GOTO,"Load Game",0,&load_game_menu)); - menu_additem(&game_menu,menu_item_create(MN_GOTO,"Options",0,&options_menu)); - menu_additem(&game_menu,menu_item_create(MN_HL,"",0,0)); - menu_additem(&game_menu,menu_item_create(MN_ACTION,"Quit Game",0,0)); - - menu_init(&highscore_menu); - menu_additem(&highscore_menu,menu_item_create(MN_TEXTFIELD,"Enter your name:",0,0)); - + options_menu->additem(MN_TOGGLE,"Show FPS ",show_fps,0, MNID_SHOWFPS); + options_menu->additem(MN_GOTO,"Key Setup",0,options_keys_menu); + if(use_joystick) + options_menu->additem(MN_GOTO,"Joystick Setup",0,options_joystick_menu); + options_menu->additem(MN_HL,"",0,0); + options_menu->additem(MN_BACK,"Back",0,0); + + options_keys_menu->additem(MN_LABEL,"Key Setup",0,0); + options_keys_menu->additem(MN_HL,"",0,0); + options_keys_menu->additem(MN_CONTROLFIELD,"Left move", 0,0, 0,&keymap.left); + options_keys_menu->additem(MN_CONTROLFIELD,"Right move", 0,0, 0,&keymap.right); + options_keys_menu->additem(MN_CONTROLFIELD,"Jump", 0,0, 0,&keymap.jump); + options_keys_menu->additem(MN_CONTROLFIELD,"Duck", 0,0, 0,&keymap.duck); + options_keys_menu->additem(MN_CONTROLFIELD,"Power", 0,0, 0,&keymap.fire); + options_keys_menu->additem(MN_HL,"",0,0); + options_keys_menu->additem(MN_BACK,"Back",0,0); + + if(use_joystick) + { + options_joystick_menu->additem(MN_LABEL,"Joystick Setup",0,0); + options_joystick_menu->additem(MN_HL,"",0,0); + options_joystick_menu->additem(MN_CONTROLFIELD,"X axis", 0,0, 0,&joystick_keymap.x_axis); + options_joystick_menu->additem(MN_CONTROLFIELD,"Y axis", 0,0, 0,&joystick_keymap.y_axis); + options_joystick_menu->additem(MN_CONTROLFIELD,"A button", 0,0, 0,&joystick_keymap.a_button); + options_joystick_menu->additem(MN_CONTROLFIELD,"B button", 0,0, 0,&joystick_keymap.b_button); + options_joystick_menu->additem(MN_CONTROLFIELD,"Start", 0,0, 0,&joystick_keymap.start_button); + options_joystick_menu->additem(MN_CONTROLFIELD,"DeadZone", 0,0, 0,&joystick_keymap.dead_zone); + options_joystick_menu->additem(MN_HL,"",0,0); + options_joystick_menu->additem(MN_BACK,"Back",0,0); + } + + load_game_menu->additem(MN_LABEL,"Start Game",0,0); + load_game_menu->additem(MN_HL,"",0,0); + load_game_menu->additem(MN_DEACTIVE,"Slot 1",0,0, 1); + load_game_menu->additem(MN_DEACTIVE,"Slot 2",0,0, 2); + load_game_menu->additem(MN_DEACTIVE,"Slot 3",0,0, 3); + load_game_menu->additem(MN_DEACTIVE,"Slot 4",0,0, 4); + load_game_menu->additem(MN_DEACTIVE,"Slot 5",0,0, 5); + load_game_menu->additem(MN_HL,"",0,0); + load_game_menu->additem(MN_BACK,"Back",0,0); + + save_game_menu->additem(MN_LABEL,"Save Game",0,0); + save_game_menu->additem(MN_HL,"",0,0); + save_game_menu->additem(MN_DEACTIVE,"Slot 1",0,0, 1); + save_game_menu->additem(MN_DEACTIVE,"Slot 2",0,0, 2); + save_game_menu->additem(MN_DEACTIVE,"Slot 3",0,0, 3); + save_game_menu->additem(MN_DEACTIVE,"Slot 4",0,0, 4); + save_game_menu->additem(MN_DEACTIVE,"Slot 5",0,0, 5); + save_game_menu->additem(MN_HL,"",0,0); + save_game_menu->additem(MN_BACK,"Back",0,0); + + game_menu->additem(MN_LABEL,"Pause",0,0); + game_menu->additem(MN_HL,"",0,0); + game_menu->additem(MN_ACTION,"Continue",0,0,MNID_CONTINUE); + game_menu->additem(MN_GOTO,"Options",0,options_menu); + game_menu->additem(MN_HL,"",0,0); + game_menu->additem(MN_ACTION,"Abort Level",0,0,MNID_ABORTLEVEL); + + worldmap_menu->additem(MN_LABEL,"Pause",0,0); + worldmap_menu->additem(MN_HL,"",0,0); + worldmap_menu->additem(MN_ACTION,"Continue",0,0,MNID_RETURNWORLDMAP); + worldmap_menu->additem(MN_ACTION,"Save",0,0,MNID_SAVEGAME); + worldmap_menu->additem(MN_GOTO,"Options",0,options_menu); + worldmap_menu->additem(MN_HL,"",0,0); + worldmap_menu->additem(MN_ACTION,"Quit Game",0,0,MNID_QUITWORLDMAP); + + highscore_menu->additem(MN_TEXTFIELD,"Enter your name:",0,0); } -void update_load_save_game_menu(menu_type* pmenu, int load) +void update_load_save_game_menu(Menu* pmenu) { - int i; - - for(i = 2; i < 7; ++i) + for(int i = 2; i < 7; ++i) { - char *tmp; - slotinfo(&tmp,i-1); - if(load && strlen(tmp) == strlen("Slot X - Free") ) - pmenu->item[i].kind = MN_DEACTIVE; - else - pmenu->item[i].kind = MN_ACTION; - menu_item_change_text(&pmenu->item[i],tmp); - free(tmp); + // FIXME: Insert a real savegame struct/class here instead of + // doing string vodoo + std::string tmp = slotinfo(i - 1); + pmenu->item[i].kind = MN_ACTION; + pmenu->item[i].change_text(tmp.c_str()); } } -void process_save_load_game_menu(int save) +bool process_load_game_menu() { - int slot; - switch (slot = menu_check(save ? &save_game_menu : &load_game_menu)) + int slot = load_game_menu->check(); + + if(slot != -1 && load_game_menu->get_item_by_id(slot).kind == MN_ACTION) { - default: - if(slot != -1) + char slotfile[1024]; + snprintf(slotfile, 1024, "%s/slot%d.stsg", st_save_dir, slot); + + if (access(slotfile, F_OK) != 0) { - if(save == YES) - { - savegame(slot - 1); - } - else - { - if(game_started == NO) - { - gameloop("default",slot - 1,ST_GL_LOAD_GAME); - show_menu = YES; - menu_set_current(&main_menu); - } - else - loadgame(slot - 1); - } - st_pause_ticks_stop(); + display_text_file("intro.txt"); } - break; + + WorldMapNS::WorldMap worldmap; + + // Load the game or at least set the savegame_file variable + worldmap.loadgame(slotfile); + + worldmap.display(); + + Menu::set_current(main_menu); + + st_pause_ticks_stop(); + return true; + } + else + { + return false; } } /* Handle changes made to global settings in the options menu. */ void process_options_menu(void) { - switch (menu_check(&options_menu)) + switch (options_menu->check()) { - case 2: - if(use_fullscreen != options_menu.item[2].toggled) + case MNID_OPENGL: +#ifndef NOOPENGL + if(use_gl != options_menu->isToggled(MNID_OPENGL)) + { + use_gl = !use_gl; + st_video_setup(); + } +#else + options_menu->get_item_by_id(MNID_OPENGL).toggled = false; +#endif + break; + case MNID_FULLSCREEN: + if(use_fullscreen != options_menu->isToggled(MNID_FULLSCREEN)) { use_fullscreen = !use_fullscreen; st_video_setup(); } break; - case 3: - if(use_sound != options_menu.item[3].toggled) + case MNID_SOUND: + if(use_sound != options_menu->isToggled(MNID_SOUND)) use_sound = !use_sound; break; - case 4: - if(use_music != options_menu.item[4].toggled) + case MNID_MUSIC: + if(use_music != options_menu->isToggled(MNID_MUSIC)) { - if(use_music == YES) - { - if(playing_music()) - { - halt_music(); - } - use_music = NO; - } - else - { - use_music = YES; - if (!playing_music()) - { - play_current_music(); - } - } + use_music = !use_music; + music_manager->enable_music(use_music); } break; - case 5: - if(show_fps != options_menu.item[5].toggled) + case MNID_SHOWFPS: + if(show_fps != options_menu->isToggled(MNID_SHOWFPS)) show_fps = !show_fps; break; } @@ -487,22 +576,25 @@ void st_general_setup(void) /* Load global images: */ - text_load(&black_text, datadir + "/images/status/letters-black.png", TEXT_TEXT, 16,18); - text_load(&gold_text,datadir + "/images/status/letters-gold.png", TEXT_TEXT, 16,18); - text_load(&blue_text,datadir + "/images/status/letters-blue.png", TEXT_TEXT, 16,18); - text_load(&red_text,datadir + "/images/status/letters-red.png", TEXT_TEXT, 16,18); - text_load(&white_text,datadir + "/images/status/letters-white.png", TEXT_TEXT, 16,18); - text_load(&white_small_text,datadir + "/images/status/letters-white-small.png", TEXT_TEXT, 8,9); - text_load(&white_big_text,datadir + "/images/status/letters-white-big.png", TEXT_TEXT, 20,23); - text_load(&yellow_nums,datadir + "/images/status/numbers.png", TEXT_NUM, 32,32); + black_text = new Text(datadir + "/images/status/letters-black.png", TEXT_TEXT, 16,18); + gold_text = new Text(datadir + "/images/status/letters-gold.png", TEXT_TEXT, 16,18); + blue_text = new Text(datadir + "/images/status/letters-blue.png", TEXT_TEXT, 16,18); + red_text = new Text(datadir + "/images/status/letters-red.png", TEXT_TEXT, 16,18); + white_text = new Text(datadir + "/images/status/letters-white.png", TEXT_TEXT, 16,18); + white_small_text = new Text(datadir + "/images/status/letters-white-small.png", TEXT_TEXT, 8,9); + white_big_text = new Text(datadir + "/images/status/letters-white-big.png", TEXT_TEXT, 20,23); + yellow_nums = new Text(datadir + "/images/status/numbers.png", TEXT_NUM, 32,32); /* Load GUI/menu images: */ - texture_load(&checkbox, datadir + "/images/status/checkbox.png", USE_ALPHA); - texture_load(&checkbox_checked, datadir + "/images/status/checkbox-checked.png", USE_ALPHA); - texture_load(&back, datadir + "/images/status/back.png", USE_ALPHA); - texture_load(&arrow_left, datadir + "/images/icons/left.png", USE_ALPHA); - texture_load(&arrow_right, datadir + "/images/icons/right.png", USE_ALPHA); - + checkbox = new Surface(datadir + "/images/status/checkbox.png", USE_ALPHA); + checkbox_checked = new Surface(datadir + "/images/status/checkbox-checked.png", USE_ALPHA); + back = new Surface(datadir + "/images/status/back.png", USE_ALPHA); + arrow_left = new Surface(datadir + "/images/icons/left.png", USE_ALPHA); + arrow_right = new Surface(datadir + "/images/icons/right.png", USE_ALPHA); + + /* Load the mouse-cursor */ + mouse_cursor = new MouseCursor( datadir + "/images/status/mousecursor.png",1); + } void st_general_free(void) @@ -510,35 +602,35 @@ void st_general_free(void) /* Free global images: */ - text_free(&black_text); - text_free(&gold_text); - text_free(&white_text); - text_free(&blue_text); - text_free(&red_text); - text_free(&white_small_text); - text_free(&white_big_text); + delete black_text; + delete gold_text; + delete white_text; + delete blue_text; + delete red_text; + delete white_small_text; + delete white_big_text; /* Free GUI/menu images: */ - texture_free(&checkbox); - texture_free(&checkbox_checked); - texture_free(&back); - texture_free(&arrow_left); - texture_free(&arrow_right); - + delete checkbox; + delete checkbox_checked; + delete back; + delete arrow_left; + delete arrow_right; + + /* Free mouse-cursor */ + delete mouse_cursor; + /* Free menus */ - - menu_free(&main_menu); - menu_free(&game_menu); - menu_free(&options_menu); - menu_free(&highscore_menu); - menu_free(&save_game_menu); - menu_free(&load_game_menu); - + delete main_menu; + delete game_menu; + delete options_menu; + delete highscore_menu; + delete save_game_menu; + delete load_game_menu; } void st_video_setup(void) { - if(screen != NULL) SDL_FreeSurface(screen); @@ -554,25 +646,22 @@ void st_video_setup(void) } /* Open display: */ - if(use_gl) st_video_setup_gl(); else st_video_setup_sdl(); - texture_setup(); + Surface::reload_all(); /* Set window manager stuff: */ - - SDL_WM_SetCaption("Super Tux", "Super Tux"); - + SDL_WM_SetCaption("SuperTux " VERSION, "SuperTux"); } void st_video_setup_sdl(void) { SDL_FreeSurface(screen); - if (use_fullscreen == YES) + if (use_fullscreen) { screen = SDL_SetVideoMode(640, 480, 0, SDL_FULLSCREEN ) ; /* | SDL_HWSURFACE); */ if (screen == NULL) @@ -582,7 +671,7 @@ void st_video_setup_sdl(void) "640x480 mode.\n" "The Simple DirectMedia error that occured was:\n" "%s\n\n", SDL_GetError()); - use_fullscreen = NO; + use_fullscreen = false; } } else @@ -610,7 +699,7 @@ void st_video_setup_gl(void) SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - if (use_fullscreen == YES) + if (use_fullscreen) { screen = SDL_SetVideoMode(640, 480, 0, SDL_FULLSCREEN | SDL_OPENGL) ; /* | SDL_HWSURFACE); */ if (screen == NULL) @@ -620,7 +709,7 @@ void st_video_setup_gl(void) "640x480 mode.\n" "The Simple DirectMedia error that occured was:\n" "%s\n\n", SDL_GetError()); - use_fullscreen = NO; + use_fullscreen = false; } } else @@ -661,8 +750,7 @@ void st_joystick_setup(void) /* Init Joystick: */ -#ifdef JOY_YES - use_joystick = YES; + use_joystick = true; if (SDL_Init(SDL_INIT_JOYSTICK) < 0) { @@ -670,40 +758,37 @@ void st_joystick_setup(void) "The Simple DirectMedia error that occured was:\n" "%s\n\n", SDL_GetError()); - use_joystick = NO; + use_joystick = false; } else { /* Open joystick: */ - if (SDL_NumJoysticks() <= 0) { fprintf(stderr, "Warning: No joysticks are available.\n"); - use_joystick = NO; + use_joystick = false; } else { - js = SDL_JoystickOpen(0); + js = SDL_JoystickOpen(joystick_num); if (js == NULL) { - fprintf(stderr, "Warning: Could not open joystick 1.\n" + fprintf(stderr, "Warning: Could not open joystick %d.\n" "The Simple DirectMedia error that occured was:\n" - "%s\n\n", SDL_GetError()); + "%s\n\n", joystick_num, SDL_GetError()); - use_joystick = NO; + use_joystick = false; } else { - /* Check for proper joystick configuration: */ - if (SDL_JoystickNumAxes(js) < 2) { fprintf(stderr, "Warning: Joystick does not have enough axes!\n"); - use_joystick = NO; + use_joystick = false; } else { @@ -713,14 +798,12 @@ void st_joystick_setup(void) "Warning: " "Joystick does not have enough buttons!\n"); - use_joystick = NO; + use_joystick = false; } } } } } -#endif - } void st_audio_setup(void) @@ -728,14 +811,14 @@ void st_audio_setup(void) /* Init SDL Audio silently even if --disable-sound : */ - if (audio_device == YES) + if (audio_device) { if (SDL_Init(SDL_INIT_AUDIO) < 0) { /* only print out message if sound or music was not disabled at command-line */ - if (use_sound == YES || use_music == YES) + if (use_sound || use_music) { fprintf(stderr, "\nWarning: I could not initialize audio!\n" @@ -746,23 +829,23 @@ void st_audio_setup(void) because in this case, use_sound & use_music' values are ignored when there's no available audio device */ - use_sound = NO; - use_music = NO; - audio_device = NO; + use_sound = false; + use_music = false; + audio_device = false; } } /* Open sound silently regarless the value of "use_sound": */ - if (audio_device == YES) + if (audio_device) { if (open_audio(44100, AUDIO_S16, 2, 2048) < 0) { /* only print out message if sound or music was not disabled at command-line */ - if ((use_sound == YES) || (use_music == YES)) + if (use_sound || use_music) { fprintf(stderr, "\nWarning: I could not set up audio for 44100 Hz " @@ -770,9 +853,9 @@ void st_audio_setup(void) "The Simple DirectMedia error that occured was:\n" "%s\n\n", SDL_GetError()); } - use_sound = NO; - use_music = NO; - audio_device = NO; + use_sound = false; + use_music = false; + audio_device = false; } } @@ -785,56 +868,55 @@ void st_shutdown(void) { close_audio(); SDL_Quit(); + saveconfig(); } - /* --- ABORT! --- */ void st_abort(const std::string& reason, const std::string& details) { fprintf(stderr, "\nError: %s\n%s\n\n", reason.c_str(), details.c_str()); st_shutdown(); - exit(1); + abort(); } - /* Set Icon (private) */ void seticon(void) { - int masklen; - Uint8 * mask; +// int masklen; +// Uint8 * mask; SDL_Surface * icon; /* Load icon into a surface: */ - icon = IMG_Load((datadir + "/images/icon.png").c_str()); + icon = IMG_Load((datadir + "/images/icon.xpm").c_str()); if (icon == NULL) { fprintf(stderr, "\nError: I could not load the icon image: %s%s\n" "The Simple DirectMedia error that occured was:\n" - "%s\n\n", datadir.c_str(), "/images/icon.png", SDL_GetError()); + "%s\n\n", datadir.c_str(), "/images/icon.xpm", SDL_GetError()); exit(1); } /* Create mask: */ - +/* masklen = (((icon -> w) + 7) / 8) * (icon -> h); mask = (Uint8*) malloc(masklen * sizeof(Uint8)); memset(mask, 0xFF, masklen); - +*/ /* Set icon: */ - SDL_WM_SetIcon(icon, mask); + SDL_WM_SetIcon(icon, NULL);//mask); /* Free icon surface & mask: */ - free(mask); +// free(mask); SDL_FreeSurface(icon); } @@ -845,25 +927,7 @@ void parseargs(int argc, char * argv[]) { int i; - /* Set defaults: */ - - - debug_mode = NO; - use_fullscreen = NO; - show_fps = NO; - use_gl = NO; - -#ifndef NOSOUND - - use_sound = YES; - use_music = YES; - audio_device = YES; -#else - - use_sound = NO; - use_music = NO; - audio_device = NO; -#endif + loadconfig(); /* Parse arguments: */ @@ -874,7 +938,35 @@ void parseargs(int argc, char * argv[]) { /* Use full screen: */ - use_fullscreen = YES; + use_fullscreen = true; + } + else if (strcmp(argv[i], "--joystick") == 0 || strcmp(argv[i], "-j") == 0) + { + assert(i+1 < argc); + joystick_num = atoi(argv[++i]); + } + else if (strcmp(argv[i], "--joymap") == 0) + { + assert(i+1 < argc); + if (sscanf(argv[++i], + "%d:%d:%d:%d:%d", + &joystick_keymap.x_axis, + &joystick_keymap.y_axis, + &joystick_keymap.a_button, + &joystick_keymap.b_button, + &joystick_keymap.start_button) != 5) + { + puts("Warning: Invalid or incomplete joymap, should be: 'XAXIS:YAXIS:A:B:START'"); + } + else + { + std::cout << "Using new joymap:\n" + << " X-Axis: " << joystick_keymap.x_axis << "\n" + << " Y-Axis: " << joystick_keymap.y_axis << "\n" + << " A-Button: " << joystick_keymap.a_button << "\n" + << " B-Button: " << joystick_keymap.b_button << "\n" + << " Start-Button: " << joystick_keymap.start_button << std::endl; + } } else if (strcmp(argv[i], "--worldmap") == 0) { @@ -884,13 +976,13 @@ void parseargs(int argc, char * argv[]) || strcmp(argv[i], "-d") == 0 ) { assert(i+1 < argc); - datadir = argv[i+1]; + datadir = argv[++i]; } else if (strcmp(argv[i], "--show-fps") == 0) { /* Use full screen: */ - show_fps = YES; + show_fps = true; } else if (strcmp(argv[i], "--opengl") == 0 || strcmp(argv[i], "-gl") == 0) @@ -898,10 +990,13 @@ void parseargs(int argc, char * argv[]) #ifndef NOOPENGL /* Use OpengGL: */ - use_gl = YES; + use_gl = true; #endif - } + else if (strcmp(argv[i], "--sdl") == 0) + { + use_gl = false; + } else if (strcmp(argv[i], "--usage") == 0) { /* Show usage: */ @@ -911,63 +1006,55 @@ void parseargs(int argc, char * argv[]) else if (strcmp(argv[i], "--version") == 0) { /* Show version: */ - - printf("Super Tux - version " VERSION "\n"); + printf("SuperTux " VERSION "\n"); exit(0); } else if (strcmp(argv[i], "--disable-sound") == 0) { /* Disable the compiled in sound feature */ -#ifndef NOSOUND printf("Sounds disabled \n"); - use_sound = NO; -#else - - printf("Warning: Sound capability has not been compiled into this build.\n"); -#endif - + use_sound = false; + audio_device = false; } else if (strcmp(argv[i], "--disable-music") == 0) { /* Disable the compiled in sound feature */ -#ifndef NOSOUND printf("Music disabled \n"); - use_music = NO; -#else - - printf("Warning: Music feature is not compiled in \n"); -#endif - + use_music = false; } else if (strcmp(argv[i], "--debug-mode") == 0) { /* Enable the debug-mode */ - debug_mode = YES; + debug_mode = true; } else if (strcmp(argv[i], "--help") == 0) - { /* Show help: */ + { /* Show help: */ puts("Super Tux " VERSION "\n" " Please see the file \"README.txt\" for more details.\n"); printf("Usage: %s [OPTIONS] FILENAME\n\n", argv[0]); puts("Display Options:\n" - " --fullscreen Run in fullscreen mode.\n" - " --opengl If opengl support was compiled in, this will enable\n" - " the EXPERIMENTAL OpenGL mode.\n" + " --fullscreen Run in fullscreen mode.\n" + " --opengl If opengl support was compiled in, this will enable\n" + " the EXPERIMENTAL OpenGL mode.\n" + " --sdl Use non-opengl renderer\n" "\n" "Sound Options:\n" - " --disable-sound If sound support was compiled in, this will\n" - " disable sound for this session of the game.\n" - " --disable-music Like above, but this will disable music.\n" + " --disable-sound If sound support was compiled in, this will\n" + " disable sound for this session of the game.\n" + " --disable-music Like above, but this will disable music.\n" "\n" "Misc Options:\n" - " --worldmap Start in worldmap-mode (EXPERIMENTAL)\n" - " -d, --datadir DIR Load Game data from DIR (default: automatic)\n" - " --debug-mode Enables the debug-mode, which is useful for developers.\n" - " --help Display a help message summarizing command-line\n" - " options, license and game controls.\n" - " --usage Display a brief message summarizing command-line options.\n" - " --version Display the version of SuperTux you're running.\n\n" + " -j, --joystick NUM Use joystick NUM (default: 0)\n" + " --joymap XAXIS:YAXIS:A:B:START\n" + " Define how joystick buttons and axis should be mapped\n" + " --worldmap Start in worldmap-mode (EXPERIMENTAL)\n" + " -d, --datadir DIR Load Game data from DIR (default: automatic)\n" + " --debug-mode Enables the debug-mode, which is useful for developers.\n" + " --help Display a help message summarizing command-line\n" + " options, license and game controls.\n" + " --usage Display a brief message summarizing command-line options.\n" + " --version Display the version of SuperTux you're running.\n\n" ); exit(0); }