Pre-release
AdventureJS Docs Downloads
Score: 0 Moves: 0

Instance of: adventurejs.Verb

Defined in: adventure/dictionary/verbs/close.js, line 6

More info: VerbSubscriptions VerbAnatomy VerbProcess ModifyVerbs WriteVerbs

Runtime node: game.dictionary.verbs.close

Synonyms: close, shut

> close can of snakes
You close the can of snakes, though you can never put the snakes back in the can.

Close a Tangible Asset. Requires that the Asset has asset.dov.close.enabled set to true and asset.is.closed is false.

close demo + example code


// OpenGame.js
// ----------
/*global adventurejs A OpenGame*/

var OpenGame = new adventurejs.Game("OpenGame", "OpenGameDisplay").set({
  // title, version, and author are shown in the title bar
  title: "Open Game",
  version: "0.0.1",
  author: "Ivan Cockrum",

  description: "This is my great game! Thanks for playing!",
});

OpenGame.settings.set({
  // if this is true, lists of exits will
  // show the names of rooms they lead to
  show_room_names_in_exit_descriptions: true,

  // if this is true, lists of exits will
  // only include room names known to player
  show_room_names_in_exit_descriptions_only_when_room_is_known: false,

  // if this is true, lists of exits will only
  // show room names for exits player has used
  show_room_names_in_exit_descriptions_only_after_exit_has_been_used: false,

  // if this is true, verbose room descriptions
  // will only be shown on first visit
  print_verbose_room_descriptions_on_first_visit: true,

  // if this is true, adventurejs will print
  // debug messages to the game display
  print_debug_messages: true,

  // set this to set a default response to
  // player input that is not understood
  if_parser_has_no_response_print_this: "I have no response to your input. ",

  // set this to provide a default
  // response to blank input
  if_input_is_empty_print_this: "I didn't see any input. ",

  // alternately, game can be set to print
  // the current room description with
  // if_input_is_empty_print_room_description: true
});

// Foyer

OpenGame.createAsset({
  class: "Room",
  name: "Open Foyer",

  descriptions: {
    look: `Welcome to the Open Demo, where you can try opening and closing things, and locking and unlocking and picking locks, with the verbs open, close, lock, unlock, pick. Visit the other rooms in this demo to find some demonstrations. `,
    brief: `Try verbs. Open, close, lock, unlock, pick. `,
  },

  exits: {
    // This is a shortcut for creating an Exit. It's useful
    // for exits that don't have any special properties or
    // an Aperture, which is an Exit's physical presence.
    east: "Sitting Room",
  },
}); // Open Foyer

// Player

OpenGame.createAsset({
  class: "Player",
  name: "Tim Hunter",
  place: { in: "Open Foyer" },
  is: { active: true },
});

// Scoring

OpenGame.scorecard.set({
  // This is how you set score events for your game.
  // You can add as few or as many as you like,
  // and set points to whatever number you like.
  // The names are up to you, so set them however you like.
  score_events: {
    "open window": 1,
    "take ann": 1,
    "open library door": 1,
    "open top drawer": 1,
    "open chest": 1,
    "take andy": 1,

    // Let's say you want the game to start with
    // some points already set. You can do that like this.
    "preset points": { points: 5, complete: true, recorded: true },

    // You can set negative points too. These unset points cancel
    // out the preset points above.
    "unset points": { points: -5, complete: true, recorded: true },
  },

  // To attach a score event to your custom function, use
  // OpenGame.scorecard.completeEvent('open window');
  // You'll see these sprinkled throughout this demo code.

  // AdventureJS has built-in scoring functions,
  // but you may, if you like, write custom score handling.

  // this returns a string
  // score_message: `$(Our) score went up! `,

  // this returns a custom function
  // score_message: function(){
  //   return `Dude, you totally just got ${this.diff} points!`
  // },

  // Or maybe you just want to tweak the score display.
  // By default score appears in 0/0 format, but let's
  // say you'd like it to say "Score: 0 out of 0".
  // score_format: function()
  // {
  //   return `Score: ${this.score} out of ${this.total}`;
  // }

  // score_message and score_format have access to some vars:
  // - this.score (old score)
  // - this.newscore (new score)
  // - this.diff (difference between old/new )
  // - this.total (total of points available)
});


// SittingRoom.js
// ----------
/*global adventurejs A OpenGame*/

OpenGame.createAsset({
  class: "Room",
  article: "the",
  name: "Sitting Room",
  descriptions: {
    look: "The sitting room has many things on which to sit. None of them are objects though, because this is not a sitting demo. I suppose we should have called it an opening room. Shut up about it already! Instead, try opening and closing things: the playground window, the library door, the chest. Oh, did I mention that there's a window and a door? ",
    brief: "Don't sit. Window. Door. ",
  },
  exits: {
    west: "Open Foyer",
  },
});

// Sitting Room Out

OpenGame.createAsset({
  class: "Exit",
  direction: "out",
  place: { in: "Sitting Room" },
  destination: "Playground",
  descriptions: {
    for_exits_list: `out the window to the 
    Playground`,
    travel: `$(We) climb clumsily out the window and tumble 
    to the playground, where you land on your bottom on a 
    soft tuft of grass. `,
  },
  aperture: "inside window",
});

// Sitting Room Out - Playground Window

OpenGame.createAsset({
  class: "Window",
  name: "inside window",
  synonyms: ["playground window", "playground"],
  place: { in: "Sitting Room" },
  direction: "out",
  descriptions: {
    // Note that this code block uses a combination of Javascript
    // native template literals and AdventureJS custom templates:
    // ${OpenGame} and $(inside window). The one with {squiggly}
    // brackets is Javascript. The one with (parentheses) is AdventureJS.

    // These can be used in combination, with one important caveat.
    // For many properties, AdventureJS can accept a string or array
    // or function. AdventureJS custom templates are only evaluated
    // immediately before being output. But, Javascript template
    // literals used in a string are evaluated when the property
    // containing the string is created. So in order to use template
    // literals, it's important to wrap the string in a function
    // that will only be evaluated when called by AdventureJS.

    look: () => `
      Through the window, $(we) can see a child's playground. 
      Currently the window is 
      $(inside window is| locked or| unlocked) and 
      $(inside window is| open or| closed).
      ${
        !OpenGame.$("inside window").$didDo("unlock")
          ? `The window locks and unlocks by way of a simple  
        sash latch that doesn't require any key. `
          : ""
      } 
      ${
        OpenGame.$("inside window").$is("locked")
          ? "Try opening the window without first unlocking it. "
          : ""
      } 
      ${
        !OpenGame.$("inside window").$is("closed")
          ? `$(We) might just climb through it. `
          : ""
      }
      `,

    // This commented block below is an alternate version.
    // It may appear like it should work the same way,
    // but because it has a template literal in a string property,
    // it would throw an error when the game is launched.

    // look: `The window is
    // $(inside window is| open or| closed) and
    // $(inside window is| locked or| unlocked).
    // It locks by way of a simple sash latch that doesn't require any key.
    // ${OpenGame.$('inside window').$is('locked')?
    //   'Try entering "unlock window then open it".':''}
    //   Beyond the window, $(we) can see a child's playground. `,

    // Here, we've set a description to use if a player
    // inputs "look through window".
    through: "You can see a small child's playground through the window. ",

    // And here, we're redirecting "look out window"
    // to "look through window" so we can capture both
    // possibilities without duplicating the code.
    out: function () {
      return this.descriptions.through;
    },
  },

  is: {
    closed: true,
    locked: true,
  },
  dov: {
    // window.dov.unlock.with_nothing
    // allows the window to be unlocked without use of a key.
    unlock: {
      with_nothing: true,
      on_first_success: function () {
        if (!this.is.closed) {
          // In some circumstances, when a user inputs 'open thing',
          // the verb open may redirect to 'unlock thing'. If that
          // happened here, we want to account for it by returning
          // our custom open.on_first_success function.
          return this.dov.open.on_first_success();
        } else {
          return "$(We) should easily be able to open it now. ";
        }
      },
    },

    // lock and unlock params have to be set independently.
    // This is so that you could, for instance, set it so that
    // once the player unlocks it, it can't be locked again.
    lock: { with_nothing: true },

    open: {
      // on_first_success calls this function and
      // appends this string to the native verb output,
      // only the first time the player opens the window.
      on_first_success: function () {
        OpenGame.scorecard.completeEvent("open window");
        return "Now that it's open $(we) just might climb out of it. ";
      },

      // on_first_failure only prints a message
      on_first_failure: `But it's just a simple sash 
      latch that doesn't need any key to unlock it. `,
    },
  },

  // This inside window is linked to the outside window.
  // Apertures, aka doors and windows, only exist in one room.
  // For a door to be in two rooms, we actually need two doors:
  // one side in one room, the other side in the other room.
  // We handle each side as a unique asset. In order to keep them
  // in sync we use the linked_asset property, so that if one is
  // set as open, so is the other one.
  linked_asset: "outside window",
});

// Sitting Room North

OpenGame.createAsset({
  class: "Exit",
  direction: "north",
  place: { in: "Sitting Room" },
  destination: "Library",
  descriptions: {
    //look: "It looks frosty that way. ",

    // for_exits_list is a special description for exits,
    // that lets authors customize how individual exits
    // are described when the player is presented with a
    // list of exits.
    for_exits_list:
      "through the door north to the Library",
  },
  aperture: "library door",
});

// Sitting Room North Door - library Door

OpenGame.createAsset({
  class: "Door",
  name: "library door",
  place: { in: "Sitting Room" },
  is: {
    closed: true,
    locked: true,
  },
  dov: {
    //close: true, // already set for all instances of Door class
    open: {
      on_first_success: function () {
        OpenGame.scorecard.completeEvent("open library door");
        return "Now you can enter the Library.  ";
      },
    },

    // Note here how we're setting it so the library door can be
    // unlocked with the brass key.
    unlock: {
      with_assets: ["brass key"],
      with_nothing: false,
    },

    // We set the assets for each verb, lock and unlock, explicitly
    // because it's common that an author might want a player to
    // unlock a door and then never have to interact with it again.
    // So if we want the key to also lock the door, we have to say so.
    lock: {
      with_assets: ["brass key"],
      with_nothing: false,
    },
  },
  linked_asset: "sitting room door",
  direction: "north",
  descriptions: {
    look: "A lovely Victorian nine panel oak door with frosted glass and a scuffed brass lock plate. ",
    through: function () {
      // Here we're setting a description for "look through door"
      // that returns a different value depending on whether the
      // door is open or closed.
      // "through" is what we call an Aspect, along with behind,
      // in, on, under, and many other prepositions. Any Aspect
      // can have a unique description set this way.
      if (!OpenGame.$("library door").$is("closed")) {
        return "Through the open door you can see shelves stuffed with books and books and books. ";
      } else {
        return "The glass panes in the door's upper half are quite heavily frosted, and don't reveal anything beyond. ";
      }
    },
  },
});

// coffee table

