// 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;
};
})();