ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/friend.C
(Generate patch)

Comparing deliantra/server/common/friend.C (file contents):
Revision 1.4 by root, Sun Sep 3 00:18:39 2006 UTC vs.
Revision 1.6 by root, Thu Sep 14 22:33:58 2006 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines