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.5 by root, Sun Sep 10 16:00:23 2006 UTC vs.
Revision 1.9 by root, Mon Jan 8 01:19:02 2007 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines