New Version of adv3Lite Available

A new beta release (version 0.4) of adv3Lite, the alternative library for use with TADS 3, is now available from In due course it should replace the version currently in the IF-Archive, and it is also available from

While the main focus of this release is on object listings (in the context of room and object contents descriptions), it also adds minor improvements to several other existing features and fixes a number of bugs, several of which were related to the parser. There are also another three chapters in the adv3Lite tutorial.

While adv3Lite does aim to be considerably simpler than the adv3 library that comes with TADS 3, it is becoming increasingly apparent that the name “adv3Lite” is potentially misleading, since it seems to suggest something rather more pared-down and lightweight than is actually the case (in particular, adv3Lite is not simply a subset of adv3). At some point in the future, therefore, I may need to consider calling it something else. adv3Lite (as it’s still called for now) is shaping up to be both a library that should be easier for newcomers to TADS 3 to learn and one that should meet the needs of many more experienced authors.

It’s also shaping up in the sense that with each new release, decisions are made that further determine the future shape of adv3Lite, so the more feedback I can get on it while it’s still in beta, the more responsive I can make to IF author’s needs.

A potentially rather annoying bug with this version has just been reported to me. If you attempt to give an order to an NPC you get a run-time error.

If this bug is preventing you getting on with something they want to do in adv3Lite, you can temporarily fix it with the following patch:

Find the line in parser.t that starts “case Indefinite:” in the selectObjects() method, around line 2184.

Amend the case block so it reads:

case Indefinite:
             *   Indefinite mode - we must select the desired number, but
             *   we can do so arbitrarily.  Simply select the first 'num'
             *   in the list.
           if(role != ActorRole) // ADD IF STATEMENT HERE
                /* start by getting object rankings from the verb */
                cmd.action.scoreObjects(cmd, role, matches);
                /* sort by score (highest to lowest) */
                 matches.sort(SortDesc, { a, b: a.score - b.score });
            } // END IF BLOCK HERE
            if (matches.length() > num)
                matches.removeRange(num + 1, matches.length());
            /* flag the objects as arbitrarily chosen */
            matches.forEach({ m: m.flags |= SelArbitrary });

The change if basically to move a couple of statements into an if block as indicated by the comments.

Note that this is just a temporary fix. The solution that will actually be used in the next update will be a bit more complex.