[Add] Missions are now loaded! Still need to load hooks for them to work.
This commit is contained in:
parent
484b482c4b
commit
a90f0d66c0
107
src/mission.c
107
src/mission.c
@ -47,6 +47,7 @@ static int mission_meetReq(int mission, int faction, char* planet, char* system
|
|||||||
static int mission_matchFaction(MissionData* misn, int faction);
|
static int mission_matchFaction(MissionData* misn, int faction);
|
||||||
static int mission_location(char* loc);
|
static int mission_location(char* loc);
|
||||||
static MissionData* mission_parse(const xmlNodePtr parent);
|
static MissionData* mission_parse(const xmlNodePtr parent);
|
||||||
|
static int missions_parseActive(xmlNodePtr parent);
|
||||||
|
|
||||||
// Generate a new id for the mission.
|
// Generate a new id for the mission.
|
||||||
static unsigned int mission_genID(void) {
|
static unsigned int mission_genID(void) {
|
||||||
@ -83,8 +84,11 @@ static int mission_init(Mission* mission, MissionData* misn) {
|
|||||||
char* buf;
|
char* buf;
|
||||||
uint32_t bufsize;
|
uint32_t bufsize;
|
||||||
|
|
||||||
|
if(misn != NULL) {
|
||||||
|
// Don't set the data either.
|
||||||
mission->id = mission_genID();
|
mission->id = mission_genID();
|
||||||
mission->data = misn;
|
mission->data = misn;
|
||||||
|
}
|
||||||
|
|
||||||
// Sane defaults.
|
// Sane defaults.
|
||||||
mission->title = NULL;
|
mission->title = NULL;
|
||||||
@ -104,15 +108,17 @@ static int mission_init(Mission* mission, MissionData* misn) {
|
|||||||
luaopen_string(mission->L); // string.format can be very useful.
|
luaopen_string(mission->L); // string.format can be very useful.
|
||||||
misn_loadLibs(mission->L); // Load our custom libraries.
|
misn_loadLibs(mission->L); // Load our custom libraries.
|
||||||
|
|
||||||
|
// Don't load it with data.
|
||||||
|
if(misn != NULL) {
|
||||||
// Load the file.
|
// Load the file.
|
||||||
buf = pack_readfile(DATA, misn->lua, &bufsize);
|
buf = pack_readfile(DATA, misn->lua, &bufsize);
|
||||||
if(luaL_dobuffer(mission->L, buf, bufsize, misn->lua) != 0) {
|
if(luaL_dobuffer(mission->L, buf, bufsize, misn->lua) != 0) {
|
||||||
ERR("Error loading mission file: %s", misn->lua);
|
ERR("Error loading mission file: %s", misn->lua);
|
||||||
ERR("%s", lua_tostring(mission->L, -1));
|
ERR("%s", lua_tostring(mission->L, -1));
|
||||||
WARN("Most likely Lua file has improper syntax, please check it");
|
WARN("Most likely Lua file has improper syntax, please check");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
free(buf);
|
free(buf);
|
||||||
|
|
||||||
// Run create function.
|
// Run create function.
|
||||||
@ -428,8 +434,8 @@ void missions_cleanup(void) {
|
|||||||
|
|
||||||
typedef struct MBuf_ {
|
typedef struct MBuf_ {
|
||||||
char* data;
|
char* data;
|
||||||
int len, alloc; // Size of each data chunk, chunks to alloc when growing.
|
ssize_t len, alloc; // Size of each data chunk, chunks to alloc when growing.
|
||||||
int ndata, mdata; // Buffer real length, memory length.
|
size_t ndata, mdata; // Buffer real length, memory length.
|
||||||
} MBuf;
|
} MBuf;
|
||||||
|
|
||||||
MBuf* mbuf_create(int len, int alloc) {
|
MBuf* mbuf_create(int len, int alloc) {
|
||||||
@ -476,7 +482,7 @@ static int mission_writeLua(lua_State* L, const void* p, size_t sz, void* ud) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int missions_save(xmlTextWriterPtr writer) {
|
int missions_saveActive(xmlTextWriterPtr writer) {
|
||||||
MBuf* buf;
|
MBuf* buf;
|
||||||
char* data;
|
char* data;
|
||||||
int i, j;
|
int i, j;
|
||||||
@ -518,3 +524,94 @@ int missions_save(xmlTextWriterPtr writer) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* mission_readLua(lua_State* L, void* data, size_t* size) {
|
||||||
|
(void) L;
|
||||||
|
MBuf* dat;
|
||||||
|
char* pos;
|
||||||
|
char* buf;
|
||||||
|
|
||||||
|
dat = (MBuf*) data;
|
||||||
|
pos = dat->data;
|
||||||
|
|
||||||
|
buf = &pos[dat->ndata];
|
||||||
|
if(dat->mdata >= dat->ndata) {
|
||||||
|
(*size) = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if(dat->mdata < (dat->ndata + dat->alloc * dat->len)) { // Last chunk.
|
||||||
|
(*size) = dat->mdata - dat->ndata;
|
||||||
|
dat->ndata = dat->mdata;
|
||||||
|
} else {
|
||||||
|
(*size) = dat->alloc * dat->len;
|
||||||
|
dat->ndata += dat->alloc * dat->len;
|
||||||
|
}
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
int missions_loadActive(xmlNodePtr parent) {
|
||||||
|
xmlNodePtr node;
|
||||||
|
|
||||||
|
// Cleanup old missions.
|
||||||
|
missions_cleanup();
|
||||||
|
|
||||||
|
node = parent->xmlChildrenNode;
|
||||||
|
do {
|
||||||
|
if(xml_isNode(node, "missions"))
|
||||||
|
if(missions_parseActive(node) < 0) return -1;
|
||||||
|
} while(xml_nextNode(node));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int missions_parseActive(xmlNodePtr parent) {
|
||||||
|
Mission* misn;
|
||||||
|
int m;
|
||||||
|
char* buf;
|
||||||
|
MBuf dat;
|
||||||
|
|
||||||
|
xmlNodePtr node, cur, nest;
|
||||||
|
|
||||||
|
m = 0; // Start with mission 0.
|
||||||
|
node = parent->xmlChildrenNode;
|
||||||
|
do {
|
||||||
|
if(xml_isNode(node, "mission")) {
|
||||||
|
misn = &player_missions[m];
|
||||||
|
mission_init(misn, NULL); // Won't set data nor id.
|
||||||
|
|
||||||
|
cur = node->xmlChildrenNode;
|
||||||
|
do {
|
||||||
|
if(xml_isNode(cur, "data")) {
|
||||||
|
buf = xml_get(cur);
|
||||||
|
misn->data = mission_get(mission_getID(buf));
|
||||||
|
}
|
||||||
|
xmlr_long(cur, "id", misn->id);
|
||||||
|
|
||||||
|
xmlr_strd(cur, "title", misn->title);
|
||||||
|
xmlr_strd(cur, "desc", misn->desc);
|
||||||
|
xmlr_strd(cur, "reward", misn->reward);
|
||||||
|
|
||||||
|
if(xml_isNode(cur, "cargos")) {
|
||||||
|
nest = cur->xmlChildrenNode;
|
||||||
|
do {
|
||||||
|
if(xml_isNode(nest, "cargo"))
|
||||||
|
mission_linkCargo(misn, xml_getLong(nest));
|
||||||
|
} while(xml_nextNode(nest));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(xml_isNode(cur, "lua")) {
|
||||||
|
buf = xml_get(cur);
|
||||||
|
dat.ndata = 0;
|
||||||
|
dat.len = 1;
|
||||||
|
dat.alloc = 128;
|
||||||
|
dat.data = base64_decode(&dat.mdata, buf, strlen(buf));
|
||||||
|
pluto_unpersist(misn->L, mission_readLua, &dat);
|
||||||
|
}
|
||||||
|
} while(xml_nextNode(cur));
|
||||||
|
|
||||||
|
m++;
|
||||||
|
if(m >= MISSION_MAX) break; // Full of missions, must be an error.
|
||||||
|
}
|
||||||
|
} while(xml_nextNode(node));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -1506,8 +1506,6 @@ static int player_saveShip(xmlTextWriterPtr writer, Pilot* ship, char* loc) {
|
|||||||
// Save the commodities.
|
// Save the commodities.
|
||||||
xmlw_startElem(writer, "commodities");
|
xmlw_startElem(writer, "commodities");
|
||||||
for(i = 0; i < ship->ncommodities; i++) {
|
for(i = 0; i < ship->ncommodities; i++) {
|
||||||
// TODO: Load player missions, so that we can save mission commodities.
|
|
||||||
if(ship->commodities[i].id > 0) continue;
|
|
||||||
|
|
||||||
xmlw_startElem(writer, "commodity");
|
xmlw_startElem(writer, "commodity");
|
||||||
|
|
||||||
|
10
src/save.c
10
src/save.c
@ -14,12 +14,13 @@
|
|||||||
#define BUTTON_HEIGHT 30
|
#define BUTTON_HEIGHT 30
|
||||||
|
|
||||||
// Externs.
|
// Externs.
|
||||||
extern int player_save(xmlTextWriterPtr writer);
|
extern int player_save(xmlTextWriterPtr writer); // A lot of stuff.
|
||||||
extern int player_load(xmlNodePtr parent);
|
extern int player_load(xmlNodePtr parent);
|
||||||
extern int missions_save(xmlTextWriterPtr writer);
|
extern int missions_saveActive(xmlTextWriterPtr writer); // Active missions.
|
||||||
|
extern int missions_loadActive(xmlNodePtr parent);
|
||||||
extern int var_save(xmlTextWriterPtr writer); // misn var.
|
extern int var_save(xmlTextWriterPtr writer); // misn var.
|
||||||
extern int var_load(xmlNodePtr parent);
|
extern int var_load(xmlNodePtr parent);
|
||||||
extern int pfaction_save(xmlTextWriterPtr writer);
|
extern int pfaction_save(xmlTextWriterPtr writer); // Faction data.
|
||||||
extern int pfaction_load(xmlNodePtr parent);
|
extern int pfaction_load(xmlNodePtr parent);
|
||||||
extern void menu_main_close(void);
|
extern void menu_main_close(void);
|
||||||
// Static.
|
// Static.
|
||||||
@ -32,7 +33,7 @@ static int load_game(char* file);
|
|||||||
static int save_data(xmlTextWriterPtr writer) {
|
static int save_data(xmlTextWriterPtr writer) {
|
||||||
// The data itself.
|
// The data itself.
|
||||||
if(player_save(writer) < 0) return -1;
|
if(player_save(writer) < 0) return -1;
|
||||||
if(missions_save(writer) < 0) return -1;
|
if(missions_saveActive(writer) < 0) return -1;
|
||||||
if(var_save(writer) < 0) return -1;
|
if(var_save(writer) < 0) return -1;
|
||||||
if(pfaction_save(writer) < 0) return -1;
|
if(pfaction_save(writer) < 0) return -1;
|
||||||
|
|
||||||
@ -170,6 +171,7 @@ static int load_game(char* file) {
|
|||||||
|
|
||||||
player_load(node);
|
player_load(node);
|
||||||
var_load(node);
|
var_load(node);
|
||||||
|
missions_loadActive(node);
|
||||||
pfaction_load(node);
|
pfaction_load(node);
|
||||||
|
|
||||||
xmlFreeDoc(doc);
|
xmlFreeDoc(doc);
|
||||||
|
Loading…
Reference in New Issue
Block a user