[Add] Introduced getListPos to get the position of the list.

This commit is contained in:
Allanis 2013-04-06 14:53:49 +01:00
parent 07883a8a3b
commit 91cce3c8c6
8 changed files with 73 additions and 44 deletions

View File

@ -11,6 +11,7 @@
<mission name="Cargo Freight"> <mission name="Cargo Freight">
<lua>cargo</lua> <lua>cargo</lua>
<avail> <avail>
<chance>750</chance>
<location>Computer</location> <location>Computer</location>
<alliance>Neutral</alliance> <alliance>Neutral</alliance>
<alliance>Empire United</alliance> <alliance>Empire United</alliance>

View File

@ -840,20 +840,24 @@ static void misn_close(char* str) {
} }
static void misn_accept(char* str) { static void misn_accept(char* str) {
int i;
char* misn_name; char* misn_name;
Mission* misn;
int pos;
(void)str; (void)str;
misn_name = toolkit_getList(secondary_wid, "lstMission"); misn_name = toolkit_getList(secondary_wid, "lstMission");
if(strcmp(misn_name, "No Missions")==0) return; if(strcmp(misn_name, "No Missions")==0) return;
for(i = 0; i < mission_ncomputer; i++) if(dialogue_YesNo("Accept Mission",
if(mission_computer[i].title && "Are you sure you want to accept this mission?")) {
(strcmp(misn_name, mission_computer[i].title)==0)) { pos = toolkit_getListPos(secondary_wid, "lstMission");
mission_accept(&mission_computer[i]); misn = &mission_computer[pos];
mission_accept(misn);
memmove(misn, &mission_computer[pos+1],
sizeof(Mission) * (mission_ncomputer-pos-1));
mission_ncomputer--;
misn_genList(0); misn_genList(0);
return;
} }
} }
@ -888,8 +892,8 @@ static void misn_genList(int first) {
} }
static void misn_update(char* str) { static void misn_update(char* str) {
int i;
char* active_misn; char* active_misn;
Mission* misn;
(void)str; (void)str;
@ -902,14 +906,10 @@ static void misn_update(char* str) {
window_disableButton(secondary_wid, "btnAcceptMission"); window_disableButton(secondary_wid, "btnAcceptMission");
return; return;
} }
for(i = 0; i < mission_ncomputer; i++) misn = &mission_computer[toolkit_getListPos(secondary_wid, "lstMission")];
if(mission_computer[i].title && window_modifyText(secondary_wid, "txtReward", misn->reward);
(strcmp(active_misn, mission_computer[i].title)==0)) { window_modifyText(secondary_wid, "txtDesc", misn->desc);
window_modifyText(secondary_wid, "txtReward", mission_computer[i].reward);
window_modifyText(secondary_wid, "txtDesc", mission_computer[i].desc);
window_enableButton(secondary_wid, "btnAcceptMission"); window_enableButton(secondary_wid, "btnAcceptMission");
return;
}
} }
// Land the player. // Land the player.

View File

@ -294,8 +294,8 @@ static void mission_menu_genList(int first) {
} }
static void mission_menu_update(char* str) { static void mission_menu_update(char* str) {
int i;
char* active_misn; char* active_misn;
Mission* misn;
unsigned int wid; unsigned int wid;
(void)str; (void)str;
@ -309,34 +309,31 @@ static void mission_menu_update(char* str) {
window_disableButton(wid, "btnAbortMission"); window_disableButton(wid, "btnAbortMission");
return; return;
} }
for(i = 0; i < MISSION_MAX; i++) misn = &player_missions[toolkit_getListPos(wid, "lstMission")];
if(player_missions[i].title && window_modifyText(wid, "txtReward", misn->reward);
(strcmp(active_misn, player_missions[i].title)==0)) { window_modifyText(wid, "txtDesc", misn->desc);
window_modifyText(wid, "txtReward", player_missions[i].reward);
window_modifyText(wid, "txtDesc", player_missions[i].desc);
window_enableButton(wid, "btnAbortMission"); window_enableButton(wid, "btnAbortMission");
return;
}
} }
static void mission_menu_abort(char* str) { static void mission_menu_abort(char* str) {
(void)str; (void)str;
char* selected_misn; char* selected_misn;
int pos;
unsigned int wid; unsigned int wid;
int i; Mission* misn;
wid = window_get("Missions"); wid = window_get("Missions");
selected_misn = toolkit_getList(wid, "lstMission"); selected_misn = toolkit_getList(wid, "lstMission");
if(dialogue_YesNo("Abort Mission", "Are you sure you want to abort this mission?")) if(dialogue_YesNo("Abort Mission",
for(i = 0; i < MISSION_MAX; i++) "Are you sure you want to abort this mission?")) {
if(player_missions[i].title && pos = toolkit_getListPos(wid, "lstMission");
(strcmp(selected_misn, player_missions[i].title)==0)) { misn = &player_missions[pos];
// TODO: handle lost cargo.. mission_cleanup(misn);
mission_cleanup(&player_missions[i]); memmove(misn, &player_missions[pos+1],
sizeof(Mission) * (MISSION_MAX-pos-1));
mission_menu_genList(0); mission_menu_genList(0);
break;
} }
} }

