From 91cce3c8c61b0e5c09c5852d6ca8037c4d133c6d Mon Sep 17 00:00:00 2001 From: Allanis Date: Sat, 6 Apr 2013 14:53:49 +0100 Subject: [PATCH] [Add] Introduced getListPos to get the position of the list. --- dat/mission.xml | 1 + src/land.c | 36 ++++++++++++++++++------------------ src/menu.c | 35 ++++++++++++++++------------------- src/misn_lua.c | 12 ++++++++++-- src/mission.c | 18 +++++++++++++++--- src/mission.h | 4 ++-- src/toolkit.c | 10 ++++++++++ src/toolkit.h | 1 + 8 files changed, 73 insertions(+), 44 deletions(-) diff --git a/dat/mission.xml b/dat/mission.xml index cc6e8e0..902dfa5 100644 --- a/dat/mission.xml +++ b/dat/mission.xml @@ -11,6 +11,7 @@ cargo + 750 Computer Neutral Empire United diff --git a/src/land.c b/src/land.c index 4af314c..919913f 100644 --- a/src/land.c +++ b/src/land.c @@ -840,21 +840,25 @@ 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]); - misn_genList(0); - return; - } + + 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); + } } static void misn_genList(int first) { @@ -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); - window_enableButton(secondary_wid, "btnAcceptMission"); - return; - } + 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"); } // Land the player. diff --git a/src/menu.c b/src/menu.c index e58e3b7..9f10fa0 100644 --- a/src/menu.c +++ b/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,35 +309,32 @@ 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); - window_enableButton(wid, "btnAbortMission"); - return; - } + misn = &player_missions[toolkit_getListPos(wid, "lstMission")]; + window_modifyText(wid, "txtReward", misn->reward); + window_modifyText(wid, "txtDesc", misn->desc); + window_enableButton(wid, "btnAbortMission"); } 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]); - mission_menu_genList(0); - break; - } + 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); + } } // Pilot dead. diff --git a/src/misn_lua.c b/src/misn_lua.c index fb19ea0..e301060 100644 --- a/src/misn_lua.c +++ b/src/misn_lua.c @@ -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; diff --git a/src/mission.c b/src/mission.c index cc04c18..2836560 100644 --- a/src/mission.c +++ b/src/mission.c @@ -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,8 +136,15 @@ 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))) { - tmp = realloc(tmp, sizeof(Mission) * ++m); - mission_init(&tmp[m-1], misn); + 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; @@ -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")) diff --git a/src/mission.h b/src/mission.h index 5083a78..452ce97 100644 --- a/src/mission.h +++ b/src/mission.h @@ -22,8 +22,8 @@ typedef struct MissionData_ { // Availability. struct { - int loc; // Location. - double chance; // Chance of it appearing. + int loc; // Location. + int chance; // Chance of it appearing. // For specific cases. char* planet; diff --git a/src/toolkit.c b/src/toolkit.c index 8af4aa6..cc4ba97 100644 --- a/src/toolkit.c +++ b/src/toolkit.c @@ -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; diff --git a/src/toolkit.h b/src/toolkit.h index af351e2..b072ba0 100644 --- a/src/toolkit.h +++ b/src/toolkit.h @@ -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);