diff -ur ScummVM-cvs20021022/scummvm/scumm/actor.cpp ScummVM-cvs20021022+hack/scummvm/scumm/actor.cpp
old
|
new
|
|
896 | 896 | |
897 | 897 | cr._outheight = _vm->virtscr->height; |
898 | 898 | |
899 | | // If walkbox is 0, that could mean two things: |
| 899 | // FIXME - Hack to fix two glitches in the scene where Bobbin |
| 900 | // heals Rusty: Bobbin's feet get masked when Rusty shows him |
| 901 | // what happens to The Forge, and Rusty gets masked after |
| 902 | // Bobbin heals him. |
900 | 903 | // |
901 | | // Either the actor is or has been moved around with |
902 | | // ignoreBoxes != 0. In this case, use the mask for the |
903 | | // walkbox the actor is currently inside or, if it's not in |
904 | | // any walkbox, don't mask at all. |
| 904 | // When an actor is moved around without regards to walkboxes, |
| 905 | // its walkbox is set to 0. Unfortunately that's a valid |
| 906 | // walkbox in older games, and its mask may be completely |
| 907 | // wrong for this purpose. |
905 | 908 | // |
906 | | // This fixes two graphics glitches in Loom. Bobbin's feet |
907 | | // are not obscured after Rusty's ghost has shown him what's |
908 | | // happened to The Forge, and Rusty himself isn't partially |
909 | | // obscured after Bobbin heals him. |
| 909 | // So instead use the mask of the box where the actor happens |
| 910 | // to be at the moment or, if it's not in any box, don't mask |
| 911 | // at all. |
910 | 912 | // |
911 | | // Or it could mean that the actor really is in walkbox 0. |
| 913 | // Checking if ignoreBoxes != 0 isn't enough to fix all the |
| 914 | // glitches, so I have to check for walkbox 0. However, that |
| 915 | // gives too many false positives -- it breaks masking in a |
| 916 | // few other rooms, e.g. when Stoke leaves the room where he |
| 917 | // locks up "Rusty". |
| 918 | // |
| 919 | // Until someone can find the proper fix, only apply it to the |
| 920 | // one room where it's actually needed. |
912 | 921 | |
913 | | if (_vm->_gameId == GID_LOOM256 && walkbox == 0) { |
914 | | int i; |
| 922 | if (_vm->_gameId == GID_LOOM256 && _vm->_currentRoom == 34 && walkbox == 0) { |
| 923 | int num_boxes, i; |
915 | 924 | |
916 | 925 | cr._zbuf = 0; |
| 926 | num_boxes = _vm->getNumBoxes(); |
| 927 | |
| 928 | // For this particular room it won't matter in which |
| 929 | // direction we loop. In other rooms, looping in the |
| 930 | // other direction may pick the wrong box. |
917 | 931 | |
918 | | for (i = _vm->getNumBoxes() - 1; i >= 0; i--) { |
| 932 | for (i = 0; i < num_boxes; i++) { |
919 | 933 | if (_vm->checkXYInBoxBounds(i, x, y)) { |
920 | 934 | cr._zbuf = _vm->getMaskFromBox(i); |
921 | 935 | break; |
… |
… |
|
1141 | 1155 | abr.dist = 0; |
1142 | 1156 | walkbox = 0; |
1143 | 1157 | } else { |
1144 | | // FIXME: this prevents part of bug #605970 (Loom) from occuring. Not sure |
1145 | | // if there is a better way to achieve this. |
| 1158 | // FIXME: this prevents part of bug #605970 (Loom) from |
| 1159 | // occuring, and also fixes a walk bug with Rusty's ghost. |
| 1160 | // Not sure if there is a better way to achieve this. |
1146 | 1161 | if (walkbox == 0) |
1147 | 1162 | adjustActorPos(); |
1148 | 1163 | |