//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.Assets.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.Assets.Asset.html#validate">asset.validate()</a>
* and
* <a href="/doc/AdventureJS.Assets.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(
Class,
aspect,
dispenser
) {
this.game.log(
"L1686",
"log",
"high",
`[dispenseAsset.js] dispenseAsset() receive: ${Class} ${aspect} ${dispenser.id}`,
"Parser"
);
const clas = Class.toLowerCase();
let c = A[Class] || A.Assets[Class];
if (!c) return null;
const proto = {
class: Class,
name: clas,
id: clas + A.FX.UID.get(),
is: { dispensed: true, fungible: true },
};
const asset = this.game.addAsset(proto);
if (!asset) return null;
asset.is.dispensed = true;
if (!this.world._fungibles.includes(asset.id)) {
this.world._fungibles.push(asset.id);
}
if (aspect && dispenser) {
// let results = asset.moveTo(aspect, dispenser);
// if ("undefined" !== typeof results) return results;
asset.moveTo(aspect, dispenser);
asset.dispensed_by = Object.assign(asset.place);
}
return asset;
};
})();