all[quests]: add a function to protect access from bad index..
This commit is contained in:
@@ -1820,7 +1820,7 @@ void special_increase_age(long length, bool queue) {
|
||||
for(auto& p : univ.party.active_quests) {
|
||||
if(p.second.status != eQuestStatus::STARTED)
|
||||
continue;
|
||||
cQuest& quest = univ.scenario.quests[p.first];
|
||||
cQuest const &quest = univ.get_quest(p.first);
|
||||
if(quest.deadline <= 0)
|
||||
continue;
|
||||
bool is_relative = quest.flags % 10;
|
||||
@@ -2447,7 +2447,7 @@ void general_spec(const runtime_state& ctx) {
|
||||
break;
|
||||
}
|
||||
auto& job = univ.party.active_quests[spec.ex1a];
|
||||
auto& quest = univ.scenario.quests[spec.ex1a];
|
||||
cQuest const &quest = univ.get_quest(spec.ex1a);
|
||||
if(spec.ex1b == int(eQuestStatus::STARTED) && job.status != eQuestStatus::STARTED) {
|
||||
job.start = univ.party.calc_day();
|
||||
job.source = max(-1,spec.ex2a);
|
||||
|
@@ -276,13 +276,13 @@ void put_item_screen(eItemWinMode screen_num) {
|
||||
if(spec_item_array[i_num] / 10000 == 2)
|
||||
style.colour = Colours::RED;
|
||||
|
||||
win_draw_string(item_stats_gworld,item_buttons[i][ITEMBTN_NAME],univ.scenario.quests[which_quest].name,eTextMode::WRAP,style);
|
||||
win_draw_string(item_stats_gworld,item_buttons[i][ITEMBTN_NAME],univ.get_quest(which_quest).name,eTextMode::WRAP,style);
|
||||
|
||||
if(spec_item_array[i_num] / 10000 == 1) {
|
||||
location from, to;
|
||||
from = to = item_buttons[i][ITEMBTN_NAME].centre();
|
||||
from.x = item_buttons[i][ITEMBTN_NAME].left;
|
||||
to.x = from.x + string_length(univ.scenario.quests[which_quest].name, style);
|
||||
to.x = from.x + string_length(univ.get_quest(which_quest).name, style);
|
||||
draw_line(item_stats_gworld, from, to, 1, Colours::GREEN);
|
||||
}
|
||||
|
||||
|
@@ -235,6 +235,29 @@ cItem &cScenario::get_item(item_num_t item)
|
||||
return badItem;
|
||||
}
|
||||
|
||||
static cQuest getBadQuest() {
|
||||
cQuest badQuest;
|
||||
badQuest.name = "Bad quest";
|
||||
return badQuest;
|
||||
}
|
||||
|
||||
cQuest const &cScenario::get_quest(int quest) const
|
||||
{
|
||||
if (quest>=0 && quest<quests.size())
|
||||
return quests[quest];
|
||||
static cQuest badQuest=getBadQuest();
|
||||
return badQuest;
|
||||
}
|
||||
|
||||
cQuest &cScenario::get_quest(int quest)
|
||||
{
|
||||
if (quest>=0 && quest<quests.size())
|
||||
return quests[quest];
|
||||
static cQuest badQuest;
|
||||
badQuest=getBadQuest();
|
||||
return badQuest;
|
||||
}
|
||||
|
||||
static cSpecItem getBadSpecialItem() {
|
||||
cSpecItem badItem;
|
||||
badItem.name="Bad Special Item";
|
||||
|
@@ -53,6 +53,8 @@ public:
|
||||
cTerrain &get_terrain(ter_num_t ter);
|
||||
cItem const &get_item(item_num_t item) const;
|
||||
cItem &get_item(item_num_t item);
|
||||
cQuest const &get_quest(int quest) const;
|
||||
cQuest &get_quest(int quest);
|
||||
cSpecItem const &get_special_item(item_num_t item) const;
|
||||
cSpecItem &get_special_item(item_num_t item);
|
||||
|
||||
|
@@ -642,11 +642,11 @@ static bool handle_rb_action(location the_point, bool option_hit) {
|
||||
if(j == scenario.quests.size() - 1)
|
||||
scenario.quests.pop_back();
|
||||
else {
|
||||
scenario.quests[j] = cQuest();
|
||||
scenario.quests[j].name = "Unused Quest";
|
||||
scenario.get_quest(j) = cQuest();
|
||||
scenario.get_quest(j).name = "Unused Quest";
|
||||
}
|
||||
} else {
|
||||
if(!edit_quest(j) && j == size_before && scenario.quests[j].name == "New Quest")
|
||||
if(!edit_quest(j) && j == size_before && scenario.get_quest(j).name == "New Quest")
|
||||
scenario.quests.pop_back();
|
||||
}
|
||||
start_quest_editing(size_before == scenario.quests.size());
|
||||
@@ -2491,7 +2491,7 @@ void start_quest_editing(bool just_redo_text) {
|
||||
std::string title;
|
||||
if(i == scenario.quests.size())
|
||||
title = "Create New Quest";
|
||||
else title = scenario.quests[i].name;
|
||||
else title = scenario.get_quest(i).name;
|
||||
title = std::to_string(i) + " - " + title;
|
||||
set_rb(i, RB_QUEST, i, title);
|
||||
}
|
||||
|
@@ -2088,7 +2088,7 @@ static bool save_quest_from_dlog(cDialog& me, cQuest& quest, size_t which_quest,
|
||||
quest.bank2 = me["bank2"].getTextAsNum();
|
||||
} else quest.bank1 = quest.bank2 = -1;
|
||||
|
||||
scenario.quests[which_quest] = quest;
|
||||
scenario.get_quest(which_quest) = quest;
|
||||
if(!close) me.untoast();
|
||||
return true;
|
||||
}
|
||||
@@ -2107,7 +2107,7 @@ static bool change_quest_dlog_page(cDialog& me, std::string dir, cQuest& quest,
|
||||
which_quest = 0;
|
||||
}
|
||||
|
||||
quest = scenario.quests[which_quest];
|
||||
quest = scenario.get_quest(which_quest);
|
||||
put_quest_in_dlog(me, quest, which_quest);
|
||||
return true;
|
||||
}
|
||||
@@ -2118,7 +2118,7 @@ bool edit_quest(size_t which_quest) {
|
||||
scenario.quests.resize(which_quest + 1);
|
||||
scenario.quests[which_quest].name = "New Quest";
|
||||
}
|
||||
cQuest quest = scenario.quests[which_quest];
|
||||
cQuest quest = scenario.get_quest(which_quest);
|
||||
|
||||
cDialog quest_dlg("edit-quest");
|
||||
quest_dlg["cancel"].attachClickHandler(std::bind(&cDialog::toast, _1, false));
|
||||
|
@@ -199,7 +199,7 @@ void writeScenarioToXml(ticpp::Printer&& data, cScenario& scenario) {
|
||||
data.CloseElement("special-item");
|
||||
}
|
||||
for(size_t i = 0; i < scenario.quests.size(); i++) {
|
||||
cQuest& quest = scenario.quests[i];
|
||||
cQuest const &quest = scenario.quests[i];
|
||||
data.OpenElement("quest");
|
||||
data.PushAttribute("start-with", boolstr(quest.flags / 10));
|
||||
if(quest.deadline >= 0) {
|
||||
|
@@ -217,6 +217,8 @@ public:
|
||||
|
||||
cItem const &get_item(item_num_t item) const { return scenario.get_item(item); }
|
||||
cItem &get_item(item_num_t item) { return scenario.get_item(item); }
|
||||
cQuest const &get_quest(int quest) const { return scenario.get_quest(quest); }
|
||||
cQuest &get_quest(int quest) { return scenario.get_quest(quest); }
|
||||
cSpecItem const &get_special_item(item_num_t item) const { return scenario.get_special_item(item); }
|
||||
cSpecItem &get_special_item(item_num_t item) { return scenario.get_special_item(item); }
|
||||
cTerrain const &get_terrain(ter_num_t ter) const { return scenario.get_terrain(ter); }
|
||||
|
Reference in New Issue
Block a user