OpenGame.createAsset({
  class: "Table",
  name: "coffee table",
  place: { in: "Sitting Room" },
  description:
    "It's a low, rectangular coffee table, apparently hand carved from oak. ",
  adjectives: "wood, wooden, carved, oak",
  aspects: {
    on: {
      player: { can: { enter: false } },
    },
  },
  dov: {
    go: {
      doBeforeTry: function (params) {
        // See how we're using a Verb Hook here. This is a way
        // to inject custom code into a verb when it is applied
        // to a particular asset. In this case by hooking into
        // go.doBeforeTry, we interrupt the verb before it can
        // run its default doTry conditional logic,
        // and print our own failure message. This basically means:
        // we don't care what the default logic has to say; you
        // just don't put your fat feet on the fine furniture.
        // See /doc/Scripting_VerbPhases.html for more info.
        OpenGame.print(
          "I mean, $(we) could, but it would just be rude. ",
          "concatenate_output"
        );
        return false;
      },
    },
    sit: {
      // Here, we're setting sit, stand and lie to use
      // the same code as go.doBeforeTry. This is one way
      // you could apply the same custom logic to multiple
      // verbs on an object. There are also other ways to
      // achieve similar results, such as unsubscribing
      // the asset from these verbs, or using verb actions.
      doBeforeTry: function () {
        return this.dov.go.doBeforeTry();
      },
    },
    stand: {
      doBeforeTry: function () {
        return this.dov.go.doBeforeTry();
      },
    },
    lie: {
      doBeforeTry: function () {
        return this.dov.go.doBeforeTry();
      },
    },
  },

  // Here's an example of a verb reaction.
  // This will be superceded by the verb phases up above; to see
  // it in action you'll have to comment out the verb phases block.
  // Verb reactions are called when a particular action occurs,
  // such as moving the player onto an asset, regardless of what
  // verb caused it; go, or climb, or jump, or sit, or lie.
  // Every verb that results in moving the player into a thing
  // tries to call thing.doNestThatToThis(player).
  // Verb reactions may be common or unique. doNestThatToThis is a
  // very common reaction that will be called in numerous circumstances.
  // See /doc/Scripting_VerbActions.html for more info.
  doNestThatToThis: {
    // Nesting only applies to characters.
    // Tim Hunter is the name of our player character in this game.
    "Tim Hunter": function () {
      this.game.print(
        "Whoa there, podner! Let's keep those fat feet off the fine furniture. "
      );
      return false;
    },
  },

  // Alternately, if you wanted the same verb effect hook to apply to
  // all assets, you could define it as a function itself rather
  // than creating nested objects. This is also valid.
  // In this case, since the doNestThatToThis function is on the
  // coffee table, it would prevent all characters from nesting.

  // doNestThatToThis: function()
  // {
  //   this.game.print("Whoa there, podner! Let's keep those fat feet off the fine furniture. ");
  //   return false;
  // },
});


// Library.js
// ----------
/*global adventurejs A OpenGame*/

OpenGame.createAsset({
  class: "Room",
  name: "Library",
  descriptions: {
    look: `The library is stuffed with books near 
    to the point of inducing claustrophia. But also cozy? 
    It's hard to say precisely. $(We) scan the 
    overflowing shelves. Sadly, none of the books are objects. 
    Instead, take a look at the bureau and its drawers. `,

    brief: "Books. Desk. Door south. ",
  },
}); // Library

// Sitting Room south Exit

OpenGame.createAsset({
  class: "Exit",
  direction: "south",
  place: { in: "Library" },
  destination: "Sitting Room",
  descriptions: {
    //look: "A heavy Victorian nine panel oak door with frosted panes. ",
    for_exits_list:
      "south to the Sitting Room",
  },
  aperture: "sitting room door",
});

// Sitting Room south door
// Exits have no physical properties. In order to apply
// physical properties to an exit, it needs an Aperture.
// Apertures can be manipulated like other tangible assets.

OpenGame.createAsset({
  class: "Door",
  name: "sitting room door",
  place: { in: "Library" },
  direction: "south",
  descriptions: {
    look: "It's a Victorian 9 panel oak door. ",
    open: "The sitting room door is open. ",
    closed: "The sitting room door is closed. ",

    // Assets can have a number of descriptions to use in
    // different contexts. Descriptions can be strings or
    // arrays or functions. This example shows a function
    // that uses native Javascript logic to return a string.
    // See /doc/tutorial-Subscription.html for more info.
    through: function () {
      // This is one way to refer to objects in custom code:
      // GameName.$( "asset name" ).is("property")
      // See /doc/Scripting_CustomCode.html for more info.
      if (!OpenGame.$("sitting room door").$is("closed")) {
        return "Through the open door $(we) can see the Sitting Room. ";
      } else {
        return "$(We) can't see anything through the door's frosted panes. ";
      }
    },
  },
  linked_asset: "library door",
  is: {
    closed: true,
    locked: true,
  },
  dov: {
    open: true,
    close: true,
    unlock: { with_assets: ["brass key"] },
    lock: { with_assets: ["brass key"] },
  },
});

// bureau desk

OpenGame.createAsset({
  class: "Desk",
  name: "bureau desk",
  adjectives: ["oak", "wood", "wooden", "substantial"],
  synonyms: [],
  place: { in: "Library" },
  descriptions: {
    // Note that this description is an ordinary string property. Elsewhere in this demo
    // we're using traditional functions or arrow functions because they include
    // Javascript template literals. This example only includes AdventureJS custom
    // templates, which do not get evaluated until output, and are safe to use in strings.
    // See /doc/Scripting_CustomTemplates.html for more info.
    look: `
      It's a substantial oak bureau desk with multiple drawers stacked vertically, 
      top, middle and bottom. The top drawer is $( top drawer is| open or| closed ), 
      the middle drawer is $( middle drawer is| open or| closed ), and the bottom 
      drawer is $( bottom drawer is| open or| closed ). `,
  },
  aspects: {
    on: {
      player: { can: { enter: false } },
    },
  },
});

// top drawer

OpenGame.createAsset({
  class: "Drawer",
  name: "top drawer",
  adjectives: ["desk", "scratched"],
  synonyms: ["lock", "lock plate", "scratches"],

  // Note how we're using top_drawer.description here whereas we've used
  // desk.descriptions.look above. All assets can have multiple
  // descriptions. Setting asset.description is a shortcut to setting
  // asset.descriptions.look, for when an asset only needs one description.
  description: `The top drawer's copper lock plate 
    seems to be particularly scratched up. 
    Currently the drawer is $( top drawer is| open or| closed ). `,

  place: { attached: "bureau desk" },
  is: {
    // Note how we're setting known:true here.
    // By default, players can't interact with
    // assets until they're known.
    // Also by default, attached assets don't
    // become known until a player examines
    // the asset they're attached to.
    known: true,

    closed: true,
    locked: true,
    listed_in_parent: false,
  },
  dov: {
    // AdventureJS treats 'pick' and 'unlock' as distinct verbs.
    // If a player tries to use 'unlock' where 'pick' is defined,
    // the parser will try to redirect to 'pick'.

    pick: { with_assets: ["copper hairpin"] },
    // Pick and unlock are distinct verbs, to allow authors to
    // create precise situations. But, making them distinct can
    // lead to finicky situations that are unpleasant for players.
    // It's a fine line. We could either set it so that both verbs
    // work the same way:
    // unlock: { with_assets: ['copper hairpin'] },
    // Or we give the player a hint, if we don't want unlock to work.
    unlock: { on_failure: `$(We) might be able to pick it with something. ` },

    open: {
      on_first_failure: "Bet you didn't see that coming, huh? ",
      on_first_success: function () {
        OpenGame.scorecard.completeEvent("open top drawer");
        //return "  ";
      },
    },
  },
});

// middle drawer

OpenGame.createAsset({
  class: "Drawer",
  name: "middle drawer",
  synonyms: "middle desk drawer",
  description: "The middle drawer is $( middle drawer is| open or| closed ). ",
  adjectives: "desk",
  place: { attached: "bureau desk" },
  is: {
    known: true,
    closed: true,
    listed_in_parent: false,
  },
});

// bottom drawer

OpenGame.createAsset({
  class: "Drawer",
  name: "bottom drawer",
  synonyms: "bottom desk drawer",
  description: "The bottom drawer is $( bottom drawer is| open or| closed ). ",
  adjectives: "desk",
  place: { attached: "bureau desk" },
  is: {
    known: true,
    closed: true,
    listed_in_parent: false,
  },
});

// drawers collection

// Collections are a special class that allows players to refer
// to a group of objects and try to apply a verb to all of them,
// or get back a combined description.
// See doc/adventurejs.Collection.html for more info.
OpenGame.createAsset({
  class: "Collection",
  name: "desk drawers",
  place: { attached: "bureau desk" },
  collection: ["top drawer", "middle drawer", "bottom drawer"],
  synonyms: ["drawers", "three drawers"],
  is: {
    known: true,
    listed_in_parent: false,
  },
  descriptions: {
    look: function () {
      var openCount = [];
      var closedCount = [];
      var msg = "";

      msg += `The bureau has three drawers stacked vertically: 
      top, middle and bottom, each with a copper lock plate. 
      The top drawer's lock appears to be rather scratched up. 
      Currently, `;

      // Note how we're using 'this' here. Under normal circumstances
      // nested properties don't have access to their top level object.
      // AdventureJS uses asset.descriptions.look.call(asset)
      // to ensure that asset descriptions can refer to their asset.
      // Any property that relies on getStringOrArrayOrFunction()
      // will have 'this' scoped to its parent asset.
      // See /doc/Scripting_StringArrayFunction.html for more info.
      for (var i in this.collection) {
        // this.collection contains asset names.
        // We want to get references to the asset objects.
        // One way to do this is with GameName.$("my asset")
        // See /doc/Scripting_CustomCode.html for more info.
        let drawer = OpenGame.$(this.collection[i]);

        // Once we have an asset reference, asset.$is(property)
        // is a safe way to try to get asset properties.
        drawer.$is("closed")
          ? closedCount.push(drawer.name)
          : openCount.push(drawer.name);
      }

      if (0 === openCount.length) {
        msg += "all three drawers are closed.";
      } else if (0 === closedCount.length) {
        msg += "all three drawers are open.";
      } else if (2 == openCount.length) {
        msg += `the ${openCount[0]} and ${openCount[1]} 
        are open, while the ${closedCount[0]} is closed. `;
      } else if (2 == closedCount.length) {
        msg += `the ${closedCount[0]} and ${closedCount[1]} 
        are open, while the ${openCount[0]} is open. `;
      }

      return msg;
    },
  },
});


// Playground.js
// ----------
/*global adventurejs A OpenGame*/

OpenGame.createAsset({
  class: "Room",
  article: "the",
  name: "Playground",
  descriptions: {
    look: `Fireflies speckle the dusk with softly pulsing 
    motes of light. $(We've) come to a modest child's playground 
    around back of the house. The playground has many things with 
    which to play, but none of them are objects, and we're not 
    going to get into it, ok? A window leads back into the house. `,

    brief: `Play here. Go window. `,
  },
  room_scenery: {
    fireflies: {
      enabled: true,
      description:
        "Fireflies pulse gently here and there, lending a charming quality to the darkening playground. ",
    },
    grass: {
      enabled: true,
      description:
        "Occasional tufts of glossy medium height grass dot the yard. ",
    },
  },
});

// Playground in

OpenGame.createAsset({
  class: "Exit",
  direction: "in",
  place: { in: "Playground" },
  destination: "Sitting Room",
  descriptions: {
    for_exits_list: `in to the Sitting Room`,
    travel: `$(We) grab hold of the window sill, scrabble awkwardly up 
    the siding, and heft $(ourself) over the sill and in through the window, 
    where $(we) tumble into the sitting room. `,
  },
  aperture: "outside window",
});

// outside window

