<<if $fadeInterface>>
<<set _lockInterface = true>>
<<run setup.setCssVar('--interface-opacity', 0.18)>>
<<else>>
<<run setup.setCssVar('--interface-opacity', 1)>>
<</if>>
<<run setup.processInterface()>>/* You can delete this passage in your release build if you want to prevent players from accessing the Debug Panel and Editor */
<<if passage() != "EDITOR">>
<center>
<<if _lookupID == undefined>><<set _lookupID = "">><</if>>
<div id="buttons">
<<button "LIST LOADED __O__BJECTS">><<run setup.listLoadedObjects()>><</button>>
<<button "VIEW __L__OG">><<run setup.viewLog()>><</button>>
<<button "Data __E__ditor">><<run setup.openDataEditor()>><</button>>
</div>
</center><hr>
<div id="mainInfo">
<pre>
''//CURRENT LOCATION://'' $location.current<br>
''//LAST LOCATION://'' $location.last</pre><hr>
<<if passage() == "MAIN HUB">>
''//LINKS://''
<<for _i = 0; _i < _links.length; _i++>>
<br>
_links[_i].spanID - _links[_i].ID - _links[_i].linkText - _links[_i].filter
<<if _links[_i].destination != undefined>> - _links[_i].destination<</if>>
<<if _links[_i].contains.length > 0>> - //contains: //_links[_i].contains<</if>>
<</for>>
<</if>>
<hr>
<pre>
''//No of chapters://'' <<= setup.data.noChapters>><br>
''//Current chapter://'' $chapter<br>
''//No of permanent items://'' <<= setup.noGlobalItems - 1>><br>
''//No of chapter items://'' <<= setup.noChapterItems>><br>
''//No of permanent NPCs://'' <<- setup.noGlobalNPCs>><br>
''//No of chapter NPCs://'' <<- setup.noChapterNPCs>>
<<script>>
State.setVar("_noSaves", Save.slots.count());
State.setVar("_noSlots", Save.slots.length);
State.setVar("_autosave", Save.autosave.get());
<</script>>
<hr>
''//Current audio track://'' $track
<hr>
''//No of saves used://'' _noSaves / _noSlots<br>
''//Last autosave://'' _autosave.id - _autosave.metadata - _autosave.date<br>
''//Local storage used://'' <<= setup.returnLocalStorageSize()>>
</pre><hr>
''//No of SugarCube Story variables = //'' <<- Object.keys(State.variables).length>>
<br><br><<linkreplace "show">>
<<set _keys = Object.keys(State.variables)>>
<<for _i = 0; _i < _keys.length; _i++>>
<<set _thisLink = _keys[_i]>>
<<capture _thisLink>>
<span class="tab"><<link _thisLink>>
<<run console.log('lookup Story var: $' + _thisLink)>>
<<run console.log(State.variables[_thisLink])>>
<</link>></span><br>
<</capture>>
<</for>>
<</linkreplace>>
</div>
<<else>>
<center>
<<button "Exit Editor">>
<<run document.title = Story.title>>
<<run setup.reloadGameObjects()>>
<<goto $passage>>
<<done>><<run Dialog.close()>><</done>>
<</button>>
</center>
<</if>><<include Style>>
<<set _activeVerb = "">>
<<if _links == undefined>><<set _links = []>><</if>>
<<set _contains = []>>
<<set _message = "">>
<<set _passageText = "">>
<<set _cursor = setup.cursor>>
<div class="container">
<div class="topleft">
<<if setup.data.settings.logo != undefined>>
<img @src="setup.data.settings.logo" style="width:100%;height:100%;" alt="logo">
<</if>>
</div>
<div class="mainbox-title" id="passage-head">
<<if !$contLoop>>
<<= setup.alias($location.current)>>
<<else>>
<<= setup.alias($container.name)>>
<</if>>
</div>
<div class="mainbox" id="passagebody">
<div id="passage-description">
<<if !$contLoop>>
<<include $location.current>>
<<print _passageText>>
<</if>>
</div>
<div class="commandline" ID="CMD"><<print setup.cursor>></div>
<div class="messagebox" id="message"></div>
</div>
<div class="interface" id="interfacebox">
<<include "INTERFACE">>
</div>
<div class="inventory" id="invbox">
<<include "INVENTORY">>
</div>
<div class="bottomright">
<<if setup.data.settings.journal == true>>
<<if $newEntry == true>>
<span class="flashing-journal-button" id="j-button">
<<button "Journal">>
<<run setup.openJournal()>>
<</button>>
</span>
<<elseif $activeJournalEntries.length == 0>>
<span class="dead-journal-button" id="j-button">
<<button "Journal">><</button>>
</span>
<<else>>
<span class="static-journal-button" id="j-button">
<<button "Journal">>
<<run setup.openJournal()>>
<</button>>
</span>
<</if>>
<</if>>
<<button "Menu">>
<<script>>
Dialog.setup();
Dialog.wiki(Story.get("MENU").processText());
Dialog.open();
<</script>>
<</button>>
</div>
</div>
<<if !$contLoop>><<run setup.compileContainedItems()>><</if>><<include Style>>
<<set _borderStyle = "5px solid">> /* CSS styling for the NPC portrait border - do not include color here!!! */
<<run setup.initDialogue()>>
<<if _targetNPCvars.portrait != "">>
<div class="npcimg" id="portrait">
<img @src="'assets/img/npc/' + _targetNPCvars.portrait" style="width:100%;height:100%;border-radius: 125px 125px 0px 0px;" alt="NPC portrait">
</div>
<<else>>
<<run setup.setCssVar("--dialogue-height", "52vh")>>
<<run setup.setCssVar("--dialogue-pos", "11vh")>>
<</if>>
<div class="npcname" id="name">_targetNPCvars.name</div>
<div class="dialogue-body" id="dialogue-body">
<div id="dialogue-text">
<<include _currentThread>>
<<unset _initDialogue>>
</div>
<div class="response" id="responses"></div>
<<done>><<run setup.printQuote()>><</done>>
</div><style>
.invHeader {
text-align: center;
font-size: 32px;
font-variant: small-caps;
padding-bottom: 6px;
}
.invItem {
border: 1px solid black;
margin-top: 10px;
padding: 3px 10px;
}
.empty {
color: darkslategrey;
text-align: center;
}
</style>
<div class="invHeader">Inventory:</div>
<<set setup.prependToInvItemName = "">>
<<set setup.emptyInvSlotContent = "-">>
<<set _printInventory = setup.processInventory()>>
_printInventory<div class="menu"><center>
<img src="assets/ui/titleimg.png" alt="SYMBOL" width="100"><br><br>
<<button "Restart">><<run UI.restart()>><</button>><br><br>
<<button "Save/Load Game">>
<<run UI.saves()>>
<<goto "MAIN HUB">>
<</button>><br><br>
<<button "Load Last Autosave">>
<<set _confirm = "autoload">>
<<script>>
Dialog.setup("Load autosave...");
Dialog.wiki('<<button "YES">>
<<run Save.autosave.load()>>
<<run Dialog.close()>>
<<goto "MAIN HUB">>
<</button>>
<<button "NO">>
<<run Dialog.close()>>
<</button>>');
Dialog.open();
<</script>>
<</button>><br><br>
<<button "Settings">>
<<script>>
Dialog.setup("SETTINGS");
Dialog.wiki('
<div class="settings">
AUDIO VOLUME: <<volume>><br><br>
<<if Fullscreen.isFullscreen()>>
<<set _fullscreen = "ENABLED">>
<<else>>
<<set _fullscreen = "DISABLED">>
<</if>>
<<set _switch = `
<<link _fullscreen>>
<<if _fullscreen == "ENABLED">><<set _fullscreen = "DISABLED">><<else>><<set _fullscreen = "ENABLED">><</if>>
<<run Fullscreen.toggle()>>
<<replace #switch>>_switch<</replace>>
<</link>>`>>
Run in full screen? <span id="switch">_switch</span>
</div>');
Dialog.open();
<</script>>
<</button>><br><br>
<<button "Credits">>
<<script>>
Dialog.setup("CREDITS");
Dialog.wiki(Story.get("CREDITS").processText());
Dialog.open();
<</script>>
<</button>><br><br>
</center></div><br><b>'The Mamertine'</b> ?nl
Words by K Vella ?nl
Sounds by FOM ?nl
Images by K Vella except for 'Homeless and forgotten old man in Argentina' by
Rodrigo Butta (Public Domain)<br>https://www.flickr.com/photos/photobutta/
?nl
With special thanks to Will Merrow-Smith for playtesting <br>
<br><hr><pre>//Powered by//<br><br>
''V'' e r b<br>
''I'' n t e f a c e<br>
''B'' a s e d<br>
''A'' d v e n t u r e<br>
''E'' n g i n e<br><br>
version: <<=setup.version.substring(0, 5)>><br>
<center> https://kvella.itch.io/vibae </center></pre><<widget "chapterStart">>
<<run setup.loadChapter(_args[0])>>
<<if _args[1] != null>>
<<goto _args[1]>>
<<else>>
<<goto "MAIN HUB">>
<</if>>
<<done>><<run Save.autosave.save(null, "chapter start")>><</done>>
<<if $track != null>>
<<audio ":playing" fadeout>>
<<audio $track play loop>>
<</if>>
<</widget>>
<<widget "whitelist">>
<<switch _args[0]>>
<<case "hasItem">>
<<if $inventory.includes(_args[1])>>
<<set $dialogueWL.push(_args[2])>>
<<else>>
<<if $dialogueWL.push(_args[2])>>
<<set $dialogueWL.delete(_args[2])>>
<</if>>
<</if>>
<<case "hasVisited">>
<<set _getHistory = setup.getHistory(_args[1])>>
<<if _getHistory.hasVisited>>
<<set $dialogueWL.push(_args[2])>>
<</if>>
<<unset _getHistory>>
<</switch>>
<</widget>>
<<widget "clickToContinue" container>>
<<if $execOnClick == null>>
<<set $execOnClick = _contents>>
<<else>>
<<set $execOnClick = $execOnClick.concat(_contents)>>
<</if>>
<<if _args[0] == "exitContainer" && $contLoop>>
<<set $exitCont = true>>
<<run console.log('C2C-exitContainer')>>
<</if>>
<<done>><<run setup.clickToContinue()>><</done>>
<</widget>>
<<widget "exitContainer">>
<<run console.log('EXIT CONTAINER WIDGET')>>
<<set $contLoop = false>>
<<unset $container, $fadeInterface>>
<<replace #passage-head>><<= setup.alias($location.current)>><</replace>>
<<replace #interfacebox>><<include "INTERFACE">><</replace>>
<<replace #CMD>>_cursor<</replace>>
<<replace #message>><</replace>>
<<set _message = "">>
<<run setup.mainLoop()>>
<</widget>>
<<widget "moveTo">>
<<set setup.logComment = setup.logComment.concat("#moveTo(" + _args[0] + ")")>>
<<set _activeVerb = "C2C move">>
<<run setup.updateLog()>>
<<set _lastAlias = setup.alias($location.current)>>
<<set $location.last = $location.current>>
<<set $location.current = _args[0]>>
<<if $location.current.includes("[[")>>
<<set $location.current = $location.current.slice(2)>>
<<set $location.current = $location.current.replace("]]","")>>
<</if>>
<<if setup.locationPassages.includes($location.current)>>
<<run setup.refreshInterface($contLoop, false)>>
<<unset _newLoc>>
<<if setup.alias($location.current) != _lastAlias>>
<<set _replaceHeader = true>>
<</if>>
<<unset _lastAlias>>
<<set _t8n = true>>
<<run setup.mainLoop()>>
<<else>>
<<run console.log("<<moveTo>> widget => " + $location.current + " is not a location passage")>>
<<goto $location.current>>
<</if>>
<</widget>>
<<widget "openDialogue">>
<<set $targetNPC = _args[0]>>
<<set $targetThread = _args[1]>>
<<set _delay = setup.cmdDelay>>
<<if _args[2] == "noDelay">>
<<set _delay = "3ms">>
<</if>>
<<timed _delay>>
<<run setup.updateLog()>>
<<goto "DIALOGUE">>
<</timed>>
<</widget>>
<<widget "addJournalEntry">>
<<done>>
<<if setup.journalPassages.includes(_args[0]) && $activeJournalEntries.includes(_args[0]) != true>>
<<set $activeJournalEntries.push(_args[0])>>
<<run console.log('JOURNAL - entry added (' + State.temporary.args[0] + ')')>>
<<set setup.logComment = setup.logComment.concat("#addJournal(" + State.temporary.args[0] + ") ")>>
<<run document.getElementById("j-button").className = "flashing-journal-button">>
<<replace #j-button>>
<<button "Journal">>
<<run setup.openJournal()>>
<</button>>
<</replace>>
<</if>>
<</done>>
<</widget>>
<<widget "removeItem">>
<<for _rem = 0; _rem < $gameObjectVars.length; _rem++>>
<<if $gameObjectVars[_rem].ID == _args[0]>>
<<set $gameObjectVars[_rem] = {ID: _args[0], name: 'deleted on Tick ' + $log.length}>>
<<break>>
<</if>>
<</for>>
<<unset _rem>>
<<if $inventory.contains(_args[0])>><<set $inventory.delete(_args[0])>><<if passage() == "MAIN HUB">>?refreshInv<</if>><</if>>
<<if _contains != null>>
<<set _contains.delete(_firstTargetID)>>
<</if>>
<<set setup.logComment = setup.logComment.concat("#remove-" + _args[0] + " ")>>
<</widget>>
<<widget "addToInventory">>
<<for _i = 0; _i < _args.length; _i++>>
<<if $inventory.includes(_args[_i]) != true>>
<<run console.log(_args[_i] + ' added to inventory')>>
<<set $inventory.push(_args[_i])>>
<<set setup.logComment = setup.logComment.concat("#addToInv-" + _args[_i] + " ")>>
<<for _inv = 0; _inv < $gameObjectVars.length; _inv++>>
<<if $gameObjectVars[_inv].ID == _args[_i]>>
<<set $gameObjectVars[_inv].location = "inventory">>
<<break>>
<</if>>
<</for>>
<</if>>
<</for>>
<<if passage() == "MAIN HUB">>?refreshInv<</if>>
<</widget>>
<<widget "removeFromInventory">>
<<edit _args[0] location _args[1] noComment>>
<<run console.log('inventory item ' + _args[0] + ' moved to: ' + _args[1])>>
<<set $inventory.delete(_args[0])>>>>
<<set setup.logComment = setup.logComment.concat("#remFromInv-" + _args[0] + "-" + _args[1] + " ")>>
<<if passage() == 'MAIN HUB'>>?refreshInv<</if>>
<</widget>>
<<widget "edit">>
<<run setup.editGameObjectVars(_args[0], _args[1], _args[2], _args[3])>>
<</widget>>
<<widget "checkHistory">>
<<set _history = setup.getHistory(_args[0])>>
<</widget>>
<<widget "place" container>>
<<set _isPresent = setup.checkPresence(_args[0])>>
<<if _isPresent>>
<<run setup.processPlace(_args[0], _contents)>>
<</if>>
<<unset _isPresent>>
<</widget>>
<<widget "describe" container>>
<<if setup.processDescribe(_args)>>
<<set _passageText = _passageText.concat(_contents)>>
<</if>>
<</widget>>
<<widget "navigation" container>>
<<set _contArr = _contents.split("*")>>
<<run setup.parseNavigation(_contArr)>>
<</widget>>
<<widget "quote" container>>
<<if _args.includes("FIRST")>><<set _history = "FIRST">>
<<elseif _args.includes("SUBS")>><<set _history = "SUBS">>
<<elseif _args.includes("INIT")>><<set _history = "INIT">>
<<else>><<set _history = "">><</if>>
<<if _args.includes("DESC")>><<set _desc = true>>
<<else>><<set _desc = false>><</if>>
<<if _args.includes("WAIT")>><<set _wait = true>>
<<else>><<set _wait = false>><</if>>
<<if _args.includes("REPLACE")>><<set _replace = true>>
<<else>><<set _replace = false>><</if>>
<<run setup.processQuote(_contents, _history, _desc, _wait, _replace)>>
<<unset _history, _desc, _wait, _replace>>
<</widget>>
<<widget "response" container>>
<<if _args[0] == "clickToExit">>
<<set _exit = true>>
<<set _linkArgs = []>>
<<else>>
<<run setup.parseResponse(_contents)>>
<</if>>
<</widget>><<silently>>
/* Any code included here will be executed at the end of every player action in the main loop. Use this space to code for particular game conditions, timers, contextual events, etc */
<<if $inventory.includes(1016) && setup.compassDirections.includes(_primaryTarget.ID) && $chapter == "Day">>
<<if _activeVerb.name == 'Examine'>>
<<set _compassIndex = setup.compassDirections.indexOf(_primaryTarget.ID)>>
<<set _direction = setup.compassNames[_compassIndex]>>
<<set _message = _message + " According to the compass this way is " + _direction + ".">>
<</if>>
<</if>>
<<if $timer != null>><<script>>
if (State.variables.location.current == "Shrine") {
if (State.temporary.activeVerb.name != "Go" && State.variables.timer == 2 && State.variables.stage == 0) {
State.temporary.message = State.temporary.message + " ?nl You think you can hear a faint clanking coming from the hole in the floor at the back of the chamber.";
State.variables.timer = 3;
}
else if (State.temporary.activeVerb.name != "Go" && State.variables.timer == 4 && State.variables.stage == 1) {
State.temporary.message = State.temporary.message + " ?nl You are suddenly disturbed by a loud groaning coming from the hole in the floor...";
State.variables.timer = 5;
}
else {State.variables.timer++}
}
<</script>><</if>>
<</silently>>/* set up data for compass mechanic */
<<set setup.compassDirections = ["N","E","S","W","NE","SE","SW","NW",1018,1019]>>
<<set setup.compassNames = ["North","East","South","West","North-East","South-East","South-West","North-West","South","South"]>>
/* set up alias's for Hedge Maze passages (custom code for this demo game) */
<<for _loc = 0; _loc < setup.locationPassages.length; _loc++>>
<<if setup.locationPassages[_loc].substr(0, 10) == "Hedge Maze">>
<<set setup.data.settings.aliasList.push({name:setup.locationPassages[_loc],alias:"Hedge Maze"})>>
<</if>>
<</for>><<include Style>>
<<unset $newEntry>>
<div class="journal" id="entry">
<center>__<<- $activeJournalEntries[setup.thisEntry]>>__</center><div class="newline"><br></div>
<<include $activeJournalEntries[setup.thisEntry]>>
</div>
<center><div class="journal-buttons" id="buttons"></div></center>
<<done>><<run setup.showJournalButtons()>><</done>>/* This is the splash screen. Set this as the start point for your finished game */
<style>
body {
background-color: #5199ad;
font-family: monospace;
font-weight: bold;
font-size: 21px;
}
a {color: #5199ad}
a:hover {color: white}
.loaderBox {
padding-top: 20px;
padding-bottom: 20px;
margin: 0;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
min-width: 25%;
color: #eee;
background-color: #125b6b;
border: white;
border-style: double;
overflow: auto;
text-align: center;
vertical-align: center;
}
</style>
<div class="loaderBox">
VIBAE loader <br>ver <<=setup.version.substring(0, 5)>><hr>__<<= Story.title>>__<br><br>
<<link "NEW GAME">>
<<run memorize("fullscreen", _fullscreen)>>
<<if _fullscreen == "ENABLED">><<run Fullscreen.toggle()>><</if>>
<<set setup.fwdCommands = '<<chapterStart $chapter "Intro">>'>>
<<goto "Fake Loading Screen">>
<</link>><br><br>
<<if Save.slots.count() > 0>>
<<link "CONTINUE">>
<<run memorize("fullscreen", _fullscreen)>>
<<if _fullscreen == "ENABLED">><<run Fullscreen.toggle()>><</if>>
<<set setup.fwdCommands = '<<run setup.loadLastSave()>>'>>
<<goto "Fake Loading Screen">>
<</link>>
<br><br>
<</if>>
<<set _fullscreen = recall("fullscreen", "ENABLED")>>
<<set _switch = `<<link _fullscreen>><<if _fullscreen == "ENABLED">><<set _fullscreen = "DISABLED">><<else>><<set _fullscreen = "ENABLED">><</if>><<replace #switch>>_switch<</replace>><</link>>`>>
Run in full screen? <span id="switch">_switch</span>
</div><style>
.logo {
animation: fadeIn;
animation-duration: 2.4s;
animation-timing-function: ease-in;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
</style>
<<audio ":playing" fadeout>>
<div class="logo"><center><img src="assets/img/ui/symbol.png"></center></div>
<<timed setup.loadDelay>>
<<print setup.fwdCommands>>
<</timed>><<set setup.loadDelay = "0.5s">>
<<run setup.lookup(1003)>>
<<set $testChapter = {
chapter: "Day",
startLocation: "Hedge Maze North",
exec: `<<addToInventory 1006>>`,
track: "chapter01"
}>>
<<set setup.fwdCommands = '<<chapterStart $testChapter.chapter "MAIN HUB">>'>>
<<goto "Fake Loading Screen">>{
"meta": {
"timestamp": 1679222332537,
"version": "2.1.032",
"title": "The Mamertine"
},
"settings": {
"initExec": "<<include \"Initial Script\">>",
"journal": true,
"logo": "assets/img/ui/symbol.png",
"invMaxSlots": 9,
"pathPortraits": "assets/img/npc/",
"initialChapter": "Day",
"audioPath": "assets/audio/",
"trackList": [
{
"name": "chapter01",
"file": "chapter01.mp3"
},
{
"name": "chapter02",
"file": "chapter02.mp3"
},
{
"name": "death",
"file": "death.mp3"
},
{
"name": "cheynestoking",
"file": "CheyneStoking.mp3"
},
{
"name":"intro",
"file":"intro.mp3"
}
],
"chapters": {
"Day": {
"startLocation": "Ante Chamber Intro",
"exec": ""
},
"Night": {
"startLocation": "Hedge Maze North",
"exec": "<<include 'chapter 2 init script'>>",
"track": "chapter02"
}
},
"verbs": {
"onExamine": {
"verbPrototype": "examine",
"name": "Examine",
"containerVerb": true,
"openContainers": true
},
"onUse": {
"verbPrototype": "use",
"name": "Use",
"containerVerb": true,
"openContainers": false,
"fail": [
"It doesn't seem useful for much.",
"You can't think of anything useful to do with it."
],
"failNoSecondary": [
"There is nothing here to use that with."
],
"failCompound": [
"That's not going to work.",
"That's a silly idea.",
"That won't achieve anything useful."
],
"noLinks": "You don't see anything useful here."
},
"onOpen": {
"verbPrototype": "use",
"name": "Open",
"containerVerb": true,
"openContainers": true
},
"onPickUp": {
"verbPrototype": "pick",
"name": "Pick Up",
"containerVerb": true,
"fail": [
"You can't pick that up.",
"It's not going anywhere."
],
"positive": "You take the ~item~.",
"noLinks": "There is nothing worth taking here."
},
"onPut": {
"verbPrototype": "put",
"name": "Put",
"containerVerb": false,
"fail": [
"It won't go there.",
"That's not a suitable place to put it."
],
"failNoSecondary": [
"There is nowhere suitable to put that."
],
"emptyInv": "You have nothing to put anywhere."
},
"onTalkTo": {
"verbPrototype": "talk",
"name": "Talk To",
"containerVerb": false,
"noLinks": "There is nobody here to talk to."
},
"onGive": {
"verbPrototype": "give",
"name": "Give",
"containerVerb": false,
"fail": [
"They probably won't appreciate it."
],
"emptyInv": "You have nothing to give.",
"noNPC": "There is nobody here to give anything to."
},
"onGo": {
"verbPrototype": "nav",
"name": "Go",
"containerVerb": false,
"descriptions": {
"other": {
"before": "You have no idea where it leads.",
"after": "It's the way to ~destination~."
}
},
"noLinks": "There is no apparent way out of here!"
}
},
"aliasList": [
{
"name": "Ante Chamber Intro",
"alias": "Ante Chamber"
},
{
"name": "Escape",
"alias": "Hedge Maze"
},
{
"name": "Transition to Elephant Room",
"alias": "Hedge Maze"
},
{
"name": "Draughty Cave from Elephant Room",
"alias": "Elephant Room"
},
{
"name": "Draughty Cave from Hedge Maze",
"alias": "Hedge Maze"
},
{
"name": "Tight Hole",
"alias": "Draughty Cave"
},
{
"name": "Hedge Maze Entrance",
"alias": "Hedge Maze"
},
{
"name": "Hedge Maze North",
"alias": "Hedge Maze"
},
{
"name": "Hedge Maze South A3",
"alias": "Hedge Maze"
},
{
"name": "Hedge Maze South B1",
"alias": "Hedge Maze"
},
{
"name": "Hedge Maze South B4",
"alias": "Hedge Maze"
}
],
"verbKeys": [
"onExamine",
"onUse",
"onOpen",
"onPickUp",
"onPut",
"onTalkTo",
"onGive",
"onGo"
]
},
"noChapters": 2,
"gameObjects": [
{
"ID": 1002,
"name": "lever",
"location": "Hedge Maze North",
"status": "seized",
"description": "It's a rusty looking lever. You have no idea what it could be doing here.",
"chapter": "ALL",
"rules": {
"seized": {
"onExamine":{
"exec":"<<if !$dialogueWL.includes(\"lever\")>><<set $dialogueWL.push(\"lever\")>><</if>>"
},
"onUse": {
"msg": "It's stuck fast.",
"exec":"<<if !$dialogueWL.includes(\"lever\")>><<set $dialogueWL.push(\"lever\")>><</if>>"
}
},
"back": {
"onUse": {
"msg": "<<if $leverCount > 4>><<= setup.leverMessage[4]>><<else>><<= setup.leverMessage[$leverCount]>><</if>>",
"exec": "<<edit 1002 status \"forward\">>\n<<edit 1002 description \"The lever is in the forward position.\">>\n<<set $leverCount++>>\n<<run console.log(\"leverCount: \" + $leverCount)>>"
}
},
"forward": {
"onUse": {
"msg": "<<if $leverCount > 4>><<= setup.leverMessage[4]>><<else>><<= setup.leverMessage[$leverCount]>><</if>>",
"exec": "<<edit 1002 status \"back\">>\n<<edit 1002 description \"The lever is in the back position.\">>\n<<set $leverCount++>>\n<<run console.log(\"leverCount: \" + $leverCount)>>"
}
},
"broken": {
"onUse": {
"msg": "The damage to the lever renders it useless."
}
}
}
},
{
"ID": 1003,
"name": "can of oil",
"location": 1004,
"status": "full",
"description": "It's a can of penetrating oil.",
"chapter": "ALL",
"rules": {
"full": {
"onUse": {
"interactions": [
{
"ID": 1002,
"msg": "You pour the oil into the base of the lever.",
"exec": "<<edit 1002 status \"back\">>\n<<edit 1002 description \"The oil has probably had enough time to work now.\">>\n<<set $leverCount = 0>>\n<<removeItem 1003>>"
}
]
},
"onPickUp": {
"allow": true
},
"onPut": {
"interactions": [
{
"ID": 1004,
"msg": "You put the can of oil back where you found it in the toolbox.",
"putPositive": true
}
]
}
}
}
},
{
"ID": 1004,
"name": "tool chest",
"location": "Ante Chamber",
"status": "locked first exam",
"description": "It's an old metal tool chest. Dark green paint has flaked off in patches revealing the rust underneath.",
"chapter": "ALL",
"rules": {
"locked first exam": {
"onOpen": {
"exec": "<<edit 1004 status \"locked subs exam\">>"
},
"container": {
"locked": true,
"description": "!DIALOGUE(FRANZ - Defend Toolbox)101",
"allowOpen": [
"onOpen"
]
}
},
"locked subs exam": {
"container": {
"locked": true,
"description": "There is no way to look inside without the old man noticing and kicking up a fuss.",
"allowOpen": [
"onExamine",
"onOpen"
]
}
},
"unlocked": {
"onOpen": {
"msg": "There is nothing else worth taking inside the tool chest."
},
"onPut": {
"allow": true
},
"container": {
"locked": false,
"description": "Inside the tool chest you find a jumbled assortment of broken, rusty and poorly looked after hand tools. Hidden amongst the junk however there may be something worth 'borrowing'. You can see:",
"allowOpen": [
"onExamine",
"onOpen"
],
"list": true
}
}
}
},
{
"ID": 1005,
"name": "door",
"location": "Ante Chamber",
"status": "locked",
"description": "There is a sign on the door that says 'precious things'.",
"chapter": "ALL",
"rules": {
"locked": {
"onOpen": {
"msg": "It's locked and it looks way too heavy to force open."
},
"onGo": {
"allowNav": false,
"failMsg": "The door is locked."
}
},
"unlocked": {
"onOpen": {
"msg": "You crack the door open and peer though. The room beyond is unlit. It is hard to make anything out."
},
"onGo": {
"allowNav": true
}
}
}
},
{
"ID": 1006,
"name": "brass sphere",
"location": 1014,
"status": "default",
"description": "It's about an inch across and quite heavy for it's size.",
"chapter": "ALL",
"rules": {
"default": {
"onUse": {
"interactions": [
{
"ID": 1005,
"msg": "The key turns in the lock with a satisfying click.",
"exec": "<<edit 1005 status \"unlocked\">>"
}
]
},
"onPickUp": {
"allow": true
},
"onPut": {
"failMsg": "It seems important. You don't want to risk losing it."
}
}
}
},
{
"ID": 1007,
"name": "spanner",
"location": 1004,
"status": "default",
"description": "It's an adjustable spanner in reasonable condition.",
"chapter": "ALL",
"rules": {
"default": {
"onPickUp": {
"allow": true,
"msg": "You think it could be handy. It's about the only tool here that seems useable."
},
"onPut": {
"interactions": [
{
"ID": 1004,
"msg": "You put the spanner back where you found it in the toolbox.",
"putPositive": true
},
{
"ID": 1017,
"msg":"You drop the spanner into the hole. You listen out for it to land at the bottom but hear nothing.",
"putPositive": true
}
]
}
}
}
},
{
"ID": 1008,
"name": "newspaper",
"location": "1009",
"status": "default",
"description": "It's a crumpled newspaper and it appears to be reasonably intact. It would not be hard to untangle it from the branch.",
"chapter": "ALL",
"rules": {
"default": {
"onExamine": {
"exec": "<<if $inventory.includes(1008)>><<edit 1008 name \"Daily Veil\">>?refreshInv\n<<edit 1008 description \"It's best to not get distracted by this tawdry rag.\">><</if>>"
},
"onPickUp": {
"allow": true,
"exec": "<<set $dialogueWL.push(\"hasNewspaper\")>><<edit 1008 description \"It's a publication that calls itself 'The Daily Veil'. As you thumb over it's pages you feel your will to engage with your surroundings start to drain away... and from somewhere an unnamable fury starts to rise within you. You quickly look away.\">>"
}
}
}
},
{
"ID": 1009,
"name": "fallen branch",
"location": "Hedge Maze North",
"status": "default",
"description": "It's a branch of some size. You wonder where it might have come from.",
"chapter": "Day",
"rules": {
"default": {
"container": {
"locked": false,
"description": "It's a sizeable bough with it's leaves still intact, too heavy to for you to move. There appears to be no large tree nearby where it could have come from. Suddenly you notice ~1008 something grey~ tangled up in the smaller branches.",
"allowOpen": [
"onExamine"
],
"onEmpty": "There is nothing else of interest here.",
"list": false
}
}
}
},
{
"ID": 1010,
"name": "skeleton",
"location": "Ante Chamber",
"status": "default",
"description": "It's a desiccated corpse.",
"chapter": "Night",
"rules": {
"default": {
"container": {
"locked": false,
"description": "The corpse must have been left here for some time. Looking closer you can see a ~1016 something metallic~ lying umongst the bones and rags.",
"allowOpen": [
"onExamine"
],
"onEmpty": "There is nothing else of interest here.",
"list": false
}
}
}
},
{
"ID": 1011,
"name": "poster",
"location": "Elephant Room",
"status": "default",
"description": "N/A",
"chapter": "Day",
"rules": {
"default": {
"container": {
"locked": false,
"description": "It's an ancient, yellowing poster with the faded image of a woman holding out a leaf. Behind one of it's peeling corners you can make out some ~1012 handwriting~ on the wall ",
"allowOpen": [
"onExamine"
],
"list": false
}
}
}
},
{
"ID": 1012,
"name": "scrawlings",
"location": 1011,
"status": "default",
"description": "!PASSAGE-Examine scrawlings",
"chapter": "Day"
},
{
"ID": 1013,
"name": "cave",
"location": "Draughty Cave",
"status": "default",
"description": "The walls bear the marks of a thousand steel claws.",
"chapter": "Day"
},
{
"ID": 1014,
"name": "statue",
"location": "Shrine",
"status": "initial exam",
"description": "You don't want to give any more of your attention to this thing.",
"chapter": "Day",
"rules": {
"initial exam": {
"onExamine": {
"exec": "<<edit 1014 status \"further exam\">><<set $stage++>>"
},
"onUse": {
"msg": "This statue gives you the creeps. You don't want to touch it."
},
"onPick": {
"msg": "To try that would be insane."
},
"container": {
"locked": true,
"description": "!PASSAGE-Statue of Ekh",
"allowOpen": [
"onExamine"
]
}
},
"further exam": {
"onUse": {
"msg": "This statue gives you the creeps. You don't want to touch it."
},
"onPick": {
"msg": "Ekh defies the grasp of those it feeds from."
},
"container": {
"locked": false,
"description": "You look closer and you can see something shining in one of the statue's upturned hands. It is a ~1006 brass sphere.~",
"allowOpen": [
"onExamine"
],
"list": false
}
}
}
},
{
"ID": 1015,
"name": "relief",
"location": "Corridor",
"status": "default",
"description": "It depicts a pair of snakes that form a circle, each snake eating the other's tail. In the center of this circle is an eye.",
"chapter": "Day"
},
{
"location": 1010,
"ID": 1016,
"name": "compass",
"status": "in skeleton",
"description": "It's a small brass compass on a chain.",
"chapter": "ALL",
"rules": {
"has compass": {
"onUse": {
"interactions": [
{
"ID": "N",
"msg": "According to the compass that way is North."
},
{
"ID": "S",
"msg": "According to the compass that way is South."
},
{
"ID": "E",
"msg": "According to the compass that way is East."
},
{
"ID": "W",
"msg": "According to the compass that way is West."
},
{
"ID": "NE",
"msg": "According to the compass that way is North-East."
},
{
"ID": "SE",
"msg": "According to the compass that way is South-East."
},
{
"ID": "NW",
"msg": "According to the compass that way is North-West."
},
{
"ID": "SW",
"msg": "According to the compass that way is South-West."
},
{
"ID": 1005,
"msg": "The door is in the East wall of the room."
},
{
"ID": 1018,
"msg": "According to the compass that way is South."
},
{
"ID": 1019,
"msg": "According to the compass that way is South."
},
{
"ID": 1020,
"msg": "The elevator doors are in the North wall of the room."
}
]
},
"onPut": {
"msg": "The compass is too useful to be let out of your possession."
}
},
"in skeleton":{
"onUse":{
"msg":"You would have to take it from the corpse to make any use of it."
},
"onPickUp": {
"allow": true,
"exec": "<<edit 1016 description \"You look at the compass to find that the needle is spinning in random directions making it impossible to take a bearing.\">><<edit 1016 status \"useless\">>"
}
},
"useless":{
"onUse": {
"msg":"The needle spins erratically. You can't make head nor tail of it."
}
}
}
},
{
"location": "Shrine",
"ID": 1017,
"name": "hole",
"status": "default",
"description": "It's where you came in from. You have no desire to risk your neck clambering back down there.",
"chapter": "Day"
},
{
"location": "Hedge Maze South A3",
"ID": 1018,
"name": "straight ahead",
"status": "default",
"description": "It seems to be a bit overgrown.",
"chapter": "Day",
"rules": {
"has died from Hedge Maze": {
"onGo": {
"allowNav": false,
"failMsg": "You are stuck with an overwhelming sense that you have somehow been here before and that continuing in this direction is a bad idea. You decide to turn back."
}
},
"has died from Draughty Cave": {
"onGo": {
"allowNav": false,
"failMsg": "You attempt to make you way further along the path but after a dozen or so paces you come to a dense barrier of overgrown vegetation and have to turn back."
}
},
"default": {
"onGo": {
"allowNav": true
}
}
}
},
{
"location": "Draughty Cave",
"ID": 1019,
"name": "right-hand tunnel",
"status": "default",
"description": "As you bend down and peer into the opening you are hit with the faint stench of decay. The rocky tunnel is short. Dark, tangled vegetation appears to line the way beyond.",
"chapter": "Day",
"rules": {
"hasDied": {
"onGo": {
"allowNav": false,
"failMsg": "A short distance in the roof of the tunnel has collapsed. There is no way to get though."
}
},
"default": {
"onGo": {
"allowNav": true
}
}
}
},
{
"location": "Ante Chamber",
"ID": 1020,
"name": "elevator",
"status": "default",
"description": "!PASSAGE-Examine lift",
"chapter": "ALL",
"rules": {
"default": {
"onUse": {
"msg": "!PASSAGE-Examine lift"
},
"onOpen": {
"msg": "!PASSAGE-Examine lift"
}
},
"subsequent": {
"onUse": {
"msg": "It's out of order."
}
}
}
},
{
"location": "Secure Vault",
"ID": 1021,
"name": "trap door",
"status": "default",
"description": "!CUTSCENE-Final Scene",
"chapter": "Night",
"rules": {
"default": {
"onUse": {
"msg": "!CUTSCENE-Final Scene"
},
"onOpen": {
"msg": "!CUTSCENE-Final Scene"
}
}
}
},
{
"ID": 101,
"name": "Old Man",
"location": "Ante Chamber",
"thread": "FRANZ - Main",
"description": "The old man looks pretty bored.",
"chapter": "Day",
"portrait": "franz.png",
"color": "#427059",
"allowTalk": true,
"talkFailMsg": "You try to get his attention but he seems completely zoned out and just ignores you.",
"giveFailMsg": "He's not likely to have any use for it.",
"giveItem": [
{
"ID": 1008,
"msg": "!DIALOGUE(FRANZ - Give Paper)"
},
{
"ID": 1007,
"msg": "You don't want to draw attention to the fact that you have stolen his one working spanner."
},
{
"ID": 1003,
"msg": "He won't appreciate knowing that you've been rummaging in his tool chest."
}
]
}
],
"totalItems": 20,
"totalNPCs": 1
}/* text display settings */
<<set setup.speedMain = "6ms">> /* type macro speed used for commandline, message box and dialogue description */
<<set setup.speedDialogue = "15ms">> /* type macro speed used for dialogue quotation */
<<set setup.delay = "30ms">> /* type macro delay for first dialogue paragraph */
<<set setup.delayNext = "333ms">> /* type macro delay for subsequent paragraphs */
<<set setup.fadeDuration = "600ms">> /* should correspond to var '--fade-duration' in story stylesheet */
<<set setup.typedelay = 500>> /* fast click bug patch - duration that links are blocked after verb is selected*/
/* display setup */
<<set setup.cursor = '<span class="flashing"> ▶</span>'>>
<<set setup.quotemarks = '"'>> /* quote marks for dialogue quotatons, leave as empty string if no quotemarks are desired */
<<set setup.cmdDelay = "0.7s">>
<<set setup.loadDelay = "3.2s">>
/* general vars and settings */
<<set setup.moves = 0>>
<<set $location = {current:"",last:"N/A"}>>
<<set $inventory = []>>
<<set $dialogueWL = []>>
<<set $log = []>>
<<set setup.logComment = "">>
<<set $contLoop = false>>
<<set setup.data = []>>
<<set setup.newline = '<div class="newline"><br></div>'>>
/* initialization */
<<run setup.getLocPassageList()>>
<<run setup.initializeData()>>
<<set $chapter = setup.data.settings.initialChapter>>
<<run setup.initializeJournal()>>
<<set $gameObjectVars = [{name: "NOT FOUND", description: "Item/NPC either doesn't exist or isn't loaded for this Chapter"}]>>
<<run setup.loadPermanentVars()>>
<<run setup.initializeAudio()>>
<<run setup.runInitExec()>>/* CSS applied to MAIN HUB, DIALOGUE and JOURNAL passages */
<style>
body {
background-image: var(--main-background-img);
/*background-color: var(--background-color);*/
animation-name: backgroundAnim;
animation-duration: 8s;
animation-direction: alternate;
animation-iteration-count: infinite;
}
</style>/* You can delete this passage in your release build if you want to prevent players from accessing the Debug Panel and Editor */
<style>
#story {
z-index: 10;
margin: 1em;
}
#passages {
max-width: 100%;
}
a {
color: black;
}
body {
background-color: #5199ad;
color:black;
font-family: monospace;
font-weight: bold;
font-size: 18px;
}
.whiteText {
color: white;
}
.midText {
color: #325c69;
}
.passage {
transition: none;
}
.macro-timed-insert {
transition: none;
}
.icons {
font-size: 27px;
}
input[type="checkbox"], input[type="radio"] {
box-sizing: border-box;
padding-top: 1em;
margin-top: 0.5em;
}
input, select, textarea {
color: #eee;
background-color: #3e7382;
border: 1px solid #444;
padding: .4em;
position: var(--editor-position);
left: var(--editor-input-indent);
margin-top: -.25em;
}
.macro-textarea {
width: 60%;
}
.smallTextArea .macro-textarea {
height: 4em;
}
.largeTextArea .macro-textarea {
height: 8em;
}
#ui-dialog-title {
color: black;
background-color: #3e7382;
}
#ui-dialog-body {
color: black;
background-color: #5199ad;
}
</style>
<<if setup.restore == undefined>>
<<run setup.convertData()>>
<<run setup.processPath()>>
<<else>>
<<set _items = clone(setup.initialState.items)>>
<<set _npcs = clone(setup.initialState.npcs)>>
<<set _settings = clone(setup.initialState.settings)>>
<<set _currentSection = setup.restore.currentSection>>
<<set _targetIndex = setup.restore.targetIndex>>
<<set _ruleKey = setup.restore.ruleKey>>
<</if>>
<<run setup.defineFields()>>
<<set _sections = {
EDITOR:
`<<set _date = new Date(setup.data.meta.timestamp)>>
<<done>><<run setup.showIssues()>><</done>>
Dataset for story title <span class="midText">"<<= setup.data.meta.title>>"</span>?nl
The current dataset was complied on <span class="midText">_date</span>
using VIBAE version <span class="midText"><<= setup.data.meta.version>></span>?nl
The currently running VIBAE instance is version <span class="midText"><<= setup.version>></span>
<div id="issues"></div>`,
SETTINGS:
`<<run setup.setCssVar('--editor-position', 'absolute')>>
<<run setup.setCssVar('--editor-input-indent', '42em')>>
<label>''//include the journal mechanic?//''
<<checkbox "_settings.journal" false true autocheck>></label>?nl
''//Logo : //'' <<textbox "_settings.logo" _settings.logo>>?nl
''//Path for NPC portraits : //'' <<textbox "_settings.pathPortraits" _settings.pathPortraits>>?nl
''// Maximum inventory slots : //'' <<numberbox "_settings.invMaxSlots" _settings.invMaxSlots>><hr>
__''//Chapters ://''__?nl
''//Opening chapter : //''
<<set _chapterList = Object.keys(_settings.chapters)>>
<<listbox "_settings.initialChapter" autoselect>>
<<optionsfrom _chapterList>>
<</listbox>>?nl
<<for _i = 0; _i < _chapterList.length; _i++>>
<<capture _i>>
<<= _chapterList[_i]>>
<<link "-EDIT">>
<<set _index = _i>>
<<run Dialog.setup("Edit Chapter")>>
<<run Dialog.wiki(' <<unset _chapter, _exec, _track>>
<<set _startLocation = $chapters[_index].startLocation>>
CHAPTER TITLE : <<textbox "_chapter" $chapters[_index].chapter>><br>
STARTING LOCATION :
<<set _locList = setup.compileList("locations")>>
<<listbox "_startLocation" autoselect>>
<<optionsfrom _locList>>
<</listbox>><br>
EXEC :<br><<textarea "_exec" $chapters[_index].exec>><br>
TRACK : <<textbox "_track" $chapters[_index].track>><br>
<<button "confirm">>
<<if _chapter != $chapters[_index].chapter && _chapterList.includes(_chapter)>>
<<run alert("A chapter already exists with that title!");>>
<<else>>
<<set $chapters[_index] = {chapter:_chapter,startLocation:_startLocation,exec:_exec,track:_track}>>
<<goto "EDITOR">>
<<run Dialog.close()>>
<</if>>
<</button>>')>>
<<run Dialog.open()>>
<</link>>
<<if _chapterList.length > 1>>
<<link " -DELETE">>
<<run setup.confirmDelete('chapter', _i)>>
<</link>>
<</if>>
<</capture>><br>
<</for>> ?nl
<<link "-ADD CHAPTER">>
<<run Dialog.setup("Add Chapter")>>
<<run Dialog.wiki(' <<unset _chapter, _startLocation, _exec, _track>>
CHAPTER TITLE : <<textbox "_chapter" "New Chapter">><br>
STARTING LOCATION :
<<set _locList = setup.compileList("locations")>>
<<listbox "_startLocation" autoselect>>
<<optionsfrom _locList>>
<</listbox>><br>
EXEC :<br><<textarea "_exec" undefined>><br>
TRACK : <<textbox "_track" undefined>><br>
<<button "confirm">>
<<if _chapterList.includes(_chapter)>>
<<run alert("A chapter already exists with that title!")>>
<<else>>
<<set $chapters.push({chapter: _chapter, startLocation: _startLocation, exec: _exec, track: _track})>>
<<goto "EDITOR">>
<<run Dialog.close()>>
<</if>>
<</button>>')>>
<<run Dialog.open()>>
<</link>>
<hr>
__''//Audio tracks ://''__?nl
''//Path for audio files : //'' <<textbox "_settings.audioPath" _settings.audioPath>>?nl
<<if $trackList == undefined>><<set $trackList = setup.compileList('tracks')>><</if>>
<<for _i = 0; _i < $trackList.length; _i++>>
<<capture _i>>
$trackList[_i].name - $trackList[_i].file
<<link "-EDIT">>
<<set _index = _i>>
<<run Dialog.setup("Edit Track")>>
<<run Dialog.wiki('TRACK NAME : <<textbox "_trackName" $trackList[_index].name>><br>
FILE : <<textbox "_trackFile" $trackList[_index].file>><br>
<<button "confirm">>
<<if $trackList != $trackList[_index].name && $trackList.includes(_trackName)>>
<<run alert("A track already exists with that name!");>>
<<else>>
<<set $trackList[_i] = {name: _trackName, file: _trackFile}>>
<<goto "EDITOR">>
<<run Dialog.close()>>
<</if>>
<</button>>')>>
<<run Dialog.open()>>
<</link>>
<<link " -DELETE">><<run setup.confirmDelete('track', _i)>><</link>><br>
<</capture>>
<</for>> ?nl
<<link "-ADD TRACK">>
<<run Dialog.setup("Add Track")>>
<<run Dialog.wiki('TRACK NAME : <<textbox "_trackName" "New Track">><br>
FILE : <<textbox "_trackFile" $setupAudioPath>><br>
<<button "confirm">>
<<if $trackList.includes(_trackName)>>
<<run alert("A track already exists with that name!")>>
<<else>>
<<set $trackList.push({name: _trackName, file: _trackFile})>>
<<goto "EDITOR">>
<<run Dialog.close()>>
<</if>>
<</button>>')>>
<<run Dialog.open()>>
<</link>></br>
`,
VERBS:
`<div id="verbList"></div>
<<done>><<run setup.showVerbList()>><</done>>
`,
ITEMS:
`<<run setup.setCssVar('--editor-position', 'static')>>
<<run setup.setCssVar('--editor-input-indent', '0em')>>
<<button "NEW ITEM">><<set _currentSection = "NEW ITEM">><<run setup.updateEditorDisplay()>><</button>><hr>
<span id="itemList"><<= setup.getObjectLinks()>></span>
`,
NPCS:
`<<button "NEW NPC">><<set _currentSection = "NEW NPC">><<run setup.updateEditorDisplay()>><</button>><hr>
<span id="npcList"><<= setup.getObjectLinks()>></span>
`,
'NEW ITEM':
`
<<set _newGameObject = {location:"none"}>>
<<set _newGameObject.ID = setup.getNextID('item')>>
<<done>>
<<run setup.checkLocationBox()>>
<<run locBox.addEventListener("click", setup.checkLocationBox)>>
<<run navpanel.addEventListener("click", setup.updateLocation)>>
<</done>>
''//NAME://''<br>
<<textbox "_newGameObject.name" "new item">><br>
''//LOCATION://''<br>
<<= setup.showLocationBox()>><br>
''//INITIAL STATUS://''<br>
<<textbox "_newGameObject.status" "default">><br>
''//DESCRIPTION://'' ?tooltip-description
<<textarea "_newGameObject.description" "You see ~an item~.">><br>
''//CHAPTER://''<br>
<<set _chapterList = setup.compileList('chapters')>>
<<listbox "_newGameObject.chapter" autoselect>>
<<optionsfrom _chapterList>>
<</listbox>><hr>
<<button "ACCEPT">><<run setup.addNewGameObject('ITEMS')>><</button>>
`,
'EDIT ITEM':
`
<<run setup.setCssVar('--editor-position', 'static')>>
<<run setup.setCssVar('--editor-input-indent', '0em')>>
<<done>>
<<run setup.checkLocationBox()>>
<<run locBox.addEventListener("click", setup.checkLocationBox)>>
<<run navpanel.addEventListener("click", setup.updateLocation)>>
<</done>>
<<button "DELETE ITEM">><<run setup.confirmDelete('item')>><</button>><hr>
''//NAME://''<br>
<<textbox "_items[_targetIndex].name" _items[_targetIndex].name>><br>
''//LOCATION://''<br>
<<= setup.showLocationBox()>><br>
''//INITIAL STATUS://''<br>
<<= setup.showStatusBox()>><br>
''//DESCRIPTION://'' ?tooltip-description
<<textarea "_items[_targetIndex].description" _items[_targetIndex].description>><br>
''//CHAPTER://''<br>
<<set _chapterList = setup.compileList('chapters')>>
<<listbox "_items[_targetIndex].chapter" autoselect>>
<<optionsfrom _chapterList>>
<</listbox>><hr>
<<set _navList = setup.getNavList(_items[_targetIndex].ID)>>
<<if _navList.length > 0>>
''<u>NAVIGATION ITEM</u>'' - <label>''//Use link text instead of name? //''<<checkbox "_items[_targetIndex].useLinkText" false true autocheck>></label><br>
<<for _i = 0; _i < _navList.length; _i++>>
''//_navList[_i].location//'' => _navList[_i].destinations<br>
<</for>><hr>
<</if>>
<<= setup.showContainedList()>>
<<if _items[_targetIndex].rules != null>>
''<u>RULES</u> - //This item has the following rules://'' ?nl
<<= setup.showRulesList()>>?nl
<<else>>
''<u>RULES</u> - //This item has no rules//'' ?nl
<</if>>
<<button "ADD RULE">><<run setup.displayNewRule()>><</button>>
`,
'EDIT RULE':
`<<set _editRule = setup.displayRules()>>
<<button "DELETE RULE">><<run setup.confirmDelete('rule')>><</button>><hr>
_editRule
<<done>>
<<run navpanel.addEventListener("click", setup.deleteEmptyFields)>>
<<run setup.processRules()>>
<</done>>
`,
'NEW NPC':
`
<<set _newGameObject = {location:"none"}>>
<<set _newGameObject.ID = setup.getNextID('npc')>>
''//NAME://''<br>
<<textbox "_newGameObject.name" "new NPC">><br>
''//LOCATION://''<br>
<<= setup.showLocationBox()>><br>
''//INITIAL THREAD://''<br>
<<= setup.showThreadBox()>><br>
<label>''//INITIAL TALK TO ALLOWED? //''
<<checkbox "_newGameObject.allowTalk" false true checked>></label><br>
''//DESCRIPTION://'' ?tooltip-description
<span class="smallTextArea"><<textarea "_newGameObject.description" "You see ~NPC name~.">></span><br>
''//CHAPTER://''<br>
<<set _chapterList = setup.compileList('chapters')>>
<<listbox "_newGameObject.chapter" autoselect>>
<<optionsfrom _chapterList>>
<</listbox>><br>
''//PORTRAIT://''<br>
<<textbox "_newGameObject.portrait" _newGameObject.portrait>><br>
''//COLOR://''<br>
<<textbox "_newGameObject.portrait.color" "white">><hr>
<<button "ACCEPT">><<run setup.addNewGameObject('NPCS')>><</button>>
`,
'EDIT NPC':
`
<<button "DELETE NPC">><<run setup.confirmDelete('npc')>><</button>><hr>
''//NAME://''<br>
<<textbox "_npcs[_targetIndex].name" _npcs[_targetIndex].name>><br>
''//PORTRAIT://''<br>
<<textbox "_npcs[_targetIndex].portrait" _npcs[_targetIndex].portrait>><br>
''//COLOR://''<br>
<<textbox "_npcs[_targetIndex].color" _npcs[_targetIndex].color>><br>
''//LOCATION://''<br>
<<= setup.showLocationBox()>><br>
''//INITIAL THREAD://''<br>
<<= setup.showThreadBox()>><br>
<label>''//INITIAL TALK TO ALLOWED? //''
<<checkbox "_npcs[_targetIndex].allowTalk" false true autocheck>></label><br>
''//DESCRIPTION://'' ?tooltip-description
<span class="smallTextArea"><<textarea "_npcs[_targetIndex].description" _npcs[_targetIndex].description>></span><br>
''//CHAPTER://''<br>
<<set _chapterList = setup.compileList('chapters')>>
<<listbox "_npcs[_targetIndex].chapter" autoselect>>
<<optionsfrom _chapterList>>
<</listbox>><br>
<<= setup.displayGiveItemInteractions()>>
`}>>
<div id="navpanel" class="sidenav">
<<= setup.getTopLeftButtons()>>
<div id="nav-tree" class="nav-tree">
<<= setup.displayNavigationTree()>>
</div>
</div>
<div id="main-panel" class="editor-main"></div>
<<done>><<run setup.updateEditorDisplay()>><</done>>You awaken on a stone floor in a large square room. You are don't think you have broken anything in the fall but it takes a few moments for the pain to subside enough that you feel like moving again. As you lie there looking upwards you can see nothing but a solid vaulted ceiling in the gloom above. ?nl
You finally gather the will to get up. Before you can get your bearings you hear something shifting about and the clattering of tools. You look across the room and see a small figure hunched over a box. Suddenly they stop what they are doing and turn towards you...
<<clickToContinue>>
<<openDialogue 101 "FRANZ - Intro" noDelay>>
<</clickToContinue>>
<<set $location.current = "Ante Chamber">>
<<quote DESC WAIT>>
It is an old man is dressed in a grubby blue overall. His small tired eyes peer at you, his face an expression a mild annoyance and weariness...
<</quote>>
<<quote WAIT REPLACE>>
Ha! Look what the cat dragged in. So you've finally decided to move your lazy carcass, eh? Well some of us have to work to do so I'd appreciate it if you kept the noise down.
<</quote>>
<<quote DESC WAIT REPLACE>>
After a short while sifting though his tool chest he appears to give up looking for whatever it is he was looking for and with a loud sigh walks over to a wooden chair in the corner of the room and plonks himself down, muttering to himself...
<</quote>>
<<quote>>
I wait and I wait all this time but still they never supply the right equipment. How am I supposed to fix anything? Hmph.
<</quote>>
<<response clickToExit>>
<</response>><<addJournalEntry "Lost somewhere below">>
You are in a large room roughly square in shape. The room is mostly empty apart from a few unremarkable rickety looking chairs positioned seemingly at random around the space.
<<place 1004>>
?nl Up against one of the walls is an old battered ~tool chest.~
<</place>>
<<place 1020>>
Next to that are what appears to be the doors to an ~elevator~.
<</place>>
<<place 101>>
?nl The ~old man~ is sat down in one of the chairs at the corner of the room.
<</place>>
<<place 1010>>
?nl There is a ~skeleton~ sat in in a chair in the corner of the room.
<</place>>
<<if $chapter == "Night">>
<<set _insert1 = "Pale starlight illuminates">>
<<else>>
<<set _insert1 = "Daylight floods in through">>
<</if>>
<<navigation>>
*W[[Hedge Maze Entrance]]
<!BEFORE> You can make out a pathway beyond and some dense vegetation. </!>
<!AFTER> It is the entrance to what appears to be some sort of hedge maze. </!>
?nl _insert1 a low ~archway~ on one wall.
*1005[[Secure Vault]]
On the wall opposite there is a ~door.~
<</navigation>><<if $chapter == "Day">>
<<describe FIRST FROM "Ante Chamber">>
You step out into the daylight to find yourself hemmed in by two high, dense hedges. The sky above is overcast and tinged pink by the glow of a low sun. Whether it is dawn or dusk you have no way of telling.<</describe>>
<<set _insert1 = "daylight">>
<<set _insert2 = "You retrace your steps back to the T-junction by the archway.">>
<<else>>
<<set _insert1 = "starlight">>
<<set _insert2 = "You arrive at a junction where a short path branches off the the left and terminates at a low arch.">>
<</if>>
<<describe SUBS FROM "Ante Chamber">>
You step out into the _insert1 to find yourself hemmed in by two high, dense hedges.<</describe>>
<<describe FROM "Hedge Maze North">><<= _insert2>><</describe>>
<<describe FROM "Hedge Maze South B1">><<= _insert2>><</describe>>
<<navigation>>
*N[[Hedge Maze North]]
<!AFTER> It leads to the clearing; a dead end.</!>
FROM{Ante Chamber}
?nl A short distance in front of you there is a T-junction. You can take the ~path to the right~
FROM{Hedge Maze North}
?nl From here you can return along to the ~path behind you~ to the clearing
FROM{Hedge Maze South B1}
?nl The ~path in front~ of you winds off into the foliage,
*S[[Hedge Maze South B1]]
<!AFTER> It leads to a rather uninvitingly narrow gap in the hedge.</!>
FROM{Ante Chamber}
or the ~path to the left.~
FROM{Hedge Maze North}
or continue straight ahead along the ~path in front of you.~
FROM{Hedge Maze South B1}
Alternatively you can return back down the ~path you came from.~
*E[[Ante Chamber]]
<!EXAM> It's the way back to the Ante Chamber. </!>
?nl The only other place to go is through the ~archway.~
<</navigation>>
You step cautiously into the gloomy space. It is hard to make out much at first. It seems to be a large storage room of some kind. Dusty crates lie stacked against the walls and in between racks containing a myriad of clutter.
<<place 1021>> ?nl As you eyes adjust to the dark you can see a step ladder towards the far end of the room, above which there is a ~trap door~ in the timber ceiling. Faint beams of light emanate from the gaps around the trap door.
?nl You can hear a steady rhythmic thumping coming from somewhere above.<</place>><style>
body {
background-image: var(--main-background-img);
background-color: black;
}
.winscreen {
text-align: center;
font-size: 25px;
color: lightslategrey;
}
.score {
max-width: 50vw;
margin: auto;
text-align: center;
padding: 10px;
font-size: 25px;
background-color: lightslategrey;
color: black;
}
</style>
<div class="winscreen">
<br><h0>THE MAMERTINE </h0><h1>by K Vella</h1>
Created using the Verb Interface Based Adventure Engine<br>
https://kvella.itch.io/vibae
<br><br>
Sounds by FOM ?nl
Images by K Vella except for 'Homeless and forgotten old man in Argentina' by
Rodrigo Butta (Public Domain)<br>https://www.flickr.com/photos/photobutta/
?nl
With special thanks to Will Merrow-Smith for playtesting <br>
</div>
<br><br>
<div class="score">
<<if $leverCount == undefined>>
So you were completely incurious about the lever, eh? <br>
RATING: //Captain Oblivious//
<<elseif $leverCount == 0>>
You fixed the lever but thought better of using it? Very sensible.<br>
RATING: //Not Off Yer Nut//
<<elseif $leverCount == 1>>
Number of lever pulls: $leverCount <br>
RATING: //Curious//
<<elseif $leverCount == 2>>
Number of lever pulls: $leverCount <br>
RATING: //Plausible Deniability//
<<else>>
Number of lever pulls: $leverCount <br>
RATING: //Psychopath//
<</if>>
<br><<button "Restart">><<script>>Engine.restart()<</script>><</button>>
</div>
<<if $DEBUG == true>>\
<span id="debug"><<include DEBUG>></span><</if>>\<<if setup.leverMessage == undefined>>
<<include "Brian's lever">>
<</if>>
<<describe FROM "Hedge Maze Entrance">>
After following the path though a few twists and turns it widens out into a small circular clearing.<</describe>>
<<describe Night FROM "Corridor">>
You awake with a start. You look down at your hand expecting the worse but lying in your palm where the orb was you are clutching a rather ordinary looking brass key and your hand seems to be unscathed. ?nl
You look around and find yourself to be in a small circular clearing surrounded on all sides by a high hedge.
<</describe>>
<<if $chapter == "Day">>
<<place 1002>>
In the middle of this space is a ~lever.~<</place>>
<<else>>
<<place 1002>>
In the middle of this space there is the twisted stub of a ~lever.~<</place>>
<</if>>
<<place 1009>>
?nl A large ~fallen branch~ lies across the far side of the clearing.
<</place>>
<<navigation>>
*S[[Hedge Maze Entrance]]
<!EXAM> With no way forward you are going to have to retrace your steps back to the junction. </!>
FROM{Hedge Maze Entrance}
?nl The only apparent exit from here is ~back the way you came~.
FROM{Corridor}
?nl There is a single ~path~ leading out of the clearing.
<</navigation>><<if $chapter == "Night">>
After following the path for what seems like several minutes you come to a dead end where the gap in the hedge was.
<<navigation>>
*N[[Hedge Maze Entrance]]
<!EXAM> It's the way you came from. </!>
Your only choice now is to turn ~back.~
<</navigation>>
<<else>>
After following the path for what seems like several minutes you come to a narrowing. You think you should be able to just about squeeze though the gap. ?nl
<<navigation>>
*N[[Hedge Maze Entrance]]
<!EXAM> It's the way you came from. </!>
Do you turn ~back ~
*S[[Transition to Elephant Room]]
<!NAME> narrow gap </!>
<!EXAM> It is going to be a tight squeeze. </!>
or push on ~through?~
<</navigation>>
<</if>><<edit 1004 status "unlocked">>
<<set $track = "cheynestoking">>
You push your way though the gap in the hedge until you strike something solid in the darkness within. It is what feels like a solid stone or concrete wall but from about waist height downwards you can feel an opening. Hunched over you shuffle through, trying to avoid the rough material scraping along your back. ?nl
You emerge from the hole and stand upright. Immediately there is a loud rumbling from behind. You tense up anticipating the worst, a collapse maybe. The collapse however never comes and gradually the rumbling ceases and a feeble light starts to glow from the corner of the room...
<<clickToContinue>>
<<moveTo "[[Elephant Room]]">>
<<audio ":playing" fadeout>>
<<audio $track play loop>>
<</clickToContinue>><<describe>>You are in a dimly lit windowless room littered with broken furniture. It looks as if a herd of elephants has been on the rampage through here. ?nl <</describe>>
<<describe FIRST>>
You look behind you but there is nothing but a blank wall where you came in from.
<</describe>>
<<describe>>Upon the wall in large letters somebody has crudely daubed the words //'Cheyne Stoking'// in black paint.<</describe>>
<<place 1011>>
?nl On another wall there is a ~poster.~
<</place>>
<<navigation>>
*S[[Hedge Maze South A3]]
<!NAME>right-hand doorway</!>
<!EXAM>It certainly appears to be the more inviting option.</!>
Next to the poster there is a ~doorway~ through which a faint, pale light glows.
*SE[[Draughty Cave from Elephant Room]]
<!NAME>left-hand doorway</!>
<!EXAM>It's very dark. You can't see much of anything in there.</!>
Further along the wall to the left of that is ~another doorway~ with darkness immediately beyond.
<</navigation>>You step out into another gravel pathway flanked by tall hedges. There is no daylight here though, the path ahead is illuminated by the light of the stars in the frigid night sky above you.
The path sweeps gently around to the left for several dozen paces until you reach a sudden sharp bend to the right.
?nl Upon rounding this corner you immediately come to a fork.
<<navigation>>
*1018[[Hedge Maze South B4]]
One path continues roughly ~straight ahead ~
*E[[Draughty Cave from Hedge Maze]]
<!EXAM> The path winds away a short distance in so you cannot see very far along it from here. </!>
and the other disappears off to your ~left.~
*N[[Elephant Room]]
<!EXAM> You wonder if you should go back and try another way. </!>
Alternatively you can go ~back.~
<</navigation>><<place 1013>>
?nl You land with a thump in the middle of a small, dimly lit, ~rough hewn chamber.~ Cool air wafts in from two small openings in the rock face at one end. The openings are big enough to pass through if you crouch. ?nl There is no other way out of here.<</place>>
<<navigation>>
*1019[[Hedge Maze South B4]]
You must choose either the opening to the ~right ~
*SE[[Tight Hole]]
<!NAME>left-hand tunnel</!>
<!EXAM>Peering in you can see rough walls stretching off into the gloom.</!>
or the one to the ~left~.
<</navigation>>The writing is small and slightly jumbled but you can make out the following... ?nl
<p style="margin-left: 40px">
//By the Jack's son and the Living Stone,<br>
their law be turn'd upon it's head,<br>
by sinister turn one shall pass,<br>
and leave behind the righteous dead<br>//
</p>
<<clickToContinue exitContainer>>
<<addJournalEntry "Found scrawlings">>
<</clickToContinue>>I found this verse scrawled on the wall in the room full of smashed furniture:
<p style="margin-left: 40px">
//By the Jack's son and the Living Stone,<br>
their law be turn'd upon it's head,<br>
by sinister turn one shall pass,<br>
and leave behind the righteous dead//</p><<set setup.leverMessage = ["", "You throw the lever forwards and from somewhere distant you hear a short scream. You hope it is some kind of co-incidence.", "Against your better judgement you pull the lever back and again you hear someone scream, only this time a bit more drawn out.", "You push the lever forwards but this time there is only silence...", "Moving the lever seems to have no further effect."]>><<audio ":playing" fadeout>>
<<if $location.last == "Hedge Maze South A3">>
<<edit 1018 status "has died from Hedge Maze">>
<<else>>
<<edit 1018 status "has died from Draughty Cave">>
<</if>>
<<edit 1019 status "hasDied">>
<<edit 1019 description "You bend down and peer into the opening. A short distance into the rocky tunnel the roof appears to have collapsed, blocking the way with rubble.">>
<<describe FROM "Hedge Maze South A3">>
As you make you way down the path the hedges either side become increasingly unruly and bend inwards overhead, eventually forcing you to crouch and then to crawl underneath it.<</describe>>
<<describe FROM "Draughty Cave">>
You crouch you way along the low tunnel only to find at the other side the vegetation is so dense the only way onward is by crawling underneath it.<</describe>>
<<describe>>?nl There is a cracking and rustling starting to arise from all around you and to your horror you realise the vegetation is moving, closing in on you. You try to turn around but there is no room left.
?nl Spiny branches entangle your limbs and press you into the ground. The process of being turned into mulch is a long one and you have much time to reflect on what choices bought you to this bad end...<</describe>>
<<clickToContinue>>
<<goto [[Death]]>>
<</clickToContinue>><<set $timer = 0>>
<<set $stage = 0>>
You crawl a short way into the hole before coming to a steep vertical section. It is narrow enough that with much effort and a couple of near slips you eventually manage to shimmy you way up the jagged rocks to the top whereby you are able clamber out of the hole. You swear you are not going to repeat that experience in a hurry.
<<clickToContinue>>
<<moveTo "[[Shrine]]">>
<</clickToContinue>>
<<audio "death" play>>
<style>
body {background-image: none}
.deathscreen {
animation-name: death;
animation-duration: 4s;
text-align: center;
font-size: 40px;
color: maroon;
}
@keyframes death {
from {opacity: 0;}
to {opacity: 1;}
}
</style>
<div class="deathscreen">
<center><br><img @src="'assets/img/skull.png'" alt="DEATHHEAD" width="400"></center>
YOU DIED
<<timed 2s>><h2><<link "Try again?">><<set setup.fwdCommands = '<<set $location.current = "Saving Throw">><<unset $fadeInterface>><<goto "MAIN HUB">>'>><<goto "Fake Loading Screen">><</link>></h2><</timed>>
</div>You are in a long, narrow chamber lined with rows of benches.
<<place 1014>>
At one end a small round leaded window casts it's multi-hued light upon a tall ~statue.~<</place>>
<<navigation>>
*N[[Corridor]]
<!AFTER> It seemingly leads to a dead end.</!>
?nl There is a ~doorway~ in the wall immediately to the statue's left.
<</navigation>>
<<if $stage == 1>>
<<place 1017>>
?nl You think you can hear a faint clanking coming from the ~hole~ in the floor at the back of the chamber.
<</place>>
<<elseif $stage == 2>>
<<place 1017>>
?nl You hear a loud groan coming from the ~hole~ in the floor.
<</place>>
<<else>>
<<place 1017>>
?nl At the back of the chamber is a small ragged ~hole~ in the floor.
<</place>>
<</if>>
<<set _initialStage = $stage>>
<<if $inventory.includes(1006)>> /* player has key */
You step out into a wood panelled corridor that recedes off into the distance. With nowhere else to go you press ahead hoping to find a way out. After what seems like hours your anxiety starts to rise. This corridor seems to repeat itself endlessly! ?nl
A deep weariness sets in and you decide to sit and rest for a while before you traipse back to the shrine room. In your fitful state you start to dream of a shining orb. The orb glows from a dull yellow to a deep red, and then to a brilliant white. You stomach rumbles, is someone nearby frying bacon? You look down and realise that the small brass orb you are holding is burning its way into the flesh of your hand and despite your panic you are unable to let go...
<<clickToContinue>>
<<chapterStart "Night">>
<</clickToContinue>>
<<else>> /* player doesn't have key */
You step out into a short, wood panneled corridor that terminates at a blank stone wall.
<<place 1015>>In the middle of the wall there is a ~low relief~ carved into it.<</place>>
<<navigation>>
*S[[Shrine]]
<!EXAM>With no apparent way onwards your only choice is to return to the shrine.</!>
There is no place to go from here other than ~back.~
<</navigation>>
<<if _initialStage == $stage>>
<<if $stage < 3>><<set $stage++>><</if>>
<</if>>
<</if>><<edit 1014 name "statue of Ekh">>
The figure is not one you recognise. Although clearly a lifeless object, it has an aspect that shifts in your mind between strikingly beautiful and terrifying, and it becomes more confusing the longer you stare at it. You wonder if the light is playing tricks or you have taken one too many knocks on the head. The phrase 'ooo Ekh' comes unbidden into your mind.Despite being thrown down a well by Cranton's thugs I am not in such bad shape or so it seems.
?nl Is this some kind of oubliette? This place seems a whole lot stranger than that.<<quote>>
Well? What is it now? I thought I told you to keep the noise down.
<</quote>>
<<response>>
*ONCE[[FRANZ - who are you?]] 'Who are you?'
*ONCE[[FRANZ - where are we?]] 'Where are we?'
*WL hasLookedAtElevator[[FRANZ - ask about elevator]] Ask about elevator
*ONCE WL lever[[FRANZ - ask about lever]] Ask about lever
*WL hasNewspaper[[FRANZ - Give Paper]]Offer him the newspaper
*[EXIT] 'Never mind...'
<</response>><<quote DESC WAIT>>
As you bend down to open the tool chest you hear the scrape of a chair and the old man bearing down on you...
<</quote>>
<<quote>>
Hey! Get your hands off of that. It contains expensive and dangerous equipment.
<</quote>>
<<response clickToExit>>
<</response>><<edit 1004 status "unlocked">>
<<removeItem 1008>>
<<edit 101 allowTalk false>>
<<edit 101 description "He seems transfixed by the paper, sometimes muttering under his breath, occasionally letting out a loud, derisive snort.">>
<<quote DESC WAIT>>
The old man eagerly takes the paper from you...
<</quote>>
<<quote REPLACE>>
Well if you don't want it I'll have it then. I am going out of my mind with tedium here.
<</quote>>
<<response clickToExit>>
<</response>><<audio "intro" play>>
<style>
html { cursor: none }
body {
background-color: black;
}
@keyframes fadeOutIntro {
from {color: #eee;}
to {color: transparent;}
}
.fadeout {
animation-name: fadeOutIntro;
animation-duration: 4s;
animation-fill-mode: forwards;
}
#introText {
font-size: 30px;
padding-top: 20px;
margin: 0;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
max-width: 50%;
color: #eee;
overflow: auto;
text-align: center;
vertical-align: center;
}
</style>
<div id="introText"></div>
<<done>>
<<replace #introText t8n>>
You can't say at what point you decided to betray The Master<</replace>>
<<timed 7s>><<replace #introText t8n>>
but sure enough they were going to come for you in the end
<</replace>>
<<next 6s>><<replace #introText t8n>>
You thought you were in safe company for sharing a drink
<</replace>>
<<next 5s>><<replace #introText t8n>>
You have grown so weary of watching your back all the time
<</replace>>
<<next 6s>><<replace #introText t8n>>
and the one time you let your guard down...
<</replace>>
<<next 3s>><<replace #introText>><span class="fadeout">
and the one time you let your guard down...</span>
<</replace>>
<<next 4s>><<replace #introText t8n>>
Consciousness returns
<</replace>>
<<next 4s>><<replace #introText t8n>>
You feel yourself being dragged across a gravelly courtyard
<</replace>>
<<next 5s>><<replace #introText t8n>>
Rough hands grip your arms, you are too weak to resist
<</replace>>
<<next 5s>><<replace #introText t8n>>
The last thing you see are the sneering faces of the two thugs as they lift you up over the parapet and let go...
<</replace>><<audio ":playing" fadeout>>
<<next 4s>><<replace #introText>><span class="fadeout">
The last thing you see are the sneering faces of the two thugs as they lift you up over the parapet and let go...</span>
<</replace>>
<<next 3s>><<set $track = "chapter01">><<audio $track play loop>><<goto "MAIN HUB">><</timed>>
<</done>>
<<quote DESC WAIT>>
The old man seems somewhat taken aback by your question...
<</quote>>
<<quote WAIT>>
It's been a long time since anyone's taken any interest in me or what goes on down here. There is only the rats most of the time. Rats are good people if you ask me, but somewhat lacking in conversation or worldly knowledge. Damn I miss the world... even some news would be good... do you remember... eh... hmph...
<</quote>>
<<quote DESC REPLACE>>
He trails off seemingly in some sort of reverie before letting out a loud guffaw and staring at you with bemusement. This avenue of conversation doesn't seem to be going anywhere.
<</quote>>
<<response>>
*ONCE[[FRANZ - where are we?]] 'Where are we?'
*ONCE WL hasLookedAtElevator[[FRANZ - ask about elevator]] Ask about elevator
*ONCE WL lever[[FRANZ - ask about lever]] Ask about lever
*WL hasNewspaper[[FRANZ - Give Paper]]Offer him the newspaper
*[EXIT] 'Never mind...'
<</response>><<quote WAIT>>
Ha, you must be as green as grass I reckon. Well don't trouble yourself about that. I don't and I haven't done so for a long time. The only way is up, so I'm told, for you and me now. Hmph, now where did I hear that?
<</quote>>
<<quote DESC WAIT>>
The old man furrows his brow as if deep in thought.
<</quote>>
<<quote REPLACE>>
Anyway, I am sure of that, God knows I've had long enough to think about it. But without what we need... I tried sometimes... to get er... to er... hmmm
<</quote>>
<<response>>
*ONCE[[FRANZ - who are you?]] 'Who are you?'
*ONCE WL hasLookedAtElevator[[FRANZ - ask about elevator]] Ask about elevator
*ONCE WL lever[[FRANZ - ask about lever]] Ask about lever
*WL hasNewspaper[[FRANZ - Give Paper]]Offer him the newspaper
*[EXIT] 'Never mind...'
<</response>>The path continues for a short distance before you come to a rocky wall with a large opening cut into it. Seeing no other way to progress you gingerly step into the darkness beyond. A little way in you painfully stub your toe on something hard and stumble forwards. Before you can regain your balance your feet loose contact with the ground completely and you find yourself sliding uncontrollably down a steep incline..
<<clickToContinue>>
<<moveTo "[[Draughty Cave]]">>
<</clickToContinue>>You carefully feel your way into the darkness. You appear to be following a rocky, damp passage. The floor seems to be covered in something soft and slippery like wet moss. All of a sudden the floor dips away and you loose your footing. Before you can recover you are already on your back sliding uncontrollably down a steep incline...
<<clickToContinue>>
<<moveTo "[[Draughty Cave]]">>
<</clickToContinue>><<audio $track fadein>>
You are standing immobile on a large flat plain. Around you are other figures also frozen in place. Some are colourful, a few are a dull uniform matt grey.
?nl Something is looming overhead. It becomes larger and larger, tumbling as it falls. The giant cube contacts the plain with a sharp thud and bounces wildly past, barely missing you.
?nl A thunderous voice yells out from the Heavens... SIX!
?nl A ginormous appendage then suddenly swoops down in front of you. You can make out every ridge on it's surface before it closes in against your face and you feel yourself accelerating skywards...
<<clickToContinue>>
<<moveTo "[[Elephant Room]]">>
<</clickToContinue>><<edit 1020 description "It looks like the lift is not likely to be usable any time soon.">>
<<edit 1020 status "subsequent">>
<<if setup.checkGOvar(101, "allowTalk", true)>>
<<set $execOnClick = "<<openDialogue 101 'FRANZ - Elevator' noDelay>>">>
<</if>>
There is a large, crudely daubed sign taped across the doors of the elevator. It says 'out of commission until further notice'.
?nl Next to it, dangling from the wall, is the control panel for the elevator suspended by a mess of wires. The panel itself is covered in greasy finger prints.
?nl Above the doors is a large dial with three hands, each pointing to the number three.<<set $dialogueWL.push("hasLookedAtElevator")>>
<<quote DESC WAIT>>
As you are contemplating the broken elevator the old man shuffles over...
<</quote>>
<<quote REPLACE WAIT>>
This thing has been the bane of my existence for as long as I can remember...
<</quote>>
<<quote DESC WAIT>>
The old man jabs an oil stained finger at the hole in the wall where the control panel goes.
<</quote>>
<<quote REPLACE>>
It needs a.. er... thingymajig and the right one is never supplied. How are you supposed to do anything without the right equipment, eh?
<</quote>>
<<response>>
*[[FRANZ - ask about equipment]] Ask about equipment
*[[FRANZ - ask about elevator]] Ask about elevator
*[EXIT] 'Nevermind'
<</response>><<edit 1016 status "has compass">>
<<addToInventory 1016>>
<<run $dialogueWL.delete("hasLookedAtElevator")>>
<<quote DESC WAIT>>
The old man looks a bit sheepish...
<</quote>>
<<quote WAIT>>
Oh well there is no point me hanging on to this I suppose...
<</quote>>
<<quote DESC REPLACE WAIT>>
The old man reaches into the large front pocket of his overalls and takes out what looks to be an antique pocket watch. After a hesitating a moment he presses it into your palm, avoiding your eyes, and then shuffles off back to his chair.
<</quote>>
<<quote DESC REPLACE>>
You open the watch to find out that it is in fact a compass. It strikes you as being very familiar but you can't for the moment think why. There are some initials etched into the back: //S.A.//
<</quote>>
<<response clickToExit>>
<</response>><<edit 1006 name "key">>
<<edit 1006 description "It's a small brass key.">>
<<edit 1002 status "broken">>
<<edit 1002 description "The upper part of the lever has been violently wrenched off.">>
<<if setup.checkGOvar(1016, "location", "inventory")>>
<<edit 1016 description "You look at the compass to find that the needle is spinning in random directions making it impossible to take a bearing.">>
<<edit 1016 status "wierd">>
<</if>><<quote DESC WAIT>>
You ask him about the strange lever you found in the hedge maze. The old man looks at you with incredulity as if you had asked him the most stupid question imaginable.
<</quote>>
<<quote REPLACE>>
Levers are not my department so I wouldn't know about that but you wouldn't just go around pulling any old random lever without knowing what it does would you? What if something bad happens? Are you off your nut?
<</quote>>
<<response>>
*ONCE[[FRANZ - who are you?]] 'Who are you?'
*ONCE[[FRANZ - where are we?]] 'Where are we?'
*ONCE WL hasLookedAtElevator[[FRANZ - ask about elevator]] Ask about elevator
*WL hasNewspaper[[FRANZ - Give Paper]]Offer him the newspaper
*[EXIT] 'Never mind...'
<</response>><<quote>>
Believe me I have been here for quite some time working on this problem and if there was a way to get this elevator workking with the tools I have been given I would have done so by now. What, do you think I am stupid? You who have been here all of five minutes...pah...
<</quote>>
<<response>>
*[[FRANZ - ask about elevator]] Ask about elevator
*WL wayout[[FRANZ - ask about way out]] Ask about way out
*[EXIT] 'Nevermind'
<</response>><<set $dialogueWL.push("wayout")>>
<<quote DESC WAIT>>
The old man becomes quite animated gesturing emphatically towards the elevator doors...
<</quote>>
<<quote REPLACE>>
It's the key to is all isn't it? It has to be. The only way is up. Once I finally get it working I will be able to see the boss and our er.. misunderstanding can be all straightened out. I just need to fix the.. er... thingy here.
<</quote>>
<<response>>
*ONCE[[FRANZ - ask about equipment]] Ask about equipment
*[[FRANZ - ask about way out]] Ask about way up
*[EXIT] 'Nevermind'
<</response>><<quote DESC WAIT>>
He looks at you as if you are a bit dense.
<</quote>>
<<quote REPLACE WAIT>>
Yes, up! Of course it's up. What, do you think you are going to find the way out through there?
<</quote>>
<<quote DESC WAIT>>
The old man points over towards the archway. He is starting to become very animated.
<</quote>>
<<quote REPLACE WAIT>>
Well good luck with that. You are not the first supposed assistant they have sent me. Every one of them that has tried to get out through there has never come back. After all this time you think I haven't figured out what is out there? Nothing. That's what.
<</quote>>
<<quote REPLACE>>
You see from what I have figured, there clearly is nothing good or useful out there or why wouldn't somebody have come back to let me know, eh? See I still have faith in the goodness of my fellows though God knows why I should. No... the right thing to do is just stay here and wait. The right equipment will be supplied eventually.
<</quote>>
<<response>>
*[[FRANZ - go and look]] 'Well, I'm not staying here'
*[[FRANZ - lets wait]] humour the old man
<</response>><<quote>>
Well, suit yourself but don't blame me when you get lost. Say, if you were to find any thingymabobs out there that could be useful for fixing this here elevator you will come back won't you? I've been stuck here a long time. You'll come back, eh?
<</quote>>
<<response>>
*[[FRANZ - give compass]] Promise you will return
*[[FRANZ - I'm not coming back]] refuse to promise
<</response>><<run $dialogueWL.delete("hasLookedAtElevator")>>
<<quote DESC WAIT>>
You nod along and allow the old man to finish ranting. You assure him that you won't wander far.
<</quote>>
<<quote>>
Yes, that's right. Don't go chasing er... water fountains or something... We should just all stick to what we used to, that is for the best.
<</quote>>
<<response clickToExit>>
<</response>><<run $dialogueWL.delete("hasLookedAtElevator")>>
<<quote>>
So you are some big adventurer full of piss and vinegar are you? Typical. Well you go then, look out for number one why don't you.
<</quote>>
<<response clickToExit>>
<</response>><style>
@keyframes backgroundAnimFadeout {
from {background-color: #0a1b1c; background-image: var(--main-background-img);}
to {background-color: black; background-image: none;}
}
html { cursor: none }
body {
animation-name: backgroundAnimFadeout;
animation-duration: 4s;
animation-direction: normal;
animation-iteration-count: 1;
}
@keyframes fadeOutIntro {
from {color: #eee;}
to {color: transparent;}
}
@keyframes fadeInIntro {
from {color: transparent;}
to {color: #eee;}
}
.fadein {
animation-name: fadeInIntro;
animation-duration: 4s;
animation-fill-mode: forwards;
}
.fadeout {
animation-name: fadeOutIntro;
animation-duration: 4s;
animation-fill-mode: forwards;
}
#introText {
font-size: 30px;
padding-top: 20px;
margin: 0;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
max-width: 50%;
color: #eee;
overflow: auto;
text-align: center;
vertical-align: center;
}
</style>
<div id="introText"></div>
<<done>>
<<replace #introText t8n>>
<span class="fadein">You creep up the stepladder and press on the trap door</span><</replace>>
<<timed 6s>><<replace #introText t8n>>
it cracks open and warm orange light floods in from the chamber above
<</replace>>
<<next 7s>><<replace #introText t8n>>
You see cloaked figures rhythmically stamping and shuffling around the floor in front of you
<</replace>>
<<next 8s>><<replace #introText t8n>>
In the center of them an imposing bald headed man with his back to you exhorts the dancers on
<</replace>>
<<next 8s>><<replace #introText t8n>>
The dancers reel and stamp in an ever increasing frenzy, shaking dust up from the floor
<</replace>>
<<next 8s>><<replace #introText t8n>>
Then suddenly you feel the weight of a dancer land on the trap door, forcing it down on your head
<</replace>>
<<next 8s>><<replace #introText t8n>>
You lose your balance on the step ladder and with a loud crash fall into a bunch of crates
<</replace>>
<<next 7s>><<replace #introText t8n>>
Everything goes quiet
<</replace>>
<<next 4s>><<replace #introText t8n>>
and with a creak the trapdoor starts to open...
<</replace>>
<<next 3s>><<replace #introText>><span class="fadeout">
and with a creak the trapdoor starts to open again...</span>
<</replace>>
<<next 3s>><<goto "Complete">><</timed>>
<</done>>