pingus-cvs
[Top][All Lists]
Advanced

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

[Pingus-CVS] r3599 - in trunk/pingus/src: . components


From: grumbel at BerliOS
Subject: [Pingus-CVS] r3599 - in trunk/pingus/src: . components
Date: Mon, 30 Jun 2008 22:34:41 +0200

Author: grumbel
Date: 2008-06-30 22:34:40 +0200 (Mon, 30 Jun 2008)
New Revision: 3599

Modified:
   trunk/pingus/src/capture_rectangle.cpp
   trunk/pingus/src/components/playfield.cpp
   trunk/pingus/src/demo_session.cpp
   trunk/pingus/src/demo_session.hpp
   trunk/pingus/src/pingus_demo.cpp
   trunk/pingus/src/pingus_main.cpp
Log:
Demo playback working again

Modified: trunk/pingus/src/capture_rectangle.cpp
===================================================================
--- trunk/pingus/src/capture_rectangle.cpp      2008-06-30 19:41:27 UTC (rev 
3598)
+++ trunk/pingus/src/capture_rectangle.cpp      2008-06-30 20:34:40 UTC (rev 
3599)
@@ -51,7 +51,7 @@
   if (pingu && pingu->catchable())
     {
       // Draw the capture rectangle
-      if (pingu->change_allowed(client->get_action_name()))
+      if (client && pingu->change_allowed(client->get_action_name()))
         {
           sc.color().draw(good, pingu->get_center_pos() + Vector3f(0, 0, 
1000));
         }

Modified: trunk/pingus/src/components/playfield.cpp
===================================================================
--- trunk/pingus/src/components/playfield.cpp   2008-06-30 19:41:27 UTC (rev 
3598)
+++ trunk/pingus/src/components/playfield.cpp   2008-06-30 20:34:40 UTC (rev 
3599)
@@ -173,11 +173,14 @@
 void
 Playfield::on_primary_button_press(int x, int y)
 {
-  current_pingu = current_pingu_find(state.screen2world( Vector2i(x,y) ));
+  if (client)
+    {
+      current_pingu = current_pingu_find(state.screen2world( Vector2i(x,y) ));
 
-  if (current_pingu)
-    {
-      server->send_pingu_action_event(current_pingu, 
client->get_action_name());
+      if (current_pingu) 
+        {
+          server->send_pingu_action_event(current_pingu, 
client->get_action_name());
+        }
     }
 }
 

Modified: trunk/pingus/src/demo_session.cpp
===================================================================
--- trunk/pingus/src/demo_session.cpp   2008-06-30 19:41:27 UTC (rev 3598)
+++ trunk/pingus/src/demo_session.cpp   2008-06-30 20:34:40 UTC (rev 3599)
@@ -26,6 +26,9 @@
 #include "gui/gui_manager.hpp"
 #include "display/scene_context.hpp"
 #include "pingus_demo.hpp"
+#include "components/playfield.hpp"
+#include "screen/screen_manager.hpp"
+#include "display/display.hpp"
 #include "demo_session.hpp"
 
 DemoSession::DemoSession(const Pathname& pathname)
@@ -33,12 +36,27 @@
   // Load Demo file
   demo = std::auto_ptr<PingusDemo>(new PingusDemo(pathname));
 
+  events = demo->get_events();
+  // Reverse the vector so that we can use pop_back()  
+  std::reverse(events.begin(), events.end());
+
   // Create server
   server   = std::auto_ptr<Server>(new 
Server(PingusLevel(Pathname(demo->get_levelname(), Pathname::DATA_PATH))));
 
   // Create GUI
   pcounter = new PingusCounter(server.get());
   gui_manager->add(pcounter, true);
+
+  int world_width  = server->get_world()->get_width();
+  int world_height = server->get_world()->get_height();
+
+  playfield = new Playfield(server.get(), 0,
+                            Rect(Vector2i(Math::max((Display::get_width()  - 
world_width)/2,  0),
+                                          Math::max((Display::get_height() - 
world_height)/2, 0)), 
+                                 Size(Math::min(Display::get_width(),  
world_width),
+                                      Math::min(Display::get_height(), 
world_height))));
+
+  gui_manager->add(playfield, true);
 }
 
 DemoSession::~DemoSession()
@@ -101,28 +119,22 @@
   // FIXME: Duplicate all timing code here?!
   server->update();
   update_demo();
-
-  int skip_count = 0;
-  while (1) //CL_Keyboard::get_keycode(CL_KEY_SPACE) && skip_count < 10)
-    {
-      ++skip_count;
-      server->update();
-      update_demo();
-    }
 }
 
 void
 DemoSession::update_demo()
 {
-#if 0
   while(!events.empty() && events.back().time_stamp == server->get_time())
     {
       ServerEvent& event = events.back();
 
-      std::cout << "Sending: ";
-      event.write(std::cout);
+      if (0)
+        {
+          std::cout << "Sending: ";
+          event.write(std::cout);
+        }
 
-      event.send(server);
+      event.send(server.get());
       events.pop_back();
     }
 
@@ -131,7 +143,40 @@
     {
       std::cout << "DemoPlayer Bug: We missed a timestamp: " << 
events.back().time_stamp << std::endl;
     }
-#endif 
 }
