0.13.5 - Spymaster gives false info in The Stolen Item [RESOLVED 0.14.0]

Lywzc
Posts: 107
Joined: Mon Sep 23, 2019 6:15 pm

0.13.5 - Spymaster gives false info in The Stolen Item [RESOLVED 0.14.0]

Post by Lywzc »

He is supposed to give true info all the time isn't he? However he still says "A (false description)? Sure, I know (him/her). Lives in (false town)." in this quest.

User avatar
Jay_H
Posts: 4062
Joined: Tue Aug 25, 2015 1:54 am
Contact:

Re: Spymaster gives false info in The Stolen Item

Post by Jay_H »

Quest is https://en.uesp.net/wiki/Daggerfall:The_Stolen_Item, c0c00y12:

Code: Select all

Person _thief_ face 229 faction The_Thieves_Guild male remote anyInfo 1013 rumors 1014

Code: Select all

Message:  1013
<ce>      _thief_... The name sounds familiar, but I can't place it.
<ce>     I'm thinking maybe someone I ran into in __thiefplace_?  Sorry
<ce>                        I can't be more helpful.
                                     <--->
<ce>          A =decoy_?  Sure, I know %g2.  Lives in ___decoy_.
                                     <--->
<ce>   If you're talking about a =thief_, %g sounds like a little weasel
<ce>          from __thiefplace_ who tried to pick my pocket once.
This is properly parsed as far as I know; "anyInfo" should be unreliable rumors for quests. For some reason, anyInfo is bleeding into Spymaster responses.

Lywzc
Posts: 107
Joined: Mon Sep 23, 2019 6:15 pm

Re: Spymaster gives false info in The Stolen Item

Post by Lywzc »

I think it might be the other way around?

Code: Select all

        public string GetDialogHint2(ListItem listItem)
        {
            if (dictQuestInfo.ContainsKey(listItem.questID) && dictQuestInfo[listItem.questID].resourceInfo.ContainsKey(listItem.key))
            {
                List<TextFile.Token[]> answers;
                if (npcData.isSpyMaster) // Spymaster only gives "true" answers (anyinfo messages) also for %hnt2 (note: intended that NPCsKnowEverything() does not apply here)
                    answers = dictQuestInfo[listItem.questID].resourceInfo[listItem.key].anyInfoAnswers;
                else // Everybody else gives rumors here for %hnt2
                    answers = dictQuestInfo[listItem.questID].resourceInfo[listItem.key].rumorsAnswers;

                if (answers == null || answers.Count == 0) // If no rumors are available, fall back to anyInfoAnswers
                    answers = dictQuestInfo[listItem.questID].resourceInfo[listItem.key].anyInfoAnswers;
                return GetAnswerFromTokensArray(listItem.questID, answers);
            }
            return TextManager.Instance.GetLocalizedText("resolvingError"); // error case - should never ever occur
        }
So spymaster should give anyInfo where others should give rumors which is reasonable.
However this function is only used by %hnt2 which is unimplemented? So does this mean rumors will never be heard and it will always default to anyInfo?

User avatar
Interkarma
Posts: 7236
Joined: Sun Mar 22, 2015 1:51 am

Re: 0.13.5 - Spymaster gives false info in The Stolen Item

Post by Interkarma »

I wasn't hugely involved in the talk system, so I'll just weigh in enough to hopefully start things moving towards a solution. The people most involved are Nystul (implemented Talk UI and systems), Ferital (refinements to talk systems), and Hazelnut (guilds and spymaster).

The code Lywzc quotes isn't used directly on Spymaster, but the observation is still valid that "anyInfo" should be true and "rumors" can be a mixed bag.

the following line in c0c00y12 wires up "anyInfo" to 1013 (which contains rumours) and "rumors" to 1014 (which contains info).

Code: Select all

Person _thief_ face 229 faction The_Thieves_Guild male remote anyInfo 1013 rumors 1014
So the most obvious fix is to replace this line with:

Code: Select all

Person _thief_ face 229 faction The_Thieves_Guild male remote anyInfo 1014 rumors 1013
I tested this with a fresh instance of c0c00y12. Spymaster then returned true info rather than rumours.

This just looks to be a badly formatted line in quest template, rather than an error with spymaster service. I'm happy to accept change above as a fix unless someone can add more details pointing to a deeper problem.

Lywzc
Posts: 107
Joined: Mon Sep 23, 2019 6:15 pm

Re: 0.13.5 - Spymaster gives false info in The Stolen Item

Post by Lywzc »

Interkarma wrote: Wed Jun 15, 2022 5:14 am I wasn't hugely involved in the talk system, so I'll just weigh in enough to hopefully start things moving towards a solution. The people most involved are Nystul (implemented Talk UI and systems), Ferital (refinements to talk systems), and Hazelnut (guilds and spymaster).

The code Lywzc quotes isn't used directly on Spymaster, but the observation is still valid that "anyInfo" should be true and "rumors" can be a mixed bag.

the following line in c0c00y12 wires up "anyInfo" to 1013 (which contains rumours) and "rumors" to 1014 (which contains info).

Code: Select all

Person _thief_ face 229 faction The_Thieves_Guild male remote anyInfo 1013 rumors 1014
So the most obvious fix is to replace this line with:

Code: Select all

Person _thief_ face 229 faction The_Thieves_Guild male remote anyInfo 1014 rumors 1013
I tested this with a fresh instance of c0c00y12. Spymaster then returned true info rather than rumours.

