[Top][All Lists]
[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:
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Pingus-CVS] r3328 - in trunk/pingus/src: . worldmap,
grumbel at BerliOS <=