Opened 6 years ago
Closed 6 years ago
#10789 closed defect (fixed)
QFG4: Peering through doors at absent bats in the castle
Reported by: | Vhati | Owned by: | Vhati |
---|---|---|---|
Priority: | low | Component: | Engine: SCI |
Version: | Keywords: | SCI32 original has-pull-request | |
Cc: | Game: | Quest for Glory 4 |
Description
ScummVM 2.1.0git3797-ge7d23d2cd9 (Oct 25 2018 04:17:12)
Windows 7 64bit
QFG4 CD (English)
In both rooms adjacent to the bat-infested stairway...
If you "Peer through keyhole" on doors leading to the stairway, you get a message indicating the presence of bats, even after you've killed them.
"You catch a brief glimpse of the elusive flash of wings on the other side of the door."
When the bats are gone, the typical empty message would be more appropriate.
"Peering through the keyhole, you see no threatening activity on the other side of the door."
The original interpreter also does this.
File - 5kb MD5 - Full MD5
RESOURCE.000 - 263dce4aa34c49d3ad29bec889007b1c - 1364ba69e3c0abb68cc0170650a56692
RESOURCE.AUD - c39521bffb1d8b19a57394866184a0ca - 71098b9e97e20c8941c0e4812d5f906f
RESOURCE.MAP - aba367f2102e81782d961b14fbe3d630 - 801a04cc6aa5d437681a2dd0b6545248
RESOURCE.SFX - 3cf95e09dab8b11d675e0537e18b499a - 7c858d7253f86dab4cc6066013c5ecec
Attachments (2)
Change History (10)
by , 6 years ago
comment:1 by , 6 years ago
Occurs in the floppy edition under ScummVM, and its original interpreter, too.
ScummVM 2.1.0git3797-ge7d23d2cd9 (Oct 25 2018 04:17:12)
Windows 7 64bit
QFG4 Floppy 1.1a + note patch (English)
File - 5kb MD5 - Full MD5
RESOURCE.000 - f64fd6aa3977939a86ff30783dd677e1 - ff42260a665995a85aeb277ad80aac8a
RESOURCE.MAP - d10a4cc177d2091d744e2ad8c049b0ae - 3695b1b0a1d15f3d324ea9f0cc325245
RESOURCE.SFX - 3cf95e09dab8b11d675e0537e18b499a - 7c858d7253f86dab4cc6066013c5ecec
comment:2 by , 6 years ago
Bat stairway is 632.
The lower room is 644.
The upper room, with the crest bookshelf, is 663.
The stairway tracks which bats have been killed with plot flags (331-334). They're in a bitmask, so instead of calling proc0_4(), we can check all four simultaneously (0000000000011110 == 30d).
global[520] & 30 == 30
The lower room was an easy fix. Combining the largely redundant say() calls makes room.
script 644 - sPeepingTom::changeState(1)
(1 (if (< (g0_hero x?) 60) # You don't see any sign of life or movement beyond the door. (g91_gloryMessager say: 2 155 27 1 self 640) else # You catch a brief glimpse of the elusive flash of wings # on the other side of the door. (g91_gloryMessager say: 2 155 29 1 self 640) ) )
Corrected version: When peering, the left door is generic. For the right door... If all bats were killed, display the generic empty message. Otherwise report bats.
The upper room has the same problem, always reporting bats.
script 663 - sPeepingTom::changeState()
(0 (g1_Glory handsOff:) (g0_hero view: 4 setLoop: 0 1 setCel: 0 setCycle: End self ) ) (1 # You catch a brief glimpse of the elusive flash of wings # on the other side of the door. (g91_gloryMessager say: 2 155 29 1 self 640) ) (2 (= seconds 3)) (3 (g0_hero setCycle: Beg self)) (4 (g0_hero normalize:) (g1_Glory handsOn:) (self dispose:) )
I can't find freeable bytes to fix that one.
I'd rather not jump to a distant code cave somewhere else in the script, and back.
EDIT: Drat. Even code cave possibilities are restricted by edits the CD edition made. Inconsistency among editions means I definitely can't jump a fixed distance to anywhere before sPeepingTom or after sCastOpenDoor.
comment:3 by , 6 years ago
Keywords: | has-pull-request added |
---|
Pull Request: SCI32: Fix QFG4 peering at absent bats
comment:4 by , 6 years ago
A variable could be set to 27/29 in init() and dropped in.
(global91 say: 2 155 {someVar} 1 self 640)
No available locals to hijack. An unused global, ick.
Wait... Script objects' "register" property is a freebie, right? init() could set that!
comment:5 by , 6 years ago
script 663 - rm663::init()
(method (init) (if (or (== g12_myPrevRoomNum 660) (== g12_myPrevRoomNum 661)) (g0_hero posn: 30 129) (= local0 1) (g0_hero hide:) else (g0_hero posn: 278 133) ) (g0_hero init: setScaler: Scaler 100 100 189 0 normalize: (if (== global12 660) 4 else 5) ) (super init: &rest) (g2_myCurrentRoom addObstacle: ((Polygon new:) type: 2 init: 57 130 0 172 0 0 319 0 319 189 299 189 252 130 130 123 72 121 yourself: ) ((Polygon new:) type: 2 init: 87 133 221 135 214 160 198 169 169 179 118 180 97 168 82 146 yourself: ) ) (pDoor approachVerbs: 4 32 init:) (pFire ignoreActors: approachVerbs: 4 init: setCycle: Fwd) (pSecretDoor2 ignoreActors: init:) (pCrest init: ignoreActors: approachVerbs: 4) (vFirePlace ignoreActors: init:) (vBookCase ignoreActors: init:) (vRightDoor ignoreActors: approachVerbs: 4 32 setPri: (if local0 97 else 207) init: ) (doorTeller init: vRightDoor 640 2 155) (vRug ignoreActors: init:) (vTheTable ignoreActors: approachVerbs: 4 init:) (vCeiling ignoreActors: init:) (vRightCeiling ignoreActors: init:) (vSecretDoor ignoreActors: init:) (vBook ignoreActors: init:) (fChair1 approachVerbs: 4 init:) (fChair2 approachVerbs: 4 init:) (fChair3 approachVerbs: 4 init:) (global2 setScript: sComeOnIn) )
Subroutining "(... ignoreActors: init:)" was not as efficient as I'd need.
At least for only four Views: vCeiling through vBook.
Then there's the matter of getting sPeepingTom's loffsa value to set its "register" property. *sigh*
comment:6 by , 6 years ago
No available locals to hijack.
Well, there *is* local1. It tracks whether the passage is open/closed. The bookshelf patch disabled passage closing, rendering that variable moot. It'd take two short patches just to erase mentions of it. Maaaybe one with a huge ADDTOOFFSET macro? Not great.
The bookshelf patch makes sCloseSecretDoor moot too. That would take one average-sized patch to replace its content with an intelligent say(). Plus two short ones to call it from sPeepingTom (dedicated lofsa values for CD/floppy).
comment:8 by , 6 years ago
Owner: | set to |
---|---|
Resolution: | → fixed |
Status: | new → closed |
SavedGame (CD) - Kill bats, then peek