sneak in some ugly ugly ugly Multiple Inheritance that hopefully nobody ever notices
authorterom
Fri, 05 Dec 2008 00:44:25 +0000
changeset 209 68cc4248a508
parent 208 7709571e1131
child 210 501b5a1918b5
sneak in some ugly ugly ugly Multiple Inheritance that hopefully nobody ever notices
src/GameState.cc
src/GameState.hh
src/Network/Client.cc
src/Network/Client.hh
src/Network/Server.cc
src/Network/Server.hh
src/PhysicsObject.hh
src/Player.cc
src/Player.hh
src/SinglePlayer.hh
--- a/src/GameState.cc	Fri Dec 05 00:30:59 2008 +0000
+++ b/src/GameState.cc	Fri Dec 05 00:44:25 2008 +0000
@@ -13,12 +13,12 @@
     if (local_player)
         throw std::logic_error("newLocalPlayer called even though we already have a local player");
     
-    player_list.push_back(player);
+    newPlayer(player);
     
     local_player = player;
 }
     
-void GameState::newRemotePlayer (RemotePlayer *player) {
+void GameState::newPlayer (Player *player) {
     player_list.push_back(player);
 }
 
--- a/src/GameState.hh	Fri Dec 05 00:30:59 2008 +0000
+++ b/src/GameState.hh	Fri Dec 05 00:44:25 2008 +0000
@@ -30,7 +30,7 @@
 
     void newLocalPlayer (LocalPlayer *player);        
 
-    void newRemotePlayer (RemotePlayer *player);
+    void newPlayer (Player *player);
 
     void removePlayer (Player *player);
 };
--- a/src/Network/Client.cc	Fri Dec 05 00:30:59 2008 +0000
+++ b/src/Network/Client.cc	Fri Dec 05 00:44:25 2008 +0000
@@ -62,7 +62,7 @@
     NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position);
 
     // inform state
-    state.newRemotePlayer(player);
+    state.newPlayer(player);
 
 }
         
@@ -76,7 +76,7 @@
     NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position);
 
     // inform state
-    state.newRemotePlayer(player);
+    state.newPlayer(player);
 }
         
 void NetworkClient::on_terrain_array (NetworkPacketInput &pkt, NetworkNode *node) {
@@ -110,8 +110,8 @@
     //  delete player;
 }
 
-NetworkClientPlayerHelper::NetworkClientPlayerHelper (NetworkClient &client, NetworkObject_Client *obj) :
-    client(client), obj(obj) {
+NetworkClientPlayerHelper::NetworkClientPlayerHelper (NetworkClient &client, Vector position, NetworkObject_Client *obj) :
+    Player(client.state, position, true), client(client), obj(obj) {
 
     // receive position updates
     slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientPlayerHelper::on_position);
@@ -127,7 +127,7 @@
     Engine::log(INFO, "client_player.on_position") << "obj=" << obj << ", position=" << position << ", velocity=" << velocity << ", aim=" << aim << ", [" << flags << "]";
     
     // just update... 
-    _handleUpdate(position, velocity, flags & NETWORK_PHYSICS_INAIR, flags & NETWORK_PHYSICS_FACE_RIGHT, aim);
+    updatePhysics(position, velocity, flags & NETWORK_PHYSICS_INAIR, flags & NETWORK_PHYSICS_FACE_RIGHT, aim);
 }
 
 void NetworkClientPlayerHelper::on_dig (NetworkPacketInput &pkt) {
@@ -137,12 +137,11 @@
     Engine::log(INFO, "client_player.on_dig") << "obj=" << obj << ", position=" << position << ", radius=" << radius;
     
     // just update... 
-    _handleDig(position, radius);
+    handleDig(position, radius);
 }
 
- 
 NetworkClientLocalPlayer::NetworkClientLocalPlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) :
-    LocalPlayer(client.state, position, true), NetworkClientPlayerHelper(client, obj) {
+    Player(client.state, position, true), NetworkClientPlayerHelper(client, position, obj) {
     
 }
         
@@ -156,16 +155,8 @@
     // do not handle locally
 }
         
-void NetworkClientLocalPlayer::_handleUpdate(Vector position, Vector velocity, bool inAir, bool facingRight, float aim) {
-    updatePhysics(position, velocity, inAir, facingRight, aim);
-}
-        
-void NetworkClientLocalPlayer::_handleDig (Vector position, float radius) {
-    handleDig(position, radius);
-}
-       
 NetworkClientRemotePlayer::NetworkClientRemotePlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) :
