diff options
author | Alyssa Milburn | 2011-08-19 15:55:27 +0200 |
---|---|---|
committer | Alyssa Milburn | 2011-08-19 15:55:27 +0200 |
commit | 4e4062806b1b1d80e98f7935e911249a458eadc8 (patch) | |
tree | 82a4f5123972c5276150fef5d4dabd906b9f6124 /engines | |
parent | 43a41f5380228c62959374750667dadd175ea5ad (diff) | |
download | scummvm-rg350-4e4062806b1b1d80e98f7935e911249a458eadc8.tar.gz scummvm-rg350-4e4062806b1b1d80e98f7935e911249a458eadc8.tar.bz2 scummvm-rg350-4e4062806b1b1d80e98f7935e911249a458eadc8.zip |
CGE: Portability fix for syncing sprite flags.
Diffstat (limited to 'engines')
-rw-r--r-- | engines/cge/vga13h.cpp | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/engines/cge/vga13h.cpp b/engines/cge/vga13h.cpp index ad2415caaf..7e4daeb898 100644 --- a/engines/cge/vga13h.cpp +++ b/engines/cge/vga13h.cpp @@ -545,7 +545,48 @@ void Sprite::sync(Common::Serializer &s) { s.syncAsUint16LE(unused); // _ext s.syncAsUint16LE(_ref); s.syncAsByte(_cave); - s.syncBytes((byte *)&_flags, 2); + + // bitfield in-memory storage is unpredictable, so to avoid + // any issues, pack/unpack everything manually + uint16 flags = 0; + if (s.isLoading()) { + s.syncAsUint16LE(flags); + _flags._hide = flags & 0x0001 ? true : false; + _flags._near = flags & 0x0002 ? true : false; + _flags._drag = flags & 0x0004 ? true : false; + _flags._hold = flags & 0x0008 ? true : false; + _flags._____ = flags & 0x0010 ? true : false; + _flags._slav = flags & 0x0020 ? true : false; + _flags._syst = flags & 0x0040 ? true : false; + _flags._kill = flags & 0x0080 ? true : false; + _flags._xlat = flags & 0x0100 ? true : false; + _flags._port = flags & 0x0200 ? true : false; + _flags._kept = flags & 0x0400 ? true : false; + _flags._east = flags & 0x0800 ? true : false; + _flags._shad = flags & 0x1000 ? true : false; + _flags._back = flags & 0x2000 ? true : false; + _flags._bDel = flags & 0x4000 ? true : false; + _flags._tran = flags & 0x8000 ? true : false; + } else { + flags = (flags << 1) | _flags._tran; + flags = (flags << 1) | _flags._bDel; + flags = (flags << 1) | _flags._back; + flags = (flags << 1) | _flags._shad; + flags = (flags << 1) | _flags._east; + flags = (flags << 1) | _flags._kept; + flags = (flags << 1) | _flags._port; + flags = (flags << 1) | _flags._xlat; + flags = (flags << 1) | _flags._kill; + flags = (flags << 1) | _flags._syst; + flags = (flags << 1) | _flags._slav; + flags = (flags << 1) | _flags._____; + flags = (flags << 1) | _flags._hold; + flags = (flags << 1) | _flags._drag; + flags = (flags << 1) | _flags._near; + flags = (flags << 1) | _flags._hide; + s.syncAsUint16LE(flags); + } + s.syncAsUint16LE(_x); s.syncAsUint16LE(_y); s.syncAsByte(_z); |