From 9e2bda007b7bc659fb36e90c48fab04fa3b819a4 Mon Sep 17 00:00:00 2001 From: Allanis Date: Sat, 20 Apr 2013 15:25:40 +0100 Subject: [PATCH] [Add] Missions can actually use flags now. --- dat/mission.xml | 2 +- src/mission.c | 50 +++++++++++++++++++++++++++++++++++-------------- src/mission.h | 2 ++ 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/dat/mission.xml b/dat/mission.xml index 5ee151e..70bd256 100644 --- a/dat/mission.xml +++ b/dat/mission.xml @@ -31,8 +31,8 @@ es_cargo - es_cargo + es_cargo 350 Computer Empire United diff --git a/src/mission.c b/src/mission.c index 45c15df..12c0b5a 100644 --- a/src/mission.c +++ b/src/mission.c @@ -39,9 +39,10 @@ extern int misn_run(Mission* misn, char* func); // Static. static int mission_init(Mission* mission, MissionData* misn); static void mission_freeData(MissionData* mission); -static int mission_alreadyRunning(MissionData* misn); +static int mission_alreadyRunning(MissionData* misn); +static int mission_meetReq(int mission, int faction, char* planet, char* system); 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); // Gets the ID of a MissionData. @@ -112,6 +113,30 @@ static int mission_alreadyRunning(MissionData* misn) { return 0; } +// Does the mission meet the minimum requirements? +static int mission_meetReq(int mission, int faction, char* planet, char* system) { + MissionData* misn; + + misn = &mission_stack[mission]; + + // Must match planet, system or faction. + if(!(((misn->avail.planet && strcmp(misn->avail.planet, planet)==0)) || + (misn->avail.system && (strcmp(misn->avail.system, system)==0)) || + mission_matchFaction(misn, faction))) + return 0; + + if(mis_isFlag(misn, MISSION_UNIQUE) && // Mission done, or running. + (player_missionAlreadyDone(mission) || + mission_alreadyRunning(misn))) + return 0; + + if((misn->avail.req != NULL) && // Mission doesn't meet the requirement. + !var_checkflag(misn->avail.req)) + return 0; + + return 1; +} + // Runs bar missions, all lua side and one-shot. void missions_bar(int faction, char* planet, char* system) { MissionData* misn; @@ -121,14 +146,9 @@ void missions_bar(int faction, char* planet, char* system) { for(i = 0; i < mission_nstack; i++) { misn = &mission_stack[i]; - if((misn->avail.loc == MIS_AVAIL_BAR) && - (((misn->avail.planet && strcmp(misn->avail.planet, planet)==0)) || - (misn->avail.system && (strcmp(misn->avail.system, system)==0)) || - mission_matchFaction(misn, faction))) { - - if(mis_isFlag(misn, MISSION_UNIQUE) && // Mission done or running. - (player_missionAlreadyDone(i) || - mission_alreadyRunning(misn))) continue; + if(misn->avail.loc == MIS_AVAIL_BAR) { + if(!mission_meetReq(i, faction, planet, system)) + continue; chance = (double)(misn->avail.chance % 100)/100.; @@ -222,10 +242,10 @@ Mission* missions_computer(int* n, int faction, char* planet, char* system) { m = 0; for(i = 0; i < mission_nstack; i++) { misn = &mission_stack[i]; - if((misn->avail.loc == MIS_AVAIL_COMPUTER) && - (((misn->avail.planet && strcmp(misn->avail.planet, planet)==0)) || - (misn->avail.system && (strcmp(misn->avail.system, system)==0)) || - mission_matchFaction(misn, faction))) { + if(misn->avail.loc == MIS_AVAIL_COMPUTER) { + if(!mission_meetReq(i, faction, planet, system)) + continue; + chance = (double)(misn->avail.chance % 100)/100.; rep = misn->avail.chance/100; @@ -306,6 +326,8 @@ static MissionData* mission_parse(const xmlNodePtr parent) { tmp->avail.factions[tmp->avail.nfactions-1] = faction_get(xml_get(cur)); } + else if(xml_isNode(cur, "req")) + tmp->avail.req = strdup(xml_get(cur)); } while((cur = cur->next)); } } while((node = node->next)); diff --git a/src/mission.h b/src/mission.h index 2d0aed7..bf70523 100644 --- a/src/mission.h +++ b/src/mission.h @@ -32,6 +32,8 @@ typedef struct MissionData_ { // For generic cases. int* factions; int nfactions; + + char* req; // Required variable. } avail; unsigned int flags; // Flags to store binary properties.