naev 0.11.5
start.c
Go to the documentation of this file.
1/*
2 * See Licensing and Copyright notice in naev.h
3 */
12#include "naev.h"
15#include "start.h"
16
17#include "log.h"
18#include "ndata.h"
19#include "nxml.h"
20#include "damagetype.h"
21
22#define XML_START_ID "Start"
27typedef struct ndata_start_s {
28 char *name;
29 char *ship;
30 char *shipname;
31 char *acquired;
32 char *gui;
33 unsigned int credits;
34 ntime_t date;
35 char *system;
36 double x;
37 double y;
38 char *mission;
39 char *event;
40 char *chapter;
52int start_load (void)
53{
54 int date_set = 0;
55 xmlNodePtr node;
56 xmlDocPtr doc;
57
58 memset( &start_data, 0, sizeof(ndata_start_t) );
59
60 /* Try to read the file. */
61 doc = xml_parsePhysFS( START_DATA_PATH );
62 if (doc == NULL)
63 return -1;
64
65 node = doc->xmlChildrenNode;
66 if (!xml_isNode(node,XML_START_ID)) {
67 ERR( _("Malformed '%s' file: missing root element '%s'"), START_DATA_PATH, XML_START_ID );
68 return -1;
69 }
70
71 node = node->xmlChildrenNode; /* first system node */
72 if (node == NULL) {
73 ERR( _("Malformed '%s' file: does not contain elements"), START_DATA_PATH );
74 return -1;
75 }
76 do {
77 xml_onlyNodes(node);
78
79 xmlr_strd( node, "name", start_data.name );
80
81 if (xml_isNode(node, "player")) { /* we are interested in the player */
82 xmlNodePtr cur = node->children;
83 do {
84 xml_onlyNodes(cur);
85
86 xmlr_uint( cur, "credits", start_data.credits );
87 xmlr_strd( cur, "mission", start_data.mission );
88 xmlr_strd( cur, "event", start_data.event );
89 xmlr_strd( cur, "chapter", start_data.chapter );
90 xmlr_strd( cur, "gui", start_data.gui );
91
92 if (xml_isNode(cur,"ship")) {
93 xmlr_attr_strd( cur, "name", start_data.shipname );
94 xmlr_attr_strd( cur, "acquired", start_data.acquired );
95 xmlr_strd( cur, "ship", start_data.ship );
96 }
97 else if (xml_isNode(cur, "system")) {
98 xmlNodePtr tmp = cur->children;
99 do {
100 xml_onlyNodes(tmp);
102 xmlr_strd( tmp, "name", start_data.system );
103 /* position */
104 xmlr_float( tmp, "x", start_data.x );
105 xmlr_float( tmp, "y", start_data.y );
106 WARN(_("'%s' has unknown system node '%s'."), START_DATA_PATH, tmp->name);
107 } while (xml_nextNode(tmp));
108 continue;
109 }
110 WARN(_("'%s' has unknown player node '%s'."), START_DATA_PATH, cur->name);
111 } while (xml_nextNode(cur));
112 continue;
113 }
114
115 if (xml_isNode(node, "date")) {
116 int cycles, periods, seconds;
117 xmlr_attr_int( node, "scu", cycles );
118 xmlr_attr_int( node, "stp", periods );
119 xmlr_attr_int( node, "stu", seconds );
120
121 /* Post process. */
122 start_data.date = ntime_create( cycles, periods, seconds );
123 date_set = 1;
124 continue;
125 }
126
127 xmlr_strd( node, "spob_lua_default", start_data.spob_lua_default );
128 xmlr_strd( node, "dtype_default", start_data.dtype_default );
129 xmlr_strd( node, "local_map_default", start_data.local_map_default );
130
131 WARN(_("'%s' has unknown node '%s'."), START_DATA_PATH, node->name);
132 } while (xml_nextNode(node));
133
134 /* Clean up. */
135 xmlFreeDoc(doc);
136
137 /* Safety checking. */
138#define MELEMENT(o,s) \
139 if (o) WARN(_("Module start data missing/invalid '%s' element"), s)
140 MELEMENT( start_data.name==NULL, "name" );
141 MELEMENT( start_data.credits==0, "credits" );
142 MELEMENT( start_data.ship==NULL, "ship" );
143 MELEMENT( start_data.gui==NULL, "gui" );
144 MELEMENT( start_data.acquired==NULL, "acquired" );
145 MELEMENT( start_data.system==NULL, "player system" );
146 MELEMENT( start_data.chapter==NULL, "chapter" );
147 MELEMENT( !date_set, "date" );
148#undef MELEMENT
149
150 return 0;
151}
152
156void start_cleanup (void)
157{
158 free( start_data.name );
159 free( start_data.shipname );
160 free( start_data.acquired );
161 free( start_data.gui );
162 free( start_data.ship );
163 free( start_data.system );
164 free( start_data.mission );
165 free( start_data.event );
166 free( start_data.chapter );
170 memset( &start_data, 0, sizeof(start_data) );
171}
172
177const char* start_name (void)
178{
179 return start_data.name;
180}
181
186const char* start_ship (void)
187{
188 return start_data.ship;
189}
190
195const char* start_shipname (void)
196{
197 return start_data.shipname;
198}
199
204const char* start_acquired (void)
205{
206 return start_data.acquired;
207}
208
213const char* start_gui (void)
214{
215 return start_data.gui;
216}
217
222unsigned int start_credits (void)
223{
224 return start_data.credits;
225}
226
231ntime_t start_date (void)
232{
233 return start_data.date;
234}
235
240const char* start_system (void)
241{
242 return start_data.system;
243}
244
250void start_position( double *x, double *y )
251{
252 *x = start_data.x;
253 *y = start_data.y;
254}
255
260const char* start_mission (void)
261{
262 return start_data.mission;
263}
264
269const char* start_event (void)
270{
271 return start_data.event;
272}
273
278const char* start_chapter (void)
279{
280 return start_data.chapter;
281}
282
287const char* start_spob_lua_default (void)
288{
290}
291
296const char* start_dtype_default (void)
297{
299}
300
305const char* start_local_map_default (void)
306{
308}
Header file with generic functions and naev-specifics.
ntime_t ntime_create(int scu, int stp, int stu)
Creates a time structure.
Definition ntime.c:94
xmlDocPtr xml_parsePhysFS(const char *filename)
Analogous to xmlParseMemory/xmlParseFile.
Definition nxml.c:75
static ndata_start_t start_data
Definition start.c:45
const char * start_acquired(void)
Gets the module's starting ship was acquired.
Definition start.c:204
const char * start_event(void)
Gets the starting event of the player.
Definition start.c:269
void start_cleanup(void)
Cleans up after the module start data.
Definition start.c:156
const char * start_local_map_default(void)
Gets the default local map.
Definition start.c:305
int start_load(void)
Loads the module start data.
Definition start.c:52
const char * start_mission(void)
Gets the starting mission of the player.
Definition start.c:260
void start_position(double *x, double *y)
Gets the starting position of the player.
Definition start.c:250
const char * start_chapter(void)
Gets the player's starting chapter.
Definition start.c:278
const char * start_name(void)
Gets the module name.
Definition start.c:177
const char * start_dtype_default(void)
Gets the default damage type.
Definition start.c:296
const char * start_ship(void)
Gets the module player starting ship.
Definition start.c:186
ntime_t start_date(void)
Gets the starting date.
Definition start.c:231
const char * start_spob_lua_default(void)
Gets the default spob Lua file.
Definition start.c:287
const char * start_shipname(void)
Gets the module's starting ship's name.
Definition start.c:195
const char * start_gui(void)
Gets the module's starting ship was acquired.
Definition start.c:213
const char * start_system(void)
Gets the starting system name.
Definition start.c:240
#define XML_START_ID
Definition start.c:22
unsigned int start_credits(void)
Gets the player's starting credits.
Definition start.c:222
The start data structure.
Definition start.c:27
char * event
Definition start.c:39
char * local_map_default
Definition start.c:43
char * mission
Definition start.c:38
char * system
Definition start.c:35
char * ship
Definition start.c:29
char * name
Definition start.c:28
char * chapter
Definition start.c:40
char * spob_lua_default
Definition start.c:41
char * shipname
Definition start.c:30
char * gui
Definition start.c:32
char * acquired
Definition start.c:31
double y
Definition start.c:37
ntime_t date
Definition start.c:34
char * dtype_default
Definition start.c:42
unsigned int credits
Definition start.c:33
double x
Definition start.c:36