View File

@ -98,7 +98,7 @@ int misn_loadLibs(lua_State* L) {
// Run a mission function. // Run a mission function.
int misn_run(Mission* misn, char* func) { int misn_run(Mission* misn, char* func) {
int ret; int i, ret;
char* err; char* err;
cur_mission = misn; cur_mission = misn;
@ -114,7 +114,15 @@ int misn_run(Mission* misn, char* func) {
} }
// Mission is finished. // Mission is finished.
if(misn_delete) mission_cleanup(cur_mission); if(misn_delete) {
mission_cleanup(cur_mission);
for(i = 0; i < MISSION_MAX; i++)
if(cur_mission == &player_missions[i]) {
memmove(&player_missions[i], &player_missions[i+1],
sizeof(Mission) * (MISSION_MAX-i-1));
break;
}
}
cur_mission = NULL; cur_mission = NULL;
return ret; return ret;

View File

@ -6,6 +6,7 @@
#include "lauxlib.h" #include "lauxlib.h"
#include "lualib.h" #include "lualib.h"
#include "rng.h"
#include "lephisto.h" #include "lephisto.h"
#include "log.h" #include "log.h"
#include "hook.h" #include "hook.h"
@ -121,7 +122,9 @@ static int mission_matchFaction(MissionData* misn, int faction) {
// Generate missions for the computer - special case. // Generate missions for the computer - special case.
Mission* missions_computer(int* n, int faction, char* planet, char* system) { Mission* missions_computer(int* n, int faction, char* planet, char* system) {
int i, m; int i, j, m;
double chance;
int rep;
Mission* tmp; Mission* tmp;
MissionData* misn; MissionData* misn;
@ -133,10 +136,17 @@ Mission* missions_computer(int* n, int faction, char* planet, char* system) {
(((misn->avail.planet && strcmp(misn->avail.planet, planet)==0)) || (((misn->avail.planet && strcmp(misn->avail.planet, planet)==0)) ||
(misn->avail.system && (strcmp(misn->avail.system, system)==0)) || (misn->avail.system && (strcmp(misn->avail.system, system)==0)) ||
mission_matchFaction(misn, faction))) { mission_matchFaction(misn, faction))) {
chance = (double)(misn->avail.chance % 100)/100.;
rep = misn->avail.chance/100;
for(j = 0; j < rep; j++)
// Random chance of rep appearances.
if(RNGF() > chance) {
tmp = realloc(tmp, sizeof(Mission) * ++m); tmp = realloc(tmp, sizeof(Mission) * ++m);
mission_init(&tmp[m-1], misn); mission_init(&tmp[m-1], misn);
} }
} }
}
(*n) = m; (*n) = m;
return tmp; return tmp;
} }
@ -188,6 +198,8 @@ static MissionData* mission_parse(const xmlNodePtr parent) {
do { do {
if(xml_isNode(cur, "location")) if(xml_isNode(cur, "location"))
tmp->avail.loc = mission_location(xml_get(cur)); tmp->avail.loc = mission_location(xml_get(cur));
else if(xml_isNode(cur, "chance"))
tmp->avail.chance = xml_getInt(cur);
else if(xml_isNode(cur, "planet")) else if(xml_isNode(cur, "planet"))
tmp->avail.planet = strdup(xml_get(cur)); tmp->avail.planet = strdup(xml_get(cur));
else if(xml_isNode(cur, "system")) else if(xml_isNode(cur, "system"))

View File

@ -23,7 +23,7 @@ typedef struct MissionData_ {
// Availability. // Availability.
struct { struct {
int loc; // Location. int loc; // Location.
double chance; // Chance of it appearing. int chance; // Chance of it appearing.
// For specific cases. // For specific cases.
char* planet; char* planet;

View File

@ -1366,6 +1366,16 @@ char* toolkit_getList(const unsigned int wid, char* name) {
return wgt->dat.lst.options[wgt->dat.lst.selected]; return wgt->dat.lst.options[wgt->dat.lst.selected];
} }
// Get the position of current item in the list.
int toolkit_getListPos(const unsigned int wid, char* name) {
Widget* wgt = window_getwgt(wid, name);
if((wgt->type != WIDGET_LIST) || (wgt->dat.lst.selected == -1))
return -1;
return wgt->dat.lst.selected;
}
// Return the focused widget. // Return the focused widget.
static Widget* toolkit_getFocus(void) { static Widget* toolkit_getFocus(void) {
Window* wdw; Window* wdw;

View File

@ -67,6 +67,7 @@ void window_imgColour(const unsigned int wid, char* name, glColour* colour);
int window_exists(const char* wdwname); int window_exists(const char* wdwname);
unsigned int window_get(const char* wdwname); unsigned int window_get(const char* wdwname);
char* toolkit_getList(const unsigned int wid, char* name); char* toolkit_getList(const unsigned int wid, char* name);
int toolkit_getListPos(const unsigned int wid, char* name);
glTexture* window_getImage(const unsigned int wid, char* name); glTexture* window_getImage(const unsigned int wid, char* name);
char* window_getInput(const unsigned int wid, char* name); char* window_getInput(const unsigned int wid, char* name);