ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/include/player.h
(Generate patch)

Comparing deliantra/server/include/player.h (file contents):
Revision 1.15 by root, Fri Sep 8 16:51:44 2006 UTC vs.
Revision 1.44 by root, Mon Jan 8 18:18:35 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
3 3
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
6 7
7 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
16 17
17 You should have received a copy of the GNU General Public License 18 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 21
21 The authors can be reached via e-mail at crossfire-devel@real-time.com 22 The authors can be reached via e-mail at crossfire@schmorp.de
22*/ 23*/
23 24
24#define NUM_OUTPUT_BUFS 5 25#define NUM_OUTPUT_BUFS 5
25struct Output_Buf { 26struct Output_Buf
27{
26 shstr buf; /* Actual string pointer */ 28 shstr buf; /* Actual string pointer */
27 uint32 first_update; /* First time this message was stored */ 29 uint32 first_update; /* First time this message was stored */
28 uint16 count; /* How many times we got this message */ 30 uint16 count; /* How many times we got this message */
29}; 31};
30 32
31/* wand/rod/horn rolled into range_misc. They all use the same body location 33/* wand/rod/horn rolled into range_misc. They all use the same body location
32 * anyways. 34 * anyways.
33 */ 35 */
34enum rangetype { 36enum rangetype
37{
35 range_bottom = -1, 38 range_bottom = -1,
36 range_none = 0, 39 range_none = 0,
37 range_bow = 1, 40 range_bow = 1,
38 range_magic = 2, 41 range_magic = 2,
39 range_misc = 3, 42 range_misc = 3,
40 range_golem = 4, 43 range_golem = 4,
41 range_skill = 5, 44 range_skill = 5,
42 range_builder = 6, 45 range_builder = 6,
43 range_size = 7 46 range_size = 7
44}; 47};
45 48
46enum bowtype_t { 49enum bowtype_t
50{
47 bow_normal = 0, 51 bow_normal = 0,
48 bow_threewide = 1, 52 bow_threewide = 1,
49 bow_spreadshot = 2, 53 bow_spreadshot = 2,
50 bow_n = 3, /* must stay at 3 */ 54 bow_n = 3, /* must stay at 3 */
51 bow_ne = 4, 55 bow_ne = 4,
52 bow_e = 5, 56 bow_e = 5,
53 bow_se = 6, 57 bow_se = 6,
54 bow_s = 7, 58 bow_s = 7,
55 bow_sw = 8, 59 bow_sw = 8,
56 bow_w = 9, 60 bow_w = 9,
57 bow_nw = 10, /* must stay at 10 */ 61 bow_nw = 10, /* must stay at 10 */
58 bow_bestarrow = 11 62 bow_bestarrow = 11
59}; 63};
60 64
61typedef enum _petmode { 65enum petmode_t
66{
62 pet_normal = 0, 67 pet_normal = 0,
63 pet_sad = 1, 68 pet_sad = 1,
64 pet_defend = 2, 69 pet_defend = 2,
65 pet_arena = 3 70 pet_arena = 3
66} petmode_t; 71};
67 72
68typedef enum usekeytype { 73enum usekeytype
74{
69 key_inventory=0, 75 key_inventory = 0,
70 keyrings=1, 76 keyrings = 1,
71 containers=2 77 containers = 2
72} usekeytype; 78};
73 79
74/* This is used to control what to do when we need to unapply 80/* This is used to control what to do when we need to unapply
75 * an object before we can apply another one. 81 * an object before we can apply another one.
76 */ 82 */
77typedef enum unapplymode { 83enum unapplymode
84{
78 unapply_nochoice=0, /* Will unapply objects when there no choice to unapply */ 85 unapply_nochoice = 0, /* Will unapply objects when there no choice to unapply */
79 unapply_never=1, /* will not unapply objects automatically */ 86 unapply_never = 1, /* will not unapply objects automatically */
80 unapply_always=2 /* Will unapply whatever is necessary - this goes beyond */ 87 unapply_always = 2 /* Will unapply whatever is necessary - this goes beyond */
81 /* no choice - if there are multiple ojbect of the same type */ 88 /* no choice - if there are multiple ojbect of the same type */
82 /* that need to be unapplied, there is no way for the player */ 89 /* that need to be unapplied, there is no way for the player */
83 /* to control which of these will be unapplied. */ 90 /* to control which of these will be unapplied. */
84} unapplymode; 91};
85 92
86/* not really the player, but tied pretty closely */ 93/* not really the player, but tied pretty closely */
87typedef struct party_struct { 94INTERFACE_CLASS (partylist)
95struct partylist
96{
88 char * partyleader; 97 char *ACC (RW, partyleader);
89 char passwd[9]; 98 char ACC (RW, passwd)[9];
90 struct party_struct *next; 99 partylist *ACC (RW, next);
91 char *partyname; 100 char *ACC (RW, partyname);
92 101
93#ifdef PARTY_KILL_LOG
94 struct party_kill { 102 struct party_kill
95 char killer[MAX_NAME+1],dead[MAX_NAME+1];
96 sint64 exp;
97 } party_kills[PARTY_KILL_LOG];
98#endif
99 sint64 total_exp;
100 uint32 kills;
101} partylist;
102
103// memsettable part of player
104struct player_pod
105{
106 object *ob; /* The object representing the player */
107 mapstruct *loading; /* When entering a map in progress of loading, not really used */
108 rangetype shoottype; /* Which range-attack is being used by player */
109 bowtype_t bowtype; /* which firemode? */
110 petmode_t petmode; /* which petmode? */
111 object *ranges[range_size];/* object for each range. Set up in fix player. Note */
112 /* That not all are used, it is just nice to map this 1:1 */
113 /* With the range names */
114 uint32 golem_count; /* To track the golem */
115 usekeytype usekeys; /* Method for finding keys for doors */
116 unapplymode unapply; /* Method for auto unapply */
117 uint32 count; /* Any numbers typed before a command */
118 uint32 mode; /* Mode of player for pickup. */
119
120 sint8 digestion; /* Any bonuses/penalties to digestion */
121 sint8 gen_hp; /* Bonuses to regeneration speed of hp */
122 sint8 gen_sp; /* Bonuses to regeneration speed of sp */
123 sint8 gen_sp_armour; /* Penalty to sp regen from armour */
124 sint8 gen_grace; /* Bonuses to regeneration speed of grace */
125 sint16 item_power; /* Total item power of objects equipped */
126 uint8 state; /* Input state of the player (name, password, etc */
127 uint8 listening; /* Which priority will be used in info_all */
128 sint8 last_level; /* Last level we sent to client */
129
130 /* Try to put all the bitfields together - saves some small amount of memory */
131 uint32 braced:1; /* Will not move if braced, only attack */
132 uint32 tmp_invis:1; /* Will invis go away when we attack ? */
133 uint32 do_los:1; /* If true, need to call update_los() in draw(), and clear */
134 uint32 fire_on:1; /* Player should fire object, not move */
135 uint32 run_on:1; /* Player should keep moving in dir until run is off */
136 uint32 has_hit:1; /* If set, weapon_sp instead of speed will count */
137 uint32 name_changed:1; /* If true, the player has set a name. */
138 uint32 peaceful:1; /* If set, won't attack friendly creatures */
139 uint32 hidden:1; /* If True, player (DM) is hidden from view */
140 uint32 explore:1; /* if True, player is in explore mode */
141 uint32 no_shout:1; /* if True, player is *not* able to use shout command */
142
143 object *last_skill_ob[NUM_SKILLS]; /* the exp object */
144 sint64 last_skill_exp[NUM_SKILLS]; /* shadow register. if != exp. obj update client */
145
146 float weapon_sp; /* Penalties to speed when fighting w speed >ws/10*/
147 float last_weapon_sp; /* if diff than weapon_sp, update client */
148 uint16 last_flags; /* fire/run on flags for last tick */
149 sint32 last_weight; /* Last weight as sent to client; -1 means do not send weight */
150 sint32 last_weight_limit; /* Last weight limit transmitted to client */
151 uint32 last_path_attuned; /* Last spell attunment sent to client */
152 uint32 last_path_repelled; /* Last spell repelled sent to client */
153 uint32 last_path_denied; /* Last spell denied sent to client */
154 living orig_stats; /* Permanent real stats of player */
155 living last_stats; /* Last stats as sent to client */
156 float last_speed; /* Last speed as sent to client */
157 sint16 last_resist[NROFATTACKS]; /* last resist values sent to client */
158 int Swap_First; /* First stat player has selected to swap */
159 object *last_used; /* Pointer to object last picked or applied */
160 uint32 last_used_id; /* Safety measures to be sure it's the same */
161 sint8 blocked_los[MAP_CLIENT_X][MAP_CLIENT_Y]; /* array showing what spaces */
162 /* the player can see. For maps smaller than */
163 /* MAP_CLIENT_.., the upper left is used */
164
165 sint16 bed_x, bed_y; /* x,y - coordinates of respawn (savebed) */
166 char savebed_map[MAX_BUF]; /* map where player will respawn after death */
167 char maplevel[MAX_BUF]; /* On which level is the player? */
168 char spellparam[MAX_BUF]; /* What param to add to spells */
169
170 char own_title[MAX_NAME]; /* Title the player has chosen for themself */
171 /* Note that for dragon players, this is filled in for them */
172 char title[BIG_NAME]; /* Default title, like fighter, wizard, etc */
173
174 sint8 levhp[11]; /* What the player gained on that level */
175 sint8 levsp[11]; /* Same for sp */
176 sint8 levgrace[11]; /* And same for grace */
177
178 char killer[BIG_NAME]; /* Who killed this player. */
179
180 char write_buf[MAX_BUF]; /* Holds arbitrary input from client */
181 char input_buf[MAX_BUF]; /* Holds command to run */
182 char password[16]; /* 2 (seed) + 11 (crypted) + 1 (EOS) + 2 (safety) = 16 */
183
184#ifdef SAVE_INTERVAL
185 time_t last_save_time;
186#endif /* SAVE_INTERVAL */
187#ifdef AUTOSAVE
188 uint32 last_save_tick;
189#endif
190 partylist *party; /* Party this player is part of */
191 partylist *party_to_join; /* used when player wants to join a party */
192 /* but we will have to get password first */
193 /* so we have to remember which party to */
194 /* join */
195 char search_str[MAX_BUF]; /* Item we are looking for */
196 sint16 encumbrance; /* How much our player is encumbered */
197 uint16 outputs_sync; /* How often to print, no matter what */
198 uint16 outputs_count; /* Print if this count is exceeded */
199 object *mark; /* marked object */
200 uint32 mark_count; /* count of mark object */
201 /* Special DM fields */
202 tag_t* stack_items; /* Item stack for patch/dump/... commands */
203 int stack_position; /* Current stack position, 0 for no item */
204};
205
206typedef struct pl : zero_initialised, attachable<struct pl>, player_pod
207{
208 struct pl *next; /* Pointer to next player, NULL if this is last */
209 NewSocket socket; /* Socket information for this player */
210 Output_Buf outputs[NUM_OUTPUT_BUFS]; /* holds output strings to client */
211 shstr invis_race; /* What race invisible to? */
212
213 void clear ()
214 { 103 {
215 memset (static_cast<player_pod *>(this), 0, sizeof (player_pod)); 104 char killer[MAX_NAME + 1], dead[MAX_NAME + 1];
216 attachable_clear (); 105 sint64 exp;
217 invis_race = 0; 106 } party_kills[PARTY_KILL_LOG];
218 107
219 for (int i = 0; i < NUM_OUTPUT_BUFS; i++) 108 sint64 ACC (RW, total_exp);
220 outputs[i].buf = 0; 109 uint32 ACC (RW, kills);
221 } 110};
111
112INTERFACE_CLASS (player)
113struct player : zero_initialised, attachable
114{
115 client *ACC (RO, ns); /* Socket information for this player */
116 object *ACC (RW, ob); /* The object representing the player */
117 int ACC (RO, active);
118
119 rangetype ACC (RW, shoottype); /* Which range-attack is being used by player */
120 bowtype_t ACC (RW, bowtype); /* which firemode? */
121 petmode_t ACC (RW, petmode); /* which petmode? */
122 object_ptr ACC (RW, ranges[range_size]); /* object for each range. Set up in fix player. Note */
123 /* That not all are used, it is just nice to map this 1:1 */
124 /* With the range names */
125 usekeytype ACC (RW, usekeys); /* Method for finding keys for doors */
126 unapplymode ACC (RW, unapply); /* Method for auto unapply */
127 uint32 ACC (RW, count); /* Any numbers typed before a command */
128 uint32 ACC (RW, mode); /* Mode of player for pickup. */
129
130 sint8 ACC (RW, digestion); /* Any bonuses/penalties to digestion */
131 sint8 ACC (RW, gen_hp); /* Bonuses to regeneration speed of hp */
132 sint8 ACC (RW, gen_sp); /* Bonuses to regeneration speed of sp */
133 sint8 ACC (RW, gen_sp_armour); /* Penalty to sp regen from armour */
134 sint8 ACC (RW, gen_grace); /* Bonuses to regeneration speed of grace */
135 sint16 ACC (RW, item_power); /* Total item power of objects equipped */
136 uint8 ACC (RW, listening); /* Which priority will be used in info_all */
137
138 /* Try to put all the bitfields together - saves some small amount of memory */
139 bool ACC (RW, braced); /* Will not move if braced, only attack */
140 bool ACC (RW, tmp_invis); /* Will invis go away when we attack ? */
141 bool ACC (RW, do_los); /* If true, need to call update_los() in draw(), and clear */
142 bool ACC (RW, fire_on); /* Player should fire object, not move */
143 bool ACC (RW, run_on); /* Player should keep moving in dir until run is off */
144 bool ACC (RW, has_hit); /* If set, weapon_sp instead of speed will count */
145 bool ACC (RW, peaceful); /* If set, won't attack friendly creatures */
146 bool ACC (RW, hidden); /* If True, player (DM) is hidden from view */
147
148 float ACC (RW, weapon_sp); /* Penalties to speed when fighting w speed >ws/10 */
149 living ACC (RO, orig_stats); /* Permanent real stats of player */
150 object_ptr last_skill_ob[NUM_SKILLS]; /* the exp object */
151 object_ptr ACC (RW, last_used); /* Pointer to object last picked or applied */
152
153 sint16 ACC (RW, bed_x), ACC (RW, bed_y); /* x,y - coordinates of respawn (savebed) */
154 shstr ACC (RW, savebed_map); /* map where player will respawn after death */
155 shstr ACC (RW, maplevel); /* On which level is the player? */
156 char ACC (RW, spellparam)[MAX_BUF]; /* What param to add to spells */
157
158 char ACC (RW, own_title)[MAX_NAME]; /* Title the player has chosen for themself */
159 /* Note that for dragon players, this is filled in for them */
160 char ACC (RW, title)[64]; /* Default title, like fighter, wizard, etc */
161
162 sint8 ACC (RW, levhp[11]); /* What the player gained on that level */
163 sint8 ACC (RW, levsp[11]); /* Same for sp */
164 sint8 ACC (RW, levgrace[11]); /* And same for grace */
165
166 char ACC (RW, killer)[64]; /* Who killed this player. */
167
168 char write_buf[MAX_BUF]; /* Holds arbitrary input from client */ /* should go */
169 char ACC (RW, password)[16]; /* 2 (seed) + 11 (crypted) + 1 (EOS) + 2 (safety) = 16 */
170
171 partylist *ACC (RW, party); /* Party this player is part of */
172 partylist *ACC (RW, party_to_join); /* used when player wants to join a party */
173 /* but we will have to get password first */
174 /* so we have to remember which party to */
175 /* join */
176 char ACC (RW, search_str)[MAX_BUF]; /* Item we are looking for */
177 sint16 ACC (RW, encumbrance); /* How much our player is encumbered */
178 uint16 ACC (RW, outputs_sync); /* How often to print, no matter what */
179 uint16 ACC (RW, outputs_count); /* Print if this count is exceeded */
180 object_ptr ACC (RW, mark); /* marked object */
181 /* Special DM fields */
182 tag_t *stack_items; /* Item stack for patch/dump/... commands */
183 int ACC (RW, stack_position); /* Current stack position, 0 for no item */
184 sint8 blocked_los[MAP_CLIENT_X][MAP_CLIENT_Y]; /* array showing what spaces */
185 /* the player can see. For maps smaller than */
186 /* MAP_CLIENT_.., the upper left is used */
187
188 shstr ACC (RW, invis_race); /* What race invisible to? */
189 Output_Buf outputs[NUM_OUTPUT_BUFS]; /* holds output strings to client */
190
191 MTH static player *create ();
192
193 static player *load_pl (object_thawer &thawer);
194 MTH static player *load_pl (const char *path);
195
196 bool save_pl (object_freezer &freezer);
197 MTH bool save_pl (const char *path);
198
199 void do_destroy ();
200 void gather_callbacks (AV *&callbacks, event_type event) const;
201
202 MTH void connect (client *ns);
203 MTH void disconnect ();
204
205 MTH void activate ();
206 MTH void deactivate ();
207
208 // enters the initial map, after login or creation
209 MTH void enter_map ();
210
211 ~player ();
212
213private:
214 void set_object (object *op);
222} player; 215 player ();
216};
223 217
218typedef object_vector<player, &player::active> playervec;
224 219
220extern playervec players;
221
222#define for_all_players(var) \
223 for (int _i = 0; _i < players.size (); ++_i) \
224 declvar (player *, var, players [_i])
225

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines