You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
4.7 KiB
JavaScript
194 lines
4.7 KiB
JavaScript
4 years ago
|
const textElement = document.getElementById('text')
|
||
|
const optionButtonsElement = document.getElementById('option-buttons')
|
||
|
|
||
|
let state = {}
|
||
|
|
||
|
function startGame() {
|
||
|
state = {}
|
||
|
showTextNode(1)
|
||
|
}
|
||
|
|
||
|
function showTextNode(textNodeIndex) {
|
||
|
const textNode = textNodes.find(textNode => textNode.id === textNodeIndex)
|
||
|
textElement.innerText = textNode.text
|
||
|
while (optionButtonsElement.firstChild) {
|
||
|
optionButtonsElement.removeChild(optionButtonsElement.firstChild)
|
||
|
}
|
||
|
|
||
|
textNode.options.forEach(option => {
|
||
|
if (showOption(option)) {
|
||
|
const button = document.createElement('button')
|
||
|
button.innerText = option.text
|
||
|
button.classList.add('btn')
|
||
|
button.addEventListener('click', () => selectOption(option))
|
||
|
optionButtonsElement.appendChild(button)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
|
||
|
function showOption(option) {
|
||
|
return option.requiredState == null || option.requiredState(state)
|
||
|
}
|
||
|
|
||
|
function selectOption(option) {
|
||
|
const nextTextNodeId = option.nextText
|
||
|
if (nextTextNodeId <= 0) {
|
||
|
return startGame()
|
||
|
}
|
||
|
state = Object.assign(state, option.setState)
|
||
|
showTextNode(nextTextNodeId)
|
||
|
}
|
||
|
|
||
|
const textNodes = [
|
||
|
{
|
||
|
id: 1,
|
||
|
text: "You find yourself on the foot of an active volcano. You look down and see a cardboard sign lying by your feet with the message 'We are the grandchildren of the witches you were not able to burn.' Hm. What do you do?",
|
||
|
options: [
|
||
|
{
|
||
|
text: "become and ally",
|
||
|
setState: { blueGoo: true, ally: true },
|
||
|
nextText: 2
|
||
|
},
|
||
|
{
|
||
|
text: "doubt the kind",
|
||
|
setState: { blueGoo: true, ally: false },
|
||
|
nextText: 3
|
||
|
},
|
||
|
|
||
|
]
|
||
|
},
|
||
|
|
||
|
{
|
||
|
id: 2,
|
||
|
text: 'You set out to find the people who wrote the sign. You follow a narrow path into a dense forest, where you see a group of elderly women weaving.',
|
||
|
options: [
|
||
|
{
|
||
|
text: 'Ask them what they are weaving.',
|
||
|
requiredState: (currentState) => currentState.blueGoo,
|
||
|
setState: { blueGoo: false, sword: true },
|
||
|
nextText: 4
|
||
|
},
|
||
|
{
|
||
|
text: "Keep on walking.",
|
||
|
requiredState: (currentState) => currentState.blueGoo,
|
||
|
setState: { blueGoo: false},
|
||
|
nextText: 5
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
id: 3,
|
||
|
text: "You walk on a concrete road towards a large building. It has 'FACTS ONLY' engraved on top of a massive wooden door",
|
||
|
options: [
|
||
|
{
|
||
|
text: 'You ring the bell, waiting for someone to let you in.',
|
||
|
nextText: 31
|
||
|
},
|
||
|
{
|
||
|
text: 'Go right',
|
||
|
nextText: 32
|
||
|
},
|
||
|
{
|
||
|
text: 'Keep on walking straight forwards',
|
||
|
nextText: 33
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
id: 100,
|
||
|
text: 'You are getting more tired by the minute. Why were you here again?',
|
||
|
options: [
|
||
|
{
|
||
|
text: 'Restart',
|
||
|
nextText: -1
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
id: 5,
|
||
|
text: 'As you are walking, the fauna is getting denser and wilder by the minute. Suddenly, a gate made of white stone catches your attention',
|
||
|
options: [
|
||
|
{
|
||
|
text: 'Restart',
|
||
|
nextText: 51
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
id: 6,
|
||
|
text: 'You awake in front of a well.',
|
||
|
options: [
|
||
|
{
|
||
|
text: 'Nothing matters so you jump.',
|
||
|
nextText: 7
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
id: 7,
|
||
|
text: 'At the bottom of the well, there are two doors. The doors are guarded by dogs with eyes the size of windmills.',
|
||
|
options: [
|
||
|
{
|
||
|
text: 'Try to run',
|
||
|
nextText: 8
|
||
|
},
|
||
|
{
|
||
|
text: 'Shoot at it with your gun',
|
||
|
requiredState: (currentState) => currentState.sword,
|
||
|
nextText: 9
|
||
|
},
|
||
|
{
|
||
|
text: 'Hide behind your shield',
|
||
|
requiredState: (currentState) => currentState.shield,
|
||
|
nextText: 10
|
||
|
},
|
||
|
{
|
||
|
text: 'You calmy approach it, trying to pet his head',
|
||
|
requiredState: (currentState) => currentState.blueGoo,
|
||
|
nextText: 11
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
id: 8,
|
||
|
text: 'Your attempts to run are in vain and the monster easily catches.',
|
||
|
options: [
|
||
|
{
|
||
|
text: 'Restart',
|
||
|
nextText: -1
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
id: 9,
|
||
|
text: 'You foolishly thought this monster could be slain with the shot of a gun. The doors turn into stonewall in front of your eyes.',
|
||
|
options: [
|
||
|
{
|
||
|
text: 'Restart',
|
||
|
nextText: -1
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
id: 10,
|
||
|
text: 'The monster laughed as you hid behind your shield and ate you.',
|
||
|
options: [
|
||
|
{
|
||
|
text: 'Restart',
|
||
|
nextText: -1
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
id: 11,
|
||
|
text: 'The tension rises as the monster stares back at you, growling and drooling. It smell your hand and with a big POOF, it turns into a fluffy key.',
|
||
|
options: [
|
||
|
{
|
||
|
text: 'Congratulations. Play Again.',
|
||
|
nextText: -1
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
]
|
||
|
|
||
|
startGame()
|