Last active
July 11, 2020 20:29
-
-
Save Akjosch/e46ef4f631a4e0986902205d04e7f4e7 to your computer and use it in GitHub Desktop.
Simple-as-hell quest system for SugarCube
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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