OpenGame.createAsset({
  class: "Window",
  name: "outside window",
  place: { in: "Playground" },
  direction: "in",
  descriptions: {
    // See how this example uses a traditional function.
    // Traditional functions are able to be scoped to their
    // top level assets which means you can use 'this' with them.
    // By contrast if you look at the code for the inside
    // window description, you'll see that it uses an arrow
    // function. Arrow functions are permitted, but because
    // they can't be scoped to their parent asset, they
    // can't use 'this'.
    look: function () {
      return `
      Though the sitting room seemed dimly lit, as it is 
      now dusk outside, the light through the window seems 
      quite bright from out here.
      The window is $(inside window is| open or| closed).
      ${
        !this.is.closed
          ? "$(We) should be able to climb back inside. "
          : "$(We'll) need to open the window if $(we) hope to get back through it. "
      }
      `;
    },

    // We could instead have used a traditional function here,
    // and those do receive scope, which would have let us use
    // 'this' to refer to the window.

    through:
      "The wan light of the sitting room seems quite bright from out here. ",
    in: function () {
      return this.descriptions.in;
    },
  },
  is: {
    closed: true,
    locked: true,
  },
  dov: {
    lock: { with_nothing: true },
    unlock: { with_nothing: true },
  },

  // Apertures, aka doors and windows etc, may exist in two places
  // one side in one room, and another side in another room.
  // We handle each side as a unique asset. In order to keep them
  // in sync, meaning open/closed and locked/unlocked, we use the
  // linked_asset property. This outside window asset is linked to
  // its other side, a corresponding inside window asset.
  linked_asset: "inside window",
});


// Objects.js
// ----------
/*global adventurejs A OpenGame*/

OpenGame.createAsset({
  class: "Chest",
  name: "small antique chest",
  indefinite_article: "an",
  place: { on: "coffee table" },

  descriptions: {
    look: function () {
      let msg = `It's a small antique Victorian chest, 
      lacquered in a glossy prussian blue and bound with 
      ornate blue steel straps that are pitted with age. 
      Its lid is 
      $(small antique chest is| locked or| unlocked) and 
      $(small antique chest is| open or| closed). `;
      if (this.game.$("small antique chest").$is("open")) {
        msg += `The chest is lined with a rich egg yolk 
          yellow brocade that presents a startling contrast 
          to its dark exterior. `;
      }
      return msg;
    },
  },
  adjectives: ["victorian", "prussian", "blue", "steel", "glossy", "old"],
  synonyms: ["straps"],
  is: {
    locked: true,
    closed: true,
  },
  dov: {
    open: {
      with_nothing: true,
      on_first_failure: `$(We) didn't think it was going to be that easy, did $(we)? `,
      on_first_success: function () {
        OpenGame.scorecard.completeEvent("open chest");
        //return "  ";
      },
    },
    unlock: {
      with_assets: ["blue steel key"],
    },
    lock: {
      with_assets: ["blue steel key"],
    },
  },
});

OpenGame.createAsset({
  class: "Paper",
  name: "goldenrod sheet",
  description: `It's a sheet of goldenrod colored paper with 
    a child's drawing on it. The drawing appears to feature  
    a girl with fire engine red hair. The name "Copper" is 
    scrawled above her in big childlike letters. `,
  place: { in: "top drawer" },
});

OpenGame.createAsset({
  class: "Key",
  name: "brass key",
  synonyms: ["glass bead"],
  article: "a",
  adjectives: ["burnished", "chonky"],
  place: { on: "coffee table" },
  description: `It's a burnished brass key with chonky teeth 
  and a small glass bead mounted in the head. `,
  iov: {
    unlock: {
      // AdventureJS offers many ways to override its default
      // actions and output. If
      // asset.dov.unlock.on_failure
      // is a string, it will be appended to the default unlock
      // failure message. In this case, we want to completely
      // override the output, so we call this.game.overrideOutput()
      // this.game is the same as OpenGame when called from a scoped function.
      // on_failure: function(){ this.game.overrideOutput(
      //   `Whoops! This brass key doesn't unlock that ${OpenGame.getInput().getAsset(1).name}. `
      // )},
      on_first_failure: function () {
        this.game.overrideOutput(
          `Whoops! Looks like $(we) can't unlock ${
            OpenGame.getInput().getAsset(1).articlename
          } with the brass key. `
        );
      },

      on_success: `Now you can open the door. `,
      then_destroy: `Oh no! The brass key broke! `,

      // There's something missing here. We haven't set this key to
      // unlock: { with_assets: ['sitting room door'] },
      // to indicate that this key can open that lock.
      // That's because we've already set that lock to
      // unlock: { with_assets: ['brass key'] }
      // When assets are linked through verb subscriptions,
      // you only have to set one or the other. Two-way connections
      // will be completed during game initialization.
    },
  },
  dov: {
    take: { on_first_success: "Now to find something to unlock with it. " },
  },
}); // brass Key

OpenGame.createAsset({
  class: "Key",
  name: "blue steel key",
  synonyms: ["blue key", "steel key"],
  adjectives: ["victorian"],
  iov: {
    unlock: { with_assets: ["small antique chest"] },
  },
  description: "It's an ornate Victorian key made of blue steel. ",
  // article: "a",
  place: { in: "top drawer" },
});

// OpenGame.createAsset({
//   class: "Key",
//   name: "tiny brass key",
//   description: "It's a tiny key, made of brass. ",
//   article: "a",
//   adjectives: ["tiny", "brass"],
//   // place: { in: "Sitting Room" },
//   iov: { 'unlock': {then_destroy: { with_result: "foo" }, }, },
// });

// OpenGame.createAsset({
//   class: "Key",
//   name: "giant brass key",
//   description: "It's a giant novelty key that looks like it's made of brass. ",
//   article: "a",
//   adjectives: "giant, brass",
//   // place: { in: "Sitting Room" },
// });

OpenGame.createAsset({
  class: "Doll",
  name: "Raggedy Ann doll",
  place: { in: "Playground" },
  descriptions: {
    look: function () {
      return `It's a threadworn Raggedy Ann doll, either well 
      loved or abandoned, it's hard to tell which. 
      ${
        OpenGame.$("copper hairpin").$is("attached", this)
          ? "A patch of her red hair is gathered into a loose pigtail by a hairpin. "
          : "Her messy red hair is by turns tangled and patchy. "
      } `;
    },
  },
  aspects: {
    attached: {
      list_in_room: false,
      list_in_examine: false,
    },
  },
  dov: {
    attach: {
      with_nothing: true,
    },
    take: {
      on_first_success: function () {
        OpenGame.scorecard.completeEvent("take ann");
        //return " ";
      },
    },
  },
});

OpenGame.createAsset({
  class: "Doll",
  name: "Raggedy Andy doll",
  place: { in: "small antique chest" },
  descriptions: {
    look: function () {
      return `It's a well-loved Raggedy Andy doll in a patched 
      sailor suit. His red hair is partially covered by a cap 
      that appears to be sewn on. " } `;
    },
  },
  dov: {
    take: {
      on_first_success: function () {
        OpenGame.scorecard.completeEvent("take andy");
        //return " ";
      },
    },
  },
});

OpenGame.createAsset({
  class: "Lockpick",
  name: "copper hairpin",
  synonyms: ["pin", "beads", "tines", "head"],
  adjectives: ["hammered"],
  article: "the",
  dov: {
    attach: {
      with_nothing: true,
    },
    take: {
      on_first_success:
        "Good catch. It looks like it might be used to pick a lock. ",
      on_success: "$(We) twirl it between $(our) nimble fingers. ",
    },
  },
  iov: {
    pick: {
      with_assets: ["top drawer"],
      then_destroy:
        "The hairpin snaps into pieces! $(We'll) have to find Raggedy Ann a new one. ",
      on_failure:
        "And just as well, as the copper is quite soft and probably won't serve long. ",
    },
  },
  descriptions: {
    throw: "It skitters across the floor. ",
    look: `The hammered copper hairpin has two tines and  
    a butterfly shaped head with tiny beads affixed to it, in  
    a vaguely art nouveau style. It's actually quite nice. `,
  },
  place: { attached: "raggedy ann doll" },
});

close verb logic

Verb logic falls into a few recognizable patterns. Direction verbs tend to be simple and redirect to tryTravel(). Manipulation verbs test whether one asset is allowed to interact with another asset. Locomotion verbs test the player's current ability to move in a specified way. Many verbs are similar, but no two verbs are identical. Each verb has its quirks. If you would like to learn more about general verb logic, we recommend you see the Verb Anatomy and Verb Process pages. Verb phases and verb actions / reactions offer various hooks to customize verb behavior. If you find that you want still more flexibility, you may want to investigate the patchVerb method, which lets you replace entire blocks of verb code. You can also write verbs from scratch if you're so inclined. See Modify Verbs for a complete list of verb modification methods.

The following sections provide information that is specific to the verb close, though they include many features which are common to most verbs.

  • Verb Demo
  • Sentence Structures help filter player input by defining what sentence structures close can handle.
  • Verb Phrases describe the direct and indirect objects that close can handle.
  • Verb Subscriptions enable close to act on specific assets, and provide a collection of properties for customizing those interactions.
  • Verb Phases offer a broad method for authors to hook into default logic and override it with custom code.
  • Verb Actions offer a surgical method for authors to hook into close's default logic and inject custom code.
  • Verb Reactions are Verb Actions that occur as secondary effects of successfully applying close.
  • Verb Params contain properties that are distinct to close. Not all verbs have params.
  • Verb Methods lists the methods that close inherits from the Verb class.
  • Verb Properties lists the properties that close inherits from the Verb class.

close sequencing

close sentence structures

accepts_structures: [
  "verb noun",
  "verb noun preposition noun"
]
accepts_structures: [
  "verb noun",
  "verb noun preposition noun"
]
accepts_structures: [
  "verb noun",
  "verb noun preposition noun"
]
accepts_structures: [
  "verb noun",
  "verb noun preposition noun"
]

The parser uses multiple filtering methods to try to channel player input into useable tokens. Sentence structures are defined for each verb in order to narrow down the input that the verb can handle. For example, the verb "hit" might accept "verb noun" as in "hit troll", or "verb noun preposition noun" as in "hit troll with sword", whereas an intransitive verb like "jump" might accept "verb" as a complete sentence. This helps to filter player input. Input that isn't accepted will return a warning to the player.

A note about adverbs: though the parser does handle some adverbs, such as "carefully examine tiara" and "turn left", it excludes them from consideration in sentence structures. Due to the slipperyness of the English language, an adverb can appear in multiple positions in a sentence while still describing the same verb, which presents enough possible word combinations to make sentence structures less useful as a filtering tool. Instead, the parser puts adverbs aside and handles them separately.

  • It is possible for authors to modify a verb's structures through the use of patchVerb.
  • To learn more about modifying verbs, see Modify Verbs.

close phrases

phrase1:
{
  accepts_noun: true,
  noun_must_be:
  {
    known: true,
    tangible: true,
    present: true,
    visible: true,
    reachable: true,
  },
},
phrase2:
{
  accepts_noun: true,
  noun_must_be:
  {
    in_inventory: true,
    known: true,
  },
  accepts_preposition: true,
  requires_preposition: true,
  accepts_these_prepositions: ["with"],
},
phrase2:
{
  accepts_noun: true,
  noun_must_be:
  {
    in_inventory: true,
  },
  accepts_preposition: true,
  requires_preposition: true,
  accepts_these_prepositions: ["with"],
},
phrase2:
{
  accepts_noun: true,
  noun_must_be:
  {
    in_inventory: true,
    known: true,
  },
  accepts_preposition: true,
  requires_preposition: true,
  accepts_these_prepositions: ["with"],
},
phrase2:
{
  accepts_noun: true,
  noun_must_be:
  {
    in_inventory: true,
    known: true,
  },
  accepts_preposition: true,
  requires_preposition: true,
  accepts_these_prepositions: ["with"],
},

