Got rid of 'ref' code (or rather: hack) in the save/load system

svn-id: r19246
This commit is contained in:
Max Horn 2005-10-22 23:42:12 +00:00
parent b9b49c3b55
commit 899eb271c6
5 changed files with 33 additions and 74 deletions

View File

@ -323,6 +323,7 @@ void IMuseInternal::init_parts() {
for (i = 0, part = _parts; i != ARRAYSIZE(_parts); i++, part++) {
part->init();
part->_se = this;
part->_slot = i;
}
}
@ -1477,35 +1478,6 @@ void IMuseInternal::addDeferredCommand(int time, int a, int b, int c, int d, int
//
////////////////////////////////////////////////////////////
enum {
TYPE_PART = 1,
TYPE_PLAYER = 2
};
int IMuseInternal::saveReference(void *me_ref, byte type, void *ref) {
IMuseInternal *me = (IMuseInternal *)me_ref;
switch (type) {
case TYPE_PART:
return (Part *)ref - me->_parts;
case TYPE_PLAYER:
return (Player *)ref - me->_players;
default:
error("saveReference: invalid type");
}
}
void *IMuseInternal::loadReference(void *me_ref, byte type, int ref) {
IMuseInternal *me = (IMuseInternal *)me_ref;
switch (type) {
case TYPE_PART:
return &me->_parts[ref];
case TYPE_PLAYER:
return &me->_players[ref];
default:
error("loadReference: invalid type");
}
}
int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm) {
const SaveLoadEntry mainEntries[] = {
MKLINE(IMuseInternal, _queue_end, sleUint8, VER(8)),
@ -1529,7 +1501,7 @@ int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm) {
// VolumeFader is obsolete.
const SaveLoadEntry volumeFaderEntries[] = {
MK_OBSOLETE_REF(VolumeFader, player, TYPE_PLAYER, VER(8), VER(16)),
MK_OBSOLETE(VolumeFader, player, sleUint16, VER(8), VER(16)),
MK_OBSOLETE(VolumeFader, active, sleUint8, VER(8), VER(16)),
MK_OBSOLETE(VolumeFader, curvol, sleUint8, VER(8), VER(16)),
MK_OBSOLETE(VolumeFader, speed_lo_max, sleUint16, VER(8), VER(16)),
@ -1551,10 +1523,6 @@ int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm) {
int i;
ser->_ref_me = this;
ser->_save_ref = saveReference;
ser->_load_ref = loadReference;
ser->saveLoadEntries(this, mainEntries);
ser->saveLoadArrayOf(_cmd_queue, ARRAYSIZE(_cmd_queue), sizeof(_cmd_queue[0]), cmdQueueEntries);
ser->saveLoadArrayOf(_snm_triggers, ARRAYSIZE(_snm_triggers), sizeof(_snm_triggers[0]), snmTriggerEntries);
@ -1654,11 +1622,7 @@ Part::Part() {
}
void Part::saveLoadWithSerializer(Serializer *ser) {
// TODO: Get rid of MKREF usage!
const SaveLoadEntry partEntries[] = {
MKREF(Part, _next, TYPE_PART, VER(8)),
MKREF(Part, _prev, TYPE_PART, VER(8)),
MKREF(Part, _player, TYPE_PLAYER, VER(8)),
MKLINE(Part, _pitchbend, sleInt16, VER(8)),
MKLINE(Part, _pitchbend_factor, sleUint8, VER(8)),
MKLINE(Part, _transpose, sleInt8, VER(8)),
@ -1678,6 +1642,26 @@ void Part::saveLoadWithSerializer(Serializer *ser) {
MKEND()
};
int num;
if (ser->isSaving()) {
num = (_next ? (_next - _se->_parts + 1) : 0);
ser->saveUint16(num);
num = (_prev ? (_prev - _se->_parts + 1) : 0);
ser->saveUint16(num);
num = (_player ? (_player - _se->_players + 1) : 0);
ser->saveUint16(num);
} else {
num = ser->loadUint16();
_next = (num ? &_se->_parts[num - 1] : 0);
num = ser->loadUint16();
_prev = (num ? &_se->_parts[num - 1] : 0);
num = ser->loadUint16();
_player = (num ? &_se->_players[num - 1] : 0);
}
ser->saveLoadEntries(this, partEntries);
}

View File

@ -273,6 +273,7 @@ public:
};
struct Part : public Serializable {
IMuseInternal *_se;
int _slot;
Part *_next, *_prev;
MidiChannel *_mc;
@ -344,6 +345,7 @@ struct Part : public Serializable {
// the public version, only contains a set of methods.
class IMuseInternal {
friend class Player;
friend class Part;
protected:
bool _native_mt32;
@ -430,9 +432,6 @@ protected:
void fix_parts_after_load();
void fix_players_after_load(ScummEngine *scumm);
static int saveReference(void *me_ref, byte type, void *ref);
static void *loadReference(void *me_ref, byte type, int ref);
static void midiTimerCallback(void *data);
public:

View File

@ -1171,15 +1171,8 @@ void Player::metaEvent(byte type, byte *msg, uint16 len) {
//
////////////////////////////////////////
enum {
TYPE_PART = 1,
TYPE_PLAYER = 2
};
void Player::saveLoadWithSerializer(Serializer *ser) {
// TODO: Get rid of MKREF usage!
static const SaveLoadEntry playerEntries[] = {
MKREF(Player, _parts, TYPE_PART, VER(8)),
MKLINE(Player, _active, sleByte, VER(8)),
MKLINE(Player, _id, sleUint16, VER(8)),
MKLINE(Player, _priority, sleByte, VER(8)),
@ -1230,6 +1223,14 @@ void Player::saveLoadWithSerializer(Serializer *ser) {
}
_music_tick = _parser ? _parser->getTick() : 0;
int num;
if (ser->isSaving()) {
num = (_parts ? (_parts - _se->_parts + 1) : 0);
ser->saveUint16(num);
} else {
num = ser->loadUint16();
_parts = (num ? &_se->_parts[num - 1] : 0);
}
ser->saveLoadEntries(this, playerEntries);
ser->saveLoadArrayOf(_parameterFaders, ARRAYSIZE(_parameterFaders),
sizeof(ParameterFader), parameterFaderEntries);

View File

@ -1547,10 +1547,6 @@ void Serializer::saveEntries(void *d, const SaveLoadEntry *sle) {
// Skip obsolete entries
if (type & 128)
sle++;
} else if (size == 0xFF) {
// save reference
void *ptr = *((void **)at);
saveUint16(ptr ? ((*_save_ref) (_ref_me, type, ptr) + 1) : 0);
} else {
// save entry
int columns = 1;
@ -1586,12 +1582,6 @@ void Serializer::loadEntries(void *d, const SaveLoadEntry *sle) {
// Skip entries which are not present in this save game version
if (type & 128)
sle++;
} else if (size == 0xFF) {
// load reference...
int num = loadUint16();
// ...but only use it if it's still there in CURRENT_VER
if (sle->maxVersion == CURRENT_VER)
*((void **)at) = num ? (*_load_ref) (_ref_me, type, num - 1) : NULL;
} else {
// load entry
int columns = 1;

View File

@ -98,12 +98,6 @@ namespace Scumm {
// End marker
#define MKEND() {0xFFFF,0xFF,0xFF,0,0}
// A reference
#define MKREF(type,item,refid,minVer) {OFFS(type,item),refid,0xFF,minVer,CURRENT_VER}
// An obsolete reference.
#define MK_OBSOLETE_REF(type,item,refid,minVer,maxVer) {0,sleUint16,0,minVer,maxVer}
enum {
sleByte = 1,
@ -123,22 +117,13 @@ struct SaveLoadEntry {
uint8 maxVersion;
};
typedef int SerializerSaveReference(void *me, byte type, void *ref);
typedef void *SerializerLoadReference(void *me, byte type, int ref);
class Serializer {
public:
Serializer(Common::InSaveFile *in, Common::OutSaveFile *out, uint32 savegameVersion)
: _loadStream(in), _saveStream(out), _save_ref(0), _load_ref(0), _ref_me(0),
: _loadStream(in), _saveStream(out),
_savegameVersion(savegameVersion)
{ }
// FIXME: Try to get rid of the _save_ref / _load_ref / _ref_me HACK !!!
// This is used by imuse...
SerializerSaveReference *_save_ref;
SerializerLoadReference *_load_ref;
void *_ref_me;
void saveLoadArrayOf(void *b, int len, int datasize, byte filetype);
void saveLoadArrayOf(void *b, int num, int datasize, const SaveLoadEntry *sle);
void saveLoadEntries(void *d, const SaveLoadEntry *sle);