/
claim.c
243 lines (193 loc) · 4.41 KB
/
claim.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
/*
* See Licensing and Copyright notice in naev.h
*/
/**
* @file claim.c
*
* @brief Handles claiming of systems.
*/
#include "claim.h"
#include "naev.h"
#include "log.h"
#include "space.h"
#include "array.h"
#include "event.h"
#include "mission.h"
/**
* @brief The claim structure.
*/
struct SysClaim_s {
int *ids; /**< System ids. */
};
/**
* @brief Creates a system claim.
*
* @return Newly created system claim or NULL on error.
*/
SysClaim_t *claim_create (void)
{
SysClaim_t *claim;
claim = malloc( sizeof(SysClaim_t) );
claim->ids = NULL;
return claim;
}
/**
* @brief Adds a claim to a system claim.
*
* @param claim Claim to add system to.
* @param ss_id Id of the system to add to the claim.
*/
int claim_add( SysClaim_t *claim, int ss_id )
{
int *id;
/* Allocate if necessary. */
if (claim->ids == NULL)
claim->ids = array_create( int );
/* New ID. */
id = &array_grow( &claim->ids );
*id = ss_id;
return 0;
}
/**
* @brief Tests to see if a system claim would have collisions.
*
* @param claim System to test.
* @return 0 if no collision found, 1 if a collision was found.
*/
int claim_test( SysClaim_t *claim )
{
int claimed;
int i;
/* Make sure something to activate. */
if (claim->ids == NULL)
return 0;
/* Check flags. */
for (i=0; i<array_size(claim->ids); i++) {
claimed = sys_isFlag( system_getIndex(claim->ids[i]), SYSTEM_CLAIMED );
if (claimed)
return 1;
}
return 0;
}
/**
* @brief Tests to see if a system is claimed by a system claim.
*
* @param claim System claim to test.
* @param sys System to see if is claimed by the system claim.
* @return 0 if no collision is found, 1 otherwise.
*/
int claim_testSys( SysClaim_t *claim, int sys )
{
int i;
/* Must actually have a claim. */
if (claim == NULL)
return 0;
/* Make sure something to activate. */
if (claim->ids == NULL)
return 0;
/* See if the system is claimed. */
for (i=0; i<array_size(claim->ids); i++)
if (claim->ids[i] == sys)
return 1;
return 0;
}
/**
* @brief Destroys a system claim.
*
* @param claim System claim to destroy.
*/
void claim_destroy( SysClaim_t *claim )
{
if (claim->ids != NULL)
array_free( claim->ids );
free(claim);
}
/**
* @brief Clears the claims on all systems.
*/
void claim_clear (void)
{
StarSystem *sys;
int nsys;
int i;
/* Clears all the flags. */
sys = system_getAll( &nsys );
for (i=0; i<nsys; i++)
sys_rmFlag( &sys[i], SYSTEM_CLAIMED );
}
/**
* @brief Activates all the claims.
*/
void claim_activateAll (void)
{
claim_clear();
event_activateClaims();
missions_activateClaims();
}
/**
* @brief Activates a claim on a system.
*
* @param claim Claim to activate.
*/
void claim_activate( SysClaim_t *claim )
{
int i;
/* Make sure something to activate. */
if (claim->ids == NULL)
return;
/* Add flags. */
for (i=0; i<array_size(claim->ids); i++)
sys_setFlag( system_getIndex(claim->ids[i]), SYSTEM_CLAIMED );
}
/**
* @brief Saves all the systems in a claim in XML.
*
* Use between xmlw_startElem and xmlw_endElem.
*
* @param writer XML Writer to use.
* @param claim Claim to save.
*/
int claim_xmlSave( xmlTextWriterPtr writer, SysClaim_t *claim )
{
int i;
StarSystem *sys;
if ((claim == NULL) || (claim->ids == NULL))
return 0;
for (i=0; i<array_size(claim->ids); i++) {
sys = system_getIndex( claim->ids[i] );
if (sys != NULL) {
xmlw_elem( writer, "sys", "%s", sys->name );
}
else
WARN("System Claim has inexistent system.");
}
return 0;
}
/**
* @brief Loads a claim.
*
* @param parent Parent node containing the claim data.
* @return The system claim.
*/
SysClaim_t *claim_xmlLoad( xmlNodePtr parent )
{
SysClaim_t *claim;
xmlNodePtr node;
StarSystem *sys;
/* Create the claim. */
claim = claim_create();
/* Load the nodes. */
node = parent->xmlChildrenNode;
do {
if (xml_isNode(node,"sys")) {
sys = system_get( xml_get(node) );
if (sys != NULL)
claim_add( claim, system_index(sys) );
else
WARN("System Claim trying to load system '%s' which doesn't exist.", xml_get(node));
}
} while (xml_nextNode(node));
/* Activate the claim. */
claim_activate( claim );
return claim;
}