[Add] Missions can actually use flags now.

This commit is contained in:
Allanis 2013-04-20 15:25:40 +01:00
parent 209e75bda1
commit 9e2bda007b
3 changed files with 39 additions and 15 deletions

View File

@ -31,8 +31,8 @@
</mission>
<mission name = "Empire Shipping">
<lua>es_cargo</lua>
<req>es_cargo</req>
<avail>
<req>es_cargo</req>
<chance>350</chance>
<location>Computer</location>
<alliance>Empire United</alliance>

View File

@ -40,6 +40,7 @@ extern int misn_run(Mission* misn, char* func);
static int mission_init(Mission* mission, MissionData* misn);
static void mission_freeData(MissionData* mission);
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 MissionData* mission_parse(const xmlNodePtr parent);
@ -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));

View File

@ -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.