[Add] Missions can now mark systems. [Fix] Seg fault when switching pilots.

This commit is contained in:
Allanis 2013-06-26 00:28:16 +01:00
parent 73d8e18a2a
commit 692fb388df
8 changed files with 95 additions and 24 deletions

View File

@ -43,6 +43,7 @@ function create()
misn.finish(false) misn.finish(false)
end end
system = space.getSystem(planet) system = space.getSystem(planet)
misn.setMarker(system) -- Mark the system.
misn_dist = space.jumpDist(system) misn_dist = space.jumpDist(system)
-- Mission generics. -- Mission generics.

View File

@ -7,6 +7,7 @@
#include "toolkit.h" #include "toolkit.h"
#include "space.h" #include "space.h"
#include "opengl.h" #include "opengl.h"
#include "mission.h"
#include "map.h" #include "map.h"
#define WINDOW_WIDTH 550 #define WINDOW_WIDTH 550
@ -55,6 +56,9 @@ void map_open(void) {
map_xpos = cur_system->pos.x; map_xpos = cur_system->pos.x;
map_ypos = cur_system->pos.y; map_ypos = cur_system->pos.y;
/* Mark systems as needed. */
mission_sysMark();
map_wid = window_create("Star Map", -1, -1, WINDOW_WIDTH, WINDOW_HEIGHT); map_wid = window_create("Star Map", -1, -1, WINDOW_WIDTH, WINDOW_HEIGHT);
window_addText(map_wid, -20, -20, 100, 20, 1, "txtSysname", window_addText(map_wid, -20, -20, 100, 20, 1, "txtSysname",
@ -175,8 +179,8 @@ static void map_render(double bx, double by, double w, double h) {
for(i = 0; i < systems_nstack; i++) { for(i = 0; i < systems_nstack; i++) {
sys = &systems_stack[i]; sys = &systems_stack[i];
/* Check to make sure system is known of adjacent to known. */ /* Check to make sure system is known of adjacent to known (or marked). */
if(!space_sysReachable(sys)) continue; if(!sys_isMarked(sys) && !space_sysReachable(sys)) continue;
/* System Colours. */ /* System Colours. */
if(sys == cur_system) COLOUR(cRadar_targ); if(sys == cur_system) COLOUR(cRadar_targ);
@ -184,9 +188,20 @@ static void map_render(double bx, double by, double w, double h) {
else if(areEnemies(player->faction, sys->faction)) COLOUR(cRed); else if(areEnemies(player->faction, sys->faction)) COLOUR(cRed);
else COLOUR(cYellow); else COLOUR(cYellow);
gl_drawCircleInRect(x + sys->pos.x*map_zoom, /* Draw the system. */
y + sys->pos.y*map_zoom, tx = x + sys->pos.x * map_zoom;
r, bx, by, w, h); ty = y + sys->pos.y * map_zoom;
gl_drawCircleInRect(tx, ty, r, bx, by, w, h);
/* Mark the system if needed. */
if(sys_isMarked(sys)) {
COLOUR(cRed);
glBegin(GL_TRIANGLES);
glVertex2d(tx+r+9, ty+r+3);
glVertex2d(tx+r+3, ty+r+3);
glVertex2d(tx+r+3, ty+r+9);
glEnd();
}
/* Draw the system name. */ /* Draw the system name. */
if(sys_isKnown(sys)) { if(sys_isKnown(sys)) {

View File

@ -54,6 +54,8 @@ static unsigned int hook_generic(lua_State* L, char* stack);
int misn_run(Mission* misn, char* func); int misn_run(Mission* misn, char* func);
int var_save(xmlTextWriterPtr writer); int var_save(xmlTextWriterPtr writer);
int var_load(xmlNodePtr parent); int var_load(xmlNodePtr parent);
/* External. */
extern void mission_sysMark(void);
/* -- Libraries. -- */ /* -- Libraries. -- */
@ -61,6 +63,7 @@ int var_load(xmlNodePtr parent);
static int misn_setTitle(lua_State* L); static int misn_setTitle(lua_State* L);
static int misn_setDesc(lua_State* L); static int misn_setDesc(lua_State* L);
static int misn_setReward(lua_State* L); static int misn_setReward(lua_State* L);
static int misn_setMarker(lua_State* L);
static int misn_factions(lua_State* L); static int misn_factions(lua_State* L);
static int misn_accept(lua_State* L); static int misn_accept(lua_State* L);
static int misn_finish(lua_State* L); static int misn_finish(lua_State* L);
@ -68,6 +71,7 @@ static const luaL_reg misn_methods[] = {
{ "setTitle", misn_setTitle }, { "setTitle", misn_setTitle },
{ "setDesc", misn_setDesc }, { "setDesc", misn_setDesc },
{ "setReward", misn_setReward }, { "setReward", misn_setReward },
{ "setMarker", misn_setMarker },
{ "factions", misn_factions }, { "factions", misn_factions },
{ "accept", misn_accept }, { "accept", misn_accept },
{ "finish", misn_finish }, { "finish", misn_finish },
@ -333,34 +337,47 @@ static int var_add(misn_var* new_var) {
static int misn_setTitle(lua_State* L) { static int misn_setTitle(lua_State* L) {
LLUA_MIN_ARGS(1); LLUA_MIN_ARGS(1);
if(lua_isstring(L, -1)) { if(lua_isstring(L, 1)) {
if(cur_mission->title) if(cur_mission->title)
/* Cleanup the old title. */ /* Cleanup the old title. */
free(cur_mission->title); free(cur_mission->title);
cur_mission->title = strdup((char*)lua_tostring(L, -1)); cur_mission->title = strdup((char*)lua_tostring(L, 1));
} }
return 0; return 0;
} }
static int misn_setDesc(lua_State* L) { static int misn_setDesc(lua_State* L) {
LLUA_MIN_ARGS(1); LLUA_MIN_ARGS(1);
if(lua_isstring(L, -1)) { if(lua_isstring(L, 1)) {
if(cur_mission->desc) if(cur_mission->desc)
/* Cleanup the old description. */ /* Cleanup the old description. */
free(cur_mission->desc); free(cur_mission->desc);
cur_mission->desc = strdup((char*)lua_tostring(L, -1)); cur_mission->desc = strdup((char*)lua_tostring(L, 1));
} }
return 0; return 0;
} }
static int misn_setReward(lua_State* L) { static int misn_setReward(lua_State* L) {
LLUA_MIN_ARGS(1); LLUA_MIN_ARGS(1);
if(lua_isstring(L, -1)) { if(lua_isstring(L, 1)) {
if(cur_mission->reward) if(cur_mission->reward != NULL) /* Cleanup old reward. */
/* Cleanup the old reward. */ /* Cleanup the old reward. */
free(cur_mission->reward); free(cur_mission->reward);
cur_mission->reward = strdup((char*)lua_tostring(L, -1)); cur_mission->reward = strdup((char*)lua_tostring(L, 1));
} }
else LLUA_INVALID_PARAMETER();
return 0;
}
static int misn_setMarker(lua_State* L) {
LLUA_MIN_ARGS(1);
if(lua_isstring(L, 1)) {
if(cur_mission->sys_marker != NULL) /* Cleanup old markers. */
free(cur_mission->sys_marker);
cur_mission->sys_marker = strdup((char*)lua_tostring(L, 1));
mission_sysMark();
}
else LLUA_INVALID_PARAMETER();
return 0; return 0;
} }

View File

@ -12,6 +12,8 @@
#include "xml.h" #include "xml.h"
#include "faction.h" #include "faction.h"
#include "player.h" #include "player.h"
#include "base64.h"
#include "space.h"
#include "mission.h" #include "mission.h"
#define XML_MISSION_ID "Missions" /* XML section identifier. */ #define XML_MISSION_ID "Missions" /* XML section identifier. */
@ -28,6 +30,10 @@ Mission player_missions[MISSION_MAX];
static MissionData* mission_stack = NULL; /* Unmuteable after creation. */ static MissionData* mission_stack = NULL; /* Unmuteable after creation. */
static int mission_nstack = 0; static int mission_nstack = 0;
/* External space stack. */
extern StarSystem* systems_stack;
extern int systems_nstack;
/* Extern. */ /* Extern. */
extern int misn_run(Mission* misn, char* func); extern int misn_run(Mission* misn, char* func);
@ -83,6 +89,9 @@ static int mission_init(Mission* mission, MissionData* misn, int load) {
char* buf; char* buf;
uint32_t bufsize; uint32_t bufsize;
/* Clear the mission. */
memset(mission, 0, sizeof(Mission));
if(load != 0) if(load != 0)
mission->id = 0; mission->id = 0;
else else
@ -90,13 +99,6 @@ static int mission_init(Mission* mission, MissionData* misn, int load) {
mission->data = misn; mission->data = misn;
/* Sane defaults. */
mission->title = NULL;
mission->desc = NULL;
mission->reward = NULL;
mission->cargo = NULL;
mission->ncargo = 0;
/* Init lua. */ /* Init lua. */
mission->L = luaL_newstate(); mission->L = luaL_newstate();
if(mission->L == NULL) { if(mission->L == NULL) {
@ -243,6 +245,21 @@ void missions_bar(int faction, char* planet, char* system) {
} }
} }
/* Mark all active systems that need marking. */
void mission_sysMark(void) {
int i;
StarSystem* sys;
space_clearMarkers();
for(i = 0; i < MISSION_MAX; i++) {
if(player_missions[i].sys_marker != NULL) {
sys = system_get(player_missions[i].sys_marker);
sys_setFlag(sys, SYSTEM_MARKED);
}
}
}
/* Links cargo to the mission for posterior cleanup. */ /* Links cargo to the mission for posterior cleanup. */
void mission_linkCargo(Mission* misn, unsigned int cargo_id) { void mission_linkCargo(Mission* misn, unsigned int cargo_id) {
misn->ncargo++; misn->ncargo++;
@ -287,12 +304,16 @@ void mission_cleanup(Mission* misn) {
free(misn->desc); free(misn->desc);
misn->desc = NULL; misn->desc = NULL;
} }
if(misn->reward) { if(misn->reward != NULL) {
free(misn->reward); free(misn->reward);
misn->reward = NULL; misn->reward = NULL;
} }
if(misn->cargo) { if(misn->sys_marker != NULL) {
for(i = 0; i < misn->ncargo; i++) free(misn->sys_marker);
misn->sys_marker = NULL;
}
if(misn->cargo != NULL) {
for(i = 0; i < misn->ncargo; i++) /* Must unlink all the cargo. */
mission_unlinkCargo(misn, misn->cargo[i]); mission_unlinkCargo(misn, misn->cargo[i]);
free(misn->cargo); free(misn->cargo);
misn->cargo = NULL; misn->cargo = NULL;
@ -594,6 +615,8 @@ int missions_saveActive(xmlTextWriterPtr writer) {
xmlw_elem(writer, "title", player_missions[i].title); xmlw_elem(writer, "title", player_missions[i].title);
xmlw_elem(writer, "desc", player_missions[i].desc); xmlw_elem(writer, "desc", player_missions[i].desc);
xmlw_elem(writer, "reward", player_missions[i].reward); xmlw_elem(writer, "reward", player_missions[i].reward);
if(player_missions[i].sys_marker != NULL)
xmlw_elem(writer, "marked", player_missions[i].sys_marker);
xmlw_startElem(writer, "cargos"); xmlw_startElem(writer, "cargos");
for(j = 0; j < player_missions[i].ncargo; j++) for(j = 0; j < player_missions[i].ncargo; j++)
@ -659,6 +682,7 @@ static int missions_parseActive(xmlNodePtr parent) {
xmlr_strd(cur, "title", misn->title); xmlr_strd(cur, "title", misn->title);
xmlr_strd(cur, "desc", misn->desc); xmlr_strd(cur, "desc", misn->desc);
xmlr_strd(cur, "reward", misn->reward); xmlr_strd(cur, "reward", misn->reward);
xmlr_strd(cur, "marker", misn->sys_marker);
if(xml_isNode(cur, "cargos")) { if(xml_isNode(cur, "cargos")) {
nest = cur->xmlChildrenNode; nest = cur->xmlChildrenNode;

View File

@ -55,6 +55,8 @@ typedef struct Mission_ {
unsigned int* cargo; unsigned int* cargo;
int ncargo; int ncargo;
char* sys_marker; /* Marked system. */
lua_State* L; /* The state of the running lua code. */ lua_State* L; /* The state of the running lua code. */
} Mission; } Mission;
@ -70,6 +72,7 @@ void missions_bar(int faction, char* planet, char* system);
/* Misc. */ /* Misc. */
int mission_getID(char* name); int mission_getID(char* name);
MissionData* mission_get(int id); MissionData* mission_get(int id);
void mission_sysMark(void);
/* Cargo stuff. */ /* Cargo stuff. */
void mission_linkCargo(Mission* misn, unsigned int cargo_id); void mission_linkCargo(Mission* misn, unsigned int cargo_id);

View File

@ -514,7 +514,8 @@ int player_cargoOwned(const char* commodityname) {
void player_rmMissionCargo(unsigned int cargo_id) { void player_rmMissionCargo(unsigned int cargo_id) {
int i; int i;
if(!pilot_rmMissionCargo(player, cargo_id)) return; /* Already done. */ /* Check if already done. */
if((player != NULL) && !pilot_rmMissionCargo(player, cargo_id)) return;
for(i = 0; i < player_nstack; i++) for(i = 0; i < player_nstack; i++)
if(!pilot_rmMissionCargo(player_stack[i], cargo_id)) if(!pilot_rmMissionCargo(player_stack[i], cargo_id))

View File

@ -925,12 +925,20 @@ void space_exit(void) {
nstars = 0; nstars = 0;
} }
/* Clear all system knowledge. */
void space_clearKnown(void) { void space_clearKnown(void) {
int i; int i;
for(i = 0; i < systems_nstack; i++) for(i = 0; i < systems_nstack; i++)
sys_rmFlag(&systems_stack[i], SYSTEM_KNOWN); sys_rmFlag(&systems_stack[i], SYSTEM_KNOWN);
} }
/* Clear all system markers. */
void space_clearMarkers(void) {
int i;
for( i = 0; i < systems_nstack; i++)
sys_rmFlag(&systems_stack[i], SYSTEM_MARKED);
}
/* Save what is needed to be saved for space. */ /* Save what is needed to be saved for space. */
int space_sysSave(xmlTextWriterPtr writer) { int space_sysSave(xmlTextWriterPtr writer) {
int i; int i;

View File

@ -76,7 +76,8 @@ typedef struct Planet_ {
#define sys_isFlag(s,f) ((s)->flags & (f)) #define sys_isFlag(s,f) ((s)->flags & (f))
#define sys_setFlag(s,f) if(!sys_isFlag(s,f)) (s)->flags |= (f) #define sys_setFlag(s,f) if(!sys_isFlag(s,f)) (s)->flags |= (f)
#define sys_rmFlag(s,f) if(sys_isFlag(s,f)) (s)->flags ^= (f) #define sys_rmFlag(s,f) if(sys_isFlag(s,f)) (s)->flags ^= (f)
#define sys_isKnown(s) ((s)->flags & SYSTEM_KNOWN) #define sys_isKnown(s) sys_isFlag(s, SYSTEM_KNOWN)
#define sys_isMarked(s) sys_isFlag(s, SYSTEM_MARKED)
/* Star systems. */ /* Star systems. */
typedef struct SystemFleet_ { typedef struct SystemFleet_ {
@ -130,5 +131,6 @@ int space_sysReachable(StarSystem* sys);
char** space_getFactionPlanet(int* nplanets, int* factions, int nfactions); char** space_getFactionPlanet(int* nplanets, int* factions, int nfactions);
char* space_getRndPlanet(void); char* space_getRndPlanet(void);
void space_clearKnown(void); void space_clearKnown(void);
void space_clearMarkers(void);
extern char* stardate; extern char* stardate;