File: newserver.h

package info (click to toggle)
crossfire 1.11.0-2
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 24,456 kB
  • ctags: 7,800
  • sloc: ansic: 80,483; sh: 11,825; perl: 2,327; lex: 1,946; makefile: 1,149
file content (179 lines) | stat: -rw-r--r-- 6,725 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/*
 * static char *rcsid_newserver_h =
 *   "$Id: newserver.h 6098 2007-04-22 13:49:02Z ryo_saeba $";
 */

/*
    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
*/

/*
    newserver.h defines various structures and values that are use for the
    new client server communication method.  Values defined here are only
    used on the server side code.  For shared client/server values, see
    newclient.h
*/


#ifndef NEWSERVER_H
#define NEWSERVER_H

/* Reduce this from 50 to 5 - as it is now, there will never be more
 * than 3 anyways.
 */

#define NUM_LOOK_OBJECTS 50

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)

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

struct statsinfo {
    char *range, *title;
};


/* This contains basic information on the socket structure.  status is its
 * current state.  we set up our on buffers for sending/receiving, so we can
 * handle some higher level functions.  fd is the actual file descriptor we
 * are using.
 */

enum Sock_Status {Ns_Avail, Ns_Add, Ns_Dead, Ns_Old};

/* Reserver 0 for neither of these being set */
enum Old_Mode {Old_Listen=1, Old_Player=2};

/* Only one map mode can actually be used, so lets make it a switch
 * instead of having a bunch of different fields that needed to
 * get toggled.  Note ordering here is important - 
 * Map2Cmd > Map1aCmd > Map1Cmd.  This way, when a new feature is
 * added, a simple > compare can be done instead a bunch of ==
 */
enum MapMode {Map0Cmd = 0, Map1Cmd = 1, Map1aCmd=2, Map2Cmd = 3 };

/* 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 

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];
    struct statsinfo stats;
    /* If we get an incomplete packet, this is used to hold the data. */
    SockList	inbuf;
    char    *host;	    /* Which host it is connected from (ip address)*/
    uint8   password_fails; /* how many times the player has failed to give the right password */
    buffer_struct outputbuffer;   /* For undeliverable data */
    uint32  facecache:1;    /* If true, client is caching images */
    uint32  sent_scroll:1;
    uint32  sound;	    /* Client sound mode */
    uint32  exp64:1;	    /* Client wants 64 bit exp data, as well as skill data */
    uint32  newmapcmd:1;    /* Send newmap command when entering new map SMACFIGGEN*/
    uint32  darkness:1;	    /* True if client wants darkness information */
    uint32  image2:1;	    /* Client wants image2/face2 commands */
    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  supported_readables; /* each bit is a readable supported by client */                    
    uint32  cs_version, sc_version; /* versions of the client */
    enum MapMode mapmode;   /* Type of map commands the client wants. */
    uint16  look_position;  /* start of drawing of look window */
    uint8   mapx, mapy;	    /* How large a map the client wants */
    uint8   itemcmd;	    /* What version of the 'item' protocol command to use */
    uint8   faceset;	    /* Set the client is using, default 0 */
    uint32  ext_mapinfos:1;  /* If true client accept additionnal info on maps*/
    uint32	is_bot:1;		/* Client shouldn't be reported to metaserver */
    /* Below are flags for extedend infos to pass to client 
     * with S->C mapextended command */
    uint32  EMI_smooth:1;   /* Send smooth in extendmapinfos*/    

    /* Below here is information only relevant for old sockets */
    char    *comment;	    /* name or listen comment */
    enum Old_Mode old_mode;
} 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

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 1027
#define VERSION_INFO "Crossfire Server"

#endif /* NEWSERVER_H */