svn-id: r5893
This commit is contained in:
Max Horn 2002-12-09 01:27:40 +00:00
parent 2345aa0307
commit 0720fa80c8
8 changed files with 51 additions and 52 deletions

View File

@ -308,15 +308,15 @@ void ScummDebugger::printScripts()
int i; int i;
ScriptSlot *ss; ScriptSlot *ss;
printf("+---------------------------------+\n"); printf("+------------------------------\n");
printf("|# |num|sta|typ|un1|un2|fc|cut|un5|\n"); printf("|# |num|sta|typ|un1|un2|fc|cut|\n");
printf("+--+---+---+---+---+---+--+---+---+\n"); printf("+--+---+---+---+---+---+--+---+\n");
for (i = 0; i < 25; i++) { for (i = 0; i < 25; i++) {
ss = &_s->vm.slot[i]; ss = &_s->vm.slot[i];
if (ss->number) { if (ss->number) {
printf("|%2d|%3d|%3d|%3d|%3d|%3d|%2d|%3d|%3d|\n", printf("|%2d|%3d|%3d|%3d|%3d|%3d|%2d|%3d|\n",
i, ss->number, ss->status, ss->where, ss->unk1, ss->unk2, i, ss->number, ss->status, ss->where, ss->unk1, ss->unk2,
ss->freezeCount, ss->cutsceneOverride, ss->unk5); ss->freezeCount, ss->cutsceneOverride);
} }
} }
printf("+-------------------------------------+\n"); printf("+-------------------------------------+\n");

View File

@ -278,6 +278,16 @@ void Scumm::setCursor(int cursor)
warning("setCursor(%d)", cursor); warning("setCursor(%d)", cursor);
} }
void Scumm::setCameraAtEx(int at)
{
if (!(_features & GF_AFTER_V7)) {
camera._mode = CM_NORMAL;
camera._cur.x = at;
setCameraAt(at, 0);
camera._movingToActor = false;
}
}
void Scumm::setCameraAt(int pos_x, int pos_y) void Scumm::setCameraAt(int pos_x, int pos_y)
{ {
if (_features & GF_AFTER_V7) { if (_features & GF_AFTER_V7) {
@ -2393,7 +2403,7 @@ void Scumm::moveCamera()
if (t < 5) if (t < 5)
camera._dest.x = actorx - 80; camera._dest.x = actorx - 80;
} else } else
camera._movingToActor = 1; camera._movingToActor = true;
} }
} }
@ -2419,7 +2429,7 @@ void Scumm::moveCamera()
/* a is set a bit above */ /* a is set a bit above */
if (camera._movingToActor && camera._cur.x >> 3 == a->x >> 3) { if (camera._movingToActor && camera._cur.x >> 3 == a->x >> 3) {
camera._movingToActor = 0; camera._movingToActor = false;
} }
cameraMoved(); cameraMoved();
@ -2464,7 +2474,7 @@ void Scumm::panCameraTo(int x, int y)
camera._dest.x = x; camera._dest.x = x;
camera._mode = CM_PANNING; camera._mode = CM_PANNING;
camera._movingToActor = 0; camera._movingToActor = false;
} }
} }
@ -2477,7 +2487,7 @@ void Scumm::actorFollowCamera(int act)
if (act == 0) { if (act == 0) {
camera._mode = CM_NORMAL; camera._mode = CM_NORMAL;
camera._follows = 0; camera._follows = 0;
camera._movingToActor = 0; camera._movingToActor = false;
return; return;
} }
@ -2486,17 +2496,7 @@ void Scumm::actorFollowCamera(int act)
if (camera._follows != old) if (camera._follows != old)
runHook(0); runHook(0);
camera._movingToActor = 0; camera._movingToActor = false;
}
}
void Scumm::setCameraAtEx(int at)
{
if (!(_features & GF_AFTER_V7)) {
camera._mode = CM_NORMAL;
camera._cur.x = at;
setCameraAt(at, 0);
camera._movingToActor = 0;
} }
} }

View File

