--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/proto2/Dimension.cc Sat Nov 08 21:25:56 2008 +0000
@@ -0,0 +1,14 @@
+#include "Dimension.hh"
+
+std::ostream& operator<< (std::ostream &s, const Coordinate &c) {
+ s << "(" << c.x << ", " << c.y << ")";
+
+ return s;
+}
+
+std::ostream& operator<< (std::ostream &s, const PositionDelta &c) {
+ s << "(" << c.dx << ", " << c.dy << ")";
+
+ return s;
+}
+
--- a/src/proto2/Dimension.hh Sat Nov 08 20:34:14 2008 +0000
+++ b/src/proto2/Dimension.hh Sat Nov 08 21:25:56 2008 +0000
@@ -1,6 +1,7 @@
#ifndef DIMENSION_HH
#define DIMENSION_HH
+#include <iostream>
class Dimension {
public:
@@ -43,4 +44,7 @@
}
};
+std::ostream& operator<< (std::ostream &s, const Coordinate &c);
+std::ostream& operator<< (std::ostream &s, const PositionDelta &c);
+
#endif
--- a/src/proto2/Engine.cc Sat Nov 08 20:34:14 2008 +0000
+++ b/src/proto2/Engine.cc Sat Nov 08 21:25:56 2008 +0000
@@ -69,7 +69,7 @@
}
}
-void Engine::log (const std::string &level, const std::string &type, const std::string &message) {
- std::cout << level << " [" << type << "] " << message << std::endl;
+Logger Engine::log (enum LogLevel level, const char *type) {
+ return Logger(level <= WARN ? std::cerr : std::cout, level, type);
}
--- a/src/proto2/Engine.hh Sat Nov 08 20:34:14 2008 +0000
+++ b/src/proto2/Engine.hh Sat Nov 08 21:25:56 2008 +0000
@@ -2,6 +2,8 @@
#include "NetworkServer.hh"
#include "NetworkClient.hh"
+#include "Logger.hh"
+
class Engine {
private:
// game state
@@ -21,9 +23,10 @@
static void runNetworkServer (const std::string &listen_port);
static void runNetworkClient (const std::string &connect_host, const std::string &connect_port);
- static void log (const std::string &level, const std::string &type, const std::string &message);
+ static Logger log (enum LogLevel level, const char *type);
private:
void main_loop (void);
};
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/proto2/Logger.cc Sat Nov 08 21:25:56 2008 +0000
@@ -0,0 +1,40 @@
+
+#include "Logger.hh"
+
+Logger::Logger (std::ostream &stream, enum LogLevel level, const char *module) : stream(stream), level(level), module(module) {
+ const char *l;
+
+ switch (level) {
+ case FATAL: l = "FATAL"; break;
+ case ERROR: l = "ERROR"; break;
+ case WARN: l = "WARN"; break;
+ case INFO: l = "INFO"; break;
+ case DEBUG: l = "DEBUG"; break;
+ default: l = "???"; break;
+ };
+
+ stream << l << " [" << module << "] ";
+}
+
+Logger::~Logger (void) {
+ stream << std::endl;
+}
+
+std::ostream& operator<< (std::ostream &s, CL_NetComputer &c) {
+ s << "[" << c.get_address().get_address() << ":" << c.get_address().get_port() << "]";
+
+ return s;
+}
+
+std::ostream& operator<< (std::ostream &s, CL_NetObject_Server &obj) {
+ s << "%" << obj.get_obj_id();
+
+ return s;
+}
+
+std::ostream& operator<< (std::ostream &s, CL_NetObject_Client &obj) {
+ s << "%" << obj.get_obj_id();
+
+ return s;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/proto2/Logger.hh Sat Nov 08 21:25:56 2008 +0000
@@ -0,0 +1,39 @@
+#ifndef LOGGER_HH
+#define LOGGER_HH
+
+#include <ClanLib/network.h>
+
+#include <iostream>
+
+enum LogLevel {
+ FATAL,
+ ERROR,
+ WARN,
+ INFO,
+ DEBUG,
+};
+
+class Logger {
+ private:
+ std::ostream &stream;
+ enum LogLevel level;
+ const char *module;
+
+ public:
+ Logger (std::ostream &stream, enum LogLevel level, const char *module);
+
+ template <typename T> Logger& operator<< (T &val) {
+ stream << val;
+
+ return *this;
+ }
+
+
+ ~Logger (void);
+};
+
+std::ostream& operator<< (std::ostream &s, CL_NetComputer &c);
+std::ostream& operator<< (std::ostream &s, CL_NetObject_Server &obj);
+std::ostream& operator<< (std::ostream &s, CL_NetObject_Client &obj);
+
+#endif /* LOGGER_HH */
--- a/src/proto2/NetworkClient.cc Sat Nov 08 20:34:14 2008 +0000
+++ b/src/proto2/NetworkClient.cc Sat Nov 08 21:25:56 2008 +0000
@@ -1,8 +1,7 @@
#include "NetworkClient.hh"
-
-// XXX: replace logging
-#include <iostream>
+#include "Engine.hh"
+#include "Logger.hh"
NetworkClient::NetworkClient (GameState &state, const CL_IPAddress &connect_to) :
NetworkCore(state), server(netsession.connect(connect_to)) {
@@ -16,28 +15,22 @@
void NetworkClient::on_create_object (CL_NetObject_Client &obj, int msg_type, CL_NetPacket &pkt) {
switch (msg_type) {
case NETMSG_SERVER_HELLO:
- std::cout << "INFO [client.on_create_object] NETMSG_SERVER_HELLO" << std::endl;
-
on_server_hello(obj, pkt);
break;
case NETMSG_PLAYER_INFO:
- std::cout << "INFO [client.on_create_object] NETMSG_PLAYER_INFO" << std::endl;
-
on_player_info(obj, pkt);
break;
case NETMSG_PLAYER_JOIN:
- std::cout << "INFO [client.on_create_object] NETMSG_PLAYER_JOIN" << std::endl;
-
on_player_join(obj, pkt);
break;
default:
- std::cerr << "WARN [client.on_create_object] unknown msg_type=" << msg_type << std::endl;
+ Engine::log(WARN, "client.on_create_object") << "unknown msg_type=" << msg_type << " for obj=" << obj;
}
}
@@ -45,8 +38,10 @@
// read the packet
uint32_t x = pkt.input.read_uint32();
uint32_t y = pkt.input.read_uint32();
+
+ Coordinate initial_position(x, y);
- Coordinate initial_position(x, y);
+ Engine::log(INFO, "client.on_server_hello") << "obj=" << obj << ", pos=" << initial_position;
// create the LocalPlayer object
NetworkClientLocalPlayer *player = new NetworkClientLocalPlayer(*this, obj, initial_position);
@@ -59,8 +54,10 @@
// read the packet
uint32_t x = pkt.input.read_uint32();
uint32_t y = pkt.input.read_uint32();
-
+
Coordinate initial_position(x, y);
+
+ Engine::log(INFO, "client.on_player_info") << "obj=" << obj << ", pos=" << initial_position;
// create the LocalPlayer object
NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, initial_position);
@@ -77,6 +74,8 @@
Coordinate initial_position(x, y);
+ Engine::log(INFO, "client.on_player_join") << "obj=" << obj << ", pos=" << initial_position;
+
// create the RemotePlayer object
NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, initial_position);
@@ -89,7 +88,8 @@
state.removePlayer(player);
// delete
- delete player;
+ // XXX: leak because deleting the slot while it's being called breaks ClanLib
+ // delete player;
}
NetworkClientLocalPlayer::NetworkClientLocalPlayer (NetworkClient &client, CL_NetObject_Client &obj, Coordinate initial_position) :
@@ -97,7 +97,6 @@
// receive messages
slots.connect(obj.sig_received_message(NETMSG_PLAYER_POSITION), this, &NetworkClientLocalPlayer::on_position);
-
}
void NetworkClientLocalPlayer::move (PositionDelta d) {
@@ -111,8 +110,12 @@
void NetworkClientLocalPlayer::on_position (CL_NetPacket &pkt) {
uint32_t x = pkt.input.read_uint32();
uint32_t y = pkt.input.read_uint32();
+
+ Coordinate pos (x, y);
+
+ Engine::log(INFO, "client_player.on_position") << "obj=" << obj << ", pos=" << pos;
- updatePosition(Coordinate(x, y));
+ updatePosition(pos);
}
NetworkClientRemotePlayer::NetworkClientRemotePlayer (NetworkClient &client, CL_NetObject_Client &obj, Coordinate initial_position) :
@@ -120,18 +123,25 @@
// receive messages
slots.connect(obj.sig_received_message(NETMSG_PLAYER_POSITION), this, &NetworkClientRemotePlayer::on_position);
+ slots.connect(obj.sig_received_message(NETMSG_PLAYER_QUIT), this, &NetworkClientRemotePlayer::on_quit);
}
void NetworkClientRemotePlayer::on_position (CL_NetPacket &pkt) {
uint32_t x = pkt.input.read_uint32();
uint32_t y = pkt.input.read_uint32();
- updatePosition(Coordinate(x, y));
+ Coordinate pos (x, y);
+
+ Engine::log(INFO, "client_player.on_position") << "obj=" << obj << ", pos=" << pos;
+
+ updatePosition(pos);
}
void NetworkClientRemotePlayer::on_quit (CL_NetPacket &pkt) {
// pkt is empty
(void) pkt;
+ Engine::log(INFO, "client_player.on_quit") << "obj=" << obj;
+
client.player_quit(this);
}
--- a/src/proto2/NetworkClient.hh Sat Nov 08 20:34:14 2008 +0000
+++ b/src/proto2/NetworkClient.hh Sat Nov 08 21:25:56 2008 +0000
@@ -31,7 +31,7 @@
CL_SlotContainer slots;
- CL_NetObject_Client &obj;
+ CL_NetObject_Client obj;
public:
NetworkClientLocalPlayer (NetworkClient &client, CL_NetObject_Client &obj, Coordinate initial_position);
@@ -48,7 +48,7 @@
CL_SlotContainer slots;
- CL_NetObject_Client &obj;
+ CL_NetObject_Client obj;
public:
NetworkClientRemotePlayer (NetworkClient &client, CL_NetObject_Client &obj, Coordinate initial_position);
--- a/src/proto2/NetworkServer.cc Sat Nov 08 20:34:14 2008 +0000
+++ b/src/proto2/NetworkServer.cc Sat Nov 08 21:25:56 2008 +0000
@@ -1,7 +1,7 @@
#include "NetworkServer.hh"
#include "Engine.hh"
+#include "Logger.hh"
-#include <iostream>
#include <cassert>
NetworkServer::NetworkServer (GameState &state, const std::string &listen_port) :
@@ -13,16 +13,15 @@
// and then we listen
netsession.start_listen(listen_port);
+
+ Engine::log(INFO, "server") << "running, listen_port=" << listen_port;
}
void NetworkServer::on_connect (CL_NetComputer &computer) {
// assign a pid
uint16_t pid = ++pid_pool;
- // log
- std::cout << "[server.on_connect] INFO: " << computer.get_address().get_address() << " -> #" << pid << std::endl;
-
- // create the player object
+ // create the player object (it logs it)
NetworkServerPlayer *player = new NetworkServerPlayer(*this, computer, pid);
// map computer to it
@@ -33,9 +32,6 @@
}
void NetworkServer::on_disconnect (CL_NetComputer &computer) {
- std::cout << "NetworkServer.on_disconnect: " << computer.get_address().get_address() << std::endl;
-
- // XXX: remove the player
NetworkServerPlayer *player = players[computer];
// remove from players
@@ -52,17 +48,20 @@
}
NetworkServerPlayer::NetworkServerPlayer (NetworkServer &server, CL_NetComputer &computer, uint16_t pid) :
- RemotePlayer(Coordinate(0, 0), true), server(server), computer(computer), netobj(&server.netobjs), pid(pid) {
+ RemotePlayer(Coordinate(0, 0), true), server(server), computer(computer), obj(&server.netobjs), pid(pid) {
+ // log
+ Engine::log(INFO, "server_player.connected") << "computer=" << computer << ", obj=" << obj;
+
// messages
- slots.connect(netobj.sig_received_message(NETMSG_CLIENT_MOVE), this, &NetworkServerPlayer::on_move);
+ slots.connect(obj.sig_received_message(NETMSG_CLIENT_MOVE), this, &NetworkServerPlayer::on_move);
// the initial NETMSG_PLAYER_HELLO
CL_NetPacket hello_pkt;
hello_pkt.output.write_uint32(position.x);
hello_pkt.output.write_uint32(position.y);
- netobj.send(computer, NETMSG_SERVER_HELLO, hello_pkt, true);
+ obj.send(computer, NETMSG_SERVER_HELLO, hello_pkt, true);
// send other player objects
for (std::map<CL_NetComputer, NetworkServerPlayer*>::iterator it = server.players.begin(); it != server.players.end(); it++) {
@@ -75,18 +74,20 @@
player_pkt.output.write_uint32(player->position.x);
player_pkt.output.write_uint32(player->position.y);
- player->netobj.send(computer, NETMSG_PLAYER_INFO, player_pkt, true);
+ player->obj.send(computer, NETMSG_PLAYER_INFO, player_pkt, true);
}
// broadcast NETMSG_PLAYER_JOIN to all clients
- netobj.send(server.netsession.get_all(), NETMSG_PLAYER_JOIN, hello_pkt, true);
+ obj.send(server.netsession.get_all(), NETMSG_PLAYER_JOIN, hello_pkt, true);
}
void NetworkServerPlayer::disconnected (void) {
CL_NetPacket pkt;
+
+ Engine::log(INFO, "server_player.disconnected") << "computer=" << computer << ", obj=" << obj;
- netobj.send(server.netsession.get_all(), NETMSG_PLAYER_QUIT, pkt, true);
+ obj.send(server.netsession.get_all(), NETMSG_PLAYER_QUIT, pkt, true);
}
void NetworkServerPlayer::on_move (CL_NetComputer &from, CL_NetPacket &pkt) {
@@ -101,6 +102,8 @@
// movement delta
PositionDelta delta(dx, dy);
+ Engine::log(INFO, "server_player.on_move") << "obj=" << obj << ", old_pos=" << position << ", delta=" << delta;
+
// apply movement
position += delta;
@@ -113,6 +116,8 @@
pkt.output.write_uint32(position.x);
pkt.output.write_uint32(position.y);
- netobj.send(server.netsession.get_all(), NETMSG_PLAYER_POSITION, pkt, false);
+ Engine::log(INFO, "server_player.send_position_update") << "obj=" << obj << " -> " << position;
+
+ obj.send(server.netsession.get_all(), NETMSG_PLAYER_POSITION, pkt, false);
}
--- a/src/proto2/NetworkServer.hh Sat Nov 08 20:34:14 2008 +0000
+++ b/src/proto2/NetworkServer.hh Sat Nov 08 21:25:56 2008 +0000
@@ -34,7 +34,7 @@
private:
NetworkServer &server;
CL_NetComputer &computer;
- CL_NetObject_Server netobj;
+ CL_NetObject_Server obj;
CL_SlotContainer slots;