Ticket #2466: ft-workaround.diff

File ft-workaround.diff, 3.4 KB (added by eriktorbjorn, 18 years ago)

Possible workaround

  • scumm/actor.cpp

    RCS file: /cvsroot/scummvm/scummvm/scumm/actor.cpp,v
    retrieving revision 1.399
    diff -u -r1.399 actor.cpp
     
    909909        }
    910910}
    911911
     912bool ScummEngine::isValidActor(int id) const {
     913        return id >= 0 && id < _numActors && _actors[id]._number == id;
     914}
     915
    912916Actor *ScummEngine::derefActor(int id, const char *errmsg) const {
    913917        if (id == 0)
    914918                debugC(DEBUG_ACTORS, "derefActor(0, \"%s\") in script %d, opcode 0x%x",
    915919                        errmsg, vm.slot[_currentScript].number, _opcode);
    916920
    917         if (id < 0 || id >= _numActors || _actors[id]._number != id) {
     921        if (!isValidActor(id)) {
    918922                if (errmsg)
    919923                        error("Invalid actor %d in %s", id, errmsg);
    920924                else
     
    928932                debugC(DEBUG_ACTORS, "derefActorSafe(0, \"%s\") in script %d, opcode 0x%x",
    929933                        errmsg, vm.slot[_currentScript].number, _opcode);
    930934
    931         if (id < 0 || id >= _numActors || _actors[id]._number != id) {
     935        if (!isValidActor(id)) {
    932936                debugC(DEBUG_ACTORS, "Invalid actor %d in %s (script %d, opcode 0x%x)",
    933937                         id, errmsg, vm.slot[_currentScript].number, _opcode);
    934938                return NULL;
  • scumm/script.cpp

    RCS file: /cvsroot/scummvm/scummvm/scumm/script.cpp,v
    retrieving revision 1.238
    diff -u -r1.238 script.cpp
     
    10831083                localParamList[0] = _sentence[_sentenceNum].verb;
    10841084                localParamList[1] = _sentence[_sentenceNum].objectA;
    10851085                localParamList[2] = _sentence[_sentenceNum].objectB;
     1086
     1087                // WORKAROUND for bug #1407789. The script clearly assumes that
     1088                // one of the two objects is an actor. If that's not the case,
     1089                // fall back on what appears to be the usual sentence script.
     1090
     1091                if (_gameId == GID_FT && sentenceScript == 103 && !isValidActor(localParamList[1]) && !isValidActor(localParamList[2])) {
     1092                        sentenceScript = 28;
     1093                }
    10861094        }
    10871095        _currentScript = 0xFF;
    10881096        if (sentenceScript)
  • scumm/script_v5.cpp

    RCS file: /cvsroot/scummvm/scummvm/scumm/script_v5.cpp,v
    retrieving revision 1.303
    diff -u -r1.303 script_v5.cpp
     
    10521052        // WORKAROUND bug #746349. This is a really odd bug in either the script
    10531053        // or in our script engine. Might be a good idea to investigate this
    10541054        // further by e.g. looking at the FOA engine a bit closer.
    1055         if (_gameId == GID_INDY4 && _roomResource == 94 && vm.slot[_currentScript].number == 206 && act > _numActors) {
     1055        if (_gameId == GID_INDY4 && _roomResource == 94 && vm.slot[_currentScript].number == 206 && !isValidActor(act)) {
    10561056                setResult(0);
    10571057                return;
    10581058        }
  • scumm/scumm.h

    RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
    retrieving revision 1.668
    diff -u -r1.668 scumm.h
     
    848848        void setVerbObject(uint room, uint object, uint verb);
    849849
    850850public:
     851        bool isValidActor(int id) const;
     852
    851853        /* Should be in Actor class */
    852854        Actor *derefActor(int id, const char *errmsg = 0) const;
    853855        Actor *derefActorSafe(int id, const char *errmsg) const;