From a2af96e68b210b7c3db90b7ec474498c5611a3a7 Mon Sep 17 00:00:00 2001 From: Joshua Grams Date: Sun, 19 Dec 2004 05:50:42 +0000 Subject: [PATCH] Some code cleanup. Factored most of the file-handling code out into a separate file. --- Makefile | 20 ++++--- SFont.c | 24 ++++----- SFont.h | 1 + config.h | 19 +++++++ file.c | 117 ++++++++++++++++++++++++++++++++++++++++ file.h | 37 +++++++++++++ main.c | 183 +++++++++++++++++--------------------------------------------- sound.c | 6 +-- sound.h | 32 +++++++++++ 9 files changed, 282 insertions(+), 157 deletions(-) create mode 100644 file.c create mode 100644 file.h create mode 100644 sound.h diff --git a/Makefile b/Makefile index 3b0a01c..6ffba09 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,11 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ldflags := $(shell sdl-config --libs) -lSDL_image -lSDL_mixer -cflags := -g $(shell sdl-config --cflags) +cflags := -g $(shell sdl-config --cflags) -Wall + +my_objects := sound.o file.o main.o +libs := SFont.o +objects := $(libs) $(my_objects) INSTALL = install INSTALL_PROGRAM = $(INSTALL) -o games -g games @@ -28,9 +32,13 @@ PROGRAM_PREFIX = /usr/games/bin all: vor %.o: %.c - $(CC) $(cflags) -c -o $@ $^ + $(CC) $(cflags) -c -o $@ $< + +$(my_objects): config.h + +main.o file.o: file.h -vor: SFont.o sound.o main.o +vor: $(objects) $(CC) $(ldflags) -o $@ $^ $(LIBRARIES) clean: @@ -54,8 +62,8 @@ install: all $(INSTALL_DATA) ./data/music/* $(DATA_PREFIX)/music/ $(INSTALL_DATA) ./data/sounds/* $(DATA_PREFIX)/sounds/ $(INSTALL_DATA) ./data/sprites/* $(DATA_PREFIX)/sprites/ - touch $(DATA_PREFIX)/.highscore - chmod a+rw $(DATA_PREFIX)/.highscore + touch $(DATA_PREFIX)/scores + chmod a+rw $(DATA_PREFIX)/scores uninstall: rm -f $(PROGRAM_PREFIX)/vor @@ -66,7 +74,7 @@ uninstall: rm -f $(DATA_PREFIX)/music/* rm -f $(DATA_PREFIX)/sounds/* rm -f $(DATA_PREFIX)/sprites/* - rm -f $(DATA_PREFIX)/.highscore + rm -f $(DATA_PREFIX)/scores $(DATA_PREFIX)/.highscore if [ -d $(DATA_PREFIX)/banners ]; then rmdir $(DATA_PREFIX)/banners; fi if [ -d $(DATA_PREFIX)/fonts ]; then rmdir $(DATA_PREFIX)/fonts; fi diff --git a/SFont.c b/SFont.c index e03be40..e5d7863 100644 --- a/SFont.c +++ b/SFont.c @@ -1,4 +1,5 @@ #include +#include #include "SFont.h" #include "string.h" @@ -83,12 +84,11 @@ int SFont_wide(char *text) { while (text[i]) { if (text[i]==' ') { xwide += (int)(Font->CharPos[2]-Font->CharPos[1]); - } - else { - ofs = (text[i]-33)*2+1; + } else { + ofs = (text[i]-33)*2+1; xwide += (int)(Font->CharPos[ofs+1]-Font->CharPos[ofs]); - } - i++; + } + i++; } return xwide; } @@ -156,14 +156,12 @@ int TextWidth2(SFont_FontInfo *Font, char *text) unsigned char ofs = 0; while (text[i]!='\0') { if (text[i]==' ') { - x+=Font->CharPos[2]-Font->CharPos[1]; - i++; - } - else { - ofs=(text[i]-33)*2+1; - x+=Font->CharPos[ofs+1]-Font->CharPos[ofs]; - i++; - } + x+=Font->CharPos[2]-Font->CharPos[1]; + } else { + ofs=(text[i]-33)*2+1; + x+=Font->CharPos[ofs+1]-Font->CharPos[ofs]; + } + i++; } return x+Font->CharPos[ofs+2]-Font->CharPos[ofs+1]; } diff --git a/SFont.h b/SFont.h index fcc75b7..46fdc1b 100644 --- a/SFont.h +++ b/SFont.h @@ -34,6 +34,7 @@ void PutString2(SDL_Surface *Surface, SFont_FontInfo *Font, int x, int y, char * // Returns the width of "text" in pixels int TextWidth(char *text); int TextWidth2(SFont_FontInfo *Font, char *text); +int SFont_wide(char *text); // Blits a string to with centered x position void XCenteredString (SDL_Surface *Surface, int y, char *text); diff --git a/config.h b/config.h index f214aa8..ba41151 100644 --- a/config.h +++ b/config.h @@ -1,3 +1,6 @@ +#ifndef VOR_CONFIG_H +#define VOR_CONFIG_H + #define VERSION "0.1" // screen size @@ -19,3 +22,19 @@ #define W 100 #define M 255 #define BLAST_RADIUS 200 // radius^2 (pixels) which will be cleared of rocks when you die + +#define MAX_PATH_LEN 1024 + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#endif // VOR_CONFIG_H diff --git a/file.c b/file.c new file mode 100644 index 0000000..b9bc7e2 --- /dev/null +++ b/file.c @@ -0,0 +1,117 @@ +/* Variations on RockDodger + * Copyright (C) 2004 Joshua Grams + * + * 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 "config.h" +#include "file.h" + +#include +#include +#include +#include +#include +#include + +char *g_data_dir; +char *g_score_file; +mode_t g_score_mode; + +char * +load_file(char *filename) +{ + static char r[MAX_PATH_LEN]; + snprintf(r, MAX_PATH_LEN, "%s/%s", g_data_dir, filename); + return r; +} + +int +is_dir(char *dirname) +{ + struct stat buf; + stat(dirname, &buf); + return S_ISDIR(buf.st_mode); +} + +int +is_file(char *filename) +{ + struct stat buf; + stat(filename, &buf); + return S_ISREG(buf.st_mode); +} + +int +find_data_dir(void) +{ + int i; + char *data_options[3] = { + "./data", + getenv("VOR_DATA"), + "/usr/share/vor" + }; + + for(i=0; i<3; i++) { + g_data_dir = strdup(data_options[i]); + if(is_dir(g_data_dir)) return true; + } + + fprintf(stderr, "Can't find VoR data! Tried:\n"); + for(i=0; i<3; i++) { + fprintf(stderr, "\t%s\n", data_options[i]); + } + return false; +} + +int +find_score_file(void) +{ + g_score_file = load_file("scores"); + g_score_mode = 0111; + if(is_file(g_score_file)) return true; + + g_score_file = malloc(MAX_PATH_LEN); + snprintf(g_score_file, MAX_PATH_LEN, + "%s/.vor-high", getenv("HOME")); + g_score_mode = 0177; + if(is_file(g_score_file)) return true; + + return false; +} + +int +find_files(void) +{ + int r; + r = find_data_dir(); + find_score_file(); + return r; +} + +FILE * +open_score_file(char *mode) +{ + mode_t old_mask; + FILE *f = NULL; + + if(!g_score_file) return f; + + old_mask = umask(g_score_mode); + f = fopen(g_score_file, mode); + + umask(old_mask); + return f; +} diff --git a/file.h b/file.h new file mode 100644 index 0000000..806772c --- /dev/null +++ b/file.h @@ -0,0 +1,37 @@ +/* Variations on RockDodger + * Copyright (C) 2004 Joshua Grams + * + * 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 + */ + +#ifndef VOR_FILE_H +#define VOR_FILE_H + +#include +#include + +extern char *g_data_dir; +extern char *g_score_file; +extern mode_t g_score_mode; + +char *load_file(char *filename); +int is_dir(char *dirname); +int is_file(char *filename); +int find_data_dir(void); +int find_score_file(void); +int find_files(void); +FILE *open_score_file(char *mode); + +#endif // VOR_FILE_H diff --git a/main.c b/main.c index 8e413bd..51d8e9f 100644 --- a/main.c +++ b/main.c @@ -26,16 +26,16 @@ void clearBuffer(); // includes {{{ #include "config.h" +#include "file.h" +#include "sound.h" + +#include #include #include +#include #include #include #include -#include -#include - -#include -#include #include #include "SFont.h" @@ -58,7 +58,6 @@ struct rock_struct { // to make room for a new ship appearing. SDL_Surface *image; int type_number; - float heat; }; struct black_point_struct { int x,y; @@ -190,32 +189,12 @@ float dist_sq(float x1, float y1, float x2, float y2) // ************************************* FUNCS -FILE *hs_fopen(char *mode) { - FILE *f; - mode_t mask; - mask = umask(0111); - if(f = fopen("/usr/share/vor/.highscore",mode)) { - umask(mask); - return f; - } - else { - char s[1024]; - umask(0177); - sprintf(s,"%s/.vor-high",getenv("HOME")); - if(f = fopen(s,mode)) { - umask(mask); - return f; - } - else { - umask(mask); - return 0; - } - } -} void read_high_score_table() { FILE *f; int i; - if(f = hs_fopen("r")) { + + f = open_score_file("r"); + if(f) { // If the file exists, read from it for(i = 0; i<8; i++) { char s[1024]; @@ -233,10 +212,13 @@ void read_high_score_table() { fclose(f); } } + void write_high_score_table() { FILE *f; int i; - if(f = hs_fopen("w")) { + + f = open_score_file("w"); + if(f) { // If the file exists, write to it for(i = 0; i<8; i++) { fprintf (f, "%d %s\n", high[i].score, high[i].name); @@ -281,14 +263,14 @@ void init_space_dots() { } } -int makebangdots(int xbang, int ybang, int xvel, int yvel, SDL_Surface *s, int power) { +void makebangdots(int xbang, int ybang, int xvel, int yvel, SDL_Surface *s, int power) { // TODO - stop generating dots after a certain amount of time has passed, to cope with slower CPUs. // TODO - generate and display dots in a circular buffer - int i,x,y,n,endcount; + int x,y,endcount; Uint16 *rawpixel,c; - double theta,r,dx,dy; + double theta,r; int begin_generate; begin_generate = SDL_GetTicks(); @@ -300,41 +282,38 @@ int makebangdots(int xbang, int ybang, int xvel, int yvel, SDL_Surface *s, int p endcount = 0; while (endcount<3) { + for(x = 0; xw; x++) { + for(y = 0; yh; y++) { + c = rawpixel[s->pitch/2*y + x]; + if(c && c != SDL_MapRGB(s->format,0,255,0)) { - for(x = 0; xw; x++) { - for(y = 0; yh; y++) { - c = rawpixel[s->pitch/2*y + x]; - if(c && c != SDL_MapRGB(s->format,0,255,0)) { - - theta = rnd()*M_PI*2; + theta = rnd()*M_PI*2; - r = 1-(rnd()*rnd()); + r = 1-(rnd()*rnd()); - bdot[bd2].dx = (power/50.0)*45.0*cos(theta)*r + xvel; - bdot[bd2].dy = (power/50.0)*45.0*sin(theta)*r + yvel; - bdot[bd2].x = x + xbang; - bdot[bd2].y = y + ybang; + bdot[bd2].dx = (power/50.0)*45.0*cos(theta)*r + xvel; + bdot[bd2].dy = (power/50.0)*45.0*sin(theta)*r + yvel; + bdot[bd2].x = x + xbang; + bdot[bd2].y = y + ybang; - // Replace the last few bang dots with the pixels from the exploding object - bdot[bd2].c = (endcount>0)?c:0; - bdot[bd2].life = 100; - bdot[bd2].decay = rnd()*3 + 1; - bdot[bd2].active = 1; + // Replace the last few bang dots with the pixels from the exploding object + bdot[bd2].c = (endcount>0)?c:0; + bdot[bd2].life = 100; + bdot[bd2].decay = rnd()*3 + 1; + bdot[bd2].active = 1; - bd2++; - bd2 %= MAXBANGDOTS; + bd2++; + bd2 %= MAXBANGDOTS; - // If the circular buffer is filled, who cares? They've had their chance. - //if(bd2 == bd1-1) goto exitloop; + // If the circular buffer is filled, who cares? They've had their chance. + //if(bd2 == bd1-1) goto exitloop; + } } } - } - - if(SDL_GetTicks() - begin_generate > 7) endcount++; + if(SDL_GetTicks() - begin_generate > 7) endcount++; } -exitloop: SDL_UnlockSurface(s); @@ -514,7 +493,7 @@ void create_engine_dots2(int newdots, int m) { } } -int drawdots(SDL_Surface *s) { +void drawdots(SDL_Surface *s) { int m, scorepos, n; SDL_LockSurface(s); @@ -554,19 +533,6 @@ int drawdots(SDL_Surface *s) { SDL_UnlockSurface(s); } -char * load_file(char *s) { - static char retval[1024]; - snprintf(retval, 1024, "%s/%s", data_dir, s); - return retval; -} - - -int missing(char *dirname) { - struct stat buf; - stat(dirname, &buf); - return (!S_ISDIR(buf.st_mode)); -} - int init(int fullscreen) { int i,j; @@ -574,30 +540,9 @@ int init(int fullscreen) { Uint16 *raw_pixels; Uint32 flag; - read_high_score_table(); - // Where are our data files? - // default: ./data - // second alternative: RD_DATADIR - // final alternative: /usr/share/vor - data_dir = strdup("./data"); - if(missing(data_dir)) { - char *env; - env = getenv("RD_DATADIR"); - if(env != NULL) { - data_dir = strdup(env); - if(missing(data_dir)) { - fprintf (stderr,"Cannot find data directory $RD_DATADIR\n"); - exit(-1); - } - } else { - data_dir = strdup("/usr/share/vor"); - if(missing(data_dir)) { - fprintf (stderr,"Cannot find data in %s\n", data_dir); - exit(-2); - } - } - } + if(!find_files()) exit(1); + read_high_score_table(); if(sound_flag) { // Initialize SDL with audio and video @@ -702,7 +647,7 @@ int init(int fullscreen) { return 0; } int draw() { - int i,n; + int i; SDL_Rect src,dest; struct black_point_struct *p; Uint16 *raw_pixels; @@ -710,8 +655,6 @@ int draw() { char *text; float fadegame,fadeover; - char *statedisplay, buf[1024]; - bang = 0; src.x = 0; @@ -782,28 +725,6 @@ int draw() { // Draw the rock SDL_BlitSurface(rock[i].image,&src,surf_screen,&dest); - // Draw the heated part of the rock, in an alpha which reflects the - // amount of heat in the rock. - if(rock[i].heat>0) { - SDL_Surface *deadrock; - deadrock = surf_deadrock[rock[i].type_number]; - SDL_SetAlpha(deadrock,SDL_SRCALPHA,rock[i].heat*255/rock[i].image->h); - dest.x = (int) rock[i].x; // kludge - SDL_BlitSurface(deadrock,&src,surf_screen,&dest); - if(rnd()<0.3) { - rock[i].heat -= movementrate; - } - } - - // If the rock is heated past a certain point, the water content of - // the rock flashes to steam, releasing enough energy to destroy - // the rock in spectacular fashion. - if(rock[i].heat>rock[i].image->h) { - rock[i].active = 0; - play_sound(1 + (int)(rnd()*3)); - makebangdots(rock[i].x,rock[i].y,rock[i].xvel,rock[i].yvel,rock[i].image,10); - } - } } @@ -986,6 +907,7 @@ int draw() { return bang; } + int gameloop() { int i = 0; Uint8 *keystate; @@ -1077,7 +999,6 @@ int gameloop() { rockptr->xvel = -(rockspeed)*(1 + rnd()); rockptr->yvel = rnd()-0.5; rockptr->type_number = random() % NROCKS; - rockptr->heat = 0; rockptr->image = surf_rock[rockptr->type_number];// [random()%NROCKS]; rockptr->active = 1; rockptr->y = rnd()*(YSIZE + rockptr->image->h); @@ -1248,6 +1169,8 @@ int gameloop() { } } } + +int main(int argc, char **argv) { int i, x, fullscreen; @@ -1292,20 +1215,14 @@ main(int argc, char **argv) { return 1; } - while(1) { - for(i = 0; i -#include -#include -#include -#include +#include "sound.h" extern int sound_flag, music_flag; diff --git a/sound.h b/sound.h new file mode 100644 index 0000000..fda2611 --- /dev/null +++ b/sound.h @@ -0,0 +1,32 @@ +/* Variations on RockDodger + * Copyright (C) 2004 Joshua Grams + * + * 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 + */ + +#ifndef VOR_SOUND_H +#define VOR_SOUND_H + +#include +#include +#include +#include +#include + +int init_sound(void); +void play_sound(int i); +void play_tune(int i); + +#endif // VOR_SOUND_H -- 1.7.10.4