Pre-release
AdventureJS Docs Downloads
Score: 0 Moves: 0
// teleport.js

(function () {
  /*global adventurejs A*/

  /**
   * @augments {adventurejs.Verb}
   * @class teleport
   * @ajsnode game.dictionary.verbs.teleport
   * @ajsconstruct MyGame.createVerb({ "name": "teleport", [...] });
   * @ajsconstructedby adventurejs.Dictionary#createVerb
   * @hideconstructor
   * @ajsinstanceof Verb
   * @ajsnavheading UtilityVerbs
   * @summary Verb meaning teleport, as in "teleport to moonbase".
   * @tutorial Scripting_VerbSubscriptions
   * @tutorial Verbs_VerbAnatomy
   * @tutorial Verbs_VerbProcess
   * @tutorial Verbs_ModifyVerbs
   * @tutorial Verbs_WriteVerbs
   * @classdesc
   * <pre class="display border outline">
   * <span class="input">&gt; teleport to planet</span>
   * You beam down to the planet. Or, at least, someone identical to
   * you does. But is it really <b>you</b> that arrives at the other end of
   * the teleportation beam?
   * </pre>
   * <p>
   * <strong>Teleport to</strong> another
   * {@link adventurejs.Tangible|Tangible}.
   * This is included chiefly as a debug tool, though it
   * could also be tweaked into a useful game verb, for
   * instance with use of a teleportation device.
   * Authors may want to disable it through the use of
   * {@link adventurejs.Game#disableVerbs|disableVerbs}.
   * To learn more, see
   * <a href="/doc/Verbs_ModifyVerbs.html">Modify Verbs</a>
   * </p>
   */
  A.Preverbs.teleport = {
    name: "teleport",
    prettyname: "teleport",
    synonyms: ["teleport"],
    gerund: "teleporting",

    /**
     * @ajsverbstructures
     * @memberof teleport
     */
    accepts_structures: ["verb preposition noun"],

    /**
     * @memberof teleport
     * @ajsverbphrase
     * phrase1:
     * {
     *   accepts_noun:true,
     *   requires_noun:true,
     *   noun_must_be:
     *   {
     *     tangible: true,
     *     present: false,
     *     // known: true, // false for debug, would be true if used as player verb
     *   },
     *   accepts_preposition: true,
     *   requires_preposition: true,
     *   accepts_these_prepositions: ["to"],
     * },
     */
    phrase1: {
      accepts_noun: true,
      requires_noun: true,
      noun_must_be: {
        tangible: true,
        present: false,
        // known: true,
      },
      accepts_preposition: true,
      requires_preposition: true,
      accepts_these_prepositions: ["to"],
    },

    /**
     * @memberof teleport
     * @ajsverbparams
     * with_params: {},
     */
    with_params: {},

    doTry: function () {
      var input = this.game.getInput();
      var verb_phrase = input.verb_phrase;
      var direct_object = input.getAsset(1);
      var player = this.game.getPlayer();
      var nest_preposition = player.getNestPreposition();
      var nest_asset = player.getNestAsset();
      var currentRoom = this.game.getCurrentRoom();
      var msg = "";

      if (
        direct_object instanceof adventurejs.Room &&
        direct_object.id == currentRoom.id
      ) {
        this.game.debug(
          `D1437 | teleport.js | player is in " + ${currentRoom.id} + " `
        );
        msg += `$(We're) already there. `;
        this.handleFailure(msg);
        return null;
      }

      if (nest_asset && nest_asset.id === direct_object.id) {
        this.game.debug(
          `D1438 | teleport.js | player is nested in ${nest_asset.id}`
        );
        msg += `$(We're) already ${nest_preposition} ${direct_object.articlename}. `;
        this.handleFailure(msg);
        return null;
      }

      if (direct_object.getRoomId() === currentRoom.id) {
        this.game.debug(`D1439 | teleport.js | player is in ${currentRoom.id}`);
        msg = `$(We're) already there. `;
        this.handleFailure(msg);
        return null;
      }

      return true;
    },

    doSuccess: function () {
      var input = this.game.getInput();
      var verb_phrase = input.verb_phrase;
      var direct_object = input.getAsset(1);
      var player = this.game.getPlayer();
      var nest_asset = player.getNestAsset();
      var newRoom;
      var results;
      var msg = "";

      // is direct_object a room?
      if (direct_object instanceof adventurejs.Room) {
        newRoom = direct_object;
      } else {
        newRoom = this.game.getAsset(direct_object.getRoomId());
      }

      // if player is nested, unnest from old nest
      // unless it's a simple vehicle
      if (nest_asset && !nest_asset.isWithin(player)) {
        results = player.onUnnestThisFromThat(nest_asset);
        if ("undefined" !== typeof results) return results;
      }
      this.game.setPlayerRoom(newRoom, input);
      msg += `$(We) teleport to ${direct_object.definite_name}. `;

      // print output
      return this.handleSuccess(msg, direct_object);
    },
  };
})(); // teleport