mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-05-08 03:27:58 +03:00
441 lines
8.9 KiB
C++
441 lines
8.9 KiB
C++
// trackDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "track.h"
|
|
#include "trackDlg.h"
|
|
|
|
#include "../gstats.h"
|
|
#include "../../common/gsAvailable.h"
|
|
#include "../../ghttp/ghttp.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#define TIMER_ONE_SECOND 100
|
|
#define TIMER_THINK 101
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTrackDlg dialog
|
|
|
|
CTrackDlg::CTrackDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CTrackDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CTrackDlg)
|
|
m_info = _T("Ready");
|
|
m_best100 = _T("");
|
|
m_best200 = _T("");
|
|
m_best50 = _T("");
|
|
m_top100 = _T("");
|
|
m_top200 = _T("");
|
|
m_top50 = _T("");
|
|
//}}AFX_DATA_INIT
|
|
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
|
|
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
|
|
}
|
|
|
|
void CTrackDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CTrackDlg)
|
|
DDX_Control(pDX, IDC_PROGRESS, m_progress);
|
|
DDX_Text(pDX, IDC_INFO, m_info);
|
|
DDX_Text(pDX, IDC_BEST_100, m_best100);
|
|
DDX_Text(pDX, IDC_BEST_200, m_best200);
|
|
DDX_Text(pDX, IDC_BEST_50, m_best50);
|
|
DDX_Text(pDX, IDC_TOP_100, m_top100);
|
|
DDX_Text(pDX, IDC_TOP_200, m_top200);
|
|
DDX_Text(pDX, IDC_TOP_50, m_top50);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CTrackDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CTrackDlg)
|
|
ON_WM_PAINT()
|
|
ON_WM_QUERYDRAGICON()
|
|
ON_BN_CLICKED(IDC_LOGOUT, OnLogout)
|
|
ON_WM_TIMER()
|
|
ON_BN_CLICKED(IDC_START_50, OnStart50)
|
|
ON_BN_CLICKED(IDC_START_100, OnStart100)
|
|
ON_BN_CLICKED(IDC_START_200, OnStart200)
|
|
ON_WM_DESTROY()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTrackDlg message handlers
|
|
|
|
CTrackDlg * Dlg;
|
|
|
|
GHTTPBool PlayerBestTimesPageCompleted
|
|
(
|
|
GHTTPRequest request,
|
|
GHTTPResult result,
|
|
char * buffer,
|
|
GHTTPByteCount bufferLen,
|
|
void * param
|
|
)
|
|
{
|
|
if(result == GHTTPSuccess)
|
|
{
|
|
int bestTimes[3];
|
|
int rcode;
|
|
|
|
// Scan out the best times.
|
|
///////////////////////////
|
|
rcode = sscanf(buffer, "%d %d %d", &bestTimes[0], &bestTimes[1], &bestTimes[2]);
|
|
if(rcode == 3)
|
|
{
|
|
Dlg->UpdateData();
|
|
Dlg->m_best50.Format("%0.3f", bestTimes[0] / 1000.0);
|
|
Dlg->m_best100.Format("%0.3f", bestTimes[1] / 1000.0);
|
|
Dlg->m_best200.Format("%0.3f", bestTimes[2] / 1000.0);
|
|
Dlg->UpdateData(FALSE);
|
|
}
|
|
}
|
|
|
|
return GHTTPTrue;
|
|
}
|
|
|
|
GHTTPBool TopTimePageCompleted
|
|
(
|
|
GHTTPRequest request,
|
|
GHTTPResult result,
|
|
char * buffer,
|
|
GHTTPByteCount bufferLen,
|
|
void * param
|
|
)
|
|
{
|
|
if(result == GHTTPSuccess)
|
|
{
|
|
int time = atoi(buffer);
|
|
if(time)
|
|
{
|
|
CString str;
|
|
str.Format("%0.3f", time / 1000.0);
|
|
|
|
int event = (int)param;
|
|
Dlg->UpdateData();
|
|
if(event == 1)
|
|
Dlg->m_top50 = str;
|
|
else if(event == 2)
|
|
Dlg->m_top100 = str;
|
|
else if(event == 3)
|
|
Dlg->m_top200 = str;
|
|
Dlg->UpdateData(FALSE);
|
|
}
|
|
}
|
|
|
|
return GHTTPTrue;
|
|
}
|
|
|
|
void CTrackDlg::SetupUser()
|
|
{
|
|
CString title;
|
|
title.Format("track - best time (%s - %s - %d)", m_loginDlg.m_email, m_loginDlg.m_nick, m_loginDlg.m_profile);
|
|
SetWindowText(title);
|
|
|
|
CString url;
|
|
int event;
|
|
url.Format("http://sdkdev.gamespy.com/games/st_highscore/web/playertimes.asp?pid=%d", m_loginDlg.m_profile);
|
|
ghttpGet(url, GHTTPFalse, PlayerBestTimesPageCompleted, NULL);
|
|
for(event = 1 ; event <= 3 ; event++)
|
|
{
|
|
url.Format("http://sdkdev.gamespy.com/games/st_highscore/web/top_%d.txt", event);
|
|
ghttpGet(url, GHTTPFalse, TopTimePageCompleted, (void *)event);
|
|
}
|
|
|
|
m_start = 0;
|
|
m_count = -1;
|
|
m_racing = FALSE;
|
|
m_event = EVENT_NONE;
|
|
m_numSteps = 0;
|
|
m_step = NONE;
|
|
}
|
|
|
|
BOOL CTrackDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
int rcode;
|
|
CString str;
|
|
|
|
SetIcon(m_hIcon, TRUE);
|
|
SetIcon(m_hIcon, FALSE);
|
|
|
|
Dlg = this;
|
|
|
|
// Use the development system.
|
|
//////////////////////////////
|
|
strcpy(StatsServerHostname, "sdkdev.gamespy.com");
|
|
|
|
// Set the gamename and secret key.
|
|
///////////////////////////////////
|
|
strcpy(gcd_gamename, "st_highscore");
|
|
gcd_secret_key[0] = 'K';
|
|
gcd_secret_key[1] = 'S';
|
|
gcd_secret_key[2] = '3';
|
|
gcd_secret_key[3] = 'p';
|
|
gcd_secret_key[4] = '2';
|
|
gcd_secret_key[5] = 'Q';
|
|
|
|
// Perform the availability check
|
|
//////////////////////////////////////
|
|
GSIACResult aResult = GSIACWaiting;
|
|
GSIStartAvailableCheck(gcd_gamename);
|
|
while(aResult == GSIACWaiting)
|
|
{
|
|
aResult = GSIAvailableCheckThink();
|
|
Sleep(50);
|
|
}
|
|
|
|
// Init the connection to the backend.
|
|
//////////////////////////////////////
|
|
rcode = InitStatsConnection(0);
|
|
if(rcode != GE_NOERROR)
|
|
{
|
|
str.Format("Failed to connect to the stats server (%d).", rcode);
|
|
MessageBox(str);
|
|
PostQuitMessage(1);
|
|
return TRUE;
|
|
}
|
|
|
|
// Login the user (actually just verifying the login).
|
|
//////////////////////////////////////////////////////
|
|
if(m_loginDlg.DoModal() != IDOK)
|
|
{
|
|
PostQuitMessage(1);
|
|
return TRUE;
|
|
}
|
|
|
|
SetTimer(TIMER_ONE_SECOND, 1000, NULL);
|
|
SetTimer(TIMER_THINK, 50, NULL);
|
|
|
|
SetupUser();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CTrackDlg::OnPaint()
|
|
{
|
|
if (IsIconic())
|
|
{
|
|
CPaintDC dc(this);
|
|
|
|
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
|
|
|
|
// Center icon in client rectangle
|
|
int cxIcon = GetSystemMetrics(SM_CXICON);
|
|
int cyIcon = GetSystemMetrics(SM_CYICON);
|
|
CRect rect;
|
|
GetClientRect(&rect);
|
|
int x = (rect.Width() - cxIcon + 1) / 2;
|
|
int y = (rect.Height() - cyIcon + 1) / 2;
|
|
|
|
// Draw the icon
|
|
dc.DrawIcon(x, y, m_hIcon);
|
|
}
|
|
else
|
|
{
|
|
CDialog::OnPaint();
|
|
}
|
|
}
|
|
|
|
HCURSOR CTrackDlg::OnQueryDragIcon()
|
|
{
|
|
return (HCURSOR) m_hIcon;
|
|
}
|
|
|
|
void CTrackDlg::OnDestroy()
|
|
{
|
|
CDialog::OnDestroy();
|
|
|
|
if(IsStatsConnected())
|
|
CloseStatsConnection();
|
|
|
|
ghttpCleanup();
|
|
}
|
|
|
|
void CTrackDlg::OnLogout()
|
|
{
|
|
ShowWindow(SW_HIDE);
|
|
if(m_loginDlg.DoModal() != IDOK)
|
|
PostQuitMessage(1);
|
|
SetupUser();
|
|
ShowWindow(SW_SHOW);
|
|
}
|
|
|
|
void CTrackDlg::OnTimer(UINT nIDEvent)
|
|
{
|
|
if(nIDEvent == TIMER_ONE_SECOND)
|
|
{
|
|
if(m_count)
|
|
{
|
|
UpdateData(TRUE);
|
|
|
|
if(m_count == 3)
|
|
m_info = "READY";
|
|
else if(m_count == 2)
|
|
m_info = "SET";
|
|
else if(m_count == 1)
|
|
m_info = "GO";
|
|
|
|
UpdateData(FALSE);
|
|
|
|
if(m_count == 1)
|
|
{
|
|
m_numSteps = 0;
|
|
m_step = NONE;
|
|
m_racing = TRUE;
|
|
m_start = GetTickCount();
|
|
}
|
|
|
|
m_count--;
|
|
}
|
|
}
|
|
else if(nIDEvent == TIMER_THINK)
|
|
{
|
|
ghttpThink();
|
|
}
|
|
|
|
CDialog::OnTimer(nIDEvent);
|
|
}
|
|
|
|
void CTrackDlg::ReportStats(DWORD time)
|
|
{
|
|
char response[33];
|
|
|
|
NewGame(1);
|
|
BucketStringOp(NULL, "hostname", bo_set, (char *)(LPCSTR)m_loginDlg.m_nick, bl_server, 0);
|
|
BucketIntOp(NULL, "event", bo_set, m_event, bl_server, 0);
|
|
|
|
NewPlayer(NULL, 0, (char *)(LPCSTR)m_loginDlg.m_nick);
|
|
BucketIntOp(NULL, "time", bo_set, time, bl_player, 0);
|
|
BucketIntOp(NULL, "pid", bo_set, m_loginDlg.m_profile, bl_player, 0);
|
|
GenerateAuth(GetChallenge(NULL), (char *)(LPCSTR)m_loginDlg.m_password, response);
|
|
BucketStringOp(NULL, "auth", bo_set, response, bl_player, 0);
|
|
|
|
SendGameSnapShot(NULL, NULL, SNAP_FINAL);
|
|
FreeGame(NULL);
|
|
}
|
|
|
|
BOOL CTrackDlg::PreTranslateMessage(MSG* pMsg)
|
|
{
|
|
if(pMsg->message == WM_KEYDOWN)
|
|
{
|
|
int nChar = pMsg->wParam;
|
|
if((nChar == 'Z') || (nChar == 'X'))
|
|
{
|
|
if((pMsg->lParam & 0xFFFF) == 1)
|
|
{
|
|
CString str;
|
|
BOOL stepped = FALSE;
|
|
|
|
if((nChar == 'Z') && (m_step != LEFT))
|
|
{
|
|
m_step = LEFT;
|
|
m_numSteps++;
|
|
stepped = TRUE;
|
|
}
|
|
else if ((nChar == 'X') && (m_step != RIGHT))
|
|
{
|
|
m_step = RIGHT;
|
|
m_numSteps++;
|
|
stepped = TRUE;
|
|
}
|
|
|
|
if(stepped && m_racing)
|
|
{
|
|
m_progress.SetPos(m_numSteps);
|
|
if(m_numSteps == m_totalSteps)
|
|
{
|
|
DWORD diff;
|
|
|
|
m_racing = FALSE;
|
|
diff = (GetTickCount() - m_start);
|
|
str.Format("%0.3fs\n", diff / 1000.0);
|
|
OutputDebugString(str);
|
|
MessageBox(str);
|
|
|
|
UpdateData();
|
|
|
|
m_info = "DONE";
|
|
|
|
// Report the stats.
|
|
////////////////////
|
|
ReportStats(diff);
|
|
|
|
// Update best time(s) if needed.
|
|
/////////////////////////////////
|
|
CString * topStr;
|
|
CString * bestStr;
|
|
DWORD topTime;
|
|
DWORD bestTime;
|
|
if(m_event == EVENT_50)
|
|
{
|
|
topStr = &m_top50;
|
|
bestStr = &m_best50;
|
|
}
|
|
else if(m_event == EVENT_100)
|
|
{
|
|
topStr = &m_top100;
|
|
bestStr = &m_best100;
|
|
}
|
|
else
|
|
{
|
|
topStr = &m_top200;
|
|
bestStr = &m_best200;
|
|
}
|
|
|
|
topTime = (DWORD)(atof(*topStr) * 1000);
|
|
bestTime = (DWORD)(atof(*bestStr) * 1000);
|
|
if(!bestTime || (diff < bestTime))
|
|
{
|
|
bestStr->Format("%0.3f", diff / 1000.0);
|
|
if(diff < topTime)
|
|
*topStr = *bestStr;
|
|
}
|
|
|
|
UpdateData(FALSE);
|
|
|
|
m_event = EVENT_NONE;
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return CDialog::PreTranslateMessage(pMsg);
|
|
}
|
|
|
|
void CTrackDlg::OnStart50()
|
|
{
|
|
m_count = 3;
|
|
m_totalSteps = RACE_STEPS_50;
|
|
m_progress.SetRange(0, m_totalSteps);
|
|
m_progress.SetPos(0);
|
|
m_event = EVENT_50;
|
|
}
|
|
|
|
void CTrackDlg::OnStart100()
|
|
{
|
|
m_count = 3;
|
|
m_totalSteps = RACE_STEPS_100;
|
|
m_progress.SetRange(0, m_totalSteps);
|
|
m_progress.SetPos(0);
|
|
m_event = EVENT_100;
|
|
}
|
|
|
|
void CTrackDlg::OnStart200()
|
|
{
|
|
m_count = 3;
|
|
m_totalSteps = RACE_STEPS_200;
|
|
m_progress.SetRange(0, m_totalSteps);
|
|
m_progress.SetPos(0);
|
|
m_event = EVENT_200;
|
|
}
|