コード例 #1
0
ファイル: plr.cpp プロジェクト: sobczyk/fs2open
void pilotfile::plr_read_stats_multi()
{
    int idx, j, list_size = 0;
    index_list_t ilist;
    char t_string[NAME_LENGTH+1];

    // global, all-time stats (used only until campaign stats are loaded)
    multi_stats.score = cfread_int(cfp);
    multi_stats.rank = cfread_int(cfp);
    multi_stats.assists = cfread_int(cfp);
    multi_stats.kill_count = cfread_int(cfp);
    multi_stats.kill_count_ok = cfread_int(cfp);
    multi_stats.bonehead_kills = cfread_int(cfp);

    multi_stats.p_shots_fired = cfread_uint(cfp);
    multi_stats.p_shots_hit = cfread_uint(cfp);
    multi_stats.p_bonehead_hits = cfread_uint(cfp);

    multi_stats.s_shots_fired = cfread_uint(cfp);
    multi_stats.s_shots_hit = cfread_uint(cfp);
    multi_stats.s_bonehead_hits = cfread_uint(cfp);

    multi_stats.flight_time = cfread_uint(cfp);
    multi_stats.missions_flown = cfread_uint(cfp);
    multi_stats.last_flown = (_fs_time_t)cfread_int(cfp);
    multi_stats.last_backup = (_fs_time_t)cfread_int(cfp);

    // ship kills (contains ships across all mods, not just current)
    list_size = cfread_int(cfp);
    multi_stats.ship_kills.reserve(list_size);

    for (idx = 0; idx < list_size; idx++) {
        cfread_string_len(t_string, NAME_LENGTH, cfp);

        ilist.name = t_string;
        ilist.index = ship_info_lookup(t_string);
        ilist.val = cfread_int(cfp);

        multi_stats.ship_kills.push_back(ilist);
    }

    // medals earned (contains medals across all mods, not just current)
    list_size = cfread_int(cfp);
    multi_stats.medals_earned.reserve(list_size);

    for (idx = 0; idx < list_size; idx++) {
        cfread_string_len(t_string, NAME_LENGTH,cfp);

        ilist.name = t_string;
        ilist.index = medals_info_lookup(t_string);
        ilist.val = cfread_int(cfp);

        multi_stats.medals_earned.push_back(ilist);
    }

    // if in multiplayer mode then set these stats as the player stats
    if (Game_mode & GM_MULTIPLAYER) {
        p->stats.score = multi_stats.score;
        p->stats.rank = multi_stats.rank;
        p->stats.assists = multi_stats.assists;
        p->stats.kill_count = multi_stats.kill_count;
        p->stats.kill_count_ok = multi_stats.kill_count_ok;
        p->stats.bonehead_kills = multi_stats.bonehead_kills;

        p->stats.p_shots_fired = multi_stats.p_shots_fired;
        p->stats.p_shots_hit = multi_stats.p_shots_hit;
        p->stats.p_bonehead_hits = multi_stats.p_bonehead_hits;

        p->stats.s_shots_fired = multi_stats.s_shots_fired;
        p->stats.s_shots_hit = multi_stats.s_shots_hit;
        p->stats.s_bonehead_hits = multi_stats.s_bonehead_hits;

        p->stats.flight_time = multi_stats.flight_time;
        p->stats.missions_flown = multi_stats.missions_flown;
        p->stats.last_flown = multi_stats.last_flown;
        p->stats.last_backup = multi_stats.last_backup;

        // ship kills (have to find ones that match content)
        list_size = (int)multi_stats.ship_kills.size();
        for (idx = 0; idx < list_size; idx++) {
            j = multi_stats.ship_kills[idx].index;

            if (j >= 0) {
                p->stats.kills[j] = multi_stats.ship_kills[idx].val;
            }
        }

        // medals earned (have to fine ones that match content)
        list_size = (int)multi_stats.medals_earned.size();
        for (idx = 0; idx < list_size; idx++) {
            j = multi_stats.medals_earned[idx].index;

            if (j >= 0) {
                p->stats.medals[j] = multi_stats.medals_earned[idx].val;
            }
        }
    }
}
コード例 #2
0
ファイル: csg.cpp プロジェクト: Kobrar/fs2open.github.com
void pilotfile::csg_read_info()
{
	char t_string[NAME_LENGTH+1] = { '\0' };
	index_list_t ilist;
	int idx, list_size = 0;
	ubyte allowed = 0;

	if ( !m_have_flags ) {
		throw "Info before Flags!";
	}

	//
	// NOTE: lists may contain missing/invalid entries for current data
	//       this is not necessarily fatal
	//

	// ship list (NOTE: may contain more than MAX_SHIP_CLASSES)
	list_size = cfread_int(cfp);

	for (idx = 0; idx < list_size; idx++) {
		cfread_string_len(t_string, NAME_LENGTH, cfp);

		ilist.name = t_string;
		ilist.index = ship_info_lookup(t_string);

		ship_list.push_back(ilist);
	}

	// weapon list (NOTE: may contain more than MAX_WEAPON_TYPES)
	list_size = cfread_int(cfp);

	for (idx = 0; idx < list_size; idx++) {
		cfread_string_len(t_string, NAME_LENGTH, cfp);

		ilist.name = t_string;
		ilist.index = weapon_info_lookup(t_string);

		weapon_list.push_back(ilist);
	}

	// intel list (NOTE: may contain more than MAX_INTEL_ENTRIES)
	list_size = cfread_int(cfp);

	for (idx = 0; idx < list_size; idx++) {
		cfread_string_len(t_string, NAME_LENGTH, cfp);

		ilist.name = t_string;
		ilist.index = intel_info_lookup(t_string);

		intel_list.push_back(ilist);
	}

	// medals list (NOTE: may contain more than Num_medals)
	list_size = cfread_int(cfp);

	for (idx = 0; idx < list_size; idx++) {
		cfread_string_len(t_string, NAME_LENGTH, cfp);

		ilist.name = t_string;
		ilist.index = medals_info_lookup(t_string);

		medals_list.push_back(ilist);
	}

	// last ship flown (index into ship_list)
	idx = cfread_int(cfp);

	// check the idx is within bounds
	Assertion ((idx < (int)ship_list.size()), "Campaign file contains an incorrect value for the last flown ship class. No data in ship_list for ship number %d.", idx); 
	if (idx >= (int)ship_list.size())
		idx = -1;
	else if (idx != -1)
		p->last_ship_flown_si_index = ship_list[idx].index;
	else
		p->last_ship_flown_si_index = -1;

	// progression state
	Campaign.prev_mission = cfread_int(cfp);
	Campaign.next_mission = cfread_int(cfp);

	// loop state
	Campaign.loop_reentry = cfread_int(cfp);
	Campaign.loop_enabled = cfread_int(cfp);

	// missions completed
	Campaign.num_missions_completed = cfread_int(cfp);

	// allowed ships
	list_size = (int)ship_list.size();
	for (idx = 0; idx < list_size; idx++) {
		allowed = cfread_ubyte(cfp);

		if (allowed) {
			if (ship_list[idx].index >= 0) {
				Campaign.ships_allowed[ship_list[idx].index] = 1;
			} else {
				m_data_invalid = true;
			}
		}
	}

	// allowed weapons
	list_size = (int)weapon_list.size();
	for (idx = 0; idx < list_size; idx++) {
		allowed = cfread_ubyte(cfp);

		if (allowed) {
			if (weapon_list[idx].index >= 0) {
				Campaign.weapons_allowed[weapon_list[idx].index] = 1;
			} else {
				m_data_invalid = true;
			}
		}
	}

	if (csg_ver >= 2) {
		// single/campaign squad name & image
		cfread_string_len(p->s_squad_name, NAME_LENGTH, cfp);
		cfread_string_len(p->s_squad_filename, MAX_FILENAME_LEN, cfp);
	}

	// if anything we need/use was missing then it should be considered fatal
	if (m_data_invalid) {
		throw "Invalid data for CSG!";
	}
}