@ -471,7 +471,7 @@ void Scumm::saveOrLoad(Serializer *s)
MKLINE(ScriptSlot, freezeCount, sleByte, VER_V8), MKLINE(ScriptSlot, freezeCount, sleByte, VER_V8),
MKLINE(ScriptSlot, didexec, sleByte, VER_V8), MKLINE(ScriptSlot, didexec, sleByte, VER_V8),
MKLINE(ScriptSlot, cutsceneOverride, sleByte, VER_V8), MKLINE(ScriptSlot, cutsceneOverride, sleByte, VER_V8),
MKLINE(ScriptSlot, unk5, sleByte, VER_V8), MK_OBSOLETE(ScriptSlot, unk5, sleByte, VER_V8, VER_V10),
MKEND() MKEND()
}; };
@ -487,7 +487,7 @@ void Scumm::saveOrLoad(Serializer *s)
MKLINE(SentenceTab, unk2, sleUint8, VER_V8), MKLINE(SentenceTab, unk2, sleUint8, VER_V8),
MKLINE(SentenceTab, unk4, sleUint16, VER_V8), MKLINE(SentenceTab, unk4, sleUint16, VER_V8),
MKLINE(SentenceTab, unk3, sleUint16, VER_V8), MKLINE(SentenceTab, unk3, sleUint16, VER_V8),
MKLINE(SentenceTab, unk, sleUint8, VER_V8), MKLINE(SentenceTab, freezeCount, sleUint8, VER_V8),
MKEND() MKEND()
}; };

View File

