Security in itself is a pain in the ass. I'm sure there are many ways to accomplish this task.
I used the following tools:
1. PHP and MySQL (server-side)
2. Wrote a custom DLL that allows communication with web server (client-side). I'm sure this can be done via Blizt3d api calls.
Sample code for updating players info to the database online via Blitz3d.
mydata$ = "name="+name$+"&level="+level+"&hs="+score$+"&diff="+diff$+"&ver="+CurrentVersion$+"&fv="+fv$+"&bo="+xor2
mydata2$ = "http://www.webappstogo.com/3dblowout/highscore.html?"+mydata$
ret$=HighScoreWebUpdate$(mydata2$);
Most of this is self explanatory. HighScoreWebUpdate$ is my entry point to the DLL which communicates with my web server.
Sample code on server-side to handle this request (PHP):
If (the key takes)
{
$sql = "insert into 3dbo_highscore_v12
(name, level, difficulty, highscore)
values
('$name', '$level', '$diff', '$hs')";
$result = mysql_query($sql);
}
Here's sample code to grab the top 10 scores from the database (PHP).
$sql = "select * from 3dbo_highscore_v12 order by highscore desc LIMIT 0, 10";
$result = mysql_query($sql);
If (@mysql_num_rows($result))
{
While ($qry = mysql_fetch_array($result))
{
$player = $qry[name];
$score = $qry[highscore];
$level = $qry[level];
$diff = $qry[difficulty];
echo $player."~".$level."~".$diff."~".$score."~";
}
}In my game, 3D Blowout, the player may choose to view the top 10 world-wide player scores. I wrote an additional script that could be used for advertisment purposes for cummunicating future releases or even new products. This advertisment message would scroll (right to left) right below the top 10 scores in the game. Sample code (PHP):
function GetAdvertisement($n1,$s1,$l1,$d1,$fv)
{
srand((double) microtime() * 1000000);
$adv[0] = "--- The top 100 WORLDWIDE scores can be found at www.webappstogo.com --- ";
$adv[1] = "--- Check out our 3D Screensavers at www.webappstogo.com --- ";
$adv[2] = "--- Free updates to all registered users --- ";
$adv[3] = "--- 3D Blowout (Distraction Style) Copyright 2004 WebAppstogo --- ";
$adv[4] = "--- Want to see more in this game? Email us your suggestions --- ";
If (Rand(0,5) == 5)
{
$adv = "--- Top Dog Honors go to ".$n1." with a score of ".$s1.", difficulty set on ".$d1.". Congratulations! ---";
echo ":".$adv.";";
}
Else
{
echo ":".$adv[Rand(0,4)].";";
}
}Here's the actual function to display top 10 scores. HSList$ contains the players info (name, difficulty, level, high score and advertisment message). You may notice that I use FONText (great tool):
Function HallOfFame(HSList$)
ScaleFont currfont, 0.40,0.9
FontColor currfont, 150,150,240,1
updateHUDcounter hudTopTen,"Top 10 WorldWide Players"
ScaleFont currfont, 0.33,0.6
FontColor currfont, 255,0,0,1
updateHUDcounter hudHSTitle,"Player Level Diff High Score"
ScaleFont currfont, 0.25,0.5
For myhudtest.hudtest = Each hudtest
num1 = num1 + 1
For b1=1 To 4
loc1 = loc2 + 1
loc2 = Instr( HSList$,"~",loc1)
If loc2 <> 0
temp$ = Mid$(HSList$,loc1,loc2-loc1)
;DebugLog (temp$)
Select (b1)
Case 1: player$ = LSet$(temp$, 16)
Case 2: player$ = LSet$(temp$, 6)
Case 3: player$ = LSet$(temp$, 10)
Case 4: player$ = LSet$(temp$, 7)
End Select
temp$ = Replace$(player$,"~","")
playerdata$ = playerdata$ + temp$
Else
Return
EndIf
Next
If num1 = 1
ScaleFont currfont, 0.30,0.4
FontColor currfont, 0,255,0,1
updateHUDcounter myhudtest\hudHSPlayerTest.HUDcounter,playerdata$,8+Rnd(-1,1),290+Rnd(-1,1)
Else
ScaleFont currfont, 0.30,0.4
FontColor currfont, 0,100,255,1
updateHUDcounter myhudtest\hudHSPlayerTest.HUDcounter,playerdata$
EndIf
playerdata$ = ""
Next
End Function
Sample code for scrolling the advertisment message below the top 10 scores. Again, HSList$ contains the players info (name, difficulty, level, high score and advertisment message):
Function Advertisement(HSList$)
loc1 = Instr( HSList$,":",1)
If loc1 <> 0
loc2 = Instr( HSList$,";",loc1)
If loc2 <> 0
adv$ = Mid$(HSList$,loc1+1,loc2-loc1-1)
advlen = Len (adv$) * 14
myadvtest = myadvtest - 2
If myadvtest < (-advlen)+2 Then myadvtest = advlen
ScaleFont currfont, 0.20,0.3
FontColor currfont, 255,255,255,1
updateHUDcounter hudAdvertisement,adv$,advlen+myadvtest,575
EndIf
EndIf
End Function
Finally, code sample of DLL call for sending information to the web server. I have a class (c++) that handles the internals.
#define BBDECL extern "C" _declspec(dllexport)
#define BBCALL _stdcall
BBDECL const char* BBCALL HighScoreWebUpdate(const char* szURL)
{
CString csContents, csResponse, csErrMsg;
int nResult;
m_pInternet.httpGet(szURL, csContents, nResult, csErrMsg);
return csContents;
}Not sure if you will get anything from my source, but it should enlighten you of how much work lies ahead.