diff options
author | Sven Hesse | 2008-07-12 15:21:38 +0000 |
---|---|---|
committer | Sven Hesse | 2008-07-12 15:21:38 +0000 |
commit | c1ec21d999253d86513ce66876c692be198b91c0 (patch) | |
tree | d4e514987d92251eb1dca5c410d5332407bdc2dc /engines/gob/variables.cpp | |
parent | 7ddd961bf2ded1d9cad114ea03018d44258e9ca8 (diff) | |
download | scummvm-rg350-c1ec21d999253d86513ce66876c692be198b91c0.tar.gz scummvm-rg350-c1ec21d999253d86513ce66876c692be198b91c0.tar.bz2 scummvm-rg350-c1ec21d999253d86513ce66876c692be198b91c0.zip |
Changed tricky variable access from pointers to a new class that minds endianess.
This should fix a few regressions with BE games on LE systems and vice versa that I introduced when I changed how variables are stored (which was necessary to get Woodruff work on BE systems).
svn-id: r33014
Diffstat (limited to 'engines/gob/variables.cpp')
-rw-r--r-- | engines/gob/variables.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/engines/gob/variables.cpp b/engines/gob/variables.cpp index 0eea2f6547..805aaeb839 100644 --- a/engines/gob/variables.cpp +++ b/engines/gob/variables.cpp @@ -308,4 +308,62 @@ uint32 VariablesBE::read32(const byte *buf) const { return READ_BE_UINT32(buf); } +VariableReference::VariableReference() { + _vars = 0; + _offset = 0; +} + +VariableReference::VariableReference(Variables &vars, uint32 offset, Variables::Type type) { + set(vars, offset, type); +} + +VariableReference::~VariableReference() { +} + +void VariableReference::set(Variables &vars, uint32 offset, Variables::Type type) { + _vars = &vars; + _offset = offset; + _type = type; +} + +VariableReference &VariableReference::operator=(uint32 value) { + if (_vars) { + switch (_type) { + case Variables::kVariableType8: + _vars->writeOff8(_offset, (uint8) value); + break; + case Variables::kVariableType16: + _vars->writeOff16(_offset, (uint16) value); + break; + case Variables::kVariableType32: + _vars->writeOff32(_offset, value); + break; + } + } + return *this; +} + +VariableReference::operator uint32() { + if (_vars) { + switch (_type) { + case Variables::kVariableType8: + return (uint32) _vars->readOff8(_offset); + case Variables::kVariableType16: + return (uint32) _vars->readOff16(_offset); + case Variables::kVariableType32: + return _vars->readOff32(_offset); + } + } + + return 0; +} + +VariableReference &VariableReference::operator+=(uint32 value) { + return (*this = (*this + value)); +} + +VariableReference &VariableReference::operator*=(uint32 value) { + return (*this = (*this * value)); +} + } // End of namespace Gob |