Weird library message (adv3Lite)

There is only one gate object in this location, but here’s the game output:

>x gate
The iron gate is closed, and appears to be quite sturdy. Between the bars you can see a rather disheveled-looking garden. 

>go through gate
(first trying to open the tall iron gate)
The tall iron gate is locked. 
(first opening three tall iron gates)

Three gates? WTF? There’s nothing weird about the gate object itself, as far as I can see. Here’s the complete code:

+ ironGateOutside: Door 'tall iron gate;; bars'
    "The iron gate is closed, and appears to be quite sturdy. Between the bars you can see a
    rather disheveled-looking garden. "
    lockability = lockableWithKey
    initiallyLocked = true
    otherSide = ironGateInside
    cantClimbMsg = 'The gate is somewhat too tall for you to consider
        climbing over it (even setting aside the likelihood of impaling yourself on the
        rather sharp-looking spikes along the top). '
    dobjFor(Unlock) {
        verify() { illogical ('You don\'t seem to have the right key. ' );
        }
    }
    dobjFor(Climb) {
        verify() {}
        check() {
            say (cantClimbMsg);
        }
    }
;

Using the ‘debug messages’ and ‘debug actions’ commands doesn’t reveal anything relevant. I’m stumped. Can anyone suggest what’s going on here?

I’ve run into this bug too. I have a fix in my personal library that corrects this. Unfortunately, it’s a little large due to the way the original code is factored:

/**
 * tryImplicitAction() fixes.
 *
 * The important change here is to return the result of `action.execResolvedAction()`
 * rather than simply return `true` if it exits without throwing an Exception.
 * This resolves an unsightly bug for GO THROUGH <Door> causing results as so:
 * ```
 * >go through door
 * (first trying to open the door)
 * The door was closed.
 * (first opening three doors)
 * ```
 */
replace tryImplicitAction(action, [objs])
{

    local oldAction;

    /*
     *   Create a new copy of the action we're to try executing so we don't
     *   contaminate the properties of the same action if it'e being used
     *   elsewhere in the call chain.
     */
    action = action.createInstance();

    /* Our new action will be an implict action. */
    action.isImplicit = true;

    /* Note the previous action being executed. */
    oldAction = gAction;

    /* install the resolved objects in the action */
    action.setResolvedObjects(objs...);


    /*
     *   For an implicit action, we must check the objects involved to make
     *   sure they're in scope.  If any of the objects aren't in scope,
     *   there is no way the actor would know to perform the command, so
     *   the command would not be implied in the first place.  Simply fail
     *   without trying the command.
     */
    if (!action.resolvedObjectsInScope())
        return nil;

    /*
     *   Note that the previous current action is our new action's parent action
     */
    action.parentAction = gAction;

    /* Make our new action the current action. */
    gAction = action;

    try
    {
        /* Execute our new action. */
        local result = action.execResolvedAction();

        /* Provide a hook for the objtime extension to use. */
        action.addImplicitTime();

        /*
         *   Return result of action.
         */
        return result;
    }

    /*
     *   If the action threw an AbortImplicitSignal this means that its verify
     *   routine does not allow the action to be carried out implicitly; return
     *   nil to signal that we weren't allowed to attempt this implicit action.
     */
    catch (AbortImplicitSignal ex)
    {
        return nil;
    }

    finally
    {
        /* Restore the original current action. */
        gAction = oldAction;
    }

}

I’m not under the impression that adv3Lite is being actively maintained, otherwise I would put together a push request.

2 Likes

Thanks! Your fix seems to work perfectly.

Eric tells me he has accumulated a few little tweaks to the library code, but you’re right that he’s not doing anything in IF at the moment. I hinted to him that I’d like to see a Tall inventory listing, so maybe at some point in the not too distant future we’ll see a new release.

If Eric is planning another release, I have several bug fixes to offer!

I think “planning” is probably optimistic. I don’t know how he feels about having his email address made available. (He and I collaborated on a game, back ten years or so ago. That’s why I have it.) Tell you what: Why don’t you bundle up what you have and email it to me. My email is not very private; it’s midiguru23@gmail.com. I’ll forward your code, etc., to him so he can at least have it in a file.