Added Forty Thieves
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@365 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
189
samples/forty/scorefil.cpp
Normal file
189
samples/forty/scorefil.cpp
Normal file
@@ -0,0 +1,189 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: scorefil.cpp
|
||||
// Purpose: Forty Thieves patience game
|
||||
// Author: Chris Breeze
|
||||
// Modified by:
|
||||
// Created: 21/07/97
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 1993-1998 Chris Breeze
|
||||
// Licence: wxWindows licence
|
||||
//---------------------------------------------------------------------------
|
||||
// Last modified: 14th May 1998 - ported to wxWindows 2.0
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/wx.h"
|
||||
#endif
|
||||
|
||||
#ifdef __WXGTK__
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
#include "wx/textfile.h"
|
||||
#include "wx/config.h"
|
||||
#include "wx/fileconf.h"
|
||||
|
||||
#include "scorefil.h"
|
||||
|
||||
|
||||
ScoreFile::ScoreFile(const char* appName)
|
||||
{
|
||||
wxString filename;
|
||||
#ifdef __WXGTK__
|
||||
m_configFilename << "/usr/local/share/" << appName << ".scores";
|
||||
if (access(m_configFilename, F_OK) == 0)
|
||||
{
|
||||
if (access(m_configFilename, R_OK | W_OK) != 0)
|
||||
{
|
||||
// file is not r/w - use local file instead
|
||||
m_configFilename = wxFileConfig::GetLocalFileName(appName);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int fd = creat(m_configFilename, 0666);
|
||||
|
||||
if (fd < 0)
|
||||
{
|
||||
// failed to create file - use local file instead
|
||||
m_configFilename = wxFileConfig::GetLocalFileName(appName);
|
||||
}
|
||||
else
|
||||
{
|
||||
// ensure created file has rw-rw-rw permissions
|
||||
close(fd);
|
||||
}
|
||||
}
|
||||
#else
|
||||
// Windows
|
||||
m_configFilename = wxFileConfig::GetGlobalFileName(appName);
|
||||
#endif
|
||||
m_config = new wxFileConfig(m_configFilename);
|
||||
}
|
||||
|
||||
ScoreFile::~ScoreFile()
|
||||
{
|
||||
delete m_config;
|
||||
#ifdef __WXGTK__
|
||||
// ensure score file has rw-rw-rw permissions
|
||||
// (wxFileConfig sets them to rw-------)
|
||||
chmod(m_configFilename, 0666);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void ScoreFile::GetPlayerList(wxString** list, int& length)
|
||||
{
|
||||
m_config->SetPath("/Players");
|
||||
length = m_config->GetNumberOfGroups();
|
||||
|
||||
if (length <= 0)
|
||||
{
|
||||
*list = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
*list = new wxString[length];
|
||||
|
||||
wxString player;
|
||||
long index, i = 0;
|
||||
if (m_config->GetFirstGroup(player, index))
|
||||
{
|
||||
(*list)[i++] = player;
|
||||
while (m_config->GetNextGroup(player, index))
|
||||
{
|
||||
(*list)[i++] = player;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Calculate an encrypted check number to prevent tampering with
|
||||
// score file
|
||||
long ScoreFile::CalcCheck(const char* name, int p1, int p2, int p3)
|
||||
{
|
||||
long check = 0;
|
||||
while (*name)
|
||||
{
|
||||
check = (check << 1) ^ (long)*name++;
|
||||
check = ((check >> 23) ^ check) & 0xFFFFFF;
|
||||
}
|
||||
check = (check << 1) ^ (long)p1;
|
||||
check = ((check >> 23) ^ check) & 0xFFFFFF;
|
||||
check = (check << 1) ^ (long)p2;
|
||||
check = ((check >> 23) ^ check) & 0xFFFFFF;
|
||||
check = (check << 1) ^ (long)p3;
|
||||
check = ((check >> 23) ^ check) & 0xFFFFFF;
|
||||
return check;
|
||||
}
|
||||
|
||||
wxString ScoreFile::GetPreviousPlayer() const
|
||||
{
|
||||
wxString result;
|
||||
m_config->SetPath("/General");
|
||||
m_config->Read(&result, "LastPlayer");
|
||||
return result;
|
||||
}
|
||||
|
||||
void ScoreFile::ReadPlayersScore(
|
||||
const char* player,
|
||||
int& wins,
|
||||
int& games,
|
||||
int& score)
|
||||
{
|
||||
long check;
|
||||
long myWins, myGames, myScore;
|
||||
|
||||
games = wins = score = 0;
|
||||
|
||||
m_config->SetPath("/Players");
|
||||
m_config->SetPath(player);
|
||||
if (m_config->Read(&myScore, "Score") &&
|
||||
m_config->Read(&myGames, "Games") &&
|
||||
m_config->Read(&myWins, "Wins") &&
|
||||
m_config->Read(&check, "Check"))
|
||||
{
|
||||
if (check != CalcCheck(player, myGames, myWins, myScore))
|
||||
{
|
||||
wxMessageBox("Score file corrupted", "Warning",
|
||||
wxOK | wxICON_EXCLAMATION);
|
||||
}
|
||||
else
|
||||
{
|
||||
games = myGames;
|
||||
wins = myWins;
|
||||
score = myScore;
|
||||
}
|
||||
}
|
||||
WritePlayersScore(player, wins, games, score);
|
||||
}
|
||||
|
||||
|
||||
void ScoreFile::WritePlayersScore(const char* player, int wins, int games, int score)
|
||||
{
|
||||
if (player)
|
||||
{
|
||||
m_config->SetPath("/General");
|
||||
m_config->Write("LastPlayer", player);
|
||||
|
||||
m_config->SetPath("/Players");
|
||||
m_config->SetPath(player);
|
||||
m_config->Write("Score", score);
|
||||
m_config->Write("Games", games);
|
||||
m_config->Write("Wins", wins);
|
||||
m_config->Write("Check", CalcCheck(player, games, wins, score));
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user