# HG changeset patch # User terom # Date 1228757080 0 # Node ID 4d3ebaa29430017df400ca960b07159818625bf7 # Parent 4d3adfbec07718ede68e7b4287d8ebeac4bb62c5 add separate Types.hh, and fix projectile-worm collisions on network diff -r 4d3adfbec077 -r 4d3ebaa29430 src/Network/Client.cc --- a/src/Network/Client.cc Mon Dec 08 16:46:48 2008 +0000 +++ b/src/Network/Client.cc Mon Dec 08 17:24:40 2008 +0000 @@ -285,6 +285,7 @@ { // hook up signals slots.connect(sig_message(NETMSG_PROJECTILE_DESTROY), this, &NetworkClientProjectile::on_destroy); + slots.connect(sig_message(NETMSG_PROJECTILE_HIT_PLAYER), this, &NetworkClientProjectile::on_hit_player); // tell Player player->weaponFired(weapon); @@ -296,6 +297,13 @@ // ignore :> } + +void NetworkClientProjectile::onHitPlayer (Player *player, Health damage) { + (void) player; + (void) damage; + + // ignore :> +} void NetworkClientProjectile::on_destroy (NetworkPacketInput &pkt) { Vector position = pkt.read_vector(); @@ -303,9 +311,26 @@ Engine::log(INFO, "client_projectile.on_destroy") << this << ": position=" << position << ", flags=" << flags; - // XXX: leak obj, not yet implemented: obj.destory(); - // pass on to super Projectile::onDestroy(position, flags & NETWORK_PROJECTILE_REMOVE_GROUND); } +void NetworkClientProjectile::on_hit_player (NetworkPacketInput &pkt) { + // read packet + NetworkObject *player_obj = controller.read_object(pkt); + Health damage = pkt.read_uint16(); + + NetworkClientPlayerBase *player; + + // ignore for invalid players + if ((player = dynamic_cast(player_obj)) == NULL) { + Engine::log(ERROR, "client.on_hit_player") << this << ": Unknown player object"; + return; + } + + Engine::log(INFO, "client_projectile.hit_player") << this << ": player=" << player << ", damage=" << damage; + + // pass on to super + Projectile::onHitPlayer(player, damage); +} + diff -r 4d3adfbec077 -r 4d3ebaa29430 src/Network/Client.hh --- a/src/Network/Client.hh Mon Dec 08 16:46:48 2008 +0000 +++ b/src/Network/Client.hh Mon Dec 08 17:24:40 2008 +0000 @@ -233,12 +233,23 @@ * so that we can remove the ground reliably */ virtual void onDestroy (Vector position, bool removeGround); + + /** + * Overrides Projectile::onHitPlayer to ignore this, as we must wait for the server to tell us if it really did + * happen. + */ + virtual void onHitPlayer (Player *player, Health damage); private: /** * NETMSG_PROJECTILE_DESTROY -> Projectile::onDestory */ void on_destroy (NetworkPacketInput &pkt); + + /** + * NETMSG_PROJECTILE_HIT_PLAYER -> Projectile::onHitPlayer + */ + void on_hit_player (NetworkPacketInput &pkt); }; #endif diff -r 4d3adfbec077 -r 4d3ebaa29430 src/Network/Packet.hh --- a/src/Network/Packet.hh Mon Dec 08 16:46:48 2008 +0000 +++ b/src/Network/Packet.hh Mon Dec 08 17:24:40 2008 +0000 @@ -35,12 +35,10 @@ * @return T The value */ template T read_val (void); - + + // @{ /** - * @defgroup read_* Read methods - * Collection of methods to write out simple types, these convert from network-endianness and return the value - * - * @{ + * Collection of methods to write out simple types, these convert from network-endianness and return the value */ /** 32-bit unsigned int */ @@ -64,9 +62,7 @@ /** 32-bit float */ float read_float32 (void); - /** - * @} - */ + // @} /** * Read a Vector from the packet: @@ -98,11 +94,9 @@ */ template void write_val (const T &val); + // @{ /** - * @defgroup write* Write methods - * Collection of methods to write out simple types, these convert the given value to network-byte-order - * - * @{ + * Collection of methods to write out simple types, these convert the given value to network-byte-order */ void write_uint32 (uint32_t val); void write_uint16 (uint16_t val); @@ -112,9 +106,7 @@ void write_int8 (int8_t val); void write_float32 (float val); - /** - * @} - */ + // @{ /** * Write a vector to the packet: diff -r 4d3adfbec077 -r 4d3ebaa29430 src/Network/Protocol.hh --- a/src/Network/Protocol.hh Mon Dec 08 16:46:48 2008 +0000 +++ b/src/Network/Protocol.hh Mon Dec 08 17:24:40 2008 +0000 @@ -132,6 +132,14 @@ */ NETMSG_PROJECTILE_PLAYER_FIRED = 0x0411, + /** + * Projectile has hit a player + * + * Object player + * uint16_t damage + */ + NETMSG_PROJECTILE_HIT_PLAYER = 0x0421, + /* * Projectile has gone away * diff -r 4d3adfbec077 -r 4d3ebaa29430 src/Network/Server.cc --- a/src/Network/Server.cc Mon Dec 08 16:46:48 2008 +0000 +++ b/src/Network/Server.cc Mon Dec 08 17:24:40 2008 +0000 @@ -257,7 +257,7 @@ void NetworkServerProjectile::onDestroy (Vector position, bool removeGround) { NetworkPacket pkt; - Engine::log(INFO, "server_projectile.destroy") << "position=" << position << ", removeGround=" << removeGround; + Engine::log(INFO, "server_projectile.destroy") << this << "position=" << position << ", removeGround=" << removeGround; pkt.write_vector(position); pkt.write_uint8(removeGround ? NETWORK_PROJECTILE_REMOVE_GROUND : 0); @@ -270,3 +270,20 @@ Projectile::onDestroy(position, removeGround); } +void NetworkServerProjectile::onHitPlayer (Player *player_ptr, Health damage) { + NetworkPacket pkt; + NetworkServerPlayer *player = dynamic_cast(player_ptr); + + if (player == NULL) + throw Error("NetworkServerProjectile::onHitPlayer called with non-NetworkServerPlayer player"); + + Engine::log(INFO, "server_projectile.hit_player") << this << ": player=" << player << ", damage=" << damage; + + // write packet + controller.write_object(pkt, player); + pkt.write_uint16(damage); + + // send + send_all(NETMSG_PROJECTILE_HIT_PLAYER, pkt, true); +} + diff -r 4d3adfbec077 -r 4d3ebaa29430 src/Network/Server.hh --- a/src/Network/Server.hh Mon Dec 08 16:46:48 2008 +0000 +++ b/src/Network/Server.hh Mon Dec 08 17:24:40 2008 +0000 @@ -166,6 +166,14 @@ * @param removeGround controls the NETWORK_PROJECTILE_REMOVE_GROUND flag */ virtual void onDestroy (Vector position, bool removeGround); + + /** + * Overriden from Projectile to send a NETMSG_PROJECTILE_HIT_PLAYER with the given player and damage + * + * @param player the NetworkServerPlayer that got hit + * @param damage the amount of damage inflicted + */ + virtual void onHitPlayer (Player *player_ptr, Health damage); }; #endif diff -r 4d3adfbec077 -r 4d3ebaa29430 src/Player.cc --- a/src/Player.cc Mon Dec 08 16:46:48 2008 +0000 +++ b/src/Player.cc Mon Dec 08 17:24:40 2008 +0000 @@ -211,12 +211,14 @@ } void Player::onCollision (Vector collisionPoint, PhysicsObject *other) { + (void) collisionPoint; if (other == NULL) return; // Currently we handle only player-player collision here. // Player-projectile collision is handled in projectile's onCollision. + // XXX: not network-safe if (other->getType() == PLAYER) { Vector normal = this->getPosition() - other->getPosition(); this->bounce(normal); @@ -226,12 +228,13 @@ } } -void Player::takeDamage(int damage) { +void Player::takeDamage (Health damage) { this->health -= damage; - Engine::log(DEBUG, "Player.takeDamage") << "Your health is now: " << health; - if (this->health <= 0) { + + if (this->health <= 0) this->disable(); - } + + Engine::log(DEBUG, "player.take_damage") << this << ": damage=" << damage << ", health=" << health; } void Player::draw (Graphics *g, PixelCoordinate camera) { diff -r 4d3adfbec077 -r 4d3ebaa29430 src/Player.hh --- a/src/Player.hh Mon Dec 08 16:46:48 2008 +0000 +++ b/src/Player.hh Mon Dec 08 17:24:40 2008 +0000 @@ -11,6 +11,7 @@ #include "Input.hh" #include "Rope.hh" #include "GraphicsPointer.hh" +#include "Types.hh" #include /** @@ -35,8 +36,9 @@ // we have a rope Rope rope; - - int health; + + /** Our current health */ + Health health; // XXX: hmm... updated where? int animation_step; @@ -102,13 +104,20 @@ */ void onCollision (Vector collisionPoint, PhysicsObject *other); + /** + * We have been hit by something, and therefore take some damage. + * + * XXX: should this take the Projectile instead or somesuch? + */ + void takeDamage (Health damage); + /* * Drawing requires the skin texture, which is loaded on-demand when draw is called */ static bool skin_loaded; static CL_Surface skin_surface; virtual void draw (Graphics *g, PixelCoordinate camera); - void takeDamage(int damage); + }; /** diff -r 4d3adfbec077 -r 4d3ebaa29430 src/Projectile.cc --- a/src/Projectile.cc Mon Dec 08 16:46:48 2008 +0000 +++ b/src/Projectile.cc Mon Dec 08 17:24:40 2008 +0000 @@ -38,19 +38,23 @@ destroy(); } + +void Projectile::onHitPlayer (Player *player, Health damage) { + player->takeDamage(damage); +} void Projectile::onCollision (Vector collisionPoint, PhysicsObject *other) { -// (void) other; + // did we hit a player? + if (other != NULL && other->getType() == PLAYER) { + Player* player = dynamic_cast(other); - if(other != NULL && other->getType() == PLAYER) { - Player* pl = dynamic_cast(other); - pl->takeDamage(10); + // XXX: check that player really is !NULL + onHitPlayer(player, 10); } if (collision_elasticity == 0) onDestroy(collisionPoint, true); } - void Projectile::tick (TimeMS dt) { // expire projectiles diff -r 4d3adfbec077 -r 4d3ebaa29430 src/Projectile.hh --- a/src/Projectile.hh Mon Dec 08 16:46:48 2008 +0000 +++ b/src/Projectile.hh Mon Dec 08 17:24:40 2008 +0000 @@ -4,8 +4,10 @@ class Projectile; #include "GameState.hh" +#include "Player.hh" #include "PhysicsObject.hh" #include "Timer.hh" +#include "Types.hh" #include "GraphicsPointer.hh" /** @@ -69,6 +71,14 @@ * This is overriden by Network. */ virtual void onDestroy (Vector position, bool removeGround); + + /** + * This Projectile has hit the given player. + * + * This Projectile inflicts a certain amount of damage on the player. We are not destroyed, this can be called + * multiple times... + */ + virtual void onHitPlayer (Player *player, Health damage); /** * Call onDestroy, removingGround diff -r 4d3adfbec077 -r 4d3ebaa29430 src/Rope.cc --- a/src/Rope.cc Mon Dec 08 16:46:48 2008 +0000 +++ b/src/Rope.cc Mon Dec 08 17:24:40 2008 +0000 @@ -6,7 +6,7 @@ #include Rope::Rope(Player &player) : - PhysicsObject(player.state.world, ROPE_MASS, Vector(0,0), Vector(0,0), ROPE, false), player(player), state(ROPE_FOLDED) + PhysicsObject(player.state.world, ROPE_MASS, Vector(0,0), Vector(0,0), ROPE, 0.00, false), player(player), state(ROPE_FOLDED) { // XXX: better shape std::vector shape(4); diff -r 4d3adfbec077 -r 4d3ebaa29430 src/Terrain.cc --- a/src/Terrain.cc Mon Dec 08 16:46:48 2008 +0000 +++ b/src/Terrain.cc Mon Dec 08 17:24:40 2008 +0000 @@ -7,6 +7,17 @@ #include #include +const Vector DIRECTIONS[] = { + Vector(0,-1), + Vector(1,-1), + Vector(1,0), + Vector(1,1), + Vector(0,1), + Vector(-1,1), + Vector(-1,0), + Vector(-1,-1) +}; + Terrain::Terrain (void) : map_width(0), map_height(0) { diff -r 4d3adfbec077 -r 4d3ebaa29430 src/Terrain.hh --- a/src/Terrain.hh Mon Dec 08 16:46:48 2008 +0000 +++ b/src/Terrain.hh Mon Dec 08 17:24:40 2008 +0000 @@ -5,6 +5,7 @@ #include "Vector.hh" #include "GraphicsPointer.hh" +#include "Types.hh" #include "Config.hh" enum TerrainType { @@ -13,20 +14,6 @@ TERRAIN_ROCK }; -const Vector DIRECTIONS[] = { - Vector(0,-1), - Vector(1,-1), - Vector(1,0), - Vector(1,1), - Vector(0,1), - Vector(-1,1), - Vector(-1,0), - Vector(-1,-1) -}; - -typedef long int PixelDimension; -typedef _Vector PixelCoordinate; - /** * Terrain class. Represents game terrain and contains member * functions to manipulate terrain and get info about it. diff -r 4d3adfbec077 -r 4d3ebaa29430 src/Types.hh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Types.hh Mon Dec 08 17:24:40 2008 +0000 @@ -0,0 +1,26 @@ +#ifndef TYPES_HH +#define TYPES_HH + +/** + * Define various types + */ + +#include + +/** + * A player's health is measured in... + */ +typedef int16_t Health; + +/** + * Terrain/Graphics pixel dimension values are long ints + */ +typedef long int PixelDimension; + +/** + * A Terrain/Pixel coordinate as a PixelDimension Vector + */ +typedef _Vector PixelCoordinate; + + +#endif