Skip to content

Instantly share code, notes, and snippets.

@Akjosch
Last active July 11, 2020 20:29
Show Gist options
  • Save Akjosch/e46ef4f631a4e0986902205d04e7f4e7 to your computer and use it in GitHub Desktop.
Save Akjosch/e46ef4f631a4e0986902205d04e7f4e7 to your computer and use it in GitHub Desktop.
Simple-as-hell quest system for SugarCube
"use strict";
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/* quest holder */
var quests = new Map();
var Quests = {
AddQuest: function AddQuest(config) {
var quest = new Quest(config);
quests.set(quest.QuestID, quest);
return quest;
},
GetQuest: function GetQuest(questID) {
return quests.get(questID);
},
GetQuests: function GetQuests() {
return Array.from(quests.values());
},
GetRunningQuest: function GetRunningQuest(questID) {
/* we use '$' at the start to make it not easily accessible from SugarCube */
if (!(State.variables.$runningQuests instanceof Map)) {
State.variables.$runningQuests = new Map();
}
return State.variables.$runningQuests.get(questID);
},
GetRunningQuests: function GetRunningQuests() {
if (!(State.variables.$runningQuests instanceof Map)) {
return [];
}
return Array.from(State.variables.$runningQuests.values());
},
StartQuest: function StartQuest(questID) {
var runningQuest = this.GetRunningQuest(questID);
if (!runningQuest) {
runningQuest = this.GetQuest(questID).StartQuest();
State.variables.$runningQuests.set(questID, runningQuest);
}
return runningQuest;
},
FinishQuest: function FinishQuest(quest) {
if (!(quest instanceof RunningQuest)) {
quest = this.GetRunningQuest(quest);
}
if (!quest) {
return;
/* nothing to do */
}
/* for now, just remove */
State.variables.$runningQuests["delete"](quest.QuestIDReference);
}
};
var Quest = /*#__PURE__*/function () {
function Quest(config) {
_classCallCheck(this, Quest);
if (typeof config.QuestID === 'undefined') {
throw new Error("Quest ID required");
}
this.QuestID = config.QuestID;
this.Title = config.Title || 'This quest needs a title.';
this.Description = config.Description || 'This quest needs a description.';
this.RewardDesciption = config.RewardDesciption || 'There are no rewards. Or are there?';
this.Stages = config.Stages || [];
this.StartStage = config.StartStage || 0;
}
_createClass(Quest, [{
key: "StartQuest",
value: function StartQuest() {
return new RunningQuest(this.QuestID, this.StartStage);
}
}]);
return Quest;
}();
var RunningQuest = /*#__PURE__*/function () {
function RunningQuest(questID, startStage, data) {
_classCallCheck(this, RunningQuest);
data = data || {};
this.QuestIDReference = questID;
this.CurrentStage = startStage;
this.Rewards = clone(data.Rewards || []);
}
_createClass(RunningQuest, [{
key: "AddReward",
value: function AddReward(value) {
this.Rewards.push(value);
}
}, {
key: "RewardPlayer",
value: function RewardPlayer() {
/* however you want to apply the rewards to the PC */
}
}, {
key: "clone",
value: function clone() {
return new RunningQuest(this.QuestIDReference, this.CurrentStage, {
Rewards: this.Rewards
});
}
}, {
key: "toJSON",
value: function toJSON() {
return JSON.reviveWrapper('new RunningQuest(' + JSON.stringify(this.QuestIDReference) + ',' + JSON.stringify(this.CurrentStage) + ',$ReviveData$)', {
Rewards: this.Rewards
});
}
}, {
key: "Quest",
get: function get() {
return Quests.GetQuest(this.QuestIDReference);
}
}]);
return RunningQuest;
}();
/* make those global - only Quests and RunningQuest really needs to though */
window.Quests = Quests;
window.Quest = Quest;
window.RunningQuest = RunningQuest;
/* quest holder */
const quests = new Map();
const Quests = {
AddQuest(config) {
let quest = new Quest(config);
quests.set(quest.QuestID, quest);
return quest;
},
GetQuest(questID) {
return quests.get(questID);
},
GetQuests() {
return Array.from(quests.values());
},
GetRunningQuest(questID) {
/* we use '$' at the start to make it not easily accessible from SugarCube */
if(!(State.variables.$runningQuests instanceof Map)) {
State.variables.$runningQuests = new Map();
}
return State.variables.$runningQuests.get(questID);
},
GetRunningQuests() {
if(!(State.variables.$runningQuests instanceof Map)) {
return [];
}
return Array.from(State.variables.$runningQuests.values());
},
StartQuest(questID) {
let runningQuest = this.GetRunningQuest(questID);
if(!runningQuest) {
runningQuest = this.GetQuest(questID).StartQuest();
State.variables.$runningQuests.set(questID, runningQuest);
}
return runningQuest;
},
FinishQuest(quest) {
if(!(quest instanceof RunningQuest)) {
quest = this.GetRunningQuest(quest);
}
if(!quest) {
return; /* nothing to do */
}
/* for now, just remove */
State.variables.$runningQuests.delete(quest.QuestIDReference);
}
};
class Quest {
constructor(config) {
if(typeof config.QuestID === 'undefined') {
throw new Error("Quest ID required");
}
this.QuestID = config.QuestID;
this.Title = config.Title || 'This quest needs a title.';
this.Description = config.Description || 'This quest needs a description.';
this.RewardDesciption = config.RewardDesciption || 'There are no rewards. Or are there?';
this.Stages = config.Stages || [];
this.StartStage = config.StartStage || 0;
}
StartQuest() {
return new RunningQuest(this.QuestID, this.StartStage);
}
}
class RunningQuest {
constructor(questID, startStage, data) {
data = data || {};
this.QuestIDReference = questID;
this.CurrentStage = startStage;
this.Rewards = clone(data.Rewards || []);
}
AddReward(value) {
this.Rewards.push(value);
}
RewardPlayer() {
/* however you want to apply the rewards to the PC */
}
get Quest() {
return Quests.GetQuest(this.QuestIDReference);
}
clone() {
return new RunningQuest(this.QuestIDReference, this.CurrentStage, {
Rewards: this.Rewards
});
}
toJSON() {
return JSON.reviveWrapper('new RunningQuest(' +
JSON.stringify(this.QuestIDReference) + ',' +
JSON.stringify(this.CurrentStage) + ',$ReviveData$)', {
Rewards: this.Rewards
})
}
}
/* make those global - only Quests and RunningQuest really needs to though */
window.Quests = Quests;
window.Quest = Quest;
window.RunningQuest = RunningQuest;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment