I think the underlying issue here (and I think this has come up with NDC before) is that the command gets reparsed as “x 1 souvenirs,” and that “1 souvenirs” is a valid way of referring to anything that matches “souvenirs”–because there’s only one of it. Then Inform disprefers referring to something that’s on a supporter to something that’s just in a location–this is annoyingly difficult to override–so when it parses “x 1 souvenirs” it bumps the postcards down the match list. Why it automatically picks the tea towels I don’t know; I think this is probably a behavior that happens specifically when disambiguating, which is why “examine 1” works as intended.
In fact, here’s something interesting: comment out the inclusion of Numbered Disambiguation Choices, and “x souvenirs/1” will still settle on the paper models. Basically, I think the parsing of “1” generally doesn’t go through the NDC mechanism, because “1” can be understood as anything; but because disambiguation in that sort of situation automatically settles on the first thing in the match list, which is usually the thing that got labeled “1,” it works out. But when the first thing on the match list gets dispreferred because it’s on a supporter, we get this stuff.
As of right now, I’m not sure how to fix this. I tried a Does The Player Mean rule:
Does the player mean doing something with a thing (called the first choice) when the player's command matches "1":
if the disambiguation id of the first choice is 1, it is very likely;
if the disambiguation id of the first choice is not 1, it is very unlikely.
and it stood there like a gawm, gaping at me uselessly, which is the usual behavior of DTPM rules in my experience. [EDIT: But this time it is because I messed up, see two posts below.]
I also tried editing the number 1 in the command to a different number:
After reading a command when the number of entries in list of disambiguables > 0 (this is the convert 1 to -1 rule):
let disam-cmd be the player's command;
if disam-cmd matches the regular expression "\b1\b":
replace the matched text with "-1";
change the text of the player's command to disam-cmd.
Understand "-1" as 1 when the number of entries in list of disambiguables > 0.
and it produced “*** Run-time problem P40: Attempt to splice a snippet value which is currently invalid: words 0 to -1,” and also still picked the models instead of the postcards. It’s not the number -1 that’s the problem, because I had the same issue when I used 86.
I’ve sometimes thought that it might work better to use letters rather than numbers, but “a” would probably have exactly the same problem that “1” does.
Whoa! Stop presses! This DTPM rule worked!
Definition: a thing is primed if the disambiguation id of it is 1 and the number of entries in the list of disambiguables > 0.
Does the player mean doing something with a primed thing: it is very likely.
This might cause some problems if you have something like this:
A red 2 balloon is in the Gift Shop. A red 2 light is in the Gift Shop.
when “x red/2” will produce the red 2 balloon rather than the red 2 light, but don’t do stuff like that.
Anyway, the moral IMO is that there is some very fiddly stuff hard-coded in the parser, especially about disambiguation.