This just looks to be a badly formatted line in quest template, rather than an error with spymaster service. I'm happy to accept change above as a fix unless someone can add more details pointing to a deeper problem.
The problem is multifolded. Not only is anyInfo and rumor reversed in this quest (and a similar quest for temple), but since no code currently differentiate responses of spymaster and other entities (the only one that do is not used) all people will always say anyInfo instead of rumor.

User avatar
Interkarma
Posts: 7236
Joined: Sun Mar 22, 2015 1:51 am

Re: 0.13.5 - Spymaster gives false info in The Stolen Item

Post by Interkarma »

Something else I noted is the 1014 message block doesn't have a separator, so both info variants run into each other.

Code: Select all

Message:  1014
<ce>  Sure, I know that squirrelly little sneak.  Check out _thiefplace_
 in __thiefplace_.
<ce>                                   
<ce> _thief_?  Yeah, %g's "laying low" over at _thiefplace_ in __thiefplace_.
<ce> Not keeping too low a profile though, since you and I know where %g is!
Changing to below will separate the variants.

Code: Select all

Message:  1014
<ce>  Sure, I know that squirrelly little sneak.  Check out _thiefplace_
 in __thiefplace_.
                                     <--->               
<ce> _thief_?  Yeah, %g's "laying low" over at _thiefplace_ in __thiefplace_.
<ce> Not keeping too low a profile though, since you and I know where %g is!

User avatar
Interkarma
Posts: 7236
Joined: Sun Mar 22, 2015 1:51 am

Re: 0.13.5 - Spymaster gives false info in The Stolen Item

Post by Interkarma »

Lywzc wrote: Wed Jun 15, 2022 5:53 am but since no code currently differentiate responses of spymaster and other entities (the only one that do is not used)
That's not right. The code determines if NPC is a spymaster or not using TalkManager.GetNPCKnowledgeAboutItem(). A spymaster always knows about an item as below.

Code: Select all

if (CheckNPCisInSameBuildingAsTopic(listItem) || npcData.isSpyMaster || NPCsKnowEverything())
                return NPCKnowledgeAboutItem.KnowsAboutItem;
The above is checked by TalkManager.GetAnswerTellMeAboutTopic(), which also filters spymaster from providing "do not know" responses.

Spymaster is certainly differentiated here - and with suggested fix above always gives the correct answer as expected. When hitting the street with this quest active, I observe the following from generic NPCs.
  • When asking about the thief by name, they either "do not know" or provide text from "anyInfo" message block.
  • When asking about Any News, they will provide text from "RumorsDuringQuest" (1005) message block.
I do note that NPCs aren't providing from "rumors" message block here though (as you note above). That's something which needs more review.

I'll leave this one running and hopefully Ferital will chime in with more details. I'll also look into it more later when I have time.

Lywzc
Posts: 107
Joined: Mon Sep 23, 2019 6:15 pm

Re: 0.13.5 - Spymaster gives false info in The Stolen Item

Post by Lywzc »

That is what I am trying to say from the beginning. No one will give answers in rumors. The "differentiate" here means anyInfo/rumor. Although spymaster do have infinite answers and always says something as opposed to have only 1 answer and sometimes say "do not know", the anyInfo/rumor difference is not shown.

User avatar
Interkarma
Posts: 7236
Joined: Sun Mar 22, 2015 1:51 am

Re: 0.13.5 - Spymaster gives false info in The Stolen Item

Post by Interkarma »

I'll delete those duplicate posts for you. Forums seem to have played up a bit there.

BTW, no need to quote the whole post when your reply is the very next post. The text you're responding to is already directly above your post, so you're just duplicating a lot of text for no reason. I'll clean that up too. Cheers. :)

User avatar
Interkarma
Posts: 7236
Joined: Sun Mar 22, 2015 1:51 am

Re: 0.13.5 - Spymaster gives false info in The Stolen Item

Post by Interkarma »

I'm looking further into how spymaster and NPCs generate their output text. It's quite interesting.

Internally, the talk system selects from a series of canned responses from FALL.EXE that reference a sequence of IDs in TEXT.RSC. So when asking spymaster, it will select a text ID such as 7279 - which looks like so:

Code: Select all

"Here's the real story. %hnt2"
When asking an random NPC on the street, it will be something like 7291 below.

Code: Select all

"I'm not sure what you already know. %hnt"
For reference, here's the full 7291 text record (it has multiple subrecord variants where [0xFF] is the separator code).

Code: Select all

7291	Beggin' yer pardon %hnr %pcf, but most folk know this. %hnt[0xFF]Always glad ta help you, %pcf. %hnt[0xFF]Me cousin told me somethin'. %hnt[0xFF]I overheard things. %hnt2 Does that help?[0xFF]I've been savin' this tidbit fer you %hnr %pcf. %hnt2[0xFF]I'm not sure what you already know. %hnt[0xFF]Well, you probably already know this. %hnt[0xFE]
You'll note that it uses a mix of %hnt and %hnt2, which you already know will expand differently based on a few factors.

What's no so obvious is the master TEXT.RSC ID selected depends on NPC's social group and reaction to player.

Code: Select all

return ExpandRandomTextRecord(answersToNonDirections[15 + 3 * (int)npcData.socialGroup + reactionToPlayer_0_1_2]);
There's a mix of randomness and other reaction factors going into this that determine whether NPC replied with a %hnt or %hnt2. I'd say that's why we haven't observed the "rumors" message box being selected yet. I'll need to test with a couple different character to unpack this some more.

In regards to the initial report of "Spymaster gives false info in The Stolen Item", this is just a result of the swapped message IDs in quest template. I'm happy with my suggested fix for this above, but I'll keep investigating your other report about "rumors" message block not being shown at any time to confirm what's going on there.

Locked