naev 0.12.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"
14
15#include "start.h"
16
17#include "log.h"
18#include "ndata.h"
19#include "nxml.h"
20
21#define XML_START_ID "Start"
22
26typedef struct ndata_start_s {
27 char *name;
28 char *ship;
29 char *shipname;
30 char *acquired;
31 char *gui;
32 unsigned int credits;
33 ntime_t date;
34 char *system;
35 double x;
36 double y;
37 char *mission;
38 char *event;
39 char *chapter;
45
51int start_load( void )
52{
53 int date_set = 0;
54 xmlNodePtr node;
55 xmlDocPtr doc;
56
57 memset( &start_data, 0, sizeof( ndata_start_t ) );
58
59 /* Try to read the file. */
60 doc = xml_parsePhysFS( START_DATA_PATH );
61 if ( doc == NULL )
62 return -1;
63
64 node = doc->xmlChildrenNode;
65 if ( !xml_isNode( node, XML_START_ID ) ) {
66 WARN( _( "Malformed '%s' file: missing root element '%s'" ),
67 START_DATA_PATH, XML_START_ID );
68 return -1;
69 }
70
71 node = node->xmlChildrenNode; /* first system node */
72 if ( node == NULL ) {
73 WARN( _( "Malformed '%s' file: does not contain elements" ),
74 START_DATA_PATH );
75 return -1;
76 }
77 do {
78 xml_onlyNodes( node );
79
80 xmlr_strd( node, "name", start_data.name );
81
82 if ( xml_isNode( node,
83 "player" ) ) { /* we are interested in the player */
84 xmlNodePtr cur = node->children;
85 do {
86 xml_onlyNodes( cur );
87
88 xmlr_uint( cur, "credits", start_data.credits );
89 xmlr_strd( cur, "mission", start_data.mission );
90 xmlr_strd( cur, "event", start_data.event );
91 xmlr_strd( cur, "chapter", start_data.chapter );
92 xmlr_strd( cur, "gui", start_data.gui );
93
94 if ( xml_isNode( cur, "ship" ) ) {
95 xmlr_attr_strd( cur, "name", start_data.shipname );
96 xmlr_attr_strd( cur, "acquired", start_data.acquired );
97 xmlr_strd( cur, "ship", start_data.ship );
98 } else if ( xml_isNode( cur, "system" ) ) {
99 xmlNodePtr tmp = cur->children;
100 do {
101 xml_onlyNodes( tmp );
103 xmlr_strd( tmp, "name", start_data.system );
104 /* position */
105 xmlr_float( tmp, "x", start_data.x );
106 xmlr_float( tmp, "y", start_data.y );
107 WARN( _( "'%s' has unknown system node '%s'." ),
108 START_DATA_PATH, tmp->name );
109 } while ( xml_nextNode( tmp ) );
110 continue;
111 }
112 WARN( _( "'%s' has unknown player node '%s'." ), START_DATA_PATH,
113 cur->name );
114 } while ( xml_nextNode( cur ) );
115 continue;
116 }
117
118 if ( xml_isNode( node, "date" ) ) {
119 int cycles, periods, seconds;
120 xmlr_attr_int( node, "scu", cycles );
121 xmlr_attr_int( node, "stp", periods );
122 xmlr_attr_int( node, "stu", seconds );
123
124 /* Post process. */
125 start_data.date = ntime_create( cycles, periods, seconds );
126 date_set = 1;
127 continue;
128 }
129
130 xmlr_strd( node, "spob_lua_default", start_data.spob_lua_default );
131 xmlr_strd( node, "dtype_default", start_data.dtype_default );
132 xmlr_strd( node, "local_map_default", start_data.local_map_default );
133
134 WARN( _( "'%s' has unknown node '%s'." ), START_DATA_PATH, node->name );
135 } while ( xml_nextNode( node ) );
136
137 /* Clean up. */
138 xmlFreeDoc( doc );
139
140 /* Safety checking. */
141#define MELEMENT( o, s ) \
142 if ( o ) \
143 WARN( _( "Module start data missing/invalid '%s' element" ), \
144 s )
145 MELEMENT( start_data.name == NULL, "name" );
146 MELEMENT( start_data.credits == 0, "credits" );
147 MELEMENT( start_data.ship == NULL, "ship" );
148 MELEMENT( start_data.gui == NULL, "gui" );
149 MELEMENT( start_data.acquired == NULL, "acquired" );
150 MELEMENT( start_data.system == NULL, "player system" );
151 MELEMENT( start_data.chapter == NULL, "chapter" );
152 MELEMENT( !date_set, "date" );
153#undef MELEMENT
154
155 return 0;
156}
157
161void start_cleanup( void )
162{
163 free( start_data.name );
164 free( start_data.shipname );
165 free( start_data.acquired );
166 free( start_data.gui );
167 free( start_data.ship );
168 free( start_data.system );
169 free( start_data.mission );
170 free( start_data.event );
171 free( start_data.chapter );
172 free( start_data.spob_lua_default );
173 free( start_data.dtype_default );
174 free( start_data.local_map_default );
175 memset( &start_data, 0, sizeof( start_data ) );
176}
177
182const char *start_name( void )
183{
184 return start_data.name;
185}
186
191const char *start_ship( void )
192{
193 return start_data.ship;
194}
195
200const char *start_shipname( void )
201{
202 return start_data.shipname;
203}
204
209const char *start_acquired( void )
210{
211 return start_data.acquired;
212}
213
218const char *start_gui( void )
219{
220 return start_data.gui;
221}
222
227unsigned int start_credits( void )
228{
229 return start_data.credits;
230}
231
236ntime_t start_date( void )
237{
238 return start_data.date;
239}
240
245const char *start_system( void )
246{
247 return start_data.system;
248}
249
255void start_position( double *x, double *y )
256{
257 *x = start_data.x;
258 *y = start_data.y;
259}
260
265const char *start_mission( void )
266{
267 return start_data.mission;
268}
269
274const char *start_event( void )
275{
276 return start_data.event;
277}
278
283const char *start_chapter( void )
284{
285 return start_data.chapter;
286}
287
292const char *start_spob_lua_default( void )
293{
294 return start_data.spob_lua_default;
295}
296
301const char *start_dtype_default( void )
302{
303 return start_data.dtype_default;
304}
305
310const char *start_local_map_default( void )
311{
312 return start_data.local_map_default;
313}
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:99
xmlDocPtr xml_parsePhysFS(const char *filename)
Analogous to xmlParseMemory/xmlParseFile.
Definition nxml.c:70
static ndata_start_t start_data
Definition start.c:44
const char * start_acquired(void)
Gets the module's starting ship was acquired.
Definition start.c:209
const char * start_event(void)
Gets the starting event of the player.
Definition start.c:274
void start_cleanup(void)
Cleans up after the module start data.
Definition start.c:161
const char * start_local_map_default(void)
Gets the default local map.
Definition start.c:310
int start_load(void)
Loads the module start data.
Definition start.c:51
const char * start_mission(void)
Gets the starting mission of the player.
Definition start.c:265
void start_position(double *x, double *y)
Gets the starting position of the player.
Definition start.c:255
const char * start_chapter(void)
Gets the player's starting chapter.
Definition start.c:283
const char * start_name(void)
Gets the module name.
Definition start.c:182
const char * start_dtype_default(void)
Gets the default damage type.
Definition start.c:301
const char * start_ship(void)
Gets the module player starting ship.
Definition start.c:191
ntime_t start_date(void)
Gets the starting date.
Definition start.c:236
const char * start_spob_lua_default(void)
Gets the default spob Lua file.
Definition start.c:292
const char * start_shipname(void)
Gets the module's starting ship's name.
Definition start.c:200
const char * start_gui(void)
Gets the module's starting ship was acquired.
Definition start.c:218
const char * start_system(void)
Gets the starting system name.
Definition start.c:245
#define XML_START_ID
Definition start.c:21
unsigned int start_credits(void)
Gets the player's starting credits.
Definition start.c:227
The start data structure.
Definition start.c:26
char * event
Definition start.c:38
char * local_map_default
Definition start.c:42
char * mission
Definition start.c:37
char * system
Definition start.c:34
char * ship
Definition start.c:28
char * name
Definition start.c:27
char * chapter
Definition start.c:39
char * spob_lua_default
Definition start.c:40
char * shipname
Definition start.c:29
char * gui
Definition start.c:31
char * acquired
Definition start.c:30
double y
Definition start.c:36
ntime_t date
Definition start.c:33
char * dtype_default
Definition start.c:41
unsigned int credits
Definition start.c:32
double x
Definition start.c:35