[Add] Introduced getListPos to get the position of the list.
This commit is contained in:
parent
07883a8a3b
commit
91cce3c8c6
@ -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>
|
||||
|
28
src/land.c
28
src/land.c
@ -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.
|
||||
|
29
src/menu.c
29
src/menu.c
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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"))
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user