-    RemotePlayer(client.state, position, true), NetworkClientPlayerHelper(client, obj) {
+    Player(client.state, position, true), NetworkClientPlayerHelper(client, position, obj) {
     
     // receive messages
     slots.connect(obj->sig_message(NETMSG_PLAYER_QUIT), this, &NetworkClientRemotePlayer::on_quit);
@@ -180,11 +171,4 @@
     client.player_quit(this);
 }
 
-void NetworkClientRemotePlayer::_handleUpdate(Vector position, Vector velocity, bool inAir, bool facingRight, float aim) {
-    updatePhysics(position, velocity, inAir, facingRight, aim);
-}
 
-void NetworkClientRemotePlayer::_handleDig (Vector position, float radius) {
-    handleDig(position, radius);
-}
-
--- a/src/Network/Client.hh	Fri Dec 05 00:30:59 2008 +0000
+++ b/src/Network/Client.hh	Fri Dec 05 00:44:25 2008 +0000
@@ -10,6 +10,7 @@
 class NetworkClientRemotePlayer;
 
 class NetworkClient {
+    friend class NetworkClientPlayerHelper;
     friend class NetworkClientLocalPlayer;
     friend class NetworkClientRemotePlayer;
 
@@ -38,7 +39,7 @@
         void player_quit (NetworkClientRemotePlayer *player);
 };
 
-class NetworkClientPlayerHelper {
+class NetworkClientPlayerHelper : public virtual Player {
     protected:
         NetworkClient &client;
 
@@ -47,15 +48,11 @@
         NetworkObject_Client *obj;
 
     protected:
-        NetworkClientPlayerHelper (NetworkClient &client, NetworkObject_Client *obj);
+        NetworkClientPlayerHelper (NetworkClient &client, Vector position, NetworkObject_Client *obj);
     
     private:
         void on_position (NetworkPacketInput &pkt);
         void on_dig (NetworkPacketInput &pkt);
-
-    protected:
-        virtual void _handleUpdate (Vector position, Vector velocity, bool inAir, bool facingRight, float aim) = 0;
-        virtual void _handleDig (Vector position, float radius) = 0;
 };
 
 class NetworkClientLocalPlayer : public NetworkClientPlayerHelper, public LocalPlayer {
@@ -63,10 +60,6 @@
         NetworkClientLocalPlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position);
         
         virtual void handleMove (PlayerInput_Move input);
-    
-    protected:
-        virtual void _handleUpdate (Vector position, Vector velocity, bool inAir, bool facingRight, float aim);
-        virtual void _handleDig (Vector position, float radius);
 };
 
 class NetworkClientRemotePlayer : public NetworkClientPlayerHelper, public RemotePlayer {
@@ -76,9 +69,6 @@
     private:
         void on_quit (NetworkPacketInput &pkt);
     
-    protected:
-        virtual void _handleUpdate (Vector position, Vector velocity, bool inAir, bool facingRight, float aim);
-        virtual void _handleDig (Vector position, float radius);
 };
 
 #endif
--- a/src/Network/Server.cc	Fri Dec 05 00:30:59 2008 +0000
+++ b/src/Network/Server.cc	Fri Dec 05 00:44:25 2008 +0000
@@ -27,7 +27,7 @@
     players.push_back(player);
     
     // add to GameState
-    state.newRemotePlayer(player);
+    state.newPlayer(player);
 }
         
 void NetworkServer::handle_disconnect (NetworkServerPlayer *player) {
@@ -39,7 +39,7 @@
 }
         
 NetworkServerPlayer::NetworkServerPlayer (NetworkServer &server, NetworkNode *node) : 
