Opened 6 months ago

Closed 5 months ago

#10753 closed defect (fixed)

QFG4: Talking to absent innkeeper

Reported by: Vhati Owned by: bluegr
Priority: low Component: Engine: SCI
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)

At the inn when no one's there, you can still click MOUTH on the hero to "Talk about yourself" and get a response from the absent innkeeper. "Greet" and "Say Goodbye" also yield a smile and wave from him.

The generic, "No one seems to be listening," narration would be more appropriate.

File - 5kb MD5 - Full MD5
RESOURCE.000 - 263dce4aa34c49d3ad29bec889007b1c - 1364ba69e3c0abb68cc0170650a56692
RESOURCE.AUD - c39521bffb1d8b19a57394866184a0ca - 71098b9e97e20c8941c0e4812d5f906f
RESOURCE.MAP - aba367f2102e81782d961b14fbe3d630 - 801a04cc6aa5d437681a2dd0b6545248
RESOURCE.SFX - 3cf95e09dab8b11d675e0537e18b499a - 7c858d7253f86dab4cc6066013c5ecec

Attachments (3)

sci.043 (78.0 KB) - added by Vhati 6 months ago.
SavedGame - Inn
sci.078 (66.0 KB) - added by Vhati 6 months ago.
SavedGame (Floppy) - Inn
sci.080 (50.7 KB) - added by Vhati 6 months ago.
SavedGame (Floppy) - See men and/or rest

Download all attachments as: .zip

Change History (19)

Changed 6 months ago by Vhati

Attachment: sci.043 added

SavedGame - Inn

comment:1 Changed 6 months ago by Vhati

Summary: Talking to absent innkeeperQFG4: Talking to absent innkeeper

comment:2 Changed 6 months ago by digitall

@Vhati: Thanks for the bug report. Could you try testing this with the original SCI interpreter to see if this occurs in the original as well?

comment:3 Changed 6 months ago by Vhati

The original interpreter doesn't do this. Clicking MOUTH on the hero yields "No one seems to be listening." offering no dialogue menu at all.

comment:4 Changed 6 months ago by digitall

Priority: lownormal

comment:5 Changed 6 months ago by Vhati

Scratch that. My spot check with the original interpreter was on Day 2. The OP bug was considerably later plotwise: Day 10.

I just checked again with ScummVM on Day 2. At that point, it correctly says, "No one seems to be listening."


So it's not enough for the inn to be empty, any time. Until the specific circumstances are identified, it might yet be a Sierra bug.

Stepping back... It happens in ScummVM on Day 9, after the Katrina note visit and the Gnome's final performance (resting past midnight and lose the Domovoi by talking/re-entering).

Replayed that evening without picking up Katrina's note. Gnome performed. Still happens.

Day 8, after locals chatted about Igor having been rescued. Still happens.

Originally, Day 7 began at the Gypsy camp; sleepover, no opportunity to check. I replayed Day 6 without visiting the camp. Locals chatted about Igor having been rescued. Rested past midnight. Dismissed the Domovoi. Still happens.

Back further... Bug DOES NOT happen on Day 6. That's when the hero sleeps til sunrise dreaming of hearing voices. At that point, Igor had been rescued, the Burgomeister had not yet announced the gypsy prisoner was released. The camp had not yet been visited.

I'm imagining the inn has several IF-ELSE trees checking plot variables, each tree defaulting to a different empty room. Maybe the inn checks whether you've heard the voices? That doesn't seem relevant. Maybe one needs to hear about the released prisoner? Maybe it's the Nth day.

comment:6 Changed 6 months ago by Vhati

Unable to reproduce this by merely advancing the clock: hiding at the inn, evading NPCs.

I bought 20 rations and went to the inn on Day 1.

Napped in bed all day, only coming down after midnight (moon atop the second hill), introduced/talked to the damovoi if present & re-entered, muttered to myself, and slept until sunrise. Repeating this every day.

Got rid of the Domovoi quickly.
Day 4: Normal. Slept to hear voices (Ad Avis and Katrina).
Day 5: Normal.
Day 6: Normal. Slept to hear voices (Erasmus and Fenrus).
Day 7: Normal.
Day 8: Normal.
Day 9: Normal.

Hearing voices didn't matter. Nth day didn't matter.
Never met the gnome. Never heard about Igor. Never got a note.

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

comment:7 Changed 6 months ago by Vhati

Occurs in the floppy edition under ScummVM, 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

Changed 6 months ago by Vhati

Attachment: sci.078 added

SavedGame (Floppy) - Inn

comment:8 Changed 6 months ago by Vhati

Testing some more in the floppy edition...

Immediately after rescuing Igor at night, I run to the inn (entering through the window).

  • If I enter the dining room, the men in back announce their mistake ("So Dmitri says the Gypsy didn't really kill Igor after all."). Resting until after midnight ("you are feeling tired"), I can talk to the empty room and get responses from the absent innkeeper.
  • If I choose not to enter the dining room, resting until after midnight, I DO NOT get the bug. No menu, just "No one seems to be listening."

Restoring a save 1 minute before the rescue, I instead abandon Igor, and run to the inn (entering through the window).

  • I enter the dining room, and the men are silent. The MOUTH-on-self menu only offers "Greet everyone", "Say goodbye", "Make thief sign". Resting until after midnight, I DO NOT get the bug.