The AdventureJS parser uses multiple filtering methods to try to interpret player input. A phrase usually consists of a noun and/or a preposition that can be handled as a direct or indirect object. Each verb defines a unique set of phrases depending on what its logic can handle. Verbs may handle zero, one, two, or three verbs. The nested noun_must_be object sets conditional qualifiers for nouns to help narrow down assets that the verb might act upon. Input that isn't accepted will return a warning to the player.

  • It is possible for authors to modify a verb's phrases through the use of patchVerb.
  • To see a list of properties that can be set for phrases, see the Phrase class.
  • To see a list of properties that can be set for phrase.noun_must_be, see the NounMustBe class.
  • To learn more about modifying verbs, see Modify Verbs.

close verb phases

Verb phases are parts of verb subscriptions that allow authors to override how close is applied to any specific asset. This is a broad method for customizing verb/noun interactions on a per-asset basis. For example, an author might supply completely different logic for "throw feather" vs "throw baseball" vs "throw anvil".

When close is applied to an asset, it attempts to run a sequence of methods. All verbs have a do() method, and for most verbs, do() acts as a sequencer that moves the verb through six distinct sub-methods, or phases: doBeforeTry, doTry, doAfterTry, doBeforeSuccess, doSuccess and doAfterSuccess. Each phase serves a specific purpose.

  • doTry handles all the default conditional logic to determine whether a verb can be applied to an asset: ie, is the asset present, visible, reachable, etc?
  • doSuccess handles state changes and printing messages back to the player.
  • The other four phases, doBeforeTry, doAfterTry, doBeforeSuccess and doAfterSuccess have no default logic. Instead they offer hooks for the author to inject custom code anywhere in the life cycle of the verb action.

See below for examples of how to use verb phases for close.

do

    doBeforeTry
    MyGame.createAsset({
      class: "Thing",
      name: "This Asset",
      dov: {
        close: {
          doBeforeTry: function( params )
          {
            let msg = `You're about to try to close ${this.articlename}. `;
            this.game.print(msg);
            return;
          },
        },
      },
    });

    doTry

    doAfterTry
    MyGame.createAsset({
      class: "Thing",
      name: "This Asset",
      dov: {
        close: {
          doAfterTry: function( params )
          {
            let msg = `You just tried to close ${this.articlename}! `;
            this.game.print(msg);
            return;
          },
        },
      },
    });
    doBeforeSuccess
    MyGame.createAsset({
      class: "Thing",
      name: "This Asset",
      dov: {
        close: {
          doBeforeSuccess: function( params )
          {
            let msg = `You're about to succeed in performing close on ${this.articlename}. `;
            this.game.print(msg);
            return;
          },
        },
      },
    });

    doSuccess

    doAfterSuccess
    MyGame.createAsset({
      class: "Thing",
      name: "This Asset",
      dov: {
        close: {
          doAfterSuccess: function( params )
          {
            let msg = `You succeeded in performing close on ${this.articlename}. `;
            this.game.print(msg);
            return;
          },
        },
      },
    });
Expand for example

For example, consider the verb "take" as applied to this singing sword. Imagine that an author wants the game to print a custom message when the player tries to take the sword, and a different message when the player succeeds in taking it.

MyGame.createAsset({
  class: "Sword",
  name: "singing sword",
  dov: {
    take: 
    {
      doAfterTry: function( params )
      {
        let msg = "The sword begins to vibrate as your hand curls around its haft. ";
        MyGame.print( msg );
      },
      doAfterSuccess: function( params )
      {
        let msg = "The sword bursts into song in your hand. ";
        MyGame.print( msg );
      },
    },
  },
});

Note that verb subscriptions are set distinctly for direct objects and indirect objects. All of the prior examples show verb phases applied to direct object verb subscriptions. Verb phases can also be applied to indirect object subscriptions. For example, perhaps our swinging sword had to be removed from a stone. We might want to hook into the stone's indirect object verb subscription for "remove".

MyGame.createAsset({
  class: "Thing",
  name: "stone",
  iov: {
    remove: 
    {
      doBeforeTry: function( params )
      {
        let msg = "Will the stone judge you worthy enough to remove the sword? "
        MyGame.print( msg );
      },
      doAfterSuccess: function( params )
      {
        let msg = "With the sword removed, the stone bursts into rubble! ";
        MyGame.print( msg );
        this.destroy();
      },      
    },
  },
});
  • To learn more, see Verb Phases.
  • Verb Phases are related to but distinct from Verb Actions, which offers a more surgical method to hook into the doTry and doSuccess phases, on a per object basis.

close verb actions

These verb actions are available for the verb close. Expand any item to see a code example.

tryCloseThis

If close is called with only a direct object, as in "close lantern", the verb.handleActions() method looks for direct_object.tryCloseThis.

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThis: function (params) {
    let msg = 'Called verb action first_thing.tryCloseThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If direct_object.tryCloseThis is found to be an object rather than a function, the verb.handleActions() method checks the object for a nested function that matches the player asset's name. (Since no indirect object was given, the player is assumed to be the indirect object.) For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThis: { 
    "My Hero": function (params) {
      let msg = 'Called verb action first_thing.tryCloseThis["My Hero"]()';
      MyGame.print(msg);
    }
  },
});
doCloseThis

If close is called with only a direct object, as in "light lantern", the verb.handleActions() method looks for direct_object.doCloseThis().

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThis: function (params) {
    let msg = 'Called verb action first_thing.doCloseThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If doCloseThis is found to be an object rather than a function, the verb.handleActions() method checks the object for a nested function using the player asset's name. (Since no indirect object was given, the player is assumed to be the indirect object.) For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThis: { 
    "My Hero": function (params) {
      let msg = 'Called verb action first_thing.doCloseThis["My Hero"]()';
      MyGame.print(msg);
    }
  },
});
tryCloseThis[Preposition]That +
    tryCloseThat[Preposition]This

If close is called with a direct object, a preposition, and an indirect object, as in "light lantern with candle", the verb.handleActions() method looks for direct_object.tryCloseThisWithThat and indirect_object.tryCloseThatWithThis.

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThisWithThat: function (params) {
    let msg = 'Called verb action first_thing.tryCloseThisWithThat()';
    MyGame.print(msg);
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  tryCloseThatWithThis: function (params) {
    let msg = 'Called verb action second_thing.tryCloseThatWithThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If first_thing.tryCloseThisWithThat is found to be an object rather than a function, the verb.handleActions() looks for first_thing.tryCloseThisWithThat["Second Thing"](). The indirect object will also be checked for second_thing.tryCloseThatWithThis["First Thing"](). The two methods are equivalent. Which to use is purely up to author's choice. For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThisWithThat: { 
    "Second Thing": function (params) {
      let msg = 'Called verb action first_thing.tryCloseThisWithThat["Second Thing"]()';
      MyGame.print(msg);
    }
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  tryCloseThatWithThis: { 
    "First Thing": function (params) {
      let msg = 'Called verb action second_thing.tryCloseThatWithThis["First Thing"]()';
      MyGame.print(msg);
    }
  },
});
doCloseThis[Preposition]That +
    doCloseThat[Preposition]This

If close is called with a direct object, a preposition, and an indirect object, as in "light lantern with candle", the verb.handleActions() method looks for direct_object.doCloseThisWithThat and indirect_object.doCloseThatWithThis.

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThisWithThat: function (params) {
    let msg = 'Called verb action first_thing.doCloseThisWithThat()';
    MyGame.print(msg);
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  doCloseThatWithThis: function (params) {
    let msg = 'Called verb action second_thing.doCloseThatWithThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If first_thing.doCloseThisWithThat is found to be an object rather than a function, the verb.handleActions() looks for first_thing.doCloseThisWithThat["Second Thing"](). The indirect object will also be checked for second_thing.doCloseThatWithThis["First Thing"](). The two methods are equivalent. Which to use is purely up to author's choice. For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThisWithThat: { 
    "Second Thing": function (params) {
      let msg = 'Called verb action first_thing.doCloseThisWithThat["Second Thing"]()';
      MyGame.print(msg);
    }
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  doCloseThatWithThis: { 
    "First Thing": function (params) {
      let msg = 'Called verb action second_thing.doCloseThatWithThis["First Thing"]()';
      MyGame.print(msg);
    }
  },
});
tryCloseThis

If close is called with only a direct object, as in "close lantern", the verb.handleActions() method looks for direct_object.tryCloseThis.

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThis: function (params) {
    let msg = 'Called verb action first_thing.tryCloseThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If direct_object.tryCloseThis is found to be an object rather than a function, the verb.handleActions() method checks the object for a nested function that matches the player asset's name. (Since no indirect object was given, the player is assumed to be the indirect object.) For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThis: { 
    "My Hero": function (params) {
      let msg = 'Called verb action first_thing.tryCloseThis["My Hero"]()';
      MyGame.print(msg);
    }
  },
});
doCloseThis

If close is called with only a direct object, as in "light lantern", the verb.handleActions() method looks for direct_object.doCloseThis().

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThis: function (params) {
    let msg = 'Called verb action first_thing.doCloseThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If doCloseThis is found to be an object rather than a function, the verb.handleActions() method checks the object for a nested function using the player asset's name. (Since no indirect object was given, the player is assumed to be the indirect object.) For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThis: { 
    "My Hero": function (params) {
      let msg = 'Called verb action first_thing.doCloseThis["My Hero"]()';
      MyGame.print(msg);
    }
  },
});
tryCloseThis[Preposition]That +
    tryCloseThat[Preposition]This

If close is called with a direct object, a preposition, and an indirect object, as in "light lantern with candle", the verb.handleActions() method looks for direct_object.tryCloseThisWithThat and indirect_object.tryCloseThatWithThis.

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThisWithThat: function (params) {
    let msg = 'Called verb action first_thing.tryCloseThisWithThat()';
    MyGame.print(msg);
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  tryCloseThatWithThis: function (params) {
    let msg = 'Called verb action second_thing.tryCloseThatWithThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If first_thing.tryCloseThisWithThat is found to be an object rather than a function, the verb.handleActions() looks for first_thing.tryCloseThisWithThat["Second Thing"](). The indirect object will also be checked for second_thing.tryCloseThatWithThis["First Thing"](). The two methods are equivalent. Which to use is purely up to author's choice. For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThisWithThat: { 
    "Second Thing": function (params) {
      let msg = 'Called verb action first_thing.tryCloseThisWithThat["Second Thing"]()';
      MyGame.print(msg);
    }
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  tryCloseThatWithThis: { 
    "First Thing": function (params) {
      let msg = 'Called verb action second_thing.tryCloseThatWithThis["First Thing"]()';
      MyGame.print(msg);
    }
  },
});
doCloseThis[Preposition]That +
    doCloseThat[Preposition]This

If close is called with a direct object, a preposition, and an indirect object, as in "light lantern with candle", the verb.handleActions() method looks for direct_object.doCloseThisWithThat and indirect_object.doCloseThatWithThis.

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThisWithThat: function (params) {
    let msg = 'Called verb action first_thing.doCloseThisWithThat()';
    MyGame.print(msg);
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  doCloseThatWithThis: function (params) {
    let msg = 'Called verb action second_thing.doCloseThatWithThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If first_thing.doCloseThisWithThat is found to be an object rather than a function, the verb.handleActions() looks for first_thing.doCloseThisWithThat["Second Thing"](). The indirect object will also be checked for second_thing.doCloseThatWithThis["First Thing"](). The two methods are equivalent. Which to use is purely up to author's choice. For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThisWithThat: { 
    "Second Thing": function (params) {
      let msg = 'Called verb action first_thing.doCloseThisWithThat["Second Thing"]()';
      MyGame.print(msg);
    }
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  doCloseThatWithThis: { 
    "First Thing": function (params) {
      let msg = 'Called verb action second_thing.doCloseThatWithThis["First Thing"]()';
      MyGame.print(msg);
    }
  },
});
tryCloseThis

If close is called with only a direct object, as in "close lantern", the verb.handleActions() method looks for direct_object.tryCloseThis.

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThis: function (params) {
    let msg = 'Called verb action first_thing.tryCloseThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If direct_object.tryCloseThis is found to be an object rather than a function, the verb.handleActions() method checks the object for a nested function that matches the player asset's name. (Since no indirect object was given, the player is assumed to be the indirect object.) For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThis: { 
    "My Hero": function (params) {
      let msg = 'Called verb action first_thing.tryCloseThis["My Hero"]()';
      MyGame.print(msg);
    }
  },
});
doCloseThis

If close is called with only a direct object, as in "light lantern", the verb.handleActions() method looks for direct_object.doCloseThis().

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThis: function (params) {
    let msg = 'Called verb action first_thing.doCloseThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If doCloseThis is found to be an object rather than a function, the verb.handleActions() method checks the object for a nested function using the player asset's name. (Since no indirect object was given, the player is assumed to be the indirect object.) For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThis: { 
    "My Hero": function (params) {
      let msg = 'Called verb action first_thing.doCloseThis["My Hero"]()';
      MyGame.print(msg);
    }
  },
});
tryCloseThis[Preposition]That +
    tryCloseThat[Preposition]This

