state changing wrp complete, pause working correctly
[physics.git] / src / game.cpp
index ebf2ba7..3b7a34b 100644 (file)
@@ -1,3 +1,20 @@
+/*
+ *  Copyright (C) 2008 Patrik Gornicz, Gornicz_P (at) hotmail (dot) com.
+ *
+ *  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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
 #include "game.h"
 #include "debug.h"
 
 using std::vector;
 
 #include "entityCreator.h"
+#include "effectManager.h"
 
 #include "GameStates/GameState.h"
 #include "GameStates/Running.h"
 #include "GameStates/Paused.h"
 #include "GameStates/CreatingPolygon.h"
 
+
 /// ***** Private Variables *****
 
 // The stack of active game states
@@ -22,26 +41,39 @@ Running* running;
 Paused* paused;
 CreatingPolygon* creating_Polygon;
 
+// true if the top state requested itself to be poped
+bool pop_State;
+// pointer to a state wishing to be added
+GameState* push_State;
+
 
 /// ***** Public Methods *****
-void gameInit()
+
+void game::init()
 {
     running = new Running();
     paused = new Paused();
     creating_Polygon = new CreatingPolygon();
 
+    pop_State = false;
+    push_State = NULL;
+
     // create starting entities
     creator::init();
 
     active_States.push_back(running);
 
+    effect::init();
+
 #ifdef DEBUGGING
     cout << "World Created" << endl;
 #endif
 }
 
-void gameClean()
+void game::clean()
 {
+    effect::clean();
+
     creator::clean();
 
     delete creating_Polygon;
@@ -49,22 +81,52 @@ void gameClean()
     delete running;
 }
 
-void gameInput()
+void game::input()
 {
+    if(running->pushMe())
+        push_State = running;
+
+    if(paused->pushMe())
+        push_State = paused;
+
+    if(creating_Polygon->pushMe())
+        push_State = creating_Polygon;
+
+
     int last = active_States.size() -1;
     for( int i = 0;
          i <= last;
          i++ )
     {
         if( i == last )
-            active_States[i]->handleInput(true);
+        {
+            if(active_States[i]->popMe())
+                pop_State = true;
+            else
+                active_States[i]->handleInput(true);
+        }
         else
             active_States[i]->handleInput(false);
     }
 }
 
-void gameUpdate(float time_step)
+void game::update(float time_step)
 {
+    if(push_State != NULL)
+    {
+        // don't want to pop and push same state, pop wins arbitrary
+        if(!pop_State)
+            active_States.push_back(push_State);
+
+        push_State = NULL;
+    }
+
+    if(pop_State)
+    {
+        active_States.pop_back();
+        pop_State = false;
+    }
+
     int last = active_States.size() -1;
     for( int i = 0;
          i <= last;
@@ -77,7 +139,7 @@ void gameUpdate(float time_step)
     }
 }
 
-void gameDraw()
+void game::draw()
 {
     int last = active_States.size() -1;
     for( int i = 0;