all[quests]: add a function to protect access from bad index..

This commit is contained in:
ALONSO Laurent
2021-10-20 16:47:45 +02:00
committed by Celtic Minstrel
parent 15db88e723
commit f997771dbe
8 changed files with 39 additions and 12 deletions

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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";

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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));

View File

@@ -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) {

View File

@@ -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); }