RCS file: /cvsroot/scummvm/scummvm/scumm/actor.cpp,v
retrieving revision 1.399
diff -u -r1.399 actor.cpp
|
|
|
909 | 909 | } |
910 | 910 | } |
911 | 911 | |
| 912 | bool ScummEngine::isValidActor(int id) const { |
| 913 | return id >= 0 && id < _numActors && _actors[id]._number == id; |
| 914 | } |
| 915 | |
912 | 916 | Actor *ScummEngine::derefActor(int id, const char *errmsg) const { |
913 | 917 | if (id == 0) |
914 | 918 | debugC(DEBUG_ACTORS, "derefActor(0, \"%s\") in script %d, opcode 0x%x", |
915 | 919 | errmsg, vm.slot[_currentScript].number, _opcode); |
916 | 920 | |
917 | | if (id < 0 || id >= _numActors || _actors[id]._number != id) { |
| 921 | if (!isValidActor(id)) { |
918 | 922 | if (errmsg) |
919 | 923 | error("Invalid actor %d in %s", id, errmsg); |
920 | 924 | else |
… |
… |
|
928 | 932 | debugC(DEBUG_ACTORS, "derefActorSafe(0, \"%s\") in script %d, opcode 0x%x", |
929 | 933 | errmsg, vm.slot[_currentScript].number, _opcode); |
930 | 934 | |
931 | | if (id < 0 || id >= _numActors || _actors[id]._number != id) { |
| 935 | if (!isValidActor(id)) { |
932 | 936 | debugC(DEBUG_ACTORS, "Invalid actor %d in %s (script %d, opcode 0x%x)", |
933 | 937 | id, errmsg, vm.slot[_currentScript].number, _opcode); |
934 | 938 | return NULL; |
RCS file: /cvsroot/scummvm/scummvm/scumm/script.cpp,v
retrieving revision 1.238
diff -u -r1.238 script.cpp
|
|
|
1083 | 1083 | localParamList[0] = _sentence[_sentenceNum].verb; |
1084 | 1084 | localParamList[1] = _sentence[_sentenceNum].objectA; |
1085 | 1085 | 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 | } |
1086 | 1094 | } |
1087 | 1095 | _currentScript = 0xFF; |
1088 | 1096 | if (sentenceScript) |
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v5.cpp,v
retrieving revision 1.303
diff -u -r1.303 script_v5.cpp
|
|
|
1052 | 1052 | // WORKAROUND bug #746349. This is a really odd bug in either the script |
1053 | 1053 | // or in our script engine. Might be a good idea to investigate this |
1054 | 1054 | // 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)) { |
1056 | 1056 | setResult(0); |
1057 | 1057 | return; |
1058 | 1058 | } |
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.668
diff -u -r1.668 scumm.h
|
|
|
848 | 848 | void setVerbObject(uint room, uint object, uint verb); |
849 | 849 | |
850 | 850 | public: |
| 851 | bool isValidActor(int id) const; |
| 852 | |
851 | 853 | /* Should be in Actor class */ |
852 | 854 | Actor *derefActor(int id, const char *errmsg = 0) const; |
853 | 855 | Actor *derefActorSafe(int id, const char *errmsg) const; |