jediacademy/code/RMG/RM_Instance.cpp
2013-04-04 17:35:38 -05:00

191 lines
6.2 KiB
C++

#include "../server/exe_headers.h"
#include "rm_headers.h"
#include "../qcommon/cm_terrainmap.h"
/************************************************************************************************
* CRMInstance::CRMInstance
* constructs a instnace object using the given parser group
*
* inputs:
* instance: parser group containing information about the instance
*
* return:
* none
*
************************************************************************************************/
CRMInstance::CRMInstance ( CGPGroup *instGroup, CRMInstanceFile& instFile )
{
mObjective = NULL;
mSpacingRadius = 0;
mFlattenRadius = 0;
mFilter[0] = mTeamFilter[0] = 0;
mArea = NULL;
mAutomapSymbol = 0;
mEntityID = 0;
mSide = 0;
mMirror = 0;
mFlattenHeight = 66;
mSpacingLine = 0;
mSurfaceSprites = true;
mLockOrigin = false;
}
/************************************************************************************************
* CRMInstance::PreSpawn
* Prepares the instance for spawning by flattening the ground under it
*
* inputs:
* landscape: landscape the instance will be spawned on
*
* return:
* true: spawn preparation successful
* false: spawn preparation failed
*
************************************************************************************************/
bool CRMInstance::PreSpawn ( CRandomTerrain* terrain, qboolean IsServer )
{
vec3_t origin;
CArea area;
VectorCopy(GetOrigin(), origin);
if (mMirror)
{
origin[0] = TheRandomMissionManager->GetLandScape()->GetBounds()[0][0] + TheRandomMissionManager->GetLandScape()->GetBounds()[1][0] - origin[0];
origin[1] = TheRandomMissionManager->GetLandScape()->GetBounds()[0][1] + TheRandomMissionManager->GetLandScape()->GetBounds()[1][1] - origin[1];
}
const vec3_t& terxelSize = terrain->GetLandScape()->GetTerxelSize ( );
const vec3pair_t& bounds = terrain->GetLandScape()->GetBounds();
// Align the instance to the center of a terxel
origin[0] = bounds[0][0] + (int)((origin[0] - bounds[0][0] + terxelSize[0] / 2) / terxelSize[0]) * terxelSize[0];
origin[1] = bounds[0][1] + (int)((origin[1] - bounds[0][1] + terxelSize[1] / 2) / terxelSize[1]) * terxelSize[1];
// This is BAD - By copying the mirrored origin back into the instance, you've now mirrored the original instance
// so when anything from this point on looks at the instance they'll be looking at a mirrored version but will be expecting the original
// so later in the spawn functions the instance will be re-mirrored, because it thinks the mInstances have not been changed
// VectorCopy(origin, GetOrigin());
// Flatten the area below the instance
if ( GetFlattenRadius() )
{
area.Init( origin, GetFlattenRadius(), 0.0f, AT_NONE, 0, 0 );
terrain->GetLandScape()->FlattenArea( &area, mFlattenHeight | (mSurfaceSprites?0:0x80), false, true, true );
}
return true;
}
/************************************************************************************************
* CRMInstance::PostSpawn
* Finishes the spawn by linking any objectives into the world that are associated with it
*
* inputs:
* landscape: landscape the instance was spawned on
*
* return:
* true: post spawn successfull
* false: post spawn failed
*
************************************************************************************************/
bool CRMInstance::PostSpawn ( CRandomTerrain* terrain, qboolean IsServer )
{
if ( mObjective )
{
return mObjective->Link ( );
}
return true;
}
#ifndef DEDICATED
void CRMInstance::DrawAutomapSymbol()
{
// draw proper symbol on map for instance
switch (GetAutomapSymbol())
{
default:
case AUTOMAP_NONE:
if (HasObjective())
CM_TM_AddObjective(GetOrigin()[0], GetOrigin()[1], GetSide());
break;
case AUTOMAP_BLD:
CM_TM_AddBuilding(GetOrigin()[0], GetOrigin()[1], GetSide());
if (HasObjective())
CM_TM_AddObjective(GetOrigin()[0], GetOrigin()[1], GetSide());
break;
case AUTOMAP_OBJ:
CM_TM_AddObjective(GetOrigin()[0], GetOrigin()[1], GetSide());
break;
case AUTOMAP_START:
CM_TM_AddStart(GetOrigin()[0], GetOrigin()[1], GetSide());
break;
case AUTOMAP_END:
CM_TM_AddEnd(GetOrigin()[0], GetOrigin()[1], GetSide());
break;
case AUTOMAP_ENEMY:
if (HasObjective())
CM_TM_AddObjective(GetOrigin()[0], GetOrigin()[1]);
if (1 == Cvar_VariableIntegerValue("rmg_automapshowall"))
CM_TM_AddNPC(GetOrigin()[0], GetOrigin()[1], false);
break;
case AUTOMAP_FRIEND:
if (HasObjective())
CM_TM_AddObjective(GetOrigin()[0], GetOrigin()[1]);
if (1 == Cvar_VariableIntegerValue("rmg_automapshowall"))
CM_TM_AddNPC(GetOrigin()[0], GetOrigin()[1], true);
break;
case AUTOMAP_WALL:
CM_TM_AddWallRect(GetOrigin()[0], GetOrigin()[1], GetSide());
break;
}
}
#endif // !DEDICATED
/************************************************************************************************
* CRMInstance::Preview
* Renderings debug information about the instance
*
* inputs:
* none
*
* return:
* none
*
************************************************************************************************/
void CRMInstance::Preview ( const vec3_t from )
{
/* CEntity *tent;
// Add a cylindar for the whole settlement
tent = G_TempEntity( GetOrigin(), EV_DEBUG_CYLINDER );
VectorCopy( GetOrigin(), tent->s.origin2 );
tent->s.pos.trBase[2] += 40;
tent->s.origin2[2] += 50;
tent->s.time = 1050 + ((int)(GetSpacingRadius())<<16);
tent->s.time2 = GetPreviewColor ( );
G_AddTempEntity(tent);
// Origin line
tent = G_TempEntity( GetOrigin ( ), EV_DEBUG_LINE );
VectorCopy( GetOrigin(), tent->s.origin2 );
tent->s.origin2[2] += 400;
tent->s.time = 1050;
tent->s.weapon = 10;
tent->s.time2 = (255<<24) + (255<<16) + (255<<8) + 255;
G_AddTempEntity(tent);
if ( GetFlattenRadius ( ) )
{
// Add a cylindar for the whole settlement
tent = G_TempEntity( GetOrigin(), EV_DEBUG_CYLINDER );
VectorCopy( GetOrigin(), tent->s.origin2 );
tent->s.pos.trBase[2] += 40;
tent->s.origin2[2] += 50;
tent->s.time = 1050 + ((int)(GetFlattenRadius ( ))<<16);
tent->s.time2 = (255<<24) + (80<<16) +(80<<8) + 80;
G_AddTempEntity(tent);
}
*/
}