Sidenote: You first get an option to "Tell about yourself" the evening of Day 1. It disappears after use. The men and innkeeper each say they have no need of heroes. Igor's rescue brings the option back to show their responses have turned positive. It comes back glitchy.

Changed 6 months ago by Vhati

Attachment: sci.080 added

SavedGame (Floppy) - See men and/or rest

comment:9 Changed 6 months ago by Vhati

The floppy edition's original interpreter also does this.

  • BOTH broke Davy out and rescued Igor. On sight, the men immediately announced their mistake and unlocked "Talk about yourself" when I re-entered. Bugged from then on when the room was empty.
  • Just rescuing Igor without freeing Davy - even adding a chat with the Burgomeister in his office (he was not at the window) - was not sufficient. Slept until morning. Burgomeister, from his window, announced the werewolf threat had ended. That night, the men announced their mistake, etc. Bug surfaced.

Bug requirements: Igor rescue + [jailbreak or Burgomeister window announcement] + men acknowledging.

comment:10 Changed 6 months ago by Vhati

Keywords: original added
Priority: normallow

comment:11 Changed 5 months ago by Vhati

script 7 - fixTime::init() sets some time globals.

  • global123
    • Simplified time of day, the nth 3-hour span: 6,7,0,1,2,3,4,5.
    • Where 6 is midnight aka "You are getting tired". The sun rises in 0 and sets in 4.



Exported utility functions set and test numbered plot flags.

  • "proc0_2(n)", "proc0_3(n)"
    • Not clear on what they each do, but definitely setters.
  • "proc0_4(n)"
    • Tests the given flag.
  • "proc64999_5(global123 4 5)"
    • Tests if a variable has one of a list of desired values. So this example would test for evening pre-midnight.



script 320 - rm320::init() sets local2 based on a huge if-elsey "cond" block. That block tests a bunch of flags and globals.

Later in sInitShit::changeState(1)...

  • heroTeller is constructed with a local2-decided list of dialogue options, via script 324.
  • Then another switch block uses local2 to react to hero's entry. It sets new flags and makes announcements. Those flags will take effect after re-entering.



This bug occurs when local2 == 11. Based on flags (132 && !134) after failing most of the other switch cases.

(= local2
	(cond
# ...
		(
			(and
				(proc0_4 48)
				(proc0_4 39)
				(not (proc0_4 132))
				(proc64999_5 global123 4 5)
			)
			7
		)
# ...
		(
			(and
				(not (proc0_4 132))
				(or (<= global123 3) (proc64999_5 global123 4 5))
			)
			10
		)

# Next line's the bug.
# Missing a global123 check that it isn't midnight or later, empty room.

		((and (proc0_4 132) (not (proc0_4 134))) 11)
		((proc0_4 134) 12)
		(else 0)
	)
)
  • Flag 48.
    • As Igor is rescued (script 500 - sIgorLeaves).
  • Flag 39.
    • Burgomeister at window, "Since you have found and rescued Igor, I have released our gypsy prisoner. It seems he was not a Werewolf after all! All the peasant fears were for nothing." (script 260 - sEnterScr)
    • Break Davy out of the Burgomeister's office (script 300 - sLetGypsyOut).
  • Flag 132.
    • When the inn init() decides local2 = 7. "So Dmitri says the gypsy didn't really kill Igor after all." (script 320 - sInitShit)
  • Flag 134.
    • When the inn init() decides local2 = 9. "I must thank you for saving our Tanya. You have brought joy again into our lives. We are in your debt." (script 320 - sInitShit)



When the inn init() decides local2 = 11, heroTeller is constructed with a dialogue option list that includes "Tell about yourself".

comment:12 Changed 5 months ago by Vhati

Pull Request: SCI32: Fix QFG4 talking to absent innkeeper

comment:13 Changed 5 months ago by digitall

Keywords: has-pull-request added

comment:14 Changed 5 months ago by Vhati

For completeness, here's how the presence of an innkeeper sprite is determined.

When local2 is 11, but with a further restriction: if it's specifically daytime or evening.

(t <= 3 or t is in [4, 5])

Adding pre-midnight check (t <= 5) to situation 11 syncs it with the sprite's restriction.

rm320::init()

(if
	(or
		(== local2 1)
		(and
			(proc64999_5 local2 2 4 5 6 7 8 9 10 11 12)
			(or (proc64999_5 global123 4 5) (<= global123 3))
		)
	)
	(innKeeper
		init:
		setPri: 170
		approachVerbs: 4
		setScript: sInnKeeperSmoke
	)
)

comment:15 Changed 5 months ago by Vhati

Quoting again from init()'s cond blocks above.

		((and (proc0_4 132) (not (proc0_4 134))) 11)  # Igor rescued bug.
		((proc0_4 134) 12)  # Tanya saved is also bugged.
		(else 0)

The pull request now fixes a second bug: after saving Tanya.

Same issue, except the dialogue is "Tell about adventures" and hearing the absent innkeeper say, "You have done much to help Mordavia. We have much to thank you for."

comment:16 Changed 5 months ago by bluegr

Owner: set to bluegr
Resolution: fixed
Status: newclosed

Thanks for your work! The pull request has been merged, so this can be closed now

Note: See TracTickets for help on using tickets.