If close is called with a direct object, a preposition, and an indirect object, as in "light lantern with candle", the verb.handleActions() method looks for direct_object.tryCloseThisWithThat and indirect_object.tryCloseThatWithThis.

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThisWithThat: function (params) {
    let msg = 'Called verb action first_thing.tryCloseThisWithThat()';
    MyGame.print(msg);
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  tryCloseThatWithThis: function (params) {
    let msg = 'Called verb action second_thing.tryCloseThatWithThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If first_thing.tryCloseThisWithThat is found to be an object rather than a function, the verb.handleActions() looks for first_thing.tryCloseThisWithThat["Second Thing"](). The indirect object will also be checked for second_thing.tryCloseThatWithThis["First Thing"](). The two methods are equivalent. Which to use is purely up to author's choice. For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThisWithThat: { 
    "Second Thing": function (params) {
      let msg = 'Called verb action first_thing.tryCloseThisWithThat["Second Thing"]()';
      MyGame.print(msg);
    }
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  tryCloseThatWithThis: { 
    "First Thing": function (params) {
      let msg = 'Called verb action second_thing.tryCloseThatWithThis["First Thing"]()';
      MyGame.print(msg);
    }
  },
});
doCloseThis[Preposition]That +
    doCloseThat[Preposition]This

If close is called with a direct object, a preposition, and an indirect object, as in "light lantern with candle", the verb.handleActions() method looks for direct_object.doCloseThisWithThat and indirect_object.doCloseThatWithThis.

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThisWithThat: function (params) {
    let msg = 'Called verb action first_thing.doCloseThisWithThat()';
    MyGame.print(msg);
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  doCloseThatWithThis: function (params) {
    let msg = 'Called verb action second_thing.doCloseThatWithThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If first_thing.doCloseThisWithThat is found to be an object rather than a function, the verb.handleActions() looks for first_thing.doCloseThisWithThat["Second Thing"](). The indirect object will also be checked for second_thing.doCloseThatWithThis["First Thing"](). The two methods are equivalent. Which to use is purely up to author's choice. For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThisWithThat: { 
    "Second Thing": function (params) {
      let msg = 'Called verb action first_thing.doCloseThisWithThat["Second Thing"]()';
      MyGame.print(msg);
    }
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  doCloseThatWithThis: { 
    "First Thing": function (params) {
      let msg = 'Called verb action second_thing.doCloseThatWithThis["First Thing"]()';
      MyGame.print(msg);
    }
  },
});
tryCloseThis

If close is called with only a direct object, as in "close lantern", the verb.handleActions() method looks for direct_object.tryCloseThis.

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThis: function (params) {
    let msg = 'Called verb action first_thing.tryCloseThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If direct_object.tryCloseThis is found to be an object rather than a function, the verb.handleActions() method checks the object for a nested function that matches the player asset's name. (Since no indirect object was given, the player is assumed to be the indirect object.) For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThis: { 
    "My Hero": function (params) {
      let msg = 'Called verb action first_thing.tryCloseThis["My Hero"]()';
      MyGame.print(msg);
    }
  },
});
doCloseThis

If close is called with only a direct object, as in "light lantern", the verb.handleActions() method looks for direct_object.doCloseThis().

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThis: function (params) {
    let msg = 'Called verb action first_thing.doCloseThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If doCloseThis is found to be an object rather than a function, the verb.handleActions() method checks the object for a nested function using the player asset's name. (Since no indirect object was given, the player is assumed to be the indirect object.) For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThis: { 
    "My Hero": function (params) {
      let msg = 'Called verb action first_thing.doCloseThis["My Hero"]()';
      MyGame.print(msg);
    }
  },
});
tryCloseThis[Preposition]That +
    tryCloseThat[Preposition]This

If close is called with a direct object, a preposition, and an indirect object, as in "light lantern with candle", the verb.handleActions() method looks for direct_object.tryCloseThisWithThat and indirect_object.tryCloseThatWithThis.

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThisWithThat: function (params) {
    let msg = 'Called verb action first_thing.tryCloseThisWithThat()';
    MyGame.print(msg);
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  tryCloseThatWithThis: function (params) {
    let msg = 'Called verb action second_thing.tryCloseThatWithThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If first_thing.tryCloseThisWithThat is found to be an object rather than a function, the verb.handleActions() looks for first_thing.tryCloseThisWithThat["Second Thing"](). The indirect object will also be checked for second_thing.tryCloseThatWithThis["First Thing"](). The two methods are equivalent. Which to use is purely up to author's choice. For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  tryCloseThisWithThat: { 
    "Second Thing": function (params) {
      let msg = 'Called verb action first_thing.tryCloseThisWithThat["Second Thing"]()';
      MyGame.print(msg);
    }
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  tryCloseThatWithThis: { 
    "First Thing": function (params) {
      let msg = 'Called verb action second_thing.tryCloseThatWithThis["First Thing"]()';
      MyGame.print(msg);
    }
  },
});
doCloseThis[Preposition]That +
    doCloseThat[Preposition]This

If close is called with a direct object, a preposition, and an indirect object, as in "light lantern with candle", the verb.handleActions() method looks for direct_object.doCloseThisWithThat and indirect_object.doCloseThatWithThis.

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThisWithThat: function (params) {
    let msg = 'Called verb action first_thing.doCloseThisWithThat()';
    MyGame.print(msg);
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  doCloseThatWithThis: function (params) {
    let msg = 'Called verb action second_thing.doCloseThatWithThis()';
    MyGame.print(msg);
  },
});

Verb actions can have nested functions for specific asset interactions. If first_thing.doCloseThisWithThat is found to be an object rather than a function, the verb.handleActions() looks for first_thing.doCloseThisWithThat["Second Thing"](). The indirect object will also be checked for second_thing.doCloseThatWithThis["First Thing"](). The two methods are equivalent. Which to use is purely up to author's choice. For example:

MyGame.createAsset({
  class: "Thing",
  name: "First Thing",
  doCloseThisWithThat: { 
    "Second Thing": function (params) {
      let msg = 'Called verb action first_thing.doCloseThisWithThat["Second Thing"]()';
      MyGame.print(msg);
    }
  },
});
MyGame.createAsset({
  class: "Thing",
  name: "Second Thing",
  doCloseThatWithThis: { 
    "First Thing": function (params) {
      let msg = 'Called verb action second_thing.doCloseThatWithThis["First Thing"]()';
      MyGame.print(msg);
    }
  },
});

WHY SO MANY???

Verb actions provide hooks that allow authors to inject custom code in response to specific combinations of verb/preposition/noun. There are a lot of them and clearly some are redundant; in its defense, it's a deliberate effort to offer a menu of precise injection points for authors' custom code. To use a verb action, just use the verb action name as a method on any asset. Below is a generic example of how to code a verb action.

Expand for example

In this example, the pistol asset has two verb actions.

  • pistol.doShootThis() will be called when a player inputs "shoot pistol".
  • pistol.doShootThatWithThis.television() will be called when a player inputs "shoot television with pistol".
MyGame.createAsset({
  class: "Player",
  name: "Elvis",  
});
MyGame.createAsset({
  class: "Weapon",
  name: "pistol",
  doShootThis: {
    let msg = `You fire the pistol! BANG! `;
      MyGame.print(msg);
  },
  doShootThatWithThis:{
    "television": function {
      let msg = `You fire the pistol at the television! BANG! 
        The television explodes with sparks and a screech of static. `;
      MyGame.print(msg);
    },
  },
});
MyGame.createAsset({
  class: "Electronics",
  name: "television",
});

Verb actions are called by the verb.handleActions() method, which looks for those nested functions and calls whatever function it finds. Each verb has a unique set of actions, which mirror the sentence structures the verb can handle. For instance, the verb lock handles "verb noun" and "verb noun preposition noun", and so it handles tryLockThis and doLockThis and tryLockThisWithThat and doLockThisWithThat.

The difference between try actions and do actions is one of timing. try actions fire immediately before a verb's doTry phase, which provides an opportunity to supersede a verb's default conditional logic before it tests whether the verb can be applied to the assets. do actions fire immediately before a verb's doSuccess phase, which provides an opportunity to supersede or append the verb's state changes and output to the player.

It's common for sentence structures to be mutated during a verb's doTry phase, as doTry may reorder a player's input to make it conform with the verb's logic. This means that the try and do actions may differ within the same turn. You can check the browser's Javascript console to see which actions are being called.

  • See Verb Actions to learn more.
  • In addition to verb actions, there are verb reactions, which are a set of non-verb-specific hooks that fire as side effects of a verb's doSuccess phase. See Verb Reactions for a complete list of them.
  • Verb actions and reactions are related to but distinct from Verb Phases, which allow authors to broadly override entire phases of a verb.

close verb reactions

None available for close

Verb reactions provide hooks that allow authors to inject custom code into side effects caused by successful verb operations. Consider the verb drop. Inputting "drop lantern" will result in two events – removing the lantern from the player and moving it to the room – which causes these four verb reactions:

• lantern.doRemoveThisFromThat(player)
• player.doRemoveThatFromThis(lantern)
• lantern.doMoveThisToThat(room)
• room.doMoveThatToThis(lantern)

There are four reactions because each asset in the interaction is checked for custom code pertaining to the other. This may seem redundant, but it's done in a deliberate effort to provide flexibility to authors. If you prefer to attach custom code to the lantern, you can. If you prefer to attach custom code to the player, you can. You're welcome to organize your code in whichever way serves you best.

Expand for example

In this example, imagine that an author would like the game to print a custom message whenever Elvis enters or leaves the building, regardless of what verb is used. Authors can hook into any of the doRemoveThisFromThat, doRemoveThatFromThis, doMoveThisToThat, or doMoveThatToThis verb reactions. Below is a generic example of how to code a verb reaction.

