37 #define REVOLUTION_RATE 5.2f 
   39 #define NUM_BUTTONS     16 
   41 #define LIST_BUTTONS_MAX        42 
   43 #define SHIPS_DATA_MODE         (1<<0) 
   44 #define WEAPONS_DATA_MODE       (1<<1) 
   45 #define SPECIES_DATA_MODE       (1<<2) 
   46 #define WEAPONS_SPECIES_DATA_MODE       (WEAPONS_DATA_MODE | SPECIES_DATA_MODE) 
   48 #define SHIPS_DATA_TAB                                  0 
   49 #define WEAPONS_DATA_TAB                                1 
   50 #define INTEL_DATA_TAB                                  2 
   51 #define TECH_DATABASE_TAB                               3 
   52 #define SIMULATOR_TAB                                   4 
   53 #define CUTSCENES_TAB                                   5 
   56 #define SCROLL_LIST_UP                                  7 
   57 #define SCROLL_LIST_DOWN                                8 
   58 #define SCROLL_INFO_UP                                  9 
   59 #define SCROLL_INFO_DOWN                                10 
   61 #define PREV_ENTRY_BUTTON                               11 
   62 #define NEXT_ENTRY_BUTTON                               12 
   64 #define HELP_BUTTON                                             13 
   65 #define OPTIONS_BUTTON                                  14 
   66 #define EXIT_BUTTON                                             15 
   70 #define NO_MOUSE_OVER_SOUND     (1<<1) 
   73 #define SHIP_X_COORD 0  
   74 #define SHIP_Y_COORD 1 
   75 #define SHIP_W_COORD 2 
   76 #define SHIP_H_COORD 3 
  138 #define MAX_TEXT_LINES          150 
  139 #define MAX_TEXT_LINE_LEN       256 
  149         techroom_buttons(
char *
name, 
int x1, 
int y1, 
int xt1, 
int yt1, 
int h, 
int t, 
int f = 0) : filename(name), x(x1), y(y1), xt(xt1), yt(yt1), hotspot(h), tab(t), flags(
f) {}
 
  193 static int Tech_background_bitmap;
 
  195 static int List_offset;
 
  196 static int Select_tease_line;
 
  197 static int Trackball_mode = 1;
 
  198 static int Trackball_active = 0;
 
  200 static int Techroom_show_all = 0;
 
  202 static int Text_size;
 
  203 static int Text_offset;
 
  207 static int Cur_entry = -1;                              
 
  208 static int Cur_entry_index = -1;                
 
  209 static int Techroom_ship_modelnum;
 
  210 static float Techroom_ship_rot;
 
  212 static int Palette_bmp;
 
  214 static int Ships_loaded = 0;
 
  215 static int Weapons_loaded = 0;
 
  216 static int Intel_loaded = 0;
 
  234 static int Ship_list_size = 0;
 
  236 static int Weapon_list_size = 0;
 
  238 static int Intel_list_size = 0;
 
  240 static int Current_list_size = 0;
 
  264         Text_size = Text_offset = 0;
 
  278         if (Weapon_list != NULL) {
 
  279                 for (i = 0; i < Weapon_list_size; i++) {
 
  280                         if (Weapon_list[i].animation.num_frames != 0) {
 
  284                         if (Weapon_list[i].
bitmap >= 0) {
 
  291         for (i = 0; i < Intel_list_size; i++) {
 
  292                 if (Intel_list[i].animation.num_frames != 0) {
 
  296                 if (Intel_list[i].
bitmap >= 0) {
 
  305         Assert(Current_list != NULL);
 
  306         if (Current_list == NULL || Current_list_size <= 0) {
 
  307                 Cur_entry_index = Cur_entry = -1;
 
  312         Cur_entry_index = Current_list[Cur_entry].
index;
 
  313         Assert( Cur_entry_index >= 0 );
 
  321                 for (
int i=0; 
i<Current_list_size; 
i++) {
 
  322                         if ((Current_list[
i].
model_num > -1) && (Current_list[
i].textures_loaded)) {
 
  324                                 if ( (
i < Cur_entry + 5) && (
i > Cur_entry - 5) )
 
  327                                 mprintf((
"TECH ROOM: Dumping excess ship textures...\n"));
 
  337                 Current_list[Cur_entry].
model_num = Techroom_ship_modelnum;
 
  344                 Techroom_ship_modelnum = -1;
 
  350                 if (stream_result >= 0) {
 
  351                         Current_list[Cur_entry].
has_anim = 1;
 
  355                         Current_list[Cur_entry].
bitmap = 
bm_load(Current_list[Cur_entry].tech_anim_filename);
 
  366         int y, 
z, 
len, font_height;
 
  373         while (y + font_height <= ho) {
 
  378                 len = Text_line_size[
z];
 
  383                 strncpy(line, Text_lines[z], len);
 
  392         if ( z < Text_size ) {
 
  410         int y, 
z, font_height;
 
  422                 if (z >= Current_list_size) {
 
  426                 if (z == Cur_entry) {
 
  428                 } 
else if (z == Select_tease_line) {
 
  434                 memset( buf, 0, 
sizeof(buf) );
 
  435                 strncpy(buf, Current_list[z].
name, 
sizeof(buf) - 1);
 
  444                 List_buttons[z - List_offset].
enable(1);
 
  464         if(Cur_entry_index == -1)
 
  469         angles rot_angles, view_angles;
 
  488         Techroom_ship_rot += 
PI2 * frametime / rev_rate;
 
  489         while (Techroom_ship_rot > 
PI2){
 
  490                 Techroom_ship_rot -= 
PI2;       
 
  494         if (Trackball_active) {
 
  498                 if (Trackball_active) {
 
  503                                 Techroom_ship_orient = mat2;
 
  509                 view_angles.
p = -0.6f;
 
  510                 view_angles.
b = 0.0f;
 
  511                 view_angles.
h = 0.0f;
 
  516                 rot_angles.
h = Techroom_ship_rot;
 
  531         light_dir.
xyz.y = 1.0f; 
 
  532         light_dir.
xyz.x = 0.0000001f;   
 
  616                 Cur_entry = Current_list_size - 1;
 
  620                 if (List_offset < 0) {
 
  627                 if (List_offset > Cur_entry) {
 
  644         if (Cur_entry >= Current_list_size) {
 
  690         if (List_offset > 0) {
 
  725         if(Current_list[Cur_entry].animation.num_frames > 0)
 
  735         else if((Cur_entry >= 0) && (Current_list[Cur_entry].
bitmap >= 0)){
 
  748         int i, multi = 0, 
mask, mask2, font_height, max_num_entries_viewable;   
 
  775                         if ( Ships_loaded == 0 ) {
 
  776                                 if (Ship_list == NULL) {
 
  779                                         if (Ship_list == NULL)
 
  787                                         if (Techroom_show_all || (it->flags & 
mask) || (it->flags2 & mask2))
 
  790                                                 Ship_list[Ship_list_size].
bitmap = -1;
 
  791                                                 Ship_list[Ship_list_size].
index = std::distance(
Ship_info.begin(), it);
 
  793                                                 Ship_list[Ship_list_size].
has_anim = 0;                         
 
  794                                                 Ship_list[Ship_list_size].
name = *it->tech_title ? it->tech_title : (*it->alt_name ? it->alt_name : it->name);
 
  795                                                 Ship_list[Ship_list_size].
desc = it->tech_desc;
 
  796                                                 Ship_list[Ship_list_size].
model_num = -1;
 
  804                                 if (!
Ship_info.empty() && !Ship_list_size) {
 
  805                                         Ship_list[0].
index = -1;
 
  806                                         Ship_list[0].
desc = NULL;
 
  807                                         Ship_list[0].
name = NULL;
 
  818                         Current_list = Ship_list;
 
  819                         Current_list_size = Ship_list_size;
 
  823                         Tech_slider.
set_numberItems(Current_list_size > max_num_entries_viewable ? Current_list_size-max_num_entries_viewable : 0);
 
  831                         if ( Weapons_loaded == 0 ) {
 
  832                                 if (Weapon_list == NULL) {
 
  835                                         if (Weapon_list == NULL)
 
  839                                 Weapon_list_size = 0;
 
  848                                                 Weapon_list[Weapon_list_size].
index = 
i;
 
  850                                                 Weapon_list[Weapon_list_size].
has_anim = 1;
 
  852                                                 Weapon_list[Weapon_list_size].
bitmap = -1;
 
  854                                                 Weapon_list[Weapon_list_size].
model_num = -1;
 
  864                                 if (Num_weapon_types && !Weapon_list_size) {
 
  865                                         Weapon_list[0].
index = -1;
 
  866                                         Weapon_list[0].
desc = NULL;
 
  867                                         Weapon_list[0].
name = NULL;
 
  868                                         Weapon_list[0].
bitmap = -1;
 
  878                         Current_list = Weapon_list;
 
  879                         Current_list_size = Weapon_list_size;
 
  883                         Tech_slider.
set_numberItems(Current_list_size > max_num_entries_viewable ? Current_list_size-max_num_entries_viewable : 0);
 
  890                         if ( Intel_loaded == 0 ) {
 
  897                                                 if (!strcmp(Intel_info[i].anim_filename, 
"none")) {
 
  898                                                         Intel_list[Intel_list_size].
has_anim = 0;
 
  902                                                         Intel_list[Intel_list_size].
has_anim = 0;
 
  903                                                         Intel_list[Intel_list_size].
bitmap = -1;
 
  904                                                         strncpy(Intel_list[Intel_list_size].tech_anim_filename, Intel_info[i].anim_filename, 
NAME_LENGTH - 1);
 
  907                                                 Intel_list[Intel_list_size].
desc = Intel_info[
i].
desc;
 
  908                                                 Intel_list[Intel_list_size].
index = 
i;
 
  909                                                 Intel_list[Intel_list_size].
name = Intel_info[
i].
name;
 
  910                                                 Intel_list[Intel_list_size].
model_num = -1;
 
  918                                 if (Intel_info_size && !Intel_list_size) {
 
  919                                         Intel_list[0].
index = -1;
 
  920                                         Intel_list[0].
desc = NULL;
 
  921                                         Intel_list[0].
name = NULL;
 
  922                                         Intel_list[0].
bitmap = -1;
 
  934                         Current_list = Intel_list;
 
  935                         Current_list_size = Intel_list_size;
 
  939                         Tech_slider.
set_numberItems(Current_list_size > max_num_entries_viewable ? Current_list_size-max_num_entries_viewable : 0);
 
 1026         int load_attempts = 0;
 
 1027         char anim_filename[64] = 
"2_";
 
 1038                 if ( load_attempts++ > 5 ) {
 
 1067                                 mprintf((
"TECHMENU: Too many intel entries!\n"));
 
 1097                 mprintf((
"TABLES: Unable to parse '%s'!  Error message = %s.\n", 
"species.tbl", e.what()));
 
 1111         Techroom_show_all = 0;
 
 1118         if (Tech_background_bitmap < 0) {
 
 1165                 List_buttons[
i].
create(&Ui_window, 
"", 0, 0, 60, 30, 0, 1);
 
 1166                 List_buttons[
i].
hide();
 
 1191         mprintf((
"Techroom successfully initialized, now changing tab...\n"));
 
 1203         Current_list = NULL;
 
 1204         Current_list_size = 0;
 
 1208         if (Ship_list != NULL) {
 
 1216         if (Weapon_list != NULL) {
 
 1217                 for (i = 0; i < Weapon_list_size; i++) {
 
 1218                         if (Weapon_list[i].animation.num_frames != 0) {
 
 1222                         if (Weapon_list[i].
bitmap >= 0) {
 
 1228                 delete[] Weapon_list;
 
 1232         Weapon_list_size = 0;
 
 1235         for (i = 0; i < Intel_list_size; i++) {
 
 1236                 if (Intel_list[i].animation.num_frames != 0) {
 
 1240                 if (Intel_list[i].
bitmap >= 0) {
 
 1246         Intel_list_size = 0;
 
 1256         Techroom_show_all = 0;
 
 1258         if (Tech_background_bitmap) {
 
 1281         if (Trackball_active) {
 
 1337                         Techroom_show_all = 1;
 
 1346                 Trackball_active = 1;
 
 1350                 Trackball_active = 0;
 
 1363         Select_tease_line = -1;
 
 1365                 if (List_buttons[i].is_mouse_on()) {
 
 1366                         Select_tease_line = i + List_offset;
 
 1369                 if (List_buttons[i].pressed()) {
 
 1370                         Cur_entry = i + List_offset;
 
 1378         if (Tech_background_bitmap >= 0) {
 
 1431                 if (!
stricmp(name, Intel_info[i].name))
 
void light_add_directional(const vec3d *dir, float intensity, float r, float g, float b, float spec_r, float spec_g, float spec_b, bool specular)
 
void gr_rect(int x, int y, int w, int h, int resize_mode)
 
void set_highlight_action(void(*_user_function)(void))
 
void add_XSTR(char *string, int _xstr_id, int _x, int _y, UI_GADGET *_assoc, int _color_type, int _font_id=-1)
 
matrix * vm_matrix_x_matrix(matrix *dest, const matrix *src0, const matrix *src1)
 
GLfloat GLfloat GLfloat GLfloat h
 
polymodel * model_get(int model_num)
 
weapon_info Weapon_info[MAX_WEAPON_TYPES]
 
#define SIF_IN_TECH_DATABASE_M
 
#define gr_end_view_matrix
 
color Color_more_indicator
 
matrix * vm_angles_2_matrix(matrix *m, const angles *a)
 
void vm_rotate_matrix_by_angles(matrix *orient, const angles *tangles)
 
#define WIF2_DEFAULT_IN_TECH_DATABASE
 
#define GR_NUM_RESOLUTIONS
 
__inline void gr_string(int x, int y, const char *string, int resize_mode=GR_RESIZE_FULL)
 
char desc[TECH_INTEL_DESC_LEN]
 
general failure sound for any event 
 
int bm_get_info(int handle, int *w, int *h, ubyte *flags, int *nframes, int *fps)
Gets info on the bitmap indexed by handle. 
 
void set_flags(uint flags)
 
struct vec3d::@225::@227 xyz
 
void model_render_immediate(model_render_params *render_info, int model_num, matrix *orient, vec3d *pos, int render, bool sort)
 
#define GR_MAYBE_CLEAR_RES(bmap)
 
model_subsystem * subsystems
 
void set_detail_level_lock(int detail_level_lock)
 
void help_overlay_set_state(int overlay_id, int resolution_index, int state)
 
void set_ignore_gadgets(int state)
 
void gr_set_color_fast(color *dst)
 
void gr_set_bitmap(int bitmap_num, int alphablend_mode, int bitblt_mode, float alpha)
 
GLenum GLuint GLenum GLsizei const GLchar * buf
 
int bm_release(int handle, int clear_render_targets)
Frees both a bitmap's data and it's associated slot. 
 
#define gr_end_proj_matrix
 
void generic_anim_unload(generic_anim *ga)
 
void shadows_end_render()
 
#define SIF2_DEFAULT_IN_TECH_DATABASE
 
__inline void gr_set_clip(int x, int y, int w, int h, int resize_mode=GR_RESIZE_FULL)
 
void draw_forced(int frame_num)
 
#define gr_set_view_matrix
 
void set_mask_bmap(char *fname)
 
matrix shadows_start_render(matrix *eye_orient, vec3d *eye_pos, float fov, float aspect, float veryneardist, float neardist, float middist, float fardist)
 
int set_bmaps(char *ani_filename, int nframes=3, int start_frame=1)
 
void batch_render_all(int stream_buffer)
 
char pof_file[MAX_FILENAME_LEN]
 
#define gr_set_proj_matrix
 
void common_free_interface_palette()
 
void set_numberItems(int _numberItems, int _reset=1)
 
#define TECH_ROOM_OVERLAY
 
#define WIF_IN_TECH_DATABASE
 
void create(UI_WINDOW *wnd, int _x, int _y, int _w, int _h, int _numberItems, char *_bitmapSliderControl, void(*_upCallback)(), void(*_downCallback)(), void(*_captureCallback)())
 
void g3_set_view_matrix(const vec3d *view_pos, const matrix *view_matrix, float zoom)
 
void model_clear_instance(int model_num)
 
Switching to a new screen, but not commit. 
 
void stuff_string(char *outstr, int type, int len, char *terminators)
 
void generic_anim_render(generic_anim *ga, float frametime, int x, int y, bool menu)
 
void set_team_color(team_color &clr)
 
SCP_string default_team_name
 
int required_string(const char *pstr)
 
queued_animation * triggers
 
int split_str(const char *src, int max_pixel_w, int *n_chars, const char **p_str, int max_lines, char ignore_char)
 
int optional_string(const char *pstr)
 
#define SIF2_DEFAULT_IN_TECH_DATABASE_M
 
char tech_title[NAME_LENGTH]
 
int model_load(char *filename, int n_subsystems, model_subsystem *subsystems, int ferror=1, int duplicate=0)
 
void read_file_text(const char *filename, int mode, char *processed_text, char *raw_text)
 
void fsspeech_play(int type, const char *text)
 
void model_page_in_textures(int modelnum, int ship_info_index=-1)
 
#define SIF_IN_TECH_DATABASE
 
void mouse_get_delta(int *dx, int *dy, int *dz)
 
int Cmdline_shadow_quality
 
GLint GLint GLint GLint GLint x
 
bool Glowpoint_use_depth_buffer
 
const char * XSTR(const char *str, int index)
 
user_click (mouse selects a control) 
 
void force_currentItem(int _currentItem)
 
void vm_trackball(int idx, int idy, matrix *RotMat)
 
void model_page_out_textures(int model_num, bool release=false)
 
void _cdecl void void _cdecl Error(const char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
 
void set_hotkey(int keycode)
 
void reset_parse(char *text)
 
GLuint const GLchar * name
 
int bm_load(const char *real_filename)
Loads a bitmap so we can draw with it later. 
 
color Color_text_subselected
 
GLboolean GLboolean GLboolean b
 
void lcl_translate_ship_name_gr(char *name)
 
void update_dimensions(int _x, int _y, int _w, int _h)
 
color Color_text_selected
 
#define WIF_PLAYER_ALLOWED
 
scroll pressed (and scroll) 
 
void link_hotspot(int num)
 
void create(UI_WINDOW *wnd, char *_text, int _x, int _y, int _w, int _h, int do_repeat=0, int ignore_focus=0)
 
GLubyte GLubyte GLubyte GLubyte w
 
#define UI_XSTR_COLOR_PINK
 
void create(int _x, int _y, int _w, int _h, int _flags, int _f_id=-1)
 
int gr_force_fit_string(char *str, int max_str, int max_width)
 
void gr_get_string_size(int *w, int *h, const char *text, int len=9999)
 
SCP_vector< ship_info > Ship_info
 
void common_play_highlight_sound()
 
BM_TYPE bm_get_type(int handle)
Returns the image type of the given bitmap handle. 
 
void gr_bitmap(int _x, int _y, int resize_mode)
 
#define UI_XSTR_COLOR_GREEN
 
int generic_anim_init_and_stream(generic_anim *ga, const char *anim_filename, BM_TYPE bg_type, bool attempt_hi_res)
 
#define PLAYER_FLAGS_IS_MULTI
 
void model_set_instance_techroom(int model_num, int sub_model_num, float angle_1, float angle_2)
 
void launch_context_help()
 
void gamesnd_play_iface(int n)
 
int process(int key_in=-1, int process_mouse=1)
 
int help_overlay_get_index(const char *overlay_name)
 
void gameseq_post_event(int event)
 
matrix vmd_identity_matrix
 
void help_overlay_maybe_blit(int overlay_id, int resolution_index)
 
int help_overlay_active(int overlay_id)
 
#define g3_start_frame(zbuffer_flag)