Pre-release
AdventureJS Docs Downloads
Score: 0 Moves: 0
//dispenseAsset.js
(function () {
  /* global adventurejs A */

  var p = adventurejs.Game.prototype;

  /**
   * <pre class="display"><code class="language-javascript">MyGame.dispenseAsset({ "class":"foo", "name":"bar", [...] })</code></pre>
   * <p>
   * <strong>dispenseAsset()</strong> is a constructor function
   * that can be used to dynamically create new
   * {@link adventurejs.Asset|Assets} at runtime,
   * which is to say, after the game has been initialized.
   * This method encapsulates
   * <a href="/doc/adventurejs.Game.html#createAsset">game.createAsset()</a>,
   * <a href="/doc/adventurejs.Asset.html#validate">asset.validate()</a>
   * and
   * <a href="/doc/adventurejs.Asset.html#initialize">asset.initialize()</a>.
   * The end result is equivalent to using createAsset()
   * in your game file.
   * </p>
   * @memberOf adventurejs.Game
   * @method adventurejs.Game#dispenseAsset
   * @kind function
   * @param {String} Class An asset class name.
   * @param {String} aspect The aspect to move the new asset to.
   * @returns {Object} target The asset to move the new asset to.
   */
  p.dispenseAsset = p.dispense = function Game_dispenseAsset(
    dispenser,
    aspect,
    Class
  ) {
    const clas = Class.toLowerCase();
    if (!A[Class]) return null;
    const proto = {
      class: Class,
      name: clas,
      id: clas + A.UID.get(),
      is: { dispensed: true, fungible: true },
    };

    const asset = this.game.addAsset(proto);
    if (!asset) return null;

    asset.is.dispensed = true;
    this.game.dispensed_assets[asset.id] = asset;

    if (aspect && dispenser) {
      // let results = asset.moveTo(aspect, dispenser);
      // if ("undefined" !== typeof results) return results;
      asset.moveTo(aspect, dispenser);
      asset.dispensedto = Object.assign(asset.place);
    }

    return asset;
  };
})();