108 lines
2.2 KiB
C++
108 lines
2.2 KiB
C++
|
/*
|
||
|
game_worldspawn.cpp
|
||
|
|
||
|
Worldspawn class. Each map has one worldspawn which handles global spawnargs.
|
||
|
|
||
|
*/
|
||
|
|
||
|
#include "../idlib/precompiled.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "Game_local.h"
|
||
|
|
||
|
/*
|
||
|
================
|
||
|
idWorldspawn
|
||
|
|
||
|
Every map should have exactly one worldspawn.
|
||
|
================
|
||
|
*/
|
||
|
CLASS_DECLARATION( idEntity, idWorldspawn )
|
||
|
EVENT( EV_Remove, idWorldspawn::Event_Remove )
|
||
|
EVENT( EV_SafeRemove, idWorldspawn::Event_Remove )
|
||
|
END_CLASS
|
||
|
|
||
|
/*
|
||
|
================
|
||
|
idWorldspawn::Spawn
|
||
|
================
|
||
|
*/
|
||
|
void idWorldspawn::Spawn( void ) {
|
||
|
idStr scriptname;
|
||
|
idThread *thread;
|
||
|
const function_t *func;
|
||
|
const idKeyValue *kv;
|
||
|
|
||
|
assert( gameLocal.world == NULL );
|
||
|
gameLocal.world = this;
|
||
|
|
||
|
// load script
|
||
|
scriptname = gameLocal.GetMapName();
|
||
|
scriptname.SetFileExtension( ".script" );
|
||
|
if ( fileSystem->ReadFile( scriptname, NULL, NULL ) > 0 ) {
|
||
|
gameLocal.program.CompileFile( scriptname );
|
||
|
|
||
|
// call the main function by default
|
||
|
func = gameLocal.program.FindFunction( "main" );
|
||
|
if ( func != NULL ) {
|
||
|
thread = new idThread( func );
|
||
|
thread->DelayedStart( 0 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// call any functions specified in worldspawn
|
||
|
kv = spawnArgs.MatchPrefix( "call" );
|
||
|
while( kv != NULL ) {
|
||
|
func = gameLocal.program.FindFunction( kv->GetValue() );
|
||
|
if ( func == NULL ) {
|
||
|
gameLocal.Error( "Function '%s' not found in script for '%s' key on worldspawn", kv->GetValue().c_str(), kv->GetKey().c_str() );
|
||
|
}
|
||
|
|
||
|
thread = new idThread( func );
|
||
|
thread->DelayedStart( 0 );
|
||
|
kv = spawnArgs.MatchPrefix( "call", kv );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
=================
|
||
|
idWorldspawn::Save
|
||
|
=================
|
||
|
*/
|
||
|
void idWorldspawn::Save( idRestoreGame *savefile ) {
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
=================
|
||
|
idWorldspawn::Restore
|
||
|
=================
|
||
|
*/
|
||
|
void idWorldspawn::Restore( idRestoreGame *savefile ) {
|
||
|
assert( gameLocal.world == this );
|
||
|
|
||
|
// RAVEN BEGIN
|
||
|
// bdube: gravity change
|
||
|
g_gravity.SetFloat( spawnArgs.GetFloat( "gravity", va( "%f", DEFAULT_GRAVITY) ) );
|
||
|
// RAVEN END
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
================
|
||
|
idWorldspawn::~idWorldspawn
|
||
|
================
|
||
|
*/
|
||
|
idWorldspawn::~idWorldspawn() {
|
||
|
if ( gameLocal.world == this ) {
|
||
|
gameLocal.world = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
================
|
||
|
idWorldspawn::Event_Remove
|
||
|
================
|
||
|
*/
|
||
|
void idWorldspawn::Event_Remove( void ) {
|
||
|
gameLocal.Error( "Tried to remove world" );
|
||
|
}
|