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.3 by root, Thu Aug 31 17:54:14 2006 UTC vs.
Revision 1.7 by root, Sun Oct 15 02:16:34 2006 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines