ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/friend.C
Revision: 1.5
Committed: Sun Sep 10 16:00:23 2006 UTC (17 years, 9 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.4: +97 -76 lines
Log Message:
indent

File Contents

# User Rev Content
1 root 1.5
2 elmex 1.1 /*
3     * static char *rcsid_friend_c =
4 root 1.5 * "$Id: friend.C,v 1.4 2006-09-03 00:18:39 root Exp $";
5 elmex 1.1 */
6    
7     /*
8     CrossFire, A Multiplayer game for X-windows
9    
10     Copyright (C) 2002 Mark Wedel & Crossfire Development Team
11     Copyright (C) 1992 Frank Tore Johansen
12    
13     This program is free software; you can redistribute it and/or modify
14     it under the terms of the GNU General Public License as published by
15     the Free Software Foundation; either version 2 of the License, or
16     (at your option) any later version.
17    
18     This program is distributed in the hope that it will be useful,
19     but WITHOUT ANY WARRANTY; without even the implied warranty of
20     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21     GNU General Public License for more details.
22    
23     You should have received a copy of the GNU General Public License
24     along with this program; if not, write to the Free Software
25     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26    
27     The authors can be reached via e-mail at crossfire-devel@real-time.com
28     */
29    
30     #include <global.h>
31    
32     /*
33     * Add a new friendly object to the linked list of friendly objects.
34     * No checking to see if the object is already in the linked list is done.
35     */
36    
37 root 1.5 void
38     add_friendly_object (object *op)
39     {
40     objectlink *ol;
41 elmex 1.1
42 root 1.5 /* Add some error checking. This shouldn't happen, but the friendly
43     * object list usually isn't very long, and remove_friendly_object
44     * won't remove it either. Plus, it is easier to put a breakpoint in
45     * the debugger here and see where the problem is happening.
46     */
47     for (ol = first_friendly_object; ol != NULL; ol = ol->next)
48     {
49     if (ol->ob == op)
50     {
51     LOG (llevError, "add_friendly_object: Trying to add object already on list (%s)\n", &op->name);
52     return;
53 root 1.2 }
54 elmex 1.1 }
55    
56 root 1.5 ol = first_friendly_object;
57     first_friendly_object = get_objectlink ();
58     first_friendly_object->ob = op;
59     first_friendly_object->id = op->count;
60     first_friendly_object->next = ol;
61 elmex 1.1 }
62    
63     /*
64     * Removes the specified object from the linked list of friendly objects.
65     */
66    
67 root 1.5 void
68     remove_friendly_object (object *op)
69     {
70     objectlink *obj;
71 elmex 1.1
72 root 1.5 CLEAR_FLAG (op, FLAG_FRIENDLY);
73 elmex 1.1
74 root 1.5 if (!first_friendly_object)
75     {
76     LOG (llevError, "remove_friendly_object called with empty friendly list, remove ob=%s\n", &op->name);
77     return;
78     }
79     /* if the first object happens to be the one, processing is pretty
80     * easy.
81     */
82     if (first_friendly_object->ob == op)
83     {
84     obj = first_friendly_object;
85     first_friendly_object = obj->next;
86     free (obj);
87 elmex 1.1 }
88 root 1.5 else
89     {
90     objectlink *prev = first_friendly_object;
91    
92     for (obj = first_friendly_object->next; obj != NULL; obj = obj->next)
93     {
94     if (obj->ob == op)
95     break;
96     prev = obj;
97 root 1.2 }
98 root 1.5 if (obj)
99     {
100     /* This should not happen. But if it does, presumably the
101     * call to remove it is still valid.
102     */
103     if (obj->id != op->count)
104     {
105     LOG (llevError, "remove_friendly_object, tags do no match, %s, %d != %d\n",
106     op->name ? (const char *) op->name : "none", op->count, obj->id);
107 root 1.2 }
108 root 1.5 prev->next = obj->next;
109     free (obj);
110 root 1.2 }
111 elmex 1.1 }
112     }
113    
114     /*
115     * Dumps all friendly objects. Invoked in DM-mode with the G key.
116     */
117    
118 root 1.5 void
119     dump_friendly_objects (void)
120     {
121     objectlink *ol;
122 elmex 1.1
123 root 1.5 for (ol = first_friendly_object; ol != NULL; ol = ol->next)
124     LOG (llevError, "%s (%d)\n", &ol->ob->name, ol->ob->count);
125 elmex 1.1 }
126    
127     /* New function, MSW 2000-1-14
128     * It traverses the friendly list removing objects that should not be here
129     * (ie, do not have friendly flag set, freed, etc)
130     */
131 root 1.5 void
132     clean_friendly_list (void)
133     {
134     objectlink *obj, *prev = NULL, *next;
135     int count = 0;
136    
137     for (obj = first_friendly_object; obj != NULL; obj = next)
138     {
139     next = obj->next;
140     if (QUERY_FLAG (obj->ob, FLAG_FREED) || !QUERY_FLAG (obj->ob, FLAG_FRIENDLY) || (obj->id != obj->ob->count))
141     {
142     if (prev)
143     {
144     prev->next = obj->next;
145 root 1.2 }
146 root 1.5 else
147     {
148     first_friendly_object = obj->next;
149 root 1.2 }
150 root 1.5 count++;
151     free (obj);
152 root 1.2 }
153 root 1.5 /* If we removed the object, then prev is still valid. */
154     else
155     prev = obj;
156 elmex 1.1 }
157 root 1.5 if (count)
158     LOG (llevDebug, "clean_friendly_list: Removed %d bogus links\n", count);
159 elmex 1.1 }
160    
161     /* Checks if the given object is already in the friendly list or not
162     * Lauwenmark - 31/07/05
163     */
164 root 1.5 int
165     is_friendly (const object *op)
166 elmex 1.1 {
167 root 1.5 objectlink *ol;
168 elmex 1.1
169 root 1.5 for (ol = first_friendly_object; ol != NULL; ol = ol->next)
170     if (ol->ob == op)
171     return 1;
172 elmex 1.1
173 root 1.5 return 0;
174 elmex 1.1 }