define([ ], function( ) { return { type: 'dialogue', states: {}, sourceStates: {}, init: function(blueprint) { this.states = blueprint.config; }, talk: function(msg) { var target = msg.target; var targetName = (msg.targetName || '').toLowerCase(); if ((target == null) && (!targetName)) return false; if ((target != null) && (target.id == null)) { target = this.obj.instance.objects.objects.find(o => o.id == target); if (!target) return false; } else if (targetName != null) { target = this.obj.instance.objects.objects.find(o => ((o.name) && (o.name.toLowerCase() == targetName))); if (!target) return false; } if (!target.dialogue) return false; //Auto-discover faction if ((target.trade) && (target.trade.faction)) this.obj.reputation.discoverFaction(target.trade.faction.id); var state = target.dialogue.getState(this.obj, msg.state) if (!state) { this.obj.syncer.set(true, 'dialogue', 'state', null); return false; } this.obj.syncer.set(true, 'dialogue', 'state', state); }, stopTalk: function() { this.obj.syncer.set(true, 'dialogue', 'state', null); }, getState: function(sourceObj, state) { state = state || 1; //Goto? if ((state + '').indexOf('.') > -1) { var config = this.states[(state + '').split('.')[0]]; if (!config) return false; var goto = config.options[state].goto; if (goto instanceof Array) { var gotos = []; goto.forEach(function(g) { var rolls = (g.chance * 100) || 100; for (var i = 0; i < rolls; i++) { gotos.push(g.number); } }); state = gotos[~~(Math.random() * gotos.length)]; } else state = goto; } this.sourceStates[sourceObj.id] = state; if (!this.states) { console.log('NO DIALOGUE STATES?!?!??!'); console.log('NO DIALOGUE STATES?!?!??!'); console.log('NO DIALOGUE STATES?!?!??!'); console.log('NO DIALOGUE STATES?!?!??!'); console.log('NO DIALOGUE STATES?!?!??!'); console.log('NO DIALOGUE STATES?!?!??!'); console.log('NO DIALOGUE STATES?!?!??!'); console.log(this.obj); return null; } var stateConfig = this.states[state]; if (!stateConfig) return null; if (stateConfig.cpn) { var cpn = sourceObj[stateConfig.cpn]; cpn[stateConfig.method].apply(cpn, stateConfig.args); return; } var result = { id: this.obj.id, msg: null, from: this.obj.name, options: [] }; if (stateConfig.msg instanceof Array) { var msgs = []; stateConfig.msg.forEach(function(m, i) { var rolls = (m.chance * 100) || 100; for (var j = 0; j < rolls; j++) { msgs.push({ msg: m, index: i }); } }); var pick = msgs[~~(Math.random() * msgs.length)]; result.msg = pick.msg.msg; result.options = stateConfig.msg[pick.index].options; } else { result.msg = stateConfig.msg; result.options = stateConfig.options; } if (!(result.options instanceof Array)) { if (result.options[0] == '$') result.options = this.states[result.options.replace('$', '')].options; result.options = Object.keys(result.options); } result.options = result.options.map(function(o) { var gotoState = this.states[(o + '').split('.')[0]]; if (!gotoState.options[o]) return null; return { id: o, msg: gotoState.options[o].msg }; }, this); result.options.push({ msg: 'Goodbye', id: 999 }); return result; }, simplify: function(self) { return { type: 'dialogue' }; } }; });