[Super-tux-devel] Patch to allow running levels from command line
Brought to you by:
wkendrick
From: Ingo R. <gr...@gm...> - 2004-03-19 14:08:54
|
Here a little patch to allow to run levels from command line, ala: ./supertux ../data/levels/default/level4.dat The patch does some ugly stuff with gameloop(), so I havn't commited it yet to CVS. Index: src/gameloop.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/gameloop.cpp,v retrieving revision 1.1 diff -u -r1.1 gameloop.cpp --- src/gameloop.cpp 17 Mar 2004 19:19:10 -0000 1.1 +++ src/gameloop.cpp 19 Mar 2004 13:49:59 -0000 @@ -357,8 +357,18 @@ player_level_begin(&tux); set_defaults(); level_free(¤t_level); - if(level_load(¤t_level,level_subset,level) != 0) - return 0; + + if (level_startup_file) + { + if(level_load(¤t_level, level_startup_file) != 0) + return 0; + } + else + { + if(level_load(¤t_level,level_subset,level) != 0) + return 0; + } + arrays_free(); arrays_init(); activate_bad_guys(); @@ -568,7 +578,7 @@ /* --- GAME LOOP! --- */ -int gameloop(char * subset, int levelnb, int mode) +int gameloop(const char* levelname, const char * subset, int levelnb, int mode) { int fps_cnt, jump, done; timer_type fps_timer, frame_timer; @@ -579,14 +589,23 @@ st_gl_mode = mode; level = levelnb; - strcpy(level_subset,subset); /* Init the game: */ arrays_init(); set_defaults(); - if(level_load(¤t_level,level_subset,level) != 0) - exit(1); + if (levelname) + { + if (level_load(¤t_level, levelname)) + exit(1); + } + else + { + strcpy(level_subset,subset); + if(level_load(¤t_level, level_subset, level) != 0) + exit(1); + } + level_load_gfx(¤t_level); activate_bad_guys(); level_load_song(¤t_level); Index: src/gameloop.h =================================================================== RCS file: /cvsroot/super-tux/supertux/src/gameloop.h,v retrieving revision 1.15 diff -u -r1.15 gameloop.h --- src/gameloop.h 15 Mar 2004 17:45:29 -0000 1.15 +++ src/gameloop.h 19 Mar 2004 13:49:59 -0000 @@ -28,7 +28,7 @@ /* Function prototypes: */ -int gameloop(char * subset, int levelnb, int mode); +int gameloop(const char* filename, const char * subset, int levelnb, int mode); void savegame(int slot); void loadgame(int slot); void slotinfo(char **pinfo, int slot); Index: src/globals.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/globals.cpp,v retrieving revision 1.1 diff -u -r1.1 globals.cpp --- src/globals.cpp 17 Mar 2004 19:19:10 -0000 1.1 +++ src/globals.cpp 19 Mar 2004 13:49:59 -0000 @@ -17,6 +17,8 @@ int use_gl, use_joystick, use_fullscreen, debug_mode, show_fps; +const char* level_startup_file = 0; + /* SuperTux directory ($HOME/.supertux) and save directory($HOME/.supertux/save) */ char *st_dir, *st_save_dir; Index: src/globals.h =================================================================== RCS file: /cvsroot/super-tux/supertux/src/globals.h,v retrieving revision 1.12 diff -u -r1.12 globals.h --- src/globals.h 15 Mar 2004 17:45:29 -0000 1.12 +++ src/globals.h 19 Mar 2004 13:49:59 -0000 @@ -23,6 +23,8 @@ extern int use_gl, use_joystick, use_fullscreen, debug_mode, show_fps; +extern const char* level_startup_file; + /* SuperTux directory ($HOME/.supertux) and save directory($HOME/.supertux/save) */ extern char *st_dir, *st_save_dir; Index: src/level.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/level.cpp,v retrieving revision 1.1 diff -u -r1.1 level.cpp --- src/level.cpp 17 Mar 2004 19:19:11 -0000 1.1 +++ src/level.cpp 19 Mar 2004 13:50:00 -0000 @@ -144,17 +144,23 @@ /* Returns -1, if the loading of the level failed. */ int level_load(st_level* plevel, char *subset, int level) { - int y,x; - FILE * fi; - char str[80]; char filename[1024]; - char * line; /* Load data file: */ snprintf(filename, 1024, "%s/levels/%s/level%d.dat", st_dir, subset, level); if(!faccessible(filename)) snprintf(filename, 1024, "%s/levels/%s/level%d.dat", DATA_PREFIX, subset, level); + + return level_load(plevel, filename); +} + +int level_load(st_level* plevel, const char* filename) +{ + char str[80]; + int x, y; + char * line; + FILE * fi; fi = fopen(filename, "r"); if (fi == NULL) { @@ -162,7 +168,6 @@ return -1; } - /* Load header info: */ Index: src/level.h =================================================================== RCS file: /cvsroot/super-tux/supertux/src/level.h,v retrieving revision 1.8 diff -u -r1.8 level.h --- src/level.h 2 Mar 2004 15:42:36 -0000 1.8 +++ src/level.h 19 Mar 2004 13:50:00 -0000 @@ -51,6 +51,7 @@ extern texture_type img_bkgd, img_bkgd_tile[2][4], img_solid[4], img_brick[2]; int level_load(st_level* plevel, char * subset, int level); +int level_load(st_level* plevel, const char* filename); void level_save(st_level* plevel, char * subset, int level); void level_free(st_level* plevel); void level_load_gfx(st_level* plevel); Index: src/leveleditor.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/leveleditor.cpp,v retrieving revision 1.1 diff -u -r1.1 leveleditor.cpp --- src/leveleditor.cpp 17 Mar 2004 19:19:11 -0000 1.1 +++ src/leveleditor.cpp 19 Mar 2004 13:50:03 -0000 @@ -1445,7 +1445,7 @@ void le_testlevel() { level_save(le_current_level,"test",le_level); - gameloop("test",le_level, ST_GL_TEST); + gameloop(0, "test",le_level, ST_GL_TEST); menu_set_current(&leveleditor_menu); arrays_init(); level_load_gfx(le_current_level); Index: src/setup.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/setup.cpp,v retrieving revision 1.1 diff -u -r1.1 setup.cpp --- src/setup.cpp 17 Mar 2004 19:19:11 -0000 1.1 +++ src/setup.cpp 19 Mar 2004 13:50:05 -0000 @@ -394,7 +394,7 @@ { if(game_started == NO) { - gameloop("default",slot - 1,ST_GL_LOAD_GAME); + gameloop(0, "default",slot - 1,ST_GL_LOAD_GAME); show_menu = YES; menu_set_current(&main_menu); } @@ -950,6 +950,10 @@ exit(0); } + else if (argv[i][0] != '0') + { + level_startup_file = argv[i]; + } else { /* Unknown - complain! */ Index: src/supertux.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/supertux.cpp,v retrieving revision 1.1 diff -u -r1.1 supertux.cpp --- src/supertux.cpp 17 Mar 2004 19:19:12 -0000 1.1 +++ src/supertux.cpp 19 Mar 2004 13:50:05 -0000 @@ -32,19 +32,26 @@ st_joystick_setup(); st_general_setup(); st_menu(); - - done = intro(); - - done = 0; - - while (!done) + + if (level_startup_file) { - done = title(); + gameloop(level_startup_file, 0, 1, ST_GL_PLAY); + } + else + { + done = intro(); + + done = 0; + + while (!done) + { + done = title(); + } } clearscreen(0, 0, 0); updatescreen(); - + st_shutdown(); return(0); Index: src/title.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/title.cpp,v retrieving revision 1.1 diff -u -r1.1 title.cpp --- src/title.cpp 17 Mar 2004 19:19:12 -0000 1.1 +++ src/title.cpp 19 Mar 2004 13:50:05 -0000 @@ -220,7 +220,7 @@ else if(key == SDLK_SPACE || key == SDLK_RETURN) { done = YES; - quit = gameloop(subset.name,1,ST_GL_PLAY); + quit = gameloop(0, subset.name,1,ST_GL_PLAY); subset_free(&subset); } else if(key == SDLK_ESCAPE) -- WWW: http://pingus.seul.org/~grumbel/ JabberID: gr...@ja... ICQ: 59461927 |