summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
2b5dd5b)
* file.c (add_path): renamed to add_data_path, changed all callers.
* main.c (load_image): new function - changed all image loads.
* mt.c (frnd, crnd): converted literals to standard constants.
* mt.h: including inttypes.h instead of the less common stdint.h.
mode_t g_score_mask;
char *
mode_t g_score_mask;
char *
-add_path(char *filename)
+add_path(char *path, char *file)
- static char r[MAX_PATH_LEN];
- snprintf(r, MAX_PATH_LEN, "%s/%s", g_data_dir, filename);
- return r;
+ char *s;
+ size_t plen, flen;
+
+ if(!path || !file) return NULL;
+ plen = strlen(path);
+ flen = strlen(file);
+ s = malloc(2+plen+flen);
+ if(!s) return NULL;
+ memcpy(s, path, plen);
+ s[plen] = '/';
+ memcpy(s+plen+1, file, flen+1);
+ return s;
+}
+
+char *
+add_data_path(char *filename)
+{
+ return add_path(g_data_dir, filename);
int
find_score_file(void)
{
int
find_score_file(void)
{
- g_score_file = malloc(MAX_PATH_LEN);
- snprintf(g_score_file, MAX_PATH_LEN,
- "%s/.vor-scores", getenv("HOME"));
- g_score_mask = 0177;
- if(is_file(g_score_file)) return true;
-
- return false;
+ char *dir, *s;
+
+ /* in case we get called twice */
+ if(g_score_file) return true;
+
+ dir = getenv("HOME"); if(!dir) return false;
+ s = add_path(dir, ".vor-scores");
+ if(s) {
+ g_score_file = s;
+ g_score_mask = 0177;
+ return is_file(s);
+ } else return false;
open_score_file(char *mode)
{
mode_t old_mask;
open_score_file(char *mode)
{
mode_t old_mask;
- if(!g_score_file) return f;
+ if(!g_score_file) return NULL;
old_mask = umask(g_score_mask);
f = fopen(g_score_file, mode);
old_mask = umask(g_score_mask);
f = fopen(g_score_file, mode);
umask(old_mask);
return f;
}
umask(old_mask);
return f;
}
extern char *g_score_file;
extern mode_t g_score_mode;
extern char *g_score_file;
extern mode_t g_score_mode;
-char *add_path(char *filename);
+char *add_data_path(char *filename);
int is_dir(char *dirname);
int is_file(char *filename);
int find_data_dir(void);
int is_dir(char *dirname);
int is_file(char *filename);
int find_data_dir(void);
+SDL_Surface *
+load_image(char *filename)
+{
+ SDL_Surface *tmp, *img = NULL;
+ char *s = add_data_path(filename);
+ if(s) {
+ tmp = IMG_Load(s);
+ free(s);
+ if(tmp) {
+ img = SDL_DisplayFormat(tmp);
+ SDL_FreeSurface(tmp);
+ }
+ }
+ return img;
+}
+
Uint32 flag;
// Where are our data files?
Uint32 flag;
// Where are our data files?
- NULLERROR(temp = IMG_Load(add_path("banners/variations.png")));
- NULLERROR(surf_b_variations = SDL_DisplayFormat(temp));
+ NULLERROR(surf_b_variations = load_image("banners/variations.png"));
+ NULLERROR(surf_b_on = load_image("banners/on.png"));
+ NULLERROR(surf_b_rockdodger = load_image("banners/rockdodger.png"));
- NULLERROR(temp = IMG_Load(add_path("banners/on.png")));
- NULLERROR(surf_b_on = SDL_DisplayFormat(temp));
-
- NULLERROR(temp = IMG_Load(add_path("banners/rockdodger.png")));
- NULLERROR(surf_b_rockdodger = SDL_DisplayFormat(temp));
-
- NULLERROR(temp = IMG_Load(add_path("banners/game.png")));
- NULLERROR(surf_b_game = SDL_DisplayFormat(temp));
-
- NULLERROR(temp = IMG_Load(add_path("banners/over.png")));
- NULLERROR(surf_b_over = SDL_DisplayFormat(temp));
-
- surf_font_big = IMG_Load(add_path(BIG_FONT_FILE));
- g_font = SFont_InitFont(surf_font_big);
+ NULLERROR(surf_b_game = load_image("banners/game.png"));
+ NULLERROR(surf_b_over = load_image("banners/over.png"));
// Load the spaceship graphic.
// Load the spaceship graphic.
- NULLERROR(temp = IMG_Load(add_path("sprites/ship.png")));
- NULLERROR(surf_ship = SDL_DisplayFormat(temp));
+ NULLERROR(surf_ship = load_image("sprites/ship.png"));
get_shape(surf_ship, &shipshape);
// Load the life indicator (small ship) graphic.
get_shape(surf_ship, &shipshape);
// Load the life indicator (small ship) graphic.
- NULLERROR(temp = IMG_Load(add_path("indicators/life.png")));
- NULLERROR(surf_life = SDL_DisplayFormat(temp));
+ NULLERROR(surf_life = load_image("indicators/life.png"));
+
+ // Load the font image
+ s = add_data_path(BIG_FONT_FILE);
+ if(s) {
+ NULLERROR(surf_font_big = IMG_Load(s));
+ free(s);
+ g_font = SFont_InitFont(surf_font_big);
+ }
init_engine_dots();
init_dust();
init_engine_dots();
init_dust();
+ Uint8 *keystate = SDL_GetKeyState(NULL);
/* mt.c - A C program for MT199937, with initialization improved 2002-02-10.
-----
/* mt.c - A C program for MT199937, with initialization improved 2002-02-10.
-----
+ 2006-01-14 - Switched include from stdint.h to inttypes.h,
+ fixed a warning from gcc -Wall. --Josh
+ -----
2003-07-01 - Stripped out stuff I didn't need, converted to
stdint.h types, changed source formatting a bit. --Josh
-----
2003-07-01 - Stripped out stuff I didn't need, converted to
stdint.h types, changed source formatting a bit. --Josh
-----
- return urnd()/(float)0x100000000UL;
+ return urnd()/(1.0 + UINT32_MAX);
- return (urnd()-0x80000000)/(float)0x100000000UL;
+ return (urnd()-INT32_MIN)/(1.0 + UINT32_MAX);
#ifndef VOR_MT_H
#define VOR_MT_H
#ifndef VOR_MT_H
#define VOR_MT_H
void init_mt(uint32_t s);
uint32_t urnd(void); // [0, 0xfffffff]
void init_mt(uint32_t s);
uint32_t urnd(void); // [0, 0xfffffff]
#include "rocks.h"
#include "shape.h"
#include "rocks.h"
#include "shape.h"
+SDL_Surface *load_image(char *filename);
+
struct rock_struct {
struct rock_struct *next;
float x,y,dx,dy;
struct rock_struct {
struct rock_struct *next;
float x,y,dx,dy;
struct rock_struct rocks[MAXROCKS], *free_rocks;
struct rock_struct **rock_buckets[2];
struct rock_struct rocks[MAXROCKS], *free_rocks;
struct rock_struct **rock_buckets[2];
+int n_buckets;
+// we have two sets of buckets -- this variable tells which we are using.
+int p;
int bw, bh;
int grid_size;
int bw, bh;
int grid_size;
float nrocks_inc_ticks = 2*60*20/(F_ROCKS-I_ROCKS);
// constants for rock generation.
float nrocks_inc_ticks = 2*60*20/(F_ROCKS-I_ROCKS);
// constants for rock generation.
-#define KH (32.0*20) // 32 s for a speed=1 rock to cross the screen horizontally.
-#define KV (24.0*20) // 24 s for a speed=1 rock to cross the screen vertically.
+#define KH (32*20) // 32 s for a speed=1 rock to cross the screen horizontally.
+#define KV (24*20) // 24 s for a speed=1 rock to cross the screen vertically.
#define RDX 2.5 // range for rock dx values (+/-)
#define RDY 2.5 // range for rock dy values (+/-)
#define RDX 2.5 // range for rock dx values (+/-)
#define RDY 2.5 // range for rock dy values (+/-)
-static inline int bucket(int x, int y) { return (1+x/grid_size) + bw*(1+y/grid_size); }
+static inline struct rock_struct **
+bucket(int x, int y, int p)
+{
+ int b = (1+x/grid_size) + bw*(1+y/grid_size);
+ return &rock_buckets[p][b];
+}
-sort_rock(struct rock_struct *q, struct rock_struct *r, int p)
+transfer_rock(struct rock_struct *r, struct rock_struct **from, struct rock_struct **to)
- int b = bucket(r->x, r->y);
- q->next = r->next; // remove from old list
- r->next = rock_buckets[p][b]; // insert into new list
- rock_buckets[p][b] = r;
+ *from = r->next;
+ r->next = *to;
+ *to = r;
+#define ROCK_LEN sizeof("sprites/rockXX.png")
+
int
init_rocks(void)
{
int i;
int
init_rocks(void)
{
int i;
- char a[MAX_PATH_LEN];
- SDL_Surface *temp;
int maxw=0, maxh=0;
for(i = 0; i<NROCKS; i++) {
int maxw=0, maxh=0;
for(i = 0; i<NROCKS; i++) {
- snprintf(a,MAX_PATH_LEN,add_path("sprites/rock%02d.png"),i);
- NULLERROR(temp = IMG_Load(a));
- NULLERROR(surf_rock[i] = SDL_DisplayFormat(temp));
+ snprintf(a, ROCK_LEN, "sprites/rock%02d.png", i);
+ NULLERROR(surf_rock[i] = load_image(a));
get_shape(surf_rock[i], &rock_shapes[i]);
maxw = max(maxw, rock_shapes[i].w);
maxh = max(maxh, rock_shapes[i].h);
get_shape(surf_rock[i], &rock_shapes[i]);
maxw = max(maxw, rock_shapes[i].w);
maxh = max(maxh, rock_shapes[i].h);
r->dy = weighted_rnd_range(rmin[i], rmax[i]) + screendy;
break;
}
r->dy = weighted_rnd_range(rmin[i], rmax[i]) + screendy;
break;
}
- sort_rock((struct rock_struct *)&free_rocks, r, p);
+ transfer_rock(r, &free_rocks, bucket(r->x, r->y, p));
move_rocks(void)
{
int b;
move_rocks(void)
{
int b;
- struct rock_struct *q,*r;
+ struct rock_struct **head;
+ struct rock_struct *r;
// Move all the rocks
for(b=0; b<n_buckets; b++) {
// Move all the rocks
for(b=0; b<n_buckets; b++) {
- q=(struct rock_struct *)&rock_buckets[p][b]; r=q->next;
- while(r) {
+ head=&rock_buckets[p][b]; r=*head;
+ while(*head) {
+ r=*head;
+
// move
r->x += (r->dx - screendx)*t_frame;
r->y += (r->dy - screendy)*t_frame;
// move
r->x += (r->dx - screendx)*t_frame;
r->y += (r->dy - screendy)*t_frame;
+ // clip or resort into other bucket set
+ // (either way we move it out of this list).
if(r->x + r->image->w < 0 || r->x >= XSIZE
|| r->y + r->image->h < 0 || r->y >= YSIZE) {
if(r->x + r->image->w < 0 || r->x >= XSIZE
|| r->y + r->image->h < 0 || r->y >= YSIZE) {
- q->next = r->next;
- r->next = free_rocks; free_rocks = r;
+ transfer_rock(r, head, &free_rocks);
- } else sort_rock(q,r,1-p);
- if(q->next == r) q = q->next;
- if(q) r = q->next; else r = NULL;
+ } else transfer_rock(r, head, bucket(r->x, r->y, 1-p));
}
}
p = 1-p; // switch current set of buckets.
}
}
p = 1-p; // switch current set of buckets.
-hit_in_bucket(int b, float x, float y, struct shape *shape)
+hit_in_bucket(struct rock_struct *r, float x, float y, struct shape *shape)
- struct rock_struct *r;
-
- for(r=rock_buckets[p][b]; r; r=r->next) {
if(collide(x - r->x, y - r->y, r->shape, shape)) return 1;
}
return 0;
if(collide(x - r->x, y - r->y, r->shape, shape)) return 1;
}
return 0;
int
hit_rocks(float x, float y, struct shape *shape)
{
int
hit_rocks(float x, float y, struct shape *shape)
{
+ struct rock_struct **b = bucket(x, y, p);
int bdx = ((int)x+shape->w)/grid_size - (int)x/grid_size;
int bdy = ((int)y+shape->h)/grid_size - (int)y/grid_size;
int bdx = ((int)x+shape->w)/grid_size - (int)x/grid_size;
int bdy = ((int)y+shape->h)/grid_size - (int)y/grid_size;
- if(hit_in_bucket(b, x, y, shape)) return 1;
- if(hit_in_bucket(b-1, x, y, shape)) return 1;
- if(hit_in_bucket(b-bw, x, y, shape)) return 1;
- if(hit_in_bucket(b-bw-1, x, y, shape)) return 1;
+ if(hit_in_bucket(*b, x, y, shape)) return 1;
+ if(hit_in_bucket(*(b-1), x, y, shape)) return 1;
+ if(hit_in_bucket(*(b-bw), x, y, shape)) return 1;
+ if(hit_in_bucket(*(b-bw-1), x, y, shape)) return 1;
- if(hit_in_bucket(b+1, x, y, shape)) return 1;
- if(hit_in_bucket(b+1-bw, x, y, shape)) return 1;
+ if(hit_in_bucket(*(b+1), x, y, shape)) return 1;
+ if(hit_in_bucket(*(b+1-bw), x, y, shape)) return 1;
- if(hit_in_bucket(b+bw, x, y, shape)) return 1;
- if(hit_in_bucket(b+bw-1, x, y, shape)) return 1;
+ if(hit_in_bucket(*(b+bw), x, y, shape)) return 1;
+ if(hit_in_bucket(*(b+bw-1), x, y, shape)) return 1;
- if(bdx && bdy && hit_in_bucket(b+bw+1, x, y, shape)) return 1;
+ if(bdx && bdy && hit_in_bucket(*(b+bw+1), x, y, shape)) return 1;
-pixel_hit_in_bucket(int b, float x, float y)
+pixel_hit_in_bucket(struct rock_struct *r, float x, float y)
- struct rock_struct *r;
- for(r=rock_buckets[p][b]; r; r=r->next) {
if(x < r->x || y < r->y) continue;
if(pixel_collide(x - r->x, y - r->y, r->shape)) return 1;
}
if(x < r->x || y < r->y) continue;
if(pixel_collide(x - r->x, y - r->y, r->shape)) return 1;
}
int
pixel_hit_rocks(float x, float y)
{
int
pixel_hit_rocks(float x, float y)
{
- int b = bucket(x, y);
- if(pixel_hit_in_bucket(b, x, y)) return 1;
- if(pixel_hit_in_bucket(b-1, x, y)) return 1;
- if(pixel_hit_in_bucket(b-bw, x, y)) return 1;
- if(pixel_hit_in_bucket(b-bw-1, x, y)) return 1;
+ struct rock_struct **b = bucket(x, y, p);
+ if(pixel_hit_in_bucket(*b, x, y)) return 1;
+ if(pixel_hit_in_bucket(*(b-1), x, y)) return 1;
+ if(pixel_hit_in_bucket(*(b-bw), x, y)) return 1;
+ if(pixel_hit_in_bucket(*(b-bw-1), x, y)) return 1;
{
int x, y;
uint16_t *px, transp;
{
int x, y;
uint16_t *px, transp;
- uint32_t bits, bit, *p;
+ uint32_t bits = 0, bit, *p;
if(img->format->BytesPerPixel != 2) {
fprintf(stderr, "get_shape(): not a 16-bit image!\n");
if(img->format->BytesPerPixel != 2) {
fprintf(stderr, "get_shape(): not a 16-bit image!\n");
Uint16 audio_format;
int audio_channels;
Uint16 audio_format;
int audio_channels;
+char *add_data_path(char *);
char *wav_file[] = {
"sounds/booom.wav",
"sounds/cboom.wav",
char *wav_file[] = {
"sounds/booom.wav",
"sounds/cboom.wav",
"music/4est_fulla3s.mod"
};
"music/4est_fulla3s.mod"
};
+// Return 1 if the sound is ready to roll, and 0 if not.
- // Return 1 if the sound is ready to roll, and 0 if not.
-
// Initialise output with SDL_mixer
if (Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, AUDIO_S16, MIX_DEFAULT_CHANNELS, 4096) < 0) {
// Initialise output with SDL_mixer
if (Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, AUDIO_S16, MIX_DEFAULT_CHANNELS, 4096) < 0) {
// Preload all the tunes into memory
for (i=0; i<NUM_TUNES; i++) {
// Preload all the tunes into memory
for (i=0; i<NUM_TUNES; i++) {
- if (!(music[i] = Mix_LoadMUS(add_path(tune_file[i])))) {
- printf ("Failed to load %s\n",add_path(tune_file[i]));
+ s = add_data_path(tune_file[i]);
+ if(s) {
+ music[i] = Mix_LoadMUS(s);
+ if(!music[i]) printf("Failed to load %s.\n", s);
+ free(s);
}
}
// Preload all the wav files into memory
for (i=0; i<NUM_SOUNDS; i++) {
}
}
// Preload all the wav files into memory
for (i=0; i<NUM_SOUNDS; i++) {
- wav[i] = Mix_LoadWAV(add_path(wav_file[i]));
+ s = add_data_path(wav_file[i]);
+ if(s) {
+ wav[i] = Mix_LoadWAV(s);
+ free(s);
+ }