Pre-release
AdventureJS Docs Downloads Bundler Devlog
Score: 0 Moves: 0
// getRoomContents.js

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

  var p = AdventureJS.Game.prototype;

  /**
   *
   * @method AdventureJS.Game#getRoomContents
   * @memberOf AdventureJS.Game
   * @param {Object} room A room to be printed. Defaults to current room.
   */
  p.getRoomContents = function Game_getRoomContents(
    room = this.world[this.world._room]
  ) {
    this.game.log(
      "L1050",
      "log",
      1,
      `[getRoomContents.js] print ${this.world._room} contents`,
      "Game"
    );

    var roomContentsByID = A.FX.clone.call(
      this.game,
      room.getAllContents(true)
    ); // array of strings
    var assets = {};
    var contents = [];
    var tied = [];
    var output = "";
    let stacks = {};
    let names = [];

    // exclude player from list
    roomContentsByID.splice(roomContentsByID.indexOf(this.world._player), 1);

    // exclude exits from list ?

    // @TODO consider lighting / visibility

    for (let i = roomContentsByID.length - 1; i > -1; i--) {
      const asset = this.game.getAsset(roomContentsByID[i]);

      if (!asset) {
        this.game.log(
          "L1053",
          "warn",
          "critical",
          `[getRoomContents.js] found an undefined asset in room ${room.name}`,
          "Game"
        );
        continue;
      }

      if (asset.is.hidden) {
        continue;
      }

      if (asset.is.listed) {
        assets[asset.id] = asset;
      }

      if (asset.hasListableContents()) {
        contents.push(asset);
        let nested_contents = asset.getListableContents();
        contents = contents.concat(nested_contents);
      }
    } // for

    // if the list is empty return
    if (!Object.entries(assets).length && !contents.length) {
      return false;
    }

    if (0 < Object.entries(assets).length) {
      output += "{We} can see ";
    }

    Object.entries(assets).forEach((item) => {
      let name,
        article = "";
      const asset = item[1];
      name = asset.indefinite_name;

      if (asset.getVerbConnectionCount("tie", "to_iov")) {
        tied.push(asset);
        name +=
          " (tied to " +
          this.game.getPrintableObjectList({
            objects: asset.is.connected_by.tie.to_iov,
          }) +
          ")";
      }

      names.push(name);
    });

    for (var i = 0; i < names.length; i++) {
      const name = names[i];

      if (names.length > 1 && i === names.length - 1) {
        output += " and ";
      }

      output += name;

      if (i === names.length - 1) {
        output += " here. ";
      } else {
        output += ", ";
      }
    }

    if (contents.length > 0) {
      for (var i = 0; i < contents.length; i++) {
        output += contents[i].getPrintableListOfContents({
          caller: "room",
        });
      }
    }

    return output;
  };
})();