This commit is contained in:
Riley Labrecque
2014-07-10 21:55:06 +03:00
parent 279af31877
commit f4d127e335
38 changed files with 527 additions and 51 deletions
+223 -1
View File
@@ -51,7 +51,8 @@ CSpaceWarClient::CSpaceWarClient( IGameEngine *pGameEngine ) :
m_SteamServerConnectFailure( this, &CSpaceWarClient::OnSteamServerConnectFailure ),
m_GameJoinRequested( this, &CSpaceWarClient::OnGameJoinRequested ),
m_CallbackGameOverlayActivated( this, &CSpaceWarClient::OnGameOverlayActivated ),
m_CallbackGameWebCallback( this, &CSpaceWarClient::OnGameWebCallback )
m_CallbackGameWebCallback( this, &CSpaceWarClient::OnGameWebCallback ),
m_CallbackWorkshopItemInstalled( this, &CSpaceWarClient::OnWorkshopItemInstalled )
{
Init( pGameEngine );
}
@@ -128,6 +129,12 @@ void CSpaceWarClient::Init( IGameEngine *pGameEngine )
// Initialize sun
m_pSun = new CSun( pGameEngine );
m_nNumWorkshopItems = 0;
for (uint32 i = 0; i < MAX_WORKSHOP_ITEMS; ++i)
{
m_rgpWorkshopItems[i] = NULL;
}
// initialize P2P auth engine
m_pP2PAuthedGame = new CP2PAuthedGame( m_pGameEngine );
@@ -148,6 +155,8 @@ void CSpaceWarClient::Init( IGameEngine *pGameEngine )
// P2P voice chat
m_pVoiceChat = new CVoiceChat( pGameEngine );
LoadWorkshopItems();
}
@@ -203,6 +212,15 @@ CSpaceWarClient::~CSpaceWarClient()
m_rgpShips[i] = NULL;
}
}
for (uint32 i = 0; i < MAX_WORKSHOP_ITEMS; ++i)
{
if ( m_rgpWorkshopItems[i] )
{
delete m_rgpWorkshopItems[i];
m_rgpWorkshopItems[i] = NULL;
}
}
}
@@ -1304,6 +1322,14 @@ void CSpaceWarClient::RunFrame()
if ( bEscapePressed )
SetGameState( k_EClientGameMenu );
break;
case k_EClientWorkshop:
m_pStarField->Render();
DrawWorkshopItems();
if (bEscapePressed)
SetGameState(k_EClientGameMenu);
break;
case k_EClientStatsAchievements:
m_pStarField->Render();
m_pStatsAndAchievements->Render();
@@ -1389,6 +1415,14 @@ void CSpaceWarClient::RunFrame()
if ( m_rgpShips[i] )
m_rgpShips[i]->RunFrame();
}
for (uint32 i = 0; i < MAX_WORKSHOP_ITEMS; ++i)
{
if (m_rgpWorkshopItems[i])
m_rgpWorkshopItems[i]->RunFrame();
}
DrawHUDText();
m_pStatsAndAchievements->RunFrame();
@@ -1503,6 +1537,13 @@ void CSpaceWarClient::RunFrame()
if ( m_rgpShips[i] )
m_rgpShips[i]->Render();
}
for (uint32 i = 0; i < MAX_WORKSHOP_ITEMS; ++i)
{
if ( m_rgpWorkshopItems[i] )
m_rgpWorkshopItems[i]->Render();
}
break;
default:
// Any needed drawing was already done above before server updates
@@ -2003,3 +2044,184 @@ void CSpaceWarClient::ExecCommandLineConnect( const char *pchServerAddress, cons
}
}
}
//-----------------------------------------------------------------------------
// Purpose: parse CWorkshopItem from text file
//-----------------------------------------------------------------------------
CWorkshopItem *CSpaceWarClient::LoadWorkshopItemFromFile( const char *pszFileName )
{
FILE *file = fopen( pszFileName, "rt");
if (!file)
return NULL;
CWorkshopItem *pItem = NULL;
char szLine[1024];
if ( fgets(szLine, sizeof(szLine), file) )
{
float flXPos, flYPos, flXVelocity, flYVelocity;
// initialize object
if ( sscanf(szLine, "%f %f %f %f", &flXPos, &flYPos, &flXVelocity, &flYVelocity) )
{
pItem = new CWorkshopItem( m_pGameEngine, 0 );
pItem->SetPosition( flXPos, flYPos );
pItem->SetVelocity( flXVelocity, flYVelocity );
while (!feof(file))
{
float xPos0, yPos0, xPos1, yPos1;
DWORD dwColor;
fgets(szLine, sizeof(szLine), file);
if (sscanf(szLine, "%f %f %f %f %x", &xPos0, &yPos0, &xPos1, &yPos1, &dwColor) >= 5)
{
// Add a line to the entity
pItem->AddLine(xPos0, yPos0, xPos1, yPos1, dwColor);
}
}
}
}
fclose(file);
return pItem;
}
//-----------------------------------------------------------------------------
// Purpose: load a Workshop item by PublishFileID
//-----------------------------------------------------------------------------
bool CSpaceWarClient::LoadWorkshopItem( PublishedFileId_t workshopItemID )
{
if ( m_nNumWorkshopItems == MAX_WORKSHOP_ITEMS )
return false; // too much
uint64 unSizeOnDisk = 0;
char szItemFolder[1024] = { 0 };
if ( !SteamUGC()->GetItemInstallInfo( workshopItemID, &unSizeOnDisk, szItemFolder, sizeof(szItemFolder) ) )
return false;
char szFile[1024];
_snprintf(szFile, sizeof(szFile), "%s/workshopitem.txt", szItemFolder);
CWorkshopItem *pItem = LoadWorkshopItemFromFile( szFile );
if ( !pItem )
return false;
pItem->m_ItemDetails.m_nPublishedFileId = workshopItemID;
m_rgpWorkshopItems[m_nNumWorkshopItems++] = pItem;
// get Workshop item details
SteamAPICall_t hSteamAPICall = SteamUGC()->RequestUGCDetails( workshopItemID, 60 );
pItem->m_SteamCallResultUGCDetails.Set(hSteamAPICall, pItem, &CWorkshopItem::OnUGCDetailsResult);
return true;
}
//-----------------------------------------------------------------------------
// Purpose: load all subscribed workshop items
//-----------------------------------------------------------------------------
void CSpaceWarClient::LoadWorkshopItems()
{
// reset workshop Items
for (uint32 i = 0; i < MAX_WORKSHOP_ITEMS; ++i)
{
if ( m_rgpWorkshopItems[i] )
{
delete m_rgpWorkshopItems[i];
m_rgpWorkshopItems[i] = NULL;
}
}
m_nNumWorkshopItems = 0; // load default test item
PublishedFileId_t vecSubscribedItems[MAX_WORKSHOP_ITEMS];
int numSubscribedItems = SteamUGC()->GetSubscribedItems( vecSubscribedItems, MAX_WORKSHOP_ITEMS );
if ( numSubscribedItems > MAX_WORKSHOP_ITEMS )
numSubscribedItems = MAX_WORKSHOP_ITEMS; // crop
// load all subscribed workshop items
for ( int iSubscribedItem=0; iSubscribedItem<numSubscribedItems; iSubscribedItem++ )
{
PublishedFileId_t workshopItemID = vecSubscribedItems[iSubscribedItem];
LoadWorkshopItem( workshopItemID );
}
// load local test item
if ( m_nNumWorkshopItems < MAX_WORKSHOP_ITEMS )
{
CWorkshopItem *pItem = LoadWorkshopItemFromFile("workshop/workshopitem.txt");
if ( pItem )
{
strncpy( pItem->m_ItemDetails.m_rgchTitle, "Test Item", k_cchPublishedDocumentTitleMax );
strncpy( pItem->m_ItemDetails.m_rgchDescription, "This is a local test item for debugging", k_cchPublishedDocumentDescriptionMax );
m_rgpWorkshopItems[m_nNumWorkshopItems++] = pItem;
}
}
}
//-----------------------------------------------------------------------------
// Purpose: new Workshop was installed, load it instantly
//-----------------------------------------------------------------------------
void CSpaceWarClient::OnWorkshopItemInstalled( ItemInstalled_t *pParam )
{
if ( pParam->m_unAppID == SteamUtils()->GetAppID() )
LoadWorkshopItem( pParam->m_nPublishedFileId );
}
//-----------------------------------------------------------------------------
// Purpose: Draws PublishFileID, title & description for each subscribed Workshop item
//-----------------------------------------------------------------------------
void CSpaceWarClient::DrawWorkshopItems()
{
const int32 width = m_pGameEngine->GetViewportWidth();
RECT rect;
rect.top = 0;
rect.bottom = 64;
rect.left = 0;
rect.right = width;
char rgchBuffer[1024];
sprintf_safe(rgchBuffer, "Subscribed Workshop Items");
m_pGameEngine->BDrawString( m_hInstructionsFont, rect, D3DCOLOR_ARGB(255, 25, 200, 25), TEXTPOS_CENTER |TEXTPOS_VCENTER, rgchBuffer);
rect.left = 32;
rect.top = 64;
rect.bottom = 96;
for (int iSubscribedItem = 0; iSubscribedItem < MAX_WORKSHOP_ITEMS; iSubscribedItem++)
{
CWorkshopItem *pItem = m_rgpWorkshopItems[ iSubscribedItem ];
if ( !pItem )
continue;
rect.top += 32;
rect.bottom += 32;
sprintf_safe( rgchBuffer, "%u. \"%s\" (%llu) : %s", iSubscribedItem+1,
pItem->m_ItemDetails.m_rgchTitle, pItem->m_ItemDetails.m_nPublishedFileId, pItem->m_ItemDetails.m_rgchDescription );
m_pGameEngine->BDrawString( m_hInstructionsFont, rect, D3DCOLOR_ARGB(255, 25, 200, 25), TEXTPOS_LEFT |TEXTPOS_VCENTER, rgchBuffer);
}
rect.left = 0;
rect.right = width;
rect.top = LONG(m_pGameEngine->GetViewportHeight() * 0.8);
rect.bottom = m_pGameEngine->GetViewportHeight();
sprintf_safe(rgchBuffer, "Press ESC to return to the Main Menu");
m_pGameEngine->BDrawString(m_hInstructionsFont, rect, D3DCOLOR_ARGB(255, 25, 200, 25), TEXTPOS_CENTER | TEXTPOS_TOP, rgchBuffer);
}