// selectPresentIfTangible.js
(function () {
/*global adventurejs A*/
"use strict";
var p = adventurejs.Parser.prototype;
/**
* Exclude from a list of assets all tangible assets that are not present in current room.
* @method adventurejs.Parser#selectPresentIfTangible
* @memberOf adventurejs.Parser
* @param {Array} list
* @returns {Array}
*/
p.selectPresentIfTangible = function Parser_selectPresentIfTangible(list) {
if ("string" === typeof list) list = [list];
if (!Array.isArray(list)) {
this.game.log(
"warn",
"critical",
"selectPresentIfTangible.js > received non-array",
"Parser"
);
return [];
}
var currentRoom = this.game.getCurrentRoom();
var foundObjects = [];
var roomObjects = [];
for (var i = 0; i < list.length; i++) {
var object;
// check if input was already parsed by an earlier step
// as asset:aspect:substance in which case verify the tangible
//var asset_aspect_substance = list[i].split(":");
// if( 3 === asset_aspect_substance.length )
// {
// object = this.game.getAsset( asset_aspect_substance[2] );
// }
// else {
object = this.game.getAsset(list[i]);
// }
/**
* check if input is unparsed substance
* I've commented and uncommented this a couple of times.
* Latest uncomment on 2023.04.08
* Needed in order to handle "water" as a substance
* specifically in the case of "pour water" while player
* is holding a bowl full of water.
*/
if (object instanceof adventurejs.Substance) {
// this version automatically returns substances as present
foundObjects.push(list[i]);
continue;
}
// abstractions are always present
if (object.is.abstract) {
foundObjects.push(list[i]);
continue;
}
// walls, floor, ceiling, scenery
// all prefixed with "global_"
if (object.is.global) {
//console.warn('global object',object);
if (object instanceof adventurejs.GlobalString) {
foundObjects.push(list[i]);
continue;
}
if (object instanceof adventurejs.Floor) {
if (this.game.getCurrentRoom().findClassInThis("Floor").length)
continue;
}
// room says yes
if (
"undefined" !== typeof currentRoom.room_scenery[object.id] &&
true === currentRoom.room_scenery[object.id].enabled
) {
foundObjects.push(list[i]);
//console.warn( "selectPresent > true === currentRoom.room_scenery[ object.id ].enabled" );
continue;
}
// room says no
if (
"undefined" !== typeof currentRoom.room_scenery[object.id] &&
false === currentRoom.room_scenery[object.id].enabled
) {
//console.warn( "selectPresent > false === currentRoom.room_scenery[ object.id ].enabled" );
continue;
}
// room says neither true nor false
// if room has no true / false setting, check for zone
// zone says yes
if (
"undefined" !== typeof this.game.world[currentRoom.zone] &&
"undefined" !==
typeof this.game.world[currentRoom.zone].zone_scenery[object.id] &&
true ===
this.game.world[currentRoom.zone].zone_scenery[object.id].enabled
) {
foundObjects.push(list[i]);
//console.warn( "selectPresent > true === this.game.world[ currentRoom.zone ].zone_scenery[ object.id ].enabled" );
continue;
}
// zone says no
if (
"undefined" !== typeof this.game.world[currentRoom.zone] &&
"undefined" !==
typeof this.game.world[currentRoom.zone].zone_scenery[object.id] &&
false ===
this.game.world[currentRoom.zone].zone_scenery[object.id].enabled
) {
//console.warn( "selectPresent > false === currentRoom.zone.zone_scenery[ object.id ].enabled" );
continue;
}
// zone says neither true nor false
if (object.enabled) {
//console.warn( "selectPresent > true === object.enabled" );
foundObjects.push(list[i]);
}
continue;
}
// exclude global exit if there is a local exit with its direction
if (
object instanceof adventurejs.Exit &&
object.is.global &&
"undefined" !== typeof currentRoom.exits[object.direction]
) {
continue;
}
// include global exit if there is no local exit with its direction
if (
object instanceof adventurejs.Exit &&
object.is.global &&
"undefined" === typeof currentRoom.exits[object.direction]
) {
foundObjects.push(list[i]);
continue;
}
// never return exits from other rooms
// TODO will this be a problem with "ask about" ?
if (
object instanceof adventurejs.Exit &&
!object.is.global &&
object.getPlaceAssetId() !== this.game.world._currentRoom
) {
continue;
}
if (object.id === this.game.world._currentRoom) {
foundObjects.push(list[i]);
continue;
}
if (object.isIn && object.isIn(this.game.getCurrentRoom())) {
foundObjects.push(list[i]);
continue;
}
// for substances
// examine every item in the room for substance container
//if( object.contains_substance)
// if there's a global object, list that
// if( -1 < object.id.indexOf( "global_" ) ) {
// //console.log( "selectPresent found " + object.name );
// foundObjects.push( list[i] );
// continue;
// }
}
//console.log( "selectPresent returned " + foundObjects );
return foundObjects;
};
})();