Files
archived-andors-trail/AndorsTrailEdit/js/controllers/dialoguetree.js

62 lines
1.9 KiB
JavaScript

var ATEditor = (function(ATEditor, model, _) {
function DialogueShowTreeController($scope, $routeParams) {
$scope.datasource = model.dialogue;
$scope.rootPhrase = $scope.datasource.findById($routeParams.id);
$scope.onclick = function(node) {
ATEditor.navigationFunctions.editObjId(model.dialogue, node.id);
};
function buildSingleTreeNode(type, id, text, children) {
return {
id: id || ""
,text: text || ""
,type: type
,children: children || []
};
}
function singleChild(n) { return n ? [n] : []; }
function buildPhraseTree(phrase, visitedPhrases) {
if (!phrase) { return; }
if (visitedPhrases[phrase.id]) {
return buildSingleTreeNode("loop", phrase.id, phrase.message);
}
visitedPhrases[phrase.id] = true;
var children;
if (phrase.hasOnlyNextReply) {
var nextNode = model.dialogue.findById(phrase.nextPhraseID);
children = singleChild(buildPhraseTree(nextNode, visitedPhrases));
} else {
children = _.map(phrase.replies, function(reply) {
var replyChild;
if (reply.nextPhraseID.length == 1) {
replyChild = buildSingleTreeNode("action");
} else {
var nextNode = model.dialogue.findById(reply.nextPhraseID);
replyChild = buildPhraseTree(nextNode, visitedPhrases);
}
if (!reply.text) {
return replyChild || buildSingleTreeNode("reply", phrase.id, "(no text)");
}
return buildSingleTreeNode("reply", phrase.id, reply.text, singleChild(replyChild));
});
}
var phraseText = phrase.message || "(conditional evaluation)";
return buildSingleTreeNode("phrase", phrase.id, phraseText, children);
}
$scope.node = buildPhraseTree($scope.rootPhrase, {});
};
ATEditor.controllers = ATEditor.controllers || {};
ATEditor.controllers.DialogueShowTreeController = DialogueShowTreeController;
return ATEditor;
})(ATEditor, ATEditor.model, _);