FS2_Open
Open source remastering of the Freespace 2 engine
deadobjectdock.cpp
Go to the documentation of this file.
1 /*
2  * Created by Ian "Goober5000" Warfield for the FreeSpace2 Source Code Project.
3  * You may not sell or otherwise commercially exploit the source or things you
4  * create based on the source.
5  */
6 
7 
8 
10 #include "object/object.h"
11 
12 
13 
14 
15 // management prototypes
16 
17 void dead_dock_add_instance(object *objp, int dockpoint, object *other_objp);
18 void dead_dock_remove_instance(object *objp, object *other_objp);
19 dock_instance *dead_dock_find_instance(object *objp, object *other_objp);
20 dock_instance *dead_dock_find_instance(object *objp, int dockpoint);
21 
22 
23 
25 {
26  // are we docked?
27  if (!object_is_dead_docked(objp))
28  return NULL;
29 
30  return objp->dead_dock_list->docked_objp;
31 }
32 
33 int dock_find_dead_dockpoint_used_by_object(object *objp, object *other_objp)
34 {
35  dock_instance *result = dead_dock_find_instance(objp, other_objp);
36 
37  if (result == NULL)
38  return -1;
39  else
40  return result->dockpoint_used;
41 }
42 
43 // dock management functions -------------------------------------------------------------------------------------
44 void dock_dead_dock_objects(object *objp1, int dockpoint1, object *objp2, int dockpoint2)
45 {
46 #ifndef NDEBUG
47  if ((dead_dock_find_instance(objp1, objp2) != NULL) || (dead_dock_find_instance(objp2, objp1) != NULL))
48  {
49  Error(LOCATION, "Trying to dock an object that's already docked!\n");
50  }
51 
52  if ((dead_dock_find_instance(objp1, dockpoint1) != NULL) || (dead_dock_find_instance(objp2, dockpoint2) != NULL))
53  {
54  Error(LOCATION, "Trying to dock to a dockpoint that's in use!\n");
55  }
56 #endif
57 
58  // put objects on each others' dock lists
59  dead_dock_add_instance(objp1, dockpoint1, objp2);
60  dead_dock_add_instance(objp2, dockpoint2, objp1);
61 }
62 
63 void dock_dead_undock_objects(object *objp1, object *objp2)
64 {
65 #ifndef NDEBUG
66  if ((dead_dock_find_instance(objp1, objp2) == NULL) || (dead_dock_find_instance(objp2, objp1) == NULL))
67  {
68  Error(LOCATION, "Trying to undock an object that isn't docked!\n");
69  }
70 #endif
71 
72  // remove objects from each others' dock lists
73  dead_dock_remove_instance(objp1, objp2);
74  dead_dock_remove_instance(objp2, objp1);
75 }
76 
77 void dead_dock_add_instance(object *objp, int dockpoint, object *other_objp)
78 {
79  dock_instance *item;
80 
81  // create item
82  item = (dock_instance *) vm_malloc(sizeof(dock_instance));
83  item->dockpoint_used = dockpoint;
84  item->docked_objp = other_objp;
85 
86  // prepend item to existing list
87  item->next = objp->dead_dock_list;
88  objp->dead_dock_list = item;
89 }
90 
91 void dead_dock_remove_instance(object *objp, object *other_objp)
92 {
93  int found = 0;
94  dock_instance *prev_ptr, *ptr;
95 
96  prev_ptr = NULL;
97  ptr = objp->dead_dock_list;
98 
99  // iterate until item found
100  while (ptr != NULL)
101  {
102  // if found, exit loop
103  if (ptr->docked_objp == other_objp)
104  {
105  found = 1;
106  break;
107  }
108 
109  // iterate
110  prev_ptr = ptr;
111  ptr = ptr->next;
112  }
113 
114  // delete if found
115  if (found)
116  {
117  // special case... found at beginning of list
118  if (prev_ptr == NULL)
119  {
120  objp->dead_dock_list = ptr->next;
121  }
122  // normal case
123  else
124  {
125  prev_ptr->next = ptr->next;
126  }
127 
128  // delete it
129  vm_free(ptr);
130  }
131 }
132 
133 // just free the list without worrying about undocking anything
135 {
136  while (objp->dead_dock_list != NULL)
137  {
138  dock_instance *ptr = objp->dead_dock_list;
139  objp->dead_dock_list = ptr->next;
140  vm_free(ptr);
141  }
142 }
143 
144 dock_instance *dead_dock_find_instance(object *objp, object *other_objp)
145 {
146  dock_instance *ptr = objp->dead_dock_list;
147 
148  // iterate until item found
149  while (ptr != NULL)
150  {
151  // if found, return it
152  if (ptr->docked_objp == other_objp)
153  return ptr;
154 
155  // iterate
156  ptr = ptr->next;
157  }
158 
159  // not found
160  return NULL;
161 }
162 
164 {
165  dock_instance *ptr = objp->dead_dock_list;
166 
167  // iterate until item found
168  while (ptr != NULL)
169  {
170  // if found, return it
171  if (ptr->dockpoint_used == dockpoint)
172  return ptr;
173 
174  // iterate
175  ptr = ptr->next;
176  }
177 
178  // not found
179  return NULL;
180 }
void dock_dead_dock_objects(object *objp1, int dockpoint1, object *objp2, int dockpoint2)
GLuint64EXT * result
Definition: Glext.h:10775
void dead_dock_add_instance(object *objp, int dockpoint, object *other_objp)
#define vm_free(ptr)
Definition: pstypes.h:548
void dock_dead_undock_objects(object *objp1, object *objp2)
int dockpoint_used
Definition: objectdock.h:21
dock_instance * next
Definition: objectdock.h:19
object * objp
Definition: lua.cpp:3105
int dock_find_dead_dockpoint_used_by_object(object *objp, object *other_objp)
dock_instance * dead_dock_find_instance(object *objp, object *other_objp)
object * dock_get_first_dead_docked_object(object *objp)
int object_is_dead_docked(object *objp)
Definition: object.cpp:2025
void dock_free_dead_dock_list(object *objp)
void dead_dock_remove_instance(object *objp, object *other_objp)
void _cdecl void void _cdecl Error(const char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
#define vm_malloc(size)
Definition: pstypes.h:547
#define LOCATION
Definition: pstypes.h:245
object * docked_objp
Definition: objectdock.h:22
dock_instance * dead_dock_list
Definition: object.h:167