[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">
<lua>cargo</lua>
<avail>
<chance>750</chance>
<location>Computer</location>
<alliance>Neutral</alliance>
<alliance>Empire United</alliance>

View File

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

View File

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

View File

@ -98,7 +98,7 @@ int misn_loadLibs(lua_State* L) {
// Run a mission function.
int misn_run(Mission* misn, char* func) {
int ret;
int i, ret;
char* err;
cur_mission = misn;
@ -114,7 +114,15 @@ int misn_run(Mission* misn, char* func) {
}
// 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;
return ret;

View File

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

View File

@ -23,7 +23,7 @@ typedef struct MissionData_ {
// Availability.
struct {
int loc; // Location.
double chance; // Chance of it appearing.
int chance; // Chance of it appearing.
// For specific cases.
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];
}
// 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.
static Widget* toolkit_getFocus(void) {
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);
unsigned int window_get(const char* wdwname);
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);
char* window_getInput(const unsigned int wid, char* name);