UNPKG

reldens

Version:
108 lines (100 loc) 3.87 kB
/** * * Reldens - WorldDropHandler * * Handles the creation of dropped item objects in the game world, finding walkable positions and spawning drop * instances. * */ const { Reward } = require('./reward'); const { WorldWalkableNodesAroundProvider } = require('../../world/server/world-walkable-nodes-around-provider'); const { Logger, sc } = require('@reldens/utils'); class WorldDropHandler { /** * @param {Object} targetObjectBody * @param {Array<Object>} itemRewards * @param {Object} roomScene * @returns {Promise<Array<Object>>} */ static async createRewardItemObjectsOnRoom(targetObjectBody, itemRewards, roomScene) { let closerWalkableNodes = WorldWalkableNodesAroundProvider.generateWalkableNodesAround(targetObjectBody); let objectPosition = {x: 0, y: 0}; let rewards = []; for(let itemReward of itemRewards){ await this.createDropItems( itemReward, closerWalkableNodes, objectPosition, targetObjectBody, roomScene, rewards ); } return rewards; } /** * @param {Object} itemReward * @param {Array<Object>} closerWalkableNodes * @param {Object} objectPosition * @param {Object} targetObjectBody * @param {Object} roomScene * @param {Array<Object>} rewards * @returns {Promise<Array<Object>>} */ static async createDropItems(itemReward, closerWalkableNodes, objectPosition, targetObjectBody, roomScene, rewards) { let itemKey = itemReward.item?.key || 'no-key'; Logger.debug('Create drop item ID "'+itemReward.id+'" ('+ itemKey+'): '+itemReward.dropQuantity); //Logger.debug('Item reward:', itemReward); for(let i = 0; i < (itemReward.dropQuantity || 1); i++){ if(0 < closerWalkableNodes.length){ objectPosition = closerWalkableNodes.pop(); } if(!objectPosition){ Logger.error('No closer walkable nodes found for reward ID "'+itemReward.id+'".'); return rewards; } rewards.push(await this.createDropItem( objectPosition, itemReward, targetObjectBody, roomScene, 'drop-' + itemKey + '-' + sc.randomChars(8) )); } return rewards; } /** * @param {Object} objectPosition * @param {Object} itemReward * @param {Object} targetObjectBody * @param {Object} roomScene * @param {string} randomObjectId * @returns {Promise<Object|boolean>} */ static async createDropItem(objectPosition, itemReward, targetObjectBody, roomScene, randomObjectId) { let tileIndex = targetObjectBody.world.tileIndexByRowAndColumn(objectPosition.x, objectPosition.y); let newReward = sc.deepMergeProperties({objectPosition, tileIndex, randomObjectId}, itemReward); let worldObjectData = { layerName: newReward.randomObjectId, tileIndex: newReward.tileIndex, tileWidth: targetObjectBody.worldTileWidth, tileHeight: targetObjectBody.worldTileHeight, x: newReward.objectPosition.x, y: newReward.objectPosition.y }; let dropObjectInstance = await roomScene.createDropObjectInRoom( Reward.createDropObjectData(newReward, roomScene.roomId), worldObjectData ); if(!dropObjectInstance){ return false; } newReward['dropObjectInstance'] = dropObjectInstance; return newReward; } } module.exports.WorldDropHandler = WorldDropHandler;