0.13.5 - Spymaster gives false info in The Stolen Item [RESOLVED 0.14.0]
-
- 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]
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.
- Jay_H
- Posts: 4073
- Joined: Tue Aug 25, 2015 1:54 am
- Contact:
Re: Spymaster gives false info in The Stolen Item
Quest is https://en.uesp.net/wiki/Daggerfall:The_Stolen_Item, c0c00y12:
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.
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.
-
- Posts: 107
- Joined: Mon Sep 23, 2019 6:15 pm
Re: Spymaster gives false info in The Stolen Item
I think it might be the other way around?
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?
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
}
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?
- Interkarma
- Posts: 7249
- Joined: Sun Mar 22, 2015 1:51 am
Re: 0.13.5 - Spymaster gives false info in The Stolen Item
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).
So the most obvious fix is to replace this line with:
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 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
Code: Select all
Person _thief_ face 229 faction The_Thieves_Guild male remote anyInfo 1014 rumors 1013
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.
-
- Posts: 107
- Joined: Mon Sep 23, 2019 6:15 pm
Re: 0.13.5 - Spymaster gives false info in The Stolen Item
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.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).
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 1013 rumors 1014
I tested this with a fresh instance of c0c00y12. Spymaster then returned true info rather than rumours.Code: Select all
Person _thief_ face 229 faction The_Thieves_Guild male remote anyInfo 1014 rumors 1013
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.
- Interkarma
- Posts: 7249
- Joined: Sun Mar 22, 2015 1:51 am
Re: 0.13.5 - Spymaster gives false info in The Stolen Item
Something else I noted is the 1014 message block doesn't have a separator, so both info variants run into each other.
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>
<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!
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!
- Interkarma
- Posts: 7249
- Joined: Sun Mar 22, 2015 1:51 am
Re: 0.13.5 - Spymaster gives false info in The Stolen Item
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;
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'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.
-
- Posts: 107
- Joined: Mon Sep 23, 2019 6:15 pm
Re: 0.13.5 - Spymaster gives false info in The Stolen Item
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.
- Interkarma
- Posts: 7249
- Joined: Sun Mar 22, 2015 1:51 am
Re: 0.13.5 - Spymaster gives false info in The Stolen Item
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.
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.
- Interkarma
- Posts: 7249
- Joined: Sun Mar 22, 2015 1:51 am
Re: 0.13.5 - Spymaster gives false info in The Stolen Item
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:
When asking an random NPC on the street, it will be something like 7291 below.
For reference, here's the full 7291 text record (it has multiple subrecord variants where [0xFF] is the separator code).
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.
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.
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"
Code: Select all
"I'm not sure what you already know. %hnt"
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]
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]);
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.