sneak in some ugly ugly ugly Multiple Inheritance that hopefully nobody ever notices
--- 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 */