[Add] Now completed missions and mission variables are also loaded.

This commit is contained in:
Allanis 2013-05-17 02:02:56 +01:00
parent ca675db52e
commit 75954df719
5 changed files with 95 additions and 40 deletions

View File

@ -48,6 +48,7 @@ static int var_mstack = 0;
static Mission* cur_mission = NULL; static Mission* cur_mission = NULL;
static int misn_delete = 0; // If 1 delete current mission. static int misn_delete = 0; // If 1 delete current mission.
static int var_add(misn_var* var);
static void var_free(misn_var* var); static void var_free(misn_var* var);
static int hook_generic(lua_State* L, char* stack); static int hook_generic(lua_State* L, char* stack);
@ -258,6 +259,77 @@ int var_save(xmlTextWriterPtr writer) {
return 0; return 0;
} }
// Load the vars.
int var_load(xmlNodePtr parent) {
char* str;
xmlNodePtr node, cur;
misn_var var;
var_cleanup();
node = parent->xmlChildrenNode;
do {
if(xml_isNode(node, "vars")) {
cur = node->xmlChildrenNode;
do {
if(xml_isNode(cur, "var")) {
xmlr_attr(cur, "name", var.name);
xmlr_attr(cur, "type", str);
if(strcmp(str, "nil")==0)
var.type = MISN_VAR_NIL;
else if(strcmp(str, "num")==0) {
var.type = MISN_VAR_NUM;
var.d.num = atoi(xml_get(cur));
}
else if(strcmp(str, "bool")) {
var.type = MISN_VAR_BOOL;
var.d.b = atoi(xml_get(cur));
}
else if(strcmp(str, "str")) {
var.type = MISN_VAR_STR;
var.d.str = atoi(xml_get(cur));
} else {
// Supeh error checking.
WARN("Unknown var type '%s'", str);
free(var.name);
continue;
}
free(str);
var_add(&var);
}
} while(xml_nextNode(cur));
}
} while(xml_nextNode(node));
return 0;
}
// Add a var to the stack, strings will be SHARED, don't free!!!
static int var_add(misn_var* new_var) {
int i;
if(var_nstack+1 > var_mstack) {
// More memory.
var_mstack += 64; // Overkill much??
var_stack = realloc(var_stack, var_mstack * sizeof(misn_var));
}
// Check if already exists.
for(i = 0; i < var_nstack; i++)
if(strcmp(new_var->name, var_stack[i].name)==0) {
var_free(&var_stack[i]);
memcpy(&var_stack[i], new_var, sizeof(misn_var));
return 0;
}
memcpy(&var_stack[var_nstack], new_var, sizeof(misn_var));
var_nstack++;
return 0;
}
// -- Lephisto. -- // -- Lephisto. --
static int lephisto_lang(lua_State* L) { static int lephisto_lang(lua_State* L) {
// TODO: multilanguage stuff. // TODO: multilanguage stuff.
@ -349,7 +421,7 @@ static int misn_finish(lua_State* L) {
misn_delete = 1; misn_delete = 1;
if(b && mis_isFlag(cur_mission->data, MISSION_UNIQUE)) if(b && mis_isFlag(cur_mission->data, MISSION_UNIQUE))
player_missionFinished(mission_getID(cur_mission->data)); player_missionFinished(mission_getID(cur_mission->data->name));
lua_pushstring(L, "Mission Done"); lua_pushstring(L, "Mission Done");
lua_error(L); // Should not return.. lua_error(L); // Should not return..
@ -425,9 +497,8 @@ static int var_pop(lua_State* L) {
static int var_push(lua_State* L) { static int var_push(lua_State* L) {
MIN_ARGS(2); MIN_ARGS(2);
int i;
char* str; char* str;
misn_var* var; misn_var var;
if(lua_isstring(L, -2)) str = (char*) lua_tostring(L, -2); if(lua_isstring(L, -2)) str = (char*) lua_tostring(L, -2);
else { else {
@ -435,50 +506,29 @@ static int var_push(lua_State* L) {
return 0; return 0;
} }
if(var_nstack+1 > var_mstack) { var.name = strdup(str);
// More memory.
var_mstack += 10;
var_stack = realloc(var_stack, var_mstack*sizeof(misn_var));
}
// Check if already exists.
var = NULL;
for(i = 0; i < var_nstack; i++)
if(strcmp(str, var_stack[i].name)==0)
var = &var_stack[i];
if(var == NULL)
var = &var_stack[var_nstack];
else if((var->type == MISN_VAR_STR) && (var->d.str != NULL)) {
// Must free.
free(var->d.str);
var->d.str = NULL;
}
// Store appropriate data. // Store appropriate data.
if(lua_isnil(L, -1)) if(lua_isnil(L, -1))
var->type = MISN_VAR_NIL; var.type = MISN_VAR_NIL;
else if(lua_isnumber(L, -1)) { else if(lua_isnumber(L, -1)) {
var->type = MISN_VAR_NUM; var.type = MISN_VAR_NUM;
var->d.num = (double)lua_tonumber(L, -1); var.d.num = (double)lua_tonumber(L, -1);
} }
else if(lua_isboolean(L, -1)) { else if(lua_isboolean(L, -1)) {
var->type = MISN_VAR_BOOL; var.type = MISN_VAR_BOOL;
var->d.b = lua_toboolean(L, -1); var.d.b = lua_toboolean(L, -1);
} }
else if(lua_isstring(L, -1)) { else if(lua_isstring(L, -1)) {
var->type = MISN_VAR_STR; var.type = MISN_VAR_STR;
var->d.str = strdup((char*)lua_tostring(L, -1)); var.d.str = strdup((char*)lua_tostring(L, -1));
} else { } else {
MISN_DEBUG("Trying to push a var of invalid data type to stack"); MISN_DEBUG("Trying to push a var of invalid data type to stack");
return 0; return 0;
} }
if(i >= var_nstack) { var_add(&var);
// Var is new.
var->name = strdup(str);
var_nstack++;
}
return 0; return 0;
} }

View File

@ -45,14 +45,14 @@ 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);
// Gets the ID of a MissionData. // Gets the ID from mission name.
int mission_getID(MissionData* misn) { int mission_getID(char* name) {
int i; int i;
for(i = 0; i < mission_nstack; i++) for(i = 0; i < mission_nstack; i++)
if(misn == &mission_stack[i]) if(strcmp(name, mission_stack[i].name)==0)
return i; return i;
DEBUG("Mission '%s' not found in stack", misn->name); DEBUG("Mission '%s' not found in stack", name);
return -1; return -1;
} }

View File

@ -68,7 +68,7 @@ int mission_accept(Mission* mission);
void missions_bar(int faction, char* planet, char* system); void missions_bar(int faction, char* planet, char* system);
// Misc. // Misc.
int mission_getID(MissionData* misn); int mission_getID(char* name);
MissionData* mission_get(int id); MissionData* mission_get(int id);
// Cargo stuff. // Cargo stuff.

View File

@ -1580,6 +1580,8 @@ static int player_parse(xmlNodePtr parent) {
player_parseShip(cur, 0); player_parseShip(cur, 0);
} while(xml_nextNode(cur)); } while(xml_nextNode(cur));
} }
if(xml_isNode(node, "missions_done"))
player_parseDone(node);
} while(xml_nextNode(node)); } while(xml_nextNode(node));
// Set global thingies. // Set global thingies.
@ -1607,7 +1609,8 @@ static int player_parseDone(xmlNodePtr parent) {
node = parent->xmlChildrenNode; node = parent->xmlChildrenNode;
do { do {
if(xml_isNode(node, "done"))
player_missionFinished(mission_getID(xml_get(node)));
} while(xml_nextNode(node)); } while(xml_nextNode(node));
return 0; return 0;

View File

@ -18,6 +18,7 @@ extern int player_save(xmlTextWriterPtr writer);
extern int missions_save(xmlTextWriterPtr writer); extern int missions_save(xmlTextWriterPtr writer);
extern int var_save(xmlTextWriterPtr writer); // misn var. extern int var_save(xmlTextWriterPtr writer); // misn var.
extern int player_load(xmlNodePtr parent); extern int player_load(xmlNodePtr parent);
extern int var_load(xmlNodePtr parent);
extern void menu_main_close(void); extern void menu_main_close(void);
// Static. // Static.
static int save_data(xmlTextWriterPtr writer); static int save_data(xmlTextWriterPtr writer);
@ -161,6 +162,7 @@ static int load_game(char* file) {
node = doc->xmlChildrenNode; // Base node. node = doc->xmlChildrenNode; // Base node.
player_load(node); player_load(node);
var_load(node);
xmlFreeDoc(doc); xmlFreeDoc(doc);