More reduction of reliance on hard-coded limits

This commit is contained in:
2015-02-07 09:46:51 -05:00
parent 6d26d430b3
commit f5a43bc011
11 changed files with 43 additions and 45 deletions

View File

@@ -2561,7 +2561,7 @@ void do_monster_turn() {
case eMonstSummon::LEVEL: what_summon = get_summon_monster(minmax(0, 4, abil.summon.what)); break;
case eMonstSummon::SPECIES:
for(k = 0; k < 200; k++) {
j = get_ran(1,0,255);
j = get_ran(1,0,univ.scenario.scen_monsters.size() - 1);
if(univ.scenario.scen_monsters[j].m_type == eRace(abil.summon.what)) {
what_summon = j;
break;

View File

@@ -16,7 +16,7 @@ extern cUniverse univ;
cItem get_stored_item(short which) {
cItem s_item;
if((which >= 400) || (which < 0)) {
if((which >= univ.scenario.scen_items.size()) || (which < 0)) {
s_item = cItem();
return s_item;
}

View File

@@ -165,7 +165,7 @@ static void init_party_scen_data() {
for(i = 0; i < 20; i++)
univ.party.key_times[i] = 30000;
univ.party.party_event_timers.clear();
for(i = 0; i < 50; i++)
for(i = 0; i < univ.scenario.special_items.size(); i++)
univ.party.spec_items[i] = univ.scenario.special_items[i].flags >= 10;
for(i = 0; i < univ.scenario.quests.size(); i++) {
if(univ.scenario.quests[i].flags >= 10) {
@@ -290,10 +290,6 @@ void put_party_in_scen(std::string scen_name) {
}
give_help(1,2);
// this is kludgy, put here to prevent problems
for(i = 0; i < 50; i++)
univ.party.spec_items[i] = univ.scenario.special_items[i].flags >= 100;
// Compatibility flags
if(univ.scenario.format.prog_make_ver[0] < 2){
PSD[SDF_RESURRECT_NO_BALM] = 1;

View File

@@ -123,7 +123,7 @@ void start_town_mode(short which_town, short entry_dir) {
}
// Now adjust town number as necessary.
for(i = 0; i < 10; i++)
for(i = 0; i < univ.scenario.town_mods.size(); i++)
if(univ.scenario.town_mods[i].spec >= 0 && univ.scenario.town_mods[i].spec < 200 &&
town_number == univ.scenario.town_mods[i].spec &&
univ.party.sd_legit(univ.scenario.town_mods[i].x,univ.scenario.town_mods[i].y)) {

View File

@@ -64,19 +64,19 @@ cScenario::cScenario(bool init_strings) {
bg_fight = 4;
bg_town = 13;
bg_dungeon = 9;
for(i = 0; i < 10; i++) {
for(i = 0; i < town_mods.size(); i++) {
town_mods[i].spec = -1;
}
for(i = 0; i < 3; i++) {
store_item_towns[i] = -1;
}
for(i = 0; i < 50; i++) {
for(i = 0; i < special_items.size(); i++) {
special_items[i].special = -1;
}
for(i = 0; i < scenario_timers.size(); i++) {
scenario_timers[i].node = -1;
}
for(i = 0; i < 400; i++) {
for(i = 0; i < scen_items.size(); i++) {
scen_items[i] = cItem();
}
if(!init_strings) return;

View File

@@ -107,13 +107,14 @@ void menu_activate() {
void update_item_menu() {
id targ = [[file_menu itemAtIndex: 0] target];
auto& item_list = univ.scenario.scen_items;
int per_menu = item_list.size() / 4;
for(int j = 0; j < 4; j++){
[items_menu[j] removeAllItems];
if(!scen_items_loaded) {
[[items_menu[j] addItemWithTitle: @"Items Not Loaded" action: @selector(itemMenu:) keyEquivalent: @""] setEnabled: NO];
} else for(int i = 0; i < 100; i++) {
ItemWrapper* item = [ItemWrapper withItem: i + 100 * j];
NSString* item_name = [NSString stringWithCString: item_list[i + j * 100].full_name.c_str() encoding: NSASCIIStringEncoding];
} else for(int i = 0; i < per_menu; i++) {
ItemWrapper* item = [ItemWrapper withItem: i + per_menu * j];
NSString* item_name = [NSString stringWithCString: item_list[i + j * per_menu].full_name.c_str() encoding: NSASCIIStringEncoding];
NSMenuItem* choice = [items_menu[j] addItemWithTitle: item_name action: @selector(itemMenu:) keyEquivalent: @""];
[choice setTarget: targ];
// TODO: Also disable gold or food

View File

@@ -98,16 +98,18 @@ void init_menubar() {
void update_item_menu() {
if(menuHandle == NULL) return;
auto& item_list = univ.scenario.scen_items;
int per_menu = item_list.size() / 4;
int per_col = per_menu / 4;
for(int j = 0; j < 4; j++) {
HMENU items_menu = GetSubMenu(menuHandle, ITEMS_MENU_POS + j);
while(GetMenuItemCount(items_menu)) RemoveMenu(items_menu, 0, MF_BYPOSITION);
if(!scen_items_loaded) {
AppendMenuA(items_menu, MF_STRING | MF_GRAYED, 1000, "Items Not Loaded");
} else for(int i = 0; i < 100; i++) {
cItem& item = item_list[i + j * 100];
} else for(int i = 0; i < per_menu; i++) {
cItem& item = item_list[i + j * per_menu];
UINT flags = MF_STRING | MF_ENABLED;
if(i % 25 == 0) flags |= MF_MENUBARBREAK;
AppendMenuA(items_menu, flags, 1000 + j * 100 + i, item.full_name.c_str());
if(i % per_col == 0) flags |= MF_MENUBARBREAK;
AppendMenuA(items_menu, flags, 1000 + j * per_menu + i, item.full_name.c_str());
// TODO: Also disable gold or food
EnableMenuItem(items_menu, i, MF_BYPOSITION | (item.variety != eItemType::NO_ITEM ? MF_ENABLED : MF_GRAYED));
}

View File

@@ -1471,7 +1471,7 @@ void handle_keystroke(sf::Event event) {
default:
if((chr >= 97) && (chr <= 122)) {
for(i = 0; i < 256; i++) {
for(i = 0; i < scenario.ter_types.size(); i++) {
j = current_terrain_type + i + 1;
j = j % 256;
if(scenario.ter_types[j].shortcut_key == chr) {
@@ -1582,7 +1582,7 @@ void unfrill_terrain() {
}
static ter_num_t find_object_part(unsigned char num, short x, short y, ter_num_t fallback){
for(int i = 0; i < 256; i++){
for(int i = 0; i < scenario.ter_types.size(); i++){
if(scenario.ter_types[i].obj_num == num &&
scenario.ter_types[i].obj_pos.x == x &&
scenario.ter_types[i].obj_pos.y == y)
@@ -1593,7 +1593,7 @@ static ter_num_t find_object_part(unsigned char num, short x, short y, ter_num_t
ter_num_t get_ground_from_ter(ter_num_t ter){
unsigned char ground = scenario.ter_types[ter].ground_type;
for(int i = 0; i < 256; i++)
for(int i = 0; i < scenario.ter_types.size(); i++)
if(scenario.ter_types[i].ground_type == ground)
return i;
return 0;
@@ -1869,7 +1869,7 @@ bool place_item(location spot_hit,short which_item,bool property,bool always,sho
short x;
if((which_item < 0) || (which_item > 399))
if((which_item < 0) || (which_item >= scenario.scen_items.size()))
return true;
if(scenario.scen_items[which_item].variety == eItemType::NO_ITEM)
return true;
@@ -2190,7 +2190,7 @@ void start_monster_editing(short just_redo_text) {
reset_rb();
right_sbar->setMaximum(255 - NRSONPAGE);
}
for(i = 1; i < 256; i++) {
for(i = 1; i < scenario.scen_monsters.size(); i++) {
set_rb(i - 1,RB_MONST, i,std::to_string(i) + " - " + scenario.scen_monsters[i].m_name);
}
if(draw_full)
@@ -2216,7 +2216,7 @@ void start_item_editing(short just_redo_text) {
reset_rb();
right_sbar->setMaximum(400 - NRSONPAGE);
}
for(i = 0; i < 400; i++) {
for(i = 0; i < scenario.scen_items.size(); i++) {
set_rb(i,RB_ITEM, i,std::to_string(i) + " - " + scenario.scen_items[i].full_name);
}
if(draw_full)
@@ -2240,7 +2240,7 @@ void start_special_item_editing() {
right_sbar->setPosition(0);
reset_rb();
right_sbar->setMaximum(50 - NRSONPAGE);
for(i = 0; i < 50; i++) {
for(i = 0; i < scenario.special_items.size(); i++) {
set_rb(i,RB_SPEC_ITEM, i,std::to_string(i) + " - " + scenario.special_items[i].name);
}
if(draw_full)

View File

@@ -755,15 +755,14 @@ static bool edit_monst_type_event_filter(cDialog& me,std::string hit,cMonster& m
if(!save_monst_info(me,monst)) return false;
scenario.scen_monsters[which] = monst;
which--;
// TODO: Use size() once scen_monsters becomes a vector
if(which < 1) which = 255;
if(which < 1) which = scenario.scen_monsters;
monst = scenario.scen_monsters[which];
put_monst_info_in_dlog(me,monst,which);
} else if(hit == "right") {
if(!save_monst_info(me,monst)) return false;
scenario.scen_monsters[which] = monst;
which++;
if(which > 255) which = 1;
if(which >= scenario.scen_monsters.size()) which = 1;
monst = scenario.scen_monsters[which];
put_monst_info_in_dlog(me,monst,which);
} else if(hit == "picktype") {
@@ -1560,14 +1559,14 @@ static bool edit_item_type_event_filter(cDialog& me, std::string hit, cItem& ite
save_item_info(me, item);
scenario.scen_items[which] = item;
which--;
if(which < 0) which = 399;
if(which < 0) which = scenario.scen_items.size() - 1;
item = scenario.scen_items[which];
put_item_info_in_dlog(me, item, which);
} else if(hit == "next") {
save_item_info(me, item);
scenario.scen_items[which] = item;
which++;
if(which > 399) which = 0;
if(which >= scenario.scen_items.size()) which = 0;
item = scenario.scen_items[which];
put_item_info_in_dlog(me, item, which);
} else if(hit == "choosepic") {
@@ -1920,13 +1919,13 @@ static bool edit_spec_item_event_filter(cDialog& me, std::string hit, cSpecItem&
} else if(hit == "left") {
if(!save_spec_item(me, item, which)) return true;
which--;
if(which < 0) which = 49;
if(which < 0) which = scenario.special_items.size() - 1;
item = scenario.special_items[which];
put_spec_item_in_dlog(me, item, which);
} else if(hit == "right") {
if(!save_spec_item(me, item, which)) return true;
which++;
if(which > 49) which = 0;
if(which >= scenario.special_items.size()) which = 0;
item = scenario.special_items[which];
put_spec_item_in_dlog(me, item, which);
} else if(hit == "edit-spec") {
@@ -2536,7 +2535,7 @@ void edit_boats() {
static bool save_add_town(cDialog& me) {
short i;
for(i = 0; i < 10; i++) {
for(i = 0; i < scenario.town_mods.size(); i++) {
std::string id = std::to_string(i + 1);
scenario.town_mods[i].spec = me["town" + id].getTextAsNum();
if(cre(scenario.town_mods[i].spec,
@@ -2554,7 +2553,7 @@ static bool save_add_town(cDialog& me) {
static void put_add_town_in_dlog(cDialog& me) {
short i;
for(i = 0; i < 10; i++) {
for(i = 0; i < scenario.town_mods.size(); i++) {
std::string id = std::to_string(i + 1);
me["town" + id].setTextToNum(scenario.town_mods[i].spec);
me["flag" + id + "-x"].setTextToNum(scenario.town_mods[i].x);

View File

@@ -170,7 +170,7 @@ static void writeScenarioToXml(ticpp::Printer&& data) {
data.CloseElement("store-items");
}
}
for(int i = 0; i < 10; i++) {
for(int i = 0; i < scenario.town_mods.size(); i++) {
if(is_minmax(0, scenario.towns.size(), scenario.town_mods[i].spec)) {
data.OpenElement("town-flag");
data.PushAttribute("town", scenario.town_mods[i].spec);
@@ -180,7 +180,7 @@ static void writeScenarioToXml(ticpp::Printer&& data) {
}
}
data.OpenElement("specials");
for(int i = 0; i < 50; i++) {
for(int i = 0; i < scenario.special_items.size(); i++) {
data.OpenElement("item");
data.PushAttribute("start-with", boolstr(scenario.special_items[i].flags / 10));
data.PushAttribute("useable", boolstr(scenario.special_items[i].flags % 10));
@@ -1050,13 +1050,13 @@ void start_data_dump() {
std::ofstream fout("Scenario Data.txt");
fout << "Scenario data for " << scen_name << ':' << endl << endl;
fout << "Terrain types for " << scen_name << ':' << endl;
for(i = 0; i < 256; i++)
for(i = 0; i < scenario.ter_types.size(); i++)
fout << " Terrain type " << i << ": " << scenario.ter_types[i].name << endl;
fout << endl << "Monster types for " << scen_name << ':' << endl;
for(i = 0; i < 256; i++)
for(i = 0; i < scenario.scen_monsters.size(); i++)
fout << " Monster type " << i << ": " << scenario.scen_monsters[i].m_name << endl;
fout << endl << "Item types for " << scen_name << ':' << endl;
for(i = 0; i < 400; i++)
for(i = 0; i < scenario.scen_items.size(); i++)
fout << " Item type " << i << ": " << scenario.scen_items[i].full_name << endl;
fout.close();
}
@@ -1074,10 +1074,10 @@ void scen_text_dump(){
for(i = 0; i < 6; i++)
if(scenario.intro_strs[i][0] != '*')
fout << " Intro Message " << i << ": " << scenario.intro_strs[i] << endl;
for(i = 0; i < 50; i++)
for(i = 0; i < scenario.journal_strs.size(); i++)
if(scenario.journal_strs[i][0] != '*')
fout << " Journal Entry " << i << ": " << scenario.journal_strs[i] << endl;
for(i = 0; i < 50; i++)
for(i = 0; i < scenario.special_items.size(); i++)
if(scenario.special_items[i].name[0] != '*') {
fout << " Special Item " << i << ':' << endl;
fout << " Name: " << scenario.special_items[i].name << endl;
@@ -1098,7 +1098,7 @@ void scen_text_dump(){
for(i = 0; i < scenario.outdoors[out_sec.x][out_sec.y]->spec_strs.size(); i++)
if(scenario.outdoors[out_sec.x][out_sec.y]->spec_strs[i][0] != '*')
fout << " Message " << i << ": " << scenario.outdoors[out_sec.x][out_sec.y]->spec_strs[i] << endl;
for(i = 0; i < 8; i++)
for(i = 0; i < scenario.outdoors[out_sec.x][out_sec.y]->sign_locs.size(); i++)
if(scenario.outdoors[out_sec.x][out_sec.y]->sign_locs[i].text[0] != '*')
fout << " Sign " << i << ": " << scenario.outdoors[out_sec.x][out_sec.y]->sign_locs[i].text << endl;
fout << endl;
@@ -1121,7 +1121,7 @@ void scen_text_dump(){
if(scenario.towns[i]->spec_strs[i][0] != '*')
fout << " Message " << i << ": " << scenario.towns[i]->spec_strs[i] << endl;
fout << " Name: " << scenario.towns[i]->town_name << endl;
for(i = 0; i < 20; i++)
for(i = 0; i < scenario.towns[i]->sign_locs.size(); i++)
if(scenario.towns[i]->sign_locs[i].text[0] != '*')
fout << " Sign " << i << ": " << scenario.towns[i]->sign_locs[i].text << endl;
fout << endl << " Town Dialogue:" << endl;
@@ -1132,7 +1132,7 @@ void scen_text_dump(){
fout << " job: " << scenario.towns[i]->talking.people[i].job << endl;
fout << " confused: " << scenario.towns[i]->talking.people[i].dunno << endl;
}
for(i = 0; i < 60; i++) {
for(i = 0; i < scenario.towns[i]->talking.talk_nodes.size(); i++) {
if(scenario.towns[i]->talking.talk_nodes[i].str1.length() > 0)
fout << " Node " << i << "a: " << scenario.towns[i]->talking.talk_nodes[i].str1 << endl;
if(scenario.towns[i]->talking.talk_nodes[i].str2.length() > 0)

View File

@@ -495,7 +495,7 @@ void set_up_terrain_buttons() {
// first make terrain buttons
switch(draw_mode){
case DRAW_TERRAIN:
for(i = 0; i < 256; i++) {
for(i = 0; i < scenario.ter_types.size(); i++) {
ter_from = ter_from_base;
pic = scenario.ter_types[i].picture;
if(pic >= 1000) {