Crossfire Server, Trunk
party.c
Go to the documentation of this file.
1 /*
2  * Crossfire -- cooperative multi-player graphical RPG and adventure game
3  *
4  * Copyright (c) 1999-2014 Mark Wedel and the Crossfire Development Team
5  * Copyright (c) 1992 Frank Tore Johansen
6  *
7  * Crossfire is free software and comes with ABSOLUTELY NO WARRANTY. You are
8  * welcome to redistribute it under certain conditions. For details, please
9  * see COPYING and LICENSE.
10  *
11  * The authors can be reached via e-mail at <crossfire@metalforge.org>.
12  */
13 
19 #include "global.h"
20 
21 #include <stdlib.h>
22 #include <string.h>
23 
24 #include "sproto.h"
25 
26 static partylist *firstparty = NULL;
27 static partylist *lastparty = NULL;
40 partylist *party_form(object *op, const char *partyname) {
41  partylist *party;
42  char buf[MAX_BUF];
43 
44  strlcpy(buf, partyname, sizeof(buf));
46 
47  if (party_find(buf) != NULL)
48  return NULL;
49 
50  party_leave(op);
51  party = (partylist *)malloc(sizeof(partylist));
52  party->partyname = strdup_local(buf);
53 #ifdef PARTY_KILL_LOG
54  party->total_exp = 0;
55  party->kills = 0;
56 #endif
57  party->passwd[0] = '\0';
58  party->next = NULL;
59  party->partyleader = strdup_local(op->name);
61  "You have formed party: %s",
62  party->partyname);
63  op->contr->party = party;
64 
65  if (lastparty) {
66  lastparty->next = party;
68  } else {
69  firstparty = party;
71  }
72 
73  return party;
74 }
75 
85 void party_join(object *op, partylist *party) {
86  char buf[MAX_BUF];
87 
88  if (op->contr->party == party) {
90  "You are already a member of party: %s",
91  party->partyname);
92  return;
93  }
94 
95  party_leave(op);
96 
97  op->contr->party = party;
99  "You have joined party: %s\n",
100  party->partyname);
101  snprintf(buf, MAX_BUF, "%s joins party %s", op->name, party->partyname);
103 }
104 
108 static void remove_if_unused(partylist *party) {
109  for (player *pl = first_player; pl != NULL; pl = pl->next) {
110  if (pl->party == party)
111  return;
112  }
113  party_remove(party);
114 }
115 
123 void party_leave(object *op) {
124  char buf[MAX_BUF];
125 
126  partylist *party = op->contr->party;
127  if (party == NULL) {
128  return;
129  }
130 
132  "You leave party %s.",
133  party->partyname);
134  snprintf(buf, sizeof(buf), "%s leaves party %s.", op->name, party->partyname);
136  op->contr->party = NULL;
137  remove_if_unused(party);
138 }
139 
148 partylist *party_find(const char *partyname) {
149  partylist *party;
150 
151  for (party = firstparty; party; party = party->next) {
152  if (strcmp(party->partyname, partyname) == 0)
153  return party;
154  }
155  return NULL;
156 }
157 
164 void party_remove(partylist *party) {
165  partylist *previousparty;
166  partylist **walk;
167  player *pl;
168 
169  previousparty = NULL;
170  for (walk = &firstparty; *walk != NULL; walk = &(*walk)->next) {
171  if (*walk == party) {
172  if (party == lastparty)
173  lastparty = previousparty;
174  *walk = party->next;
175  for (pl = first_player; pl != NULL; pl = pl->next) {
176  if (pl->party == party)
177  pl->party = NULL;
178  }
179  free(party->partyleader);
180  free(party->partyname);
181  free(party);
182  return;
183  }
184  previousparty = *walk;
185  }
186  LOG(llevError, "party_remove: I was asked to remove party %s, but it could not be found.\n",
187  party->partyname);
188 }
189 
197  return firstparty;
198 }
199 
209  return party->next;
210 }
211 
216  partylist *party;
217  partylist *next;
218  for (party = firstparty; party != NULL; party = next) {
219  next = party->next;
220  remove_if_unused(party);
221  }
222 }
223 
232 const char *party_get_password(const partylist *party) {
233  return party->passwd;
234 }
235 
244 void party_set_password(partylist *party, const char *password) {
245  strlcpy(party->passwd, password, sizeof(party->passwd));
247 }
248 
259 int party_confirm_password(const partylist *party, const char *password) {
260  return strcmp(party->passwd, password) == 0;
261 }
262 
274 void party_send_message(object *op, const char *message) {
275  player * const self = op->contr;
276  partylist * const party = self->party;
277 
278  for (player *pl = first_player; pl != NULL; pl = pl->next)
279  if (pl->party == party && pl != self)
281  message);
282 }
283 
292 const char *party_get_leader(const partylist *party) {
293  return party->partyleader;
294 }
295 
296 #ifdef PARTY_KILL_LOG
297 
309 void party_add_kill(partylist *party, const char *killer, const char *dead, long exp) {
310  int i, pos;
311 
312  if (party->kills >= PARTY_KILL_LOG) {
313  pos = PARTY_KILL_LOG-1;
314  for (i = 0; i < PARTY_KILL_LOG-1; i++)
315  memcpy(&(party->party_kills[i]), &(party->party_kills[i+1]), sizeof(party->party_kills[0]));
316  } else
317  pos = party->kills;
318  party->kills++;
319  party->total_exp += exp;
320  party->party_kills[pos].exp = exp;
321  strncpy(party->party_kills[pos].killer, killer, MAX_NAME);
322  strncpy(party->party_kills[pos].dead, dead, MAX_NAME);
323  party->party_kills[pos].killer[MAX_NAME] = 0;
324  party->party_kills[pos].dead[MAX_NAME] = 0;
325 }
326 #endif
give.next
def next
Definition: give.py:44
global.h
MSG_TYPE_COMMAND_SUCCESS
#define MSG_TYPE_COMMAND_SUCCESS
Definition: newclient.h:530
llevError
@ llevError
Definition: logger.h:11
strdup_local
#define strdup_local
Definition: compat.h:29
remove_if_unused
static void remove_if_unused(partylist *party)
Definition: party.c:108
party_struct::next
struct party_struct * next
Definition: party.h:13
pl
Definition: player.h:105
pl::ob
object * ob
Definition: player.h:176
party_get_leader
const char * party_get_leader(const partylist *party)
Definition: party.c:292
party_get_next
partylist * party_get_next(const partylist *party)
Definition: party.c:208
MSG_TYPE_COMMAND_ERROR
#define MSG_TYPE_COMMAND_ERROR
Definition: newclient.h:529
MSG_TYPE_COMMAND
#define MSG_TYPE_COMMAND
Definition: newclient.h:404
party_get_first
partylist * party_get_first(void)
Definition: party.c:196
party_struct::partyname
char * partyname
Definition: party.h:14
party_find
partylist * party_find(const char *partyname)
Definition: party.c:148
pl::next
struct pl * next
Definition: player.h:106
party_struct::partyleader
char * partyleader
Definition: party.h:11
party_set_password
void party_set_password(partylist *party, const char *password)
Definition: party.c:244
first_player
EXTERN player * first_player
Definition: global.h:115
MAX_NAME
#define MAX_NAME
Definition: define.h:41
party_leave
void party_leave(object *op)
Definition: party.c:123
sproto.h
replace_unprintable_chars
void replace_unprintable_chars(char *buf)
Definition: utils.c:457
party_struct
Definition: party.h:10
strlcpy
size_t strlcpy(char *dst, const char *src, size_t size)
Definition: porting.c:220
MAX_BUF
#define MAX_BUF
Definition: define.h:35
diamondslots.message
string message
Definition: diamondslots.py:57
NDI_UNIQUE
#define NDI_UNIQUE
Definition: newclient.h:262
LOG
void LOG(LogLevel logLevel, const char *format,...)
Definition: logger.c:51
firstparty
static partylist * firstparty
Definition: party.c:26
give.op
op
Definition: give.py:33
NDI_WHITE
#define NDI_WHITE
Definition: newclient.h:243
buf
StringBuffer * buf
Definition: readable.c:1610
party_struct::passwd
char passwd[9]
Definition: party.h:12
party_remove
void party_remove(partylist *party)
Definition: party.c:164
lastparty
static partylist * lastparty
Definition: party.c:27
draw_ext_info
void draw_ext_info(int flags, int pri, const object *pl, uint8_t type, uint8_t subtype, const char *message)
Definition: main.c:309
MSG_TYPE_COMMUNICATION_PARTY
#define MSG_TYPE_COMMUNICATION_PARTY
Definition: newclient.h:627
party_join
void party_join(object *op, partylist *party)
Definition: party.c:85
party_form
partylist * party_form(object *op, const char *partyname)
Definition: party.c:40
party_confirm_password
int party_confirm_password(const partylist *party, const char *password)
Definition: party.c:259
MSG_TYPE_COMMUNICATION
#define MSG_TYPE_COMMUNICATION
Definition: newclient.h:410
party_send_message
void party_send_message(object *op, const char *message)
Definition: party.c:274
reputation.killer
def killer
Definition: reputation.py:13
pl::party
partylist * party
Definition: player.h:202
party_get_password
const char * party_get_password(const partylist *party)
Definition: party.c:232
altar_valkyrie.pl
pl
Definition: altar_valkyrie.py:28
draw_ext_info_format
void draw_ext_info_format(int flags, int pri, const object *pl, uint8_t type, uint8_t subtype, const char *format,...)
Definition: main.c:319
party_obsolete_parties
void party_obsolete_parties(void)
Definition: party.c:215