228 lines
5.3 KiB
C++
228 lines
5.3 KiB
C++
|
|
#include "../idlib/precompiled.h"
|
|
#pragma hdrstop
|
|
|
|
#include "Game_local.h"
|
|
#include "Game_Log.h"
|
|
|
|
/*
|
|
===============================================================================
|
|
|
|
rvGameLog
|
|
|
|
===============================================================================
|
|
*/
|
|
|
|
rvGameLogLocal gameLogLocal;
|
|
rvGameLog* gameLog = &gameLogLocal;
|
|
|
|
/*
|
|
================
|
|
rvGameLogLocal::rvGameLogLocal
|
|
================
|
|
*/
|
|
rvGameLogLocal::rvGameLogLocal ( ) {
|
|
initialized = false;
|
|
}
|
|
|
|
/*
|
|
================
|
|
rvGameLogLocal::Init
|
|
================
|
|
*/
|
|
void rvGameLogLocal::Init ( void ) {
|
|
file = NULL;
|
|
indexCount = 0;
|
|
initialized = true;
|
|
|
|
index.Clear ( );
|
|
frame.Clear ( );
|
|
oldframe.Clear ( );
|
|
}
|
|
|
|
/*
|
|
================
|
|
rvGameLogLocal::Shutdown
|
|
================
|
|
*/
|
|
void rvGameLogLocal::Shutdown ( void ) {
|
|
index.Clear ( );
|
|
frame.Clear ( );
|
|
oldframe.Clear ( );
|
|
|
|
if ( initialized && file ) {
|
|
const char* out;
|
|
out = va(":%d %d", gameLocal.time, gameLocal.framenum );
|
|
file->Write ( out, strlen ( out ) );
|
|
file->Flush ( );
|
|
fileSystem->CloseFile ( file );
|
|
file = NULL;
|
|
}
|
|
initialized = false;
|
|
}
|
|
|
|
/*
|
|
================
|
|
rvGameLogLocal::BeginFrame
|
|
================
|
|
*/
|
|
void rvGameLogLocal::BeginFrame ( int time ) {
|
|
// See if logging has been turned on or not
|
|
if ( g_gamelog.GetBool ( ) != initialized ) {
|
|
if ( initialized ) {
|
|
Shutdown ( );
|
|
return;
|
|
} else {
|
|
Init ( );
|
|
}
|
|
} else if ( !g_gamelog.GetBool ( ) ) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
rvGameLogLocal::EndFrame
|
|
================
|
|
*/
|
|
void rvGameLogLocal::EndFrame ( void ) {
|
|
int i;
|
|
const char* out;
|
|
bool wroteTime;
|
|
|
|
// Dont do anything if not logging
|
|
if ( !g_gamelog.GetBool ( ) ) {
|
|
return;
|
|
}
|
|
|
|
// When not in multiplayer, log the players approx origin and viewangles
|
|
if ( !gameLocal.isMultiplayer ) {
|
|
idPlayer* player;
|
|
player = gameLocal.GetLocalPlayer ( );
|
|
if ( player ) {
|
|
Set ( "player0_origin", va("%d %d %d", (int)player->GetPhysics()->GetOrigin()[0], (int)player->GetPhysics()->GetOrigin()[1], (int)player->GetPhysics()->GetOrigin()[2] ) );
|
|
Set ( "player0_angles_yaw", va("%g", (float)player->viewAngles[YAW] ) );
|
|
Set ( "player0_angles_pitch", va("%g", (float)player->viewAngles[PITCH] ) );
|
|
Set ( "player0_buttons", player->usercmd.buttons );
|
|
Set ( "player0_health", player->health );
|
|
Set ( "player0_armor", player->inventory.armor );
|
|
}
|
|
}
|
|
|
|
if ( !file ) {
|
|
idStr mapName;
|
|
idStr filename;
|
|
mapName = gameLocal.serverInfo.GetString( "si_map" );
|
|
mapName.StripFileExtension ( );
|
|
filename = "logs/" + mapName + "/" + cvarSystem->GetCVarString("win_username") + "_";
|
|
|
|
// Find a unique filename
|
|
for ( i = 0; fileSystem->ReadFile( filename + va("%06d.log", i ), NULL, NULL ) > 0; i ++ );
|
|
|
|
// Actually open the file now
|
|
file = fileSystem->OpenFileWrite ( filename + va("%06d.log", i ), "fs_cdpath" );
|
|
if ( !file ) {
|
|
return;
|
|
}
|
|
|
|
timer_fps.Stop( );
|
|
timer_fps.Clear ( );
|
|
timer_fps.Start ( );
|
|
} else {
|
|
static int fpsIndex;
|
|
static float fpsValue[4];
|
|
|
|
timer_fps.Stop ( );
|
|
fpsValue[(fpsIndex++)%4] = 1000.0f / (timer_fps.Milliseconds ( ) + 1);
|
|
if ( fpsIndex >= 4 ) {
|
|
GAMELOG_SET ( "fps", Min(60,(int)((int)(fpsValue[0] + fpsValue[1] + fpsValue[2] + fpsValue[3]) / 40.0f) * 10) );
|
|
}
|
|
timer_fps.Clear ( );
|
|
timer_fps.Start ( );
|
|
}
|
|
|
|
// Write out any new indexes that were added this frame
|
|
for ( ; indexCount < index.Num(); indexCount ++ ) {
|
|
const char* out;
|
|
out = va("#%d ", indexCount );
|
|
file->Write ( out, strlen ( out ) );
|
|
file->Write ( index[indexCount].c_str(), index[indexCount].Length() );
|
|
file->Write ( "\r\n", 2 );
|
|
}
|
|
|
|
// Write out any data that was added this frame
|
|
wroteTime = false;
|
|
for ( i = frame.Num() - 1; i >= 0; i -- ) {
|
|
// TODO: filter
|
|
if ( oldframe[i] != frame[i] ) {
|
|
if ( !wroteTime ) {
|
|
out = va(":%d %d", gameLocal.time, gameLocal.framenum );
|
|
file->Write ( out, strlen ( out ) );
|
|
wroteTime = true;
|
|
}
|
|
out = va(" %d \"", i );
|
|
file->Write ( out, strlen(out) );
|
|
file->Write ( frame[i].c_str(), frame[i].Length ( ) );
|
|
file->Write ( "\"", 1 );
|
|
oldframe[i] = frame[i];
|
|
}
|
|
}
|
|
|
|
if ( wroteTime ) {
|
|
file->Write ( "\r\n", 2 );
|
|
file->Flush ( );
|
|
}
|
|
|
|
// Clear the frame for next time
|
|
for ( i = index.Num() - 1; i >= 0; i -- ) {
|
|
frame[i] = "";
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
rvGameLogLocal::Set
|
|
================
|
|
*/
|
|
void rvGameLogLocal::Set ( const char* keyword, const char* value ) {
|
|
int i;
|
|
i = index.AddUnique ( keyword );
|
|
frame.SetNum ( index.Num(), true );
|
|
oldframe.SetNum ( index.Num(), true );
|
|
frame[i] = value;
|
|
}
|
|
|
|
void rvGameLogLocal::Set ( const char* keyword, int value ) {
|
|
Set ( keyword, va("%d", value ) );
|
|
}
|
|
|
|
void rvGameLogLocal::Set ( const char* keyword, float value ) {
|
|
Set ( keyword, va("%g", value ) );
|
|
}
|
|
|
|
void rvGameLogLocal::Set ( const char* keyword, bool value ) {
|
|
Set ( keyword, va("%d", (int)value ) );
|
|
}
|
|
|
|
/*
|
|
================
|
|
rvGameLogLocal::Add
|
|
================
|
|
*/
|
|
void rvGameLogLocal::Add ( const char* keyword, int value ) {
|
|
int i;
|
|
i = index.AddUnique ( keyword );
|
|
frame.SetNum ( index.Num(), true );
|
|
oldframe.SetNum ( index.Num(), true );
|
|
frame[i] = va("%d",atoi(frame[i].c_str()) + value );
|
|
}
|
|
|
|
void rvGameLogLocal::Add ( const char* keyword, float value ) {
|
|
int i;
|
|
i = index.AddUnique ( keyword );
|
|
frame.SetNum ( index.Num(), true );
|
|
oldframe.SetNum ( index.Num(), true );
|
|
frame[i] = va("%g",atof(frame[i].c_str()) + value );
|
|
}
|
|
|
|
|