ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/friend.C
Revision: 1.8
Committed: Sat Jan 6 14:42:28 2007 UTC (17 years, 4 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.7: +1 -0 lines
Log Message:
added some copyrights

File Contents

# User Rev Content
1 elmex 1.1 /*
2     CrossFire, A Multiplayer game for X-windows
3    
4 pippijn 1.8 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
5 elmex 1.1 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
6     Copyright (C) 1992 Frank Tore Johansen
7    
8     This program is free software; you can redistribute it and/or modify
9     it under the terms of the GNU General Public License as published by
10     the Free Software Foundation; either version 2 of the License, or
11     (at your option) any later version.
12    
13     This program is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16     GNU General Public License for more details.
17    
18     You should have received a copy of the GNU General Public License
19     along with this program; if not, write to the Free Software
20     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21    
22 root 1.6 The authors can be reached via e-mail at <crossfire@schmorp.de>
23 elmex 1.1 */
24    
25     #include <global.h>
26    
27     /*
28     * Add a new friendly object to the linked list of friendly objects.
29     * No checking to see if the object is already in the linked list is done.
30     */
31    
32 root 1.5 void
33     add_friendly_object (object *op)
34     {
35     objectlink *ol;
36 elmex 1.1
37 root 1.5 /* Add some error checking. This shouldn't happen, but the friendly
38     * object list usually isn't very long, and remove_friendly_object
39     * won't remove it either. Plus, it is easier to put a breakpoint in
40     * the debugger here and see where the problem is happening.
41     */
42     for (ol = first_friendly_object; ol != NULL; ol = ol->next)
43     {
44     if (ol->ob == op)
45     {
46     LOG (llevError, "add_friendly_object: Trying to add object already on list (%s)\n", &op->name);
47     return;
48 root 1.2 }
49 elmex 1.1 }
50    
51 root 1.5 ol = first_friendly_object;
52     first_friendly_object = get_objectlink ();
53     first_friendly_object->ob = op;
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 root 1.7 delete 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.7
93 root 1.5 if (obj)
94     {
95     prev->next = obj->next;
96 root 1.7 delete obj;
97 root 1.2 }
98 elmex 1.1 }
99     }
100    
101     /*
102     * Dumps all friendly objects. Invoked in DM-mode with the G key.
103     */
104    
105 root 1.5 void
106     dump_friendly_objects (void)
107     {
108     objectlink *ol;
109 elmex 1.1
110 root 1.5 for (ol = first_friendly_object; ol != NULL; ol = ol->next)
111     LOG (llevError, "%s (%d)\n", &ol->ob->name, ol->ob->count);
112 elmex 1.1 }
113    
114     /* New function, MSW 2000-1-14
115     * It traverses the friendly list removing objects that should not be here
116     * (ie, do not have friendly flag set, freed, etc)
117     */
118 root 1.5 void
119     clean_friendly_list (void)
120     {
121     objectlink *obj, *prev = NULL, *next;
122     int count = 0;
123    
124 root 1.7 for (obj = first_friendly_object; obj; obj = next)
125 root 1.5 {
126     next = obj->next;
127 root 1.7 if (QUERY_FLAG (obj->ob, FLAG_FREED) || !QUERY_FLAG (obj->ob, FLAG_FRIENDLY))
128 root 1.5 {
129     if (prev)
130 root 1.7 prev->next = obj->next;
131 root 1.5 else
132 root 1.7 first_friendly_object = obj->next;
133    
134 root 1.5 count++;
135 root 1.7 delete obj;
136 root 1.2 }
137 root 1.5 else
138 root 1.7 /* If we removed the object, then prev is still valid. */
139 root 1.5 prev = obj;
140 elmex 1.1 }
141 root 1.7
142 root 1.5 if (count)
143     LOG (llevDebug, "clean_friendly_list: Removed %d bogus links\n", count);
144 elmex 1.1 }
145    
146     /* Checks if the given object is already in the friendly list or not
147     * Lauwenmark - 31/07/05
148     */
149 root 1.5 int
150     is_friendly (const object *op)
151 elmex 1.1 {
152 root 1.5 objectlink *ol;
153 elmex 1.1
154 root 1.5 for (ol = first_friendly_object; ol != NULL; ol = ol->next)
155     if (ol->ob == op)
156     return 1;
157 elmex 1.1
158 root 1.5 return 0;
159 elmex 1.1 }