[Widelands-cvs] widelands/src game_cmd_queue_data_packet.cc,NONE,1.1 game_cmd_queue_data_packet.h,NO
Status: Beta
Brought to you by:
sirver
Update of /cvsroot/widelands/widelands/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10298/src Modified Files: IntPlayer.cc IntPlayer.h cmd_queue.h editor_game_base.h game.cc game.h game_saver.cc game_saver.h interactive_base.h main.cc player.cc player.h widelands_map_bobdata_data_packet.cc Added Files: game_cmd_queue_data_packet.cc game_cmd_queue_data_packet.h game_data_packet.cc game_data_packet.h game_data_packet_factory.cc game_data_packet_factory.h game_data_packet_ids.h game_game_class_data_packet.cc game_game_class_data_packet.h game_interactive_player_data_packet.cc game_interactive_player_data_packet.h game_loader.cc game_loader.h game_main_menu_load_game.cc game_main_menu_load_game.h game_main_menu_save_game.cc game_main_menu_save_game.h game_map_data_packet.cc game_map_data_packet.h game_player_economies_data_packet.cc game_player_economies_data_packet.h game_player_info_data_packet.cc game_player_info_data_packet.h game_preload_data_packet.cc game_preload_data_packet.h Log Message: ! This commit invalidates your old SaveGames - beautified Save/Load game dialog boxes in-game - Games are now saved in ssave (single-player saves) - saving/loading is cleaned up a bit (in code and in file) * implemented backwards compatible infrastructure ! Note: Format is still not frozen and likely to change again. - Loading works from single player menu (no longer not-implemented message) - Interactive Player Data is now saved too (e.g. scrollposition) Index: editor_game_base.h =================================================================== RCS file: /cvsroot/widelands/widelands/src/editor_game_base.h,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- editor_game_base.h 9 Oct 2004 15:21:53 -0000 1.25 +++ editor_game_base.h 11 Oct 2004 21:52:31 -0000 1.26 @@ -41,7 +41,7 @@ class Editor_Game_Base { friend class Interactive_Base; - friend class Game_Saver; + friend class Game_Game_Class_Data_Packet; public: Editor_Game_Base(); --- NEW FILE: game_loader.h --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef __S__GAME_LOADER_H #define __S__GAME_LOADER_H #include <string> #include "wexception.h" class Game; class FileRead; class Widelands_Map_Map_Object_Loader; class Game_Preload_Data_Packet; /* * This class reads a complete state * of a game out to a file. */ class Game_Loader { public: Game_Loader(const char* filename, Game* game); ~Game_Loader(void); int preload_game(Game_Preload_Data_Packet*); int load_game(void); private: std::string m_filename; Game* m_game; }; #endif --- NEW FILE: game_player_info_data_packet.cc --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "game.h" #include "game_player_info_data_packet.h" #include "IntPlayer.h" #include "player.h" #include "tribe.h" #define CURRENT_PACKET_VERSION 1 /* * Destructor */ Game_Player_Info_Data_Packet::~Game_Player_Info_Data_Packet(void) { } /* * Read Function */ void Game_Player_Info_Data_Packet::Read(FileRead* fr, Game* game, Widelands_Map_Map_Object_Loader*) throw(wexception) { // read packet version int packet_version=fr->Unsigned16(); if(packet_version==CURRENT_PACKET_VERSION) { uint max_players = fr->Unsigned16(); for(uint i=1; i<=max_players; i++) { game->remove_player(i); if(fr->Unsigned8()) { bool see_all = fr->Unsigned8(); int type = fr->Signed32(); int plnum = fr->Signed32(); std::string tribe = fr->CString(); RGBColor rgb[4]; for(uint i=0; i<4; i++) { uchar r = fr->Unsigned8(); uchar g = fr->Unsigned8(); uchar b = fr->Unsigned8(); rgb[i].set(r,g,b); } std::string name = fr->CString(); game->add_player(plnum, type, tribe.c_str(), name.c_str()); Player* plr = game->get_player(plnum); plr->set_see_all(see_all); for(uint i=0; i<4; i++) plr->m_playercolor[i] = rgb[i]; // TODO: create computer players here if(type == Player::playerLocal) { // The interactive player might still be in existance // we do not delete it then, we reuse it if(!game->ipl) { game->ipl = new Interactive_Player(game, plnum); game->set_iabase(game->ipl); } } } } // DONE return; } else throw wexception("Unknown version in Game_Player_Info_Data_Packet: %i\n", packet_version); assert(0); // never here } /* * Write Function */ void Game_Player_Info_Data_Packet::Write(FileWrite* fw, Game* game, Widelands_Map_Map_Object_Saver*) throw(wexception) { // First, id fw->Unsigned16(PACKET_PLAYER_INFO_DATA); // Now packet version fw->Unsigned16(CURRENT_PACKET_VERSION); // Number of (potential) players fw->Unsigned16(game->get_map()->get_nrplayers()); for(uint i=1; i<=game->get_map()->get_nrplayers(); i++) { Player* plr = game->get_player(i); if(!plr) { fw->Unsigned8(0); continue; } // Player is in game fw->Unsigned8(1); fw->Unsigned8(plr->m_see_all); fw->Signed32(plr->m_type); fw->Signed32(plr->m_plnum); fw->CString(plr->m_tribe->get_name()); for(uint i=0; i<4; i++) { fw->Unsigned8(plr->m_playercolor[i].r()); fw->Unsigned8(plr->m_playercolor[i].g()); fw->Unsigned8(plr->m_playercolor[i].b()); } // Seen fields is in a map packet // Allowed buildings is in a map packet // Economies are in a packet after map loading fw->CString(plr->m_name.c_str()); } } --- NEW FILE: game_data_packet.cc --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "game_data_packet.h" // NOTHING HERE, all in header --- NEW FILE: game_data_packet_ids.h --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef __S__GAME_DATA_PACKET_IDS_H #define __S__GAME_DATA_PACKET_IDS_H /* * This file contains the ids (the magic bytes) of all data packets * so that the packet creation fabric can create the right packet * reader, all IDs are ushorts */ #define PACKET_GAME_CLASS_DATA 1 #define PACKET_PLAYER_INFO_DATA 2 #define PACKET_MAP_DATA 3 #define PACKET_PLAYER_ECONOMIES_DATA 4 #define PACKET_CMD_QUEUE_DATA 5 #define PACKET_INTERACTIVE_PLAYER_DATA 6 #define PACKET_END_OF_GAME_DATA 254 #endif Index: player.cc =================================================================== RCS file: /cvsroot/widelands/widelands/src/player.cc,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- player.cc 7 Oct 2004 22:38:20 -0000 1.48 +++ player.cc 11 Oct 2004 21:52:34 -0000 1.49 @@ -49,6 +49,10 @@ m_allowed_buildings.resize(m_tribe->get_nrbuildings()); for(i=0; i<m_tribe->get_nrbuildings(); i++) m_allowed_buildings[i]=true; + + // Resize the visibility array, so that it is large enough + // init() will shrink it again + seen_fields.resize(1024*1024); } Player::~Player(void) @@ -69,7 +73,6 @@ { Map *map = game->get_map(); - seen_fields.resize(0); seen_fields.resize(map->get_width()*map->get_height(), false); // place the HQ Index: IntPlayer.h =================================================================== RCS file: /cvsroot/widelands/widelands/src/IntPlayer.h,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- IntPlayer.h 7 Oct 2004 21:39:40 -0000 1.33 +++ IntPlayer.h 11 Oct 2004 21:52:31 -0000 1.34 @@ -38,7 +38,9 @@ * cares for input and so on. */ class Interactive_Player : public Interactive_Base { - public: + friend class Game_Interactive_Player_Data_Packet; + + public: Interactive_Player(Game *g, uchar pln); ~Interactive_Player(void); Index: game.cc =================================================================== RCS file: /cvsroot/widelands/widelands/src/game.cc,v retrieving revision 1.74 retrieving revision 1.75 diff -u -d -r1.74 -r1.75 --- game.cc 9 Oct 2004 15:21:53 -0000 1.74 +++ game.cc 11 Oct 2004 21:52:31 -0000 1.75 @@ -21,6 +21,7 @@ #include "CompPlayer.h" #include "cmd_queue.h" #include "fullscreen_menu_launchgame.h" +#include "fullscreen_menu_loadgame.h" #include "game.h" #include "graphic.h" #include "player.h" @@ -127,6 +128,25 @@ return run(); } +/* + * Load a game + * argument defines if this is a single player game (true) + * or networked (false) + */ +bool Game::run_load_game(bool is_splayer) { + assert(is_splayer); // TODO: net game saving not supported + + Fullscreen_Menu_LoadGame* ssg = new Fullscreen_Menu_LoadGame(this, true); + int code = ssg->run(); + delete ssg; + + if(code==0) + return false; + + m_state = gs_running; + + return run(true); +} //extern uchar g_playercolors[MAX_PLAYERS][12]; bool Game::run_multi_player (NetGame* ng) @@ -212,54 +232,57 @@ 3. After this has happened, the game graphics are loaded. =============== */ -bool Game::run() +bool Game::run(bool is_savegame) { postload(); - // Prepare the players (i.e. place HQs) - for (int i = 1; i <= get_map()->get_nrplayers(); i++) { - Player* player = get_player(i); - if (!player) - continue; + if(!is_savegame) { + // Prepare the players (i.e. place HQs) + for (int i = 1; i <= get_map()->get_nrplayers(); i++) { + Player* player = get_player(i); + if (!player) + continue; - // TODO: place hq here if needed - player->init(this, true); + player->init(this, true); - const Coords &c = get_map()->get_starting_pos(i); - if (player->get_type() == Player::playerLocal) - ipl->move_view_to(c.x, c.y); - } + const Coords &c = get_map()->get_starting_pos(i); + if (player->get_type() == Player::playerLocal) + ipl->move_view_to(c.x, c.y); + } - // Prepare the map, set default textures - get_map()->recalc_default_resources(); - get_map()->delete_unreferenced_triggers(); - get_map()->delete_events_without_trigger(); + // Prepare the map, set default textures + get_map()->recalc_default_resources(); + get_map()->delete_unreferenced_triggers(); + get_map()->delete_events_without_trigger(); - // Now let all triggers check once, if they are in the right state - for (int i=0; i<get_map()->get_number_of_triggers(); i++) - get_map()->get_trigger(i)->check_set_conditions(this); + // Now let all triggers check once, if they are in the right state + for (int i=0; i<get_map()->get_number_of_triggers(); i++) + get_map()->get_trigger(i)->check_set_conditions(this); - // Finally, set the scenario names and tribes to represent - // the correct names of the players - int curplr; - for(curplr=1; curplr <= get_map()->get_nrplayers(); curplr++) { - Player* plr=get_player(curplr); + // Finally, set the scenario names and tribes to represent + // the correct names of the players + int curplr; + for(curplr=1; curplr <= get_map()->get_nrplayers(); curplr++) { + Player* plr=get_player(curplr); - if(plr) { - get_map()->set_scenario_player_tribe(curplr, plr->get_tribe()->get_name()); - get_map()->set_scenario_player_name(curplr, plr->get_name()); - } else { - get_map()->set_scenario_player_tribe(curplr, ""); - get_map()->set_scenario_player_name(curplr, ""); + if(plr) { + get_map()->set_scenario_player_tribe(curplr, plr->get_tribe()->get_name()); + get_map()->set_scenario_player_name(curplr, plr->get_name()); + } else { + get_map()->set_scenario_player_tribe(curplr, ""); + get_map()->set_scenario_player_name(curplr, ""); + } } - } + + + + // Everything prepared, send the first trigger event + // We lie about the sender here. Hey, what is one lie in a lifetime? + enqueue_command (new Cmd_CheckTrigger(get_gametime(), -1)); + } load_graphics(); - // Everything prepared, send the first trigger event - // We lie about the sender here. Hey, what is one lie in a lifetime? - enqueue_command (new Cmd_CheckTrigger(get_gametime(), -1)); - ipl->run(); get_objects()->cleanup(this); --- NEW FILE: game_game_class_data_packet.cc --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "game.h" #include "game_game_class_data_packet.h" #define CURRENT_PACKET_VERSION 1 /* * Destructor */ Game_Game_Class_Data_Packet::~Game_Game_Class_Data_Packet(void) { } /* * Read Function */ void Game_Game_Class_Data_Packet::Read(FileRead* fr, Game* game, Widelands_Map_Map_Object_Loader*) throw(wexception) { // read packet version int packet_version=fr->Unsigned16(); if(packet_version==CURRENT_PACKET_VERSION) { // Can't load netgames game->m_netgame=0; game->m_state=gs_running; game->m_speed=fr->Signed16(); game->m_gametime=fr->Unsigned32(); game->m_conquer_info.resize(fr->Unsigned16()); for(uint i=0; i<game->m_conquer_info.size(); i++) { game->m_conquer_info[i].player = fr->Unsigned8(); game->m_conquer_info[i].middle_point.x = fr->Unsigned16(); game->m_conquer_info[i].middle_point.y = fr->Unsigned16(); game->m_conquer_info[i].area = fr->Unsigned16(); } // DONE return; } else throw wexception("Unknown version in Game_Game_Class_Data_Packet: %i\n", packet_version); assert(0); // never here } /* * Write Function */ void Game_Game_Class_Data_Packet::Write(FileWrite* fw, Game* game, Widelands_Map_Map_Object_Saver*) throw(wexception) { // First, id fw->Unsigned16(PACKET_GAME_CLASS_DATA); // Now packet version fw->Unsigned16(CURRENT_PACKET_VERSION); // Can't save netgames (TODO) assert(!game->m_netgame); // State is running, we do not need to save this // Save speed fw->Signed16(game->m_speed); // From the interactive player, is saved somewhere else // Computer players are saved somewhere else // CMD Queue is saved later // We do not care for real time. // EDITOR GAME CLASS // Write gametime fw->Unsigned32(game->m_gametime); // We do not care for players, since they were set // on game initialization to match Map::scenario_player_[names|tribes] // or vice versa, so this is handled by map loader // Objects are loaded and saved by map // Tribes and wares are handled by map // Interactive_Base doesn't need saving // Map is handled by map saving // Track pointers are not saved in save games // Conquer info fw->Unsigned16(game->m_conquer_info.size()); for(uint i=0; i<game->m_conquer_info.size(); i++) { fw->Unsigned8(game->m_conquer_info[i].player); fw->Unsigned16(game->m_conquer_info[i].middle_point.x); fw->Unsigned16(game->m_conquer_info[i].middle_point.y); fw->Unsigned16(game->m_conquer_info[i].area); } } --- NEW FILE: game_interactive_player_data_packet.cc --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "game.h" #include "game_interactive_player_data_packet.h" #include "IntPlayer.h" #include "mapview.h" #include "overlay_manager.h" #define CURRENT_PACKET_VERSION 1 // Forward declaration. Defined in IntPlayer.cc int Int_Player_overlay_callback_function(FCoords& fc, void* data, int); /* * Destructor */ Game_Interactive_Player_Data_Packet::~Game_Interactive_Player_Data_Packet(void) { } /* * Read Function */ void Game_Interactive_Player_Data_Packet::Read(FileRead* fr, Game* game, Widelands_Map_Map_Object_Loader*) throw(wexception) { // read packet version int packet_version=fr->Unsigned16(); if(packet_version==CURRENT_PACKET_VERSION) { Interactive_Player* plr = game->get_ipl(); plr->m_player_number = fr->Unsigned8(); // Main Menu is not closed if(plr->m_fieldaction.window) { delete plr->m_fieldaction.window; plr->m_fieldaction.window = 0; } // Map Position int x = fr->Unsigned16(); int y = fr->Unsigned16(); plr->m_mapview->set_viewpoint(Point(x,y)); plr->m_display_flags = fr->Unsigned32(); if(plr->m_minimap.window) { delete plr->m_minimap.window; plr->m_minimap.window = 0; } // Now only restore the callback functions. assumes, map is already loaded game->get_map()->get_overlay_manager()->show_buildhelp(false); game->get_map()->get_overlay_manager()->register_overlay_callback_function(&Int_Player_overlay_callback_function, static_cast<void*>(plr)); game->get_map()->recalc_whole_map(); // DONE return; } else throw wexception("Unknown version in Game_Interactive_Player_Data_Packet: %i\n", packet_version); assert(0); // never here } /* * Write Function */ void Game_Interactive_Player_Data_Packet::Write(FileWrite* fw, Game* game, Widelands_Map_Map_Object_Saver*) throw(wexception) { // First, id fw->Unsigned16(PACKET_INTERACTIVE_PLAYER_DATA); // Now packet version fw->Unsigned16(CURRENT_PACKET_VERSION); Interactive_Player* plr = game->get_ipl(); // Player number fw->Unsigned8(plr->get_player_number()); // Map Position fw->Unsigned16(plr->m_mapview->get_viewpoint().x); fw->Unsigned16(plr->m_mapview->get_viewpoint().y); // Display flags fw->Unsigned32(plr->m_display_flags); } Index: interactive_base.h =================================================================== RCS file: /cvsroot/widelands/widelands/src/interactive_base.h,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- interactive_base.h 7 Oct 2004 21:39:56 -0000 1.25 +++ interactive_base.h 11 Oct 2004 21:52:34 -0000 1.26 @@ -39,7 +39,9 @@ * Editor_Interactive share. */ class Interactive_Base : public UIPanel { - public: + friend class Game_Interactive_Player_Data_Packet; + + public: enum { dfShowCensus = 1, // show census report on buildings dfShowStatistics = 2, // show statistics report on buildings @@ -75,7 +77,6 @@ virtual void start() = 0; - // Display flags uint get_display_flags(); void set_display_flags(uint flags); Index: game.h =================================================================== RCS file: /cvsroot/widelands/widelands/src/game.h,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- game.h 9 Oct 2004 15:21:53 -0000 1.43 +++ game.h 11 Oct 2004 21:52:31 -0000 1.44 @@ -22,6 +22,9 @@ #include "editor_game_base.h" +#define WLGF_SUFFIX ".wgf" +#define WLGF_MAGIC "WLgf" + /** class Game * * This class manages the entire lifetime of a game session, from creating the @@ -45,7 +48,8 @@ class Game : public Editor_Game_Base { friend class Cmd_Queue; // this class handles the commands - friend class Game_Saver; + friend class Game_Game_Class_Data_Packet; + friend class Game_Player_Info_Data_Packet; public: Game(void); @@ -54,6 +58,7 @@ // life cycle bool run_single_player (); bool run_multi_player (NetGame*); + bool run_load_game(bool); void load_map (const char*); @@ -97,9 +102,11 @@ // is this base a game inline bool is_game() { return true; } + Interactive_Player* get_ipl(void) { return ipl; } + private: void init_player_controllers (); - bool run (); + bool run (bool = false); Map_Loader* m_maploader; --- NEW FILE: game_data_packet.h --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef __S__GAME_DATA_PACKET_H #define __S__GAME_DATA_PACKET_H #include "game_data_packet_ids.h" #include "map.h" #include "wexception.h" #include "widelands_map_map_object_saver.h" #include "widelands_map_map_object_loader.h" class FileRead; class FileWrite; class Editor_Game_Base; /* ======================================== This class represents a data packet in a widelands saved game file. it is an abstract base class ======================================== */ class Game_Data_Packet { public: virtual void Read(FileRead*, Game*, Widelands_Map_Map_Object_Loader* = 0) throw(wexception) = 0; virtual void Write(FileWrite*, Game*, Widelands_Map_Map_Object_Saver* = 0) throw(wexception) = 0; }; #endif --- NEW FILE: game_data_packet_factory.h --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef __S__WIDELANDS_MAP_DATA_PACKET_FACTOR_H #define __S__WIDELANDS_MAP_DATA_PACKET_FACTOR_H #include "wexception.h" #include "types.h" class Game_Data_Packet; /* * This factory creates the valid map_data packet * classes. This is usefull to add new Packets without * the need to touch any other code than class */ class Game_Data_Packet_Factory { public: Game_Data_Packet* create_correct_packet(ushort id) throw(wexception); }; #endif --- NEW FILE: game_map_data_packet.h --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef __S__GAME_MAP_DATA_PACKET_H #define __S__GAME_MAP_DATA_PACKET_H #include "game_data_packet.h" class FileRead; class FileWrite; class Game; class Widelands_Map_Saver; class Widelands_Map_Loader; /* * This is just a wrapper around Widelands_Map_Saver and Widelands_Map_Loader */ class Game_Map_Data_Packet : public Game_Data_Packet { public: Game_Map_Data_Packet(void) { m_mos = 0; m_mol = 0; m_wms = 0; m_wml = 0; } virtual ~Game_Map_Data_Packet(); virtual void Read(FileRead*, Game*, Widelands_Map_Map_Object_Loader* = 0) throw(wexception); virtual void Write(FileWrite*, Game*, Widelands_Map_Map_Object_Saver* = 0) throw(wexception); inline Widelands_Map_Map_Object_Saver* get_map_object_saver(void) { return m_mos; } inline Widelands_Map_Map_Object_Loader* get_map_object_loader(void) { return m_mol; } private: Widelands_Map_Map_Object_Saver* m_mos; Widelands_Map_Map_Object_Loader* m_mol; Widelands_Map_Saver* m_wms; Widelands_Map_Loader* m_wml; }; #endif --- NEW FILE: game_interactive_player_data_packet.h --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef __S__GAME_INTERACTIVE_PLAYER_DATA_PACKET_H #define __S__GAME_INTERACTIVE_PLAYER_DATA_PACKET_H #include "game_data_packet.h" class FileRead; class FileWrite; class Game; /* * Informations about the interactive player. Mostly scrollpos, * player number and so on */ class Game_Interactive_Player_Data_Packet : public Game_Data_Packet { public: virtual ~Game_Interactive_Player_Data_Packet(); virtual void Read(FileRead*, Game*, Widelands_Map_Map_Object_Loader* = 0) throw(wexception); virtual void Write(FileWrite*, Game*, Widelands_Map_Map_Object_Saver* = 0) throw(wexception); }; #endif Index: IntPlayer.cc =================================================================== RCS file: /cvsroot/widelands/widelands/src/IntPlayer.cc,v retrieving revision 1.67 retrieving revision 1.68 diff -u -d -r1.67 -r1.68 --- IntPlayer.cc 9 Oct 2004 15:21:53 -0000 1.67 +++ IntPlayer.cc 11 Oct 2004 21:52:30 -0000 1.68 @@ -17,12 +17,14 @@ * */ -#include "IntPlayer.h" #include "building.h" #include "cmd_queue.h" #include "fieldaction.h" #include "font_handler.h" -#include "game_saver.h" +#include "game_loader.h" +#include "game_main_menu_save_game.h" +#include "game_main_menu_load_game.h" +#include "IntPlayer.h" #include "keycodes.h" #include "immovable.h" #include "mapview.h" @@ -33,87 +35,6 @@ #include "ui_unique_window.h" #include "overlay_manager.h" -class Game_Main_Menu_Save_Game : public UIUniqueWindow { - public: - Game_Main_Menu_Save_Game(Interactive_Player* plr, UIUniqueWindowRegistry* registry) ; - virtual ~Game_Main_Menu_Save_Game(void); - - private: - void clicked(int); - Interactive_Player* m_parent; - UIEdit_Box* m_editbox; -}; - -Game_Main_Menu_Save_Game::Game_Main_Menu_Save_Game(Interactive_Player* plr, UIUniqueWindowRegistry* registry) : -UIUniqueWindow(plr,registry,105,140,"Save_Game") { - - m_parent=plr; - - m_editbox=new UIEdit_Box(this, 5, 5, get_inner_w()-10, 20, 0, 0); - - UIButton* b=new UIButton(this, (get_inner_w()-60)/2, get_inner_h()-30, 60, 20, 0, 1); - b->set_title("OK"); - b->clickedid.set(this, &Game_Main_Menu_Save_Game::clicked); - - if(get_usedefaultpos()) - center_to_parent(); -} - -Game_Main_Menu_Save_Game::~Game_Main_Menu_Save_Game(void) { -} - -void Game_Main_Menu_Save_Game::clicked(int) { - std::string t=m_editbox->get_text(); - - if(t.size()) { - Game_Saver gs(m_editbox->get_text(), m_parent->get_game()); - gs.save(); - die(); - } -} - -class Game_Main_Menu_Load_Game : public UIUniqueWindow { - public: - Game_Main_Menu_Load_Game(Interactive_Player* plr, UIUniqueWindowRegistry* registry) ; - virtual ~Game_Main_Menu_Load_Game(void); - - private: - void clicked(int); - Interactive_Player* m_parent; - UIEdit_Box* m_editbox; -}; - -Game_Main_Menu_Load_Game::Game_Main_Menu_Load_Game(Interactive_Player* plr, UIUniqueWindowRegistry* registry) : -UIUniqueWindow(plr,registry,105,140,"Load_Game") { - - m_parent=plr; - - m_editbox=new UIEdit_Box(this, 5, 5, get_inner_w()-10, 20, 0, 0); - - UIButton* b=new UIButton(this, (get_inner_w()-60)/2, get_inner_h()-30, 60, 20, 0, 1); - b->set_title("OK"); - b->clickedid.set(this, &Game_Main_Menu_Load_Game::clicked); - - if(get_usedefaultpos()) - center_to_parent(); -} - -Game_Main_Menu_Load_Game::~Game_Main_Menu_Load_Game(void) { -} - -void Game_Main_Menu_Load_Game::clicked(int) { - std::string t=m_editbox->get_text(); - - if(t.size()) { - m_parent->get_game()->cleanup_for_load(true,true); // TODO: this should really clean up all - // Load Game - Game_Saver gs(m_editbox->get_text(), m_parent->get_game()); - gs.load(); - m_parent->get_game()->postload(); - m_parent->get_game()->load_graphics(); - die(); - } -} /* ============================================================================== Index: game_saver.h =================================================================== RCS file: /cvsroot/widelands/widelands/src/game_saver.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- game_saver.h 7 Oct 2004 21:39:56 -0000 1.1 +++ game_saver.h 11 Oct 2004 21:52:34 -0000 1.2 @@ -43,13 +43,8 @@ ~Game_Saver(void); void save(void) throw(wexception); - void load(void) throw(wexception); private: - void save_game_class(FileWrite*) throw(wexception); - void save_cmd_queue_class(FileWrite*, Widelands_Map_Map_Object_Saver*) throw(wexception); - void load_game_class(FileRead *) throw(wexception); - void load_cmd_queue_class(FileRead *, Widelands_Map_Map_Object_Loader*) throw(wexception); std::string m_filename; Game* m_game; }; --- NEW FILE: game_main_menu_load_game.cc --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "game.h" #include "game_loader.h" #include "game_main_menu_load_game.h" #include "game_preload_data_packet.h" #include "game_loader.h" #include "IntPlayer.h" #include "ui_button.h" #include "ui_listselect.h" #include "ui_modal_messagebox.h" #include "ui_textarea.h" /* =============== Game_Main_Menu_Load_Game::Game_Main_Menu_Load_Game Create all the buttons etc... =============== */ Game_Main_Menu_Load_Game::Game_Main_Menu_Load_Game(Interactive_Player* parent, UIUniqueWindowRegistry* registry) : UIUniqueWindow(parent,registry,400,270,"Load Game") { m_parent=parent; // Caption UITextarea* tt=new UITextarea(this, 0, 0, "Load Game", Align_Left); tt->set_pos((get_inner_w()-tt->get_w())/2, 5); int spacing=5; int offsx=spacing; int offsy=30; int posx=offsx; int posy=offsy; // listselect m_ls=new UIListselect(this, posx, posy, get_inner_w()/2-spacing, get_inner_h()-spacing-offsy-60); m_ls->selected.set(this, &Game_Main_Menu_Load_Game::selected); m_ls->double_clicked.set(this, &Game_Main_Menu_Load_Game::double_clicked); // the descriptive areas // Name posx=get_inner_w()/2+spacing; posy+=20; new UITextarea(this, posx, posy, 150, 20, "Map Name: ", Align_CenterLeft); m_name=new UITextarea(this, posx+90, posy, 200, 20, "---", Align_CenterLeft); posy+=20+spacing; // Author new UITextarea(this, posx, posy, 150, 20, "Game Time: ", Align_CenterLeft); m_gametime=new UITextarea(this, posx+90, posy, 200, 20, "---", Align_CenterLeft); posy+=20+spacing; // Buttons posx=5; posy=get_inner_h()-30; UIButton* but= new UIButton(this, get_inner_w()/2-spacing-80, posy, 80, 20, 0, 1); but->clickedid.set(this, &Game_Main_Menu_Load_Game::clicked); but->set_title("OK"); but->set_enabled(false); m_ok_btn=but; but= new UIButton(this, get_inner_w()/2+spacing, posy, 80, 20, 1, 0); but->clickedid.set(this, &Game_Main_Menu_Load_Game::clicked); but->set_title("Cancel"); m_basedir="ssave"; m_curdir="ssave"; fill_list(); center_to_parent(); move_to_top(); } /* =============== Game_Main_Menu_Load_Game::~Game_Main_Menu_Load_Game Unregister from the registry pointer =============== */ Game_Main_Menu_Load_Game::~Game_Main_Menu_Load_Game() { } /* =========== called when the ok button has been clicked =========== */ void Game_Main_Menu_Load_Game::clicked(int id) { if(id==1) { // Ok // Maybe a dir is selected std::string filename=static_cast<const char*>(m_ls->get_selection()); // Ok, load this map if(load_game(filename)) die(); } else if(id==0) { // Cancel die(); } } /* * called when a item is selected */ void Game_Main_Menu_Load_Game::selected(int i) { const char* name=static_cast<const char*>(m_ls->get_selection()); if(!g_fs->IsDirectory(name)) { Game_Loader gl(name, m_parent->get_game()); Game_Preload_Data_Packet gpdp; gl.preload_game(&gpdp); // This has worked before, no problem m_ok_btn->set_enabled(true); m_name->set_text(gpdp.get_mapname()); char buf[200]; uint gametime = gpdp.get_gametime(); int hours = gametime / 3600000; gametime -= hours * 3600000; int minutes = gametime / 60000; sprintf(buf, "%02i:%02i", hours, minutes); m_gametime->set_text(buf); } else { m_name->set_text(""); m_gametime->set_text(""); } } /* * An Item has been doubleclicked */ void Game_Main_Menu_Load_Game::double_clicked(int) { clicked(1); } /* * fill the file list */ void Game_Main_Menu_Load_Game::fill_list(void) { // Fill it with all files we find. g_fs->FindFiles(m_curdir, "*", &m_gamefiles, 1); Game_Preload_Data_Packet gpdp; for(filenameset_t::iterator pname = m_gamefiles.begin(); pname != m_gamefiles.end(); pname++) { const char *name = pname->c_str(); Game_Loader* gl = new Game_Loader(name,m_parent->get_game()); try { gl->preload_game(&gpdp); char* fname = strdup(FS_Filename(name)); FS_StripExtension(fname); m_ls->add_entry(fname, reinterpret_cast<void*>(const_cast<char*>(name))); free(fname); } catch(wexception& ) { // we simply skip illegal entries } delete gl; } if(m_ls->get_nr_entries()) m_ls->select(0); } /* * The editbox was changed. Enable ok button */ void Game_Main_Menu_Load_Game::edit_box_changed(void) { m_ok_btn->set_enabled(true); } /* * Load the game * * returns true if dialog should close, false if it * should stay open */ bool Game_Main_Menu_Load_Game::load_game(std::string filename) { Game_Loader* gl=new Game_Loader(filename.c_str(), m_parent->get_game()); try { m_parent->get_game()->cleanup_for_load(true,true); gl->load_game(); m_parent->get_game()->postload(); m_parent->get_game()->load_graphics(); } catch(std::exception& exe) { std::string s="Game Loading Error!\nReason given:\n"; s+=exe.what(); UIModal_Message_Box* mbox= new UIModal_Message_Box(m_parent, "Load Game Error!!", s, UIModal_Message_Box::OK); mbox->run(); delete mbox; } delete gl; die(); return true; } --- NEW FILE: game_player_economies_data_packet.h --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef __S__GAME_PLAYER_ECONOMIES_DATA_PACKET_H #define __S__GAME_PLAYER_ECONOMIES_DATA_PACKET_H #include "game_data_packet.h" class FileRead; class FileWrite; class Game; /* * how many and which economies does a player have? */ class Game_Player_Economies_Data_Packet : public Game_Data_Packet { public: virtual ~Game_Player_Economies_Data_Packet(); virtual void Read(FileRead*, Game*, Widelands_Map_Map_Object_Loader* = 0) throw(wexception); virtual void Write(FileWrite*, Game*, Widelands_Map_Map_Object_Saver* = 0) throw(wexception); }; #endif Index: player.h =================================================================== RCS file: /cvsroot/widelands/widelands/src/player.h,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- player.h 7 Oct 2004 21:39:56 -0000 1.31 +++ player.h 11 Oct 2004 21:52:34 -0000 1.32 @@ -47,7 +47,8 @@ */ class Player { friend class Editor_Game_Base; - friend class Game_Saver; + friend class Game_Player_Info_Data_Packet; + friend class Game_Player_Economies_Data_Packet; public: enum { --- NEW FILE: game_cmd_queue_data_packet.cc --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "cmd_queue.h" #include "game.h" #include "game_cmd_queue_data_packet.h" #include "queue_cmd_factory.h" #define CURRENT_PACKET_VERSION 1 /* * Destructor */ Game_Cmd_Queue_Data_Packet::~Game_Cmd_Queue_Data_Packet(void) { } /* * Read Function */ void Game_Cmd_Queue_Data_Packet::Read(FileRead* fr, Game* game, Widelands_Map_Map_Object_Loader* mol) throw(wexception) { // read packet version int packet_version=fr->Unsigned16(); if(packet_version==CURRENT_PACKET_VERSION) { Cmd_Queue* cmdq=game->get_cmdqueue(); // nothing to be done for m_game // Next serial cmdq->nextserial=fr->Unsigned32(); // Erase all currently pending commands in the queue while(!cmdq->m_cmds.empty()) cmdq->m_cmds.pop(); // Number of cmds uint ncmds=fr->Unsigned16(); uint i=0; while(i<ncmds) { Cmd_Queue::cmditem item; item.serial=fr->Unsigned32(); uint packet_id=fr->Unsigned16(); log("Creating queue command for id: %i (serial: %li) ... ", packet_id, item.serial); BaseCommand* cmd=Queue_Cmd_Factory::create_correct_queue_command(packet_id); cmd->Read(fr, game, mol); log("done\n"); item.cmd=cmd; cmdq->m_cmds.push(item); ++i; } // DONE return; } else throw wexception("Unknown version in Game_Cmd_Queue_Data_Packet: %i\n", packet_version); assert(0); // never here } /* * Write Function */ void Game_Cmd_Queue_Data_Packet::Write(FileWrite* fw, Game* game, Widelands_Map_Map_Object_Saver* mos) throw(wexception) { // First, id fw->Unsigned16(PACKET_CMD_QUEUE_DATA); // Now packet version fw->Unsigned16(CURRENT_PACKET_VERSION); Cmd_Queue* cmdq=game->get_cmdqueue(); // nothing to be done for m_game // Next serial fw->Unsigned32(cmdq->nextserial); // Number of cmds fw->Unsigned16(cmdq->m_cmds.size()); // Write all commands std::priority_queue<Cmd_Queue::cmditem> p; // Make a copy, so we can pop stuff p=cmdq->m_cmds; assert(p.top().serial==cmdq->m_cmds.top().serial); assert(p.top().cmd==cmdq->m_cmds.top().cmd); while(p.size()) { // Serial number fw->Unsigned32(p.top().serial); // Now the id fw->Unsigned16(p.top().cmd->get_id()); // Now the command itself p.top().cmd->Write(fw, game, mos); // DONE: next command p.pop(); } } --- NEW FILE: game_cmd_queue_data_packet.h --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef __S__GAME_CMD_QUEUE_DATA_PACKET_H #define __S__GAME_CMD_QUEUE_DATA_PACKET_H #include "game_data_packet.h" class FileRead; class FileWrite; class Game; /* * This contains all the preload data needed to identify * a game for a user (for example in a listbox) */ class Game_Cmd_Queue_Data_Packet : public Game_Data_Packet { public: virtual ~Game_Cmd_Queue_Data_Packet(); virtual void Read(FileRead*, Game*, Widelands_Map_Map_Object_Loader* = 0) throw(wexception); virtual void Write(FileWrite*, Game*, Widelands_Map_Map_Object_Saver* = 0) throw(wexception); }; #endif Index: game_saver.cc =================================================================== RCS file: /cvsroot/widelands/widelands/src/game_saver.cc,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- game_saver.cc 9 Oct 2004 15:21:53 -0000 1.2 +++ game_saver.cc 11 Oct 2004 21:52:34 -0000 1.3 @@ -29,9 +29,15 @@ #include "widelands_map_saver.h" #include "widelands_map_loader.h" +#include "game_cmd_queue_data_packet.h" +#include "game_data_packet_ids.h" +#include "game_game_class_data_packet.h" +#include "game_map_data_packet.h" +#include "game_preload_data_packet.h" +#include "game_interactive_player_data_packet.h" +#include "game_player_economies_data_packet.h" +#include "game_player_info_data_packet.h" -// Forward declaration. Defined in IntPlayer.cc -int Int_Player_overlay_callback_function(FCoords& fc, void* data, int); /* * Game Saver, creation and destruction @@ -49,143 +55,57 @@ */ void Game_Saver::save(void) throw(wexception) { FileWrite fw; - Widelands_Map_Map_Object_Saver* m_mos; + Game_Data_Packet* gp; + Game_Map_Data_Packet* gmdp; - // First of all, save some kind of header. - fw.Unsigned32(m_game->get_gametime()); // Time in milliseconds of elapsed game time (without pauses) - fw.CString(m_game->get_map()->get_name()); // Name of map - - // Now write the game - save_game_class(&fw); - - // Now Write the map as it would be a normal map saving - Widelands_Map_Saver wms(&fw, m_game); - wms.save(); - m_mos=wms.get_map_object_saver(); + log("Game: Writing Preload Data ... "); + gp = new Game_Preload_Data_Packet(); + gp->Write(&fw, m_game, 0); + delete gp; + log(" done\n"); - log(" Writing Player Economies!"); - bool done=false; - for(uint i=1; i<=m_game->get_map()->get_nrplayers(); i++) { - Player* plr=m_game->get_player(i); - if(!plr) continue; - fw.Unsigned16(plr->m_economies.size()); - for(uint j=0; j<plr->m_economies.size(); j++) { - done=false; - // Walk the map so that we find a representant - Map* map=m_game->get_map(); - for(ushort y=0; y<map->get_height(); y++) { - for(ushort x=0; x<map->get_width(); x++) { - BaseImmovable* imm=map->get_field(Coords(x,y))->get_immovable(); - if(!imm) continue; + log("Game: Writing Game Class Data ... "); + gp = new Game_Game_Class_Data_Packet(); + gp->Write(&fw, m_game, 0); + delete gp; + log(" done\n"); - if(imm->get_type()==Map_Object::FLAG) { - Flag* flag=static_cast<Flag*>(imm); - if(flag->get_economy() == plr->m_economies[j]) { - fw.Unsigned16(x); - fw.Unsigned16(y); - done=true; - } - } - if(done) break; - } - if(done) break; - } - if(done) continue; - } - } - - // Now write the command queue - log(" Writing cmd_queue!\n"); - save_cmd_queue_class(&fw, m_mos); + log("Game: Writing Player Info ... "); + gp = new Game_Player_Info_Data_Packet(); + gp->Write(&fw, m_game, 0); + delete gp; + log(" done\n"); - fw.Write(g_fs, m_filename.c_str()); -} - -/* - * Saves all data concerning the game class - */ -void Game_Saver::save_game_class(FileWrite* fw) throw(wexception) { - // GAME CLASS - // Can't save netgames - assert(!m_game->m_netgame); - - // State is running, we do not need to save this - // Save speed - fw->Signed16(m_game->m_speed); - - // From the interactive player, we only - // need the player number - fw->Unsigned8(m_game->ipl->get_player_number()); - - // WE DO NOT SAVE COMPUTER PLAYERS AT THE MOMENT // TODO - - // CMD Queue is saved later - // We do not care for real time. + log("Game: Writing Map Data!\n"); + gmdp = new Game_Map_Data_Packet(); + gmdp->Write(&fw, m_game, 0); + Widelands_Map_Map_Object_Saver *mos = gmdp->get_map_object_saver(); + log("Game: Writing Map Data done!\n"); - // EDITOR GAME CLASS - // Write gametime - fw->Unsigned32(m_game->m_gametime); - - // We do not care for players, since they were set - // on game initialization to match Map::scenario_player_[names|tribes] - // or vice versa, so this is handled by map loader - - // Objects are loaded and saved by map + log("Game: Writing Player Economies Info ... "); + gp = new Game_Player_Economies_Data_Packet(); + gp->Write(&fw, m_game, mos); + delete gp; + log(" done\n"); - // Tribes and wares are handled by map - // Interactive_Base doesn't need saving - - // Map is handled by map saving + log("Game: Writing Command Queue Data ... "); + gp = new Game_Cmd_Queue_Data_Packet(); + gp->Write(&fw, m_game, mos); + delete gp; + log(" done\n"); + + log("Game: Writing Interactive Player Data ... "); + gp = new Game_Interactive_Player_Data_Packet(); + gp->Write(&fw, m_game, mos); + delete gp; + log(" done\n"); - // Track pointers are not saved in save games + delete gmdp; // Deletes our map object saver - // Conquer info - fw->Unsigned16(m_game->m_conquer_info.size()); - for(uint i=0; i<m_game->m_conquer_info.size(); i++) { - fw->Unsigned8(m_game->m_conquer_info[i].player); - fw->Unsigned16(m_game->m_conquer_info[i].middle_point.x); - fw->Unsigned16(m_game->m_conquer_info[i].middle_point.y); - fw->Unsigned16(m_game->m_conquer_info[i].area); - } + fw.Write(g_fs, m_filename.c_str()); } /* - * Saves all data concerning the cmd_queue class - */ -void Game_Saver::save_cmd_queue_class(FileWrite* fw, Widelands_Map_Map_Object_Saver* mos) throw(wexception) { - Cmd_Queue* cmdq=m_game->get_cmdqueue(); - - // nothing to be done for m_game - - // Next serial - fw->Unsigned32(cmdq->nextserial); - - // Number of cmds - fw->Unsigned16(cmdq->m_cmds.size()); - - // Write all commands - std::priority_queue<Cmd_Queue::cmditem> p; - - // Make a copy, so we can pop stuff - p=cmdq->m_cmds; - - assert(p.top().serial==cmdq->m_cmds.top().serial); - assert(p.top().cmd==cmdq->m_cmds.top().cmd); - - while(p.size()) { - // Serial number - fw->Unsigned32(p.top().serial); - - // Now the id - fw->Unsigned16(p.top().cmd->get_id()); - - // Now the command itself - p.top().cmd->Write(fw, m_game, mos); - // DONE: next command - p.pop(); - } -} - void Game_Saver::load(void) throw (wexception) { FileRead fr; Widelands_Map_Map_Object_Loader* m_mol; @@ -263,88 +183,5 @@ load_cmd_queue_class(&fr, m_mol); ALIVE(); - - m_game->get_map()->get_overlay_manager()->show_buildhelp(false); - m_game->get_map()->get_overlay_manager()->register_overlay_callback_function(&Int_Player_overlay_callback_function, static_cast<void*>(m_game->ipl)); - - m_game->get_map()->recalc_whole_map(); - -} - -void Game_Saver::load_cmd_queue_class(FileRead* fr, Widelands_Map_Map_Object_Loader* mol) throw (wexception) { - Cmd_Queue* cmdq=m_game->get_cmdqueue(); - - // nothing to be done for m_game - - // Next serial - cmdq->nextserial=fr->Unsigned32(); - - // Erase all currently pending commands in the queue - while(!cmdq->m_cmds.empty()) - cmdq->m_cmds.pop(); - - // Number of cmds - uint ncmds=fr->Unsigned16(); - - uint i=0; - while(i<ncmds) { - Cmd_Queue::cmditem item; - item.serial=fr->Unsigned32(); - - uint packet_id=fr->Unsigned16(); - log("Creating queue command for id: %i (serial: %li) ... ", packet_id, item.serial); - BaseCommand* cmd=Queue_Cmd_Factory::create_correct_queue_command(packet_id); - cmd->Read(fr, m_game, mol); - log("done\n"); - - item.cmd=cmd; - - cmdq->m_cmds.push(item); - ++i; - } } - -void Game_Saver::load_game_class(FileRead* fr) throw (wexception) { - // GAME CLASS - // Can't save netgames - m_game->m_netgame=0; - - m_game->m_state=gs_running; - m_game->m_speed=fr->Signed16(); - - // From the interactive player, we only - // need the player number - m_game->ipl->set_player_number(fr->Unsigned8()); - - // WE DO NOT SAVE COMPUTER PLAYERS AT THE MOMENT // TODO - - // CMD Queue is saved later - // We do not care for real time. - - // EDITOR GAME CLASS - // Write gametime - m_game->m_gametime=fr->Unsigned32(); - - // We do not care for players, since they were set - // on game initialization to match Map::scenario_player_[names|tribes] - // or vice versa, so this is handled by map loader - - // Objects are loaded and saved by map - - // Tribes and wares are handled by map - // Interactive_Base doesn't need saving - - // Map is handled by map saving - - // Track pointers are not saved in save games - - // Conquer info - m_game->m_conquer_info.resize(fr->Unsigned16()); - for(uint i=0; i<m_game->m_conquer_info.size(); i++) { - m_game->m_conquer_info[i].player = fr->Unsigned8(); - m_game->m_conquer_info[i].middle_point.x = fr->Unsigned16(); - m_game->m_conquer_info[i].middle_point.y = fr->Unsigned16(); - m_game->m_conquer_info[i].area = fr->Unsigned16(); - } -} - +*/ --- NEW FILE: game_map_data_packet.cc --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "game.h" #include "game_map_data_packet.h" #include "widelands_map_loader.h" #include "widelands_map_saver.h" #define CURRENT_PACKET_VERSION 1 /* * Destructor */ Game_Map_Data_Packet::~Game_Map_Data_Packet(void) { if(m_wms) delete m_wms; if(m_wml) delete m_wml; } /* * Read Function */ void Game_Map_Data_Packet::Read(FileRead* fr, Game* game, Widelands_Map_Map_Object_Loader*) throw(wexception) { // read packet version int packet_version=fr->Unsigned16(); if(packet_version==CURRENT_PACKET_VERSION) { // Now Load the map as it would be a normal map saving if(m_wml) delete m_wml; m_wml = new Widelands_Map_Loader(fr, game->get_map()); // Now load the map m_wml->load_map_complete(game, true); m_mol = m_wml->get_map_object_loader(); // DONE return; } else throw wexception("Unknown version in Game_Map_Data_Packet: %i\n", packet_version); assert(0); // never here } /* * Write Function */ void Game_Map_Data_Packet::Write(FileWrite* fw, Game* game, Widelands_Map_Map_Object_Saver*) throw(wexception) { // First, id fw->Unsigned16(PACKET_MAP_DATA); // Now packet version fw->Unsigned16(CURRENT_PACKET_VERSION); // Now Write the map as it would be a normal map saving if(m_wms) delete m_wms; m_wms=new Widelands_Map_Saver(fw, game); m_wms->save(); m_mos = m_wms->get_map_object_saver(); } --- NEW FILE: game_main_menu_load_game.h --- /* * Copyright (C) 2002-4 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef __S__GAME_MAIN_MENU_LOAD_GAME_H #define __S__GAME_MAIN_MENU_LOAD_GAME_H #include "filesystem.h" #include "ui_unique_window.h" class Interactive_Player; class UIEdit_Box; class UITextarea; class UIListselect; class UIButton; class Game_Main_Menu_Load_Game : public UIUniqueWindow { public: Game_Main_Menu_Load_Game(Interactive_Player* plr, UIUniqueWindowRegistry* registry) ; virtual ~Game_Main_Menu_Load_Game(void); private: void clicked(int); void selected(int); void edit_box_changed(); void double_clicked(int); void fill_list(void); bool load_game(std::string); Interactive_Player* m_parent; UITextarea* m_name, *m_gametime; UIListselect* m_ls; filenameset_t m_gamefiles; UIButton* m_ok_btn; std::string m_basedir; std::string m_curdir; std::string m_parentdir; }; #endif Index: main.cc =================================================================== RCS file: /cvsroot/widelands/widelands/src/main.cc,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- main.cc 25 Sep 2004 18:42:21 -0000 1.44 +++ main.cc 11 Oct 2004 21:52:34 -0000 1.45 @@ -166,6 +166,17 @@ continue; } ... [truncated message content] |