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)