- simple attempt to avoid one small type of cheating related to resource values (please test this tomreyn)

This commit is contained in:
Mark Vejvoda 2011-01-14 21:16:43 +00:00
parent f6b0bd3fd7
commit ccaaf5ab35
2 changed files with 176 additions and 6 deletions

View File

@ -0,0 +1,151 @@
// ==============================================================
// This file is part of Glest (www.glest.org)
//
// Copyright (C) 2001-2008 Marti<74>o Figueroa
//
// You can redistribute this code and/or modify it under
// the terms of the GNU General Public License as published
// by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version
// ==============================================================
#include "resource.h"
#include "conversion.h"
#include "resource_type.h"
#include "checksum.h"
#include <stdexcept>
#include "util.h"
#include "leak_dumper.h"
using namespace Shared::Graphics;
using namespace Shared::Util;
namespace Glest{ namespace Game{
void ValueCheckerVault::addItemToVault(const void *ptr,int value) {
Checksum checksum;
checksum.addString(intToStr(value));
vaultList[ptr] = intToStr(checksum.getSum());
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d] add vault key [%p] value [%s] [%d]\n",__FILE__,__FUNCTION__,__LINE__,ptr,intToStr(checksum.getSum()).c_str(),value);
}
void ValueCheckerVault::checkItemInVault(const void *ptr,int value) const {
map<const void *,string>::const_iterator iterFind = vaultList.find(ptr);
if(iterFind == vaultList.end()) {
if(SystemFlags::VERBOSE_MODE_ENABLED) {
printf("In [%s::%s Line: %d] check vault key [%p] value [%d]\n",__FILE__,__FUNCTION__,__LINE__,ptr,value);
for(map<const void *,string>::const_iterator iterFind = vaultList.begin();
iterFind != vaultList.end(); iterFind++) {
printf("In [%s::%s Line: %d] LIST-- check vault key [%p] value [%s]\n",__FILE__,__FUNCTION__,__LINE__,iterFind->first,iterFind->second.c_str());
}
}
throw std::runtime_error("memory value has been unexpectedly modified (not found)!");
}
Checksum checksum;
checksum.addString(intToStr(value));
if(iterFind->second != intToStr(checksum.getSum())) {
if(SystemFlags::VERBOSE_MODE_ENABLED) {
printf("In [%s::%s Line: %d] check vault key [%p] value [%s] [%d]\n",__FILE__,__FUNCTION__,__LINE__,ptr,intToStr(checksum.getSum()).c_str(),value);
for(map<const void *,string>::const_iterator iterFind = vaultList.begin();
iterFind != vaultList.end(); iterFind++) {
printf("In [%s::%s Line: %d] LIST-- check vault key [%p] value [%s]\n",__FILE__,__FUNCTION__,__LINE__,iterFind->first,iterFind->second.c_str());
}
}
throw std::runtime_error("memory value has been unexpectedly modified (changed)!");
}
}
// =====================================================
// class Resource
// =====================================================
Resource::Resource() {
this->type= NULL;
this->amount= 0;
pos= Vec2i(0);
balance= 0;
addItemToVault(&this->amount,this->amount);
addItemToVault(&this->balance,this->balance);
}
void Resource::init(const ResourceType *rt, int amount) {
this->type= rt;
this->amount= amount;
pos= Vec2i(0);
balance= 0;
addItemToVault(&this->amount,this->amount);
addItemToVault(&this->balance,this->balance);
}
void Resource::init(const ResourceType *rt, const Vec2i &pos) {
this->type=rt;
amount=rt->getDefResPerPatch();
this->pos= pos;
addItemToVault(&this->amount,this->amount);
addItemToVault(&this->balance,this->balance);
}
string Resource::getDescription() const {
string str;
str+= type->getName();
str+="\n";
str+= intToStr(amount);
str+="/";
str+= intToStr(type->getDefResPerPatch());
return str;
}
int Resource::getAmount() const {
checkItemInVault(&this->amount,this->amount);
checkItemInVault(&this->balance,this->balance);
return amount;
}
int Resource::getBalance() const {
checkItemInVault(&this->amount,this->amount);
checkItemInVault(&this->balance,this->balance);
return balance;
}
void Resource::setAmount(int amount) {
checkItemInVault(&this->amount,this->amount);
checkItemInVault(&this->balance,this->balance);
this->amount= amount;
addItemToVault(&this->amount,this->amount);
}
void Resource::setBalance(int balance) {
checkItemInVault(&this->amount,this->amount);
checkItemInVault(&this->balance,this->balance);
this->balance= balance;
addItemToVault(&this->balance,this->balance);
}
bool Resource::decAmount(int i) {
checkItemInVault(&this->amount,this->amount);
checkItemInVault(&this->balance,this->balance);
amount -= i;
addItemToVault(&this->amount,this->amount);
if(amount > 0) {
return false;
}
return true;
}
}}//end namespace

View File

@ -13,9 +13,11 @@
#include <string>
#include "vec.h"
#include <map>
#include "leak_dumper.h"
using std::string;
using std::map;
namespace Glest{ namespace Game{
@ -29,25 +31,42 @@ class ResourceType;
/// Amount of a given ResourceType
// =====================================================
class Resource{
class ValueCheckerVault {
protected:
map<const void *,string> vaultList;
void addItemToVault(const void *ptr,int value);
void checkItemInVault(const void *ptr,int value) const;
public:
ValueCheckerVault() {
vaultList.clear();
}
};
class Resource : public ValueCheckerVault {
private:
int amount;
const ResourceType *type;
Vec2i pos;
int balance;
public:
public:
Resource();
void init(const ResourceType *rt, int amount);
void init(const ResourceType *rt, const Vec2i &pos);
int getAmount() const {return amount;}
const ResourceType * getType() const {return type;}
Vec2i getPos() const {return pos;}
int getBalance() const {return balance;}
int getAmount() const;
int getBalance() const;
string getDescription() const;
void setAmount(int amount) {this->amount= amount;}
void setBalance(int balance) {this->balance= balance;}
void setAmount(int amount);
void setBalance(int balance);
bool decAmount(int i);
};