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, 7 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

# Content
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 The authors can be reached via e-mail at <crossfire@schmorp.de>
22 */
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 void
32 add_friendly_object (object *op)
33 {
34 objectlink *ol;
35
36 /* 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 }
48 }
49
50 ol = first_friendly_object;
51 first_friendly_object = get_objectlink ();
52 first_friendly_object->ob = op;
53 first_friendly_object->next = ol;
54 }
55
56 /*
57 * Removes the specified object from the linked list of friendly objects.
58 */
59
60 void
61 remove_friendly_object (object *op)
62 {
63 objectlink *obj;
64
65 CLEAR_FLAG (op, FLAG_FRIENDLY);
66
67 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 delete obj;
80 }
81 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 }
91
92 if (obj)
93 {
94 prev->next = obj->next;
95 delete obj;
96 }
97 }
98 }
99
100 /*
101 * Dumps all friendly objects. Invoked in DM-mode with the G key.
102 */
103
104 void
105 dump_friendly_objects (void)
106 {
107 objectlink *ol;
108
109 for (ol = first_friendly_object; ol != NULL; ol = ol->next)
110 LOG (llevError, "%s (%d)\n", &ol->ob->name, ol->ob->count);
111 }
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 void
118 clean_friendly_list (void)
119 {
120 objectlink *obj, *prev = NULL, *next;
121 int count = 0;
122
123 for (obj = first_friendly_object; obj; obj = next)
124 {
125 next = obj->next;
126 if (QUERY_FLAG (obj->ob, FLAG_FREED) || !QUERY_FLAG (obj->ob, FLAG_FRIENDLY))
127 {
128 if (prev)
129 prev->next = obj->next;
130 else
131 first_friendly_object = obj->next;
132
133 count++;
134 delete obj;
135 }
136 else
137 /* If we removed the object, then prev is still valid. */
138 prev = obj;
139 }
140
141 if (count)
142 LOG (llevDebug, "clean_friendly_list: Removed %d bogus links\n", count);
143 }
144
145 /* Checks if the given object is already in the friendly list or not
146 * Lauwenmark - 31/07/05
147 */
148 int
149 is_friendly (const object *op)
150 {
151 objectlink *ol;
152
153 for (ol = first_friendly_object; ol != NULL; ol = ol->next)
154 if (ol->ob == op)
155 return 1;
156
157 return 0;
158 }