Void GameplayManager::SavePlayerTown( const PlayerTown * pPlayerTown ) const
{
    // Build file name
    GChar strFileName[PATHNAME_LENGTH + 1];
    GChar strFullPath[PATHNAME_LENGTH + 1];
    StringFn->Format( strFileName, TEXT("%s.xml"), pPlayerTown->GetName() );
    StringFn->Format( strFullPath, TEXT("%s/%s"), GAMEPLAY_PLAYERTOWNFILES_PATH, strFileName );

    // Check file existence
    GChar strTempPath[PATHNAME_LENGTH + 1];
    Bool bFileExists = SystemFn->SearchFile( strTempPath, PATHNAME_LENGTH, GAMEPLAY_PLAYERTOWNFILES_PATH, strFileName );
    if ( bFileExists ) {
        // Move to a temp file
        StringFn->Format( strTempPath, TEXT("%s.tmp"), strFullPath );
        SystemFn->MoveFile( strTempPath, strFullPath, true );
    }

    // Save to XML
    XMLDocument * pPlayerTownFile = XMLDocument::CreateDocument( TEXT("PlayerTown"), XML_VERSION );
    pPlayerTown->Save( pPlayerTownFile );

    // Render XML to file
    Bool bRendered = pPlayerTownFile->Render( strFullPath );
    Assert( bRendered );

    // Destroy temp file (old version)
    if ( bFileExists ) {
        Bool bDestroyed = SystemFn->DestroyFile( strTempPath );
        Assert( bDestroyed );
    }

    // Release XML document
    XMLDocument::DestroyDocument( pPlayerTownFile );
    pPlayerTownFile = NULL;
}
PlayerTown * GameplayManager::CreatePlayerTown( const GChar * strTownName ) const
{
    // Build file name
    GChar strFileName[PATHNAME_LENGTH + 1];
    GChar strFullPath[PATHNAME_LENGTH + 1];
    StringFn->Format( strFileName, TEXT("%s.xml"), strTownName );
    StringFn->Format( strFullPath, TEXT("%s/%s"), GAMEPLAY_PLAYERTOWNFILES_PATH, strFileName );

    // Check file existence
    GChar strTempPath[PATHNAME_LENGTH + 1];
    Bool bFileExists = SystemFn->SearchFile( strTempPath, PATHNAME_LENGTH, GAMEPLAY_PLAYERTOWNFILES_PATH, strFileName );
    if ( bFileExists )
        return NULL; // name already taken !

    // Create resource
    SelectMemory( TEXT("Scratch") );
    PlayerTown * pPlayerTown = New PlayerTown( strTownName );
    UnSelectMemory();

    // Save to XML
    XMLDocument * pPlayerTownFile = XMLDocument::CreateDocument( TEXT("PlayerTown"), XML_VERSION );
    pPlayerTown->Save( pPlayerTownFile );

    // Render XML to file
    Bool bRendered = pPlayerTownFile->Render( strFullPath );
    Assert( bRendered );

    // Release XML document
    XMLDocument::DestroyDocument( pPlayerTownFile );
    pPlayerTownFile = NULL;

    // Done
    return pPlayerTown;
}