Inform - Support - Patches

About Patches  

Compiler  
Library  

DM4 Errata  

Issue L61024

short_name idiosyncracy
Submitted by: Noel Taylor     Appeared in: Library 6/10 or before     Fixed in: -
Problem

The sample game shows a broken radio which can, -- in theory -- be 'fixed' for one turn by hitting it:

  Constant Story "TEST";
  Constant Headline "^An Interactive Test^";

  Include "Parser";
  Include "VerbLib";

  object  whiteroom "~white room~"
    with  description "You are in a white room.",
    has  light;

  object  -> radio
    with  name 'old' 'radio',
          description "It's an old radio.",
          broken true,
          before [; Attack: self.broken = false; "OK."; ],
          short_name [;
              if (self.broken)
                  print "broken radio";
              else {
                  print "fixed radio";
                  self.broken = true; ! PROBLEM HERE
                  }
              rtrue;
          ];

  [ Initialise; location = whiteroom; ];

  Include "Grammar";

The expectation is that the 'fixed radio' should display as such once, and then revert to being broken. In practice, the radio never gets fixed: it's as though the line marked as "PROBLEM HERE" is executed, ahead of the if statement, or alternatively as though short_name is being called twice.

Solution (by Jim Fisher)

Deep within the bowels of the standard library, in the routine "PrefaceByArticle" the PSN routine is called multiple times (PSN, stands for PrintShortName). On at least one of these occasions, the output of short_name is captured to a buffer and discarded rather than sent to the screen. This is when the text "fixed radio" is being printed so it never sees the light of day. You can verify this by adding a count property to the object and incrementing it (and printing it) from within short_name. The first time the name of the radio is printed out, count is 2. The second time, it is 4.

I agree that this is strange behavior, but probably not so much a bug as a little known fact. You could certainly code around it (by assigning a counter the value of 2 and decrementing by one inside of short_name and printing the extra text only if it reaches zero) but I think a more generalized rule probably says it best: Code that changes the output of short_name, should not be run from within short_name.

Conclusion: this is not thought to be an issue.


Last updated 17 April 2013. This web site has not been fully supported since April 2008. Information may be out of date. This page was originally managed by Roger Firth.