[Add] Missions can actually use flags now.
This commit is contained in:
parent
209e75bda1
commit
9e2bda007b
@ -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>
|
||||
|
@ -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));
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user