--- alex4src/src/main.c.unix 2003-07-26 12:53:52.000000000 +0200 +++ alex4src/src/main.c 2006-11-03 13:26:37.000000000 +0100 @@ -38,6 +38,7 @@ #include "main.h" #include "edit.h" #include "shooter.h" +#include "unix.h" #include "../data/data.h" @@ -66,7 +67,6 @@ Tscroller hscroll; Thisc *hisc_table; Thisc *hisc_table_space; -char working_directory[1024]; // the map Tmap *map = NULL; @@ -126,6 +126,7 @@ int playing_original_game = 1; int init_ok = 0; +static FILE* log_fp = NULL; // // // // // // // // // // // // // // // // // // // // // @@ -154,20 +155,18 @@ // loggs the text to the text file void log2file(char *format, ...) { va_list ptr; /* get an arg pointer */ - FILE *fp; - fp = fopen("log.txt", "at"); - if (fp) { + if (log_fp) { /* initialize ptr to point to the first argument after the format string */ va_start(ptr, format); /* Write to logfile. */ - vfprintf(fp, format, ptr); // Write passed text. - fprintf(fp, "\n"); // New line.. + vfprintf(log_fp, format, ptr); // Write passed text. + fprintf(log_fp, "\n"); // New line.. va_end(ptr); - fclose(fp); + fflush(log_fp); } } @@ -618,6 +617,10 @@ BITMAP *bmp; int i; int w, h; +#ifdef __unix__ + char filename[512]; + char *homedir = get_homedir(); +#endif log2file("\nInit routines:"); @@ -625,7 +628,13 @@ log2file(" initializing allegro"); text_mode(-1); garble_string(init_string, 53); +#ifdef __unix__ + snprintf(filename, sizeof(filename), "%s/.alex4/alex4.ini", + homedir? homedir:"."); + override_config_file(filename); +#else set_config_file("alex4.ini"); +#endif set_window_close_button(FALSE); // install timers @@ -663,7 +672,7 @@ // init gfx - if (get_config_int("graphics", "fullscreen", 0)) { + if (get_config_int("graphics", "fullscreen", 1)) { w = get_config_int("graphics", "f_width", 640); h = get_config_int("graphics", "f_height", 480); } @@ -672,7 +681,7 @@ h = get_config_int("graphics", "w_height", 480); } - log2file(" entering gfx mode set in alex4.ini (%dx%d %s)", w, h, (get_config_int("graphics", "fullscreen", 0) ? "full" : "win")); + log2file(" entering gfx mode set in alex4.ini (%dx%d %s)", w, h, (get_config_int("graphics", "fullscreen", 1) ? "full" : "win")); if (set_gfx_mode( (get_config_int("graphics", "fullscreen", 0) ? GFX_AUTODETECT_FULLSCREEN : GFX_AUTODETECT_WINDOWED), @@ -695,6 +704,7 @@ textout_centre(swap_screen, font, "loading...", 320, 200, 1); blit_to_screen(swap_screen); +#ifndef __unix__ // set switch modes and callbacks if (set_display_switch_mode(SWITCH_PAUSE) < 0) log2file(" * display switch mode failed"); @@ -702,6 +712,7 @@ log2file(" * display switch in failed"); if (set_display_switch_callback(SWITCH_OUT, display_switch_out) < 0) log2file(" * display switch out failed"); +#endif // set win title (no! really???) @@ -718,7 +729,7 @@ // load data log2file(" loading data"); packfile_password(init_string); - data = load_datafile("data/data.dat"); + data = load_datafile(DATADIR "data.dat"); packfile_password(NULL); if (data == NULL) { log2file(" *** failed"); @@ -728,7 +739,13 @@ // load options log2file(" loading options"); +#ifdef __unix__ + snprintf(filename, sizeof(filename), "%s/.alex4/alex4.sav", + homedir? homedir:"."); + pf = pack_fopen(filename, "rp"); +#else pf = pack_fopen("alex4.sav", "rp"); +#endif if (pf) { load_options(&options, pf); pack_fclose(pf); @@ -740,7 +757,13 @@ // loading highscores log2file(" loading hiscores"); +#ifdef __unix__ + snprintf(filename, sizeof(filename), "%s/.alex4/alex4.hi", + homedir? homedir:"."); + pf = pack_fopen(filename, "rp"); +#else pf = pack_fopen("alex4.hi", "rp"); +#endif if (pf) { load_hisc_table(hisc_table, pf); load_hisc_table(hisc_table_space, pf); @@ -776,7 +799,7 @@ log2file(" loading original maps"); packfile_password(init_string); num_levels = -1; // skip end object when counting - maps = load_datafile_callback("data/maps.dat", count_maps_callback); + maps = load_datafile_callback(DATADIR "maps.dat", count_maps_callback); packfile_password(NULL); if (maps == NULL) { log2file(" *** failed"); @@ -835,11 +858,12 @@ // install sound log2file(" installing sound"); set_volume_per_voice(0); - switch(get_config_int("sound", "sound_device", 0)) { + switch(get_config_int("sound", "sound_device", 1)) { case 1: i = DIGI_AUTODETECT; log2file(" DIGI_AUTODETECT selected (%d)", i); break; +#ifdef ALLEGRO_WINDOWS case 2: i = DIGI_DIRECTX(0); log2file(" DIGI_DIRECTX(0) selected (%d)", i); @@ -848,6 +872,20 @@ i = DIGI_DIRECTAMX(0); log2file(" DIGI_DIRECTAMX(0) selected (%d)", i); break; +#elif defined ALLEGRO_UNIX +#ifdef DIGI_OSS + case 2: + i = DIGI_OSS; + log2file(" DIGI_OSS selected (%d)", i); + break; +#endif +#ifdef DIGI_ALSA + case 3: + i = DIGI_ALSA; + log2file(" DIGI_ALSA selected (%d)", i); + break; +#endif +#endif default: i = -770405; // dummy number got_sound = 0; @@ -870,9 +908,9 @@ if (get_config_int("sound", "use_sound_datafile", 1)) { log2file(" loading sound datafile"); packfile_password(init_string); - sfx_data = load_datafile("data/sfx_44.dat"); + sfx_data = load_datafile(DATADIR "sfx_44.dat"); if (sfx_data == NULL) { - sfx_data = load_datafile("data/sfx_22.dat"); + sfx_data = load_datafile(DATADIR "sfx_22.dat"); log2file(" sfx_44.dat not found"); s = 0; } @@ -971,6 +1009,10 @@ void uninit_game() { int i; PACKFILE *pf; +#ifdef __unix__ + char filename[512]; + char *homedir = get_homedir(); +#endif log2file("\nExit routines:"); @@ -989,14 +1031,26 @@ // only save if everything was inited ok! if (init_ok) { log2file(" saving options"); +#ifdef __unix__ + snprintf(filename, sizeof(filename), "%s/.alex4/alex4.sav", + homedir? homedir:"."); + pf = pack_fopen(filename, "wp"); +#else pf = pack_fopen("alex4.sav", "wp"); +#endif if (pf) { save_options(&options, pf); pack_fclose(pf); } log2file(" saving highscores"); +#ifdef __unix__ + snprintf(filename, sizeof(filename), "%s/.alex4/alex4.hi", + homedir? homedir:"."); + pf = pack_fopen(filename, "wp"); +#else pf = pack_fopen("alex4.hi", "wp"); +#endif if (pf) { save_hisc_table(hisc_table, pf); save_hisc_table(hisc_table_space, pf); @@ -1289,7 +1343,7 @@ // poll music machine if (got_sound) al_poll_duh(dp); - if (mode == 1 && (keypressed() || is_fire(&ctrl) || is_jump(&ctrl) ) || my_counter > 200) { + if (((mode == 1) && (keypressed() || is_fire(&ctrl) || is_jump(&ctrl))) || (my_counter > 200)) { mode = 2; } @@ -1343,7 +1397,7 @@ if (space) { // get space bg packfile_password(init_string); - df = load_datafile_object("data/a45.dat", "BG1"); + df = load_datafile_object(DATADIR "a45.dat", "BG1"); packfile_password(NULL); if (df != NULL) { bg = df->dat; @@ -2149,7 +2203,7 @@ // calculates camera pos for map m considering player p void calculate_camera_pos(Tplayer *p, Tmap *m) { - static camera_type = 1; + static int camera_type = 1; if (p->actor->status == AC_BALL) { camera_type = 2; @@ -2841,6 +2895,10 @@ } else { PACKFILE *pf; +#ifdef __unix__ + char filename[512]; + char *homedir = get_homedir(); +#endif log2file(" level complete"); if (got_sound) stop_music(); if (level < MAX_LEVELS && playing_original_game) { @@ -2875,7 +2933,14 @@ // save options log2file(" saving options"); +#ifdef __unix__ + snprintf(filename, sizeof(filename), + "%s/.alex4/alex4.sav", + homedir? homedir:"."); + pf = pack_fopen(filename, "wp"); +#else pf = pack_fopen("alex4.sav", "wp"); +#endif if (pf) { save_options(&options, pf); pack_fclose(pf); @@ -2969,24 +3034,36 @@ // main int main(int argc, char **argv) { - FILE *fp; int i; char full_path[1024]; +#ifndef __unix__ + char working_directory[1024]; +#else + char *homedir = get_homedir(); +#endif // init allegro allegro_init(); +#ifdef __unix__ + // start logfile + snprintf(full_path, sizeof(full_path), "%s/.alex4", + homedir? homedir:"."); + check_and_create_dir(full_path); + snprintf(full_path, sizeof(full_path), "%s/.alex4/log.txt", + homedir? homedir:"."); + log_fp = fopen(full_path, "wt"); +#else // get working directory get_executable_name(full_path, 1024); replace_filename(working_directory, full_path, "", 1024); chdir(working_directory); - // start logfile - fp = fopen("log.txt", "wt"); - if (fp) { - fprintf(fp, "Alex 4 (%s) - log file\n-------------------\n", GAME_VERSION_STR); - fclose(fp); + log_fp = fopen("log.txt", "wt"); +#endif + if (log_fp) { + fprintf(log_fp, "Alex 4 (%s) - log file\n-------------------\n", GAME_VERSION_STR); } // log program arguments @@ -2994,7 +3071,9 @@ for(i = 0; i < argc; i ++) { log2file(" %s", argv[i]); } +#ifndef __unix__ log2file("Working directory is:\n %s", working_directory); +#endif // test wether to play real game // or custom levels @@ -3022,6 +3101,8 @@ uninit_game(); allegro_exit(); log2file("\nDone...\n"); + if (log_fp) + fclose(log_fp); return 0; } END_OF_MAIN(); --- alex4src/src/player.h.unix 2003-07-26 12:53:52.000000000 +0200 +++ alex4src/src/player.h 2006-11-03 13:26:37.000000000 +0100 @@ -60,4 +60,4 @@ void wound_player(Tplayer *p); void kill_player(Tplayer *p); -#endif \ No newline at end of file +#endif --- alex4src/src/map.h.unix 2003-07-26 12:53:52.000000000 +0200 +++ alex4src/src/map.h 2006-11-03 13:26:37.000000000 +0100 @@ -111,4 +111,4 @@ -#endif \ No newline at end of file +#endif --- /dev/null 2006-11-03 08:26:09.036129000 +0100 +++ alex4src/src/unix.c 2006-11-03 13:26:37.000000000 +0100 @@ -0,0 +1,82 @@ +#ifdef __unix__ +#include +#include +#include +#include +#include +#include +#include +#if defined(__DECC) && defined(VMS) +#include +static char *vms_to_unix_buffer = NULL; +static int convert_vms_to_unix(char *vms_dir_name) +{ + vms_to_unix_buffer = vms_dir_name; +} +#endif + +char *get_homedir(void) +{ + struct passwd *pw; + + if (!(pw = getpwuid(getuid()))) + { + fprintf(stderr, "Who are you? Not found in passwd database!!\n"); + return getenv("HOME"); + } + +#if defined(__DECC) && defined(VMS) + /* Convert The OpenVMS Formatted "$HOME" Directory Path Into Unix + Format. */ + decc$from_vms(pw->pw_dir, convert_vms_to_unix, 1); + return vms_to_unix_buffer; +#else + return pw->pw_dir; +#endif +} +//----------------------------------------------------------------------------- +int check_and_create_dir(const char *name) +{ + struct stat stat_buffer; + + if (stat(name, &stat_buffer)) + { + /* error check if it doesn't exist or something else is wrong */ + if (errno == ENOENT) + { + /* doesn't exist letts create it ;) */ +#ifdef BSD43 + if (mkdir(name, 0775)) +#else + if (mkdir(name, S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH)) +#endif + { + fprintf(stderr, "Error creating dir %s", name); + perror(" "); + return -1; + } + } + else + { + /* something else went wrong yell about it */ + fprintf(stderr, "Error opening %s", name); + perror(" "); + return -1; + } + } + else + { + /* file exists check it's a dir otherwise yell about it */ +#ifdef BSD43 + if (!(S_IFDIR & stat_buffer.st_mode)) +#else + if (!S_ISDIR(stat_buffer.st_mode)) +#endif + { + fprintf(stderr,"Error %s exists but isn't a dir\n", name); + return -1; + } + } + return 0; +} +#endif --- /dev/null 2006-11-03 08:26:09.036129000 +0100 +++ alex4src/src/Makefile 2006-11-03 13:26:37.000000000 +0100 @@ -0,0 +1,24 @@ +PREFIX = /usr/local +DATADIR = $(PREFIX)/share/$(TARGET) +CFLAGS = -g -Wall -Wno-deprecated-declarations -O2 +LDFLAGS = `allegro-config --libs` -laldmb -ldumb +DEFINES = -DDATADIR=\"$(DATADIR)/\" +OBJS = actor.o edit.o map.o player.o shooter.o unix.o \ + bullet.o hisc.o options.o script.o timer.o \ + control.o main.o particle.o scroller.o token.o +TARGET = alex4 + +$(TARGET): $(OBJS) + $(CC) $(LDFLAGS) -o $@ $^ + +%.o: %.c + $(CC) $(CFLAGS) $(DEFINES) -o $@ -c $< + +install: $(TARGET) + mkdir -p $(PREFIX)/bin + mkdir -p $(DATADIR) + install -p -m 755 $(TARGET) $(PREFIX)/bin + install -p -m 644 ../data/*.dat $(DATADIR) + +clean: + rm -f $(OBJS) $(TARGET) *~ --- alex4src/src/token.h.unix 2003-07-26 12:53:54.000000000 +0200 +++ alex4src/src/token.h 2006-11-03 13:26:37.000000000 +0100 @@ -41,4 +41,4 @@ Ttoken *tokenize(char *str); -#endif \ No newline at end of file +#endif --- alex4src/src/shooter.c.unix 2003-07-26 12:53:52.000000000 +0200 +++ alex4src/src/shooter.c 2006-11-03 13:26:37.000000000 +0100 @@ -1372,7 +1372,7 @@ // load data log2file(" loading shooter data"); packfile_password(get_init_string()); - s_data = load_datafile("data/a45.dat"); + s_data = load_datafile(DATADIR "a45.dat"); if (!s_data) { log2file(" *** failed"); return -1; --- alex4src/src/particle.h.unix 2003-07-26 12:53:52.000000000 +0200 +++ alex4src/src/particle.h 2006-11-03 13:26:37.000000000 +0100 @@ -54,4 +54,4 @@ void update_particle_with_map(Tparticle *p, Tmap *m); void create_burst(Tparticle *ps, int x, int y, int spread, int num, int life, int bmp); -#endif \ No newline at end of file +#endif --- /dev/null 2006-11-03 08:26:09.036129000 +0100 +++ alex4src/src/unix.h 2006-11-03 13:26:37.000000000 +0100 @@ -0,0 +1,6 @@ +#ifdef __unix__ + +char *get_homedir(); +int check_and_create_dir(const char *name); + +#endif --- alex4src/src/scroller.h.unix 2003-07-26 12:53:52.000000000 +0200 +++ alex4src/src/scroller.h 2006-11-03 13:26:37.000000000 +0100 @@ -51,4 +51,4 @@ -#endif \ No newline at end of file +#endif --- alex4src/src/map.c.unix 2003-07-28 18:50:36.000000000 +0200 +++ alex4src/src/map.c 2006-11-03 14:17:51.000000000 +0100 @@ -24,6 +24,7 @@ #include #include #include +#include #include "allegro.h" #include "map.h" #include "timer.h" @@ -64,7 +65,41 @@ return m; } - + +static void mem_to_int(int *dest, unsigned char *mem) +{ +#if __BYTE_ORDER == __LITTLE_ENDIAN + memcpy(dest, mem, 4); +#else + *dest = mem[0] | (((int)mem[1]) << 8) | (((int)mem[2]) << 16) | + (((int)mem[3]) << 24); +#endif +} + +static void fread_int(int *dest, FILE *fp) +{ +#if __BYTE_ORDER == __LITTLE_ENDIAN + fread(dest, 4, 1, fp); +#else + unsigned char buf[4]; + fread(buf, 1, 4, fp); + mem_to_int(dest, buf); +#endif +} + +static void fwrite_int(const int *src, FILE *fp) +{ +#if __BYTE_ORDER == __LITTLE_ENDIAN + fwrite(src, 4, 1, fp); +#else + unsigned char buf[4]; + buf[0] = *src; + buf[1] = *src >> 8; + buf[2] = *src >> 16; + buf[3] = *src >> 24; + fwrite(buf, 1, 4, fp); +#endif +} // loads one splendind map from disk Tmap *load_map(char *fname) { @@ -93,7 +128,19 @@ } // read datastruct - fread(m, sizeof(Tmap), 1, fp); + // a mapfile contain a raw dump of the Tmap struct made on an i386 + // the code below reads these struct dumps in an arch neutral manner + // Note this dumps contains pointers, these are not used because these + // ofcourse point to some no longer valid address. + fread(m, 64, 1, fp); // first 64 bytes data + fread_int(&(m->width), fp); + fread_int(&(m->height), fp); + fread(header, 4, 1, fp); // skip the first pointer + fread_int(&(m->offset_x), fp); + fread_int(&(m->offset_y), fp); + fread(header, 4, 1, fp); // skip the second pointer + fread_int(&(m->start_x), fp); + fread_int(&(m->start_y), fp); // read map data m->dat = malloc(m->width * m->height * sizeof(Tmappos)); @@ -116,8 +163,8 @@ // loads one splendind map from memory Tmap *load_map_from_memory(void *mem) { Tmap *m; - char header[6]; - char *c = (char *)mem; + unsigned char header[6]; + unsigned char *c = (unsigned char *)mem; // does the header match? @@ -137,9 +184,19 @@ } // read datastruct - // fread(m, sizeof(Tmap), 1, fp); - memcpy(m, c, sizeof(Tmap)); - c += sizeof(Tmap); + // a mapfile contain a raw dump of the Tmap struct made on an i386 + // the code below reads these struct dumps in an arch neutral manner + // Note this dumps contains pointers, these are not used because these + // ofcourse point to some no longer valid address. + memcpy(m, c, 64); c += 64; // first 64 bytes data + mem_to_int(&(m->width), c); c += 4; + mem_to_int(&(m->height), c); c += 4; + c += 4; // skip the first pointer + mem_to_int(&(m->offset_x), c); c += 4; + mem_to_int(&(m->offset_y), c); c += 4; + c += 4; // skip the second pointer + mem_to_int(&(m->start_x), c); c+= 4; + mem_to_int(&(m->start_y), c); c+= 4; // read map data m->dat = malloc(m->width * m->height * sizeof(Tmappos)); @@ -174,7 +231,18 @@ fwrite(header, 6, 1, fp); // write datastruct - fwrite(m, sizeof(Tmap), 1, fp); + // a mapfile should contain a raw dump of the Tmap struct as made on an + // i386 the code below writes a struct dump as an i386 in an arch + // neutral manner + fwrite(m, 64, 1, fp); // first 64 bytes data + fwrite_int(&(m->width), fp); + fwrite_int(&(m->height), fp); + fwrite(header, 4, 1, fp); // skip the first pointer + fwrite_int(&(m->offset_x), fp); + fwrite_int(&(m->offset_y), fp); + fwrite(header, 4, 1, fp); // skip the second pointer + fwrite_int(&(m->start_x), fp); + fwrite_int(&(m->start_y), fp); // write map data fwrite(m->dat, sizeof(Tmappos), m->width * m->height, fp); @@ -409,7 +477,7 @@ } if (mask == 5 && oy > 31 - ox) return mask; // 45 degree slope / - if (mask == 6 && oy > ox) return mask; // 45 degree slope \ + if (mask == 6 && oy > ox) return mask; // 45 degree slope \ . // the not so simple ones if (mask == 3 && oy > 31 - ox / 2) return mask; // 22 degree slope / (low) --- alex4src/src/shooter.h.unix 2003-07-26 12:53:54.000000000 +0200 +++ alex4src/src/shooter.h 2006-11-03 13:26:37.000000000 +0100 @@ -83,8 +83,8 @@ int difficulty; // player related - long unsigned int score; - long unsigned int show_score; + unsigned int score; + unsigned int show_score; int lives; int power_gauge; int power_level; @@ -118,4 +118,4 @@ int start_shooter(Tcontrol *c, int with_sound); -#endif \ No newline at end of file +#endif --- alex4src/src/timer.h.unix 2003-07-26 12:53:54.000000000 +0200 +++ alex4src/src/timer.h 2006-11-03 13:26:37.000000000 +0100 @@ -37,4 +37,4 @@ void fps_counter(void); void cycle_counter(void); -#endif \ No newline at end of file +#endif --- alex4src/src/main.h.unix 2003-07-26 12:53:52.000000000 +0200 +++ alex4src/src/main.h 2006-11-03 13:26:37.000000000 +0100 @@ -93,5 +93,8 @@ #define check_bb_collision(x1,y1,w1,h1,x2,y2,w2,h2) (!( ((x1)>=(x2)+(w2)) || ((x2)>=(x1)+(w1)) || \ ((y1)>=(y2)+(h2)) || ((y2)>=(y1)+(h1)) )) +#ifndef DATADIR +#define DATADIR "data/" +#endif -#endif \ No newline at end of file +#endif --- alex4src/src/script.h.unix 2003-07-26 12:53:52.000000000 +0200 +++ alex4src/src/script.h 2006-11-03 13:26:37.000000000 +0100 @@ -51,4 +51,4 @@ -#endif \ No newline at end of file +#endif --- alex4src/src/edit.h.unix 2003-07-26 12:53:52.000000000 +0200 +++ alex4src/src/edit.h 2006-11-03 13:26:37.000000000 +0100 @@ -37,4 +37,4 @@ void draw_edit_mode(BITMAP *bmp, Tmap *map, int mx, int my); void update_edit_mode(Tmap *map, BITMAP *bmp, int mx, int my, int mb); -#endif \ No newline at end of file +#endif --- alex4src/src/token.c.unix 2003-07-26 18:50:40.000000000 +0200 +++ alex4src/src/token.c 2006-11-03 13:26:37.000000000 +0100 @@ -67,7 +67,7 @@ // tokenizes the string str Ttoken *tokenize(char *str) { - Ttoken *tok_list, *tok_tmp; + Ttoken *tok_list, *tok_tmp = NULL; char word[256]; int a, b, c; int i = 0; --- alex4src/src/hisc.h.unix 2003-07-26 12:53:52.000000000 +0200 +++ alex4src/src/hisc.h 2006-11-03 13:26:37.000000000 +0100 @@ -48,4 +48,4 @@ void draw_hisc_post(Thisc *table, BITMAP *bmp, FONT *fnt, int x, int y, int color, int show_level); void draw_hisc_table(Thisc *table, BITMAP *bmp, FONT *fnt, int x, int y, int color, int show_level); -#endif \ No newline at end of file +#endif --- alex4src/src/options.h.unix 2003-07-26 12:53:52.000000000 +0200 +++ alex4src/src/options.h 2006-11-03 13:26:37.000000000 +0100 @@ -43,4 +43,4 @@ void load_options(Toptions *o, PACKFILE *fp); void reset_options(Toptions *o); -#endif \ No newline at end of file +#endif --- alex4src/src/timer.c.unix 2003-07-26 12:53:52.000000000 +0200 +++ alex4src/src/timer.c 2006-11-03 13:26:37.000000000 +0100 @@ -60,4 +60,4 @@ game_count ++; return TRUE; -} \ No newline at end of file +} --- alex4src/src/actor.h.unix 2003-07-26 12:53:52.000000000 +0200 +++ alex4src/src/actor.h 2006-11-03 13:26:37.000000000 +0100 @@ -91,4 +91,4 @@ void kill_actor(Tactor *a); -#endif \ No newline at end of file +#endif --- alex4src/src/bullet.h.unix 2003-07-26 12:53:52.000000000 +0200 +++ alex4src/src/bullet.h 2006-11-03 13:26:37.000000000 +0100 @@ -52,4 +52,4 @@ void update_bullet(Tbullet *b); void update_bullet_with_map(Tbullet *b, Tmap *m); -#endif \ No newline at end of file +#endif