View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0002166 | FSSCP | tables | public | 2010-03-28 04:47 | 2010-05-19 05:48 |
| Reporter | Echelon9 | Assigned To | |||
| Priority | normal | Severity | feature | Reproducibility | N/A |
| Status | closed | Resolution | suspended | ||
| Product Version | 3.6.12 RC1 | ||||
| Summary | 0002166: Convert Intel_list[] (and thus Intel_info[]) to use SCP_vector | ||||
| Description | Intel_list[] (and the associated Intel_info[]) are currently arrays of size MAX_INTEL_ENTRIES = 75. This feature will convert them to use SCP_vector, removing any numerical limits on Intelligence entries. | ||||
| Additional Information | Intel_info[] is made up of tech_list_entry structs. Intel_info is the primary list of intelligence entries read from the table file. From Intel_info, the subset of tech_list_entry structs which have their flags set to IIF_IN_TECH_DATABASE or IIF_DEFAULT_IN_TECH_DATABASE, will be copied into Intel_list. Intel_list is the actual list of visible entries shown. --- Ship_list[] and Weapon_list[] operate in a similar way, pulling the subset of visible tech_list_entry structs of their type from [Ship|Weapon]_info array. | ||||
| Tags | No tags attached. | ||||
|
2010-03-28 04:52
|
Intel_list-vector.diff (9,839 bytes)
Index: code/mission/missioncampaign.cpp
===================================================================
--- code/mission/missioncampaign.cpp (revision 6028)
+++ code/mission/missioncampaign.cpp (working copy)
@@ -891,7 +891,7 @@
ubyte out;
// write the ship and weapon count
- cfwrite_int(Intel_info_size, fp);
+ cfwrite_int((int)Intel_info.size(), fp);
// write all ship flags out
for (i=0; i<Num_ship_classes; i++) {
@@ -906,7 +906,7 @@
}
// write all intel entry flags out
- for (i=0; i<Intel_info_size; i++) {
+ for (i = 0; i < (int)Intel_info.size(); i++) {
out = (Intel_info[i].flags & IIF_IN_TECH_DATABASE) ? (ubyte)1 : (ubyte)0;
cfwrite_ubyte(out, fp);
}
@@ -1373,7 +1373,7 @@
Weapon_info[idx].wi_flags &= ~WIF_IN_TECH_DATABASE;
}
- for (idx=0; idx<MAX_INTEL_ENTRIES; idx++) {
+ for (idx = 0; idx < (int)Intel_info.size(); idx++) {
Intel_info[idx].flags &= ~IIF_IN_TECH_DATABASE;
}
}
@@ -1412,7 +1412,7 @@
for (idx=0; idx<intel_count; idx++) {
in = cfread_ubyte(fp);
- if (idx >= Intel_info_size)
+ if (idx >= (int)Intel_info.size())
continue;
if (in) {
Index: code/playerman/managepilot.cpp
===================================================================
--- code/playerman/managepilot.cpp (revision 6028)
+++ code/playerman/managepilot.cpp (working copy)
@@ -300,7 +300,7 @@
// write the ship and weapon count
cfwrite_int(Num_ship_classes, file);
cfwrite_int(Num_weapon_types, file);
- cfwrite_int(Intel_info_size, file);
+ cfwrite_int((int)Intel_info.size(), file);
// write all ship flags out
for (idx=0; idx<Num_ship_classes; idx++) {
@@ -315,7 +315,7 @@
}
// write all intel entry flags out
- for (idx=0; idx<Intel_info_size; idx++) {
+ for (idx = 0; idx < (int)Intel_info.size(); idx++) {
out = (Intel_info[idx].flags & IIF_IN_TECH_DATABASE) ? (ubyte)1 : (ubyte)0;
cfwrite_ubyte(out, file);
}
Index: code/menuui/techmenu.cpp
===================================================================
--- code/menuui/techmenu.cpp (revision 6028)
+++ code/menuui/techmenu.cpp (working copy)
@@ -275,27 +275,15 @@
static int Ship_list_size = 0;
static tech_list_entry *Weapon_list = NULL;
static int Weapon_list_size = 0;
-static tech_list_entry Intel_list[MAX_INTEL_ENTRIES];
-static int Intel_list_size = 0;
+static SCP_vector<tech_list_entry> Intel_list;
static tech_list_entry *Current_list; // points to currently valid display list
static int Current_list_size = 0;
// slider stuff
static UI_SLIDER2 Tech_slider;
-//XSTR:OFF
-/*
-static char *Intel_anim_filenames[MAX_INTEL_ENTRIES] = {
- "tech_tpilot.ani",
- "tech_vasudan.ani",
- "tech_shivan.ani",
-};
-*/
-//XSTR:ON
-
// Intelligence master data structs (these get inited @ game startup from species.tbl)
-intel_data Intel_info[MAX_INTEL_ENTRIES];
-int Intel_info_size = 0;
+SCP_vector<intel_data> Intel_info;
// some prototypes to make you happy
int techroom_load_ani(anim **animpp, char *name);
@@ -339,7 +327,7 @@
}
}
- for (i = 0; i < Intel_list_size; i++) {
+ for (i = 0; i < (int)Intel_list.size(); i++) {
if (Intel_list[i].animation.num_frames != 0) {
generic_anim_unload(&Intel_list[i].animation);
}
@@ -917,33 +905,35 @@
// load intel if necessary
if ( Intel_loaded == 0 ) {
// now populate the entry structs
- Intel_list_size = 0;
- for (i=0; i<Intel_info_size; i++) {
+ for (i = 0; i < (int)Intel_info.size(); i++) {
if (Techroom_show_all || (Intel_info[i].flags & IIF_IN_TECH_DATABASE) || (Intel_info[i].flags & IIF_DEFAULT_IN_TECH_DATABASE)) {
+ tech_list_entry new_tech_list_entry;
+
// leave option for no animation if string == "none"
if (!strcmp(Intel_info[i].anim_filename, "none")) {
- Intel_list[Intel_list_size].has_anim = 0;
- Intel_list[Intel_list_size].animation.num_frames = 0;
+ new_tech_list_entry.has_anim = 0;
+ new_tech_list_entry.animation.num_frames = 0;
} else {
// try and load as an animation
- Intel_list[Intel_list_size].has_anim = 0;
- Intel_list[Intel_list_size].bitmap = -1;
- strncpy(Intel_list[Intel_list_size].tech_anim_filename, Intel_info[i].anim_filename, NAME_LENGTH - 1);
+ new_tech_list_entry.has_anim = 0;
+ new_tech_list_entry.bitmap = -1;
+ strncpy(new_tech_list_entry.tech_anim_filename, Intel_info[i].anim_filename, NAME_LENGTH - 1);
}
- Intel_list[Intel_list_size].desc = Intel_info[i].desc;
- Intel_list[Intel_list_size].index = i;
- Intel_list[Intel_list_size].name = Intel_info[i].name;
- Intel_list[Intel_list_size].model_num = -1;
- Intel_list[Intel_list_size].textures_loaded = 0;
+ new_tech_list_entry.desc = Intel_info[i].desc;
+ new_tech_list_entry.index = i;
+ new_tech_list_entry.name = Intel_info[i].name;
+ new_tech_list_entry.model_num = -1;
+ new_tech_list_entry.textures_loaded = 0;
- Intel_list_size++;
+ Intel_list.push_back(new_tech_list_entry);
}
}
// make sure that at least the default entry is cleared out if we didn't grab anything
- if (Intel_info_size && !Intel_list_size) {
+ // Echelon9: This may well be redundant now that Intel_list uses SCP_vector<>
+ if ((int)Intel_info.size() && !(int)Intel_list.size()) {
Intel_list[0].index = -1;
Intel_list[0].desc = NULL;
Intel_list[0].name = NULL;
@@ -960,7 +950,7 @@
// index lookup on intel is a pretty pointless, but it keeps everything
// consistent and doesn't really hurt anything
Current_list = Intel_list;
- Current_list_size = Intel_list_size;
+ Current_list_size = (int)Intel_list.size();
font_height = gr_get_font_height();
max_num_entries_viewable = Tech_list_coords[gr_screen.res][SHIP_H_COORD] / font_height;
@@ -1129,34 +1119,29 @@
read_file_text("species.tbl", CF_TYPE_TABLES);
reset_parse();
- Intel_info_size = 0;
while (optional_string("$Entry:")) {
- Assert(Intel_info_size < MAX_INTEL_ENTRIES);
- if (Intel_info_size >= MAX_INTEL_ENTRIES) {
- mprintf(("TECHMENU: Too many intel entries!\n"));
- break;
- }
+ intel_data new_intel_data;
- Intel_info[Intel_info_size].flags = IIF_DEFAULT_VALUE;
+ new_intel_data.flags = IIF_DEFAULT_VALUE;
required_string("$Name:");
- stuff_string(Intel_info[Intel_info_size].name, F_NAME, NAME_LENGTH);
+ stuff_string(new_intel_data.name, F_NAME, NAME_LENGTH);
required_string("$Anim:");
- stuff_string(Intel_info[Intel_info_size].anim_filename, F_NAME, NAME_LENGTH);
+ stuff_string(new_intel_data.anim_filename, F_NAME, NAME_LENGTH);
required_string("$AlwaysInTechRoom:");
stuff_int(&temp);
if (temp) {
// set default to align with what we read - Goober5000
- Intel_info[Intel_info_size].flags |= IIF_IN_TECH_DATABASE;
- Intel_info[Intel_info_size].flags |= IIF_DEFAULT_IN_TECH_DATABASE;
+ new_intel_data.flags |= IIF_IN_TECH_DATABASE;
+ new_intel_data.flags |= IIF_DEFAULT_IN_TECH_DATABASE;
}
required_string("$Description:");
- stuff_string(Intel_info[Intel_info_size].desc, F_MULTITEXT, TECH_INTEL_DESC_LEN);
+ stuff_string(new_intel_data.desc, F_MULTITEXT, TECH_INTEL_DESC_LEN);
- Intel_info_size++;
+ Intel_info.push_back(new_intel_data);
}
inited = 1;
@@ -1288,7 +1273,7 @@
Tech_slider.create(&Ui_window, Tech_slider_coords[gr_screen.res][SHIP_X_COORD], Tech_slider_coords[gr_screen.res][SHIP_Y_COORD], Tech_slider_coords[gr_screen.res][SHIP_W_COORD], Tech_slider_coords[gr_screen.res][SHIP_H_COORD], Num_ship_classes, Tech_slider_filename[gr_screen.res], &tech_scroll_list_up, &tech_scroll_list_down, &tech_ship_scroll_capture);
// zero intel anim/bitmap stuff
- for(idx=0; idx<MAX_INTEL_ENTRIES; idx++){
+ for(idx = 0; idx < (int)Intel_list.size(); idx++){
Intel_list[idx].animation.num_frames = 0;
Intel_list[idx].bitmap = -1;
}
@@ -1337,7 +1322,7 @@
Weapon_list_size = 0;
Weapons_loaded = 0;
- for (i = 0; i < Intel_list_size; i++) {
+ for (i = 0; i < (int)Intel_list.size(); i++) {
if (Intel_list[i].animation.num_frames != 0) {
generic_anim_unload(&Intel_list[i].animation);
}
@@ -1348,7 +1333,6 @@
}
}
- Intel_list_size = 0;
Intel_loaded = 0;
}
@@ -1581,7 +1565,7 @@
if (!name)
return -1;
- for (i=0; i<Intel_info_size; i++)
+ for (i = 0; i < (int)Intel_info.size(); i++)
if (!stricmp(name, Intel_info[i].name))
return i;
@@ -1617,7 +1601,7 @@
}
// intelligence
- for (i=0; i<Intel_info_size; i++)
+ for (i = 0; i < (int)Intel_info.size(); i++)
{
if (Intel_info[i].flags & IIF_DEFAULT_IN_TECH_DATABASE)
Intel_info[i].flags |= IIF_IN_TECH_DATABASE;
Index: code/menuui/techmenu.h
===================================================================
--- code/menuui/techmenu.h (revision 6028)
+++ code/menuui/techmenu.h (working copy)
@@ -29,10 +29,8 @@
#define IIF_IN_TECH_DATABASE (1 << 0) // in tech database? - Goober5000
#define IIF_DEFAULT_IN_TECH_DATABASE (1 << 1) // in tech database by default? - Goober5000
-extern intel_data Intel_info[MAX_INTEL_ENTRIES];
-extern int Intel_info_size;
+extern SCP_vector<intel_data> Intel_info;
-
// function prototypes
void techroom_init();
void techroom_close();
Index: code/parse/sexp.cpp
===================================================================
--- code/parse/sexp.cpp (revision 6028)
+++ code/parse/sexp.cpp (working copy)
@@ -2458,12 +2458,12 @@
if ( type2 != SEXP_ATOM_STRING )
return SEXP_CHECK_TYPE_MISMATCH;
- for (i = 0; i < Intel_info_size; i++ ) {
+ for (i = 0; i < (int)Intel_info.size(); i++ ) {
if ( !stricmp(CTEXT(node), Intel_info[i].name) )
break;
}
- if ( i == Intel_info_size )
+ if ( i == (int)Intel_info.size() )
return SEXP_CHECK_INVALID_INTEL_NAME;
break;
|
|
|
Patch proposed -- although it currently will not compile with problems when Current_list array is set to Intel_list vector at techmenu.cpp:952. Current_list is also used by Ship_intel and Weapon_intel, both of which I have not changed to be vectors yet. |
|
|
Intel_list does not affect Intel_info; they are two different arrays. Also, I'm closing this because 1) it's a feature request, and 2) it's not as long-term as you think. |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2010-03-28 04:47 | Echelon9 | New Issue | |
| 2010-03-28 04:47 | Echelon9 | Status | new => assigned |
| 2010-03-28 04:47 | Echelon9 | Assigned To | => Echelon9 |
| 2010-03-28 04:52 | Echelon9 | File Added: Intel_list-vector.diff | |
| 2010-03-28 04:52 | Echelon9 | Relationship added | related to 0002158 |
| 2010-03-28 04:53 | Echelon9 | Description Updated | |
| 2010-03-28 04:59 | Echelon9 | Additional Information Updated | |
| 2010-03-28 05:01 | Echelon9 | Additional Information Updated | |
| 2010-03-28 05:03 | Echelon9 | Note Added: 0011839 | |
| 2010-03-28 05:04 | Echelon9 | Note Edited: 0011839 | |
| 2010-05-19 05:48 | Goober5000 | Note Added: 0011986 | |
| 2010-05-19 05:48 | Goober5000 | Assigned To | Echelon9 => |
| 2010-05-19 05:48 | Goober5000 | Status | assigned => closed |
| 2010-05-19 05:48 | Goober5000 | Resolution | open => suspended |