void process_message(Uint8 protocol, Uint8 * in_data, int len) { switch (protocol) { case RAW_TEXT: { if (len < 4) return; check_message_type(in_data, len); } break; case ADD_NEW_ACTOR: add_actor(in_data, 0); break; case ADD_NEW_ENHANCED_ACTOR: add_actor(in_data, 1); break; case ADD_ACTOR_COMMAND: add_actor_command(*((short *) (in_data)), *(in_data + 2)); break; case REMOVE_ACTOR: remove_actor(*((short *) (in_data))); break; case KILL_ALL_ACTORS: remove_all_actors(); break; case NEW_MINUTE: game_minute = *((short *) (in_data)); new_minute = 1; break; case LOG_IN_OK: { char str[200]; sprintf(str, "Succesful login"); add_to_buffer(str, strlen(str), CONSOLE_TEXT, 1); break; } case LOG_IN_NOT_OK: { char str[200]; sprintf(str, "Unsuccesful login"); add_to_buffer(str, strlen(str), CONSOLE_TEXT, 1); } break; case YOU_DONT_EXIST: { char str[200]; sprintf(str, "%s does not exist", login_name); add_to_buffer(str, strlen(str), CONSOLE_TEXT, 1); } break; case PONG: { char str[200]; sprintf(str, "Server latency: %i", SDL_GetTicks() - *((Uint32 *) (in_data))); add_to_buffer(str, strlen(str), CONSOLE_TEXT, 1); } case YOU_ARE: actor_me = *((short *) (in_data)); break; case BUDDY_EVENT: break; case CHANGE_MAP: have_map = 0; getting_location_str = 1; send_message(el_socket, NULL, LOCATE_ME, 0); break; case GET_ACTIVE_CHANNELS: set_active_channels(in_data[3], (Uint32*)(in_data+4), (len-2)/4); break; default: break; } } unsigned char in_data[1024]; int read_server() { Uint16 len; char protocol[3]; if ((SDLNet_TCP_Recv(el_socket, protocol, 3)) == 3) { len = *((short *) (protocol + 1)) - 1; if (len > 1024) //Ugh, the message was too long - this is bad, so don't add it to the buffer { disconnected = 1; return 1; } if (SDLNet_TCP_Recv(el_socket, in_data, len) == len) { in_data[len] = 0; process_message(*protocol, in_data, len); } else { disconnected = 1; return 1; } } else { disconnected = 1; return 0; } return 1; } int send_message(TCPsocket socket, char *message, int type, int length) { char str[1024] = { 0 }; if (disconnected) return 0; last_heart_beat = cur_time; str[0] = type; *((short *) (str + 1)) = (short) length + 1; memcpy(&str[3], message, length); return SDLNet_TCP_Send(socket, str, length + 3); } void set_active_channels (Uint8 active, const Uint32 *channels, int nchan) { int i; for(i=0; i