[Super-tux-commit] supertux/src gameloop.cpp,1.72,1.73 setup.cpp,1.39,1.40 setup.h,1.16,1.17 supertu
Brought to you by:
wkendrick
From: Ingo R. <gr...@us...> - 2004-04-17 00:50:05
|
Update of /cvsroot/super-tux/supertux/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15512 Modified Files: gameloop.cpp setup.cpp setup.h supertux.cpp title.cpp worldmap.cpp worldmap.h Log Message: - added load game support for the worldmap Index: setup.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/setup.cpp,v retrieving revision 1.39 retrieving revision 1.40 diff -u -d -r1.39 -r1.40 --- setup.cpp 16 Apr 2004 16:52:18 -0000 1.39 +++ setup.cpp 17 Apr 2004 00:49:54 -0000 1.40 @@ -11,6 +11,7 @@ */ #include <assert.h> +#include <stdio.h> #include <iostream> #include <stdio.h> #include <stdlib.h> @@ -440,18 +441,14 @@ highscore_menu->additem(MN_TEXTFIELD,"Enter your name:",0,0); } -void update_load_save_game_menu(Menu* pmenu, int load) +void update_load_save_game_menu(Menu* pmenu) { for(int i = 2; i < 7; ++i) { // FIXME: Insert a real savegame struct/class here instead of // doing string vodoo - std::string tmp = slotinfo(i-1); - - if(load && tmp.length() == strlen("Slot X - Free")) - pmenu->item[i].kind = MN_ACTION; - else - pmenu->item[i].kind = MN_ACTION; + std::string tmp = slotinfo(i - 1); + pmenu->item[i].kind = MN_ACTION; pmenu->item[i].change_text(tmp.c_str()); } } @@ -462,21 +459,18 @@ if(slot != -1) { - // FIXME: Insert a real savegame struct/class here instead of - // doing string vodoo - std::string tmp = slotinfo(slot-1); + WorldMapNS::WorldMap worldmap; + + char slotfile[1024]; + snprintf(slotfile, 1024, "%s/slot%d.stsg", st_save_dir, slot-1); + + worldmap.loadgame(slotfile); + + worldmap.display(); + + show_menu = true; + Menu::set_current(main_menu); - if (tmp.length() == strlen("Slot X - Free")) - { // Slot is free, so start a new game - worldmap_run(); - - show_menu = true; - Menu::set_current(main_menu); - } - else - { - puts("Warning: Loading games isn't supported at the moment"); - } st_pause_ticks_stop(); return true; } Index: setup.h =================================================================== RCS file: /cvsroot/super-tux/supertux/src/setup.h,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- setup.h 16 Apr 2004 16:52:18 -0000 1.16 +++ setup.h 17 Apr 2004 00:49:54 -0000 1.17 @@ -39,7 +39,7 @@ /** Return true if the gameloop() was entered, false otherwise */ bool process_load_game_menu(); -void update_load_save_game_menu(Menu* pmenu, int load); +void update_load_save_game_menu(Menu* pmenu); void parseargs(int argc, char * argv[]); #endif /*SUPERTUX_SETUP_H*/ Index: title.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/title.cpp,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- title.cpp 13 Apr 2004 12:25:22 -0000 1.42 +++ title.cpp 17 Apr 2004 00:49:54 -0000 1.43 @@ -408,7 +408,7 @@ #endif case 0: // Start Game, ie. goto the slots menu - update_load_save_game_menu(load_game_menu, true); + update_load_save_game_menu(load_game_menu); break; case 1: // Contrib Menu Index: worldmap.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/worldmap.cpp,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- worldmap.cpp 16 Apr 2004 16:52:18 -0000 1.26 +++ worldmap.cpp 17 Apr 2004 00:49:54 -0000 1.27 @@ -450,7 +450,8 @@ play_music(song, 1); show_menu = 0; menu_reset(); - savegame(std::string(st_save_dir) + "/slot1.stsg"); + if (!savegame_file.empty()) + savegame(savegame_file); return; } } @@ -591,14 +592,23 @@ void WorldMap::savegame(const std::string& filename) { + std::cout << "savegame: " << filename << std::endl; std::ofstream out(filename.c_str()); + int nb_solved_levels = 0; + for(Levels::iterator i = levels.begin(); i != levels.end(); ++i) + { + if (i->solved) + ++nb_solved_levels; + } + out << "(supertux-savegame\n" << " (version 1)\n" + << " (title \"Icyisland - " << nb_solved_levels << "/" << levels.size() << "\")\n" << " (lives " << player_status.lives << ")\n" << " (score " << player_status.score << ")\n" << " (distros " << player_status.distros << ")\n" - << " (tux (x " << tux->get_tile_pos().x << ") (y " << tux->get_tile_pos().y << ")\n" + << " (tux (x " << tux->get_tile_pos().x << ") (y " << tux->get_tile_pos().y << "))\n" << " (levels\n"; for(Levels::iterator i = levels.begin(); i != levels.end(); ++i) @@ -614,13 +624,60 @@ << " )\n\n;; EOF ;;" << std::endl; } -} // namespace WorldMapNS - -void worldmap_run() +void +WorldMap::loadgame(const std::string& filename) { - WorldMapNS::WorldMap worldmap; + std::cout << "loadgame: " << filename << std::endl; + savegame_file = filename; + + if (access(filename.c_str(), F_OK) == 0) + { + lisp_object_t* cur = lisp_read_from_file(filename); + + if (strcmp(lisp_symbol(lisp_car(cur)), "supertux-savegame") != 0) + return; + + cur = lisp_cdr(cur); + LispReader reader(cur); - worldmap.display(); + reader.read_int("lives", &player_status.lives); + reader.read_int("score", &player_status.score); + reader.read_int("distros", &player_status.distros); + + lisp_object_t* tux_cur = 0; + if (reader.read_lisp("tux", &tux_cur)) + { + Point p; + LispReader tux_reader(tux_cur); + tux_reader.read_int("x", &p.x); + tux_reader.read_int("y", &p.y); + + tux->set_tile_pos(p); + } + + lisp_object_t* level_cur = 0; + if (reader.read_lisp("levels", &level_cur)) + { + while(level_cur) + { + std::string name; + bool solved = false; + LispReader level_reader(level_cur); + level_reader.read_string("name", &name); + level_reader.read_bool("solved", &solved); + + for(Levels::iterator i = levels.begin(); i != levels.end(); ++i) + { + if (name == i->name) + i->solved = solved; + } + + level_cur = lisp_cdr(level_cur); + } + } + } } +} // namespace WorldMapNS + /* EOF */ Index: supertux.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/supertux.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- supertux.cpp 11 Apr 2004 19:10:41 -0000 1.10 +++ supertux.cpp 17 Apr 2004 00:49:54 -0000 1.11 @@ -41,7 +41,8 @@ if (launch_worldmap_mode) { - worldmap_run(); + WorldMapNS::WorldMap worldmap; + worldmap.display(); } else if (level_startup_file) { Index: worldmap.h =================================================================== RCS file: /cvsroot/super-tux/supertux/src/worldmap.h,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- worldmap.h 16 Apr 2004 16:52:18 -0000 1.15 +++ worldmap.h 17 Apr 2004 00:49:54 -0000 1.16 @@ -144,6 +144,7 @@ bool enter_level; Point offset; + std::string savegame_file; void draw_status(); public: @@ -171,12 +172,11 @@ bool path_ok(Direction direction, Point pos, Point* new_pos); void savegame(const std::string& filename); + void loadgame(const std::string& filename); }; } // namespace WorldMapNS -void worldmap_run(); - #endif /* Local Variables: */ Index: gameloop.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/gameloop.cpp,v retrieving revision 1.72 retrieving revision 1.73 diff -u -d -r1.72 -r1.73 --- gameloop.cpp 16 Apr 2004 18:49:13 -0000 1.72 +++ gameloop.cpp 17 Apr 2004 00:49:54 -0000 1.73 @@ -519,10 +519,11 @@ st_pause_ticks_stop(); break; case 3: - update_load_save_game_menu(save_game_menu, false); + // FIXME: + //update_load_save_game_menu(save_game_menu); break; case 4: - update_load_save_game_menu(load_game_menu, true); + update_load_save_game_menu(load_game_menu); break; case 7: st_pause_ticks_stop(); @@ -737,33 +738,16 @@ std::string slotinfo(int slot) { - FILE* fi; + char tmp[1024]; char slotfile[1024]; - char tmp[200]; - char str[5]; - int slot_level; - sprintf(slotfile,"%s/slot%d.save",st_save_dir,slot); - - fi = fopen(slotfile, "rb"); - - sprintf(tmp,"Slot %d - ",slot); + sprintf(slotfile,"%s/slot%d.stsg",st_save_dir,slot); - if (fi == NULL) - { - strcat(tmp,"Free"); - } + if (access(slotfile, F_OK) == 0) + sprintf(tmp,"Slot %d - Savegame",slot); else - { - fgets(str, 100, fi); - str[strlen(str)-1] = '\0'; - strcat(tmp, str); - strcat(tmp, " / Level:"); - fread(&slot_level,sizeof(int),1,fi); - sprintf(str,"%d",slot_level); - strcat(tmp,str); - fclose(fi); - } + sprintf(tmp,"Slot %d - Free",slot); return tmp; } + |