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

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

  /**
   * @augments {adventurejs.Verb}
   * @class turn
   * @ajsnode game.dictionary.verbs.turn
   * @ajsconstruct MyGame.createVerb({ "name": "turn", [...] });
   * @ajsconstructedby adventurejs.Dictionary#createVerb
   * @hideconstructor
   * @ajsinstanceof Verb
   * @ajsnavheading ManipulationVerbs
   * @summary Verb meaning turn, as in "turn faucet handle".
   * @tutorial Verbs_Subscriptions
   * @tutorial AdvancedVerbs_VerbAnatomy
   * @tutorial AdvancedVerbs_VerbProcess
   * @tutorial AdvancedVerbs_ModifyVerbs
   * @tutorial AdvancedVerbs_ModifyVerbs
   * @classdesc
   * <pre class="display border outline">
   * <span class="ajs-player-input">&gt; turn sparrow</span>
   * You turn the carven sparrow that caps the newel post of the teak balustrade. The little statue rotates smoothly and clicks neatly into position at 45 degrees from its original position. A bass rumble emanates from somewhere deep in the house.
   * </pre>
   * <p>
   * <strong>Turn</strong> requires that the
   * {@link adventurejs.Tangible|Tangible}
   * {@link adventurejs.Asset|Asset} to be turned has
   * asset.dov.turn.enabled set to true.
   * Authors wanting to make use of turn may wish to use verb hooks. See
   * <a href="/doc/Verbs_PhaseHooks.html">Verb Phases</a>
   * to learn more.
   * </p>
   * @ajsverbreactions
   * @ajsverbphases doBeforeTry, doAfterTry, doBeforeSuccess, doAfterSuccess
   */
  A.Preverbs.turn = {
    name: "turn",
    prettyname: "turn",
    past_tense: "turned",
    synonyms: ["turn"],
    gerund: "turning",

    /**
     * @ajsadverbs
     * @memberof turn
     */
    accepts_adverbs: ["left", "right", "around", "back", "towards"],

    /**
     * @ajsverbstructures
     * @memberof turn
     */
    accepts_structures: [
      "verb", // turn around // adverbs aren't reflected in sentence structure
      "verb noun", // turn statue
      // "verb preposition noun", // turn on faucet
      // "verb noun preposition", // turn faucet on
      "verb noun preposition noun", // turn faucet with wrench, turn statue to east
      "verb preposition noun preposition noun", // turn on faucet with wrench
    ],

    /**
     * @memberof turn
     * @ajsverbphrase
     * phrase1:
     * {
     *   accepts_noun: true,
     *   requires_noun: true,
     *   noun_must_be:
     *   {
     *     known: true,
     *     tangible: true,
     *     present: true,
     *     visible: true,
     *     reachable: true,
     *   },
     * },
     */
    phrase1: {
      accepts_noun: true,
      requires_noun: true,
      noun_must_be: {
        known: true,
        tangible: true,
        present: true,
        visible: true,
        reachable: true,
      },
    },

    /**
     * @memberof turn
     * @ajsverbphrase
     * phrase2:
     * {
     *   accepts_noun: true,
     *   requires_noun: true,
     *   noun_must_be:
     *   {
     *     known: true,
     *     tangible: true,
     *     present: true,
     *     visible: true,
     *     reachable: true,
     *   },
     * },
     */
    phrase2: {
      accepts_noun: true,
      requires_noun: true,
      noun_must_be: {
        known: true,
        tangible: true,
        present: true,
        visible: true,
        reachable: true,
      },
      accepts_preposition: true,
      requires_preposition: true,
    },

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

    doTry: function () {
      var input = this.game.getInput();
      var subject = input.getSubject();
      var direct_object = input.getAsset(1);
      var indirect_object = input.getAsset(2);
      var direct_preposition = input.getPreposition(1);
      var indirect_preposition = input.getPreposition(2);
      var indirect_inferred;
      var adverb = input.getAdverb();
      var msg = "";
      var results;

      // sentence structure: verb
      if (input.hasStructure("verb")) {
        if (adverb) {
        }
        return true;
      }

      if (!direct_object.isDOV(this.name)) {
        this.game.debug(
          `D1455 | ${this.name}.js | ${direct_object.id}.dov.${this.name}.enabled is unset `
        );
        msg += `${direct_object.Articlename} can't be ${this.past_tense}${
          direct_preposition ? " " + direct_preposition : ""
        }. `;
        this.handleFailure(msg);
        return null;
      }

      // single use direct object?
      if (
        direct_object.allowVerbOnce(this.name, "dov") &&
        direct_object.didVerb(this.name, "dov")
      ) {
        this.game.debug(
          `D1933 | ${this.name}.js | ${direct_object.id}.dov.${this.name}.once and ${direct_object.id}.did.${this.name}.directly `
        );
        msg += `${direct_object.Articlename} has already been ${this.past_tense}. `;
        this.handleFailure(msg);
        return false;
      }

      if (input.hasStructure("verb noun")) {
        // indirect objects available?
        if (
          !direct_object.hasIndirectObjects(this.name) &&
          !direct_object.allowVerbWithNothing(this.name, "dov")
        ) {
          this.game.debug(
            `D1934 | ${this.name}.js | ${direct_object.id}.dov.${this.name}.with_nothing is false `
          );
          msg += `{We} {don't} know of a way to ${this.name} ${direct_object.articlename}. `;
          this.handleFailure(msg);
          return null;
        }

        // infer indirect object?
        results = this.tryToInferIndirectObject({
          direct_object: direct_object,
          context: subject,
          handle_input: true,
        });
        if (results.prompt) {
          // indirect object required?
          if (direct_object.allowVerbWithNothing(this.name, "dov")) {
            return true;
          }

          this.game.debug(`D1935 | ${this.name}.js | soft prompt for noun2 `);
          msg += `What would {we} like to ${this.name} ${direct_object.articlename} with? `;
          this.handleFailure(msg);
          return false;
        } else if (results.success) {
          indirect_object = results.indirect_object;
          indirect_preposition = "with";
          indirect_inferred = true;
          input.setAsset(2, indirect_object);
          input.setPreposition(2, indirect_preposition);
          input.setStructure("verb noun preposition noun");
          this.game.printInferred(
            `${indirect_preposition} ${indirect_object.articlename}`
          );
        }
      } // verb noun

      // sentence structure: verb noun preposition noun
      // ex: turn statue toward window, turn statue with lever
      if (input.hasStructure("verb noun preposition noun")) {
        if (!["to", "from", "with"].includes(indirect_preposition)) {
          this.game.debug(
            `D1072 | ${this.name}.js | ${this.name} ${direct_object} ${indirect_preposition} ${indirect_object.id} not handled `
          );
          msg += `{We} {don't} know how to ${this.name} ${direct_object} ${indirect_preposition} ${indirect_object.articlename}. `;
          this.handleFailure(msg);
          return null;
        }
      } // verb noun preposition noun

      // sentence structure: verb noun preposition noun
      // ex: turn nut with wrench
      if (
        input.hasStructure("verb noun preposition noun") ||
        (input.hasStructure("verb preposition noun preposition noun") &&
          "with" === indirect_preposition)
      ) {
        // works with any indirect object?
        if (direct_object.allowVerbWithAnything(this.name, "dov")) {
          return true;
        }

        // indirect object not required?
        // if (direct_object.allowVerbWithNothing(this.name, "dov")) {
        //   this.game.debug(
        //     ` | ${this.name}.js | ${direct_object.id}.dov.${this.name}.with_nothing `
        //   );
        //   msg += `{We} can't ${this.name} ${direct_object.articlename} ${indirect_preposition} ${indirect_object.articlename}. `;
        //   this.handleFailure(msg);
        //   return null;
        // }

        // indirect object usable with direct object?
        if (
          !direct_object.allowVerbWithAsset({
            verb: this.name,
            asset: indirect_object,
            ov: "dov",
          })
        ) {
          this.game.debug(
            `D1603 | ${this.name}.js | ${direct_object.id}.dov.${this.name}.with_assets/with_classes does not include ${indirect_object.id} `
          );
          msg += `{We} can't ${this.name} ${direct_object.articlename} ${indirect_preposition} ${indirect_object.articlename}. `;
          this.handleFailure(msg);
          return null;
        }

        // can indirect object be used?
        if (!indirect_object.isIOV(this.name)) {
          this.game.debug(
            `D1499 | ${this.name}.js | ${indirect_object.id}.iov.${this.name} is unset `
          );
          msg += `${indirect_object.Articlename} can't be used to ${this.name} anything. `;
          this.handleFailure(msg);
          return null;
        }

        // single use indirect object?
        if (
          indirect_object.allowVerbOnce(this.name, "iov") &&
          indirect_object.iDidVerb(this.name, "iov")
        ) {
          this.game.debug(
            `D1932 | ${this.name}.js | ${indirect_object.id}.iov.${
              this.name
            }.once and ${indirect_object.id}.did.${this.name}.indirectly is ${
              indirect_object.did[this.name].indirectly
            } `
          );
          msg += `${indirect_object.Articlename} has already been used to ${this.name} something. `;
          this.handleFailure(msg);
          return null;
        }
      }

      return true;
    },

    doSuccess: function () {
      var input = this.game.getInput();
      var subject = input.getSubject();
      var direct_object = input.getAsset(1);
      var direct_preposition = input.getPreposition(1);
      var indirect_object = input.getAsset(2);
      var indirect_preposition = input.getPreposition(2);
      var adverb = input.getAdverb();
      var results;
      var msg = "";

      // compose output
      msg +=
        `{We} ${this.agree()}` +
        `${adverb ? " " + adverb : ""}` +
        `${direct_preposition ? " " + direct_preposition : ""}` +
        `${direct_object ? " " + direct_object.articlename : ""}` +
        `${indirect_preposition ? " " + indirect_preposition : ""}` +
        `${indirect_object ? " " + indirect_object.articlename : ""}` +
        `. `;

      // --------------------------------------------------
      // print output
      // --------------------------------------------------
      return this.handleSuccess(msg);
    },
  };
})(); // turn