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 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
|
/*
* static char *rcsid_player_h =
* "$Id: player.h 6328 2007-05-21 21:18:34Z 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 authors can be reached via e-mail at crossfire-devel@real-time.com
*/
#ifndef PLAYER_H
#define PLAYER_H
#define NUM_OUTPUT_BUFS 5
typedef struct {
const char *buf; /* Actual string pointer */
uint32 first_update; /* First time this message was stored */
uint16 count; /* How many times we got this message */
} Output_Buf;
/* wand/rod/horn rolled into range_misc. They all use the same body location
* anyways.
*/
typedef enum rangetype {
range_bottom = -1,
range_none = 0,
range_bow = 1,
range_magic = 2,
range_misc = 3,
range_golem = 4,
range_skill = 5,
range_builder = 6,
range_size = 7
} rangetype;
typedef enum _bowtype {
bow_normal = 0,
bow_threewide = 1,
bow_spreadshot = 2,
bow_n = 3, /* must stay at 3 */
bow_ne = 4,
bow_e = 5,
bow_se = 6,
bow_s = 7,
bow_sw = 8,
bow_w = 9,
bow_nw = 10, /* must stay at 10 */
bow_bestarrow = 11
} bowtype_t;
typedef enum _petmode {
pet_normal = 0,
pet_sad = 1,
pet_defend = 2,
pet_arena = 3
} petmode_t;
typedef enum usekeytype {
key_inventory=0,
keyrings=1,
containers=2
} usekeytype;
/* This is used to control what to do when we need to unapply
* an object before we can apply another one.
*/
typedef enum unapplymode {
unapply_nochoice=0, /* Will unapply objects when there no choice to unapply */
unapply_never=1, /* will not unapply objects automatically */
unapply_always=2 /* Will unapply whatever is necessary - this goes beyond */
/* no choice - if there are multiple ojbect of the same type */
/* that need to be unapplied, there is no way for the player */
/* to control which of these will be unapplied. */
} unapplymode;
/**
* This stores, for a spell a player knows, the last sp/gr/dam information sent to client.
*/
typedef struct client_spell {
object *spell;
sint16 last_sp;
sint16 last_grace;
sint16 last_dam;
struct client_spell *next;
} client_spell;
/* not really the player, but tied pretty closely */
typedef struct party_struct {
char * partyleader;
char passwd[9];
struct party_struct *next;
char *partyname;
#ifdef PARTY_KILL_LOG
struct party_kill {
char killer[MAX_NAME+1],dead[MAX_NAME+1];
sint64 exp;
} party_kills[PARTY_KILL_LOG];
#endif
sint64 total_exp;
uint32 kills;
} partylist;
/**
* Whether to rejoin party at login or not.
*/
typedef enum party_rejoin_mode {
party_rejoin_no = 0, /**< Don't rejoin. */
party_rejoin_if_exists = 1, /**< Rejoin if party exists. */
party_rejoin_always = 2, /**< If party doesn't exist, form it. */
} party_rejoin_mode;
typedef struct pl {
struct pl *next; /* Pointer to next player, NULL if this is last */
socket_struct socket; /* Socket information for this player */
char maplevel[MAX_BUF]; /* On which level is the player? */
struct mapdef *loading; /* When entering a map in progress of loading, not really used */
char savebed_map[MAX_BUF]; /* map where player will respawn after death */
sint16 bed_x, bed_y; /* x,y - coordinates of respawn (savebed) */
rangetype shoottype; /* Which range-attack is being used by player */
char spellparam[MAX_BUF]; /* What param to add to spells */
bowtype_t bowtype; /* which firemode? */
petmode_t petmode; /* which petmode? */
object *ranges[range_size];/* object for each range. Set up in fix player. Note */
/* That not all are used, it is just nice to map this 1:1 */
/* With the range names */
uint32 golem_count; /* To track the golem */
usekeytype usekeys; /* Method for finding keys for doors */
unapplymode unapply; /* Method for auto unapply */
uint32 count; /* Any numbers typed before a command */
uint32 mode; /* Mode of player for pickup. */
sint16 digestion; /* Any bonuses/penalties to digestion */
sint16 gen_hp; /* Bonuses to regeneration speed of hp */
sint16 gen_sp; /* Bonuses to regeneration speed of sp */
sint16 gen_sp_armour; /* Penalty to sp regen from armour */
sint16 gen_grace; /* Bonuses to regeneration speed of grace */
sint16 item_power; /* Total item power of objects equipped */
uint8 state; /* Input state of the player (name, password, etc */
uint8 listening; /* Which priority will be used in info_all */
sint8 last_level; /* Last level we sent to client */
/* Try to put all the bitfields together - saves some small amount of memory */
uint32 braced:1; /* Will not move if braced, only attack */
uint32 tmp_invis:1; /* Will invis go away when we attack ? */
const char *invis_race; /* What race invisible to? */
uint32 do_los:1; /* If true, need to call update_los() in draw(), and clear */
uint32 fire_on:1; /* Player should fire object, not move */
uint32 run_on:1; /* Player should keep moving in dir until run is off */
uint32 has_hit:1; /* If set, weapon_sp instead of speed will count */
uint32 name_changed:1; /* If true, the player has set a name. */
uint32 peaceful:1; /* If set, won't attack friendly creatures */
uint32 hidden:1; /* If True, player (DM) is hidden from view */
uint32 explore:1; /* if True, player is in explore mode */
uint32 no_shout:1; /* if True, player is *not* able to use shout command */
object *last_skill_ob[NUM_SKILLS]; /* the exp object */
sint64 last_skill_exp[NUM_SKILLS]; /* shadow register. if != exp. obj update client */
float weapon_sp; /* Penalties to speed when fighting w speed >ws/10*/
float last_weapon_sp; /* if diff than weapon_sp, update client */
uint16 last_flags; /* fire/run on flags for last tick */
sint32 last_weight; /* Last weight as sent to client; -1 means do not send weight */
sint32 last_weight_limit; /* Last weight limit transmitted to client */
uint32 last_path_attuned; /* Last spell attunment sent to client */
uint32 last_path_repelled; /* Last spell repelled sent to client */
uint32 last_path_denied; /* Last spell denied sent to client */
living orig_stats; /* Permanent real stats of player */
living last_stats; /* Last stats as sent to client */
float last_speed; /* Last speed as sent to client */
sint16 last_resist[NROFATTACKS]; /* last resist values sent to client */
int Swap_First; /* First stat player has selected to swap */
object *ob; /* The object representing the player */
object *last_used; /* Pointer to object last picked or applied */
uint32 last_used_id; /* Safety measures to be sure it's the same */
sint8 blocked_los[MAP_CLIENT_X][MAP_CLIENT_Y]; /* array showing what spaces */
/* the player can see. For maps smaller than */
/* MAP_CLIENT_.., the upper left is used */
char own_title[MAX_NAME]; /* Title the player has chosen for themself */
/* Note that for dragon players, this is filled in for them */
char title[BIG_NAME]; /* Default title, like fighter, wizard, etc */
sint8 levhp[11]; /* What the player gained on that level */
sint8 levsp[11]; /* Same for sp */
sint8 levgrace[11]; /* And same for grace */
char killer[BIG_NAME]; /* Who killed this player. */
char last_tell[MAX_NAME]; /* last player that told you something [mids 01/14/2002] */
char write_buf[MAX_BUF]; /* Holds arbitrary input from client */
char input_buf[MAX_BUF]; /* Holds command to run */
char password[16]; /* 2 (seed) + 11 (crypted) + 1 (EOS) + 2 (safety) = 16 */
char new_password[16]; /* 2 (seed) + 11 (crypted) + 1 (EOS) + 2 (safety) = 16 */
#ifdef SAVE_INTERVAL
time_t last_save_time;
#endif /* SAVE_INTERVAL */
#ifdef AUTOSAVE
uint32 last_save_tick;
#endif
partylist *party; /* Party this player is part of */
partylist *party_to_join; /* used when player wants to join a party */
/* but we will have to get password first */
/* so we have to remember which party to */
/* join */
party_rejoin_mode rejoin_party; /**< Whether to rejoin or not party at login. */
char search_str[MAX_BUF]; /* Item we are looking for */
sint16 encumbrance; /* How much our player is encumbered */
Output_Buf outputs[NUM_OUTPUT_BUFS]; /* holds output strings to client */
uint16 outputs_sync; /* How often to print, no matter what */
uint16 outputs_count; /* Print if this count is exceeded */
object *mark; /* marked object */
uint32 mark_count; /* count of mark object */
object *transport; /* transport the player is in */
client_spell* spell_state; /**< Spell information sent to client */
/* Special DM fields */
tag_t* stack_items; /* Item stack for patch/dump/... commands */
int stack_position; /* Current stack position, 0 for no item */
char * followed_player; /**< Player the DM is following. */
} player;
#endif /* PLAYER_H */
|