DEADSOFTWARE

Первая версия протестированная на сервере
[netwar.git] / client.c
1 #include <assert.h>
2 #include <SDL2/SDL_net.h>
4 #include "game.h"
5 #include "client.h"
6 #include "network.h"
7 #include "protocol.h"
9 int cl_playerid;
11 static bool run;
12 static IPaddress addr;
13 static UDPsocket sock;
14 static char nickname[32] = "Anonymous";
16 static void cl_kill_client(ProtocolMessage m) {
17 SDL_Log("Connection refused by server: %.*s\n", (int) sizeof(m.sv.kill.message), m.sv.kill.message);
18 cl_disconnect(true);
19 }
21 static void cl_update_svinfo(ProtocolMessage m) {
22 SDL_Log("Connected to server %.*s\n", (int) sizeof(m.sv.info.name), m.sv.info.name);
23 cl_playerid = m.sv.info.clientid;
24 assert(cl_playerid < MAX_PLAYERS);
25 SDL_Log("Player id%i\n", cl_playerid);
26 }
28 static void cl_update_svplayer(ProtocolMessage m) {
29 g_player_set(
30 m.sv.splr.clid,
31 m.sv.splr.live,
32 b2f(m.sv.splr.x),
33 b2f(m.sv.splr.y),
34 b2f(m.sv.splr.r),
35 b2f(m.sv.splr.vx),
36 b2f(m.sv.splr.vy),
37 b2f(m.sv.splr.vr)
38 );
39 }
41 void cl_connect(const char * host, uint16_t port) {
42 if(SDLNet_ResolveHost(&addr, host, (port) ? (port) : (DEFAULT_PORT)) != 0) {
43 SDL_Log("Unable to resolve host: %s\n", SDLNet_GetError());
44 exit(1);
45 }
47 sock = OpenPort(0);
48 SendMessage(sock, addr, cl_info(nickname));
50 ProtocolMessage m;
51 bool received = WaitMessage(sock, NULL, &m, 10000);
52 if(!received) {
53 SDL_Log("Connection timeout");
54 exit(1);
55 }
57 run = true;
58 if(m.type == SV_KILL) {
59 cl_kill_client(m);
60 } else if(m.type == SV_INFO) {
61 cl_update_svinfo(m);
62 } else {
63 SDL_Log("Invalid first message %i\n", m.type);
64 run = false;
65 }
66 }
68 void cl_move(DoesCode code) {
69 g_player_does(cl_playerid, code);
70 SendMessage(sock, addr, cl_does(code));
71 }
73 void cl_recv() {
74 IPaddress address;
75 ProtocolMessage m;
76 if(!RecvMessage(sock, &address, &m))
77 return;
79 switch(m.type) {
80 case SV_INFO: cl_update_svinfo(m); break;
81 case SV_KILL: cl_kill_client(m); break;
82 case SV_SPLR: cl_update_svplayer(m); break;
83 default: SDL_Log("invalid message %i", m.type);
84 }
85 }
87 void cl_disconnect(bool force) {
88 if(!run)
89 return;
91 if(!force)
92 SendMessage(sock, addr, cl_kill());
94 ClosePort(sock);
96 run = false;
97 }
99 bool cl_isrun() {
100 return run;