void CRoomTemplate::LoadFromKeyValues( const char *pRoomName, KeyValues *pKeyValues ) { m_nTilesX = pKeyValues->GetInt( "TilesX", 1 ); m_nTilesY = pKeyValues->GetInt( "TilesY", 1 ); SetSpawnWeight( pKeyValues->GetInt( "SpawnWeight", MIN_SPAWN_WEIGHT ) ); SetFullName( pRoomName ); Q_strncpy( m_Description, pKeyValues->GetString( "RoomTemplateDescription", "" ), m_nMaxDescriptionLength ); Q_strncpy( m_Soundscape, pKeyValues->GetString( "Soundscape", "" ), m_nMaxSoundscapeLength ); SetTileType( pKeyValues->GetInt( "TileType", ASW_TILETYPE_UNKNOWN ) ); m_Tags.RemoveAll(); // search through all the exit subsections KeyValues *pkvSubSection = pKeyValues->GetFirstSubKey(); bool bClearedExits = false; while ( pkvSubSection ) { // mission details if ( Q_stricmp(pkvSubSection->GetName(), "EXIT")==0 ) { if ( !bClearedExits ) { // if we haven't cleared previous exits yet then do so now m_Exits.PurgeAndDeleteElements(); bClearedExits = true; } CRoomTemplateExit *pExit = new CRoomTemplateExit(); pExit->m_iXPos = pkvSubSection->GetInt("XPos"); pExit->m_iYPos = pkvSubSection->GetInt("YPos"); pExit->m_ExitDirection = (ExitDirection_t) pkvSubSection->GetInt("ExitDirection"); pExit->m_iZChange = pkvSubSection->GetInt("ZChange"); Q_strncpy( pExit->m_szExitTag, pkvSubSection->GetString( "ExitTag" ), sizeof( pExit->m_szExitTag ) ); pExit->m_bChokepointGrowSource = !!pkvSubSection->GetInt("ChokeGrow", 0); // discard exits outside the room bounds if ( pExit->m_iXPos < 0 || pExit->m_iYPos < 0 || pExit->m_iXPos >= m_nTilesX || pExit->m_iYPos >= m_nTilesY ) { delete pExit; } else { m_Exits.AddToTail(pExit); } } else if ( Q_stricmp(pkvSubSection->GetName(), "Tags")==0 && TagList() ) { for ( KeyValues *sub = pkvSubSection->GetFirstSubKey(); sub != NULL; sub = sub->GetNextKey() ) { if ( !Q_stricmp( sub->GetName(), "tag" ) ) { AddTag( sub->GetString() ); } } } pkvSubSection = pkvSubSection->GetNextKey(); } }
bool CRoomTemplate::AddTag( const char *szTag ) { if ( !TagList() ) return false; // check it's a valid tag const char *pszFoundTag = TagList()->FindTag( szTag ); if ( !pszFoundTag ) return false; // check we don't have it already if ( HasTag( pszFoundTag ) ) return false; m_Tags.AddToTail( pszFoundTag ); return true; }
Data3D *MtlBlinnInputs3D::ProcessTagList(Request *req, Data3D *data, TagList &tags) { // This is where we would in->GetValue(req) and stored the results in the MtlBlinnData3D object for any unmanaged inputs. if (!data) data = new MtlBlinnData3D(&MtlBlinnData3D::Reg, nil, TagList()); if (data) { FuASSERT(data->IsTypeOf(CLSID_MtlBlinnData), ("")); ProcessBlinnInputs(req, (MtlBlinnData3D *) data); } return BaseClass::ProcessTagList(req, data, tags); }
bool CRoomTemplate::RemoveTag( const char *szTag ) { if ( !TagList() ) return false; for ( int i=0; i<m_Tags.Count(); i++ ) { if ( !Q_stricmp( m_Tags[i], szTag ) ) { m_Tags.Remove( i ); return true; } } return false; }