ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/friend.C
Revision: 1.13
Committed: Thu May 17 21:32:08 2007 UTC (17 years ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_1
Changes since 1.12: +1 -1 lines
Log Message:
- prepare common/ for head_ => head change
- add some copyrights for files where they were missing

File Contents

# User Rev Content
1 elmex 1.1 /*
2 root 1.13 * CrossFire, A Multiplayer game
3 pippijn 1.10 *
4     * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
5     * Copyright (C) 2002 Mark Wedel & Crossfire Development Team
6     * Copyright (C) 1992 Frank Tore Johansen
7     *
8     * This program is free software; you can redistribute it and/or modify
9     * it under the terms of the GNU General Public License as published by
10     * the Free Software Foundation; either version 2 of the License, or
11     * (at your option) any later version.
12     *
13     * This program is distributed in the hope that it will be useful,
14     * but WITHOUT ANY WARRANTY; without even the implied warranty of
15     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16     * GNU General Public License for more details.
17     *
18     * You should have received a copy of the GNU General Public License
19     * along with this program; if not, write to the Free Software
20     * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21     *
22     * The authors can be reached via e-mail at <crossfire@schmorp.de>
23     */
24 elmex 1.1
25     #include <global.h>
26    
27     /*
28     * Add a new friendly object to the linked list of friendly objects.
29     * No checking to see if the object is already in the linked list is done.
30     */
31 root 1.5 void
32     add_friendly_object (object *op)
33     {
34 root 1.9 op->flag [FLAG_FRIENDLY] = 1;
35    
36 root 1.5 objectlink *ol;
37 elmex 1.1
38 root 1.5 /* Add some error checking. This shouldn't happen, but the friendly
39     * object list usually isn't very long, and remove_friendly_object
40     * won't remove it either. Plus, it is easier to put a breakpoint in
41     * the debugger here and see where the problem is happening.
42     */
43 root 1.9 for (ol = first_friendly_object; ol; ol = ol->next)
44 root 1.5 {
45     if (ol->ob == op)
46     {
47     LOG (llevError, "add_friendly_object: Trying to add object already on list (%s)\n", &op->name);
48     return;
49 root 1.2 }
50 elmex 1.1 }
51    
52 root 1.5 ol = first_friendly_object;
53     first_friendly_object = get_objectlink ();
54     first_friendly_object->ob = op;
55     first_friendly_object->next = ol;
56 elmex 1.1 }
57    
58     /*
59     * Removes the specified object from the linked list of friendly objects.
60     */
61 root 1.5 void
62     remove_friendly_object (object *op)
63     {
64     objectlink *obj;
65 elmex 1.1
66 root 1.5 CLEAR_FLAG (op, FLAG_FRIENDLY);
67 elmex 1.1
68 root 1.11 if (op->type == GOLEM
69     && op->owner
70     && op->owner->contr
71 root 1.12 && op->owner->contr->golem == op)
72     op->owner->contr->golem = 0;
73 root 1.11
74 root 1.5 if (!first_friendly_object)
75     {
76     LOG (llevError, "remove_friendly_object called with empty friendly list, remove ob=%s\n", &op->name);
77     return;
78     }
79 root 1.9
80 root 1.5 /* if the first object happens to be the one, processing is pretty
81     * easy.
82     */
83     if (first_friendly_object->ob == op)
84     {
85     obj = first_friendly_object;
86     first_friendly_object = obj->next;
87 root 1.7 delete obj;
88 elmex 1.1 }
89 root 1.5 else
90     {
91     objectlink *prev = first_friendly_object;
92    
93 root 1.9 for (obj = first_friendly_object->next; obj; obj = obj->next)
94 root 1.5 {
95     if (obj->ob == op)
96     break;
97 root 1.11
98 root 1.5 prev = obj;
99 root 1.2 }
100 root 1.7
101 root 1.5 if (obj)
102     {
103     prev->next = obj->next;
104 root 1.7 delete obj;
105 root 1.2 }
106 elmex 1.1 }
107     }
108    
109     /*
110 root 1.9 * Dumps all friendly objects.
111 elmex 1.1 */
112 root 1.5 void
113     dump_friendly_objects (void)
114     {
115     objectlink *ol;
116 elmex 1.1
117 root 1.9 for (ol = first_friendly_object; ol; ol = ol->next)
118 root 1.5 LOG (llevError, "%s (%d)\n", &ol->ob->name, ol->ob->count);
119 elmex 1.1 }
120    
121     /* New function, MSW 2000-1-14
122     * It traverses the friendly list removing objects that should not be here
123     * (ie, do not have friendly flag set, freed, etc)
124     */
125 root 1.5 void
126     clean_friendly_list (void)
127     {
128     objectlink *obj, *prev = NULL, *next;
129     int count = 0;
130    
131 root 1.7 for (obj = first_friendly_object; obj; obj = next)
132 root 1.5 {
133     next = obj->next;
134 root 1.7 if (QUERY_FLAG (obj->ob, FLAG_FREED) || !QUERY_FLAG (obj->ob, FLAG_FRIENDLY))
135 root 1.5 {
136     if (prev)
137 root 1.7 prev->next = obj->next;
138 root 1.5 else
139 root 1.7 first_friendly_object = obj->next;
140    
141 root 1.5 count++;
142 root 1.7 delete obj;
143 root 1.2 }
144 root 1.5 else
145 root 1.7 /* If we removed the object, then prev is still valid. */
146 root 1.5 prev = obj;
147 elmex 1.1 }
148 root 1.7
149 root 1.5 if (count)
150     LOG (llevDebug, "clean_friendly_list: Removed %d bogus links\n", count);
151 elmex 1.1 }
152    
153     /* Checks if the given object is already in the friendly list or not
154     * Lauwenmark - 31/07/05
155     */
156 root 1.5 int
157     is_friendly (const object *op)
158 elmex 1.1 {
159 root 1.5 objectlink *ol;
160 elmex 1.1
161 root 1.9 for (ol = first_friendly_object; ol; ol = ol->next)
162 root 1.5 if (ol->ob == op)
163     return 1;
164 elmex 1.1
165 root 1.5 return 0;
166 elmex 1.1 }
167 root 1.9