void parse_rank_tbl() { atexit(scoreing_close); char buf[MULTITEXT_LENGTH]; int rval, idx, persona; if ((rval = setjmp(parse_abort)) != 0) { mprintf(("TABLES: Unable to parse '%s'! Error code = %i.\n", "rank.tbl", rval)); return; } read_file_text("rank.tbl", CF_TYPE_TABLES); reset_parse(); // parse in all the rank names idx = 0; skip_to_string("[RANK NAMES]"); ignore_white_space(); while ( required_string_either("#End", "$Name:") ) { Assert ( idx < NUM_RANKS ); required_string("$Name:"); stuff_string( Ranks[idx].name, F_NAME, NAME_LENGTH ); required_string("$Points:"); stuff_int( &Ranks[idx].points ); required_string("$Bitmap:"); stuff_string( Ranks[idx].bitmap, F_NAME, MAX_FILENAME_LEN ); required_string("$Promotion Voice Base:"); stuff_string( Ranks[idx].promotion_voice_base, F_NAME, MAX_FILENAME_LEN ); while (check_for_string("$Promotion Text:")) { required_string("$Promotion Text:"); stuff_string(buf, F_MULTITEXT, sizeof(buf)); drop_white_space(buf); compact_multitext_string(buf); persona = -1; if (optional_string("+Persona:")) { stuff_int(&persona); if (persona < 0) { Warning(LOCATION, "Debriefing text for %s rank is assigned to an invalid persona: %i (must be 0 or greater).\n", Ranks[idx].name, persona); continue; } } Ranks[idx].promotion_text[persona] = vm_strdup(buf); } if (Ranks[idx].promotion_text.find(-1) == Ranks[idx].promotion_text.end()) { Warning(LOCATION, "%s rank is missing default debriefing text.\n", Ranks[idx].name); Ranks[idx].promotion_text[-1] = ""; } idx++; } required_string("#End"); // be sure that all rank points are in order #ifndef NDEBUG for ( idx = 0; idx < NUM_RANKS-1; idx++ ) { if ( Ranks[idx].points >= Ranks[idx+1].points ) Int3(); } #endif }
// --------------------------------------------------------------------------------------- // input: // do_repeat => property of button, set to 1 to allow pressed events if mouse // pointer is held over button with left mouse button down, // otherwise 0 (useful for buttons that scroll items) // ignore_focus => whether to allow Enter/Spacebar to affect pressed state when // control has focus // void UI_BUTTON::create(UI_WINDOW *wnd, char *_text, int _x, int _y, int _w, int _h, int do_repeat, int ignore_focus) { text = NULL; if (_text) { if ( _text[0] != '\0' ) { text = vm_strdup(_text); } } // register gadget with UI window base_create( wnd, UI_KIND_BUTTON, _x, _y, _w, _h ); // initialize variables m_flags = 0; next_repeat = 0; m_just_highlighted_function = NULL; // assume there is no callback m_disabled_function = NULL; // ditto if (do_repeat) { m_flags |= BF_REPEATS; next_repeat = 1; } m_press_linger = 1; first_callback = 1; hotkey_if_focus = KEY_SPACEBAR; if (ignore_focus){ m_flags |= BF_IGNORE_FOCUS; } custom_cursor_bmap = -1; previous_cursor_bmap = -1; }
// initialization stuff for cutscenes void cutscene_init() { atexit(cutscene_close); char buf[MULTITEXT_LENGTH]; int rval; cutscene_info cutinfo; if ((rval = setjmp(parse_abort)) != 0) { mprintf(("TABLES: Unable to parse '%s'! Error code = %i.\n", "cutscenes.tbl", rval)); return; } read_file_text("cutscenes.tbl", CF_TYPE_TABLES); reset_parse(); // parse in all the cutscenes Cutscenes.clear(); skip_to_string("#Cutscenes"); ignore_white_space(); bool isFirstCutscene = true; while ( required_string_either("#End", "$Filename:") ) { required_string("$Filename:"); stuff_string( cutinfo.filename, F_PATHNAME, MAX_FILENAME_LEN ); required_string("$Name:"); stuff_string( cutinfo.name, F_NAME, NAME_LENGTH ); required_string("$Description:"); stuff_string(buf, F_MULTITEXT, sizeof(buf)); drop_white_space(buf); compact_multitext_string(buf); cutinfo.description = vm_strdup(buf); if (optional_string("$cd:")) stuff_int( &cutinfo.cd ); else cutinfo.cd = 0; cutinfo.viewable = false; if (isFirstCutscene) { isFirstCutscene = false; // The original code assumes the first movie is the intro, so always viewable cutinfo.viewable = true; } if (optional_string("$Always Viewable:")) { stuff_boolean(&cutinfo.viewable); } Cutscenes.push_back(cutinfo); } required_string("#End"); }
void UI_INPUTBOX::set_valid_chars(char *vchars) { // free up any existing string if(valid_chars != NULL){ vm_free(valid_chars); valid_chars = NULL; } valid_chars = vm_strdup(vchars); }
void UI_INPUTBOX::set_invalid_chars(char *ichars) { // free up any existing string if(invalid_chars != NULL){ vm_free(invalid_chars); invalid_chars = NULL; } invalid_chars = vm_strdup(ichars); }
// --------------------------------------------------------------------------------------- // UI_ICON::create() // // void UI_ICON::create(UI_WINDOW *wnd, char *_text, int _x, int _y, int _w, int _h) { if (_text) text = vm_strdup(_text); else text = NULL; base_create(wnd, UI_KIND_ICON, _x, _y, _w, _h); m_flags = 0; }
void UI_WINDOW::add_XSTR(UI_XSTR* xstr) { int idx; int found = -1; UI_XSTR* ui_x; // try and find a free xstr for (idx = 0; idx < MAX_UI_XSTRS; idx++) { if (xstrs[idx] == NULL) { found = idx; break; } } // if we don't have a free spot if (found < 0) { Int3(); // aieee! we need to up the max # of xstrs allowed in a window. return; } // allocate a new struct xstrs[idx] = (UI_XSTR*)vm_malloc(sizeof(UI_XSTR)); if (xstrs[idx] == NULL) { return; } ui_x = xstrs[idx]; // fill in the data ui_x->xstr = vm_strdup(xstr->xstr); if (ui_x->xstr == NULL) { vm_free(ui_x); xstrs[idx] = NULL; return; } ui_x->xstr_id = xstr->xstr_id; ui_x->x = xstr->x; ui_x->y = xstr->y; ui_x->assoc = xstr->assoc; ui_x->font_id = xstr->font_id; ui_x->clr = xstr->clr; Assert((ui_x->clr >= 0) && (ui_x->clr < UI_NUM_XSTR_COLORS)); if ((ui_x->clr < 0) || (ui_x->clr >= UI_NUM_XSTR_COLORS)) { ui_x->clr = 0; } }
void medal_stuff::clone(const medal_stuff& m) { memcpy(name, m.name, NAME_LENGTH); memcpy(bitmap, m.bitmap, NAME_LENGTH); num_versions = m.num_versions; kills_needed = m.kills_needed; badge_num = m.badge_num; memcpy(voice_base, m.voice_base, MAX_FILENAME_LEN); if (m.promotion_text) promotion_text = vm_strdup(m.promotion_text); else promotion_text = NULL; }
void medal_stuff::clone(const medal_stuff &m) { memcpy(name, m.name, NAME_LENGTH); memcpy(bitmap, m.bitmap, MAX_FILENAME_LEN); memcpy(debrief_bitmap, m.debrief_bitmap, MAX_FILENAME_LEN); num_versions = m.num_versions; version_starts_at_1 = m.version_starts_at_1; kills_needed = m.kills_needed; memcpy(voice_base, m.voice_base, MAX_FILENAME_LEN); promotion_text.clear(); SCP_map<int, char*>::const_iterator it; for (it = m.promotion_text.begin(); it != m.promotion_text.end(); ++it) { if (it->second) { promotion_text[it->first] = vm_strdup(it->second); } } }
void UI_CHECKBOX::create(UI_WINDOW *wnd, const char *_text, int _x, int _y, int _state ) { int _w, _h; // gr_get_string_size( &_w, &_h, "X" ); _w = 18; _h = 18; if ( _text ) text = vm_strdup( _text ); else text = NULL; base_create( wnd, UI_KIND_CHECKBOX, _x, _y, _w, _h ); position = 0; pressed_down = 0; flag = _state; }
int campaign_file_list_filter(const char *filename) { char name[NAME_LENGTH]; char *desc = NULL; int type, max_players; if ( mission_campaign_get_info( filename, name, &type, &max_players, &desc) ) { if ( type == CAMPAIGN_TYPE_SINGLE) { Campaign_names[local_num_campaigns] = vm_strdup(name); local_num_campaigns++; return 1; } } if (desc != NULL) vm_free(desc); return 0; }
/** * Add a message to the queue to be sent later */ void message_training_queue(char *text, int timestamp, int length) { int m; char temp_buf[TRAINING_MESSAGE_LENGTH]; Assert(Training_message_queue_count < TRAINING_MESSAGE_QUEUE_MAX); if (Training_message_queue_count < TRAINING_MESSAGE_QUEUE_MAX) { if (!stricmp(text, NOX("none"))) { m = -1; } else { for (m=0; m<Num_messages; m++) if (!stricmp(text, Messages[m].name)) break; Assert(m < Num_messages); if (m >= Num_messages) return; } Training_message_queue[Training_message_queue_count].num = m; Training_message_queue[Training_message_queue_count].timestamp = timestamp; Training_message_queue[Training_message_queue_count].length = length; // Goober5000 - this shouldn't happen, but let's be safe if (Training_message_queue[Training_message_queue_count].special_message != NULL) { Int3(); vm_free(Training_message_queue[Training_message_queue_count].special_message); Training_message_queue[Training_message_queue_count].special_message = NULL; } // Goober5000 - replace variables if necessary strcpy_s(temp_buf, Messages[m].message); if (sexp_replace_variable_names_with_values(temp_buf, MESSAGE_LENGTH)) Training_message_queue[Training_message_queue_count].special_message = vm_strdup(temp_buf); Training_message_queue_count++; } }
static Profile *profile_read(const char *file) { FILE *fp = NULL; char *str; if (os_is_legacy_mode()) { #ifdef WIN32 return nullptr; // No config file in legacy mode #else // Try to use the config file at the old location char legacy_path[MAX_PATH_LEN]; snprintf(legacy_path, MAX_PATH_LEN, "%s/%s/%s", getenv("HOME"), Osreg_user_dir_legacy, file); fp = fopen(legacy_path, "rt"); #endif } else { fp = fopen(os_get_config_path(file).c_str(), "rt"); } if (fp == NULL) return NULL; Profile *profile = (Profile *)vm_malloc(sizeof(Profile)); profile->sections = NULL; Section **sp_ptr = &(profile->sections); Section *sp = NULL; KeyValue **kvp_ptr = NULL; while ((str = read_line_from_file(fp)) != NULL) { char *ptr = trim_string(str); if (*ptr == '[') { ptr++; char *pend = strchr(ptr, ']'); if (pend != NULL) { // if (pend[1]) { /* trailing garbage! */ } *pend = 0; if (*ptr) { sp = (Section *)vm_malloc(sizeof(Section)); sp->next = NULL; sp->name = vm_strdup(ptr); sp->pairs = NULL; *sp_ptr = sp; sp_ptr = &(sp->next); kvp_ptr = &(sp->pairs); } // else { /* null name! */ } } // else { /* incomplete section name! */ } } else { if (*ptr) { char *key = ptr; char *value = NULL; ptr = strchr(ptr, '='); if (ptr != NULL) { *ptr = 0; ptr++; value = ptr; } // else { /* random garbage! */ } if (key && *key && value /* && *value */) { if (sp != NULL) { KeyValue *kvp = (KeyValue *)vm_malloc(sizeof(KeyValue)); kvp->key = vm_strdup(key); kvp->value = vm_strdup(value); kvp->next = NULL; *kvp_ptr = kvp; kvp_ptr = &(kvp->next); } // else { /* key/value with no section! */ } // else { /* malformed key/value entry! */ } } // else it's just a comment or empty string } vm_free(str); } fclose(fp); return profile; }
// parses help.tbl and populates help_overlaylist[] void parse_helptbl(const char *filename) { int overlay_id, currcount, vtxcount; char name[HELP_MAX_NAME_LENGTH]; char buf[HELP_MAX_STRING_LENGTH + 1]; int i, j, rval; SCP_vector<help_pline> pline_temp; help_pline pline_temp2; SCP_vector<help_text> text_temp; help_text text_temp2; SCP_vector<help_right_bracket> rbracket_temp; help_right_bracket rbracket_temp2; SCP_vector<help_left_bracket> lbracket_temp; help_left_bracket lbracket_temp2; vec3d vec3d_temp; if ((rval = setjmp(parse_abort)) != 0) { mprintf(("TABLES: Unable to parse '%s'! Error code = %i.\n", filename, rval)); return; } read_file_text(filename, CF_TYPE_TABLES); reset_parse(); // for each overlay... while (optional_string("$")) { stuff_string(name, F_NAME, HELP_MAX_NAME_LENGTH); overlay_id = help_overlay_get_index(name); if (overlay_id < 0) { if (num_help_overlays >= MAX_HELP_OVERLAYS) { Warning(LOCATION, "Could not load help overlay after '%s' as maximum number of help overlays was reached (Max is %d)", help_overlaylist[overlay_id - 1].name, MAX_HELP_OVERLAYS); if (!skip_to_string("$end")) { Error(LOCATION, "Couldn't find $end. Help.tbl or -hlp.tbm is invalid.\n"); } continue; } else { overlay_id = num_help_overlays; strcpy_s(help_overlaylist[overlay_id].name, name); num_help_overlays++; } } // clear out counters in the overlay struct help_overlaylist[overlay_id].plinecount = 0; help_overlaylist[overlay_id].textcount = 0; help_overlaylist[overlay_id].rbracketcount = 0; help_overlaylist[overlay_id].lbracketcount = 0; help_overlaylist[overlay_id].fontlist.clear(); help_overlaylist[overlay_id].plinelist.clear(); help_overlaylist[overlay_id].textlist.clear(); help_overlaylist[overlay_id].rbracketlist.clear(); help_overlaylist[overlay_id].lbracketlist.clear(); if (optional_string("+resolutions")) { stuff_int(&help_overlaylist[overlay_id].num_resolutions); } else { help_overlaylist[overlay_id].num_resolutions = 2; } if (help_overlaylist[overlay_id].num_resolutions < 1) { Error(LOCATION, "+resolutions in %s is %d. (Must be 1 or greater)", filename, help_overlaylist[overlay_id].num_resolutions); } if (optional_string("+font")) { int font; for (i=0; i<help_overlaylist[overlay_id].num_resolutions; i++) { stuff_int(&font); help_overlaylist[overlay_id].fontlist.push_back(font); } } else { for (i=0; i<help_overlaylist[overlay_id].num_resolutions; i++) { help_overlaylist[overlay_id].fontlist.push_back(FONT1); } } for (i=0; i<help_overlaylist[overlay_id].num_resolutions; i++) { help_overlaylist[overlay_id].plinelist.push_back(pline_temp); help_overlaylist[overlay_id].textlist.push_back(text_temp); help_overlaylist[overlay_id].rbracketlist.push_back(rbracket_temp); help_overlaylist[overlay_id].lbracketlist.push_back(lbracket_temp); } int type; // read in all elements for this overlay while ((type = required_string_one_of(5, "+pline", "+text", "+right_bracket", "+left_bracket", "$end")) != 4) { // Doing it this way means an error lists "$end" at the end, which seems appropriate. -MageKing17 switch (type) { case 0: // +pline required_string("+pline"); currcount = help_overlaylist[overlay_id].plinecount; int a, b; // temp vars to read in int before cast to float; // read number of pline vertices stuff_int(&vtxcount); // get vertex coordinates for each resolution for (i = 0; i < help_overlaylist[overlay_id].num_resolutions; i++) { help_overlaylist[overlay_id].plinelist.at(i).push_back(pline_temp2); for (j = 0; j < vtxcount; j++) { help_overlaylist[overlay_id].plinelist.at(i).at(currcount).vtx.push_back(vec3d_temp); help_overlaylist[overlay_id].plinelist.at(i).at(currcount).vtxcount = vtxcount; stuff_int(&a); stuff_int(&b); help_overlaylist[overlay_id].plinelist.at(i).at(currcount).vtx.at(j).xyz.x = (float)a; help_overlaylist[overlay_id].plinelist.at(i).at(currcount).vtx.at(j).xyz.y = (float)b; help_overlaylist[overlay_id].plinelist.at(i).at(currcount).vtx.at(j).xyz.z = 0.0f; } } help_overlaylist[overlay_id].plinecount++; break; case 1: // +text required_string("+text"); currcount = help_overlaylist[overlay_id].textcount; // get coordinates for each resolution for (i = 0; i < help_overlaylist[overlay_id].num_resolutions; i++) { help_overlaylist[overlay_id].textlist.at(i).push_back(text_temp2); stuff_int(&(help_overlaylist[overlay_id].textlist.at(i).at(currcount).x_coord)); stuff_int(&(help_overlaylist[overlay_id].textlist.at(i).at(currcount).y_coord)); } // get string (always use the first resolution) stuff_string(buf, F_MESSAGE, sizeof(buf)); help_overlaylist[overlay_id].textlist.at(0).at(currcount).string = vm_strdup(buf); help_overlaylist[overlay_id].textcount++; break; case 2: // +right_bracket required_string("+right_bracket"); currcount = help_overlaylist[overlay_id].rbracketcount; // get coordinates for each resolution for (i = 0; i < help_overlaylist[overlay_id].num_resolutions; i++) { help_overlaylist[overlay_id].rbracketlist.at(i).push_back(rbracket_temp2); stuff_int(&(help_overlaylist[overlay_id].rbracketlist.at(i).at(currcount).x_coord)); stuff_int(&(help_overlaylist[overlay_id].rbracketlist.at(i).at(currcount).y_coord)); } help_overlaylist[overlay_id].rbracketcount++; break; case 3: // +left_bracket required_string("+left_bracket"); currcount = help_overlaylist[overlay_id].lbracketcount; // get coordinates for each resolution for (i = 0; i < help_overlaylist[overlay_id].num_resolutions; i++) { help_overlaylist[overlay_id].lbracketlist.at(i).push_back(lbracket_temp2); stuff_int(&(help_overlaylist[overlay_id].lbracketlist.at(i).at(currcount).x_coord)); stuff_int(&(help_overlaylist[overlay_id].lbracketlist.at(i).at(currcount).y_coord)); } help_overlaylist[overlay_id].lbracketcount++; break; case -1: // -noparseerrors is set break; case 4: // $end default: Assertion(false, "This should never happen.\n"); break; } } // end while required_string("$end"); } // end while }
void parse_medal_tbl() { int rval, i; int num_badges = 0; // open localization lcl_ext_open(); if ((rval = setjmp(parse_abort)) != 0) { mprintf(("TABLES: Unable to parse '%s'! Error code = %i.\n", "medals.tbl", rval)); lcl_ext_close(); return; } read_file_text("medals.tbl", CF_TYPE_TABLES); reset_parse(); // parse in all the rank names Num_medals = 0; required_string("#Medals"); while (required_string_either("#End", "$Name:")) { medal_stuff temp_medal; required_string("$Name:"); stuff_string(temp_medal.name, F_NAME, NAME_LENGTH); required_string("$Bitmap:"); stuff_string(temp_medal.bitmap, F_NAME, MAX_FILENAME_LEN); required_string("$Num mods:"); stuff_int(&temp_medal.num_versions); // some medals are based on kill counts. When string +Num Kills: is present, we know that // this medal is a badge and should be treated specially if (optional_string("+Num Kills:")) { char buf[MULTITEXT_LENGTH]; stuff_int(&temp_medal.kills_needed); if (optional_string("$Wavefile 1:")) stuff_string(temp_medal.voice_base, F_NAME, MAX_FILENAME_LEN); if (optional_string("$Wavefile 2:")) stuff_string(temp_medal.voice_base, F_NAME, MAX_FILENAME_LEN); //stuff_string(Badge_info[bi].wave2, F_NAME, NULL, MAX_FILENAME_LEN); if (optional_string("$Wavefile Base:")) stuff_string(temp_medal.voice_base, F_NAME, MAX_FILENAME_LEN); //required_string("$Wavefile 2:"); //stuff_string(Badge_info[bi].wave2, F_NAME, NULL, MAX_FILENAME_LEN); required_string("$Promotion Text:"); stuff_string(buf, F_MULTITEXT, sizeof(buf)); temp_medal.promotion_text = vm_strdup(buf); // since badges (ace ranks) are handled a little differently we need to know // which we are in the list of badges. temp_medal.badge_num = num_badges++; } Medals.push_back(temp_medal); } required_string("#End"); Num_medals = Medals.size(); Assert(Num_medals == MAX_MEDALS); // be sure that the badges kill numbers show up in order //WMC - I don't think this is needed anymore due to my changes to post-mission functions //but I'm keeping it here to be sure. int prev_badge_kills = 0; for (i = 0; i < Num_medals; i++) { if (Medals[i].kills_needed < prev_badge_kills && Medals[i].kills_needed != 0) Error(LOCATION, "Badges must appear sorted by lowest kill # first in medals.tbl\nFind Allender for most information."); if (Medals[i].kills_needed > 0) prev_badge_kills = Medals[i].kills_needed; } // close localization lcl_ext_close(); }
void parse_medal_tbl() { int rval, i; if ((rval = setjmp(parse_abort)) != 0) { mprintf(("TABLES: Unable to parse '%s'! Error code = %i.\n", "medals.tbl", rval)); return; } read_file_text("medals.tbl", CF_TYPE_TABLES); reset_parse(); required_string("#Medals"); // special background information if (optional_string("+Background Bitmap:")) { stuff_string(Medals_background_filename, F_NAME, NAME_LENGTH); } else { strcpy_s(Medals_background_filename, Default_medals_background_filename); } // special mask information if (optional_string("+Mask Bitmap:")) { stuff_string(Medals_mask_filename, F_NAME, NAME_LENGTH); } else { strcpy_s(Medals_mask_filename, Default_medals_mask_filename); } // special positioning for player callsign if (optional_string("+Callsign Position 640:")) { stuff_int(&Medals_callsign_coords[GR_640].x); stuff_int(&Medals_callsign_coords[GR_640].y); } else { Medals_callsign_coords[GR_640].x = Default_medals_callsign_coords[GR_640][0]; Medals_callsign_coords[GR_640].y = Default_medals_callsign_coords[GR_640][1]; } if (optional_string("+Callsign Position 1024:")) { stuff_int(&Medals_callsign_coords[GR_1024].x); stuff_int(&Medals_callsign_coords[GR_1024].y); } else { Medals_callsign_coords[GR_1024].x = Default_medals_callsign_coords[GR_1024][0]; Medals_callsign_coords[GR_1024].y = Default_medals_callsign_coords[GR_1024][1]; } // special positioning for medal label if (optional_string("+Label Position 640:")) { stuff_int(&Medals_label_coords[GR_640].x); stuff_int(&Medals_label_coords[GR_640].y); stuff_int(&Medals_label_coords[GR_640].w); } else { Medals_label_coords[GR_640].x = Default_medals_label_coords[GR_640][0]; Medals_label_coords[GR_640].y = Default_medals_label_coords[GR_640][1]; Medals_label_coords[GR_640].w = Default_medals_label_coords[GR_640][2]; } if (optional_string("+Label Position 1024:")) { stuff_int(&Medals_label_coords[GR_1024].x); stuff_int(&Medals_label_coords[GR_1024].y); stuff_int(&Medals_label_coords[GR_1024].w); } else { Medals_label_coords[GR_1024].x = Default_medals_label_coords[GR_1024][0]; Medals_label_coords[GR_1024].y = Default_medals_label_coords[GR_1024][1]; Medals_label_coords[GR_1024].w = Default_medals_label_coords[GR_1024][2]; } // parse in all the medal names Num_medals = 0; while ( required_string_either("#End", "$Name:") ) { medal_stuff temp_medal; medal_display_info temp_display; required_string("$Name:"); stuff_string( temp_medal.name, F_NAME, NAME_LENGTH ); // is this rank? if so, save it if (!stricmp(temp_medal.name, "Rank")) Rank_medal_index = Num_medals; required_string("$Bitmap:"); stuff_string( temp_medal.bitmap, F_NAME, MAX_FILENAME_LEN ); if (optional_string("+Position 640:")) { stuff_int(&temp_display.coords[GR_640].x); stuff_int(&temp_display.coords[GR_640].y); } else if (Num_medals < NUM_MEDALS_FS2) { temp_display.coords[GR_640].x = Default_medal_coords[GR_640][Num_medals][0]; temp_display.coords[GR_640].y = Default_medal_coords[GR_640][Num_medals][1]; } else { Warning(LOCATION, "No default GR_640 position for medal '%s'!", temp_medal.name); temp_display.coords[GR_640].x = 0; temp_display.coords[GR_640].y = 0; } if (optional_string("+Position 1024:")) { stuff_int(&temp_display.coords[GR_1024].x); stuff_int(&temp_display.coords[GR_1024].y); } else if (Num_medals < NUM_MEDALS_FS2) { temp_display.coords[GR_1024].x = Default_medal_coords[GR_1024][Num_medals][0]; temp_display.coords[GR_1024].y = Default_medal_coords[GR_1024][Num_medals][1]; } else { Warning(LOCATION, "No default GR_1024 position for medal '%s'!", temp_medal.name); temp_display.coords[GR_1024].x = 0; temp_display.coords[GR_1024].y = 0; } if (optional_string("+Debriefing Bitmap:")) { stuff_string( temp_medal.debrief_bitmap, F_NAME, MAX_FILENAME_LEN ); } else if (Num_medals < NUM_MEDALS_FS2) { strcpy_s(temp_medal.debrief_bitmap, Default_debriefing_bitmaps[Num_medals]); } else { Warning(LOCATION, "No default debriefing bitmap for medal '%s'!", temp_medal.name); strcpy_s(temp_medal.debrief_bitmap, ""); } required_string("$Num mods:"); stuff_int( &temp_medal.num_versions ); // this is dumb temp_medal.version_starts_at_1 = (Num_medals == Rank_medal_index); if (optional_string("+Version starts at 1:")) { stuff_boolean( &temp_medal.version_starts_at_1 ); } // some medals are based on kill counts. When string +Num Kills: is present, we know that // this medal is a badge and should be treated specially if ( optional_string("+Num Kills:") ) { char buf[MULTITEXT_LENGTH]; int persona; stuff_int( &temp_medal.kills_needed ); if (optional_string("$Wavefile 1:")) stuff_string(temp_medal.voice_base, F_NAME, MAX_FILENAME_LEN); if (optional_string("$Wavefile 2:")) stuff_string(temp_medal.voice_base, F_NAME, MAX_FILENAME_LEN); if (optional_string("$Wavefile Base:")) stuff_string(temp_medal.voice_base, F_NAME, MAX_FILENAME_LEN); while (check_for_string("$Promotion Text:")) { required_string("$Promotion Text:"); stuff_string(buf, F_MULTITEXT, sizeof(buf)); persona = -1; if (optional_string("+Persona:")) { stuff_int(&persona); if (persona < 0) { Warning(LOCATION, "Debriefing text for %s is assigned to an invalid persona: %i (must be 0 or greater).\n", temp_medal.name, persona); continue; } } temp_medal.promotion_text[persona] = vm_strdup(buf); } if (temp_medal.promotion_text.find(-1) == temp_medal.promotion_text.end()) { Warning(LOCATION, "%s medal is missing default debriefing text.\n", temp_medal.name); temp_medal.promotion_text[-1] = ""; } } Medals.push_back(temp_medal); Medal_display_info.push_back(temp_display); Num_medals++; } required_string("#End"); // be sure that we know where the rank is if (Rank_medal_index < 0) { Warning(LOCATION, "Could not find the 'Rank' medal!"); Rank_medal_index = 0; } // be sure that the badges kill numbers show up in order //WMC - I don't think this is needed anymore due to my changes to post-mission functions //but I'm keeping it here to be sure. int prev_badge_kills = 0; for (i = 0; i < Num_medals; i++ ) { if ( Medals[i].kills_needed < prev_badge_kills && Medals[i].kills_needed != 0) Error(LOCATION, "Badges must appear sorted by lowest kill # first in medals.tbl\nFind Allender for most information."); if (Medals[i].kills_needed > 0) prev_badge_kills = Medals[i].kills_needed; } }
static Profile *profile_update(Profile *profile, const char *section, const char *key, const char *value) { if (profile == NULL) { profile = (Profile *)vm_malloc(sizeof(Profile)); profile->sections = NULL; } KeyValue *kvp; Section **sp_ptr = &(profile->sections); Section *sp = profile->sections; while (sp != NULL) { if (strcmp(section, sp->name) == 0) { KeyValue **kvp_ptr = &(sp->pairs); kvp = sp->pairs; while (kvp != NULL) { if (strcmp(key, kvp->key) == 0) { vm_free(kvp->value); if (value == NULL) { *kvp_ptr = kvp->next; vm_free(kvp->key); vm_free(kvp); } else { kvp->value = vm_strdup(value); } /* all done */ return profile; } kvp_ptr = &(kvp->next); kvp = kvp->next; } if (value != NULL) { /* key not found */ kvp = (KeyValue *)vm_malloc(sizeof(KeyValue)); kvp->next = NULL; kvp->key = vm_strdup(key); kvp->value = vm_strdup(value); } *kvp_ptr = kvp; /* all done */ return profile; } sp_ptr = &(sp->next); sp = sp->next; } /* section not found */ sp = (Section *)vm_malloc(sizeof(Section)); sp->next = NULL; sp->name = vm_strdup(section); kvp = (KeyValue *)vm_malloc(sizeof(KeyValue)); kvp->next = NULL; kvp->key = vm_strdup(key); kvp->value = vm_strdup(value); sp->pairs = kvp; *sp_ptr = sp; return profile; }
// Unified function for loading strings.tbl and tstrings.tbl (and their modular versions). // The "external" parameter controls which format to load: true for tstrings.tbl, false for strings.tbl void parse_stringstbl_common(const char *filename, const bool external) { char chr, buf[4096]; char language_tag[512]; int z, index; char *p_offset = NULL; int offset_lo = 0, offset_hi = 0; read_file_text(filename, CF_TYPE_TABLES); reset_parse(); // move down to the proper section memset(language_tag, 0, sizeof(language_tag)); strcpy_s(language_tag, "#"); if (external && Lcl_current_lang == FS2_OPEN_DEFAULT_LANGUAGE){ strcat_s(language_tag, "default"); } else { strcat_s(language_tag, Lcl_languages[Lcl_current_lang].lang_name); } if ( skip_to_string(language_tag) != 1 ) { mprintf(("Current language not found in %s\n", filename)); return; } // parse all the strings in this section of the table while ( !check_for_string("#") ) { int num_offsets_on_this_line = 0; stuff_int(&index); if (external) { ignore_white_space(); get_string(buf, sizeof(buf)); drop_trailing_white_space(buf); } else { stuff_string(buf, F_RAW, sizeof(buf)); } if (external && (index < 0 || index >= LCL_MAX_STRINGS)) { error_display(0, "Invalid tstrings table index specified (%i). Please increment LCL_MAX_STRINGS in localize.cpp.", index); return; } else if (!external && (index < 0 || index >= XSTR_SIZE)) { Error(LOCATION, "Invalid strings table index specified (%i)", index); } if (!external) { size_t i = strlen(buf); while (i--) { if ( !isspace(buf[i]) ) break; } // trim unnecessary end of string // Assert(buf[i] == '"'); if (buf[i] != '"') { // probably an offset on this entry // drop down a null terminator (prolly unnecessary) buf[i+1] = 0; // back up over the potential offset while ( !is_white_space(buf[i]) ) i--; // now back up over intervening spaces while ( is_white_space(buf[i]) ) i--; num_offsets_on_this_line = 1; if (buf[i] != '"') { // could have a 2nd offset value (one for 640, one for 1024) // so back up again while ( !is_white_space(buf[i]) ) i--; // now back up over intervening spaces while ( is_white_space(buf[i]) ) i--; num_offsets_on_this_line = 2; } p_offset = &buf[i+1]; // get ptr to string section with offset in it if (buf[i] != '"') Error(LOCATION, "%s is corrupt", filename); // now its an error } buf[i] = 0; // copy string into buf z = 0; for (i = 1; buf[i]; i++) { chr = buf[i]; if (chr == '\\') { chr = buf[++i]; if (chr == 'n') chr = '\n'; else if (chr == 'r') chr = '\r'; } buf[z++] = chr; } // null terminator on buf buf[z] = 0; } // write into Xstr_table (for strings.tbl) or Lcl_ext_str (for tstrings.tbl) if (Parsing_modular_table) { if ( external && (Lcl_ext_str[index] != NULL) ) { vm_free((void *) Lcl_ext_str[index]); Lcl_ext_str[index] = NULL; } else if ( !external && (Xstr_table[index].str != NULL) ) { vm_free((void *) Xstr_table[index].str); Xstr_table[index].str = NULL; } } if (external && (Lcl_ext_str[index] != NULL)) { Warning(LOCATION, "Tstrings table index %d used more than once", index); } else if (!external && (Xstr_table[index].str != NULL)) { Warning(LOCATION, "Strings table index %d used more than once", index); } if (external) { Lcl_ext_str[index] = vm_strdup(buf); } else { Xstr_table[index].str = vm_strdup(buf); } // the rest of this loop applies only to strings.tbl, // so we can move on to the next line if we're reading from tstrings.tbl if (external) { continue; } // read offset information, assume 0 if nonexistant if (p_offset != NULL) { if (sscanf(p_offset, "%d%d", &offset_lo, &offset_hi) < num_offsets_on_this_line) { // whatever is in the file ain't a proper offset Error(LOCATION, "%s is corrupt", filename); } } Xstr_table[index].offset_x = offset_lo; if (num_offsets_on_this_line == 2) Xstr_table[index].offset_x_hi = offset_hi; else Xstr_table[index].offset_x_hi = offset_lo; // clear out our vars p_offset = NULL; offset_lo = 0; offset_hi = 0; } }
// parses help.tbl and populates help_overlaylist[] void parse_helptbl() { int overlay_id, currcount; char buf[HELP_MAX_STRING_LENGTH + 1]; int i, rval; // open localization lcl_ext_open(); if ((rval = setjmp(parse_abort)) != 0) { mprintf(("TABLES: Unable to parse '%s'! Error code = %i.\n", HELP_OVERLAY_FILENAME, rval)); lcl_ext_close(); return; } read_file_text(HELP_OVERLAY_FILENAME, CF_TYPE_TABLES); // for each overlay... for (overlay_id = 0; overlay_id < MAX_HELP_OVERLAYS; overlay_id++) { reset_parse(); skip_to_string(help_overlay_section_names[overlay_id]); // clear out counters in the overlay struct help_overlaylist[overlay_id].plinecount = 0; help_overlaylist[overlay_id].textcount = 0; help_overlaylist[overlay_id].rbracketcount = 0; help_overlaylist[overlay_id].lbracketcount = 0; // read in all elements for this overlay while (!(check_for_string("$end"))) { if (optional_string("+pline")) { currcount = help_overlaylist[overlay_id].plinecount; int a, b; // temp vars to read in int before cast to float; if (currcount < HELP_MAX_ITEM) { // read number of pline vertices stuff_int(&help_overlaylist[overlay_id].plinelist[GR_640][currcount].vtxcount); // note that it is read into GR_640 // help_overlaylist[overlay_id].plinelist[GR_1024][currcount].vtxcount = help_overlaylist[overlay_id].plinelist[GR_640][currcount].vtxcount; // set equal to 1024 version vertex count to prevent bugs Assert(help_overlaylist[overlay_id].plinelist[GR_640][currcount].vtxcount <= HELP_MAX_PLINE_VERTICES); // get 640x480 vertex coordinates for (i = 0; i < help_overlaylist[overlay_id].plinelist[GR_640][currcount].vtxcount; i++) { stuff_int(&a); stuff_int(&b); help_overlaylist[overlay_id].plinelist[GR_640][currcount].vtx[i].xyz.x = (float)a; help_overlaylist[overlay_id].plinelist[GR_640][currcount].vtx[i].xyz.y = (float)b; help_overlaylist[overlay_id].plinelist[GR_640][currcount].vtx[i].xyz.z = 0.0f; help_overlaylist[overlay_id].plinelist[GR_640][currcount].pvtx[i] = &help_overlaylist[ overlay_id].plinelist[GR_640][currcount].vtx[i]; } // get 1024x768 vertex coordinates for (i = 0; i < help_overlaylist[overlay_id].plinelist[GR_640][currcount].vtxcount; i++) { stuff_int(&a); stuff_int(&b); help_overlaylist[overlay_id].plinelist[GR_1024][currcount].vtx[i].xyz.x = (float)a; help_overlaylist[overlay_id].plinelist[GR_1024][currcount].vtx[i].xyz.y = (float)b; help_overlaylist[overlay_id].plinelist[GR_1024][currcount].vtx[i].xyz.z = 0.0f; help_overlaylist[overlay_id].plinelist[GR_1024][currcount].pvtx[i] = &help_overlaylist[ overlay_id].plinelist[GR_1024][currcount].vtx[i]; } } //mprintf(("Found pline - start location (%f,%f), end location (%f,%f)\n", help_overlaylist[overlay_id].plinelist[GR_640][currcount].vtx[0].xyz.x, help_overlaylist[overlay_id].plinelist[GR_640][currcount].vtx[0].xyz.y, help_overlaylist[overlay_id].plinelist[GR_640][currcount].vtx[2].xyz.x, help_overlaylist[overlay_id].plinelist[GR_640][currcount].vtx[2].xyz.y)); help_overlaylist[overlay_id].plinecount++; } else if (optional_string("+text")) { currcount = help_overlaylist[overlay_id].textcount; if (currcount < HELP_MAX_ITEM) { // get 640x480 coordinates stuff_int(&(help_overlaylist[overlay_id].textlist[GR_640][currcount].x_coord)); stuff_int(&(help_overlaylist[overlay_id].textlist[GR_640][currcount].y_coord)); // get 1024x768 coordinates stuff_int(&(help_overlaylist[overlay_id].textlist[GR_1024][currcount].x_coord)); stuff_int(&(help_overlaylist[overlay_id].textlist[GR_1024][currcount].y_coord)); // get string (always use the GR_640 one) stuff_string(buf, F_MESSAGE, sizeof(buf)); help_overlaylist[overlay_id].textlist[GR_640][currcount].string = vm_strdup(buf); //mprintf(("Found text %d on overlay %d - location (%d,%d) @ 640x480 :: location (%d,%d) @ 1024x768\n", currcount, overlay_id, help_overlaylist[overlay_id].textlist[GR_640][currcount].x_coord, help_overlaylist[overlay_id].textlist[GR_640][currcount].y_coord, help_overlaylist[overlay_id].textlist[GR_1024][currcount].x_coord, help_overlaylist[overlay_id].textlist[GR_1024][currcount].x_coord)); help_overlaylist[overlay_id].textcount++; } } else if (optional_string("+right_bracket")) { currcount = help_overlaylist[overlay_id].rbracketcount; if (currcount < HELP_MAX_ITEM) { // get 640x480 coordinates stuff_int(&(help_overlaylist[overlay_id].rbracketlist[GR_640][currcount].x_coord)); stuff_int(&(help_overlaylist[overlay_id].rbracketlist[GR_640][currcount].y_coord)); // get 1024x768 coordinates stuff_int(&(help_overlaylist[overlay_id].rbracketlist[GR_1024][currcount].x_coord)); stuff_int(&(help_overlaylist[overlay_id].rbracketlist[GR_1024][currcount].y_coord)); //mprintf(("Found rbracket %d on overlay %d - location (%d,%d) @ 640x480 :: location (%d,%d) @ 1024x768\n", currcount, overlay_id, help_overlaylist[overlay_id].rbracketlist[GR_640][currcount].x_coord, help_overlaylist[overlay_id].rbracketlist[GR_640][currcount].y_coord, help_overlaylist[overlay_id].rbracketlist[GR_1024][currcount].x_coord, help_overlaylist[overlay_id].rbracketlist[GR_1024][currcount].y_coord)); help_overlaylist[overlay_id].rbracketcount++; } } else if (optional_string("+left_bracket")) { currcount = help_overlaylist[overlay_id].lbracketcount; if (currcount < HELP_MAX_ITEM) { // get 640x480 coordinates stuff_int(&(help_overlaylist[overlay_id].lbracketlist[GR_640][currcount].x_coord)); stuff_int(&(help_overlaylist[overlay_id].lbracketlist[GR_640][currcount].y_coord)); // get 1024x768 coordinates stuff_int(&(help_overlaylist[overlay_id].lbracketlist[GR_1024][currcount].x_coord)); stuff_int(&(help_overlaylist[overlay_id].lbracketlist[GR_1024][currcount].y_coord)); //mprintf(("Found lbracket %d on overlay %d - location (%d,%d) @ 640x480 :: location (%d,%d) @ 1024x768\n", currcount, overlay_id, help_overlaylist[overlay_id].lbracketlist[GR_640][currcount].x_coord, help_overlaylist[overlay_id].lbracketlist[GR_640][currcount].y_coord, help_overlaylist[overlay_id].lbracketlist[GR_1024][currcount].x_coord, help_overlaylist[overlay_id].lbracketlist[GR_1024][currcount].y_coord)); help_overlaylist[overlay_id].lbracketcount++; } } else { // help.tbl is corrupt Assert(0); } // end if } // end while } // end for // close localization lcl_ext_close(); }
// initialize all popup details (graphics, etc) void multi_pinfo_popup_init(net_player *np) { int idx; // no errors to start with Multi_pinfo_popup_error = 0; // shouldn't be done Multi_pinfo_popup_done = 0; // store the background as it currently is Multi_pinfo_screen_save = gr_save_screen(); if(Multi_pinfo_screen_save == -1){ Multi_pinfo_popup_error = 1; return; } // create the interface window Multi_pinfo_window.create(0,0,gr_screen.max_w_unscaled,gr_screen.max_h_unscaled,0); Multi_pinfo_window.set_mask_bmap(Multi_pinfo_bitmap_mask[gr_screen.res]); // load the background bitmap Multi_pinfo_bitmap = bm_load(Multi_pinfo_bitmap_name[gr_screen.res]); if(Multi_pinfo_bitmap < 0){ Multi_pinfo_popup_error = 1; return; } // backup hardware textures setting and bash to max Multi_pinfo_hardware_texture_backup = Detail.hardware_textures; Detail.hardware_textures = MAX_DETAIL_LEVEL; // zero bitmap info Mp_pilot.bitmap = -1; strcpy_s(Mp_pilot.filename, ""); Mp_squad.bitmap = -1; strcpy_s(Mp_squad.filename, ""); // set the player status multi_pinfo_reset_player(np); // create the interface buttons for(idx=0;idx<MULTI_PINFO_NUM_BUTTONS;idx++){ // create the object Multi_pinfo_buttons[gr_screen.res][idx].button.create(&Multi_pinfo_window, "", Multi_pinfo_buttons[gr_screen.res][idx].x, Multi_pinfo_buttons[gr_screen.res][idx].y, 1, 1, 0, 1); // set the sound to play when highlighted Multi_pinfo_buttons[gr_screen.res][idx].button.set_highlight_action(common_play_highlight_sound); // set the ani for the button Multi_pinfo_buttons[gr_screen.res][idx].button.set_bmaps(Multi_pinfo_buttons[gr_screen.res][idx].filename); // set the hotspot Multi_pinfo_buttons[gr_screen.res][idx].button.link_hotspot(Multi_pinfo_buttons[gr_screen.res][idx].hotspot); } // add xstrs for(idx=0; idx<MULTI_PINFO_NUM_TEXT; idx++){ Multi_pinfo_window.add_XSTR(&Multi_pinfo_text[gr_screen.res][idx]); } // initialize strings Multi_pinfo_stats_labels[0] = vm_strdup(XSTR("Rank", 1007)); Multi_pinfo_stats_labels[1] = vm_strdup(XSTR("Missions Flown", 1008)); Multi_pinfo_stats_labels[2] = vm_strdup(XSTR("Flight Time", 1009)); Multi_pinfo_stats_labels[3] = vm_strdup(XSTR("Last Flown",1010)); Multi_pinfo_stats_labels[4] = vm_strdup(XSTR("Total Kills", 115)); Multi_pinfo_stats_labels[5] = vm_strdup(XSTR("Primary Shots Fired", 1012)); Multi_pinfo_stats_labels[6] = vm_strdup(XSTR("Primary Hit %", 1013)); Multi_pinfo_stats_labels[7] = vm_strdup(XSTR("Secondary Shots Fired", 1014)); Multi_pinfo_stats_labels[8] = vm_strdup(XSTR("Secondary Hit %", 1015)); }