ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/friend.C
Revision: 1.7
Committed: Sun Oct 15 02:16:34 2006 UTC (17 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.6: +11 -21 lines
Log Message:
more now invalid tag_t uses replaced by refcounting. reduced codesize quite a bit.

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->next = ol;
54 elmex 1.1 }
55    
56     /*
57     * Removes the specified object from the linked list of friendly objects.
58     */
59    
60 root 1.5 void
61     remove_friendly_object (object *op)
62     {
63     objectlink *obj;
64 elmex 1.1
65 root 1.5 CLEAR_FLAG (op, FLAG_FRIENDLY);
66 elmex 1.1
67 root 1.5 if (!first_friendly_object)
68     {
69     LOG (llevError, "remove_friendly_object called with empty friendly list, remove ob=%s\n", &op->name);
70     return;
71     }
72     /* if the first object happens to be the one, processing is pretty
73     * easy.
74     */
75     if (first_friendly_object->ob == op)
76     {
77     obj = first_friendly_object;
78     first_friendly_object = obj->next;
79 root 1.7 delete obj;
80 elmex 1.1 }
81 root 1.5 else
82     {
83     objectlink *prev = first_friendly_object;
84    
85     for (obj = first_friendly_object->next; obj != NULL; obj = obj->next)
86     {
87     if (obj->ob == op)
88     break;
89     prev = obj;
90 root 1.2 }
91 root 1.7
92 root 1.5 if (obj)
93     {
94     prev->next = obj->next;
95 root 1.7 delete obj;
96 root 1.2 }
97 elmex 1.1 }
98     }
99    
100     /*
101     * Dumps all friendly objects. Invoked in DM-mode with the G key.
102     */
103    
104 root 1.5 void
105     dump_friendly_objects (void)
106     {
107     objectlink *ol;
108 elmex 1.1
109 root 1.5 for (ol = first_friendly_object; ol != NULL; ol = ol->next)
110     LOG (llevError, "%s (%d)\n", &ol->ob->name, ol->ob->count);
111 elmex 1.1 }
112    
113     /* New function, MSW 2000-1-14
114     * It traverses the friendly list removing objects that should not be here
115     * (ie, do not have friendly flag set, freed, etc)
116     */
117 root 1.5 void
118     clean_friendly_list (void)
119     {
120     objectlink *obj, *prev = NULL, *next;
121     int count = 0;
122    
123 root 1.7 for (obj = first_friendly_object; obj; obj = next)
124 root 1.5 {
125     next = obj->next;
126 root 1.7 if (QUERY_FLAG (obj->ob, FLAG_FREED) || !QUERY_FLAG (obj->ob, FLAG_FRIENDLY))
127 root 1.5 {
128     if (prev)
129 root 1.7 prev->next = obj->next;
130 root 1.5 else
131 root 1.7 first_friendly_object = obj->next;
132    
133 root 1.5 count++;
134 root 1.7 delete obj;
135 root 1.2 }
136 root 1.5 else
137 root 1.7 /* If we removed the object, then prev is still valid. */
138 root 1.5 prev = obj;
139 elmex 1.1 }
140 root 1.7
141 root 1.5 if (count)
142     LOG (llevDebug, "clean_friendly_list: Removed %d bogus links\n", count);
143 elmex 1.1 }
144    
145     /* Checks if the given object is already in the friendly list or not
146     * Lauwenmark - 31/07/05
147     */
148 root 1.5 int
149     is_friendly (const object *op)
150 elmex 1.1 {
151 root 1.5 objectlink *ol;
152 elmex 1.1
153 root 1.5 for (ol = first_friendly_object; ol != NULL; ol = ol->next)
154     if (ol->ob == op)
155     return 1;
156 elmex 1.1
157 root 1.5 return 0;
158 elmex 1.1 }