/* * static char *rcsid_newserver_h = * "$Id: newserver.h 11578 2009-02-23 22:02:27Z lalo $"; */ /* CrossFire, A Multiplayer game for X-windows Copyright (C) 2002 Mark Wedel & Crossfire Development Team Copyright (C) 1992 Frank Tore Johansen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. The author can be reached via e-mail to crossfire-devel@real-time.com */ /** * @file * Defines various structures and values that are used for the * new client server communication method. Values defined here are only * used on the server side code. For shared client/server values, see * @ref newclient.h */ #ifndef NEWSERVER_H #define NEWSERVER_H /** * The lower bound for the number of objects to send for the 'look' window * (container or ground view). */ #define MIN_NUM_LOOK_OBJECTS 3 /* 3=prev group, one object, next group */ /** * Default value for the number of objects to send for the 'look' window * (container or ground view). */ #define DEFAULT_NUM_LOOK_OBJECTS 50 /** * The upper bound for the number of objects to send for the 'look' window * (container or ground view). */ #define MAX_NUM_LOOK_OBJECTS 100 /** One map cell, as sent to the client. */ struct map_cell_struct { uint16 faces[MAP_LAYERS]; uint16 smooth[MAP_LAYERS]; int darkness; }; /** * This basically defines the largest size an * archetype may be - it is used for allocation of * some structures, as well as determining how far * we should look for the heads of big images. */ #define MAX_HEAD_OFFSET 8 #define MAX_CLIENT_X (MAP_CLIENT_X+MAX_HEAD_OFFSET) #define MAX_CLIENT_Y (MAP_CLIENT_Y+MAX_HEAD_OFFSET) /** One map for a player. */ struct Map { struct map_cell_struct cells[MAX_CLIENT_X][MAX_CLIENT_Y]; }; /** True max is 16383 given current map compaction method. */ #define MAXANIMNUM 2000 /** Contains the last range/title information sent to client. */ struct statsinfo { char *range, *title; }; /** * What state a socket is in. */ enum Sock_Status { Ns_Avail, Ns_Add, Ns_Dead }; /** * The following is the setup for a ring buffer for storing outbut * data that the OS can't handle right away. */ typedef struct buffer_struct { char data[SOCKETBUFSIZE]; int start; int len; } buffer_struct; /** How many times we are allowed to give the wrong password before being kicked. */ #define MAX_PASSWORD_FAILURES 5 /** * Socket structure, represents a client-server connection. */ typedef struct socket_struct { enum Sock_Status status; int fd; struct Map lastmap; sint8 map_scroll_x, map_scroll_y; size_t faces_sent_len; /**< This is the number of elements allocated in faces_sent[]. */ uint8 *faces_sent; /**< This is a bitmap on sent face status. */ uint8 anims_sent[MAXANIMNUM]; /**< What animations we sent. */ struct statsinfo stats; SockList inbuf; /**< If we get an incomplete packet, this is used to hold the data. */ char *host; /**< Which host it is connected from (ip address). */ buffer_struct outputbuffer; /**< For undeliverable data. */ uint8 password_fails; /**< How many times the player has failed to give the right password. */ uint32 facecache:1; /**< If true, client is caching images. */ uint32 newmapcmd:1; /**< Send newmap command when entering new map SMACFIGGEN. */ uint32 darkness:1; /**< True if client wants darkness information. */ uint32 update_look:1; /**< If true, we need to send the look window. */ uint32 can_write:1; /**< Can we write to this socket? */ uint32 has_readable_type:1; /**< If true client accept additional text information * used to arrange text in books, scrolls, or scripted dialogs. */ uint32 monitor_spells:1; /**< Client wishes to be informed when their spell list changes. */ uint32 tick:1; /**< Client wishes to get tick commands. */ uint32 is_bot:1; /**< Client shouldn't be reported to metaserver. */ uint32 want_pickup:1; /**< Client wants pickup information when logging in. */ uint32 sound; /**< Client sound mode. */ uint32 supported_readables; /**< Each bit is a readable supported by client. */ uint32 cs_version, sc_version; /**< Versions of the client. */ uint16 look_position; /**< Start of drawing of look window. */ uint8 mapx, mapy; /**< How large a map the client wants. */ uint8 faceset; /**< Set the client is using, default 0. */ /* Below are flags for extedend infos to pass to client * with S->C mapextended command (note: this comment seems incorrect?) */ sint8 sounds_this_tick; /**< Number of sounds sent this tick. */ uint8 num_look_objects; /**< The maximum number of objects to show on the ground view; this number includes the prev/next group fake items. Can be set through "num_look_objects" setup option; defaults to DEFAULT_NUM_LOOK_OBJECTS. */ } socket_struct; #define CLIENT_SUPPORT_READABLES(__sockPtr, __type)\ (((__type) > 0) && \ ((__sockPtr)->has_readable_type) && \ ((__sockPtr)->supported_readables&(1<<(__type)))) /** * Bitmask for the faces_sent[] array - what * portion of the face have we sent? */ #define NS_FACESENT_FACE 0x1 #define NS_FACESENT_SMOOTH 0x2 #define FACE_TYPES 1 #define PNG_FACE_INDEX 0 /** Holds some system-related information. */ typedef struct Socket_Info { struct timeval timeout; /**< Timeout for select. */ int max_filedescriptor; /**< max filedescriptor on the system. */ int nconns; /**< Number of connections. */ int allocated_sockets; /**< Number of allocated in init_sockets. */ } Socket_Info; extern Socket_Info socket_info; #define VERSION_CS 1023 /**< Version >= 1023 understand setup cmd */ #define VERSION_SC 1028 #define VERSION_INFO "Crossfire Server" #endif /* NEWSERVER_H */