Opened 6 years ago
Closed 5 years ago
#10747 closed defect (fixed)
QFG4: Crash when walking around the squid monolith
Reported by: | Vhati | Owned by: | sluicebox |
---|---|---|---|
Priority: | normal | Component: | Engine: SCI |
Version: | Keywords: | sci32 original has-pull-request | |
Cc: | Game: | Quest for Glory 4 |
Description
ScummVM 2.1.0git3770-g15306581ab (Oct 18 2018 04:27:32)
Windows 7 64bit
QFG4 CD (English)
After I initially emerge from the cave and slide down the gooey path...
The game crashes when I attempt to walk around the squid monolith from a NW position toward a point on the right of it. The walk cycle slides when a crash is imminent. Attempting to grab the bonsai bush can also cause a walk + crash just before the narrator would say you can't reach it.
The attached save is already standing at a problematic spot, ready to trigger a crash.
" " "
lookupSelector: Attempt to send to non-object or invalid script. Address 0000:0000, method Grycler::init (room 800, script 64977, localCall ffffffff)!
" " "
File - 5kb MD5 - Full MD5
RESOURCE.000 - 263dce4aa34c49d3ad29bec889007b1c - 1364ba69e3c0abb68cc0170650a56692
RESOURCE.AUD - c39521bffb1d8b19a57394866184a0ca - 71098b9e97e20c8941c0e4812d5f906f
RESOURCE.MAP - aba367f2102e81782d961b14fbe3d630 - 801a04cc6aa5d437681a2dd0b6545248
RESOURCE.SFX - 3cf95e09dab8b11d675e0537e18b499a - 7c858d7253f86dab4cc6066013c5ecec
Attachments (1)
Change History (14)
by , 6 years ago
comment:1 by , 6 years ago
Summary: | QFG4 Crash when walking around the squid monolith → QFG4: Crash when walking around the squid monolith |
---|
comment:2 by , 6 years ago
Summary: | QFG4: Crash when walking around the squid monolith → QFG4: Pathfinding crash when walking around the squid monolith |
---|
comment:3 by , 6 years ago
I wasn't able to reproduce this with the floppy edition under ScummVM.
ScummVM 2.1.0git3770-g15306581ab (Oct 18 2018 04:27:32)
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:4 by , 6 years ago
backtrace
script 64992 - Motion::init(); pc=0017:0456 script 64998 - hero::setHeading(0000:004e); pc=0006:0f31 script 28 - stopGroop::doit(hero, 0000:004e, 0); pc=0013:01b12 script 64977 - Grooper::doit(hero, 0000:004e, 0); pc=0015:022e script 64998 - hero::setCycle(Grycler, stopGroop, 0000:0002); pc=0006:06af script 64977 - Grycler::init(hero, stopGroop, 0000:0002); pc=0015:0309 is the crashing opcode
Stepping through until it crashes...
# Indented to match each send with its pushes. 0015:02f3: 38 96 00 pushi 0096 ; isKindOf 0015:02f6: 78 push1 0015:02f7: 51 59 class StopWalk[59], 0015:02f9: 36 push 0015:02fa: 38 47 02 pushi 0247 ; oldCycler 0015:02fd: 76 push0 0015:02fe: 39 47 pushi 47 ; looper 0015:0300: 76 push0 0015:0301: 63 14 pToa client[14] (client) 0015:0303: 4a 04 00 send 0004 hero::looper[VAR]() 0015:0306: 4a 04 00 send 0004 stopGroop::oldCycler[VAR]() 0015:0309: 4a 06 00 send 0006 <no such object>::isKindOf[INVALID_OBJ](StopWalk) lookupSelector: Attempt to send to non-object or invalid script. Address 0000:0000, method Grycler::init (room 800, script 64977, localCall ffffffff)!
At that moment, hero's "looper" property is stopGroop.
stopGroop's "oldCycler" property is 0000:0000.
Grycler::init()
(method (init param1 theCaller theLoopIndex) (super init: param1) (= caller theCaller) (= numOfLoops (if (< (NumLoops client) 8) 4 else 8)) (= cycleDir (- (proc64999_0 (proc64982_2 (* theLoopIndex 45) (param1 heading?)) ) ) ) (= loopIndex theLoopIndex) (if (self loopIsCorrect:) (if (and (((client looper?) oldCycler?) isKindOf: StopWalk) (== (((client looper?) oldCycler?) vStopped?) -1) ) (client loop: [local8 loopIndex]) ) (self cycleDone:) ) )
comment:5 by , 6 years ago
Summary: | QFG4: Pathfinding crash when walking around the squid monolith → QFG4: Crash when walking around the squid monolith |
---|
comment:6 by , 6 years ago
I guess that isKindOf() AND condition needs an "is oldCycler > 0" check above it.
As seen with cycler in stopGroop::doit().
(method (doit) (if (and (global0 cycler?) ((global0 cycler?) isKindOf: StopWalk) ) (global0 view: ((global0 cycler?) vWalking?)) ) (super doit: &rest) )
comment:7 by , 6 years ago
Nah. That just staves off the crash until something else chokes on the null, all the while hero skates around. So the null assignment needs to be prevented somewhere.
Diffed Grooper/Grycler against the same script in SQ6 Demo, released a year later. Slightly more efficient but nothing that'd fix this AFAICT.
comment:9 by , 6 years ago
the null assignment needs to be prevented somewhere.
"setCycle: 0" occurs frequently throughout the game.
Scripts: 270, 290, 360, 440, 460, 500, 579, 600, 630, 670, 680, 730, 750, 760, 770, 780, 800, 803, 64998
On hero, it's usually temporary (not always), and a new cycler is assigned at a later state within the same Script object that nulled it.
A null cycler should be tolerated in general then.
all the while hero skates around
This null assignment is still bad.
comment:11 by , 5 years ago
Keywords: | sci32 original has-pull-request added; SCI32 removed |
---|---|
Owner: | set to |
comment:13 by , 5 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
SavedGame - Squid Monolith