naev 0.10.4
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
21#define XML_START_ID "Start"
26typedef struct ndata_start_s {
27 char *name;
28 char *ship;
29 char *shipname;
30 char *acquired;
31 unsigned int credits;
32 ntime_t date;
33 char *system;
34 double x;
35 double y;
36 char *mission;
37 char *event;
38 char *chapter;
48int start_load (void)
49{
50 int date_set = 0;
51 xmlNodePtr node;
52 xmlDocPtr doc;
53
54 memset( &start_data, 0, sizeof(ndata_start_t) );
55
56 /* Try to read the file. */
57 doc = xml_parsePhysFS( START_DATA_PATH );
58 if (doc == NULL)
59 return -1;
60
61 node = doc->xmlChildrenNode;
62 if (!xml_isNode(node,XML_START_ID)) {
63 ERR( _("Malformed '%s' file: missing root element '%s'"), START_DATA_PATH, XML_START_ID );
64 return -1;
65 }
66
67 node = node->xmlChildrenNode; /* first system node */
68 if (node == NULL) {
69 ERR( _("Malformed '%s' file: does not contain elements"), START_DATA_PATH );
70 return -1;
71 }
72 do {
73 xml_onlyNodes(node);
74
75 xmlr_strd( node, "name", start_data.name );
76
77 if (xml_isNode(node, "player")) { /* we are interested in the player */
78 xmlNodePtr cur = node->children;
79 do {
80 xml_onlyNodes(cur);
81
82 xmlr_uint( cur, "credits", start_data.credits );
83 xmlr_strd( cur, "mission", start_data.mission );
84 xmlr_strd( cur, "event", start_data.event );
85 xmlr_strd( cur, "chapter", start_data.chapter );
86
87 if (xml_isNode(cur,"ship")) {
88 xmlr_attr_strd( cur, "name", start_data.shipname );
89 xmlr_attr_strd( cur, "acquired", start_data.acquired );
90 xmlr_strd( cur, "ship", start_data.ship );
91 }
92 else if (xml_isNode(cur, "system")) {
93 xmlNodePtr tmp = cur->children;
94 do {
95 xml_onlyNodes(tmp);
97 xmlr_strd( tmp, "name", start_data.system );
98 /* position */
99 xmlr_float( tmp, "x", start_data.x );
100 xmlr_float( tmp, "y", start_data.y );
101 WARN(_("'%s' has unknown system node '%s'."), START_DATA_PATH, tmp->name);
102 } while (xml_nextNode(tmp));
103 continue;
104 }
105 WARN(_("'%s' has unknown player node '%s'."), START_DATA_PATH, cur->name);
106 } while (xml_nextNode(cur));
107 continue;
108 }
109
110 if (xml_isNode(node, "date")) {
111 int cycles, periods, seconds;
112 xmlr_attr_int( node, "scu", cycles );
113 xmlr_attr_int( node, "stp", periods );
114 xmlr_attr_int( node, "stu", seconds );
115
116 /* Post process. */
117 start_data.date = ntime_create( cycles, periods, seconds );
118 date_set = 1;
119 continue;
120 }
121
122 xmlr_strd( node, "spob_lua_default", start_data.spob_lua_default );
123
124 WARN(_("'%s' has unknown node '%s'."), START_DATA_PATH, node->name);
125 } while (xml_nextNode(node));
126
127 /* Clean up. */
128 xmlFreeDoc(doc);
129
130 /* Safety checking. */
131#define MELEMENT(o,s) \
132 if (o) WARN(_("Module start data missing/invalid '%s' element"), s)
133 MELEMENT( start_data.name==NULL, "name" );
134 MELEMENT( start_data.credits==0, "credits" );
135 MELEMENT( start_data.ship==NULL, "ship" );
136 MELEMENT( start_data.system==NULL, "player system" );
137 MELEMENT( start_data.chapter==NULL, "chapter" );
138 MELEMENT( !date_set, "date" );
139#undef MELEMENT
140
141 return 0;
142}
143
147void start_cleanup (void)
148{
149 free( start_data.name );
150 free( start_data.shipname );
151 free( start_data.acquired );
152 free( start_data.ship );
153 free( start_data.system );
154 free( start_data.mission );
155 free( start_data.event );
156 free( start_data.chapter );
158 memset( &start_data, 0, sizeof(start_data) );
159}
160
165const char* start_name (void)
166{
167 return start_data.name;
168}
169
174const char* start_ship (void)
175{
176 return start_data.ship;
177}
178
183const char* start_shipname (void)
184{
185 return start_data.shipname;
186}
187
192const char* start_acquired (void)
193{
194 return start_data.acquired;
195}
196
201unsigned int start_credits (void)
202{
203 return start_data.credits;
204}
205
210ntime_t start_date (void)
211{
212 return start_data.date;
213}
214
219const char* start_system (void)
220{
221 return start_data.system;
222}
223
229void start_position( double *x, double *y )
230{
231 *x = start_data.x;
232 *y = start_data.y;
233}
234
239const char* start_mission (void)
240{
241 return start_data.mission;
242}
243
248const char* start_event (void)
249{
250 return start_data.event;
251}
252
257const char* start_chapter (void)
258{
259 return start_data.chapter;
260}
261
266const char* start_spob_lua_default (void)
267{
269}
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:41
const char * start_acquired(void)
Gets the module's starting ship was acquired.
Definition: start.c:192
const char * start_event(void)
Gets the starting event of the player.
Definition: start.c:248
void start_cleanup(void)
Cleans up after the module start data.
Definition: start.c:147
int start_load(void)
Loads the module start data.
Definition: start.c:48
const char * start_mission(void)
Gets the starting mission of the player.
Definition: start.c:239
void start_position(double *x, double *y)
Gets the starting position of the player.
Definition: start.c:229
const char * start_chapter(void)
Gets the player's starting chapter.
Definition: start.c:257
const char * start_name(void)
Gets the module name.
Definition: start.c:165
const char * start_ship(void)
Gets the module player starting ship.
Definition: start.c:174
ntime_t start_date(void)
Gets the starting date.
Definition: start.c:210
const char * start_spob_lua_default(void)
Gets the default spob Lua file.
Definition: start.c:266
const char * start_shipname(void)
Gets the module's starting ship's name.
Definition: start.c:183
const char * start_system(void)
Gets the starting system name.
Definition: start.c:219
#define XML_START_ID
Definition: start.c:21
unsigned int start_credits(void)
Gets the player's starting credits.
Definition: start.c:201
The start data structure.
Definition: start.c:26
char * event
Definition: start.c:37
char * mission
Definition: start.c:36
char * system
Definition: start.c:33
char * ship
Definition: start.c:28
char * name
Definition: start.c:27
char * chapter
Definition: start.c:38
char * spob_lua_default
Definition: start.c:39
char * shipname
Definition: start.c:29
char * acquired
Definition: start.c:30
double y
Definition: start.c:35
ntime_t date
Definition: start.c:32
unsigned int credits
Definition: start.c:31
double x
Definition: start.c:34