@ -66,7 +66,7 @@ void Scumm::runScript(int script, int a, int b, int16 *lvarptr)
s = &vm.slot[slot]; s = &vm.slot[slot];
s->number = script; s->number = script;
s->offs = scriptOffs; s->offs = scriptOffs;
s->status = 2; s->status = ssRunning;
s->where = scriptType; s->where = scriptType;
s->unk1 = a; s->unk1 = a;
s->unk2 = b; s->unk2 = b;
@ -92,7 +92,7 @@ void Scumm::stopScriptNr(int script)
ss = &vm.slot[1]; ss = &vm.slot[1];
for (i = 1; i < NUM_SCRIPT_SLOT; i++, ss++) { for (i = 1; i < NUM_SCRIPT_SLOT; i++, ss++) {
if (script != ss->number || ss->where != WIO_GLOBAL && ss->where != WIO_LOCAL || ss->status == 0) if (script != ss->number || ss->where != WIO_GLOBAL && ss->where != WIO_LOCAL || ss->status == ssDead)
continue; continue;
if (ss->cutsceneOverride) if (ss->cutsceneOverride)
@ -133,7 +133,7 @@ void Scumm::stopObjectScript(int script)
for (i = 1; i < NUM_SCRIPT_SLOT; i++, ss++) { for (i = 1; i < NUM_SCRIPT_SLOT; i++, ss++) {
if (script == ss->number && (ss->where == WIO_ROOM || if (script == ss->number && (ss->where == WIO_ROOM ||
ss->where == WIO_INVENTORY || ss->where == WIO_FLOBJECT) ss->where == WIO_INVENTORY || ss->where == WIO_FLOBJECT)
&& ss->status != 0) { && ss->status != ssDead) {
if (ss->cutsceneOverride) if (ss->cutsceneOverride)
error("Object %d stopped with active cutscene/override", script); error("Object %d stopped with active cutscene/override", script);
ss->number = 0; ss->number = 0;
@ -167,7 +167,7 @@ int Scumm::getScriptSlot()
ss = &vm.slot[1]; ss = &vm.slot[1];
for (i = 1; i < NUM_SCRIPT_SLOT; i++, ss++) { for (i = 1; i < NUM_SCRIPT_SLOT; i++, ss++) {
if (ss->status == 0) if (ss->status == ssDead)
return i; return i;
} }
error("Too many scripts running, %d max", NUM_SCRIPT_SLOT); error("Too many scripts running, %d max", NUM_SCRIPT_SLOT);
@ -210,7 +210,7 @@ void Scumm::runScriptNested(int script)
if (nest->number != 0xFF) { if (nest->number != 0xFF) {
slot = &vm.slot[nest->slot]; slot = &vm.slot[nest->slot];
if (slot->number == nest->number && slot->where == nest->where && if (slot->number == nest->number && slot->where == nest->where &&
slot->status != 0 && slot->freezeCount == 0) { slot->status != ssDead && slot->freezeCount == 0) {
_currentScript = nest->slot; _currentScript = nest->slot;
getScriptBaseAddress(); getScriptBaseAddress();
getScriptEntryPoint(); getScriptEntryPoint();
@ -544,7 +544,7 @@ void Scumm::stopObjectCode()
} }
} }
ss->number = 0; ss->number = 0;
ss->status = 0; ss->status = ssDead;
_currentScript = 0xFF; _currentScript = 0xFF;
} }
@ -583,7 +583,7 @@ void Scumm::freezeScripts(int flag)
} }
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++)
_sentence[i].unk++; _sentence[i].freezeCount++;
if (vm.cutSceneScriptIndex != 0xFF) { if (vm.cutSceneScriptIndex != 0xFF) {
vm.slot[vm.cutSceneScriptIndex].status &= 0x7F; vm.slot[vm.cutSceneScriptIndex].status &= 0x7F;
@ -603,8 +603,8 @@ void Scumm::unfreezeScripts()
} }
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
if (_sentence[i].unk > 0) if (_sentence[i].freezeCount > 0)
_sentence[i].unk--; _sentence[i].freezeCount--;
} }
} }
@ -694,11 +694,11 @@ void Scumm::killScriptsAndResources()
if (ss->where == WIO_ROOM || ss->where == WIO_FLOBJECT) { if (ss->where == WIO_ROOM || ss->where == WIO_FLOBJECT) {
if (ss->cutsceneOverride) if (ss->cutsceneOverride)
error("Object %d stopped with active cutscene/override in exit", ss->number); error("Object %d stopped with active cutscene/override in exit", ss->number);
ss->status = 0; ss->status = ssDead;
} else if (ss->where == WIO_LOCAL) { } else if (ss->where == WIO_LOCAL) {
if (ss->cutsceneOverride) if (ss->cutsceneOverride)
error("Script %d stopped with active cutscene/override in exit", ss->number); error("Script %d stopped with active cutscene/override in exit", ss->number);
ss->status = 0; ss->status = ssDead;
} }
} }
@ -721,7 +721,7 @@ void Scumm::killScriptsAndResources()
} }
} }
void Scumm::checkAndRunVar33() void Scumm::checkAndRunSentenceScript()
{ {
int i; int i;
ScriptSlot *ss; ScriptSlot *ss;
@ -730,11 +730,11 @@ void Scumm::checkAndRunVar33()
if (isScriptInUse(_vars[VAR_SENTENCE_SCRIPT])) { if (isScriptInUse(_vars[VAR_SENTENCE_SCRIPT])) {
ss = vm.slot; ss = vm.slot;
for (i = 0; i < NUM_SCRIPT_SLOT; i++, ss++) for (i = 0; i < NUM_SCRIPT_SLOT; i++, ss++)
if (ss->number == _vars[VAR_SENTENCE_SCRIPT] && ss->status != 0 && ss->freezeCount == 0) if (ss->number == _vars[VAR_SENTENCE_SCRIPT] && ss->status != ssDead && ss->freezeCount == 0)
return; return;
} }
if (!_sentenceNum || _sentence[_sentenceNum - 1].unk) if (!_sentenceNum || _sentence[_sentenceNum - 1].freezeCount)
return; return;
_sentenceNum--; _sentenceNum--;
@ -767,10 +767,10 @@ void Scumm::decreaseScriptDelay(int amount)
ScriptSlot *ss = &vm.slot[0]; ScriptSlot *ss = &vm.slot[0];
int i; int i;
for (i = 0; i < NUM_SCRIPT_SLOT; i++, ss++) { for (i = 0; i < NUM_SCRIPT_SLOT; i++, ss++) {
if (ss->status == 1) { if (ss->status == ssPaused) {
ss->delay -= amount; ss->delay -= amount;
if (ss->delay < 0) { if (ss->delay < 0) {
ss->status = 2; ss->status = ssRunning;
ss->delay = 0; ss->delay = 0;
} }
} }
@ -945,7 +945,7 @@ bool Scumm::isScriptRunning(int script)
int i; int i;
ScriptSlot *ss = vm.slot; ScriptSlot *ss = vm.slot;
for (i = 0; i < NUM_SCRIPT_SLOT; i++, ss++) for (i = 0; i < NUM_SCRIPT_SLOT; i++, ss++)
if (ss->number == script && (ss->where == WIO_GLOBAL || ss->where == WIO_LOCAL) && ss->status) if (ss->number == script && (ss->where == WIO_GLOBAL || ss->where == WIO_LOCAL) && ss->status != ssDead)
return true; return true;
return false; return false;
} }
@ -955,7 +955,7 @@ bool Scumm::isRoomScriptRunning(int script)
int i; int i;
ScriptSlot *ss = vm.slot; ScriptSlot *ss = vm.slot;
for (i = 0; i < NUM_SCRIPT_SLOT; i++, ss++) for (i = 0; i < NUM_SCRIPT_SLOT; i++, ss++)
if (ss->number == script && ss->where == WIO_ROOM && ss->status) if (ss->number == script && ss->where == WIO_ROOM && ss->status != ssDead)
return true; return true;
return false; return false;
@ -1101,7 +1101,7 @@ void Scumm::exitCutscene()
if (offs) { if (offs) {
ScriptSlot *ss = &vm.slot[vm.cutSceneScript[vm.cutSceneStackPointer]]; ScriptSlot *ss = &vm.slot[vm.cutSceneScript[vm.cutSceneStackPointer]];
ss->offs = offs; ss->offs = offs;
ss->status = 2; ss->status = ssRunning;
ss->freezeCount = 0; ss->freezeCount = 0;
if (ss->cutsceneOverride > 0) if (ss->cutsceneOverride > 0)
@ -1147,5 +1147,5 @@ void Scumm::doSentence(int c, int b, int a)
st->unk5 = c; st->unk5 = c;
st->unk4 = b; st->unk4 = b;
st->unk3 = a; st->unk3 = a;
st->unk = 0; st->freezeCount = 0;
} }

View File

@ -726,7 +726,7 @@ void Scumm::o5_doSentence()
} else { } else {
st->unk2 = 1; st->unk2 = 1;
} }
st->unk = 0; st->freezeCount = 0;
} }
void Scumm::o5_drawBox() void Scumm::o5_drawBox()
@ -2018,7 +2018,7 @@ void Scumm::o5_soundKludge()
if (_features & GF_SMALL_HEADER) { // Is WaitForSentence in SCUMM V3 if (_features & GF_SMALL_HEADER) { // Is WaitForSentence in SCUMM V3
if (_sentenceNum) { if (_sentenceNum) {
if (_sentence[_sentenceNum - 1].unk && !isScriptInUse(_vars[VAR_SENTENCE_SCRIPT])) if (_sentence[_sentenceNum - 1].freezeCount && !isScriptInUse(_vars[VAR_SENTENCE_SCRIPT]))
return; return;
} else if (!isScriptInUse(_vars[VAR_SENTENCE_SCRIPT])) } else if (!isScriptInUse(_vars[VAR_SENTENCE_SCRIPT]))
return; return;
@ -2344,7 +2344,7 @@ void Scumm::o5_wait()
return; return;
case 4: /* wait for sentence */ case 4: /* wait for sentence */
if (_sentenceNum) { if (_sentenceNum) {
if (_sentence[_sentenceNum - 1].unk && !isScriptInUse(_vars[VAR_SENTENCE_SCRIPT])) if (_sentence[_sentenceNum - 1].freezeCount && !isScriptInUse(_vars[VAR_SENTENCE_SCRIPT]))
return; return;
break; break;
} }

View File

@ -2067,7 +2067,7 @@ void Scumm::o6_wait()
case 171: case 171:
printf("wait for sentence"); printf("wait for sentence");
if (_sentenceNum) { if (_sentenceNum) {
if (_sentence[_sentenceNum - 1].unk && !isScriptInUse(_vars[VAR_SENTENCE_SCRIPT])) if (_sentence[_sentenceNum - 1].freezeCount && !isScriptInUse(_vars[VAR_SENTENCE_SCRIPT]))
return; return;
break; break;
} }

View File

@ -99,9 +99,9 @@ struct ScriptSlot {
uint16 delayFrameCount; uint16 delayFrameCount;
byte status; byte status;
byte where; byte where;
byte unk1, unk2, freezeCount, didexec; byte unk1, unk2, freezeCount;
bool didexec;
byte cutsceneOverride; byte cutsceneOverride;
byte unk5;
}; };
struct NestedScript { struct NestedScript {
@ -237,8 +237,7 @@ struct SentenceTab {
byte unk2; byte unk2;
uint16 unk4; uint16 unk4;
uint16 unk3; uint16 unk3;
int8 unk; uint8 freezeCount;
byte pad;
}; };
// TODO / FIXME: next time save game format changes, Fingolfin would like to // TODO / FIXME: next time save game format changes, Fingolfin would like to
@ -495,7 +494,7 @@ public:
void beginOverride(); void beginOverride();
void endOverride(); void endOverride();
void killScriptsAndResources(); void killScriptsAndResources();
void checkAndRunVar33(); void checkAndRunSentenceScript();
void decreaseScriptDelay(int amount); void decreaseScriptDelay(int amount);
bool isScriptRunning(int script); bool isScriptRunning(int script);
bool isRoomScriptRunning(int script); bool isRoomScriptRunning(int script);

View File

@ -499,7 +499,7 @@ int Scumm::scummLoop(int delta)
runAllScripts(); runAllScripts();
checkExecVerbs(); checkExecVerbs();
checkAndRunVar33(); checkAndRunSentenceScript();
if (_currentRoom == 0) { if (_currentRoom == 0) {
gdi._cursorActive = 0; gdi._cursorActive = 0;