#include "tier1/commandline.h" #include "tier1/utlstring.h" #include "tier0/lib.h" #include "console.h" #include "filesystem.h" #include "rendering.h" #include "engine.h" #include "baseentity.h" #include "server.h" #include "physics.h" #ifdef __linux #include "signal.h" #endif double fPrev = 0; double fCurrent = 0; //----------------------------------------------------------------------------- // Purpose: Engine entry point //----------------------------------------------------------------------------- extern "C" void FunnyMain( int argc, char **argv ) { ICommandLine::CreateCommandLine(argc, argv); IEngine::Init(); for (;;) { fPrev = fCurrent; fCurrent = Plat_GetTime(); IEngine::Frame(fCurrent-fPrev); }; /* deinit is handled explicitly */ }; void IEngine_Signal(int sig) { printf("Trapped signal %i\n",sig); switch (sig) { case SIGSEGV: case SIGILL: case SIGABRT: printf("Consider running app with debugger attached\n"); Plat_Backtrace(); break; default: break; }; IEngine::Shutdown(); _exit(0); }; funnyphysics *px; void IEngine::Init() { /* trap signals */ #ifdef __linux signal(SIGHUP, IEngine_Signal); signal(SIGINT, IEngine_Signal); signal(SIGQUIT, IEngine_Signal); signal(SIGILL, IEngine_Signal); signal(SIGTRAP, IEngine_Signal); signal(SIGIOT, IEngine_Signal); signal(SIGBUS, IEngine_Signal); signal(SIGFPE, IEngine_Signal); signal(SIGSEGV, IEngine_Signal); signal(SIGTERM, IEngine_Signal); #endif IFileSystem::InitFilesystem(); IVideo::Init(); px = px_init(); IServer::LoadGame("funnygame"); }; void IEngine::Frame(float fDelta) { IServer::Think(fDelta); IVideo::Frame(fDelta); }; void IEngine::Shutdown() { }; void IIEngine::PrecacheModel( const char *psz ) { } void IIEngine::PrecacheSound( const char *psz ) { } CBaseEntity *IIEngine::SpawnEntity( const char *szName ) { V_printf("%s\n", szName); for (auto &entity: g_RegisteredEntities) { if (!V_strcmp(entity->m_szName, szName)) { CBaseEntity *pEnt = entity->m_pfn(); pEnt->Spawn(); g_entities.AppendTail(pEnt); if (entity->m_pClientfn) { pEnt->pClientEntity = entity->m_pClientfn(); pEnt->pClientEntity->Spawn(); pEnt->pClientEntity->pEntity = pEnt; } return pEnt; } } return 0; }; void IIEngine::DestroyEntity( CBaseEntity *pEntity ) { };