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

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

  var p = AdventureJS.Game.prototype;

  /**
   *
   * @method AdventureJS.Game#getPrintableRoomContents
   * @memberOf AdventureJS.Game
   * @param {Object} room A room to be printed. Defaults to current room.
   */
  p.getPrintableRoomContents = function Game_getRoomContents(
    room = this.world[this.world._room]
  ) {
    this.game.log(
      "L1050",
      "log",
      1,
      `[getPrintableRoomContents.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 names = [];
    var npcs = [];

    // 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]);
      // console.log(`- ${asset.name}`);

      if (!asset) {
        this.game.log(
          "L1053",
          "warn",
          "critical",
          `[getPrintableRoomContents.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

    // console.warn(`contents --------------------------------------------------`);
    // contents.forEach((item) => {
    //   console.warn(item.name);
    // });

    // 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 ";
    }

    console.warn(`---------- Object.entries(assets).forEach((item) ----------`);
    Object.entries(assets).forEach((item) => {
      let name,
        article = "";
      const asset = item[1];
      name = asset.indefinite_name;
      console.log(`- ${asset.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 += ", ";
      }
    }

    // console.warn(`getPrintableRoomContents:\n`, contents);

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

    return output;
  };
})();