MyGame.createAsset({
  class: "Player",
  name: "Elvis",
}),
MyGame.createAsset({
  class: "Room",
  name: "The Building",
  doMoveThatToThis: 
  {
    "Elvis": function() 
    {
      MyGame.print("Elvis has entered The Building! ");
    }
  },
  doRemoveThatFromThis: 
  {
    "Elvis": function() 
    {
      MyGame.print("Elvis has left The Building! ");
    }
  },
}),
  • Verb reactions aren't specific to any particular verb; they may be called by many verbs. See Verb Reactions for a complete list of them.
  • Verb reactions work the same way as Verb Actions. The only differences are that verb reactions are non-specific and only fire at the end of a verb's doSuccess phase.
  • Verb actions and reactions are related to but distinct from Verb Phases, which allow authors to broadly override entire phases of a verb.

close subscriptions

An asset must be subscribed to a verb for that verb to act upon that asset (with some exceptions). Though verbs are universal, each asset's verb subscriptions are distinct objects that can be used to customize how a given verb interacts with a given asset. To say it another way, a verb subscription is a collection of properties that defines how a verb should be applied to an asset; which allow authors to override a verb's default behaviors on a per-asset basis.

It's important to note that verb subscriptions need to be declared as direct or indirect, depending on whether the asset will be used as a direct object or indirect object. In the case of "unlock lock with key", the lock is the direct object and the key is the indirect object, and each asset needs to be subscribed to unlock in the appropriate way. (It's allowed, and a common pattern, to subscribe assets directly and indirectly to the same verb.)

Expand for example
MyGame.createAsset({
  class: "Lock",
  name: "lock",
  dov: { unlock: true },
});
MyGame.createAsset({
  class: "Key",
  name: "key",
  iov: { unlock: true },
});

As shown in the above example, dov: { unlock: true } is the minimum that is required to subscribe an asset to a verb. However, verb subscriptions have many properties that can be used to customize how this verb is applied to this asset. (Setting any property eliminates the need to set verb: true. ) Below is a list of verb subscription properties that authors may find useful.

  • automatically allows for some verbs to be performed automatically if context calls for it; for example, when unlocking a door in order to pass through it. This takes precedence over global settings.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { close: { automatically: true } },
    });
    
  • automatically_after_use if automatically is set true, this sets it so that a verb can only be applied automatically after a player has already used it manually. This is to prevent automatic use of tools from breaking puzzles. For example, imagine one door with many keys but only one that works; if choosing the right key is part of the puzzle, this option prevents players from simply saying "unlock door" and having the right key automatically selected for them.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { close: { automatically_after_use: true } },
    });
    
  • doBeforeTry Verb phases provide methods to override default verb behaviors. See the verb phases section on this page to learn more about close's verb phases.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { 
        close: { 
          doBeforeTry: function (e) {
            console.log("close.doBeforeTry");
          },
        } 
      },
    });
    
  • doAfterTry Verb phases provide methods to override default verb behaviors. See the verb phases section on this page to learn more about close's verb phases.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { 
        close: { 
          doAfterTry: function (e) {
            console.log("close.doAfterTry");
          },
        } 
      },
    });
    
  • doBeforeSuccess Verb phases provide methods to override default verb behaviors. See the verb phases section on this page to learn more about close's verb phases.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { 
        close: { 
          doBeforeSuccess: function (e) {
            console.log("close.doBeforeSuccess");
          },
        } 
      },
    });
    
  • doAfterSuccess Verb phases provide methods to override default verb behaviors. See the verb phases section on this page to learn more about close's verb phases.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { 
        close: { 
          doAfterSuccess: function (e) {
            console.log("close.doAfterSuccess");
          },
        } 
      },
    });
    
  • enabled allows changing the state of an asset's responsiveness to a given verb. If set false, a subscribed asset will not respond to the verb. This is useful for temporarily disabling verbs for specific assets; for example, if you had a door that could not be unlocked until another action was completed. Authors can enable or disable an individual verb subscription via asset.setDOV(verbname) and asset.unsetDOV(verbname)
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { close: { enabled: true } },
    });
    
  • on_success is an optional parameter. It is set as a string by default, but authors may provide a string or array or function to be served by getStringOrArrayOrFunction(). The resulting string will be appended to the verb's default success message.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { close: { on_success: "You close the thing. " } },
    });
    
  • on_first_success is an optional parameter. It is set as a string by default, but may provide a string or array or function to be served by getStringOrArrayOrFunction(). The resulting string will be appended to the verb's default success message the first time it is applied to this asset.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { close: { on_first_success: "You close the thing the first time. " } },
    });
    
  • on_failure is an optional parameter. It is set as a string by default, but may provide a string or array or function to be served by getStringOrArrayOrFunction(). The resulting string will be appended to the verb's default failure message.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { close: { on_failure: "You failed to close the thing. " } },
    });
    
  • on_first_failure is an optional parameter. It is set as a string by default, but may provide a string or array or function to be served by getStringOrArrayOrFunction(). The resulting string will be appended to the verb's default failure message the first time it is applied to this asset.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { close: { on_first_failure: "You failed to close the thing the first time. " } },
    });
    
  • once if true, the verb can only be applied once to the asset. The verb subscription will be disabled after use.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { close: { once: true } },
    });
    
  • then_destroy allows author to specify that this asset should be destroyed after using. If then_destroy is set, the asset will be destroyed after a single use regardless of how once is set. By default, then_destroy is set to a boolean. It may optionally be set to string or array or function subject to getStringOrArrayOrFunction(). If any of those types are found, they will be called and returned as results.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { close: { then_destroy: true } },
    });
    
  • with_anything pertains only to indirect objects. If true, this asset can be used as an indirect object of this verb with any direct object.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      iov: { close: { with_anything: true } },
    });
    
  • with_assets allows author to specify particular assets that can interact with this one using the given verb. For example "unlock door with key" where the specified key is the only asset that can unlock door. This works distinctly for direct and indirect verb subscriptions. So, for instance, in "unlock door with key", the door might have a direct object subscription, while the key has an indirect object description.
    Expand for example
    MyGame.createAsset({
      class: "Door",
      name: "gold door",
      dov: { unlock: { with_assets: [ "gold key" ] } },
    });
    MyGame.createAsset({
      class: "Key",
      name: "gold key",
      iov: { unlock: { with_assets: [ "gold door" ] } },
    });
    
  • with_classes allows author to specify particular classes that can interact with this asset using the given verb. For example "unlock door with skeleton key" where any instance of the class SkeletonKey can unlock door. This works distinctly for direct and indirect verb subscriptions. So, for instance, in "unlock door with skeleton key", the door might have a direct object subscription, while the key has an indirect object description.
    Expand for example
    MyGame.createAsset({
      class: "Door",
      name: "red door",
      dov: { unlock: { with_classes: [ "SkeletonKey" ] } },
    });
    MyGame.createAsset({
      class: "SkeletonKey",
      name: "skeleton key",
      iov: { unlock: { with_classes: [ "Door", "Chest" ] } },
    });
    
  • with_nothing pertains only to direct objects. If true, the specified verb can be applied to the direct object without the use of any indirect object.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { close: { with_nothing: true } },
    });
    
  • with_params is used to contain a set of parameters that are specific to this particular verb. For example, plugIn includes with_params.max_connections for setting limits on how many other assets this asset can be plugged in to. See the with_params section on this page to learn more about close's parameters.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { close: { with_params: { close_property: value } } },
    });
    
  • with_prepositions allows author to explicitly permit certain prepositions to be used with a verb on this object. For instance: "knock over umbrella stand" might fail with a message of "you can't knock over the umbrella stand"; setting umbrella_stand.dov.knock.with_prepositions = ["over"] will allow the action to succeed.
    Expand for example
    MyGame.createAsset({
      class: "Thing",
      name: "universal widget",
      dov: { close: { with_prepositions: [ "through", "over" ] } },
    });
    

  • To learn more about working with verb subscriptions, see Verb Subscriptions.
  • These are most, but not all, of the properties of a verb subscription. For full reference, see the VerbSubscription class.

close params

Some verbs may have custom params. When an asset subscribes to such a verb, the verb's params are mirrored in the asset's verb subscription, where they are unique to that asset. To put it another way: while each verb may have a unique set of params, each asset may have its own customized version of those params.

with_params: {},

For example, consider this setting of the verb plugIn:

MyGame.dictionary.verbs.plugIn.with_params.max_connections = 1

By default, assets that can be plugged in will take this setting and can only be plugged in to one other asset. Now imagine that an author wants to create a power cord that needs to be plugged in to both a computer and an outlet. The author can achieve that by customizing the cord's subscription to plugIn.

Expand for example
MyGame.createAsset({
  class: "Cable",
  name: "power cord",
  dov: { plugIn: { with_assets: ['computer','outlet'], with_params: { max_connections: 2 }, }, },
})
MyGame.createAsset({
  class: "Computer",
  name: "PC",
  iov: { plugIn: { with_assets: ['power cord'], }, },
})
MyGame.createAsset({
  class: "ElectricalOutlet",
  name: "outlet",
  iov: { plugIn: { with_assets: ['power cord'], }, },
})

In this example, the power cord verb subscription's max_connections setting overrides the verb's max_connections setting, allowing the player to plug the power cord into two assets. The computer and the outlet don't have any custom value set for max_connections; they'll receive the default value, meaning they each can have only one asset plugged into them.

  • It is possible for authors to modify a verb's params through the use of patchVerb.
  • To learn more about modifying verbs, see Modify Verbs.

Private Constructor:

MyGame.createVerb({ "name": "close", [...] });

close is a predefined instance of Verb that gets constructed automatically at runtime. It is defined in the library as a generic object, and then passed to Dictionary#createVerb for construction, validation, and initialization. Because this is predefined, authors should not need to create new instances. For information on modifying predefined Verbs, see Modify Verbs.

Inherited Overrides

Index

Methods:

Properties:

Methods Collapse all  |  Expand all

canBeIntransitive()

Defined in: adventure/dictionary/Verb.js, line 2340

Inherited from: adventurejs.Verb#canBeIntransitive

Verb can be intransitive if it doesn't require a noun.
do()

Defined in: adventure/dictionary/Verb.js, line 1045

Inherited from: adventurejs.Verb#do

Verb.do is a coordinating method that sequences six other submethods in a series. In the case of Verb instances that can act on a collection of Assets in a single turn, Verb.do only fires once, but it loops through the Asset collection and calls each submethod for every Asset in the collection. The sequence is:

do -> The two key submethods are Verb.doTry and Verb.doSuccess. For most Verb instances, these two methods contain the bulk of the logic particular to this Verb. Verb.doTry determines whether a Verb can act on an Asset, and if it can't, prints an error message to Display. Verb.doSuccess applies the Verb to the Asset: updates the game state, assembles dynamic output, and prints the results to Display.

A Verb instance isn't required to use all of these methods. Some Verbs may bypass Verb.doTry because no special conditions are required to apply the Verb. Some specialized Verbs such as oops and undo override Verb.do entirely and don't use any submethods.

The other four submethods – Verb.doBeforeTry, Verb.doAfterTry, Verb.doBeforeSuccess, and Verb.doAfterSuccess – exist to provide optional hooks for authors to add custom interactions with individual Assets. For more information about Verb Actions and Verb Phases, see Verb Actions and Verb Phases.

And so, the first thing Verb.do does is to verify that each method exists on the Verb instance. If the submethod exists, it is called. Each submethod sends a return to Verb.do.

If the Verb is acting on a collection, a false return means that the Asset currently being acted on has responded in a way that blocks further parsing, and brings this turn to a halt. A null return means that the Asset currently being acted on has concluded its own parsing, but not in such a way as to block further parsing, and Verb.do moves on to the next Asset.
doSuccess()

Defined in: adventure/dictionary/Verb.js, line 1479

Inherited from: adventurejs.Verb#doSuccess

doSuccess typically contains all the code needed to apply this Verb to the specified Asset once it has successfully passed through all of our conditional logic. doBeforeSuccess and doAfterSuccess are provided so that authors can apply custom success code on an item-by-item basis, but it is also possible to globally modify doSuccess. For information about modifying verbs, see Modify Verbs.
doTry()

Defined in: adventure/dictionary/Verb.js, line 1236

Inherited from: adventurejs.Verb#doTry

doTry typically contains all the specific logic needed to determine if this Verb can act on the specified Asset. (We already applied some general logic supplied by NounMustBe before arriving here.) For information about modifying verbs, see Modify Verbs.
enqueueCollection()

Defined in: adventure/dictionary/Verb.js, line 2005

Inherited from: adventurejs.Verb#enqueueCollection

enqueueCollection takes a collection of Assets and enqueues them to game.parser for sequential handling.
getState()

Defined in: adventure/dictionary/Verb.js, line 2358

Inherited from: adventurejs.Verb#getState

Get this verb's state or unstate.
handleActions()

Defined in: adventure/dictionary/Verb.js, line 1251

Inherited from: adventurejs.Verb#handleActions

handleActions attempts to call any verb actions that match the current assets and sentence structure.
handleFailure()

Defined in: adventure/dictionary/Verb.js, line 2049

Inherited from: adventurejs.Verb#handleFailure

handleFailure prints either a given fail message or a generic fail msg if one is specified.
handleSuccess()

Defined in: adventure/dictionary/Verb.js, line 2148

Inherited from: adventurejs.Verb#handleSuccess

handleSuccess prints the provided success message or a generic one that has been defined by author. It also checks direct and indirect objects for custom verb subscription on_success results and tryDestroy results.
hasState()

Defined in: adventure/dictionary/Verb.js, line 2349

Inherited from: adventurejs.Verb#hasState

Does this verb have state or unstate?
hasStructure() → {boolean}

Defined in: adventure/dictionary/Verb.js, line 2376

Inherited from: adventurejs.Verb#hasStructure

Test if this verb supports the given sentence structure.

Returns:

boolean
hasVerbSubscriptionConnection()

Defined in: adventure/dictionary/Verb.js, line 2506

Inherited from: adventurejs.Verb#hasVerbSubscriptionConnection

Test whether two assets are connected by this verb, for example a rope tied to a tree, or a computer plugged into a socket.
initialize()

Defined in: adventure/dictionary/Verb.js, line 1970

Inherited from: adventurejs.Verb#initialize

Todos: How does patchVerb handle initialization?

If Verb is a direction, initialize adds it to game.dictionary.direction_lookup.
set(props) → {adventurejs.Verb}

Defined in: adventure/dictionary/Verb.js, line 2037

Inherited from: adventurejs.Verb#set

Parameters:

  • props Object
    A generic object containing properties to copy to the DisplayObject instance.
Provides a chainable shortcut method for setting a number of properties on the instance.

Returns:

adventurejs.Verb Returns the instance the method is called on (useful for chaining calls.)
setState()

Defined in: adventure/dictionary/Verb.js, line 2367

Inherited from: adventurejs.Verb#setState

Apply this verb's state or unstate to an asset.
setVerbConnection()

Defined in: adventure/dictionary/Verb.js, line 2386

Inherited from: adventurejs.Verb#setVerbConnection

Connect two assets that share a connection when acted upon by this verb. For example, in the case of 'plug computer into socket', each asset has the other asset's ID saved like this:

computer.is.connected_by.plugIn.to_iov = ['socket']
socket.is.connected_by.plugIn.to_dov = ['computer']
tryDestroyAfterUsing(object_of, asset) → {Object}

Defined in: adventure/asset/tryDestroyAfterUsing.js, line 6

Inherited from: adventurejs.Verb#tryDestroyAfterUsing

Parameters:

  • object_of String
  • asset Object
tryDestroyAfterUsing is the underlying function for tryDestroyDirectObjectAfterUsing and tryDestroyIndirectObjectAfterUsing.

Returns:

Object
tryDestroyDirectObjectAfterUsing(asset) → {Boolean|string}

Defined in: adventure/asset/tryDestroyDirectObjectAfterUsing.js, line 6

Inherited from: adventurejs.Verb#tryDestroyDirectObjectAfterUsing

Parameters:

  • asset Object
tryDestroyDirectObjectAfterUsing checks to see if the specified asset can only be used directly once with this verb by checking for asset.dov[this.name].then_destroy. This is intended to provide a hook for authors to easily destroy an object after a single use, such as a key that only works once and then breaks or disappears.

Returns:

Boolean | string
tryDestroyIndirectObjectAfterUsing(asset) → {Boolean|string}

Defined in: adventure/asset/tryDestroyIndirectObjectAfterUsing.js, line 6

Inherited from: adventurejs.Verb#tryDestroyIndirectObjectAfterUsing

Parameters:

  • asset Object
tryDestroyIndirectObjectAfterUsing checks to see if the specified asset can only be used indirectly once with this verb by checking for asset.iov[this.name].then_destroy. This is intended to provide a hook for authors to easily destroy an object after a single use, such as a key that only works once and then breaks or disappears.

Returns:

Boolean | string
tryToInferIndirectObject(direct_object, handle_input) → {Object}

Defined in: adventure/dictionary/Verb.js, line 1540

Inherited from: adventurejs.Verb#tryToInferIndirectObject

Parameters:

  • direct_object Object
  • handle_input Boolean
    If true, updates the global input object per standard specs used by most (but not all) of the verb instances that call this method.
tryToInferIndirectObject is called by some verbs when they receive a direct object with no indirect object, to test whether an indirect object can be inferred. The classic example is "unlock door" where the key must be inferred. In order to be inferred, indirect object must be in player inventory. If player hasn't already interacted with direct object and game.settings.infer_objects_after_first_use is true, tryToInferIndirectObject will fail regardless of other circumstances. The function only returns one indirect preposition: with. As in, "unlock door with key" or "feed pony with hay".

Returns:

Object
tryToPutThisInThatAspect(direct_object, preposition, indirect_object) → {Object}

Defined in: adventure/dictionary/Verb.js, line 1750

Inherited from: adventurejs.Verb#tryToPutThisInThatAspect

Parameters:

  • direct_object Object
  • preposition String
  • indirect_object Object
tryToPutThisInThatAspect checks to see if one asset can be placed within the specified aspect of another specified asset. For example, "put sword in stone" and "push stone into depression" would both be tested with this function.

Returns:

Object
unsetVerbConnection()

Defined in: adventure/dictionary/Verb.js, line 2447

Inherited from: adventurejs.Verb#unsetVerbConnection

Disconnect two assets that share a connection when acted upon by this verb. For example, in the case of 'plug computer into socket', each asset has the other asset's ID saved like this:

computer.is.connected_by.plugIn.to_iov = ['socket']
socket.is.connected_by.plugIn.to_dov = ['computer']
validate()

Properties  | 

accepts_adverbs :Array

Defined in: adventure/dictionary/Verb.js, line 428

Inherited from: adventurejs.Verb#accepts_adverbs

Default value: []

accepts_direction :String

Defined in: adventure/dictionary/Phrase.js, line 26

Inherited from: adventurejs.Verb#accepts_direction

Currently unused.
accepts_number :String

Defined in: adventure/dictionary/Phrase.js, line 40

Inherited from: adventurejs.Verb#accepts_number

Currently unused.
accepts_string :String

Defined in: adventure/dictionary/Phrase.js, line 19

Inherited from: adventurejs.Verb#accepts_string

Currently unused.
accepts_structures :Array

Defined in: adventure/dictionary/Verb.js, line 422

Inherited from: adventurejs.Verb#accepts_structures

Default value: []

adjectives :String

Defined in: adventure/dictionary/Verb.js, line 299

Overrides from: adventurejs.Verb#adjectives

Verb.adjective is for direction verbs so that, for example, 'south' can be described as 'southerly'.
article :Boolean

Defined in: adventure/dictionary/Verb.js, line 384

Inherited from: adventurejs.Verb#article

Default value: false

Set whether a direction can be referred to with an article, as in "there is a door to the north" vs "there is a door to starboard". This is a bit of mixed purpose because this property doesn't apply to the verb, but is stored in direction_lookup for reference with directions.
can_span :String

Defined in: adventure/dictionary/Verb.js, line 236

Inherited from: adventurejs.Verb#can_span

Locomotion verbs (ones that move the player) may result in player moving from object A to object B. When that occurs, output may vary depending on whether player would logically climb down off object A before climbing on object B, vs directly spanning the gap from object A to object B.
default_direction :String

Defined in: adventure/dictionary/Verb.js, line 163

Inherited from: adventurejs.Verb#default_direction

Default value: ""

Some locomotion verbs supplied without a preposition may use a default direction, for instance climb + up.
dictionary :Object

Defined in: adventure/dictionary/Verb.js, line 143

Inherited from: adventurejs.Verb#dictionary

Default value: {}

A shortcut to the main Game Dictionary.
direction_preposition :Boolean

Defined in: adventure/dictionary/Verb.js, line 396

Inherited from: adventurejs.Verb#direction_preposition

Default value: ""

When player travels, this string may be prepended before the verb name, such as "you walk to the north"
doVerb :Getter

Defined in: adventure/dictionary/Verb.js, line 564

Inherited from: adventurejs.Verb#doVerb

Returns "do[Verb]This" for consistency with callAction()
doVerbFromThis :Getter

Defined in: adventure/dictionary/Verb.js, line 580

Inherited from: adventurejs.Verb#doVerbFromThis

Returns "do[Verb]FromThis" for consistency with callAction()
doVerbThatFromThis :Getter

Defined in: adventure/dictionary/Verb.js, line 620

Inherited from: adventurejs.Verb#doVerbThatFromThis

Returns "do[Verb]ThatFromThis" for consistency with callAction()
doVerbThatWithThis :Getter

Defined in: adventure/dictionary/Verb.js, line 604

Inherited from: adventurejs.Verb#doVerbThatWithThis

Returns "do[Verb]ThatWithThis" for consistency with callAction()
doVerbThis :Getter

Defined in: adventure/dictionary/Verb.js, line 572

Inherited from: adventurejs.Verb#doVerbThis

Returns "do[Verb]This" for consistency with callAction()
doVerbThisFromThat :Getter

Defined in: adventure/dictionary/Verb.js, line 612

Inherited from: adventurejs.Verb#doVerbThisFromThat

Returns "do[Verb]ThisFromThat" for consistency with callAction()
doVerbThisWithThat :Getter

Defined in: adventure/dictionary/Verb.js, line 596

Inherited from: adventurejs.Verb#doVerbThisWithThat

Returns "do[Verb]ThisWithThat" for consistency with callAction()
doVerbWithThis :Getter

Defined in: adventure/dictionary/Verb.js, line 588

Inherited from: adventurejs.Verb#doVerbWithThis

Returns "do[Verb]WithThis" for consistency with callAction()
enqueue_collections :Array

Defined in: adventure/dictionary/Verb.js, line 483

Inherited from: adventurejs.Verb#enqueue_collections

Default value: false

