Files
fs2open.github.com/code/pilotfile/pilotfile.cpp
T
Zacam 593be42e66 *drum roll* Pilot Code! Originated by taylor. Additional direct work by: The E, niffiwan, CommanderDJ, Pyro3D, Echelon9 (PVS-Studio), Karajorma and Eli2. (If I missed you, don't kill me.)
MASSIVE thanks to Mjn.Mixael and Blue Planet for tireless constant testing.
(It's still not perfect, but it probably wouldn't be where it is at without them)

Spans a lot from initial commit to AP Branch in r6835.

git-svn-id: svn://svn.icculus.org/fs2open/trunk@9561 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:26:06 +10:00

179 lines
3.6 KiB
C++

#include "globalincs/pstypes.h"
#include "pilotfile/pilotfile.h"
#include "ship/ship.h"
#include "stats/medals.h"
pilotfile Pilot;
pilotfile::pilotfile()
{
m_have_flags = false;
m_have_info = false;
m_data_invalid = false;
m_size_offset = 0;
cfp = NULL;
p = NULL;
}
pilotfile::~pilotfile()
{
if (cfp) {
cfclose(cfp);
}
}
void pilotfile::startSection(Section::id section_id)
{
Assert( cfp );
const int zero = 0;
cfwrite_ushort( (ushort)section_id, cfp );
// to be updated when endSection() is called
cfwrite_int(zero, cfp);
// starting offset, for size of section
m_size_offset = cftell(cfp);
}
void pilotfile::endSection()
{
Assert( cfp );
Assert( m_size_offset > 0 );
size_t cur = cftell(cfp);
Assert( cur >= m_size_offset );
size_t section_size = cur - m_size_offset;
if (section_size) {
// go back to section size in file and write proper value
cfseek(cfp, cur - section_size - sizeof(int), CF_SEEK_SET);
cfwrite_int((int)section_size, cfp);
// go back to previous location for next section
cfseek(cfp, cur, CF_SEEK_SET);
}
}
void pilotfile::update_stats(scoring_struct *stats, bool training)
{
int idx, i, j, list_size;
index_list_t ilist;
scoring_special_t *p_stats = NULL;
if (Game_mode & GM_MULTIPLAYER) {
p_stats = &multi_stats;
} else {
p_stats = &all_time_stats;
}
// medals
if (stats->m_medal_earned >= 0) {
list_size = (int)p_stats->medals_earned.size();
j = -1;
for (idx = 0; idx < list_size; idx++) {
if ( p_stats->medals_earned[idx].name.compare(Medals[stats->m_medal_earned].name) ) {
j = idx;
break;
}
}
if (j >= 0) {
p_stats->medals_earned[j].val++;
} else {
ilist.name = Medals[stats->m_medal_earned].name;
ilist.val = 1;
p_stats->medals_earned.push_back(ilist);
}
}
// early out if these stats are from a training mission
if (training) {
return;
}
if (stats->m_promotion_earned >= 0) {
p_stats->rank = stats->m_promotion_earned;
}
p_stats->score += stats->m_score;
p_stats->assists += stats->m_assists;
p_stats->kill_count += stats->m_kill_count;
p_stats->kill_count_ok += stats->m_kill_count_ok;
p_stats->bonehead_kills += stats->m_bonehead_kills;
p_stats->p_shots_fired += stats->mp_shots_fired;
p_stats->p_shots_hit += stats->mp_shots_hit;
p_stats->p_bonehead_hits += stats->mp_bonehead_hits;
p_stats->s_shots_fired += stats->ms_shots_fired;
p_stats->s_shots_hit += stats->ms_shots_hit;
p_stats->s_bonehead_hits += stats->ms_bonehead_hits;
p_stats->flight_time += (unsigned int)f2i(Missiontime);
p_stats->last_backup = p_stats->last_flown;
p_stats->last_flown = stats->last_flown;
p_stats->missions_flown++;
// badges
if (stats->m_badge_earned >= 0) {
list_size = (int)p_stats->medals_earned.size();
j = -1;
for (idx = 0; idx < list_size; idx++) {
if ( p_stats->medals_earned[idx].name.compare(Medals[stats->m_badge_earned].name) ) {
j = idx;
break;
}
}
if (j >= 0) {
p_stats->medals_earned[j].val = 1;
} else {
ilist.name = Medals[stats->m_badge_earned].name;
ilist.val = 1;
p_stats->medals_earned.push_back(ilist);
}
}
// ship kills
for (idx = 0; idx < Num_ship_classes; idx++) {
if (stats->m_okKills[idx] > 0) {
list_size = (int)p_stats->ship_kills.size();
j = -1;
for (i = 0; i < list_size; i++) {
if ( p_stats->ship_kills[i].name.compare(Ship_info[idx].name) ) {
j = i;
break;
}
}
if (j >= 0) {
p_stats->ship_kills[j].val += stats->m_okKills[idx];
} else {
ilist.name = Ship_info[idx].name;
ilist.val = stats->m_okKills[idx];
p_stats->ship_kills.push_back(ilist);
}
}
}
}