A cleverer way to quest data
by Sam Fereday
HTML
<div id="output"></div>
CSS
html,
body {
padding: 0;
margin: 0;
font: 75%/1.4em arial;
}
#output {
padding: 1em;
width: 100%;
color: #fff;
background: #333;
box-sizing: border-box;
font-size: 2em;
line-height: 1.2em;
}
JavaScript
/*
This is for much later:
{
action: "choiceTree",
yes: "cnv1a",
no: "cnv1b"
}
*/
// Some quest data (note how one is missing to reflect not at that point yet)
var quests = [{
id: "q0",
isComplete: true
}, {
id: "q1",
isComplete: false
}];
// Some conversation data
var conversationData = [{
id: "cnv1",
requirements: {
completed: ["q0"],
incomplete: ["q1", "q2"]
},
actionsOnDone: [{
action: "complete",
id: "q1"
}, {
action: "givequest",
id: "q2"
}, {
action: "giveitem",
id: "anItemId1"
}],
strings: [{
saidBy: 'anEntityId',
str: "This is something to be said."
}]
}];
// Putting it in to practice. Again.
function allComplete(arr) {
var quest;
return arr.every(function(id) {
quest = getQuestById(id);
return quest && quest.isComplete;
});
}
function noneComplete(arr) {
var quest;
return !arr.some(function(id) {
quest = getQuestById(id);
return quest && quest.isComplete;
});
}
function conversationIsEligible(requirements) {
var expectComplete = allComplete(requirements.completed),
expectIncomplete = noneComplete(requirements.incomplete);
return expectComplete && expectIncomplete;
}
function getConversationById(id) {
return conversationData.find(function(conversation) {
return id === conversation.id;
});
}
function getQuestById(id) {
return quests.find(function(quest) {
return id === quest.id;
});
};
function returnEligibleList(arr) {
var currentConversation;
return arr.map(function(id) {
currentConversation = getConversationById(id);
return currentConversation && conversationIsEligible(currentConversation.requirements) ? currentConversation : null;
});
}
function first(arr) {
return arr[0] || {};
}
/* ------------------------------ */
var someIds = ['cnv1', 'cnv2', 'cnv3'],
eligibleConversation = first(returnEligibleList(someIds));
var output = document.getElementById('output').innerHTML = "<pre>" +...