-    RemotePlayer(server.state, Vector(PLAYER_INITIAL_X, PLAYER_INITIAL_Y), true), server(server), obj(server.netobjs), node(node) {
+    Player(server.state, Vector(PLAYER_INITIAL_X, PLAYER_INITIAL_Y), true), server(server), obj(server.netobjs), node(node) {
     
     // log
     Engine::log(INFO, "server_player.connected") << "node=" << node << ", obj=" << obj;
--- a/src/Network/Server.hh	Fri Dec 05 00:30:59 2008 +0000
+++ b/src/Network/Server.hh	Fri Dec 05 00:44:25 2008 +0000
@@ -33,7 +33,7 @@
         void on_node_connected (NetworkNode *node);
 };
 
-class NetworkServerPlayer : public RemotePlayer {
+class NetworkServerPlayer : public LocalPlayer {
     private:
         NetworkServer &server;
         NetworkObject_Server obj;
--- a/src/PhysicsObject.hh	Fri Dec 05 00:30:59 2008 +0000
+++ b/src/PhysicsObject.hh	Fri Dec 05 00:44:25 2008 +0000
@@ -36,7 +36,7 @@
 
     //
     int reloadTimer;
-
+    
     PhysicsObject(PhysicsWorld &world, float mass, Vector position, 
                   Vector velocity);
     ~PhysicsObject() {}
--- a/src/Player.cc	Fri Dec 05 00:30:59 2008 +0000
+++ b/src/Player.cc	Fri Dec 05 00:44:25 2008 +0000
@@ -1,6 +1,8 @@
 #include "Engine.hh"
 #include "Player.hh" 
 
+#include <cstdlib>
+
 Player::Player(GameState &state, Vector position, bool visible) : 
     PhysicsObject(state.world, PLAYER_MASS, position, Vector(0, 0)), state(state), visible(visible) {
 
@@ -15,11 +17,24 @@
     world.addPlayerObject(this);
 }
  
+void Player::handleDig (Vector position, float radius) {
+    Vector unitVectorAim = facingRight ? Vector(std::cos(aim), -std::sin(aim)) : 
+            Vector(-std::cos(aim), -std::sin(aim));
+    float shotspeed = 40*PHYSICS_TICK_MS;
+    Vector shotVelocity = unitVectorAim*shotspeed;
+    new Projectile(this->state, this->position, shotVelocity, false, radius, 1);
+
+}
+
+void Player::debugInfo (void) {
+    Engine::log(DEBUG, "Player.debugInfo") << "In air: " << this->inAir;
+}
+
 /**
  * shoots the selected weapon.
  * TODO: selection and weapon information
  */
-void Player::shoot (void) {
+void LocalPlayer::shoot (void) {
     // here should be somehow considered which projectile it is
     if(!canShoot())
         return;
@@ -32,7 +47,7 @@
     new Projectile(this->state, this->position, shotVelocity, true, 20);
 }
 
-void Player::handleMove (PlayerInput_Move input) {
+void LocalPlayer::handleMove (PlayerInput_Move input) {
     float fx = 0; // Force in x-direction
     float da = 0; // Crosshair angle
 
@@ -85,15 +100,3 @@
 
 }
 
-void Player::handleDig (Vector position, float radius) {
-    Vector unitVectorAim = facingRight ? Vector(std::cos(aim), -std::sin(aim)) : 
-            Vector(-std::cos(aim), -std::sin(aim));
-    float shotspeed = 40*PHYSICS_TICK_MS;
-    Vector shotVelocity = unitVectorAim*shotspeed;
-    new Projectile(this->state, this->position, shotVelocity, false, radius, 1);
-    //   world.removeGround(position, radius);
-}
-
-void Player::debugInfo (void) {
-    Engine::log(DEBUG, "Player.debugInfo") << "In air: " << this->inAir;
-}
--- a/src/Player.hh	Fri Dec 05 00:30:59 2008 +0000
+++ b/src/Player.hh	Fri Dec 05 00:44:25 2008 +0000
@@ -10,28 +10,28 @@
 #include "Input.hh"
 
 class Player : public PhysicsObject {
-protected:
-    GameState &state;
-    bool visible;
-    
-public:
-    Player(GameState &state, Vector position, bool visible); 
-    
-    void debugInfo ();
-    virtual void handleMove (PlayerInput_Move input);
-    virtual void handleDig (Vector position, float radius);
-    void shoot (void);
+    protected:
+        GameState &state;
+        bool visible;
+        
+        // default constructor for use with virtual inheritance... it's not defined
+        Player (void);
+        Player (GameState &state, Vector position, bool visible); 
+        
+        virtual void handleDig (Vector position, float radius);
 
+    public:
+        void debugInfo ();
 };
 
-class LocalPlayer : public Player {
-protected:
-    LocalPlayer (GameState &state, Vector pos, bool visible) : Player(state, pos, visible) { }
+class LocalPlayer : public virtual Player {
+    public:
+        virtual void handleMove (PlayerInput_Move input);
+        void shoot (void);
 };
 
-class RemotePlayer : public Player {
-protected:
-    RemotePlayer (GameState &state, Vector pos, bool visible) : Player(state, pos, visible) { }
+class RemotePlayer : public virtual Player {
+    protected:
 };
  
 
--- a/src/SinglePlayer.hh	Fri Dec 05 00:30:59 2008 +0000
+++ b/src/SinglePlayer.hh	Fri Dec 05 00:44:25 2008 +0000
@@ -5,7 +5,11 @@
 
 class SinglePlayer : public LocalPlayer {
     public:
-        SinglePlayer (GameState &state) : LocalPlayer(state, Vector(PLAYER_INITIAL_X, PLAYER_INITIAL_Y), true) { }
+        SinglePlayer (GameState &state) :
+            Player(state, Vector(PLAYER_INITIAL_X, PLAYER_INITIAL_Y), true)
+        { 
+        
+        }
 };
 
 #endif /* SINGLE_PLAYER_HH */