Moreover you can see tux's lives now! ;) And the highscore file is now found in $HOME/.supertux/
SVN-Revision: 44
* cape_right[2], * cape_left[2],
* bigcape_right[2], * bigcape_left[2],
* ducktux_right, * ducktux_left,
-* skidtux_right, * skidtux_left;
+* skidtux_right, * skidtux_left, * tux_life;
SDL_Event event;
SDL_Rect src, dest;
SDLKey key;
void loadshared(void);
void unloadshared(void);
void drawshape(int x, int y, unsigned char c);
+void savegame(void);
unsigned char shape(int x, int y, int sx);
int issolid(int x, int y, int sx);
int isbrick(int x, int y, int sx);
key = event.key.keysym.sym;
- /* Check for menu-events, if the menu is shown */
+ /* Check for menu-events, if the menu is shown */
if(show_menu)
menu_event(key);
-
+
if (key == SDLK_ESCAPE)
{
/* Escape: Open/Close the menu: */
if (score > highscore)
save_hs(score);
- unloadlevelgfx();
+ unloadlevelgfx();
unloadlevelsong();
- unloadshared();
+ unloadshared();
return(0);
} /* if (lives < 0) */
}
drawtext("DISTROS", 480, 0, letters_blue, NO_UPDATE);
drawtext(str, 608, 0, letters_gold, NO_UPDATE);
+ drawtext("LIVES", 480, 20, letters_blue, NO_UPDATE);
+
+ for(i=0; i < lives; ++i)
+ {
+ drawimage(tux_life,565+(18*i),20,NO_UPDATE);
+ }
+ /*drawtext(str, 608, 0, letters_gold, NO_UPDATE);*/
+
if(game_pause)
drawcenteredtext("PAUSE",230,letters_red, NO_UPDATE);
img_distro[3] = load_image(DATA_PREFIX "/images/shared/distro-3.png",
USE_ALPHA);
+ /* Tux life: */
+
+ tux_life = load_image(DATA_PREFIX "/images/shared/tux-life.png",
+ USE_ALPHA);
/* Herring: */
sleep(2);
}
-
+void savegame(void)
+{}
int game_started;
+/* SuperTux directory ($HOME/.supertux) and save directory($HOME/.supertux/save) */
+char *st_dir, *st_save_dir;
+
#ifdef JOY_YES
SDL_Joystick * js;
#endif
/*
-
+
by Adam Czachorowski
gislan@o2.pl
-
+
*/
/* Open the highscore file: */
-# include <string.h>
-# include <stdlib.h>
+#include <string.h>
+#include <stdlib.h>
-# include "high_scores.h"
+#include "globals.h"
+#include "high_scores.h"
FILE * opendata(char * mode)
{
- char * filename, * home;
+ char * filename;
FILE * fi;
#ifdef LINUX
- /* Get home directory (from $HOME variable)... if we can't determine it,
- use the current directory ("."): */
-
- if (getenv("HOME") != NULL)
- home = getenv("HOME");
- else
- home = ".";
-
/* Create the buffer for the filename: */
- filename = (char *) malloc(sizeof(char) * (strlen(home) +
- strlen("/.supertux") + 1));
+ filename = (char *) malloc(sizeof(char) * (strlen(st_dir) +
+ strlen("/highscore") + 1));
- strcpy(filename, home);
+ strcpy(filename, st_dir);
/* Open the high score file: */
- strcat(filename, "/.supertux");
+ strcat(filename, "/highscore");
#else
- filename = "supertux.dat";
-#endif
+ filename = "st_highscore.dat";
+#endif
- /* Try opening the file: */
- fi = fopen(filename, mode);
+ /* Try opening the file: */
- if (fi == NULL)
- {
- fprintf(stderr, "Warning: I could not open the high score file ");
+ fi = fopen(filename, mode);
- if (strcmp(mode, "r") == 0)
- fprintf(stderr, "for read!!!\n");
- else if (strcmp(mode, "w") == 0)
- fprintf(stderr, "for write!!!\n");
+ if (fi == NULL)
+ {
+ fprintf(stderr, "Warning: I could not open the high score file ");
- }
+ if (strcmp(mode, "r") == 0)
+ fprintf(stderr, "for read!!!\n");
+ else if (strcmp(mode, "w") == 0)
+ fprintf(stderr, "for write!!!\n");
- return(fi);
}
+ return(fi);
+}
+
/* Load data from high score file: */
int load_hs(void)
if (score == 0)
score = 100;
- }
+ }
}
}
while (!feof(fi));
fi = opendata("w");
if (fi != NULL)
{
- fprintf(fi, "# Supertux data file\n\n");
+ fprintf(fi, "# Supertux highscore file\n\n");
fprintf(fi, "highscore=%d\n", score);
drawcenteredtext("Fullscreen OFF", 192, letters_blue, NO_UPDATE);
}
-
- if(menuitem == 1)
+ if (audio_device == YES)
{
- if(use_sound)
- drawcenteredtext("Sound ON", 224, letters_red, NO_UPDATE);
- else
- drawcenteredtext("Sound OFF", 224, letters_red, NO_UPDATE);
- if(menuaction == MN_HIT) /* Disable/Enable sound */
+ if(menuitem == 1)
{
if(use_sound)
- {
- if(playing_music())
- halt_music();
- use_sound = 0;
- }
+ drawcenteredtext("Sound ON", 224, letters_red, NO_UPDATE);
else
+ drawcenteredtext("Sound OFF", 224, letters_red, NO_UPDATE);
+ if(menuaction == MN_HIT) /* Disable/Enable sound */
{
- use_sound = 1;
- if (playing_music())
+ if(use_sound)
+ {
+ if(playing_music())
+ halt_music();
+ use_sound = 0;
+ }
+ else
{
- switch (current_music)
+ use_sound = 1;
+ if (playing_music())
{
- case LEVEL_MUSIC:
- play_music(level_song, 1);
- break;
- case HERRING_MUSIC:
- play_music(herring_song, 1);
- break;
- case HURRYUP_MUSIC: // keep the compiler happy
- case NO_MUSIC: // keep the compiler happy for the moment :-)
- {}
- /*default:*/
+ switch (current_music)
+ {
+ case LEVEL_MUSIC:
+ play_music(level_song, 1);
+ break;
+ case HERRING_MUSIC:
+ play_music(herring_song, 1);
+ break;
+ case HURRYUP_MUSIC: // keep the compiler happy
+ case NO_MUSIC: // keep the compiler happy for the moment :-)
+ {}
+
+ /*default:*/
+ }
}
}
+ menu_change = YES;
}
- menu_change = YES;
+ }
+ else
+ {
+ if(use_sound)
+ drawcenteredtext("Sound ON", 224, letters_blue, NO_UPDATE);
+ else
+ drawcenteredtext("Sound OFF", 224, letters_blue, NO_UPDATE);
}
}
- else
+ else /* if audio_device != YES */
{
- if(use_sound)
- drawcenteredtext("Sound ON", 224, letters_blue, NO_UPDATE);
+ /* let the user move over the deactivated option */
+ if (menuitem == 1)
+ drawcenteredtext("Sound OFF", 224, letters_red, NO_UPDATE);
else
- drawcenteredtext("Sound OFF", 224, letters_blue, NO_UPDATE);
+ drawcenteredtext("Sound OFF", 224, letters_black, NO_UPDATE);
}
if(menuitem == 2)
menuaction = MN_HIT;
menu_change = YES;
}
-
+
/* FIXME: NO JOYSTICK SUPPORT */
/*#ifdef JOY_YES
else if (event.type == SDL_JOYBUTTONDOWN)
#ifdef LINUX
#include <pwd.h>
#include <sys/types.h>
+#include <sys/stat.h>
#include <ctype.h>
#endif
#include "screen.h"
#include "sound.h"
-
/* Local function prototypes: */
void seticon(void);
void st_setup(void)
{
+
+ /* Set SuperTux configuration and save directories
+
+ /* Get home directory (from $HOME variable)... if we can't determine it,
+ use the current directory ("."): */
+ char *home;
+ if (getenv("HOME") != NULL)
+ home = getenv("HOME");
+ else
+ home = ".";
+
+ st_dir = (char *) malloc(sizeof(char) * (strlen(home) +
+ strlen("/.supertux") + 1));
+ strcpy(st_dir, home);
+ strcat(st_dir, "/.supertux");
+
+ st_save_dir = (char *) malloc(sizeof(char) * (strlen(st_dir) + strlen("/save") + 1));
+
+ strcpy(st_save_dir,st_dir);
+ strcpy(st_save_dir,"/save");
+
+ /* Create them. In the case they exist it won't destroy anything. */
+ mkdir(st_dir, 0755);
+ mkdir(st_save_dir, 0755);
+
/* Seed random number generator: */
-
+
srand(SDL_GetTicks());
-
-
+
+
/* Init SDL Video: */
-
+
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
fprintf(stderr,
/* Init Joystick: */
-
+
#ifdef JOY_YES
use_joystick = YES;
-
+
if (SDL_Init(SDL_INIT_JOYSTICK) < 0)
{
fprintf(stderr, "Warning: I could not initialize joystick!\n"
"The Simple DirectMedia error that occured was:\n"
"%s\n\n", SDL_GetError());
-
+
use_joystick = NO;
}
else
{
/* Open joystick: */
-
+
if (SDL_NumJoysticks() <= 0)
{
fprintf(stderr, "Warning: No joysticks are available.\n");
-
+
use_joystick = NO;
}
else
{
js = SDL_JoystickOpen(0);
-
+
if (js == NULL)
{
fprintf(stderr, "Warning: Could not open joystick 1.\n"
"The Simple DirectMedia error that occured was:\n"
"%s\n\n", SDL_GetError());
-
+
use_joystick = NO;
}
else
{
/* Check for proper joystick configuration: */
-
+
if (SDL_JoystickNumAxes(js) < 2)
{
fprintf(stderr,
"Warning: Joystick does not have enough axes!\n");
-
+
use_joystick = NO;
}
else
fprintf(stderr,
"Warning: "
"Joystick does not have enough buttons!\n");
-
+
use_joystick = NO;
}
}
}
}
#endif
-
-
- /* Init SDL Audio: */
-
- if (use_sound == YES)
+
+
+
+
+ /* Init SDL Audio silently even if --disable-sound : */
+
+ if (audio_device == YES)
{
if (SDL_Init(SDL_INIT_AUDIO) < 0)
{
- fprintf(stderr,
- "\nWarning: I could not initialize audio!\n"
- "The Simple DirectMedia error that occured was:\n"
- "%s\n\n", SDL_GetError());
- use_sound = NO;
+ /* only print out message if sound was not disabled at command-line */
+ if (use_sound == YES)
+ {
+ fprintf(stderr,
+ "\nWarning: I could not initialize audio!\n"
+ "The Simple DirectMedia error that occured was:\n"
+ "%s\n\n", SDL_GetError());
+ use_sound = NO;
+ }
+ audio_device = NO;
}
}
-
-
- /* Open sound: */
-
- if (use_sound == YES)
+
+
+ /* Open sound silently regarless the value of "use_sound": */
+
+ if (audio_device == YES)
{
if (open_audio(44100, AUDIO_S16, 2, 512) < 0)
{
- fprintf(stderr,
- "\nWarning: I could not set up audio for 44100 Hz "
- "16-bit stereo.\n"
- "The Simple DirectMedia error that occured was:\n"
- "%s\n\n", SDL_GetError());
- use_sound = NO;
+ /* only print out message if sound was not disabled at command-line */
+ if (use_sound == YES)
+ {
+ fprintf(stderr,
+ "\nWarning: I could not set up audio for 44100 Hz "
+ "16-bit stereo.\n"
+ "The Simple DirectMedia error that occured was:\n"
+ "%s\n\n", SDL_GetError());
+ use_sound = NO;
+ }
+ audio_device = NO;
}
}
/* Open display: */
-
+
if (use_fullscreen == YES)
{
screen = SDL_SetVideoMode(640, 480, 16, SDL_FULLSCREEN) ; /* | SDL_HWSURFACE); */
use_fullscreen = NO;
}
}
-
+
if (use_fullscreen == NO)
{
screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);
-
+
if (screen == NULL)
{
fprintf(stderr,
exit(1);
}
}
-
-
+
+
/* Load global images: */
-
+
letters_black = load_image(DATA_PREFIX "/images/status/letters-black.png",
- USE_ALPHA);
+ USE_ALPHA);
letters_gold = load_image(DATA_PREFIX "/images/status/letters-gold.png",
- USE_ALPHA);
+ USE_ALPHA);
letters_blue = load_image(DATA_PREFIX "/images/status/letters-blue.png",
- USE_ALPHA);
+ USE_ALPHA);
letters_red = load_image(DATA_PREFIX "/images/status/letters-red.png",
- USE_ALPHA);
-
-
+ USE_ALPHA);
+
+
/* Set icon image: */
-
+
seticon();
-
-
+
+
/* Set window manager stuff: */
-
+
SDL_WM_SetCaption("Super Tux", "Super Tux");
}
int masklen;
Uint8 * mask;
SDL_Surface * icon;
-
-
+
+
/* Load icon into a surface: */
-
+
icon = IMG_Load(DATA_PREFIX "/images/icon.png");
if (icon == NULL)
{
"%s\n\n", DATA_PREFIX "images/icon.png", SDL_GetError());
exit(1);
}
-
-
+
+
/* Create mask: */
-
+
masklen = (((icon -> w) + 7) / 8) * (icon -> h);
mask = malloc(masklen * sizeof(Uint8));
memset(mask, 0xFF, masklen);
-
-
+
+
/* Set icon: */
-
+
SDL_WM_SetIcon(icon, mask);
-
-
+
+
/* Free icon surface & mask: */
-
+
free(mask);
SDL_FreeSurface(icon);
}
void parseargs(int argc, char * argv[])
{
int i;
-
-
+
+
/* Set defaults: */
-
+
use_fullscreen = NO;
- #ifndef NOSOUND
+#ifndef NOSOUND
+
use_sound = YES;
- #else
+ audio_device = YES;
+#else
+
use_sound = NO;
- #endif
-
+ audio_device = NO;
+#endif
+
/* Parse arguments: */
-
+
for (i = 1; i < argc; i++)
{
if (strcmp(argv[i], "--fullscreen") == 0 ||
- strcmp(argv[i], "-f") == 0)
- {
- /* Use full screen: */
-
- use_fullscreen = YES;
- }
+ strcmp(argv[i], "-f") == 0)
+ {
+ /* Use full screen: */
+
+ use_fullscreen = YES;
+ }
else if (strcmp(argv[i], "--usage") == 0)
- {
- /* Show usage: */
-
- usage(argv[0], 0);
- }
+ {
+ /* Show usage: */
+
+ usage(argv[0], 0);
+ }
else if (strcmp(argv[i], "--version") == 0)
- {
- /* Show version: */
-
- printf("Super Tux - version " VERSION "\n");
- exit(0);
- }
- else if (strcmp(argv[i], "--disable-sound") == 0)
- {
- /* Disable the compiled in sound & music feature */
- #ifndef NOSOUND
- printf("Sounds and music disabled \n");
- use_sound = NO;
- #else
- printf("Sounds and music feature is not compiled in \n");
- #endif
- }
+ {
+ /* Show version: */
+
+ printf("Super Tux - version " VERSION "\n");
+ exit(0);
+ }
+ else if (strcmp(argv[i], "--disable-sound") == 0)
+ {
+ /* Disable the compiled in sound & music feature */
+#ifndef NOSOUND
+ printf("Sounds and music disabled \n");
+ use_sound = NO;
+#else
+
+ printf("Sounds and music feature is not compiled in \n");
+#endif
+
+ }
else if (strcmp(argv[i], "--help") == 0)
- { /* Show help: */
-
- printf("Super Tux " VERSION "\n\n");
-
- printf("---------- Command-line options ----------\n\n");
-
- printf(" --disable-sound - If sound support was compiled in, this will\n disable it for this session of the game.\n\n");
-
- printf(" --fullscreen - Run in fullscreen mode.\n\n");
-
- printf(" --help - Display a help message summarizing command-line\n options, license and game controls.\n\n");
-
- printf(" --usage - Display a brief message summarizing command-line options.\n\n");
-
- printf(" --version - Display the version of SuperTux you're running.\n\n\n");
-
-
- printf("---------- License ----------\n\n");
- printf(" This program comes with ABSOLUTELY NO WARRANTY.\n");
- printf(" This is free software, and you are welcome to redistribute\n");
- printf(" or modify it under certain conditions. See the file \n");
- printf(" \"COPYING.txt\" for more details.\n\n\n");
-
- printf("---------- Game controls ----------\n\n");
- printf(" Please see the file \"README.txt\"\n\n");
-
- exit(0);
- }
+ { /* Show help: */
+
+ printf("Super Tux " VERSION "\n\n");
+
+ printf("---------- Command-line options ----------\n\n");
+
+ printf(" --disable-sound - If sound support was compiled in, this will\n disable it for this session of the game.\n\n");
+
+ printf(" --fullscreen - Run in fullscreen mode.\n\n");
+
+ printf(" --help - Display a help message summarizing command-line\n options, license and game controls.\n\n");
+
+ printf(" --usage - Display a brief message summarizing command-line options.\n\n");
+
+ printf(" --version - Display the version of SuperTux you're running.\n\n\n");
+
+
+ printf("---------- License ----------\n\n");
+ printf(" This program comes with ABSOLUTELY NO WARRANTY.\n");
+ printf(" This is free software, and you are welcome to redistribute\n");
+ printf(" or modify it under certain conditions. See the file \n");
+ printf(" \"COPYING.txt\" for more details.\n\n\n");
+
+ printf("---------- Game controls ----------\n\n");
+ printf(" Please see the file \"README.txt\"\n\n");
+
+ exit(0);
+ }
else
- {
- /* Unknown - complain! */
-
- usage(argv[0], 1);
- }
+ {
+ /* Unknown - complain! */
+
+ usage(argv[0], 1);
+ }
}
}
void usage(char * prog, int ret)
{
FILE * fi;
-
-
+
+
/* Determine which stream to write to: */
-
+
if (ret == 0)
fi = stdout;
else
fi = stderr;
-
-
+
+
/* Display the usage message: */
-
+
fprintf(fi, "Usage: %s [--fullscreen] | [--disable-sound] | [--usage | --help | --version]\n",
- prog);
-
-
+ prog);
+
+
/* Quit! */
exit(ret);
int open_audio (int frequency, Uint16 format, int channels, int chunksize)
{
- if (use_sound) {
- return Mix_OpenAudio( frequency, format, channels, chunksize );
- }
- else {
- // let the user think that the audio device was correctly opened
- // and keep the compiler happy :-D
- return 0;
- }
+ return Mix_OpenAudio( frequency, format, channels, chunksize );
}
snd = Mix_LoadWAV(file);
- if (snd == NULL)
+ /* printf message and abort if there is an initialized audio device */
+ if ((snd == NULL) && (audio_device == YES))
st_abort("Can't load", file);
-
+
return(snd);
}
sng = Mix_LoadMUS(file);
- if (sng == NULL)
+ /* printf message and abort if there is an initialized audio device */
+ if ((sng == NULL) && (audio_device == YES))
st_abort("Can't load", file);
-
return (sng);
}
/* --- PLAY A SOUND --- */
- void play_sound(Mix_Chunk * snd)
- {
- /* this won't call the function if the user has disabled sound */
- if (use_sound) {
- Mix_PlayChannel(-1, snd, 0);
- }
+void play_sound(Mix_Chunk * snd)
+{
+ /* this won't call the function if the user has disabled sound
+ * either via menu or via command-line option
+ */
+ if ((use_sound == YES) && (audio_device == YES))
+ {
+ Mix_PlayChannel(-1, snd, 0);
+ }
}
void free_chunk(Mix_Chunk *chunk)
{
- if (chunk != NULL) {
- DEBUG_MSG( __PRETTY_FUNCTION__ );
- Mix_FreeChunk( chunk );
- chunk = NULL;
- }
+ if (chunk != NULL)
+ {
+ DEBUG_MSG( __PRETTY_FUNCTION__ );
+ Mix_FreeChunk( chunk );
+ chunk = NULL;
+ }
}
int playing_music(void)
{
- if (use_sound) {
- return Mix_PlayingMusic();
- }
- else {
- /* we are in --disable-sound we can't be playing music */
- return 0;
- }
+ if (use_sound)
+ {
+ return Mix_PlayingMusic();
+ }
+ else
+ {
+ /* we are in --disable-sound we can't be playing music */
+ return 0;
+ }
}
int halt_music(void)
{
- if (use_sound) {
- return Mix_HaltMusic();
- }
- else {
- return 0;
- }
+ if ((use_sound == YES) && (audio_device == YES))
+ {
+ return Mix_HaltMusic();
+ }
+ else
+ {
+ return 0;
+ }
}
int play_music(Mix_Music *music, int loops)
{
- if (use_sound) {
- DEBUG_MSG(__PRETTY_FUNCTION__);
- return Mix_PlayMusic(music, loops);
- }
- else {
- /* return error since you're trying to play music in --disable-sound mode */
- return -1;
- }
+ if ((use_sound == YES) && (audio_device == YES))
+ {
+ DEBUG_MSG(__PRETTY_FUNCTION__);
+ return Mix_PlayMusic(music, loops);
+ }
+ else
+ {
+ /* return error since you're trying to play music in --disable-sound mode */
+ return -1;
+ }
}
void free_music(Mix_Music *music)
{
- if ( music != NULL ) {
- DEBUG_MSG(__PRETTY_FUNCTION__);
- Mix_FreeMusic( music );
- music = NULL;
- }
+ if ( music != NULL )
+ {
+ DEBUG_MSG(__PRETTY_FUNCTION__);
+ Mix_FreeMusic( music );
+ music = NULL;
+ }
}
#else
return -1;
}
-void* load_sound(void* file) { return NULL; }
-void play_sound(void * snd) {}
-void* load_song(void* file) { return NULL; }
+void* load_sound(void* file)
+{
+ return NULL;
+}
+void play_sound(void * snd)
+{}
+void* load_song(void* file)
+{
+ return NULL;
+}
-int playing_music() { return 0; }
-void halt_music() {}
-int play_music(void *music, int loops) { return 0;}
-void free_music(void *music) {}
-void free_chunk(void *chunk) {}
+int playing_music()
+{
+ return 0;
+}
+void halt_music()
+{}
+int play_music(void *music, int loops)
+{
+ return 0;
+}
+void free_music(void *music)
+{}
+void free_chunk(void *chunk)
+{}
#endif
by Bill Kendrick
bill@newbreedsoftware.com
http://www.newbreedsoftware.com/supertux/
-
+
April 22, 2000 - July 15, 2002
*/
#ifndef SUPERTUX_SOUND_H
#define SUPERTUX_SOUND_H
- /*all the sounds we have*/
+#include "defines.h" /* get YES/NO defines */
+
+/*all the sounds we have*/
#define NUM_SOUNDS 16
/*global variable*/
int use_sound;
+int audio_device; /* != 0: available and initialized */
/* enum of different internal music types */
enum Music_Type {
- NO_MUSIC,
- LEVEL_MUSIC,
- HURRYUP_MUSIC,
- HERRING_MUSIC
+ NO_MUSIC,
+ LEVEL_MUSIC,
+ HURRYUP_MUSIC,
+ HERRING_MUSIC
} current_music;
int playing_music();
void halt_music();
int play_music(void *music, int loops);
-void free_music(void *music);;
+void free_music(void *music);
+;
void free_chunk(void *chunk);
#endif