/** * @module Ripple */ const path = require('path'); const Sampling = require('discrete-sampling'); const Map = require('../util/Map'); const uuid = require('../util/uuid'); const Entity = require('../entity/Entity'); /* ############### Algorithm parameters ############### */ /** * The radius withing which to find people * @constant */ const gossipRadius = 256; // pixels /** * Number of targets to gossip to * @constant */ const numTargets = 1; /** * Number of nearest neighbors * @constant */ const kNN = 3; /** * * @constructor Ripple */ function Ripple() { // console.log(path.join(__dirname, 'worker.js')); // this.worker = new Worker(path.join(__dirname, 'worker.js')); // this.worker.onmessage = this.triggerConversation; // this.timer = null; // const self = this; // (function updateWorker() { // self.worker.postMessage({ // tree: Map.toJSON(), // }); // self.timer = setTimeout(updateWorker, 1500); // })(); }; Ripple.prototype.triggerGossip = function(source) { let nearest = Map.nearest(source, kNN + 1, gossipRadius); let gossipMongers = nearest // .filter((p) => p[1] === 0) .map((e) => { return e[0]; }); let n = Math.min(numTargets, gossipMongers.length); gossipMongers = Sampling.sample_from_array(gossipMongers, n, false); let info = source.information[game.rnd.integerInRange(0, source.information.length - 1)]; // if (info) { // console.log('pako'); // } for (let i = 0; i < gossipMongers.length && info; i++) { Map.getByID(gossipMongers[i].id).learnInfo(info); } }; /** * * * @param {any} e * @deprecated */ Ripple.prototype.triggerConversation = function(e) { let source = Map.getByID(e.data.source); let targets = e.data.targets; let info = source.information[game.rnd.integerInRange(0, source.information.length - 1)]; for (let i = 0; i < targets.length && info; i++) { Map.getByID(targets[i][0].id).learnInfo(info); /** * @todo(anand): Trigger convo box; */ } }; /** * Get the average reputation of the k nearest entities. * * @param {Entity} point * @param {number} k */ Ripple.prototype.getNearbyRep = function(point, k) { }; /** * * @param {any} witness - The `Entity` that witnessed the action * @param {any} target - The `Entity` that was the receiver of the action * @param {any} perp - The perpetrator of the action * @param {any} action - the actual action * @return {Object} * * Possible values of `action` are: * - `killed` */ Ripple.prototype.createRumor = function( witness, target, perp, action) { if (!(perp instanceof Entity) || !(target instanceof Entity) || !(perp instanceof Entity)) { throw new TypeError('This function requires an Entity'); } let p; if (perp.type === 'player') { p = 'player'; } else { p = perp.id; } let rumor = { id: uuid(), targetType: target.type, perp: p, action: action, }; witness.learnInfo(rumor); return rumor; }; Ripple.prototype.kill = function() { clearInterval(this.timer); } module.exports = Ripple;