Preliminary save/load support for Urban Runner

svn-id: r35418
This commit is contained in:
Sven Hesse 2008-12-18 02:48:15 +00:00
parent 3ddbc1211f
commit 4ceecdb25f
12 changed files with 314 additions and 39 deletions

View file

@ -212,8 +212,8 @@ void Inter_v2::setupOpcodes() {
/* 40 */
OPCODE(o2_totSub),
OPCODE(o2_switchTotSub),
OPCODE(o2_copyVars),
OPCODE(o2_pasteVars),
OPCODE(o2_pushVars),
OPCODE(o2_popVars),
/* 44 */
{NULL, ""},
{NULL, ""},
@ -1178,39 +1178,40 @@ void Inter_v2::o2_switchTotSub() {
_vm->_game->switchTotSub(index, skipPlay);
}
void Inter_v2::o2_copyVars() {
void Inter_v2::o2_pushVars() {
byte count;
int16 varOff;
count = *_vm->_global->_inter_execPtr++;
for (int i = 0; i < count; i++, _pastePos++) {
for (int i = 0; i < count; i++, _varStackPos++) {
if ((*_vm->_global->_inter_execPtr == 25) ||
(*_vm->_global->_inter_execPtr == 28)) {
varOff = _vm->_parse->parseVarIndex();
_vm->_global->_inter_execPtr++;
_variables->copyTo(varOff, _pasteBuf + _pastePos, _pasteSizeBuf + _pastePos,
_variables->copyTo(varOff, _varStack + _varStackPos,
_varSizesStack + _varStackPos,
_vm->_global->_inter_animDataSize * 4);
_pastePos += _vm->_global->_inter_animDataSize * 4;
_pasteBuf[_pastePos] = _vm->_global->_inter_animDataSize * 4;
_pasteSizeBuf[_pastePos] = _vm->_global->_inter_animDataSize * 4;
_varStackPos += _vm->_global->_inter_animDataSize * 4;
_varStack[_varStackPos] = _vm->_global->_inter_animDataSize * 4;
_varSizesStack[_varStackPos] = _vm->_global->_inter_animDataSize * 4;
} else {
if (evalExpr(&varOff) == 20)
if (!evalExpr(&varOff) == 20)
_vm->_global->_inter_resVal = 0;
memcpy(_pasteBuf + _pastePos, &_vm->_global->_inter_resVal, 4);
memcpy(_pasteSizeBuf + _pastePos, &_vm->_global->_inter_resVal, 4);
_pastePos += 4;
_pasteBuf[_pastePos] = 4;
_pasteSizeBuf[_pastePos] = 4;
memcpy(_varStack + _varStackPos, &_vm->_global->_inter_resVal, 4);
memcpy(_varSizesStack + _varStackPos, &_vm->_global->_inter_resVal, 4);
_varStackPos += 4;
_varStack[_varStackPos] = 4;
_varSizesStack[_varStackPos] = 4;
}
}
}
void Inter_v2::o2_pasteVars() {
void Inter_v2::o2_popVars() {
byte count;
int16 varOff;
int16 sizeV;
@ -1219,12 +1220,13 @@ void Inter_v2::o2_pasteVars() {
count = *_vm->_global->_inter_execPtr++;
for (int i = 0; i < count; i++) {
varOff = _vm->_parse->parseVarIndex();
sizeV = _pasteBuf[--_pastePos];
sizeS = _pasteSizeBuf[_pastePos];
sizeV = _varStack[--_varStackPos];
sizeS = _varSizesStack[_varStackPos];
assert(sizeV == sizeS);
_pastePos -= sizeV;
_variables->copyFrom(varOff, _pasteBuf + _pastePos, _pasteSizeBuf + _pastePos, sizeV);
_varStackPos -= sizeV;
_variables->copyFrom(varOff, _varStack + _varStackPos,
_varSizesStack + _varStackPos, sizeV);
}
}