ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/friend.C
Revision: 1.6
Committed: Thu Sep 14 22:33:58 2006 UTC (17 years, 9 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.5: +1 -7 lines
Log Message:
indent

File Contents

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