jedi-outcast/code/game/Q3_Registers.cpp
2013-04-04 09:52:42 -05:00

420 lines
No EOL
8.2 KiB
C++

// leave this line at the top for PCH reasons...
#include "g_headers.h"
#include "g_local.h"
#include "Q3_Registers.h"
extern void Q3_DebugPrint( int level, const char *format, ... );
varString_m varStrings;
varFloat_m varFloats;
varString_m varVectors; //Work around for vector types
int numVariables = 0;
/*
-------------------------
Q3_VariableDeclared
-------------------------
*/
int Q3_VariableDeclared( const char *name )
{
//Check the strings
varString_m::iterator vsi = varStrings.find( name );
if ( vsi != varStrings.end() )
return VTYPE_STRING;
//Check the floats
varFloat_m::iterator vfi = varFloats.find( name );
if ( vfi != varFloats.end() )
return VTYPE_FLOAT;
//Check the vectors
varString_m::iterator vvi = varVectors.find( name );
if ( vvi != varVectors.end() )
return VTYPE_VECTOR;
return VTYPE_NONE;
}
/*
-------------------------
Q3_DeclareVariable
-------------------------
*/
void Q3_DeclareVariable( int type, const char *name )
{
//Cannot declare the same variable twice
if ( Q3_VariableDeclared( name ) != VTYPE_NONE )
return;
if ( numVariables > MAX_VARIABLES )
{
Q3_DebugPrint( WL_ERROR, "too many variables already declared, maximum is %d\n", MAX_VARIABLES );
return;
}
switch( type )
{
case TK_FLOAT:
varFloats[ name ] = 0.0f;
break;
case TK_STRING:
varStrings[ name ] = "NULL";
break;
case TK_VECTOR:
varVectors[ name ] = "0.0 0.0 0.0";
break;
default:
Q3_DebugPrint( WL_ERROR, "unknown 'type' for declare() function!\n" );
return;
break;
}
numVariables++;
}
/*
-------------------------
Q3_FreeVariable
-------------------------
*/
void Q3_FreeVariable( const char *name )
{
//Check the strings
varString_m::iterator vsi = varStrings.find( name );
if ( vsi != varStrings.end() )
{
varStrings.erase( vsi );
numVariables--;
return;
}
//Check the floats
varFloat_m::iterator vfi = varFloats.find( name );
if ( vfi != varFloats.end() )
{
varFloats.erase( vfi );
numVariables--;
return;
}
//Check the strings
varString_m::iterator vvi = varVectors.find( name );
if ( vvi != varVectors.end() )
{
varVectors.erase( vvi );
numVariables--;
return;
}
}
/*
-------------------------
Q3_GetFloatVariable
-------------------------
*/
int Q3_GetFloatVariable( const char *name, float *value )
{
//Check the floats
varFloat_m::iterator vfi = varFloats.find( name );
if ( vfi != varFloats.end() )
{
*value = (*vfi).second;
return true;
}
return false;
}
/*
-------------------------
Q3_GetStringVariable
-------------------------
*/
int Q3_GetStringVariable( const char *name, const char **value )
{
//Check the strings
varString_m::iterator vsi = varStrings.find( name );
if ( vsi != varStrings.end() )
{
*value = (const char *) ((*vsi).second).c_str();
return true;
}
return false;
}
/*
-------------------------
Q3_GetVectorVariable
-------------------------
*/
int Q3_GetVectorVariable( const char *name, vec3_t value )
{
//Check the strings
varString_m::iterator vvi = varVectors.find( name );
if ( vvi != varVectors.end() )
{
const char *str = ((*vvi).second).c_str();
sscanf( str, "%f %f %f", &value[0], &value[1], &value[2] );
return true;
}
return false;
}
/*
-------------------------
Q3_InitVariables
-------------------------
*/
void Q3_InitVariables( void )
{
varStrings.clear();
varFloats.clear();
varVectors.clear();
if ( numVariables > 0 )
Q3_DebugPrint( WL_WARNING, "%d residual variables found!\n", numVariables );
numVariables = 0;
}
/*
-------------------------
Q3_SetVariable_Float
-------------------------
*/
int Q3_SetFloatVariable( const char *name, float value )
{
//Check the floats
varFloat_m::iterator vfi = varFloats.find( name );
if ( vfi == varFloats.end() )
return VTYPE_FLOAT;
(*vfi).second = value;
return true;
}
/*
-------------------------
Q3_SetVariable_String
-------------------------
*/
int Q3_SetStringVariable( const char *name, const char *value )
{
//Check the strings
varString_m::iterator vsi = varStrings.find( name );
if ( vsi == varStrings.end() )
return false;
(*vsi).second = value;
return true;
}
/*
-------------------------
Q3_SetVariable_Vector
-------------------------
*/
int Q3_SetVectorVariable( const char *name, const char *value )
{
//Check the strings
varString_m::iterator vvi = varVectors.find( name );
if ( vvi == varVectors.end() )
return false;
(*vvi).second = value;
return true;
}
/*
-------------------------
Q3_VariableSaveFloats
-------------------------
*/
void Q3_VariableSaveFloats( varFloat_m &fmap )
{
int numFloats = fmap.size();
gi.AppendToSaveGame( 'FVAR', &numFloats, sizeof( numFloats ) );
varFloat_m::iterator vfi;
STL_ITERATE( vfi, fmap )
{
//Save out the map id
int idSize = strlen( ((*vfi).first).c_str() );
//Save out the real data
gi.AppendToSaveGame( 'FIDL', &idSize, sizeof( idSize ) );
gi.AppendToSaveGame( 'FIDS', (void *) ((*vfi).first).c_str(), idSize );
//Save out the float value
gi.AppendToSaveGame( 'FVAL', &((*vfi).second), sizeof( float ) );
}
}
/*
-------------------------
Q3_VariableSaveStrings
-------------------------
*/
void Q3_VariableSaveStrings( varString_m &smap )
{
int numStrings = smap.size();
gi.AppendToSaveGame( 'SVAR', &numStrings, sizeof( numStrings ) );
varString_m::iterator vsi;
STL_ITERATE( vsi, smap )
{
//Save out the map id
int idSize = strlen( ((*vsi).first).c_str() );
//Save out the real data
gi.AppendToSaveGame( 'SIDL', &idSize, sizeof( idSize ) );
gi.AppendToSaveGame( 'SIDS', (void *) ((*vsi).first).c_str(), idSize );
//Save out the string value
idSize = strlen( ((*vsi).second).c_str() );
gi.AppendToSaveGame( 'SVSZ', &idSize, sizeof( idSize ) );
gi.AppendToSaveGame( 'SVAL', (void *) ((*vsi).second).c_str(), idSize );
}
}
/*
-------------------------
Q3_VariableSave
-------------------------
*/
int Q3_VariableSave( void )
{
Q3_VariableSaveFloats( varFloats );
Q3_VariableSaveStrings( varStrings );
Q3_VariableSaveStrings( varVectors);
return qtrue;
}
/*
-------------------------
Q3_VariableLoadFloats
-------------------------
*/
void Q3_VariableLoadFloats( varFloat_m &fmap )
{
int numFloats;
char tempBuffer[1024];
gi.ReadFromSaveGame( 'FVAR', &numFloats, sizeof( numFloats ) );
for ( int i = 0; i < numFloats; i++ )
{
int idSize;
gi.ReadFromSaveGame( 'FIDL', &idSize, sizeof( idSize ) );
gi.ReadFromSaveGame( 'FIDS', &tempBuffer, idSize );
tempBuffer[ idSize ] = 0;
float val;
gi.ReadFromSaveGame( 'FVAL', &val, sizeof( float ) );
Q3_DeclareVariable( TK_FLOAT, (const char *) &tempBuffer );
Q3_SetFloatVariable( (const char *) &tempBuffer, val );
}
}
/*
-------------------------
Q3_VariableLoadStrings
-------------------------
*/
void Q3_VariableLoadStrings( int type, varString_m &fmap )
{
int numFloats;
char tempBuffer[1024];
char tempBuffer2[1024];
gi.ReadFromSaveGame( 'SVAR', &numFloats, sizeof( numFloats ) );
for ( int i = 0; i < numFloats; i++ )
{
int idSize;
gi.ReadFromSaveGame( 'SIDL', &idSize, sizeof( idSize ) );
gi.ReadFromSaveGame( 'SIDS', &tempBuffer, idSize );
tempBuffer[ idSize ] = 0;
gi.ReadFromSaveGame( 'SVSZ', &idSize, sizeof( idSize ) );
gi.ReadFromSaveGame( 'SVAL', &tempBuffer2, idSize );
tempBuffer2[ idSize ] = 0;
switch ( type )
{
case TK_STRING:
Q3_DeclareVariable( TK_STRING, (const char *) &tempBuffer );
Q3_SetStringVariable( (const char *) &tempBuffer, (const char *) &tempBuffer2 );
break;
case TK_VECTOR:
Q3_DeclareVariable( TK_VECTOR, (const char *) &tempBuffer );
Q3_SetVectorVariable( (const char *) &tempBuffer, (const char *) &tempBuffer2 );
break;
}
}
}
/*
-------------------------
Q3_VariableLoad
-------------------------
*/
int Q3_VariableLoad( void )
{
Q3_InitVariables();
Q3_VariableLoadFloats( varFloats );
Q3_VariableLoadStrings( TK_STRING, varStrings );
Q3_VariableLoadStrings( TK_VECTOR, varVectors);
return qfalse;
}