[Add] Game now tries to load mission properly, excpet lua needs more bindings. ;)
This commit is contained in:
parent
fc0a6776c2
commit
6fc39a69e0
@ -49,11 +49,12 @@ endif
|
|||||||
|
|
||||||
# DATA.
|
# DATA.
|
||||||
DATA_AI = $(shell find ../scripts/ai/ -name '*.lua')
|
DATA_AI = $(shell find ../scripts/ai/ -name '*.lua')
|
||||||
DATA_GFX = $(shell find ../gfx/ -name '*.png')
|
DATA_GFX = $(shell find ../gfx/ -name '*.png')
|
||||||
DATA_XML = $(shell find ../dat/ -name '*.xml' -o -name '*.ttf')
|
DATA_XML = $(shell find ../dat/ -name '*.xml' -o -name '*.ttf')
|
||||||
DATA_SND = $(shell find ../snd/ -name '*.ogg' -o -name '*.wav')
|
DATA_SND = $(shell find ../snd/ -name '*.ogg' -o -name '*.wav')
|
||||||
|
DATA_MISN = $(shell find ../dat/missions/ -name '*.lua')
|
||||||
DATA = data
|
DATA = data
|
||||||
DATAFILES = $(VERSIONFILE) $(DATA_AI) $(DATA_GFX) $(DATA_XML) $(DATA_SND)
|
DATAFILES = $(VERSIONFILE) $(DATA_AI) $(DATA_GFX) $(DATA_XML) $(DATA_SND) $(DATA_MISN)
|
||||||
|
|
||||||
# TARGETS.
|
# TARGETS.
|
||||||
%.o: %.c %.h
|
%.o: %.c %.h
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
<Missions>
|
<Missions>
|
||||||
<mission name="Welcome">
|
<mission name="Welcome">
|
||||||
|
<flags>
|
||||||
|
<unique>1</unique>
|
||||||
|
</flags>
|
||||||
<lua>welcome</lua>
|
<lua>welcome</lua>
|
||||||
<avail>
|
<avail>
|
||||||
<location>None</location>
|
<location>None</location>
|
||||||
|
@ -22,7 +22,7 @@ end
|
|||||||
function accept()
|
function accept()
|
||||||
player.addCargo(carg_type, carg_mass)
|
player.addCargo(carg_type, carg_mass)
|
||||||
toolkit.msg("Mission Accepted",
|
toolkit.msg("Mission Accepted",
|
||||||
string.format("The workers load the %d tons of %s onto your ship."
|
string.format("The workers load the %d tons of %s onto your ship.",
|
||||||
carg_mass, carg_type))
|
carg_mass, carg_type))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -176,7 +176,7 @@ int faction_ofAlliance(int f, int a) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
aa = &alliances[a];
|
aa = &alliances[a-ALLIANCE_OFFSET];
|
||||||
|
|
||||||
for(i = 0; i < aa->nfactions; i++)
|
for(i = 0; i < aa->nfactions; i++)
|
||||||
if(aa->factions[i] == f)
|
if(aa->factions[i] == f)
|
||||||
|
61
src/land.c
61
src/land.c
@ -6,6 +6,7 @@
|
|||||||
#include "music.h"
|
#include "music.h"
|
||||||
#include "economy.h"
|
#include "economy.h"
|
||||||
#include "hook.h"
|
#include "hook.h"
|
||||||
|
#include "mission.h"
|
||||||
#include "land.h"
|
#include "land.h"
|
||||||
|
|
||||||
// Global/main window.
|
// Global/main window.
|
||||||
@ -37,13 +38,29 @@
|
|||||||
#define MUSIC_TAKEOFF "liftoff"
|
#define MUSIC_TAKEOFF "liftoff"
|
||||||
#define MUSIC_LAND "agriculture"
|
#define MUSIC_LAND "agriculture"
|
||||||
|
|
||||||
int landed = 0;
|
// We use visited flags to not duplicate missions generated.
|
||||||
|
#define VISITED_LAND (1<<0)
|
||||||
|
#define VISITED_COMMODITY (1<<1)
|
||||||
|
#define VISITED_BAR (1<<2)
|
||||||
|
#define VISITED_OUTFITS (1<<3)
|
||||||
|
#define VISITED_SHIPYARD (1<<4)
|
||||||
|
#define visited(f) (land_visited |= (f))
|
||||||
|
#define has_visited(f) (land_visited & (f))
|
||||||
|
static unsigned int land_visited = 0;
|
||||||
|
|
||||||
|
// Land variables.
|
||||||
|
int landed = 0;
|
||||||
|
Planet* land_planet = NULL;
|
||||||
|
|
||||||
|
// Mission computer stack.
|
||||||
|
static Mission* mission_computer = NULL;
|
||||||
|
static int mission_ncomputer = 0;
|
||||||
|
|
||||||
|
// Window stuff.
|
||||||
static int land_wid = 0; // Primary land window.
|
static int land_wid = 0; // Primary land window.
|
||||||
// For the second opened land window
|
// For the second opened land window
|
||||||
static int secondary_wid = 0;
|
static int secondary_wid = 0;
|
||||||
static int terciary_wid = 0; // For fancy things like news, your ship etc..
|
static int terciary_wid = 0; // For fancy things like news, your ship etc..
|
||||||
Planet* land_planet = NULL;
|
|
||||||
|
|
||||||
// Commodity excahnge.
|
// Commodity excahnge.
|
||||||
static void commodity_exchange(void);
|
static void commodity_exchange(void);
|
||||||
@ -121,6 +138,11 @@ static void commodity_exchange(void) {
|
|||||||
goods, land_planet->ncommodities, 0, commodity_update);
|
goods, land_planet->ncommodities, 0, commodity_update);
|
||||||
|
|
||||||
commodity_update(NULL);
|
commodity_update(NULL);
|
||||||
|
|
||||||
|
if(!has_visited(VISITED_COMMODITY)) {
|
||||||
|
// TODO: mission check.
|
||||||
|
visited(VISITED_COMMODITY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void commodity_exchange_close(char* str) {
|
static void commodity_exchange_close(char* str) {
|
||||||
@ -250,6 +272,11 @@ static void outfits(void) {
|
|||||||
|
|
||||||
// Write the outfits stuff.
|
// Write the outfits stuff.
|
||||||
outfits_update(NULL);
|
outfits_update(NULL);
|
||||||
|
|
||||||
|
if(!has_visited(VISITED_OUTFITS)) {
|
||||||
|
// TODO: mission check.
|
||||||
|
visited(VISITED_OUTFITS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void outfits_close(char* str) {
|
static void outfits_close(char* str) {
|
||||||
@ -436,6 +463,11 @@ static void shipyard(void) {
|
|||||||
|
|
||||||
// Write the shipyard stuff.
|
// Write the shipyard stuff.
|
||||||
shipyard_update(NULL);
|
shipyard_update(NULL);
|
||||||
|
|
||||||
|
if(!has_visited(VISITED_SHIPYARD)) {
|
||||||
|
// TODO: mission check.
|
||||||
|
visited(VISITED_SHIPYARD);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shipyard_close(char* str) {
|
static void shipyard_close(char* str) {
|
||||||
@ -693,6 +725,11 @@ static void spaceport_bar(void) {
|
|||||||
BAR_WIDTH-40, BAR_HEIGHT - 40 - BUTTON_HEIGHT, 0,
|
BAR_WIDTH-40, BAR_HEIGHT - 40 - BUTTON_HEIGHT, 0,
|
||||||
"txtDescription", &gl_smallFont, &cBlack,
|
"txtDescription", &gl_smallFont, &cBlack,
|
||||||
land_planet->bar_description);
|
land_planet->bar_description);
|
||||||
|
|
||||||
|
if(!has_visited(VISITED_BAR)) {
|
||||||
|
// TODO: mission check.
|
||||||
|
visited(VISITED_BAR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spaceport_bar_close(char* str) {
|
static void spaceport_bar_close(char* str) {
|
||||||
@ -767,16 +804,26 @@ void land(Planet* p) {
|
|||||||
|
|
||||||
landed = 1;
|
landed = 1;
|
||||||
hooks_run("land");
|
hooks_run("land");
|
||||||
|
|
||||||
|
// Generate mission computer stuff.
|
||||||
|
mission_computer = missions_computer(&mission_ncomputer,
|
||||||
|
land_planet->faction, land_planet->name, cur_system->name);
|
||||||
|
|
||||||
|
if(!has_visited(VISITED_LAND)) {
|
||||||
|
// TODO: mission check.
|
||||||
|
visited(VISITED_LAND);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Takeoff from the planet.
|
// Takeoff from the planet.
|
||||||
void takeoff(void) {
|
void takeoff(void) {
|
||||||
|
int sw, sh, i;
|
||||||
|
|
||||||
if(!landed) return;
|
if(!landed) return;
|
||||||
|
|
||||||
music_load(MUSIC_TAKEOFF);
|
music_load(MUSIC_TAKEOFF);
|
||||||
music_play();
|
music_play();
|
||||||
|
|
||||||
int sw, sh;
|
|
||||||
sw = land_planet->gfx_space->w;
|
sw = land_planet->gfx_space->w;
|
||||||
sh = land_planet->gfx_space->h;
|
sh = land_planet->gfx_space->h;
|
||||||
|
|
||||||
@ -799,6 +846,14 @@ void takeoff(void) {
|
|||||||
land_planet = NULL;
|
land_planet = NULL;
|
||||||
window_destroy(land_wid);
|
window_destroy(land_wid);
|
||||||
landed = 0;
|
landed = 0;
|
||||||
|
land_visited = 0;
|
||||||
hooks_run("takeoff");
|
hooks_run("takeoff");
|
||||||
|
|
||||||
|
// Cleanup mission computer.
|
||||||
|
for(i = 0; i < mission_ncomputer; i++)
|
||||||
|
mission_free(&mission_computer[i]);
|
||||||
|
free(mission_computer);
|
||||||
|
mission_computer = NULL;
|
||||||
|
mission_ncomputer = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
132
src/mission.c
132
src/mission.c
@ -19,6 +19,9 @@
|
|||||||
#define MISSION_DATA "../dat/mission.xml"
|
#define MISSION_DATA "../dat/mission.xml"
|
||||||
#define MISSION_LUA_PATH "../dat/missions/"
|
#define MISSION_LUA_PATH "../dat/missions/"
|
||||||
|
|
||||||
|
#define luaL_dobuffer(L, b, n, s) \
|
||||||
|
(luaL_loadbuffer(L, b, n, s) || lua_pcall(L, 0, LUA_MULTRET, 0))
|
||||||
|
|
||||||
// Current player missions.
|
// Current player missions.
|
||||||
static unsigned int mission_id = 0;
|
static unsigned int mission_id = 0;
|
||||||
Mission player_missions[MISSION_MAX];
|
Mission player_missions[MISSION_MAX];
|
||||||
@ -31,13 +34,49 @@ static int mission_nstack = 0;
|
|||||||
extern int misn_run(Mission* misn, char* func);
|
extern int misn_run(Mission* misn, char* func);
|
||||||
|
|
||||||
// Static.
|
// Static.
|
||||||
|
static int mission_init(Mission* mission, MissionData* misn);
|
||||||
static void mission_cleanup(Mission* misn);
|
static void mission_cleanup(Mission* misn);
|
||||||
static void mission_free(MissionData* mission);
|
static void mission_freeData(MissionData* mission);
|
||||||
|
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);
|
||||||
|
|
||||||
// Create a mission.
|
// Initialize a mission.
|
||||||
int mission_create(MissionData* misn) {
|
static int mission_init(Mission* mission, MissionData* misn) {
|
||||||
|
char* buf;
|
||||||
|
uint32_t bufsize;
|
||||||
|
|
||||||
|
mission->id = ++mission_id;
|
||||||
|
mission->data = misn;
|
||||||
|
|
||||||
|
// Init lua.
|
||||||
|
mission->L = luaL_newstate();
|
||||||
|
if(mission->L == NULL) {
|
||||||
|
ERR("Unable to create a new lua state.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
luaopen_string(mission->L); // string.format can be very useful.
|
||||||
|
misn_loadLibs(mission->L); // Load our custom libraries.
|
||||||
|
|
||||||
|
buf = pack_readfile(DATA, misn->lua, &bufsize);
|
||||||
|
if(luaL_dobuffer(mission->L, buf, bufsize, misn->lua) != 0) {
|
||||||
|
ERR("Error loading AI file: %s", misn->lua);
|
||||||
|
ERR("%s", lua_tostring(mission->L, -1));
|
||||||
|
WARN("Most likely Lua file has improper syntax, please check it");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buf);
|
||||||
|
|
||||||
|
// Run create function.
|
||||||
|
misn_run(mission, "create");
|
||||||
|
|
||||||
|
return mission->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a mission to the player, you can free the current mission safely.
|
||||||
|
int mission_add(Mission* mission) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
// Find last mission.
|
// Find last mission.
|
||||||
@ -47,17 +86,11 @@ int mission_create(MissionData* misn) {
|
|||||||
// No missions left.
|
// No missions left.
|
||||||
if(i >= MISSION_MAX) return -1;
|
if(i >= MISSION_MAX) return -1;
|
||||||
|
|
||||||
player_missions[i].id = ++mission_id;
|
// Copy it over.
|
||||||
player_missions[i].data = misn;
|
memcpy(&player_missions[i], mission, sizeof(Mission));
|
||||||
|
memset(mission, 0, sizeof(Mission));
|
||||||
|
|
||||||
// Init lua.
|
return player_missions[i].id;
|
||||||
player_missions[i].L = luaL_newstate();
|
|
||||||
luaopen_string(player_missions[i].L); // String.format can be useful..
|
|
||||||
misn_loadLibs(player_missions[i].L); // Load our custom libraries.
|
|
||||||
|
|
||||||
misn_run(&player_missions[i], "create");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clean up a mission.
|
// Clean up a mission.
|
||||||
@ -71,7 +104,7 @@ static void mission_cleanup(Mission* misn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Free a mission.
|
// Free a mission.
|
||||||
static void mission_free(MissionData* mission) {
|
static void mission_freeData(MissionData* mission) {
|
||||||
if(mission->name) {
|
if(mission->name) {
|
||||||
free(mission->name);
|
free(mission->name);
|
||||||
mission->name = NULL;
|
mission->name = NULL;
|
||||||
@ -91,6 +124,66 @@ static void mission_free(MissionData* mission) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Free an active mission.
|
||||||
|
void mission_free(Mission* mission) {
|
||||||
|
if(mission->id == 0) return;
|
||||||
|
|
||||||
|
if(mission->title) {
|
||||||
|
free(mission->title);
|
||||||
|
mission->title = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(mission->desc) {
|
||||||
|
free(mission->desc);
|
||||||
|
mission->desc = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(mission->reward) {
|
||||||
|
free(mission->reward);
|
||||||
|
mission->reward = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(mission->L) {
|
||||||
|
lua_close(mission->L);
|
||||||
|
mission->L = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Does mission match faction requirement?
|
||||||
|
static int mission_matchFaction(MissionData* misn, int faction) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i = 0; i < misn->avail.nfactions; i++) {
|
||||||
|
if(faction_isFaction(misn->avail.factions[i]) &&
|
||||||
|
(faction == misn->avail.factions[i]))
|
||||||
|
return 1;
|
||||||
|
else if(faction_ofAlliance(faction, misn->avail.factions[i]))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate missions for the computer - special case.
|
||||||
|
Mission* missions_computer(int* n, int faction, char* planet, char* system) {
|
||||||
|
int i, m;
|
||||||
|
Mission* tmp;
|
||||||
|
MissionData* misn;
|
||||||
|
|
||||||
|
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))) {
|
||||||
|
tmp = realloc(tmp, sizeof(Mission) * ++m);
|
||||||
|
mission_init(&tmp[m-1], misn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(*n) = m;
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
// Return location based on string.
|
// Return location based on string.
|
||||||
static int mission_location(char* loc) {
|
static int mission_location(char* loc) {
|
||||||
if(strcmp(loc, "None")==0) return MIS_AVAIL_NONE;
|
if(strcmp(loc, "None")==0) return MIS_AVAIL_NONE;
|
||||||
@ -126,7 +219,14 @@ static MissionData* mission_parse(const xmlNodePtr parent) {
|
|||||||
tmp->lua = strdup(str);
|
tmp->lua = strdup(str);
|
||||||
str[0] = '\0';
|
str[0] = '\0';
|
||||||
}
|
}
|
||||||
else if(xml_isNode(node, "avail")) {
|
else if(xml_isNode(node, "flags")) { // Set the various flags.
|
||||||
|
cur = node->children;
|
||||||
|
do {
|
||||||
|
if(xml_isNode(cur, "unique"))
|
||||||
|
mis_setFlag(tmp, MISSION_UNIQUE);
|
||||||
|
} while((cur = cur->next));
|
||||||
|
}
|
||||||
|
else if(xml_isNode(node, "avail")) { // Mission availability.
|
||||||
cur = node->children;
|
cur = node->children;
|
||||||
do {
|
do {
|
||||||
if(xml_isNode(cur, "location"))
|
if(xml_isNode(cur, "location"))
|
||||||
@ -206,7 +306,7 @@ void missions_free(void) {
|
|||||||
|
|
||||||
// Free the mission data.
|
// Free the mission data.
|
||||||
for(i = 0; i < mission_nstack; i++)
|
for(i = 0; i < mission_nstack; i++)
|
||||||
mission_free(&mission_stack[i]);
|
mission_freeData(&mission_stack[i]);
|
||||||
free(mission_stack);
|
free(mission_stack);
|
||||||
mission_stack = NULL;
|
mission_stack = NULL;
|
||||||
mission_nstack = 0;
|
mission_nstack = 0;
|
||||||
|
@ -14,6 +14,8 @@
|
|||||||
#define mis_setFlag(m,f) ((m)->flags |= (f))
|
#define mis_setFlag(m,f) ((m)->flags |= (f))
|
||||||
#define mis_rmFlag(m,f) ((m)->flags ^= (f))
|
#define mis_rmFlag(m,f) ((m)->flags ^= (f))
|
||||||
|
|
||||||
|
#define MISSION_UNIQUE 1 // Unique missions can't be repeated.
|
||||||
|
|
||||||
// Static mission data.
|
// Static mission data.
|
||||||
typedef struct MissionData_ {
|
typedef struct MissionData_ {
|
||||||
char* name; // the name of the mission.
|
char* name; // the name of the mission.
|
||||||
@ -53,6 +55,11 @@ typedef struct Mission_ {
|
|||||||
#define MISSION_MAX 6 // No sense in the player having unlimited missions..
|
#define MISSION_MAX 6 // No sense in the player having unlimited missions..
|
||||||
extern Mission player_mission[MISSION_MAX];
|
extern Mission player_mission[MISSION_MAX];
|
||||||
|
|
||||||
|
// For mission computer.
|
||||||
|
Mission* missions_computer(int* n, int faction, char* planet, char* system);
|
||||||
|
// Player accepted mission - mission computer.
|
||||||
|
void mission_accept(Mission* misn);
|
||||||
|
|
||||||
// Load/Quit.
|
// Load/Quit.
|
||||||
int missions_load(void);
|
int missions_load(void);
|
||||||
void missions_free(void);
|
void missions_free(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user