enqueue_collections if true allows a verb to unbundle the members of a collection in order to queue up separate actions for each. For example, "gems" is a collection that refers to three unique assets; "diamond", "emerald" and "ruby". If take.enqueue_collections is true, "take gems" will act individually on the diamond, the emerald and the ruby. Only applies to direct object.
extends :String

Defined in: adventure/dictionary/Verb.js, line 171

Inherited from: adventurejs.Verb#extends

Default value: ""

Extension verbs may perform some contextual logic before forwarding to another verb for the bulk of logic, such as "crawl" -> "go".
game :Object

Defined in: adventure/dictionary/Verb.js, line 136

Inherited from: adventurejs.Verb#game

Default value: {}

A reference back to the main Game object.
gerund :String

Defined in: adventure/dictionary/Verb.js, line 200

Inherited from: adventurejs.Verb#gerund

The gerund of the verb. May be used in output strings.
in_can_mean_on :Boolean

Defined in: adventure/dictionary/Verb.js, line 351

Inherited from: adventurejs.Verb#in_can_mean_on

Default value: false

Some types of objects can accept 'in' for 'on' interchangeably, such as 'sit in chair' / 'sit on chair', or 'lie in bed' / 'lie on bed'.
input_substitutions :Object

Defined in: adventure/dictionary/Verb.js, line 434

Inherited from: adventurejs.Verb#input_substitutions

Default value: {}

To simplify identifying verbs in input, specifically with regards to adverbs & prepositions, we can provide a list of synonyms for the verb. The parser will look for these synonyms in the input and replace them with the verb name. Then, the verb can handle the adverb/preposition as it sees fit.
is_compass_direction :Boolean

Defined in: adventure/dictionary/Verb.js, line 367

Inherited from: adventurejs.Verb#is_compass_direction

Default value: false

Set whether direction verb is a compass direction, meaning, it can be found on a compass rose.
is_direction :Boolean

Defined in: adventure/dictionary/Verb.js, line 360

Inherited from: adventurejs.Verb#is_direction

Default value: false

Set whether verb is a direction verb.
is_relative_direction :Boolean

Defined in: adventure/dictionary/Verb.js, line 375

Inherited from: adventurejs.Verb#is_relative_direction

Default value: false

Set whether direction verb is a relative direction such as those used on ships: port, starboard, etc. Also applies to left, right, forward, back, etc.
let_verb_handle_disambiguation :Boolean

Defined in: adventure/dictionary/Verb.js, line 331

Inherited from: adventurejs.Verb#let_verb_handle_disambiguation

Default value: false

Setting this to true allows you to write your own disambiguation script. Warning: going off road! Recommended for experienced Javascript users.
let_verb_handle_remaining_input :Boolean

Defined in: adventure/dictionary/Verb.js, line 340

Inherited from: adventurejs.Verb#let_verb_handle_remaining_input

Default value: false

When input is parsed, parse the verb and then pass the remainder of the input to the verb as a string, for the verb to act on. Chief example is: "oops xxx" where we don't want to parse xxx, we just want to let oops use it as a substitute for last turn's unknown input.
name :String

Defined in: adventure/dictionary/Verb.js, line 179

Inherited from: adventurejs.Verb#name

Default value: ""

String provided in Verb definition file (aka preverb).
Name :Getter

Defined in: adventure/dictionary/Verb.js, line 499

Inherited from: adventurejs.Verb#Name

Default value: []

Return uppercase name of the verb.
override_verb_failure_msg :String

Defined in: adventure/dictionary/Verb.js, line 446

Inherited from: adventurejs.Verb#override_verb_failure_msg

Default value: undefined

Provides a simple method for an author to override all failure messages for a verb with one generic string.
override_verb_success_msg :String

Defined in: adventure/dictionary/Verb.js, line 455

Inherited from: adventurejs.Verb#override_verb_success_msg

Default value: undefined

Provides a simple method for an author to override success messages for a verb with one generic string.
past_tense :String

Defined in: adventure/dictionary/Verb.js, line 194

Inherited from: adventurejs.Verb#past_tense

The past tense of the verb. May be used in output strings.
phrase1 :Object

Defined in: adventure/dictionary/Verb.js, line 404

Inherited from: adventurejs.Verb#phrase1

Default value: {}

phrase2 :Object

Defined in: adventure/dictionary/Verb.js, line 410

Inherited from: adventurejs.Verb#phrase2

Default value: {}

phrase3 :Object

Defined in: adventure/dictionary/Verb.js, line 416

Inherited from: adventurejs.Verb#phrase3

Default value: {}

player_must_be :Object

Defined in: adventure/dictionary/Verb.js, line 315

Inherited from: adventurejs.Verb#player_must_be

Default value: {}

player_must_be sets conditions that the Player Character must meet in order for the Verb to act.
posture :String

Defined in: adventure/dictionary/Verb.js, line 206

Overrides from: adventurejs.Verb#posture

Set a preferred posture that results when this verb acts on player. asset.aspect.aspect.player.posture takes precedence unless this.override_aspect_posture = true.
prettyname :String

Defined in: adventure/dictionary/Verb.js, line 186

Inherited from: adventurejs.Verb#prettyname

String provided in verb definition file. The prettyname is used for printing, and can include spaces, ie ask prints as "ask about".
requires_number :String

Defined in: adventure/dictionary/Phrase.js, line 47

Inherited from: adventurejs.Verb#requires_number

Currently unused.
requires_string :String

Defined in: adventure/dictionary/Phrase.js, line 33

Inherited from: adventurejs.Verb#requires_string

Currently unused.
state :String

Defined in: adventure/dictionary/Verb.js, line 247

Inherited from: adventurejs.Verb#state

state is an optional property for verbs that apply state to assets, such as close and lock. For example, "close door" will set door.is.closed to true. When used, state will contain the state to be set true on an asset. In the case of close, its state would be "closed".
state_strings :String

Defined in: adventure/dictionary/Verb.js, line 267

Inherited from: adventurejs.Verb#state_strings

state_strings is an optional property for verbs that is used to provide string substitutions for authors using the string substitution form of $(sink drain is| plugged or| unplugged). Because "unplugged" isn't a proper verb state, we'll use this as a reverse lookup to test whether the asset, sink_drain in this case, is subscribed to the relevant verb and has the specified state. state_strings only apply to direct objects.
synonyms :Getter/Setter

Defined in: adventure/dictionary/Verb.js, line 628

Inherited from: adventurejs.Verb#synonyms

Default value: []

synonyms provide alternate words for verbs, such as "get" for "take".
tryVerbFromThis :Getter

Defined in: adventure/dictionary/Verb.js, line 524

Inherited from: adventurejs.Verb#tryVerbFromThis

Returns "try[Verb]FromThis" for consistency with callAction()
tryVerbThatFromThis :Getter

Defined in: adventure/dictionary/Verb.js, line 556

Inherited from: adventurejs.Verb#tryVerbThatFromThis

Returns "try[Verb]ThatFromThis" for consistency with callAction()
tryVerbThatWithThis :Getter

Defined in: adventure/dictionary/Verb.js, line 540

Inherited from: adventurejs.Verb#tryVerbThatWithThis

Returns "try[Verb]ThatWithThis" for consistency with callAction()
tryVerbThis :Getter

Defined in: adventure/dictionary/Verb.js, line 508

Inherited from: adventurejs.Verb#tryVerbThis

Returns "try[Verb]This" for consistency with callAction()
tryVerbThisFromThat :Getter

Defined in: adventure/dictionary/Verb.js, line 548

Inherited from: adventurejs.Verb#tryVerbThisFromThat

Returns "try[Verb]ThisFromThat" for consistency with callAction()
tryVerbThisWithThat :Getter

Defined in: adventure/dictionary/Verb.js, line 532

Inherited from: adventurejs.Verb#tryVerbThisWithThat

Returns "try[Verb]ThisWithThat" for consistency with callAction()
tryVerbWithThis :Getter

Defined in: adventure/dictionary/Verb.js, line 516

Inherited from: adventurejs.Verb#tryVerbWithThis

Returns "try[Verb]WithThis" for consistency with callAction()
type :String

Defined in: adventure/dictionary/Verb.js, line 151

Inherited from: adventurejs.Verb#type

Default value: ""

May be used to help narrow verb selections in ambiguous situations.
unstate :String

Defined in: adventure/dictionary/Verb.js, line 257

Inherited from: adventurejs.Verb#unstate

unstate is an optional property for verbs that unset state from assets, such as open and unlock. For example, "open door" will set door.is.closed to false. When used, unstate will contain the state to be set false on an asset. In the case of open, its unstate would be "closed".
verb_noun_prep :Array

Defined in: adventure/dictionary/Verb.js, line 694

Inherited from: adventurejs.Verb#verb_noun_prep

Default value: []

For verb/noun pairs with a trailing preposition, or more likely a direction, such as "push bed north". When player input is parsed, they'll be concatenated, eg to "pushnorth bed".
verb_noun_prep_noun :Array

Defined in: adventure/dictionary/Verb.js, line 858

Inherited from: adventurejs.Verb#verb_noun_prep_noun

Default value: []

For verb/preposition pairs separated by another word, usually a noun, such as "lock door with key" or "take sword from stone". When player input is parsed, they'll be concatenated, eg to "lockwith door key" or "takefrom sword stone".

Though verb_prep_noun and verb_noun_prep_noun look similar, the reason they are separate fields is because we have to use different regex patterns to find each type in user input.
verb_noun_prep_noun_prep_noun :Array

Defined in: adventure/dictionary/Verb.js, line 947

Inherited from: adventurejs.Verb#verb_noun_prep_noun_prep_noun

Default value: []

For a verb phrase with three nouns and two prepositions. For example, in the phrase "tie boat to pier with rope", we're looking for "tie" and "to" and "with", and we would parse the phrase as "tietowith boat pier rope"
verb_noun_prep_prep_noun :Array

Defined in: adventure/dictionary/Verb.js, line 905

Inherited from: adventurejs.Verb#verb_noun_prep_prep_noun

Default value: []

For a verb phrase with two nouns and two prepositions. For example, in the phrase "take skateboard from under bed", we're looking for "take" and "from" and "under", and we would parse the phrase as "takefromunder skateboard bed"
verb_prep_noun :Array

Defined in: adventure/dictionary/Verb.js, line 735

Inherited from: adventurejs.Verb#verb_prep_noun

Default value: []

For verb/preposition pairs separated by a space, such as "go to" or "look at". When player input is parsed, they'll be concatenated, eg "go to" to "goTo".
verb_prep_noun_prep_noun :Array

Defined in: adventure/dictionary/Verb.js, line 652

Inherited from: adventurejs.Verb#verb_prep_noun_prep_noun

Default value: []

For phrases like "jump from branch to vine" or "look at sun with glasses", where we have a verb + preposition followed by a noun and then another preposition
verb_prep_noun_prep_noun_prep_noun :Array

Defined in: adventure/dictionary/Verb.js, line 993

Inherited from: adventurejs.Verb#verb_prep_noun_prep_noun_prep_noun

Default value: []

For a verb phrase with three nouns and three prepositions. For example, in the phrase "swing from branch to tree on vine", we're looking for "swing from with on".
verb_prep_prep_noun :Array

Defined in: adventure/dictionary/Verb.js, line 776

Inherited from: adventurejs.Verb#verb_prep_prep_noun

Default value: []

For compound preps separated by spaces, verb/prep/prep, such as "get out of"
verb_prep_prep_prep_noun :Array

Defined in: adventure/dictionary/Verb.js, line 817

Inherited from: adventurejs.Verb#verb_prep_prep_prep_noun

Default value: []

For three part compound preps, verb/prep/prep/prep, such as "get out from behind"