+
+void
+DemoSession::on_pause_press()
+{
+  std::cout << "Pause Pressed" << std::endl;
+  for(std::vector<ServerEvent>::iterator i = events.begin(); i != 
events.end(); ++i)
+    {
+      std::cout << "Event: ";
+      i->write(std::cout);      
+    }
+}
+
+void
+DemoSession::on_fast_forward_press()
+{
+  std::cout << "Fast Forward Pressed: " << events.size() << " " << 
server->get_time() << std::endl;
+  server->set_fast_forward(!server->get_fast_forward());
+}
+
+void
+DemoSession::on_escape_press()
+{
+  std::cout << "Escape Pressed" << std::endl;
+  server->send_finish_event();
+  ScreenManager::instance()->pop_screen();
+}
+
+void
+DemoSession::process_scroll_event(const Input::ScrollEvent& ev)
+{
+  // FIXME: Rounding considered evil?
+  playfield->scroll(static_cast<int>(-ev.x_delta),
+                    static_cast<int>(-ev.y_delta));
+}
 
 /* EOF */

Modified: trunk/pingus/src/demo_session.hpp
===================================================================
--- trunk/pingus/src/demo_session.hpp   2008-06-30 19:41:27 UTC (rev 3598)
+++ trunk/pingus/src/demo_session.hpp   2008-06-30 20:34:40 UTC (rev 3599)
@@ -22,6 +22,8 @@
 
 #include <memory>
 #include "screen/gui_screen.hpp"
+#include <vector>
+#include "server_event.hpp"
 
 class Server;
 class XMLPDF;
@@ -36,8 +38,9 @@
 class DemoSession : public GUIScreen
 {
 private:
-  std::auto_ptr<Server>   server;
+  std::auto_ptr<Server>     server;
   std::auto_ptr<PingusDemo> demo;
+  std::vector<ServerEvent>  events;
 
   PingusCounter* pcounter;
   Playfield*     playfield;
@@ -54,6 +57,11 @@
   void update(float delta);
   void update_demo();
 
+  void on_pause_press ();
+  void on_fast_forward_press ();
+  void on_escape_press ();
+
+  void process_scroll_event(const Input::ScrollEvent& ev);
 private:
   DemoSession (const DemoSession&);
   DemoSession& operator= (const DemoSession&);

Modified: trunk/pingus/src/pingus_demo.cpp
===================================================================
--- trunk/pingus/src/pingus_demo.cpp    2008-06-30 19:41:27 UTC (rev 3598)
+++ trunk/pingus/src/pingus_demo.cpp    2008-06-30 20:34:40 UTC (rev 3599)
@@ -30,7 +30,7 @@
 {
   std::vector<FileReader> lines = FileReader::parse_many(pathname);
 
-  if (!lines.empty())
+  if (lines.empty())
     {
       PingusError::raise("'" + pathname.str() + "', demo file is empty");
     }

Modified: trunk/pingus/src/pingus_main.cpp
===================================================================
--- trunk/pingus/src/pingus_main.cpp    2008-06-30 19:41:27 UTC (rev 3598)
+++ trunk/pingus/src/pingus_main.cpp    2008-06-30 20:34:40 UTC (rev 3599)
@@ -34,6 +34,7 @@
 #include "lisp/parser.hpp"
 #include "editor/editor_level.hpp"
 #include "string_util.hpp"
+#include "demo_session.hpp"
 #include "sexpr_file_reader.hpp"
 
 #if defined(__APPLE__)
@@ -700,7 +701,7 @@
         }
     }
   else if (cmd_options.credits.is_set() && cmd_options.credits.get())
-       { // just show the credits screen
+    { // just show the credits screen
       ScreenManager::instance()->push_screen(Credits::instance(), false);
     }
   else if (cmd_options.font.is_set() && cmd_options.font.get())
@@ -725,11 +726,19 @@
       ScreenManager::instance()->push_screen (editor, true);
     }
   else if (cmd_options.rest.is_set())
-       { // just start the map that was passed on the command line
-      ScreenManager::instance()->push_screen
-        (new 
StartScreen(PLFResMgr::load_plf_from_filename(Pathname(cmd_options.rest.get(),
-                                                                    
Pathname::SYSTEM_PATH))),
-         true);
+    { // just start the map that was passed on the command line
+      if (StringUtil::has_suffix(cmd_options.rest.get(), ".pingus-demo"))
+        { // Demo file
+          ScreenManager::instance()->push_screen
+            (new DemoSession(Pathname(cmd_options.rest.get(), 
Pathname::SYSTEM_PATH)), true);
+        }
+      else
+        { // Level file
+          ScreenManager::instance()->push_screen
+            (new 
StartScreen(PLFResMgr::load_plf_from_filename(Pathname(cmd_options.rest.get(),
+                                                                        
Pathname::SYSTEM_PATH))),
+             true);
+        }
     }
   else // start a normal game
     {





reply via email to

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