35 #define MAX_TRAINING_MESSAGE_LINES 10
36 #define TRAINING_MESSAGE_WINDOW_WIDTH 266
37 #define TRAINING_LINE_WIDTH 250 // width in pixels of actual text
38 #define TRAINING_TIMING 150 // milliseconds per character to display messages
39 #define TRAINING_TIMING_BASE 1000 // Minimum milliseconds to display any message
40 #define TRAINING_OBJ_WND_WIDTH 170 // number of pixels wide window is.
41 #define TRAINING_OBJ_LINE_WIDTH 150 // number of pixels wide text can be
42 #define TRAINING_OBJ_LINES 50 // number of lines to track in objective list
43 #define TRAINING_OBJ_DISPLAY_LINES 5 // only display this many lines on screen max
44 #define MAX_TRAINING_MESSAGE_MODS 20
45 #define TRAINING_MESSAGE_QUEUE_MAX 40
47 #define TRAINING_OBJ_STATUS_UNKNOWN (1 << 28) // directive status is unknown
48 #define TRAINING_OBJ_STATUS_KNOWN (1 << 29) // directive status is known (satisfied or failed)
49 #define TRAINING_OBJ_LINES_KEY (1 << 30) // flag indicating line describes the key associated with objective
50 #define TRAINING_OBJ_LINES_EVENT_STATUS_MASK (TRAINING_OBJ_STATUS_KNOWN | TRAINING_OBJ_STATUS_UNKNOWN)
52 #define TRAINING_OBJ_LINES_MASK(n) (Training_obj_lines[n] & 0xffff)
54 #define TMMOD_NORMAL 0
111 #define NUM_DIRECTIVE_GAUGES 3
113 static int Directive_frames_loaded = 0;
115 #define DIRECTIVE_H 9
116 #define DIRECTIVE_X 5
117 #define NUM_DIRECTIVE_COORDS 3
118 #define DIRECTIVE_COORDS_TOP 0
119 #define DIRECTIVE_COORDS_MIDDLE 1
120 #define DIRECTIVE_COORDS_TITLE 2
227 char buf[256], *second_line;
254 for (i=0; i<
end; i++) {
302 Assert( second_line != buf );
358 Training_message_queue[i].special_message = NULL;
361 Directive_frames_loaded = 1;
396 #define MIN_SATISFIED_TIME 5
397 #define MIN_FAILED_TIME 7
414 int num_offset_events = 0;
415 for (i=0; i<
offset; i++) {
446 if (num_offset_events == 0) {
480 int slot_idx, unkn_vis, last_directive;
482 for (i=0; i<num_offset_events; i++) {
485 for (unkn_vis=offset-1; unkn_vis>=0; unkn_vis--) {
503 for (
int j=slot_idx; j>0; j--) {
525 int i, event_idx, event_status;
541 if (i == Training_obj_num_lines) {
548 Training_obj_num_lines--;
566 if (i == Training_obj_num_lines) {
573 Training_obj_num_lines--;
581 if (i < Training_obj_num_lines) {
582 for (; i<Training_obj_num_lines - 1; i++) {
585 Training_obj_num_lines--;
617 if (Training_message_queue[i].special_message != NULL)
619 vm_free(Training_message_queue[i].special_message);
648 char temp[40], *toke1, *toke2, *ptr;
652 toke1 = strchr(text,
'$');
653 toke2 = strchr(text,
'#');
654 while (toke1 || toke2) {
655 if (!toke2 || (toke1 && (toke1 < toke2))) {
656 strncpy(buf, text, toke1 - text + 1);
657 buf += toke1 - text + 1;
660 toke2 = strchr(text,
'$');
661 if (!toke2 || ((toke2 - text) == 0))
665 if ( ((toke2 - text) < 0) || ((toke2 - text) >= (
ptr_s)
sizeof(temp)) ) {
668 strncpy(temp, text, toke2 - text);
669 temp[toke2 - text] = 0;
675 XSTR(
"Warning\nYou have no control bound to the action \"%s\". You must do so before you can continue with your training.", 426),
694 strncpy(buf, text, toke2 - text + 1);
695 buf += toke2 - text + 1;
698 toke1 = strchr(text,
'#');
699 if (!toke1 || ((toke1 - text) == 0))
703 if ( ((toke1 - text) < 0) || ((toke1 - text) >= (
ptr_s)
sizeof(temp)) ) {
706 strncpy(temp, text, toke1 - text);
707 temp[toke1 - text] = 0;
718 toke1 = strchr(text,
'$');
719 toke2 = strchr(text,
'#');
792 nprintf((
"Warning",
"Cannot load message wave: %s. Will not play\n",
Message_waves[index].name));
831 if (special_message == NULL)
873 if (m >= Num_messages)
905 if (Training_message_queue[idx].special_message != NULL)
907 vm_free(Training_message_queue[idx].special_message);
913 Training_message_queue[j - 1] = Training_message_queue[j];
916 Training_message_queue_count--;
934 if ( iship_num != -1 )
1062 y =
position[1] + i * height + height / 2 + 1;
1072 mode = Training_message_mods[count++].
mode;
1110 Training_message_mods[
count].
pos = dest;
1118 Training_message_mods[
count].
pos = dest;
1128 Training_message_mods[
count].
pos = NULL;
int timestamp(int delta_ms)
training_message_mods Training_message_mods[MAX_TRAINING_MESSAGE_MODS]
#define PLAYER_FLAGS_MATCH_TARGET
void message_training_update_frame()
GLfloat GLfloat GLfloat GLfloat h
#define NUM_DIRECTIVE_GAUGES
int Training_message_timestamp
int snd_load(game_snd *gs, int allow_hardware_load)
void message_training_setup(int m, int length, char *special_message)
void training_mission_shutdown()
int message_play_training_voice(int index)
void setGaugeColor(int bright_index=-4)
int Training_message_method
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
int Training_line_lengths[MAX_TRAINING_MESSAGE_LINES]
int text_start_offsets[2]
#define GR_NUM_RESOLUTIONS
#define PLAYER_FLAGS_LINK_PRIMARY
void initMaxLineWidth(int w)
char * translate_key(char *key)
void initBottomBgOffset(int offset)
#define CONTROL_CONFIG_XSTR
const char * Training_lines[MAX_TRAINING_MESSAGE_LINES]
int snd_is_playing(int sig)
hud_frames directives_bottom
int Training_obj_window_coords[GR_NUM_RESOLUTIONS][2]
#define TRAINING_MESSAGE_WINDOW_WIDTH
void sort_training_objectives()
void training_process_message(char *message)
void gr_set_screen_scale(int w, int h, int zoom_w, int zoom_h, int max_w, int max_h, int center_w, int center_h, bool force_stretch)
#define PLAYER_FLAGS_AUTO_TARGETING
GLenum GLuint GLenum GLsizei const GLchar * message
void gr_set_color_fast(color *dst)
void training_check_objectives()
hud_frames directives_top
shader Training_msg_glass
#define HUD_DIRECTIVES_VIEW
char Training_voice_filename[NAME_LENGTH]
GLenum GLuint GLenum GLsizei const GLchar * buf
void training_mission_page_in()
SCP_vector< message_extra > Message_waves
int Training_obj_num_lines
#define PLAYER_FLAGS_AUTO_MATCH_SPEED
char filename[MAX_FILENAME_LEN]
config_item Control_config[]
Stores the keyboard configuration.
int bm_load_animation(const char *real_filename, int *nframes, int *fps, int *keyframe, int can_drop_frames, int dir_type)
Loads a bitmap sequance so we can draw with it.
int audiostream_is_playing(int i)
int Training_context_goal_waypoint
SCP_vector< MMessage > Messages
#define TRAINING_MESSAGE_QUEUE_MAX
GLdouble GLdouble GLdouble r
#define TRAINING_OBJ_LINES
void audiostream_stop(int i, int rewind, int paused)
#define TRAINING_OBJ_LINES_KEY
#define HUD_OBJECT_TRAINING_MESSAGES
#define TRAINING_LINE_WIDTH
void render(float frametime)
#define strnicmp(s1, s2, n)
mission_event Mission_events[MAX_MISSION_EVENTS]
#define TRAINING_TIMING_BASE
void message_translate_tokens(char *buf, char *text)
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
void gr_shade(int x, int y, int w, int h, int resize_mode)
#define TRAINING_OBJ_STATUS_UNKNOWN
void initMiddleFrameOffsetY(int y)
int comp_training_lines_by_born_on_date(const void *m1, const void *m2)
int split_str(const char *src, int max_pixel_w, int *n_chars, const char **p_str, int max_lines, char ignore_char)
int Training_voice_handle
void insertion_sort(void *array_base, size_t array_size, size_t element_size, int(*fncompare)(const void *, const void *))
void message_training_queue(char *text, int timestamp, int length)
#define TRAINING_OBJ_DISPLAY_LINES
void renderString(int x, int y, const char *str)
#define HUD_SOURCE_TRAINING
GLint GLint GLint GLint GLint x
int hud_disabled()
Checks if HUD disabled.
void message_training_remove_from_queue(int idx)
#define TRAINING_OBJ_LINES_MASK(n)
int Training_message_visible
void message_training_queue_check()
#define TRAINING_MESSAGE_LENGTH
const char * XSTR(const char *str, int index)
int Training_message_queue_count
training_message_queue Training_message_queue[TRAINING_MESSAGE_QUEUE_MAX]
int Training_obj_lines[TRAINING_OBJ_LINES]
GLuint const GLchar * name
#define MISSION_TYPE_TRAINING
bool sexp_replace_variable_names_with_values(char *text, int max_len)
void initTextStartOffsets(int x, int y)
void audiostream_close_file(int i, int fade)
int middle_frame_offset_y
void HUD_add_to_scrollback(const char *text, int source)
void initHeaderOffsets(int x, int y)
void initTextHeight(int h)
GLint GLsizei GLsizei height
GLubyte GLubyte GLubyte GLubyte w
void bm_page_in_aabitmap(int bitmapnum, int nframes)
Marks a texture as being used for this level, and is anti-aliased.
void gr_get_string_size(int *w, int *h, const char *text, int len=9999)
int Training_message_window_coords[GR_NUM_RESOLUTIONS][2]
char * split_str_once(char *src, int max_pixel_w)
char * translate_message_token(char *str)
void gr_reset_screen_scale()
void initBitmaps(char *fname_top, char *fname_middle, char *fname_bottom)
#define timestamp_elapsed(stamp)
void audiostream_play(int i, float volume, int looping)
void renderPrintf(int x, int y, const char *format,...)
GLenum GLuint GLenum GLsizei length
int Training_bind_warning
#define HUD_OBJECT_DIRECTIVES
int audiostream_open(const char *filename, int type)
#define MAX_TRAINING_MESSAGE_LINES
#define MIN_SATISFIED_TIME
int ship_name_lookup(const char *name, int inc_players)
hud_frames directives_middle
#define TRAINING_OBJ_LINES_EVENT_STATUS_MASK
int cfclose(CFILE *cfile)
void gr_set_shader(shader *shade)
int hud_disabled_except_messages()
Like hud_disabled(), except messages are still drawn.
#define MAX_TRAINING_MESSAGE_MODS
void render(float frametime)
char Training_buf[TRAINING_MESSAGE_LENGTH]
void gameseq_post_event(int event)
#define TRAINING_OBJ_STATUS_KNOWN
HudGaugeTrainingMessages()
void training_mission_init()
#define PLAYER_FLAGS_MSG_MODE
int cfilelength(CFILE *cfile)
float Master_voice_volume
#define PLAYER_FLAGS_LINK_SECONDARY
int mission_get_event_status(int event)
int snd_play_raw(int soundnum, float pan, float vol_scale, int priority)
void renderBitmap(int x, int y)