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

/*
{
   		action: "choiceTree",
      yes: "cnv1a",
      no: "cnv1b"
   }
*/

// Some quest data
var quests = [
{
	id: "q0",
  isComplete: true
},{
  id: "q1", // We use this to find it
  isComplete: false // We use this to see if it's complete
}];

// Some conversation data
var conversationData = [{
  id: "cnv1",
  requirements: {
    completed: ["q0"],
    incomplete: ["q3"]
  },
  actionsOnDone: [{
    action: "complete",
    id: "q1"
  }, {
    action: "give",
    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.filter(function(id) {
  	quest = getQuestById(id);
    return quest && quest.isComplete;
  }).length === 0;
}

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>" + JSON.stringify(eligibleConversation) + "</pre>";