Opened 6 years ago

Last modified 5 months ago

#6867 new defect

TOON: Missing Flux animation when asking him to open cupboard

Reported by: eriktorbjorn Owned by:
Priority: normal Component: Engine: Toon
Version: Keywords:
Cc: Game: Toonstruck

Description

English version of the game, current ScummVM Git snapshot

If you use Flux on the cupboard at the foot of the stairs in the first room, Flux explains that he can't open it, but that he is a pretty good dancer. At this point, the game plays a brief drum riff and he's supposed to - but doesn't - do a little dance.

My only theory is that sys_Cmd_Play_Flux_Anim() currently is a no-op, and it does get called at this point. But if so, I have no idea what it's supposed to do.

Ticket imported from: bugs/6867.

Attachments (2)

toon.017 (25.5 KB ) - added by eriktorbjorn 6 years ago.
toon.047 (25.5 KB ) - added by eriktorbjorn 6 years ago.

Download all attachments as: .zip

Change History (13)

comment:1 by eriktorbjorn, 6 years ago

Component: Engine: ZVisionEngine: Toon
Game: Zork Grand InquisitorToonstruck

by eriktorbjorn, 6 years ago

Attachment: toon.017 added

comment:2 by eriktorbjorn, 6 years ago

There is another that I'm going to assume is missing for the same reason: After you repair the Chrurnatron, the cow and the sheep will thank you. The sheep isn't moving when she's talking. I've checked with DOSBox, and there she is moving. I'm attaching a savegame from right before repairing the Churnatron.

comment:3 by eriktorbjorn, 6 years ago

Scratch that. I restarted ScummVM and loaded my savegame again, and now the sheep was animated, just like expected. So I guess there is a bug lurking in there, but it's not anywhere near as easy to reproduce as I first thought.

by eriktorbjorn, 6 years ago

Attachment: toon.047 added

comment:4 by eriktorbjorn, 6 years ago

I may have found how I got the bug to happen in the first place. In this new savegame, use the magnet on the haystack and then - without putting it away first - use the Churnatron part on the Churnatron. (In the previous savegame, I had already put the piece away.)

comment:5 by eriktorbjorn, 6 years ago

It also looks like I can only reproduce it if I press Space to skip Drew's lines. I don't know why that would also skip the sheep animation, which doesn't happen until a few seconds later...

comment:6 by eriktorbjorn, 8 months ago

The sys_Cmd_Play_Flux_Anim() apparently takes two parameters. This is what I see if I turn on script debugging:

[0x00001E28] EMCInterpreter::op_push([12/12])
[0x00001E2C] EMCInterpreter::op_push([38/38])
[0x00001E30] EMCInterpreter::op_sysCall([72/72])
[0x00001E34] EMCInterpreter::op_addSP([2/2])

On a hunch, I tried this:

int32 ScriptFunc::sys_Cmd_Play_Flux_Anim(EMCState *state) {
	_vm->getFlux()->playAnim(stackPos(0), 0, stackPos(1));
	return 0;
}

That does seem to start the correct animation. Unfortunately, the animation never stops.

(It's very easy to compare this behavior to the original in DOSBox, because the bug happens in the very first room of the game. All you have to do is walk down the stairs and then use Flux on the cupboard.)

comment:7 by sev-, 6 months ago

Pushed the change, please test.

comment:8 by digitall, 6 months ago

Tested here and it looks good. Flux doesn't stop dancing until you do another action, but that may be the same as the original. Would need to test with original interpreter
to confirm.

comment:9 by eriktorbjorn, 6 months ago

In DOSBox, he does two or three cycles of the animation (I guess; I don't actually know where one cycle ends and the next begins) and then stops on his own. This is one reason why I never committed my proof-of-concept patch.

Of course, I'm still thrilled that my patch was so close to what sev found by looking at the disassembly. :-)

Last edited 6 months ago by eriktorbjorn (previous) (diff)

comment:10 by eriktorbjorn, 6 months ago

I did notice that there is some commented-out, incomplete code in Character::update() dealing with flag 4. Maybe that has something to do with it?

#if 0
	// handle special anims
	if ((_flags & 4) == 0)
		return;

	if (_animScriptId != -1) {
		_animationInstance = _vm->getSceneAnimation(this->)
#endif

Or maybe it's just that the code that comes after supersedes it?

Last edited 6 months ago by eriktorbjorn (previous) (diff)

comment:11 by eriktorbjorn, 5 months ago

Maybe the animation should stop once the sound effect it plays for it ends? But I don't see any mechanism for scripts to query if a sound is running or not.

On the other hand, Sys_Cmd_Play_Sfx_Plus() has some unhandled parameters, and sys_Cmd_Dummy() does get called (though not at a point where it would be used to stop the animation)...

Note: See TracTickets for help on using tickets.