pingus-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Pingus-CVS] r3328 - in trunk/pingus/src: . worldmap


From: grumbel at BerliOS
Subject: [Pingus-CVS] r3328 - in trunk/pingus/src: . worldmap
Date: Fri, 26 Oct 2007 06:19:26 +0200

Author: grumbel
Date: 2007-10-26 06:19:25 +0200 (Fri, 26 Oct 2007)
New Revision: 3328

Modified:
   trunk/pingus/src/file_dialog_item.cpp
   trunk/pingus/src/game_session.cpp
   trunk/pingus/src/plf_res_mgr.cpp
   trunk/pingus/src/savegame.cpp
   trunk/pingus/src/savegame.hpp
   trunk/pingus/src/savegame_manager.cpp
   trunk/pingus/src/savegame_manager.hpp
   trunk/pingus/src/worldmap/level_dot.cpp
   trunk/pingus/src/worldmap/level_dot.hpp
Log:
- fixed bug in the savegame system (levelname instead of filename was used

Modified: trunk/pingus/src/file_dialog_item.cpp
===================================================================
--- trunk/pingus/src/file_dialog_item.cpp       2007-10-25 04:58:15 UTC (rev 
3327)
+++ trunk/pingus/src/file_dialog_item.cpp       2007-10-26 04:19:25 UTC (rev 
3328)
@@ -82,8 +82,8 @@
                                        ostr << difficulty;
                                        file_info = _("Difficulty: ") + 
ostr.str();
                                        file_item.is_accessible = true;
-                                       Savegame* sg = 
SavegameManager::instance()->get(file_item.friendly_name);
-                                       if (sg && sg->status == 
Savegame::FINISHED) {
+                                       Savegame* sg = 
SavegameManager::instance()->get(file_item.friendly_name); // FIXME: doesn't 
won't work
+                                       if (sg && sg->get_status() == 
Savegame::FINISHED) {
                                                status = _("Finished!");
                                                file_item.is_finished = true;
                                        }

Modified: trunk/pingus/src/game_session.cpp
===================================================================
--- trunk/pingus/src/game_session.cpp   2007-10-25 04:58:15 UTC (rev 3327)
+++ trunk/pingus/src/game_session.cpp   2007-10-26 04:19:25 UTC (rev 3328)
@@ -116,16 +116,10 @@
       result.used_time = server->get_time();
 
       { // Write the savegame
-        Savegame savegame;
-        savegame.levelname    = result.plf.get_levelname();
-        savegame.needed_time  = result.used_time;
-        savegame.saved_pingus = result.saved;
-
-        if (result.saved >= result.needed)
-          savegame.status     = Savegame::FINISHED;
-        else
-          savegame.status     = Savegame::ACCESSIBLE;
-
+        Savegame savegame(result.plf.get_resname(),
+                          (result.saved >= result.needed) ? Savegame::FINISHED 
: Savegame::ACCESSIBLE,
+                          result.used_time,
+                          result.saved);
         SavegameManager::instance()->store(savegame);
       }
 

Modified: trunk/pingus/src/plf_res_mgr.cpp
===================================================================
--- trunk/pingus/src/plf_res_mgr.cpp    2007-10-25 04:58:15 UTC (rev 3327)
+++ trunk/pingus/src/plf_res_mgr.cpp    2007-10-26 04:19:25 UTC (rev 3328)
@@ -91,7 +91,7 @@
   // This should give us the tutorial/, wip/, etc. part of the res_name
   std::string dirname  = 
System::basename(System::dirname(pathname.get_sys_path()));
 
-  return load_plf_raw(dirname + "/" + res_name.substr(0, res_name.length()-4),
+  return load_plf_raw(dirname + "/" + res_name.substr(0, res_name.length()-7),
                       pathname);
 }
 

Modified: trunk/pingus/src/savegame.cpp
===================================================================
--- trunk/pingus/src/savegame.cpp       2007-10-25 04:58:15 UTC (rev 3327)
+++ trunk/pingus/src/savegame.cpp       2007-10-26 04:19:25 UTC (rev 3328)
@@ -65,11 +65,14 @@
   read_sexpr(reader);
 }
 
-Savegame::Savegame(std::string arg_levelname, S_Status arg_status, int 
arg_time, int arg_saved_pingus)
-  : levelname(arg_levelname),
-    status(arg_status),
-    needed_time(arg_time),
-    saved_pingus(arg_saved_pingus)
+Savegame::Savegame(const std::string& filename_, 
+                   S_Status status_, 
+                   int      time_,
+                   int      saved_pingus_)
+  : filename(filename_),
+    status(status_),
+    needed_time(time_),
+    saved_pingus(saved_pingus_)
 {
 }
 
@@ -77,9 +80,9 @@
 Savegame::write_sexpr(SExprFileWriter& writer)
 {
   writer.begin_section("level");
-  writer.write_string ("name", levelname);
-  writer.write_enum   ("status", status, status_to_string);
-  writer.write_int    ("time", needed_time);
+  writer.write_string ("filename", filename);
+  writer.write_enum   ("status",   status, status_to_string);
+  writer.write_int    ("time",     needed_time);
   writer.write_int    ("saved-pingus", saved_pingus);
   writer.end_section();
 }
@@ -87,11 +90,10 @@
 void
 Savegame::read_sexpr(FileReader reader)
 {
-  reader.read_string ("name", levelname);
-  reader.read_enum   ("status", status, string_to_status);
-  reader.read_int    ("time", needed_time);
+  reader.read_string ("filename", filename);
+  reader.read_enum   ("status",   status, string_to_status);
+  reader.read_int    ("time",     needed_time);
   reader.read_int    ("saved-pingus", saved_pingus);
 }
 
-
 /* EOF */

Modified: trunk/pingus/src/savegame.hpp
===================================================================
--- trunk/pingus/src/savegame.hpp       2007-10-25 04:58:15 UTC (rev 3327)
+++ trunk/pingus/src/savegame.hpp       2007-10-26 04:19:25 UTC (rev 3328)
@@ -30,31 +30,40 @@
     level */
 class Savegame
 {
-private:
 public:
   enum S_Status { FINISHED,   // level is successfully finished
                   ACCESSIBLE, // level is accessible and can be played
                   NONE };     // level is not finished and cannot be accessed
 
-  static std::string status_to_string(S_Status s);
-  static S_Status string_to_status (std::string s);
+private:
+  std::string filename;
+  S_Status    status;
 
-  std::string levelname;
-  S_Status status;
-
   /** Time needed to finish the level, only valid if status == FINISHED */
   int needed_time;
 
   /** Number of Pingus that where saved while playing the level */
   int saved_pingus;
 
+public:
+  static std::string status_to_string(S_Status s);
+  static S_Status string_to_status (std::string s);
+
   Savegame();
   ~Savegame() { }
   Savegame(FileReader node);
-  Savegame(std::string arg_levelname, S_Status arg_status, int arg_time, int 
arg_saved_pingus);
+  Savegame(const std::string& filename, 
+           S_Status arg_status, int arg_time, int arg_saved_pingus);
 
   void read_sexpr(FileReader node);
   void write_sexpr(SExprFileWriter& xml);
+
+  std::string get_filename() const { return filename; }
+
+  S_Status get_status() const { return status; }
+
+  int get_needed_time() const  { return needed_time;  }
+  int get_saved_pingus() const { return saved_pingus; }
 };
 
 

Modified: trunk/pingus/src/savegame_manager.cpp
===================================================================
--- trunk/pingus/src/savegame_manager.cpp       2007-10-25 04:58:15 UTC (rev 
3327)
+++ trunk/pingus/src/savegame_manager.cpp       2007-10-26 04:19:25 UTC (rev 
3328)
@@ -49,13 +49,16 @@
 {
   boost::shared_ptr<lisp::Lisp> sexpr;
 
-  try {
-    sexpr = lisp::Parser::parse(filename);
-  }
-  catch (const std::runtime_error& e) {
-    std::cerr << "SavegameManager: " << e.what() << std::endl;
-    return;
-  }
+  try 
+    {
+      sexpr = lisp::Parser::parse(filename);
+    }
+  catch (const std::runtime_error& e) 
+    {
+      std::cerr << "SavegameManager: " << e.what() << std::endl;
+      return;
+    }
+
   if (!sexpr)
     {
       std::cerr << "SavegameManager: Couldn't find savegame file '" <<
@@ -75,18 +78,16 @@
       i != sections.end(); ++i)
     {
       Savegame* savegame = new Savegame(*i);
-      SavegameTable::iterator j = savegames.find(savegame->levelname);
-
+      SavegameTable::iterator j = find(savegame->get_filename());
       if (j != savegames.end())
-        {
-          std::cout << "SavegameManager: name collision: " << 
savegame->levelname << std::endl;
-          delete j->second;
-          j->second = savegame;
+        { // overwrite duplicates, shouldn't happen, but harmless
+          std::cout << "SavegameManager: name collision: " << 
savegame->get_filename() << std::endl;
+          delete *j;
+          *j = savegame;
         }
       else
         {
-          //std::cout << "SavegameManager: Loading savegame for: " << 
savegame->levelname << std::endl;
-          savegames[savegame->levelname] = savegame;
+          savegames.push_back(savegame);
         }
     }
 }
@@ -94,64 +95,72 @@
 SavegameManager::~SavegameManager()
 {
   for (SavegameTable::iterator i =  savegames.begin(); i !=  savegames.end (); 
++i)
-    delete i->second;
+    delete *i;
 }
 
 Savegame*
-SavegameManager::get(const std::string& levelname)
+SavegameManager::get(const std::string& filename)
 {
-  SavegameTable::iterator i = savegames.find(levelname);
+  SavegameTable::iterator i = find(filename);
   if (i == savegames.end())
-    {
-      return 0;
-    }
+    return 0;
   else
-    {
-      return i->second;
-    }
+    return *i;
 }
 
 void
 SavegameManager::store(Savegame& arg_savegame)
 {
   Savegame* savegame = new Savegame(arg_savegame);
-  SavegameTable::iterator i = savegames.find(savegame->levelname);
+  SavegameTable::iterator i = find(savegame->get_filename());
   if (i == savegames.end())
-    {
-      savegames[savegame->levelname] = savegame;
+    { // don't know anything about the savegame
+      savegames.push_back(savegame);
     }
   else
-    {
-      if (i->second->status == Savegame::FINISHED
-          && savegame->status == Savegame::ACCESSIBLE)
-        { // saved game is better then new game
+    { // already have such a savegame
+      if ((*i)->get_status() == Savegame::FINISHED
+          && savegame->get_status() == Savegame::ACCESSIBLE)
+        { // saved savegame is better then new game
           delete savegame;
         }
       else
         { // new game is better or equal, save it
-          delete i->second;
-          i->second = savegame;
+          delete *i;
+          *i = savegame;
         }
     }
 
   flush();
 }
 
+SavegameManager::SavegameTable::iterator
+SavegameManager::find(const std::string& filename)
+{
+  std::cout << "SavegameManager::find: \"" << filename << "\"" << std::endl;
+
+  for(SavegameTable::iterator i = savegames.begin();
+      i != savegames.end(); ++i)
+    if ((*i)->get_filename() == filename)
+      return i;
+
+  return savegames.end();
+}
+
 void
 SavegameManager::flush()
 {
   std::ofstream out(filename.c_str());
-  SExprFileWriter sfw(out);
+  SExprFileWriter writer(out);
 
-  sfw.begin_section("pingus-savegame");
+  writer.begin_section("pingus-savegame");
 
   for(SavegameTable::iterator i = savegames.begin(); i != savegames.end(); ++i)
     {
-      assert(i->second);
-      i->second->write_sexpr(sfw);
+      (*i)->write_sexpr(writer);
     }
 
-  sfw.end_section();   // pingus-savegame
+  writer.end_section();        // pingus-savegame
 }
 
 

Modified: trunk/pingus/src/savegame_manager.hpp
===================================================================
--- trunk/pingus/src/savegame_manager.hpp       2007-10-25 04:58:15 UTC (rev 
3327)
+++ trunk/pingus/src/savegame_manager.hpp       2007-10-26 04:19:25 UTC (rev 
3328)
@@ -29,21 +29,26 @@
 {
 private:
   static SavegameManager* instance_;
-  typedef std::map<std::string, Savegame*> SavegameTable;
+  typedef std::vector<Savegame*> SavegameTable;
 
-  std::string filename;
+  std::string   filename;
   SavegameTable savegames;
+
+  SavegameTable::iterator find(const std::string& filename);
+
 public:
   static SavegameManager* instance();
   static void deinit();
   SavegameManager(const std::string& filename);
   ~SavegameManager();
 
-  Savegame* get(const std::string& levelname);
+  Savegame* get(const std::string& filename);
+                
   void store(Savegame&);
 
   /** Write the current savegames down to file */
   void flush();
+
 private:
   SavegameManager (const SavegameManager&);
   SavegameManager& operator= (const SavegameManager&);

Modified: trunk/pingus/src/worldmap/level_dot.cpp
===================================================================
--- trunk/pingus/src/worldmap/level_dot.cpp     2007-10-25 04:58:15 UTC (rev 
3327)
+++ trunk/pingus/src/worldmap/level_dot.cpp     2007-10-26 04:19:25 UTC (rev 
3328)
@@ -50,7 +50,6 @@
   reader.read_string("levelname", resname); 
 
   plf = PLFResMgr::load_plf(resname);
-  levelname = plf.get_levelname();
 }
 
 void
@@ -67,12 +66,12 @@
   if (sqrt(x*x + y*y) < 30.0f)
     highlight = true;
 
-  Savegame* savegame = SavegameManager::instance()->get(levelname);
+  Savegame* savegame = SavegameManager::instance()->get(plf.get_resname());
   if (savegame
-      && (savegame->status == Savegame::FINISHED
-          || savegame->status == Savegame::ACCESSIBLE))
+      && (savegame->get_status() == Savegame::FINISHED
+          || savegame->get_status() == Savegame::ACCESSIBLE))
     {
-      if (savegame->status == Savegame::FINISHED)
+      if (savegame->get_status() == Savegame::FINISHED)
         if (highlight)
           {
             gc.draw (highlight_green_dot_sur, pos);
@@ -110,8 +109,8 @@
 bool
 LevelDot::finished()
 {
-  Savegame* savegame = SavegameManager::instance()->get(levelname);
-  if (savegame && savegame->status == Savegame::FINISHED)
+  Savegame* savegame = SavegameManager::instance()->get(plf.get_resname());
+  if (savegame && savegame->get_status() == Savegame::FINISHED)
     return true;
   else
     return false;
@@ -120,8 +119,8 @@
 bool
 LevelDot::accessible()
 {
-  Savegame* savegame = SavegameManager::instance()->get(levelname);
-  if (savegame && savegame->status != Savegame::NONE)
+  Savegame* savegame = SavegameManager::instance()->get(plf.get_resname());
+  if (savegame && savegame->get_status() != Savegame::NONE)
     return true;
   else
     return false;
@@ -176,12 +175,13 @@
 void
 LevelDot::unlock()
 {
-  Savegame* savegame = SavegameManager::instance()->get(levelname);
-  if (savegame == 0 || savegame->status == Savegame::NONE)
+  Savegame* savegame = SavegameManager::instance()->get(plf.get_resname());
+  if (savegame == 0 || savegame->get_status() == Savegame::NONE)
     {
-      Savegame savegame;
-      savegame.status = Savegame::ACCESSIBLE;
-      savegame.levelname = levelname;
+      Savegame savegame(plf.get_resname(),
+                        Savegame::ACCESSIBLE,
+                        0,
+                        0);
       SavegameManager::instance()->store(savegame);
     }
   else

Modified: trunk/pingus/src/worldmap/level_dot.hpp
===================================================================
--- trunk/pingus/src/worldmap/level_dot.hpp     2007-10-25 04:58:15 UTC (rev 
3327)
+++ trunk/pingus/src/worldmap/level_dot.hpp     2007-10-26 04:19:25 UTC (rev 
3328)
@@ -36,7 +36,6 @@
   Sprite highlight_green_dot_sur;
   Sprite highlight_red_dot_sur;
 
-  std::string levelname;
   PingusLevel plf;
 
 public:





reply via email to

[Prev in Thread] Current Thread [Next in Thread]