Pre-release
AdventureJS Docs Downloads
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()); // array of strings
    var assets = {};
    var contents = [];
    var tied = [];
    var output = "";
    let fungibles = {};
    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) => {
      const asset = item[1];
      if (asset.is.fungible) {
        fungibles[asset.class] = fungibles[asset.class] || [];
        fungibles[asset.class].push(asset);
      }
    });
    console.warn({ fungibles });

    // if there are multiples of any type of fungibles,
    // remove them from the assets list and write a
    // collective name to names
    Object.entries(fungibles).forEach((collection) => {
      if (Object.entries(collection[1]).length > 1) {
        let name = "";
        Object.entries(collection[1]).forEach((item) => {
          const asset = item[1];
          name = asset.plural;
          if (asset.print_bold) name = `<strong>${name}</strong>`;
          if (asset.print_italic) name = `<em>${name}</em>`;
          if (asset.print_style) {
            name = `<span class="${asset.print_style}">${name}</span>`;
          }
          delete assets[item[1].id];
        });
        let article = "a";
        switch (Object.entries(collection[1]).length) {
          case 2:
            article = "a couple of";
            break;
          case 3:
            article = "several";
            break;
          default:
            article = "some";
            break;
        }
        names.push(`${article} ${name}`);
      }
    });

    Object.entries(assets).forEach((item) => {
      const asset = item[1];

      let article = `${asset.indefinite_article} `;
      let name = A.FX.getSAF.call(this, asset.name);

      if (asset.print_bold) name = `<strong>${name}</strong>`;
      if (asset.print_italic) name = `<em>${name}</em>`;
      if (asset.print_style) {
        name = `<span class="${asset.print_style}">${name}</span>`;
      }

      name = `${article} ${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;
  };
})();