From ccaaf5ab356aed7b7014c76f34e9b5b62ac38b2a Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Fri, 14 Jan 2011 21:16:43 +0000 Subject: [PATCH] - simple attempt to avoid one small type of cheating related to resource values (please test this tomreyn) --- source/glest_game/type_instances/resource.cpp | 151 ++++++++++++++++++ source/glest_game/type_instances/resource.h | 31 +++- 2 files changed, 176 insertions(+), 6 deletions(-) create mode 100644 source/glest_game/type_instances/resource.cpp diff --git a/source/glest_game/type_instances/resource.cpp b/source/glest_game/type_instances/resource.cpp new file mode 100644 index 000000000..b9bb84ff0 --- /dev/null +++ b/source/glest_game/type_instances/resource.cpp @@ -0,0 +1,151 @@ +// ============================================================== +// This file is part of Glest (www.glest.org) +// +// Copyright (C) 2001-2008 Marti�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 +#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_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_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_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 diff --git a/source/glest_game/type_instances/resource.h b/source/glest_game/type_instances/resource.h index 0b74a3ca2..9e9230cbb 100644 --- a/source/glest_game/type_instances/resource.h +++ b/source/glest_game/type_instances/resource.h @@ -13,9 +13,11 @@ #include #include "vec.h" +#include #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 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); };