//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
int CTeamControlPoint::DrawDebugTextOverlays( void ) 
{
	int text_offset = BaseClass::DrawDebugTextOverlays();

	if (m_debugOverlays & OVERLAY_TEXT_BIT) 
	{
		char tempstr[1024];
		Q_snprintf(tempstr, sizeof(tempstr), "INDEX: (%d)", GetPointIndex() );
		EntityText(text_offset,tempstr,0);
		text_offset++;

		Q_snprintf( tempstr, sizeof(tempstr), "Red Previous Points: ");
		for ( int i = 0; i < MAX_PREVIOUS_POINTS; i++ )
		{
			if ( m_TeamData[2].iszPreviousPoint[i] != NULL_STRING )
			{
				Q_strncat( tempstr, STRING(m_TeamData[2].iszPreviousPoint[i]), 1024, COPY_ALL_CHARACTERS );
				Q_strncat( tempstr, ", ", 1024, COPY_ALL_CHARACTERS );
			}
		}
		EntityText(text_offset,tempstr,0);
		text_offset++;

		Q_snprintf( tempstr, sizeof(tempstr), "Blue Previous Points: " );
		for ( int i = 0; i < MAX_PREVIOUS_POINTS; i++ )
		{
			if ( m_TeamData[3].iszPreviousPoint[i] != NULL_STRING )
			{
				Q_strncat( tempstr, STRING(m_TeamData[3].iszPreviousPoint[i]), 1024, COPY_ALL_CHARACTERS );
				Q_strncat( tempstr, ", ", 1024, COPY_ALL_CHARACTERS );
			}
		}
		EntityText(text_offset,tempstr,0);
		text_offset++;

		for ( int i = 0; i < MAX_CONTROL_POINT_TEAMS; i++ )
		{
			if ( ObjectiveResource()->GetBaseControlPointForTeam(i) == GetPointIndex() )
			{
				Q_snprintf(tempstr, sizeof(tempstr), "Base Control Point for Team %d", i );
				EntityText(text_offset,tempstr,0);
				text_offset++;
			}
		}
	}

	return text_offset;
}
//-----------------------------------------------------------------------------
// Purpose: Used by Area caps to set the owner
//-----------------------------------------------------------------------------
void CTeamControlPoint::InputSetOwner( inputdata_t &input )
{
	int iCapTeam = input.value.Int();

	Assert( iCapTeam >= 0 && iCapTeam < GetNumberOfTeams() );

	Assert( input.pCaller );

	if ( GetOwner() == iCapTeam )
		return;

	if ( TeamplayGameRules()->PointsMayBeCaptured() )
	{
		// must be done before setting the owner
		HandleScoring( iCapTeam );

		if ( input.pCaller->IsPlayer() )
		{
			int iCappingPlayer = input.pCaller->entindex();
			InternalSetOwner( iCapTeam, true, 1, &iCappingPlayer );
		}
		else
		{
			InternalSetOwner( iCapTeam, false );
		}

		ObjectiveResource()->SetOwningTeam( GetPointIndex(), m_iTeam );
	}
}
//-----------------------------------------------------------------------------
// Purpose: Used by ControlMaster to this point to its default owner
//-----------------------------------------------------------------------------
void CTeamControlPoint::InputReset( inputdata_t &input )
{
	m_flLastContestedAt = -1;
	InternalSetOwner( m_iDefaultOwner, false );
	ObjectiveResource()->SetOwningTeam( GetPointIndex(), m_iTeam );
	TeamplayRoundBasedRules()->RecalculateControlPointState();
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CTeamControlPoint::InternalSetLocked( bool bLocked )
{
	if ( !bLocked && m_bLocked )
	{
		// unlocked this point
		IGameEvent *event = gameeventmanager->CreateEvent( "teamplay_point_unlocked" );
		if ( event )
		{
			event->SetInt( "cp", m_iPointIndex );
			event->SetString( "cpname", STRING( m_iszPrintName ) );
			event->SetInt( "team", m_iTeam );
			gameeventmanager->FireEvent( event );
		}
	}
	else if ( bLocked && !m_bLocked )
	{
		// locked this point
		IGameEvent *event = gameeventmanager->CreateEvent( "teamplay_point_locked" );
		if ( event )
		{
			event->SetInt( "cp", m_iPointIndex );
			event->SetString( "cpname", STRING( m_iszPrintName ) );
			event->SetInt( "team", m_iTeam );
			gameeventmanager->FireEvent( event );
		}
	}

	m_bLocked = bLocked;

	if ( ObjectiveResource() && GetPointIndex() < ObjectiveResource()->GetNumControlPoints() )
	{
		ObjectiveResource()->SetCPLocked( GetPointIndex(), m_bLocked );
		ObjectiveResource()->SetCPUnlockTime( GetPointIndex(), 0.0f );
	}

	if ( !m_bLocked )
	{
		m_flUnlockTime = -1;
		m_OnUnlocked.FireOutput( this, this );
		SetContextThink( NULL, 0, CONTROL_POINT_UNLOCK_THINK );
	}
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
float CTeamControlPoint::GetTeamCapPercentage( int iTeam )
{
	int iCappingTeam = ObjectiveResource()->GetCappingTeam( GetPointIndex() );
	if ( iCappingTeam == TEAM_UNASSIGNED )
	{
		// No-one's capping this point.
		if ( iTeam == m_iTeam )
			return 1.0;

		return 0.0;
	}

	float flCapPerc = ObjectiveResource()->GetCPCapPercentage( GetPointIndex() );
	if ( iTeam == iCappingTeam )
		return (1.0 - flCapPerc);
	if ( iTeam == m_iTeam )
		return flCapPerc;

	return 0.0;
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CTeamControlPoint::SetOwner( int iCapTeam, bool bMakeSound, int iNumCappers, int *pCappingPlayers )
{
	if ( TeamplayGameRules()->PointsMayBeCaptured() )
	{
		// must be done before setting the owner
		HandleScoring( iCapTeam );

		InternalSetOwner( iCapTeam, bMakeSound, iNumCappers, pCappingPlayers );
		ObjectiveResource()->SetOwningTeam( GetPointIndex(), m_iTeam );
	}
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CTeamControlPoint::InputSetUnlockTime( inputdata_t &inputdata )
{
	// never lock/unlock the point if we're in waiting for players
	if ( TeamplayRoundBasedRules() && TeamplayRoundBasedRules()->IsInWaitingForPlayers() )
		return;

	int nTime = inputdata.value.Int();

	if ( nTime <= 0 )
	{
		InternalSetLocked( false );
		return;
	}

	m_flUnlockTime = gpGlobals->curtime + nTime;

	if ( ObjectiveResource() )
	{
		ObjectiveResource()->SetCPUnlockTime( GetPointIndex(), m_flUnlockTime );
	}

	SetContextThink( &CTeamControlPoint::UnlockThink, gpGlobals->curtime + 0.1, CONTROL_POINT_UNLOCK_THINK );
}
示例#8
0
int main(int argc, char **argv)
{

   cwp_String prefix=NULL; /* Common prefix to build the SPS filenames. */
   cwp_String Rname=NULL;  /* file name for R file                 */
   int numR=0;             /* number of receiver points            */
   FILE *fpR=NULL;         /* file pointer for R file              */
   cwp_String Sname=NULL;  /* file name for S file                 */
   FILE *fpS=NULL;         /* file pointer for S file              */
   int numS=0;             /* number of source points              */
   cwp_String Xname=NULL;  /* file name for X file                 */
   FILE *fpX=NULL;         /* file pointer for X file              */
   int numX=0;             /* number of relation points entries    */
                           /* WARNING: a record can have more than */
                           /*          one relation entry.  E.g. 3D*/
   int rev;                /* SPS revision to process              */

   int   RC;               /* Return code from functions           */
   int   i;                /* Just the "i".                        */
   float scalco;           /* scale factor                         */
   float scalel;           /* scale factor                         */
   float temp;             /* temporary float value                */

   double Xcdp;            /* CDP X Coordinate                     */
   double Ycdp;            /* CDP Y Coordinate                     */
   float ibin;             /* Inline bin size/cdp interval         */
   //float xbin;             /* Xline bin size/ Not used             */

   float dt;               /* sample spacing - I don't need, just check */
   //int nt;                 /* number of points on input trace      */
   cwp_Bool seismic;       /* is this seismic data?      */

   // File control
   int oldfldr;  //  fldr for last trace processed
   int oldskip;  //  still skipping the same fldr?
   int curx;     //  relation entry control
   int curtrl;   //  keeping track of current trace (in case of skip)

   int idxR;     //  Index of receiver station entry
   int idxS;     //  Index of shot point entry
   float recsta; //  receiver station
   //float srcsta; //  source point station

   int nproct = 0; // number of processed traces
   //int nprocf = 0; // number of processed files
        
   /* Initialize */
   initargs(argc, argv);
   requestdoc(1);

   /* Verbose run? */
   if (!getparint("verbose", &verbose))   verbose=0;

   /* get SPS revision to process */
   if (!getparint("rev", &rev))   rev=2;

   /* get inline bin interval     */
   if (!getparfloat("ibin", &ibin))   ibin=0.;

   /* lets prepare the geometry informations */

   /* ==========================================  */
   /* Lets try to get common prefix. ===========  */
   /* ==========================================  */
   getparstring("prefix", &prefix);
   // if ( prefix == NULL )  Who cares?

   /* ==========================================  */
   /* Receiver points information ==============  */
   /* ==========================================  */
   getparstring("rps", &Rname);
   if ( Rname == NULL ) {
      if ( prefix == NULL )
         err("**** Missing required parameter 'rps=', see self-doc");
      //  I have a prefix and need build this file name.
      Rname = calloc(strlen(prefix)+2,sizeof(cwp_String));
      if ( Rname == NULL )
         err("**** Unable to allocate memory for R-File name.");
      strcpy(Rname,prefix);
      strcat(Rname,".r");
   }
   if (verbose)
      warn("Receiver file: %s",Rname);

   fpR = efopen(Rname, "r");
   if ( fpR == NULL )
         err("**** Error opening the receiver information file");

   numR = countRec(fpR, 'R');
   warn("Found %d receiver points entries.",numR);
   if ( numR == 0 )
      err("**** No receiver point information found!!");

   // Allocate area for the receiver informations
   // calloc zero out memory.
   RecInfo = calloc(numR,sizeof(struct PointInfo));
   if ( RecInfo == NULL ){
      err("**** Unable to allocate memory for Receiver Point Informations!!");
   }

   //  Get all Receiver Points info into memory
   RC = getPoints(fpR, 'R', rev, RecInfo);
   if ( RC != numR) {
      warn("Short read for Receiver Point Informations!");
      warn("Read %d receiver points entries instead of expected%d.",RC,numR);
   }
   if (verbose) {
      warn("Stored: %d Receiver Point Informations.",RC);
      for (i=0; i<RC; i++)
          warn("R %10.2f,%10.2f,%4.1f,%10.2lf,%10.2lf,%5.1f",
          RecInfo[i].Line,
          RecInfo[i].Point,
          RecInfo[i].PDepth,
          RecInfo[i].X,
          RecInfo[i].Y,
          RecInfo[i].Elev);
   }


   /* ==========================================  */
   /* Source points information ================  */
   /* ==========================================  */
   getparstring("sps", &Sname);
   if ( Sname == NULL ) {
      if ( prefix == NULL )
         err("**** Missing required parameter 'sps=', see self-doc");
      //  I have a prefix and need build this file name.
      Sname = calloc(strlen(prefix)+2,sizeof(cwp_String));
      if ( Sname == NULL )
         err("**** Unable to allocate memory for S-File name.");
      strcpy(Sname,prefix);
      strcat(Sname,".s");
   }
   if (verbose)
      warn("Source file: %s",Sname);

   fpS = efopen(Sname, "r");
   if ( fpS == NULL )
      err("**** Error opening the source information file");

   numS = countRec(fpS, 'S');
   warn("Found %d source points entries.",numS);
   if ( numS == 0 )
      err("**** No source point information found!!");

   // Allocate area for the Source informations
   // calloc zero out memory.
   SrcInfo = calloc(numS,sizeof(struct PointInfo));
   if ( SrcInfo == NULL ){
      err("**** Unable to allocate memory for Source Point Informations!!");
   }

   //  Get all Source Point info into memory
   RC = getPoints(fpS, 'S', rev, SrcInfo);
   if ( RC != numS) {
      warn("Short read for Source Point Informations!");
      warn("Read %d source point entries instead of expected%d.",RC,numS);
   }
   if (verbose) {
      warn("Stored: %d Source Point Informations.",RC);
      for (i=0; i<RC; i++)
          warn("S %10.2f,%10.2f,%4.1f,%10.2lf,%10.2lf,%5.1f",
          SrcInfo[i].Line,
          SrcInfo[i].Point,
          SrcInfo[i].PDepth,
          SrcInfo[i].X,
          SrcInfo[i].Y,
          SrcInfo[i].Elev);
   }
   /* ------------------------------------------  */

   /* ==========================================  */
   /* Relation (records) information ===========  */
   /* ==========================================  */
   getparstring("xps", &Xname);
   if ( Xname == NULL ) {
      if ( prefix == NULL )
         err("**** Missing required parameter 'xps=', see self-doc");
      //  I have a prefix and need build this file name.
      Xname = calloc(strlen(prefix)+2,sizeof(cwp_String));
      if ( Xname == NULL )
         err("**** Unable to allocate memory for X-File name.");
      strcpy(Xname,prefix);
      strcat(Xname,".x");
   }
   if (verbose)
      warn("Relation file: %s",Xname);

   fpX = efopen(Xname, "r");
   if ( fpX == NULL )
      err("**** Error opening the relation information file");

   numX = countRec(fpX, 'X');
   warn("Found %d relation information entries.",numX);
   if ( numX == 0 )
      err("**** No relation information found!!");

   // Allocate area for the Register informations
   // calloc zero out memory.
   FileInfo = calloc(numX,sizeof(struct RegInfo));
   if ( FileInfo == NULL ){
      err("**** Unable to allocate memory for Registers Informations!!");
   }

   //  Get all Record info into memory
   RC = getFiles(fpX, rev, FileInfo);
   if ( RC != numX) {
      warn("Short read for File Informations!");
      warn("Read %d file entries instead of expected%d.",RC,numX);
   }
   if (verbose) {
      warn("Stored: %d Register Information entries.",RC);
      for (i=0; i<RC; i++)
          warn("X %4d,%1d,%9.1f,%9.1f,%4d,%4d,%1d,%9.1f,%9.1f,%10.1f,%1d",
          FileInfo[i].Num,
          FileInfo[i].Inc,
          FileInfo[i].SLine,
          FileInfo[i].SPoint,
          FileInfo[i].FChan,
          FileInfo[i].TChan,
          FileInfo[i].IncChan,
          FileInfo[i].RLine,
          FileInfo[i].FRecv,
          FileInfo[i].TRecv,
          FileInfo[i].RInc);
   }
   /* ------------------------------------------  */
   /* ==========================================  */
   /* ==========================================  */
   /* ==========================================  */

   /* Get info from first trace */ 
   if (!gettr(&tr))  err("can't get first trace");
   seismic = ISSEISMIC(tr.trid);
   if (seismic) 
   {
      if (verbose)   warn("input is seismic data, trid=%d",tr.trid);
      // dt = ((double) tr.dt)/1000000.0; // Don't use dt
   }
   else 
   {
      if (verbose) warn("input is not seismic data, trid=%d",tr.trid);
      // dt = tr.d1; // Don't use dt
   }

   /* error trapping so that the user can have a default value of dt */
   if (!(dt || getparfloat("dt", &dt))) {
      // dt = .004;  // Don't use dt
      warn("WARNING:  neither dt nor d1 are set, nor is dt getparred!");
      warn("WARNING:  It is not used, just checked!!");
   }

   //nt = tr.ns;
   oldfldr  = 0;  //  fldr for last trace processed
   oldskip = 0;   //  still skipping the same fldr?
   curx = -1;      //  relation entry control
   curtrl = 0;    //  keeping tracl of current trace (in case of skip)

      
   /* ------------------------------------------  */

   /* ==========================================  */
   /* ======  Main loop over traces  ===========  */
   /* ==========================================  */

   do {

      if (tr.fldr != oldfldr) { //  Ok, we have a new fldr.
         // Advance relation entry?
         if 
            (curx+1 < numX && tr.fldr == FileInfo[curx+1].Num) {
            curx++;
            if ( curx == numX ) break;  //  No more relation available.
            // fprintf(stderr,"==> 1-curx %d\n",curx); // Debug
            // Process this one
            if ( verbose )
               warn("** processing fldr=%d",tr.fldr);
            oldfldr = tr.fldr;
            //fprintf(stderr,"==> New file %d: %d\n",curx,tr.fldr); // Debug
         }
         else {  // skip until the next file is found
            if ( tr.fldr != oldskip ) {  //  Skipping new fldr!
               if ( curx+1 == numX) {
                  curx++;
                  break;  //  No more relation available
               }
               warn("** skipping fldr=%d, looking for %d", 
                     tr.fldr,FileInfo[curx+1].Num);
               oldskip = tr.fldr;
            }
            continue;
         }
      }  // (tr.fldr != oldfldr)

      //  Ok, we are processing current fldr
      //  Is this channel within range?
      if ( tr.tracf < FileInfo[curx].FChan ) { // skip this one
         warn("** skipping fldr=%d, tracf=%d, looking for tracf=%d ",
               tr.fldr,tr.tracf,FileInfo[curx].FChan);
         continue;
      }
      else if ( tr.tracf > FileInfo[curx].TChan ) { // <FIXME> still unsure
              if ( curx+1 == numX) { // Is there any more relation info?
                 curx++; // Signal the end of table
                 break;  // Exit, no more relation available
              }
              if ( tr.fldr == FileInfo[curx+1].Num ) { // Is there more info?
                 do {
                    // Advance the register info
                    curx++;
                    if ( tr.tracf >= FileInfo[curx].FChan &&  // If chan ok,
                          tr.tracf <= FileInfo[curx].TChan) { // exit loop
                       break; // Found it
                    }

                 } while (tr.fldr == FileInfo[curx+1].Num);
                 //  Why did I get here?
                 //  do we have a new fldr?
                 if ( tr.tracf < FileInfo[curx].FChan ||
                      tr.tracf > FileInfo[curx].TChan) { // Ok, we have a new fldr.
                    //  skip this trace, look for a new file
                    continue;
                 }

              }
      }

      //  Ok, seems that we are good to process this one.
      //  Lets update the header
      //  We will keep fldr and trcf untoutched
      //  But will update tracl
      curtrl++;
      tr.tracl = curtrl;


      if ( tr.ep == 0 ) // Only if zeroed out, keep otherwise
         tr.ep = FileInfo[curx].SPoint; // No fractionary sp so far.

      tr.cdp = 0;  // not updating it yet

      //  This computes the receiver station 
      //  <FIXME>  Not sure if this use of IncChan is correct. :(
      //  It should group each IncChan channels in a single station
      //  for multicomponent data.  
      recsta = FileInfo[curx].FRecv + 
               (FileInfo[curx].TRecv-FileInfo[curx].FRecv) * 
               ((tr.tracf-FileInfo[curx].FChan)/FileInfo[curx].IncChan)/
               (FileInfo[curx].TChan-FileInfo[curx].FChan);

      //  Get the index of the point at corresponding point  structure
      idxR = GetPointIndex(RecInfo, numR, recsta,FileInfo[curx].RLine);
      idxS = GetPointIndex(SrcInfo, numS, FileInfo[curx].SPoint,
                           FileInfo[curx].SLine);
      // <FIXME> - Take care for information not available!
      // if ( idx[[R|S] < 0 ) { failed!  Skip trace/file! }

      // Avoid division by zero.
      if ( tr.scalel == 0 ) tr.scalel = 1;
      if ( tr.scalco == 0 ) tr.scalco = 1;
      
      // The scale factor
      scalel = 1./tr.scalel;
      scalco = 1./tr.scalco;
      if ( tr.scalel  < 0 )  scalel = -tr.scalel;
      if ( tr.scalco  < 0 )  scalco = -tr.scalco;

      //  Source coordinates
      tr.sx = SrcInfo[idxS].X * scalco;
      tr.sy = SrcInfo[idxS].Y * scalco;
      //  Receiver coordinates
      tr.gx = RecInfo[idxR].X * scalco;
      tr.gy = RecInfo[idxR].Y * scalco;

      if ( ibin != 0 )  {  // compute CDP number

         //  CDP Position (where to store?)
         Xcdp = (RecInfo[idxR].X+SrcInfo[idxS].X)/2.;
         Ycdp = (RecInfo[idxR].Y+SrcInfo[idxS].Y)/2.;

         //  First try for cdp computation.
         //  (may work for 2D straight lines)
         //
         temp = sqrt(pow(Xcdp-RecInfo[0].X,2) + 
                     pow(Ycdp-RecInfo[0].Y,2));
         tr.cdp = 100.5 + temp / ibin;  // 100 is just arbitrary
                                        // .5  if for rounding :P
         // Debug: print cdp# Xcdp Ycdp
         //fprintf(stderr,"cdp %5d  %10.2f  %10.2f\n",tr.cdp,Xcdp,Ycdp);

      }

      // Elevations
      tr.gelev = RecInfo[idxR].Elev * scalel;
      tr.selev = SrcInfo[idxS].Elev * scalel;
      tr.sdepth = SrcInfo[idxS].PDepth * scalel;

      // Offset - The offset signal is just an educated guess.  :/
      tr.offset = sqrt(pow(SrcInfo[idxS].X-RecInfo[idxR].X,2) + 
                       pow(SrcInfo[idxS].Y-RecInfo[idxR].Y,2));
      if ( SrcInfo[idxS].Point > RecInfo[idxR].Point )
         tr.offset = -tr.offset;

      // Assuming all coordinates in UTM projection
      tr.counit = 1;

      tr.sstat = SrcInfo[idxS].StaCor;
      tr.gstat = RecInfo[idxR].StaCor;

      puttr(&tr);
      nproct++; // count processed traces

   } while (gettr(&tr));

   /* ==========================================  */
   /* =========  End of Main loop ==============  */
   /* ==========================================  */

   /* ------------------------------------------  */

   if ( curx >= numX ) {
      warn("***  Last record processed -> fldr %d  ***",oldfldr);
      warn("***  Records after this were discarded ***");
   }

   warn("***  %d traces processed...",nproct);

   return(CWP_Exit());
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CTeamControlPoint::ForceOwner( int iTeam )
{
	InternalSetOwner( iTeam, false, 0, 0 );
	ObjectiveResource()->SetOwningTeam( GetPointIndex(), m_iTeam );
}
//-----------------------------------------------------------------------------
// Purpose: Used by ControlMaster to this point to its default owner
//-----------------------------------------------------------------------------
void CTeamControlPoint::InputReset( inputdata_t &input )
{
	m_flLastContestedAt = -1;
	InternalSetOwner( m_iDefaultOwner, false );
	ObjectiveResource()->SetOwningTeam( GetPointIndex(), m_iTeam );
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CTeamControlPoint::Precache( void )
{
	for ( int i = 0; i < m_TeamData.Count(); i++ )
	{
		// Skip over spectator
		if ( i == TEAM_SPECTATOR )
			continue;

		if ( m_TeamData[i].iszCapSound != NULL_STRING )
		{
			PrecacheScriptSound( STRING(m_TeamData[i].iszCapSound) );
		}

		if ( m_TeamData[i].iszModel != NULL_STRING )
		{
			PrecacheModel( STRING(m_TeamData[i].iszModel) );
		}

		if ( m_TeamData[i].iszIcon != NULL_STRING )
		{
			PrecacheMaterial( STRING( m_TeamData[i].iszIcon ) );
			m_TeamData[i].iIcon = GetMaterialIndex( STRING( m_TeamData[i].iszIcon ) );
			Assert( m_TeamData[i].iIcon != 0 );
		}

		if ( !m_TeamData[i].iIcon )
		{
			Warning( "Invalid hud icon material for team %d in control point '%s' ( point index %d )\n", i, GetDebugName(), GetPointIndex() );
		}

		if ( m_TeamData[i].iszOverlay != NULL_STRING )
		{
			PrecacheMaterial( STRING( m_TeamData[i].iszOverlay ) );
			m_TeamData[i].iOverlay = GetMaterialIndex( STRING( m_TeamData[i].iszOverlay ) );
			Assert( m_TeamData[i].iOverlay != 0 );

			if ( !m_TeamData[i].iOverlay )
			{
				Warning( "Invalid hud overlay material for team %d in control point '%s' ( point index %d )\n", i, GetDebugName(), GetPointIndex() );
			}
		}
	}

	PrecacheScriptSound( STRING( m_iszCaptureStartSound ) );
	PrecacheScriptSound( STRING( m_iszCaptureEndSound ) );
	PrecacheScriptSound( STRING( m_iszCaptureInProgress ) );
	PrecacheScriptSound( STRING( m_iszCaptureInterrupted ) );

	if ( m_iszWarnSound != NULL_STRING )
	{
		PrecacheScriptSound( STRING( m_iszWarnSound ) );
	}

#ifdef TF_DLL
	PrecacheScriptSound( "Announcer.ControlPointContested" );
#endif
}
示例#12
0
// meshes the ps-part between shroud and tip. will start with three nodes
// across the blade and refine it to FINE (ODD), starting at the blade
// curve para. PARA_FINE_LE up to PARA_FINE_TE, then we'll reduce the number
// of nodes to the number of nodes on the te-line
int MeshRR_PSGapRegion(struct Nodelist *n, struct curve *ml,
struct Ilist *pste, struct Ilist *psnod,
struct region *reg, struct region *reg3,
struct region *reg6, int itip)
{
   int i, j;
   int offset, newnodes;
   int first, last, fine_num, coarse_num = 3;
   int steps4reduc, steps4refin;
   static int ifine[4];

   float u1[3], u2[3];
   float p1[3], p2[3], p[3];
   float alpha, beta, scale, shift, ratio;

   struct Ilist *regnodes;

   int OddExamine(int n);
   int RefineChord(struct Flist *arc1, struct Flist *arc2,
      struct Point *line1, struct Point *line2,
      struct Nodelist *n, struct Ilist *regnodes,
      struct Ilist *nodes0, struct Ilist *nodes1,
      struct Ilist *nodes2, float *p, int istart,
      int iend, int fine, int flag
   #ifdef DEBUG_SSGAP
      , FILE *fp
   #endif
      );

#ifdef DEBUG_SSGAP
   char fn[111];
   FILE *fp;
   static int count = 0;

   sprintf(fn,"rr_debugpsgap_%02d.txt", count++);
   if( (fp = fopen(fn,"w+")) == NULL)
   {
      fprintf(stderr,"Shit happened opening file '%s'!\n",fn);
      exit(-1);
   }
   fprintf(fp,"# MeshRR_PSGapRegion %d\n",count);
   fprintf(stderr," MeshRR_PSGapRegion %d\n",count);
#endif

   // mem. check
   for(i = 1; i < reg->numl; i++)
   {
      if(reg->nodes[i])
      {
         FreeIlistStruct(reg->nodes[i]);
         reg->nodes[i] = NULL;
      }
      reg->nodes[i] = AllocIlistStruct(reg->line[i]->nump+1);
   }
   // nodes[0] will be used to store discretization ratios!
   if(reg->nodes[0])
   {
      FreeIlistStruct(reg->nodes[0]);
      reg->nodes[0] = NULL;
   }
   reg->nodes[0] = AllocIlistStruct(reg->line[1]->nump);
   // domain nodes, all of them.
   if(reg->nodes[reg->numl])
   {
      FreeIlistStruct(reg->nodes[reg->numl]);
      reg->nodes[reg->numl+1] = NULL;
   }
   reg->nodes[reg->numl] = AllocIlistStruct(reg->line[3]->nump * reg->line[1]->nump);
   regnodes = reg->nodes[reg->numl];

   offset = n->num;

#ifdef DEBUG_SSGAP
   fprintf(fp,"# offset = %d\n", offset);
#endif

   // **************************************************
   reg->nodes[1] = CopyIlistStruct(reg3->nodes[2]);
   first = reg6->nodes[0]->num - reg->line[3]->nump;
   for(i = reg6->nodes[0]->num-1; i >= first; i--)
   {
      Add2Ilist(reg->nodes[3], reg6->nodes[0]->list[i]);
   }
#ifdef DEBUG_SSGAP
   fprintf(fp,"# reg->line[3]->nump = %d\n",reg->line[3]->nump);
#endif

   Add2Ilist(reg->nodes[2], reg->nodes[1]->list[0]);
   Add2Ilist(regnodes, reg->nodes[1]->list[0]);
   Add2Ilist(reg->nodes[0], 1);

   // get node index for refining domain (more nodes on chord)
   if(itip == 0)
   {
      if( (ifine[0] = GetPointIndex(reg->para[2]->num, reg->para[2]->list, PARA_FINE_LE, 0))
         < coarse_num)
      {
         ifine[0] = coarse_num;
      }
      // get node index for reducing number of nodes per chord
      ifine[2] = GetPointIndex(reg->para[2]->num, reg->para[2]->list, PARA_FINE_TE, ifine[0]);
      ifine[3] = ifine[2];

      // middle value
      ifine[1] = (ifine[2] + ifine[0])/2;
   }                                              // end itip == 0
   // get and check parameters for mesh refinement
   fine_num = FINE;
   if(fine_num < reg->line[3]->nump) fine_num = reg->line[3]->nump;
   if(OddExamine(fine_num) == EVEN) fine_num++;
   steps4refin = (fine_num - coarse_num)/2;       // reduce by 2 nodes per step
   if((steps4reduc = (fine_num - reg->line[3]->nump)/2)
      > reg->line[1]->nump - ifine[2] - 2)
   {
      fatal("not enough nodes alongside blade surface!");
      exit(-1);
   }

#ifdef DEBUG_SSGAP
   fprintf(fp,"# ifine[0], ifine[1], ifine[2]: %d, %d, %d\n",
      ifine[0], ifine[1], ifine[2]);
#endif
   u1[2] = u2[2] = 0.0;
   p1[2] = p2[2] = p[2] = 0.0;
   // **************************************************
   // create nodes on line between cl and blade surface
   // coarse region (3 nodes p. chord), next to leading edge
   u1[0] = reg->arc[1]->list[1] - reg->arc[2]->list[1];
   u1[1] = reg->line[1]->y[1]   - reg->line[2]->y[1];
   p2[0] = reg->arc[2]->list[1] + 0.5 * u1[0];
   p2[1] = reg->line[2]->y[1]   + 0.5 * u1[1];
#ifdef DEBUG_SSGAP
   fprintf(fp," %f   %f\n", reg->arc[2]->list[0], reg->line[2]->y[0]);
   fprintf(fp," %f   %f\n\n", reg->arc[2]->list[1], reg->line[2]->y[1]);
   fprintf(fp," %f   %f\n", reg->arc[1]->list[0], reg->line[1]->y[0]);
   fprintf(fp," %f   %f\n", reg->arc[1]->list[1], reg->line[1]->y[1]);
#endif
   for(i = 2; i <= ifine[0]; i++)
   {
      scale = (float)(i-2)/(float)(ifine[0]-2);
      shift = (1.0 - scale) * SHIFT;
      u1[0] = reg->arc[1]->list[i] - reg->arc[2]->list[i];
      u1[1] = reg->line[1]->y[i]   - reg->line[2]->y[i];
      p1[0] = reg->arc[2]->list[i] + 0.5 * u1[0];
      p1[1] = reg->line[2]->y[i]   + 0.5 * u1[1];
      p[0]  = p2[0] + shift * (p1[0] - p2[0]);
      p[1]  = p2[1] + shift * (p1[1] - p2[1]);
      p2[0] = p1[0];
      p2[1] = p1[1];
      Add2Ilist(reg->nodes[0], 3);
      // node on cl
      Add2Ilist(regnodes, n->num);
      Add2Ilist(reg->nodes[2], n->num);
      AddNode(n, reg->arc[2]->list[i-1], reg->line[2]->y[i-1], 0.0, ARC);
      // new node
      Add2Ilist(regnodes, n->num);
      AddVNode(n, p, ARC);
      // node on blade surface
      Add2Ilist(regnodes, reg->nodes[1]->list[i-1]);

#ifdef DEBUG_SSGAP
      fprintf(fp,"# scale, shift: %f, %f\n", scale, shift);
      fprintf(fp," %f   %f\n", p[0], p[1]);
      fprintf(fp," %f   %f\n", reg->arc[2]->list[i-1], reg->line[2]->y[i-1]);
      fprintf(fp," %f   %f\n\n", reg->arc[2]->list[i], reg->line[2]->y[i]);
      fprintf(fp," %f   %f\n", reg->arc[1]->list[i], reg->line[1]->y[i]);
      fprintf(fp," %f   %f\n", reg->arc[1]->list[i-1], reg->line[1]->y[i-1]);
      fprintf(fp," %f   %f\n", p[0], p[1]);
#endif
   }                                              // i < ifine[0]

   // **************************************************
   // refine
   steps4refin += ifine[0];
   RefineChord(reg->arc[2], reg->arc[1], reg->line[2], reg->line[1],
      n, regnodes, reg->nodes[0], reg->nodes[2], reg->nodes[1],
      p, ifine[0], steps4refin, coarse_num, REFINE
   #ifdef DEBUG_SSGAP
      , fp
   #endif
      );

   // mesh refined region
   first = 1;
   last  = fine_num - 1;
   alpha = M_PI / (float)(last);
   beta  = M_PI / (float)(ifine[2]-steps4refin-1);
   for(i = steps4refin; i < ifine[2]; i++)
   {
      u1[0] = reg->arc[1]->list[i] - reg->arc[2]->list[i];
      u1[1] = reg->line[1]->y[i]   - reg->line[2]->y[i];
      p1[0] = reg->arc[2]->list[i];
      p1[1] = reg->line[2]->y[i];
      Add2Ilist(reg->nodes[0], fine_num);
      Add2Ilist(regnodes, n->num);
      Add2Ilist(reg->nodes[2], n->num);
      AddVNode(n, p1, ARC);
      ratio = sin(beta*(float)(i-steps4refin));
#ifdef DEBUG_SSGAP
      fprintf(fp,"\n# i: %d, ratio = %f\n",i, ratio);
      fprintf(fp," %f   %f\n", p1[0], p1[1]);
#endif
      for(j = first; j < last; j++)
      {
         scale = (1.0 - ratio) * (0.5 * (1.0- cos(alpha*j))) +
            ratio * (float)(j)/(float)(last);
         p[0]  = p1[0] + u1[0] * scale;
         p[1]  = p1[1] + u1[1] * scale;
         Add2Ilist(regnodes, n->num);
         AddVNode(n, p, ARC);
#ifdef DEBUG_SSGAP
         fprintf(fp," %f   %f\n", p[0], p[1]);
#endif
      }
      Add2Ilist(regnodes, reg->nodes[1]->list[i]);
#ifdef DEBUG_SSGAP
      fprintf(fp," %f   %f\n",
         reg->arc[1]->list[i], reg->line[1]->y[i]);
#endif
   }
   // chord center point
   p[0]  = p1[0] + u1[0] * 0.5;
   p[1]  = p1[1] + u1[1] * 0.5;

   // **************************************************
   // coarsening mesh to number of nodes on te.
   // make number of nodes even, if necessary
   if(OddExamine(fine_num - reg->line[3]->nump) == ODD)
   {
#ifdef DEBUG_SSGAP
      fprintf(fp,"\n# fine_num - reg->line[3]->nump = %d\n",
         fine_num - reg->line[3]->nump);
      fprintf(fp,"# --> make number EVEN!\n");
#endif
      // make number of nodes on chord EVEN
      fine_num--;                                 // make fine_num EVEN

      // interface layer
      i = ifine[2]-1;
      shift = 1.0 - INTERFACE_SHIFT;
      fprintf(fp,"# interface nodes\n");
      p1[0] = reg->arc[2]->list[i]
         + shift * (reg->arc[2]->list[ifine[2]]
         - reg->arc[2]->list[i]);
      p1[1] = reg->line[2]->y[i]
         + shift * (reg->line[2]->y[ifine[2]]
         - reg->line[2]->y[i]);
      u1[0] = DELTA*(reg->arc[1]->list[ifine[2]]
         - reg->arc[2]->list[ifine[2]]);
      u1[1] = DELTA*(reg->line[1]->y[ifine[2]]
         - reg->line[2]->y[ifine[2]]);

      Add2Ilist(reg->nodes[0], fine_num);
      Add2Ilist(regnodes, n->num);
      Add2Ilist(reg->nodes[2], n->num);           // extra node on cl!
      AddVNode(n, p1, ARC);
      last = fine_num-1;
#ifdef DEBUG_SSGAP
      fprintf(fp,"# fine_num = %d\n",fine_num);
      fprintf(fp," %f   %f\n", p1[0], p1[1]);
#endif
      for(i = 1; i < fine_num; i++)
      {
         scale = (float)(i)/(float)(last);
         p[0] = p1[0] + scale*u1[0];
         p[1] = p1[1] + scale*u1[1];
         Add2Ilist(regnodes, n->num);
         AddVNode(n, p, ARC);
#ifdef DEBUG_SSGAP
         fprintf(fp," %f   %f\n", p[0], p[1]);
#endif
      }

      // next chord (EVEN number of nodes)
      fprintf(fp,"\n# new chord (no. %d = ifine[2])\n",ifine[2]);
      p1[0] = reg->arc[2]->list[ifine[2]];
      p1[1] = reg->line[2]->y[ifine[2]];
      u1[0] = reg->arc[1]->list[ifine[2]]
         - reg->arc[2]->list[ifine[2]];
      u1[1] = reg->line[1]->y[ifine[2]]
         - reg->line[2]->y[ifine[2]];
      Add2Ilist(reg->nodes[0], fine_num);
      Add2Ilist(regnodes, n->num);
      Add2Ilist(reg->nodes[2], n->num);
      AddVNode(n, p1, ARC);
      alpha = M_PI / (float)(last);
#ifdef DEBUG_SSGAP
      fprintf(fp," %f   %f\n", p1[0], p1[1]);
#endif
      for(i = 1; i < last; i++)
      {
         scale = 0.5 * (1.0 - cos(alpha*i));
         p[0]  = p1[0] + u1[0] * scale;
         p[1]  = p1[1] + u1[1] * scale;
         Add2Ilist(regnodes, n->num);
         AddVNode(n, p, ARC);
#ifdef DEBUG_SSGAP
         fprintf(fp," %f   %f\n", p[0], p[1]);
#endif
      }
      Add2Ilist(regnodes, reg->nodes[1]->list[ifine[2]]);
#ifdef DEBUG_SSGAP
      fprintf(fp," %f   %f\n",
         reg->arc[1]->list[ifine[2]], reg->line[1]->y[ifine[2]]);
#endif

      ifine[2]++;
      p[0] = p1[0] + u1[0] * 0.5;                 // chord center
      p[1] = p1[1] + u1[1] * 0.5;
   }

   // **************************************************
   // reduce number of nodes on chord to line[3]->nump
   steps4reduc += ifine[2];
#ifdef DEBUG_SSGAP
   fprintf(fp,"\n# steps4reduc = %d\n",steps4reduc);
#endif
   RefineChord(reg->arc[2], reg->arc[1], reg->line[2], reg->line[1],
      n, regnodes, reg->nodes[0], reg->nodes[2], reg->nodes[1],
      p, ifine[2], steps4reduc, fine_num, COARSEN
   #ifdef DEBUG_SSGAP
      , fp
   #endif
      );

   // **************************************************
   // mesh rest of blade to trailing edge
   fine_num = reg->line[3]->nump;
   first = 1;
   last  = fine_num - 1;
   for(i = steps4reduc; i < reg->line[2]->nump-1; i++)
   {
      u1[0] = reg->arc[1]->list[i] - reg->arc[2]->list[i];
      u1[1] = reg->line[1]->y[i]   - reg->line[2]->y[i];
      p1[0] = reg->arc[2]->list[i];
      p1[1] = reg->line[2]->y[i];
      Add2Ilist(reg->nodes[0], fine_num);
      Add2Ilist(regnodes, n->num);
      Add2Ilist(reg->nodes[2], n->num);
      AddVNode(n, p1, ARC);
#ifdef DEBUG_SSGAP
      fprintf(fp,"\n# i: %d\n",i);
      fprintf(fp," %f   %f\n", p1[0], p1[1]);
#endif
      for(j = first; j < last; j++)
      {
         scale = (float)(j)/(float)(last);
         p[0]  = p1[0] + u1[0] * scale;
         p[1]  = p1[1] + u1[1] * scale;
         Add2Ilist(regnodes, n->num);
         AddVNode(n, p, ARC);
#ifdef DEBUG_SSGAP
         fprintf(fp," %f   %f   %f\n", p[0], p[1], scale);
#endif
      }
      Add2Ilist(regnodes, reg->nodes[1]->list[i]);
#ifdef DEBUG_SSGAP
      fprintf(fp," %f   %f\n",
         reg->arc[1]->list[i], reg->line[1]->y[i]);
#endif
   }                                              // end i

   // trailing edge nodes
   Add2Ilist(reg->nodes[0], reg->nodes[3]->num);
   Add2Ilist(reg->nodes[2], reg->nodes[3]->list[0]);
   for(i = 0; i < reg->nodes[3]->num; i++)
   {
      Add2Ilist(regnodes, reg->nodes[3]->list[i]);
   }
   Add2Ilist(reg->nodes[1], reg->nodes[3]->list[reg->nodes[3]->num-1]);
   // **************************************************
   // nodes for boundary conditions
   // periodic boundary (ps)
   for(i = 0; i < reg->nodes[2]->num; i++)
   {
      Add2Ilist(pste, reg->nodes[2]->list[i]);
   }
   // solid blade surface
   if(itip == 0)
   {
      for(i = 0; i < regnodes->num; i++)
      {
         Add2Ilist(psnod, regnodes->list[i]);
      }
   }
   // **************************************************
   // final works
   ifine[2] = ifine[3];                           // reset val.
   newnodes = n->num - offset;
   CalcNodeRadius(&n->n[n->num-newnodes], ml, newnodes);
   CalcNodeAngle(&n->n[n->num-newnodes], ml, newnodes);
   // **************************************************

#ifdef DEBUG_SSGAP
   fprintf(fp,"newnodes = %d\n",newnodes);
   fprintf(fp,"pste\n");
   DumpIlist2File(pste, fp);
   fprintf(fp,"psnod\n");
   DumpIlist2File(psnod, fp);

   for(i = 0; i < reg->numl+1; i++)
   {
      fprintf(fp," ** reg->nodes[%d] **\n", i);
      DumpIlist2File(reg->nodes[i], fp);
   }

   fclose(fp);
#endif
   return(0);
}
示例#13
0
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CTeamControlPoint::ForceOwner( int iTeam )
{
	InternalSetOwner( iTeam, false, 0, 0 );
	ObjectiveResource()->SetOwningTeam( GetPointIndex(), m_iTeam );
	TeamplayRoundBasedRules()->RecalculateControlPointState();
}