[Add] Missions can now mark systems. [Fix] Seg fault when switching pilots.
This commit is contained in:
parent
73d8e18a2a
commit
692fb388df
@ -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.
|
||||||
|
25
src/map.c
25
src/map.c
@ -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)) {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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))
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user