\n\n\n{{STORY_NAME}}\n\n\n\n\n{{STORY_DATA}}\n\n\n\n\n","setup": function(){"use strict";var _slicedToArray=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var a=[],r=!0,o=!1,n=void 0;try{for(var i,s=e[Symbol.iterator]();!(r=(i=s.next()).done)&&(a.push(i.value),!t||a.length!==t);r=!0);}catch(e){o=!0,n=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw n}}return a}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function _toArray(e){return Array.isArray(e)?e:Array.from(e)}function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,a=Array(e.length);t-1)||e.cannotFollow&&(-1!==e.cannotFollow.indexOf(a&&a.type)||e.cannotFollow.indexOf("text")>-1&&r)||e.peek&&e.peek.toLowerCase()!==t.slice(0,e.peek.length).toLowerCase())}function n(e){for(var a=e.innerText,r=[],n=0,s=n,c=a.length,l=null;n-1&&(f=r.length-1)}if(f>=r.length&&!b.isFront)continue}s0;)r.shift().demote();return e}function i(e,t,a){var o=e.children.indexOf(t),n=e.children.indexOf(a);t.children=e.children.splice(n+1,o-(n+1)),t.children.forEach(function(e){r(t,e)}),t.type=t.matches[a.type],t.innerText="";for(var i=0,s=t.children.length;i=this.end)return null;if(this.childAt)return this.childAt[e]&&this.childAt[e].tokenAt(e)||this;if(this.children.length)for(var t=0;t=this.end)return[];if(this.childAt)return(this.childAt[e]&&this.childAt[e].pathAt(e)||[]).concat(this);var t=[];if(this.children.length)for(var a=0;a=this.end?null:this.children?this.children.reduce(function(t,a){return t||(e>=a.start&&e0&&(e+="["+this.children+"]"),e}},e={lex:function(t,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"start";return n(new a({type:"root",start:r||0,end:t.length,text:t,innerText:t,children:[],childAt:{},innerMode:e.modes[o]}))},rules:t,modes:{}},"object"===("undefined"==typeof module?"undefined":_typeof(module))?module.exports=e:"function"==typeof define&&define.amd?define("lexer",[],function(){return e}):this&&this.loaded?(this.modules||(this.modules={}),this.modules.Lexer=e):this.TwineLexer=e}).call(eval("this")||("undefined"!=typeof global?global:window)),function(){var e;function t(e){return e&&"object"===(void 0===e?"undefined":_typeof(e))?(Object.keys(e).forEach(function(a){e[a]=t(e[a])}),e):(e+"").replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}function a(e){return function(){return"("+e+Array.apply(0,arguments).join("|")+")"}}var r=a("?:"),o=a("?!"),n=a("?="),i="[ \\f\\t\\v\\u00a0\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000]*",s=i.replace("*","+"),c="\\b",l="[\\w\\-\\u00c0-\\u00de\\u00df-\\u00ff\\u0150\\u0170\\u0151\\u0171\\uD800-\\uDFFF]",h=l.replace("\\-",""),d=r("\\n","$"),u=i+"(\\*+)"+s,m=i+"((?:0\\.)+)"+s,p=i+"-{3,}"+i+d,g=i+"(==+>|<=+|=+><=+|<==+>)"+i+d,b=i+"(=+\\|+|\\|+=+|=+\\|+=+|\\|=+\\|)"+i+d,y={opener:"\\[\\[(?!\\[)",text:"("+function(){return"[^"+Array.apply(0,arguments).map(t).join("")+"]*"}("]")+")",rightSeparator:r("\\->","\\|"),leftSeparator:"<\\-",closer:"\\]\\]",legacySeparator:"\\|",legacyText:"("+r("[^\\|\\]]","\\]"+o("\\]"))+"+)"},f=h+"*"+h.replace("\\w","a-zA-Z")+h+"*",v="\\$("+f+")",k="_("+f+")",w="'s"+s+"("+f+")",x="("+f+")"+s+"of"+c+o("it\\b"),T="'s"+s,C=r("it","time","visits?","exits?","pos")+c,S="its"+s+"("+f+")",A="its"+s,N="("+f+")"+s+"of"+s+"it"+c,_="of\\b"+s+"it"+c,O={opener:"\\(",name:"("+r("\\$","_")+"?"+l+"+):"+o("\\/"),closer:"\\)"},L=r("=<","=>","[gl]te?\\b","n?eq\\b","isnot\\b","are\\b","x\\b","isa\\b","or"+s+"a"+c),E="[a-zA-Z][\\w\\-]*",F="(?:\"[^\"]*\"|'[^']*'|[^'\">])*?",P="\\|("+l+"+)(>|\\))",I="(<|\\()("+l+"+)\\|",H="\\b(\\d+(?:\\.\\d+)?(?:[eE][+\\-]?\\d+)?)"+o("m?s")+c;y.main=y.opener+r(y.text+y.rightSeparator,y.text.replace("*","*?")+y.leftSeparator)+y.text,e={upperLetter:"[A-Z\\u00c0-\\u00de\\u0150\\u0170]",lowerLetter:"[a-z0-9_\\-\\u00df-\\u00ff\\u0151\\u0171]",anyLetter:l,anyLetterStrict:h,whitespace:s.replace("[","[\\n\\r"),escapedLine:"\\\\\\n\\\\?|\\n\\\\",br:"\\n(?!\\\\)",commentFront:"\x3c!--",commentBack:"--\x3e",tag:"<\\/?"+E+F+">",tagPeek:"<",scriptStyleTag:"<("+r("script","style","textarea")+")"+F+">[^]*?<\\/\\1>",scriptStyleTagOpener:"<",url:"("+r("https?","mailto","javascript","ftp","data")+":\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])",bullet:"\\*",hr:p,heading:"[ \\f\\t\\v\\u00a0\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000]*(#{1,6})[ \\f\\t\\v\\u00a0\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000]*",align:g,column:b,bulleted:u,numbered:m,strikeOpener:t("~~"),italicOpener:t("//"),boldOpener:t("''"),supOpener:t("^^"),strongFront:t("**"),strongBack:t("**"),emFront:t("*"),emBack:t("*"),verbatimOpener:"`+",collapsedFront:"{",collapsedBack:"}",hookAppendedFront:"\\["+o("=+"),hookPrependedFront:P+"\\["+o("=+"),hookFront:"\\["+o("=+"),hookBack:"\\]"+o(I),hookAppendedBack:"\\]"+I,unclosedHook:"\\[=+",unclosedHookPrepended:P+"\\[=+",unclosedCollapsed:"\\{=+",passageLink:y.main+y.closer,passageLinkPeek:"[[",legacyLink:y.opener+y.legacyText+y.legacySeparator+y.legacyText+y.closer,legacyLinkPeek:"[[",simpleLink:y.opener+y.legacyText+y.closer,simpleLinkPeek:"[[",macroFront:O.opener+n(O.name),macroFrontPeek:"(",macroName:O.name,groupingFront:"\\("+o(O.name),groupingFrontPeek:"(",groupingBack:"\\)",twine1Macro:"<<[^>\\s]+\\s*(?:\\\\.|'(?:[^'\\\\]*\\\\.)*[^'\\\\]*'|\"(?:[^\"\\\\]*\\\\.)*[^\"\\\\]*\"|[^'\"\\\\>]|>(?!>))*>>",twine1MacroPeek:"<<",validPropertyName:f,property:w,propertyPeek:"'s",belongingProperty:x,possessiveOperator:T,belongingOperator:"of\\b",belongingOperatorPeek:"of",itsOperator:A,itsOperatorPeek:"its",belongingItOperator:_,belongingItOperatorPeek:"of",variable:v,variablePeek:"$",tempVariable:k,tempVariablePeek:"_",hookName:"\\?("+l+"+)\\b",hookNamePeek:"?",cssTime:"(\\d+\\.?\\d*|\\d*\\.?\\d+)(m?s)\\b",colour:r(r("Red","Orange","Yellow","Lime","Green","Cyan","Aqua","Blue","Navy","Purple","Fuchsia","Magenta","White","Gray","Grey","Black","Transparent"),"#[\\dA-Fa-f]{3}(?:[\\dA-Fa-f]{3})?"),datatype:r("alnum","alphanumeric","any(?:case)?","array","bool(?:ean)?","changer","colou?r","const","command","dm","data"+r("map","type","set"),"ds","digit","gradient","empty","even","int"+o("o")+"(?:eger)?","lambda","lowercase","macro","linebreak","num(?:ber)?","odd","str(?:ing)?","uppercase","whitespace")+c,number:H,boolean:r("true","false")+c,identifier:C,itsProperty:S,itsPropertyPeek:"its",belongingItProperty:N,escapedStringChar:"\\\\[^\\n]",singleStringOpener:"'",doubleStringOpener:'"',singleStringCloser:"'",doubleStringCloser:'"',is:"is"+o(s+"not"+c,s+"an?"+c,s+"in"+c,s+"<",s+">")+c,isNot:"is"+s+"not"+o(s+r("an?","in")+c)+c,isA:"is"+s+"an?"+c,isNotA:"is"+s+"not"+s+"an?"+c,matches:"matches\\b",doesNotMatch:"does"+s+"not"+s+"match"+c,and:"and\\b",or:"or\\b",not:"not\\b",inequality:"((?:is(?:"+s+"not)?"+i+")*)("+r("<(?!=)","<=",">(?!=)",">=")+")",isIn:"is"+s+"in"+c,contains:"contains\\b",doesNotContain:"does"+s+"not"+s+"contain"+c,isNotIn:"is"+s+"not"+s+"in"+c,addition:t("+")+o("="),subtraction:t("-")+o("=","type"),multiplication:t("*")+o("="),division:r("/","%")+o("="),comma:",",spread:"\\.\\.\\."+o("\\."),to:r("to\\b","="),into:"into\\b",making:"making\\b",where:"where\\b",when:"when\\b",via:"via\\b",each:"each\\b",augmentedAssign:r("\\+","\\-","\\*","\\/","%")+"=",bind:"2?bind\\b",typeSignature:t("-type")+c,incorrectOperator:L},"object"===("undefined"==typeof module?"undefined":_typeof(module))?module.exports=e:"function"==typeof define&&define.amd?define("patterns",[],function(){return e}):this&&this.loaded?(this.modules||(this.modules={}),this.modules.Patterns=e):this.Patterns=e}.call(eval("this")||("undefined"!=typeof global?global:window)),function(){var e=void 0;Object.assign=Object.assign||function(e){for(var t=1;t<");return~r?25===(t=Math.round(r/(a.length-2)*50))&&(t="center"):"<"===a[0]&&">"===a.slice(-1)?t="justify":a.indexOf(">")>-1?t="right":a.indexOf("<")>-1&&(t="left"),{align:t}}},column:{fn:function(e){var t=void 0,a=e[1],r=a.indexOf("|");return r&&r-1}}},augmentedAssign:{fn:function(e){return{operator:e[0][0]}}},identifier:{fn:o("name"),cannotFollow:["text"]},whitespace:{fn:i,cannotFollow:"text"},incorrectOperator:{fn:function(e){var t={"=>":">=","=<":"<=",gte:">=",lte:"<=",gt:">",lt:"<",eq:"is",isnot:"is not",neq:"is not",isa:"is a",are:"is",x:"*","or a":"or"}[e[0].toLowerCase().replace(/\s+/g," ")];return{type:"error",message:"Please say "+(t?"'"+t+"'":"something else")+" instead of '"+e[0]+"'.",explanation:"In the interests of readability, I want certain operators to be in a specific form."}},cannotFollow:"text"}},["boolean","is","to","into","where","when","via","making","each","and","or","not","isNot","contains","doesNotContain","isIn","isA","isNotA","isNotIn","matches","doesNotMatch","bind"].reduce(function(e,t){return e[t]={fn:i,cannotFollow:["text"]},e},{}),["comma","spread","typeSignature","addition","subtraction","multiplication","division"].reduce(function(e,t){return e[t]={fn:i},e},{}))),g=s(h,{singleStringCloser:p.singleStringOpener,doubleStringCloser:p.doubleStringOpener,escapedStringChar:p.escapedStringChar});c.push.apply(c,_toConsumableArray(t(d)).concat(_toConsumableArray(t(m)),_toConsumableArray(t(u)))),l.push.apply(l,_toConsumableArray(t(m)).concat(_toConsumableArray(t(p)))),h.push.apply(h,_toConsumableArray(t(g)));var b=a({},d,u,m,p,g);t(b).forEach(function(t){var a=e[t];b[t].pattern="string"!=typeof a?a:RegExp("^(?:"+a+")","i"),e[t+"Peek"]&&(b[t].peek=e[t+"Peek"])}),a(r.rules,b);var y=r.modes;return y.start=y.markup=c,y.macro=l,y.string=h,r}(r).lex,Patterns:e})}"object"===("undefined"==typeof module?"undefined":_typeof(module))?(e=require("./patterns"),module.exports=r(require("./lexer"))):"function"==typeof define&&define.amd?define("markup",["lexer","patterns"],function(t,a){return e=a,r(t)}):this&&this.loaded&&this.modules?(e=this.modules.Patterns,this.modules.Markup=r(this.modules.Lexer)):(e=this.Patterns,this.TwineMarkup=r(this.TwineLexer))}.call(eval("this")||("undefined"!=typeof global?global:window)),function(){var e={Macro:{set:{name:"set",sig:" ...VariableToValue",returnType:"Instant",aka:[],abstract:"Stores data values in variables, optionally allowing you to permanently restrict the variable to a single datatype. ",anchor:"macro_set",category:"basics",categoryOrder:"1"},put:{name:"put",sig:" ...VariableToValue",returnType:"Instant",aka:[],abstract:"A left-to-right version of (set:) that requires the word `into` rather than `to`. ",anchor:"macro_put",category:"basics",categoryOrder:"2"},unpack:{name:"unpack",sig:" ...VariableToValue",returnType:"Instant",aka:[],abstract:'A specialised variation of (put:) that lets you extract multiple values from an array, datamap or string, at once, and put them into multiple variables, by placing a matching data structure on the right of `into` containing variables at the positions of those values. For instance, `(unpack: (a: 1, 2, 3) into (a: $x, 2, $y))` sets $x to 1 and $y to 3, and `(unpack: (dm: "B", 3, "A", 1) into (dm: "A", $x, "B", $y))` sets $x to 1 and $y to 3. ',anchor:"macro_unpack",category:"data structure"},move:{name:"move",sig:" ...VariableToValue",returnType:"Instant",aka:[],abstract:"A variant of (put:) that, if transferring data from a data structure, deletes the source value after copying it - in effect moving the value from the source to the destination. ",anchor:"macro_move",category:"basics",categoryOrder:"3"},display:{name:"display",sig:" String",returnType:"Command",aka:[],abstract:"This command writes out the contents of the passage with the given string name. If a passage of that name does not exist, this produces an error. ",anchor:"macro_display",category:"basics",categoryOrder:"5"},print:{name:"print",sig:" Any",returnType:"Command",aka:[],abstract:"This command prints out any data provided to it, as text. ",anchor:"macro_print",category:"basics",categoryOrder:"4"},verbatimprint:{name:"verbatim-print",sig:" Any",returnType:"Command",aka:["v6m-print"],abstract:"A convenient combination of (verbatim:) and (print:), this prints out any single argument given to it, as text, but without rendering the resulting text as markup. ",anchor:"macro_verbatim-print",category:"basics",categoryOrder:"16"},v6mprint:{name:"verbatim-print",sig:" Any",returnType:"Command",aka:["v6m-print"],abstract:"A convenient combination of (verbatim:) and (print:), this prints out any single argument given to it, as text, but without rendering the resulting text as markup. ",anchor:"macro_verbatim-print",category:"basics",categoryOrder:"16"},verbatimsource:{name:"verbatim-source",sig:" Any",returnType:"Command",aka:["v6m-source"],abstract:"A convenient combination of (verbatim-print:) and (source:), this prints out the Harlowe source code of any value given to it. ",anchor:"macro_verbatim-source",category:"debugging"},v6msource:{name:"verbatim-source",sig:" Any",returnType:"Command",aka:["v6m-source"],abstract:"A convenient combination of (verbatim-print:) and (source:), this prints out the Harlowe source code of any value given to it. ",anchor:"macro_verbatim-source",category:"debugging"},goto:{name:"go-to",sig:" String",returnType:"Command",aka:[],abstract:"This command stops passage code and sends the player to a new passage. If the passage named by the string does not exist, this produces an error. ",anchor:"macro_go-to",category:"navigation"},undo:{name:"undo",sig:"",returnType:"Command",aka:[],abstract:'This command stops passage code and "undoes" the current turn, sending the player to the previous visited passage and forgetting any variable changes that occurred in this passage. ',anchor:"macro_undo",category:"navigation"},iconundo:{name:"icon-undo",sig:" [String], [String]",returnType:"Command",aka:[],abstract:"Creates an icon, similar to those in the sidebar, that, if visible and clicked, undoes the current turn, returning to the previous passage, as if by (undo:). It is not visible on the first turn of the game. ",anchor:"macro_icon-undo",category:"sidebar",categoryOrder:"2"},iconredo:{name:"icon-redo",sig:" [String], [String]",returnType:"Command",aka:[],abstract:'Creates an icon, similar to those in the sidebar, that, if visible and clicked, "re-does" a turn that was undone. It is only visible if a turn has been undone. ',anchor:"macro_icon-redo",category:"sidebar",categoryOrder:"3"},iconfullscreen:{name:"icon-fullscreen",sig:" [String], [String]",returnType:"Command",aka:[],abstract:"Creates an icon, similar to those in the sidebar, that, if visible and clicked, toggles fullscreen mode on or off. ",anchor:"macro_icon-fullscreen",category:"sidebar",categoryOrder:"4"},iconrestart:{name:"icon-restart",sig:" [String]",returnType:"Command",aka:[],abstract:"Creates an icon, similar to those in the sidebar, that, if visible and clicked, reloads the whole page, restarting the story from the beginning. ",anchor:"macro_icon-restart",category:"sidebar",categoryOrder:"5"},iconcounter:{name:"icon-counter",sig:" Bind, String, [String]",returnType:"Command",aka:[],abstract:"A command that creates a numeric counter element with a text label, designed to fit in the sidebar, displaying the contents of a number variable (rounded to a whole number as if by (trunc:)), and updating it whenever another macro changes it. ",anchor:"macro_icon-counter",category:"sidebar",categoryOrder:"6"},meter:{name:"meter",sig:" Bind, Number, String, [String], [Colour or Gradient]",returnType:"Command",aka:[],abstract:"A command that creates a horizontal bar-graph meter, showing the current value of a number variable, relative to a maximum value, and updating it whenever that variable changes. ",anchor:"macro_meter",category:"input and interface"},cyclinglink:{name:"cycling-link",sig:" [Bind], ...String",returnType:"Command",aka:[],abstract:"A command that, when evaluated, creates a cycling link - a link which does not go anywhere, but changes its own text to the next in a looping sequence of strings, and sets the optional bound variable to match the string value of the text. ",anchor:"macro_cycling-link",category:"input and interface",categoryOrder:"1"},seqlink:{name:"seq-link",sig:" [Bind], ...String",returnType:"Command",aka:["sequence-link"],abstract:"A command that creates a link that does not go anywhere, but changes its own text to the next in a sequence of strings, becoming plain text once the final string is reached, and setting the optional bound variable to match the text at all times. ",anchor:"macro_seq-link",category:"input and interface",categoryOrder:"2"},sequencelink:{name:"seq-link",sig:" [Bind], ...String",returnType:"Command",aka:["sequence-link"],abstract:"A command that creates a link that does not go anywhere, but changes its own text to the next in a sequence of strings, becoming plain text once the final string is reached, and setting the optional bound variable to match the text at all times. ",anchor:"macro_seq-link",category:"input and interface",categoryOrder:"2"},dropdown:{name:"dropdown",sig:" Bind, ...String",returnType:"Command",aka:[],abstract:"A command that, when evaluated, creates a dropdown menu with the given strings as options. When one option is selected, the bound variable is set to match the string value of the text. ",anchor:"macro_dropdown",category:"input and interface"},checkbox:{name:"checkbox",sig:" Bind, String",returnType:"Command",aka:[],abstract:"A command that creates a checkbox input, which sets the given bound variable to `true` or `false`, depending on its state. ",anchor:"macro_checkbox",category:"input and interface",categoryOrder:"5"},checkboxfullscreen:{name:"checkbox-fullscreen",sig:" String",returnType:"Command",aka:[],abstract:"A command that creates a checkbox input, which toggles the browser's fullscreen mode and windowed mode. The checkbox will automatically update to match the browser's fullscreen status. If fullscreen mode cannot be entered, the checkbox will be disabled. ",anchor:"macro_checkbox-fullscreen",category:"input and interface",categoryOrder:"6"},inputbox:{name:"input-box",sig:" [Bind], String, [Number], [String]",returnType:"Command",aka:[],abstract:"A command macro that creates a text input box of the given position, width and height, allowing the player to input any amount of text, which can optionally be automatically stored in a variable. ",anchor:"macro_input-box",category:"input and interface",categoryOrder:"3"},forceinputbox:{name:"force-input-box",sig:" [Bind], String, [Number], String",returnType:"Command",aka:[],abstract:"A command macro that creates an empty text input box of the given position, width and height, which appears to offer the player a means to input text, but instead replaces every keypress inside it with characters from a pre-set string that's relevant to the story. ",anchor:"macro_force-input-box",category:"input and interface",categoryOrder:"4"},show:{name:"show",sig:" ...HookName",returnType:"Command",aka:[],abstract:"Reveals hidden hooks, running the code within if it's not been shown yet. ",anchor:"macro_show",category:"showing and hiding"},rerun:{name:"rerun",sig:" ...HookName",returnType:"Command",aka:[],abstract:"Reruns hooks, restoring them to their original contents, and running the macros within them an additional time. ",anchor:"macro_rerun",category:"revision"},hide:{name:"hide",sig:" ...HookName",returnType:"Command",aka:[],abstract:"Hides a hook that was already visible, without fully erasing it or its contained macro calls. ",anchor:"macro_hide",category:"showing and hiding"},stop:{name:"stop",sig:"",returnType:"Command",aka:[],abstract:"This macro, which accepts no arguments, creates a (stop:) command, which is not configurable. ",anchor:"macro_stop",category:"live",categoryOrder:"2"},loadgame:{name:"load-game",sig:" String",returnType:"Command",aka:[],abstract:"This command attempts to load a saved game from the given slot, ending the current game and replacing it with the loaded one. This causes the passage to change. ",anchor:"macro_load-game",category:"saving"},mockvisits:{name:"mock-visits",sig:" ...String",returnType:"Command",aka:[],abstract:'A macro that can only be used in debug mode, this allows you to mark various passages as "visited", even though the player actually hasn\'t. This allows you to quickly test passages that use the `visits` keyword, or the `(history:)` datamap, without having to play through the whole game from the start. ',anchor:"macro_mock-visits",category:"debugging"},dialog:{name:"dialog",sig:" [Bind], String, ...String",returnType:"Command",aka:["alert"],abstract:"A command that, when used, displays a pop-up dialog box with the given string displayed, and a number of links labeled with the remaining other strings. When one of the links is clicked to dismiss the dialog, it evaluates to the string text of that clicked link. If an optional bound variable is provided, that variable is updated to match the pressed button. ",anchor:"macro_dialog",category:"popup",categoryOrder:"1"},alert:{name:"dialog",sig:" [Bind], String, ...String",returnType:"Command",aka:["alert"],abstract:"A command that, when used, displays a pop-up dialog box with the given string displayed, and a number of links labeled with the remaining other strings. When one of the links is clicked to dismiss the dialog, it evaluates to the string text of that clicked link. If an optional bound variable is provided, that variable is updated to match the pressed button. ",anchor:"macro_dialog",category:"popup",categoryOrder:"1"},openurl:{name:"open-url",sig:" String",returnType:"Command",aka:[],abstract:"When this macro is evaluated, the player's browser attempts to open a new tab with the given URL. This will usually require confirmation from the player, as most browsers block Javascript programs such as Harlowe from opening tabs by default. ",anchor:"macro_open-url",category:"url"},restart:{name:"restart",sig:"",returnType:"Command",aka:["reload"],abstract:"When this command is used, the player's browser will immediately attempt to reload the page, in effect restarting the entire story. ",anchor:"macro_restart",category:"navigation"},reload:{name:"restart",sig:"",returnType:"Command",aka:["reload"],abstract:"When this command is used, the player's browser will immediately attempt to reload the page, in effect restarting the entire story. ",anchor:"macro_restart",category:"navigation"},gotourl:{name:"goto-url",sig:" String",returnType:"Command",aka:[],abstract:"When this command is used, the player's browser will immediately attempt to leave the story's page, and navigate to the given URL in the same tab. If this succeeds, then the story session will \"end\". ",anchor:"macro_goto-url",category:"url"},ignore:{name:"ignore",sig:" ...[Any]",returnType:"Command",aka:[],abstract:"If you want to test your passage while ignoring a specific command macro in it, temporarily change that command macro's name to (ignore:), and it will ignore all of the data given to it. ",anchor:"macro_ignore",category:"debugging",categoryOrder:"1"},assertexists:{name:"assert-exists",sig:" HookName or String",returnType:"Command",aka:[],abstract:"A debugging macro that confirms whether a hook with the given name, or passage text matching the given string, is present in the passage. If not, it will produce a helpful error. Use this to test whether enchantment macros like (click:), (enchant:) or (show:) are working properly. ",anchor:"macro_assert-exists",category:"debugging",categoryOrder:"5"},assert:{name:"assert",sig:" Boolean",returnType:"Instant",aka:[],abstract:"A debugging macro that produces a helpful error whenever the expression given to it produces Boolean false. Use this when testing your story to help ensure that certain facts about the game state are true or not. ",anchor:"macro_assert",category:"debugging",categoryOrder:"4"},savegame:{name:"save-game",sig:" String, [String]",returnType:"Boolean",aka:[],abstract:"This macro saves the current game's state in browser storage, in the given save slot, and including a special filename. It can then be restored using (load-game:). ",anchor:"macro_save-game",category:"saving"},prompt:{name:"prompt",sig:" String, String, [String], [String]",returnType:"String",aka:[],abstract:'When this macro is evaluated, a browser pop-up dialog box is shown with the first string displayed, a text entry box containing the second string (as a default value), a confirm link and a cancel link. If the confirm link is clicked, it evaluates to the string in the text entry box. If "Cancel" is clicked, it evaluates to the default value regardless of the entry box\'s contents. ',anchor:"macro_prompt",category:"popup"},confirm:{name:"confirm",sig:" String, [String], [String]",returnType:"Boolean",aka:[],abstract:"When this macro is evaluated, a pop-up dialog box is shown with the given string displayed, as well as two links (whose text can also be provided) to confirm or cancel whatever action or fact the string tells the player. When it is submitted, it evaluates to the boolean `true` if the confirm link had been clicked, and `false` if the cancel link had. ",anchor:"macro_confirm",category:"popup"},pageurl:{name:"page-url",sig:"",returnType:"String",aka:[],abstract:"This macro produces the full URL of the story's HTML page, as it is in the player's browser. ",anchor:"macro_page-url",category:"url"},macro:{name:"macro",sig:" [...TypedVar], CodeHook",returnType:"CustomMacro",aka:[],abstract:"Use this macro to construct your own custom macros, which you can (set:) into variables and call as easily as a built-in macro. ",anchor:"macro_macro",category:"custom macros",categoryOrder:"1"},outputdata:{name:"output-data",sig:" Any",returnType:"Instant",aka:["out-data"],abstract:"Use this macro inside a (macro:)'s CodeHook to output the value that the macro produces. ",anchor:"macro_output-data",category:"custom macros",categoryOrder:"3"},outdata:{name:"output-data",sig:" Any",returnType:"Instant",aka:["out-data"],abstract:"Use this macro inside a (macro:)'s CodeHook to output the value that the macro produces. ",anchor:"macro_output-data",category:"custom macros",categoryOrder:"3"},output:{name:"output",sig:"",returnType:"Changer",aka:["out"],abstract:"Use this macro inside a (macro:)'s CodeHook to output a command that, when run, renders the attached hook. ",anchor:"macro_output",category:"custom macros",categoryOrder:"2"},out:{name:"output",sig:"",returnType:"Changer",aka:["out"],abstract:"Use this macro inside a (macro:)'s CodeHook to output a command that, when run, renders the attached hook. ",anchor:"macro_output",category:"custom macros",categoryOrder:"2"},error:{name:"error",sig:" String",returnType:"Instant",aka:[],abstract:"Designed for use in custom macros, this causes the custom macro to immediately produce an error, with the given message string, and ceases running any further code in the CodeHook. ",anchor:"macro_error",category:"custom macros",categoryOrder:"4"},a:{name:"a",sig:" [...Any]",returnType:"Array",aka:["array"],abstract:"Creates an array, which is an ordered collection of values. ",anchor:"macro_a",category:"data structure",categoryOrder:"1"},array:{name:"a",sig:" [...Any]",returnType:"Array",aka:["array"],abstract:"Creates an array, which is an ordered collection of values. ",anchor:"macro_a",category:"data structure",categoryOrder:"1"},range:{name:"range",sig:" Number, Number",returnType:"Array",aka:[],abstract:"Produces an array containing an inclusive range of whole numbers from a to b, in ascending order. ",anchor:"macro_range",category:"data structure"},subarray:{name:"subarray",sig:" Array, Number, Number",returnType:"Array",aka:[],abstract:"When given an array, this returns a new array containing only the elements whose positions are between the two numbers, inclusively. ",anchor:"macro_subarray",category:"data structure"},reversed:{name:"reversed",sig:" [...Any]",returnType:"Array",aka:[],abstract:"Similar to (a:), except that it creates an array containing the elements in reverse order. ",anchor:"macro_reversed",category:"data structure"},shuffled:{name:"shuffled",sig:" Any, ...Any",returnType:"Array",aka:[],abstract:"Similar to (a:), this produces an array of the given values, except that it randomly rearranges the elements instead of placing them in the given order. ",anchor:"macro_shuffled",category:"data structure"},sorted:{name:"sorted",sig:" Number or String, ...Number or String",returnType:"Array",aka:[],abstract:"Similar to (a:), except that it requires only numbers or strings, and orders them in English alphanumeric sort order, rather than the order in which they were provided. ",anchor:"macro_sorted",category:"data structure"},rotated:{name:"rotated",sig:" Number, ...Any",returnType:"Array",aka:[],abstract:"Similar to the (a:) macro, but it also takes a number at the start, and moves each item forward by that number, wrapping back to the start if they pass the end of the array. ",anchor:"macro_rotated",category:"data structure"},rotatedto:{name:"rotated-to",sig:" Lambda, [...Any]",returnType:"Array",aka:[],abstract:'Similar to the (a:) macro, but it also takes a "where" lambda at the start, and cycles the order of the subsequent values so that the first value to match the lambda is placed at the start. ',anchor:"macro_rotated-to",category:"data structure"},repeated:{name:"repeated",sig:" Number, ...Any",returnType:"Array",aka:[],abstract:"When given a number and a sequence of values, this macro produces an array containing those values repeated, in order, by the given number of times. ",anchor:"macro_repeated",category:"data structure"},interlaced:{name:"interlaced",sig:" Array, ...Array",returnType:"Array",aka:[],abstract:"Takes multiple arrays, and pairs up each value in those arrays: it creates an array containing each array's first value followed by each array's second value, and so forth. If some values have no matching pair (i.e. one array is longer than the other) then those values are ignored. ",anchor:"macro_interlaced",category:"data structure"},permutations:{name:"permutations",sig:" ...Any",returnType:"Array",aka:[],abstract:"When given a sequence of values, this produces an array containing each permutation of the order of those values, as arrays. ",anchor:"macro_permutations",category:"data structure"},altered:{name:"altered",sig:" Lambda, [...Any]",returnType:"Array",aka:[],abstract:'This takes a "via" lambda and a sequence of values, and creates a new array with the same values in the same order, but altered via the operation in the lambda\'s "via" clause. ',anchor:"macro_altered",category:"data structure"},find:{name:"find",sig:" Lambda, [...Any]",returnType:"Array",aka:[],abstract:"This searches through the given values, and produces an array of those which match the given search test (which is expressed using a temp variable, the `where` keyword, and a boolean condition). If none match, an empty array is produced. ",anchor:"macro_find",category:"data structure"},allpass:{name:"all-pass",sig:" Lambda, [...Any]",returnType:"Boolean",aka:["pass"],abstract:'This takes a "where" lambda and a series of values, and evaluates to true if the lambda, when run using each value, never evaluated to false. ',anchor:"macro_all-pass",category:"data structure"},pass:{name:"all-pass",sig:" Lambda, [...Any]",returnType:"Boolean",aka:["pass"],abstract:'This takes a "where" lambda and a series of values, and evaluates to true if the lambda, when run using each value, never evaluated to false. ',anchor:"macro_all-pass",category:"data structure"},somepass:{name:"some-pass",sig:" Lambda, ...Any",returnType:"Boolean",aka:[],abstract:"This is similar to (all-pass:), but produces true if one or more value, when given to the lambda, evaluated to true. It can be thought of as shorthand for putting `not` in front of (none-pass:). If zero values are given to (all-pass:), then it will return false by default. For more information, consult the description of (all-pass:). ",anchor:"macro_some-pass",category:"data structure"},nonepass:{name:"none-pass",sig:" Lambda, ...Any",returnType:"Boolean",aka:[],abstract:"This can be thought of as the opposite of (all-pass:): it produces true if every value, when given to the lambda, never evaluated to true. If zero values are given to (none-pass:), then it will return true by default, just like (all-pass:). For more information, consult the description of (all-pass:). ",anchor:"macro_none-pass",category:"data structure"},folded:{name:"folded",sig:" Lambda, ...Any",returnType:"Any",aka:[],abstract:'This takes a "making" lambda and a sequence of values, and creates a new value (the "total") by feeding every value in the sequence to the lambda, akin to folding a long strip of paper into a single square. The first value after the lambda is put into the total (which is the variable inside the lambda\'s "making" clause) before running the lambda on the remaining values. ',anchor:"macro_folded",category:"data structure"},datanames:{name:"datanames",sig:" Datamap",returnType:"Array",aka:[],abstract:"This takes a datamap, and returns a sorted array of its data names, sorted alphabetically. ",anchor:"macro_datanames",category:"data structure"},datavalues:{name:"datavalues",sig:" Datamap",returnType:"Array",aka:[],abstract:"This takes a datamap, and returns an array of its values, sorted alphabetically by their name. ",anchor:"macro_datavalues",category:"data structure"},dataentries:{name:"dataentries",sig:" Datamap",returnType:"Array",aka:[],abstract:'This takes a datamap, and returns an array of its name/value pairs. Each pair is a datamap that only has "name" and "value" data. The pairs are ordered by their name. ',anchor:"macro_dataentries",category:"data structure"},history:{name:"history",sig:" [Lambda]",returnType:"Array",aka:[],abstract:"This returns an array containing the string names of all of the passages the player has visited up to now, in the order that the player visited them. An optional lambda can filter the passages, by checking the (passage:) datamap of each. The (mock-visits:) macro can, during debugging, artifically add values to this array to simulate having visited various passages. ",anchor:"macro_history",category:"game state"},passage:{name:"passage",sig:" [String]",returnType:"Datamap",aka:[],abstract:"When given a passage string name, this provides a datamap containing information about that passage. If no name was provided, then it provides information about the current passage. ",anchor:"macro_passage",category:"game state"},passages:{name:"passages",sig:" [Lambda]",returnType:"Array",aka:[],abstract:"This returns an array containing datamaps of information for the passages in the story, sorted by passage name, and using the optional search test to only include certain types of passages. ",anchor:"macro_passages",category:"game state"},openstorylets:{name:"open-storylets",sig:" [Lambda]",returnType:"Array",aka:[],abstract:'Checks all of the (storylet:) macros in every passage, and provides an array of datamaps for every passage whose (storylet:) lambda produced true, sorted by their "urgency" metadata value, then by passage name. If a lambda was provided, the storylets are filtered using it as a search test. ',anchor:"macro_open-storylets",category:"storylet",categoryOrder:"2"},savedgames:{name:"saved-games",sig:"",returnType:"Datamap",aka:[],abstract:"This returns a datamap containing the names of currently occupied save game slots. ",anchor:"macro_saved-games",category:"saving"},dm:{name:"dm",sig:" [...Any]",returnType:"Datamap",aka:["datamap"],abstract:"Creates a datamap, which is a data structure that pairs string names with data values. You should provide a string name, followed by the value paired with it, and then another string name, another value, and so on, for as many as you'd like. ",anchor:"macro_dm",category:"data structure",categoryOrder:"2"},datamap:{name:"dm",sig:" [...Any]",returnType:"Datamap",aka:["datamap"],abstract:"Creates a datamap, which is a data structure that pairs string names with data values. You should provide a string name, followed by the value paired with it, and then another string name, another value, and so on, for as many as you'd like. ",anchor:"macro_dm",category:"data structure",categoryOrder:"2"},ds:{name:"ds",sig:" [...Any]",returnType:"Dataset",aka:["dataset"],abstract:"Creates a dataset, which is an unordered collection of unique values. ",anchor:"macro_ds",category:"data structure",categoryOrder:"3"},dataset:{name:"ds",sig:" [...Any]",returnType:"Dataset",aka:["dataset"],abstract:"Creates a dataset, which is an unordered collection of unique values. ",anchor:"macro_ds",category:"data structure",categoryOrder:"3"},count:{name:"count",sig:" Array or String, ...Any",returnType:"Number",aka:[],abstract:"Accepts a string or array, followed by a value, and produces the number of times any of the values are inside the string or array. ",anchor:"macro_count",category:"data structure"},change:{name:"change",sig:" HookName or String, Changer or Lambda",returnType:"Command",aka:[],abstract:'Applies a changer (or a "via" lambda producing a changer) to every occurrence of a hook or string in a passage, once. ',anchor:"macro_change",category:"basics",categoryOrder:"17"},enchant:{name:"enchant",sig:" HookName or String, Changer or Lambda",returnType:"Command",aka:[],abstract:'Applies a changer (or a "via" lambda producing a changer) to every occurrence of a hook or string in a passage, and continues applying that changer to any further occurrences that are made to appear in the same passage later. ',anchor:"macro_enchant",category:"basics",categoryOrder:"18"},enchantin:{name:"enchant-in",sig:" HookName or String, Changer or Lambda",returnType:"Changer",aka:[],abstract:"A variation of (enchant:) and (change:), this applies a changer to every occurrence of a hook or string within just the attached hook, rather than the whole passage. As with (enchant:), the changer will be applied to every additional occurrence inserted into the attached hook. ",anchor:"macro_enchant-in",category:"basics",categoryOrder:"19"},linkstyle:{name:"link-style",sig:" Changer or Lambda",returnType:"Changer",aka:[],abstract:"When attached to a hook, this causes all of the links inside the hook to be styled using the specified changer. This is equivalent to using (enchant-in:) with `?link`. ",anchor:"macro_link-style",category:"styling"},linestyle:{name:"line-style",sig:" Changer or Lambda",returnType:"Changer",aka:[],abstract:"When attached to a hook, this causes all of the lines of prose inside the hook (identical to those that would be selected by `?page's lines`) to be styled using the specified changer. ",anchor:"macro_line-style",category:"styling"},charstyle:{name:"char-style",sig:" Changer or Lambda",returnType:"Changer",aka:[],abstract:"When attached to a hook, this causes all of the individual non-whitespace characters inside the hook (identical to those that would be selected by `?page's chars`) to be styled using the specified changer. ",anchor:"macro_char-style",category:"styling"},replace:{name:"replace",sig:" ...HookName or String",returnType:"Changer",aka:[],abstract:"Creates a command which you can attach to a hook, and replace target destinations with the hook's contents. The targets are either text strings within the current passage, or hook references. ",anchor:"macro_replace",category:"revision"},replacewith:{name:"replace-with",sig:" String",returnType:"Changer",aka:[],abstract:"A counterpart to (append-with:) and (prepend-with:), this replaces the entirety of the attached hook with the given string of prose. ",anchor:"macro_replace-with",category:"revision"},append:{name:"append",sig:" ...HookName or String",returnType:"Changer",aka:[],abstract:"A variation of (replace:) which adds the attached hook's contents to the end of each target, rather than replacing it entirely. ",anchor:"macro_append",category:"revision"},appendwith:{name:"append-with",sig:" String",returnType:"Changer",aka:[],abstract:"Creates a changer that, when attached to a hook, adds the given string of code to the end of the hook. ",anchor:"macro_append-with",category:"revision"},prepend:{name:"prepend",sig:" ...HookName or String",returnType:"Changer",aka:[],abstract:"A variation of (replace:) which adds the attached hook's contents to the beginning of each target, rather than replacing it entirely. ",anchor:"macro_prepend",category:"revision"},prependwith:{name:"prepend-with",sig:" String",returnType:"Changer",aka:[],abstract:"Creates a changer that, when attached to a hook, adds the given string of code to the start of the hook. ",anchor:"macro_prepend-with",category:"revision"},click:{name:"click",sig:" HookName or String, [Changer or Lambda]",returnType:"Changer",aka:[],abstract:"Produces a changer which, when attached to a hook, hides it and enchants the specified target, such that it visually resembles a link, and that clicking it causes the attached hook to be revealed. ",anchor:"macro_click",category:"links",categoryOrder:"9"},mouseover:{name:"mouseover",sig:" HookName or String, [Changer or Lambda]",returnType:"Changer",aka:[],abstract:"A variation of (click:) that, instead of showing the hook when the target is clicked, shows it when the mouse pointer merely hovers over it. The target is also styled differently (with a dotted underline), to denote this hovering functionality. ",anchor:"macro_mouseover",category:"links",categoryOrder:"14"},mouseout:{name:"mouseout",sig:" HookName or String, [Changer or Lambda]",returnType:"Changer",aka:[],abstract:"A variation of (click:) that, instead of showing the hook when the target is clicked, shows it when the mouse pointer moves over it, and then leaves. The target is also styled differently (a translucent cyan frame), to denote this hovering functionality. ",anchor:"macro_mouseout",category:"links",categoryOrder:"19"},clickreplace:{name:"click-replace",sig:" HookName or String, [Changer or Lambda]",returnType:"Changer",aka:[],abstract:"A special shorthand combination of the (click:) and (replace:) macros, this allows you to make a hook replace its own text with that of the attached hook whenever it's clicked. `(click: ?1)[(replace:?1)[...]]` can be rewritten as `(click-replace: ?1)[...]`. ",anchor:"macro_click-replace",category:"links",categoryOrder:"10"},clickappend:{name:"click-append",sig:" HookName or String, [Changer or Lambda]",returnType:"Changer",aka:[],abstract:"A special shorthand combination of the (click:) and (append:) macros, this allows you to append text to a hook or string when it's clicked. `(click: ?1)[(append:?1)[...]]` can be rewritten as `(click-append: ?1)[...]`. ",anchor:"macro_click-append",category:"links",categoryOrder:"11"},clickprepend:{name:"click-prepend",sig:" HookName or String, [Changer or Lambda]",returnType:"Changer",aka:[],abstract:"A special shorthand combination of the (click:) and (prepend:) macros, this allows you to prepend text to a hook or string when it's clicked. `(click: ?1)[(prepend:?1)[...]]` can be rewritten as `(click-prepend: ?1)[...]`. ",anchor:"macro_click-prepend",category:"links",categoryOrder:"12"},mouseoverreplace:{name:"mouseover-replace",sig:" HookName or String, [Changer or Lambda]",returnType:"Changer",aka:[],abstract:"This is similar to (click-replace:), but uses the (mouseover:) macro's behaviour instead of (click:)'s. For more information, consult the description of (click-replace:). ",anchor:"macro_mouseover-replace",category:"links",categoryOrder:"15"},mouseoverappend:{name:"mouseover-append",sig:" HookName or String, [Changer or Lambda]",returnType:"Changer",aka:[],abstract:"This is similar to (click-append:), but uses the (mouseover:) macro's behaviour instead of (click:)'s. For more information, consult the description of (click-append:). ",anchor:"macro_mouseover-append",category:"links",categoryOrder:"16"},mouseoverprepend:{name:"mouseover-prepend",sig:" HookName or String, [Changer or Lambda]",returnType:"Changer",aka:[],abstract:"This is similar to (click-prepend:), but uses the (mouseover:) macro's behaviour instead of (click:)'s. For more information, consult the description of (click-prepend:). ",anchor:"macro_mouseover-prepend",category:"links",categoryOrder:"17"},mouseoutreplace:{name:"mouseout-replace",sig:" HookName or String, [Changer or Lambda]",returnType:"Changer",aka:[],abstract:"This is similar to (click-replace:), but uses the (mouseout:) macro's behaviour instead of (click:)'s. For more information, consult the description of (click-replace:). ",anchor:"macro_mouseout-replace",category:"links",categoryOrder:"20"},mouseoutappend:{name:"mouseout-append",sig:" HookName or String, [Changer or Lambda]",returnType:"Changer",aka:[],abstract:"This is similar to (click-append:), but uses the (mouseout:) macro's behaviour instead of (click:)'s. For more information, consult the description of (click-append:). ",anchor:"macro_mouseout-append",category:"links",categoryOrder:"21"},mouseoutprepend:{name:"mouseout-prepend",sig:" HookName or String, [Changer or Lambda]",returnType:"Changer",aka:[],abstract:"This is similar to (click-prepend:), but uses the (mouseout:) macro's behaviour instead of (click:)'s. For more information, consult the description of (click-prepend:). ",anchor:"macro_mouseout-prepend",category:"links",categoryOrder:"22"},clickgoto:{name:"click-goto",sig:" HookName or String, String",returnType:"Command",aka:[],abstract:"A special shorthand combination of the (click:) and (go-to:) macros, this allows you to make a hook or bit of text into a passage link. `(click-goto: ?1, 'Passage Name')` is equivalent to `(click: ?1)[(goto:'Passage Name')]` ",anchor:"macro_click-goto",category:"links",categoryOrder:"11"},mouseovergoto:{name:"mouseover-goto",sig:" HookName or String, String",returnType:"Command",aka:[],abstract:"This is similar to (click-goto:), but uses the (mouseover:) macro's behaviour instead of (click:)'s. For more information, consult the description of (click-goto:). ",anchor:"macro_mouseover-goto",category:"links",categoryOrder:"16"},mouseoutgoto:{name:"mouseout-goto",sig:" HookName or String, String",returnType:"Command",aka:[],abstract:"This is similar to (click-goto:), but uses the (mouseout:) macro's behaviour instead of (click:)'s. For more information, consult the description of (click-goto:). ",anchor:"macro_mouseout-goto",category:"links",categoryOrder:"21"},clickundo:{name:"click-undo",sig:" HookName or String",returnType:"Command",aka:[],abstract:"A special shorthand combination of the (click:) and (undo:) macros, this allows you to make a hook or bit of text into a passage link. `(click-undo: ?1)` is equivalent to `(click: ?1)[(undo: )]` ",anchor:"macro_click-undo",category:"links",categoryOrder:"11"},mouseoverundo:{name:"mouseover-undo",sig:" HookName or String, String",returnType:"Command",aka:[],abstract:"This is similar to (click-undo:), but uses the (mouseover:) macro's behaviour instead of (click:)'s. For more information, consult the description of (click-undo:). ",anchor:"macro_mouseover-undo",category:"links",categoryOrder:"16"},mouseoutundo:{name:"mouseout-undo",sig:" HookName or String, String",returnType:"Command",aka:[],abstract:"This is similar to (click-undo:), but uses the (mouseout:) macro's behaviour instead of (click:)'s. For more information, consult the description of (click-undo:). ",anchor:"macro_mouseout-undo",category:"links",categoryOrder:"21"},link:{name:"link",sig:" String, [Changer]",returnType:"Changer",aka:["link-replace"],abstract:"When attached to a hook, this replaces the hook with a link that has the given text. The link, when clicked, vanishes and reveals the hook. An optional changer can be given to alter the style of the link (instead of altering the style of the attached hook). ",anchor:"macro_link",category:"links",categoryOrder:"1"},linkreplace:{name:"link",sig:" String, [Changer]",returnType:"Changer",aka:["link-replace"],abstract:"When attached to a hook, this replaces the hook with a link that has the given text. The link, when clicked, vanishes and reveals the hook. An optional changer can be given to alter the style of the link (instead of altering the style of the attached hook). ",anchor:"macro_link",category:"links",categoryOrder:"1"},linkreveal:{name:"link-reveal",sig:" String, [Changer]",returnType:"Changer",aka:[],abstract:"When attached to a hook, this replaces the hook with a link that has the given text. The link, when clicked, reveals the hook and becomes plain, unstyled text. An optional changer can be given to alter the style of the link (instead of altering the style of the attached hook). ",anchor:"macro_link-reveal",category:"links",categoryOrder:"2"},linkrepeat:{name:"link-repeat",sig:" String, [Changer]",returnType:"Changer",aka:[],abstract:"When attached to a hook, this replaces the hook with a link that has the given text. The link, when clicked, reveals the hook. Further clicks will cause the hook to repeat itself - a copy of the hook's code will be run, and the result appended to it, in a manner similar to (for:). An optional changer can be given to alter the style of the link (instead of altering the style of the attached hook). ",anchor:"macro_link-repeat",category:"links",categoryOrder:"3"},linkrerun:{name:"link-rerun",sig:" String, [Changer]",returnType:"Changer",aka:[],abstract:"When attached to a hook, this replaces the hook with a link that has the given text. The link, when clicked, reveals the hook. Further clicks will cause the hook to rerun itself, as if by the effect of (rerun:). An optional changer can be given to alter the style of the link (instead of altering the style of the attached hook). ",anchor:"macro_link-rerun",category:"links",categoryOrder:"4"},linkgoto:{name:"link-goto",sig:" String, [String]",returnType:"Command",aka:[],abstract:"Takes a string of link text, and an optional destination passage name, and makes a command to create a link that takes the player to another passage. The link functions identically to a standard link. ",anchor:"macro_link-goto",category:"links",categoryOrder:"5"},linkstorylet:{name:"link-storylet",sig:" [String], Number or Lambda, [String]",returnType:"Command",aka:[],abstract:"If there are storylets (passages containing a (storylet:) call) in this story, this will create a link to the first open storylet that matches the passed-in 'where' lambda, or, if a number **n** was passed in, the **n**th (or, if negative, **n**thlast) open storylet. An optional final string can provide text to display when no such storylet is open currently. ",anchor:"macro_link-storylet",category:"links",categoryOrder:"8"},linkundo:{name:"link-undo",sig:" String",returnType:"Command",aka:[],abstract:"Takes a string of link text, and produces a link that, when clicked, undoes the current turn and sends the player back to the previously visited passage. The link appears identical to a typical passage link. ",anchor:"macro_link-undo",category:"links",categoryOrder:"7"},linkshow:{name:"link-show",sig:" String, ...HookName",returnType:"Command",aka:[],abstract:"Creates a link that, when clicked, shows the given hidden hooks, running the code within. ",anchor:"macro_link-show",category:"links",categoryOrder:"8"},linkfullscreen:{name:"link-fullscreen",sig:" String, String, [String]",returnType:"Command",aka:[],abstract:"Creates a link that, when clicked, toggles the browser's fullscreen mode and windowed mode. The first string is used as its link text if the browser is currently in windowed mode, and the second string if it's currently in fullscreen mode. The link will automatically update (re-rendering the link text) to match the browser's current fullscreen state. The optional third string is used when fullscreen mode isn't allowed by the browser - if it's absent or an empty string, the link won't be displayed at all in that situation. ",anchor:"macro_link-fullscreen",category:"links",categoryOrder:"8"},linkrevealgoto:{name:"link-reveal-goto",sig:" String, [String], [Changer]",returnType:"Changer",aka:[],abstract:"This is a convenient combination of the (link-reveal:) and (go-to:) macros, designed to let you run commands like (set:) just before going to another passage. The first string is the link text, and the second is the passage name. An optional changer, with which to style the link, can also be provided. ",anchor:"macro_link-reveal-goto",category:"links",categoryOrder:"6"},storylet:{name:"storylet",sig:" Lambda",returnType:"Metadata",aka:[],abstract:"When placed in a passage, it marks that passage as the beginning of a storylet, using the lambda as the condition upon which it's available to the player, so that other macros, like (open-storylets:), can see and select the passage. ",anchor:"macro_storylet",category:"storylet",categoryOrder:"1"},urgency:{name:"urgency",sig:" Number",returnType:"Metadata",aka:[],abstract:'When placed in a passage that also has a (storylet:) call, it marks that passage as being more or less "urgent", meaning that (open-storylets:) will sort it earlier or later than other passages. ',anchor:"macro_urgency",category:"storylet",categoryOrder:"4"},exclusivity:{name:"exclusivity",sig:" Number",returnType:"Metadata",aka:[],abstract:'When placed in a passage that also has a (storylet:) call, it marks that passage as being more or less "exclusive", meaning that if it\'s open, it will prevent storylets with lesser exclusivity from appearing in (open-storylets:). ',anchor:"macro_exclusivity",category:"storylet",categoryOrder:"3"},metadata:{name:"metadata",sig:" [...Any]",returnType:"Metadata",aka:[],abstract:"When placed in a passage, this adds the given names and values to the (passage:) datamap for this passage. ",anchor:"macro_metadata",category:"game state"},p:{name:"p",sig:" ...String or Datatype",returnType:"Datatype",aka:["pattern"],abstract:"Creates a string pattern, a special kind of datatype that can match complex string structures. The pattern matches the entire sequence of strings or datatypes given, in order. ",anchor:"macro_p",category:"patterns",categoryOrder:"1"},pattern:{name:"p",sig:" ...String or Datatype",returnType:"Datatype",aka:["pattern"],abstract:"Creates a string pattern, a special kind of datatype that can match complex string structures. The pattern matches the entire sequence of strings or datatypes given, in order. ",anchor:"macro_p",category:"patterns",categoryOrder:"1"},peither:{name:"p-either",sig:" ...String or Datatype",returnType:"Datatype",aka:["pattern-either"],abstract:"Creates a string pattern that matches either of the single strings or datatypes given. ",anchor:"macro_p-either",category:"patterns",categoryOrder:"2"},patterneither:{name:"p-either",sig:" ...String or Datatype",returnType:"Datatype",aka:["pattern-either"],abstract:"Creates a string pattern that matches either of the single strings or datatypes given. ",anchor:"macro_p-either",category:"patterns",categoryOrder:"2"},popt:{name:"p-opt",sig:" ...String or Datatype",returnType:"Datatype",aka:["pattern-opt","p-optional","pattern-optional"],abstract:"Creates a string pattern that either matches the sequence of strings or datatypes given, or matches the empty string. ",anchor:"macro_p-opt",category:"patterns",categoryOrder:"3"},patternopt:{name:"p-opt",sig:" ...String or Datatype",returnType:"Datatype",aka:["pattern-opt","p-optional","pattern-optional"],abstract:"Creates a string pattern that either matches the sequence of strings or datatypes given, or matches the empty string. ",anchor:"macro_p-opt",category:"patterns",categoryOrder:"3"},poptional:{name:"p-opt",sig:" ...String or Datatype",returnType:"Datatype",aka:["pattern-opt","p-optional","pattern-optional"],abstract:"Creates a string pattern that either matches the sequence of strings or datatypes given, or matches the empty string. ",anchor:"macro_p-opt",category:"patterns",categoryOrder:"3"},patternoptional:{name:"p-opt",sig:" ...String or Datatype",returnType:"Datatype",aka:["pattern-opt","p-optional","pattern-optional"],abstract:"Creates a string pattern that either matches the sequence of strings or datatypes given, or matches the empty string. ",anchor:"macro_p-opt",category:"patterns",categoryOrder:"3"},pnot:{name:"p-not",sig:" ...String or Datatype",returnType:"Datatype",aka:["pattern-not"],abstract:"Given any number of string characters or non-spread datatypes, this creates a string pattern that matches any one character that doesn't match any of those values. ",anchor:"macro_p-not",category:"patterns"},patternnot:{name:"p-not",sig:" ...String or Datatype",returnType:"Datatype",aka:["pattern-not"],abstract:"Given any number of string characters or non-spread datatypes, this creates a string pattern that matches any one character that doesn't match any of those values. ",anchor:"macro_p-not",category:"patterns"},pmany:{name:"p-many",sig:" [Number], [Number], ...String or Datatype",returnType:"Datatype",aka:["pattern-many"],abstract:"Creates a string pattern that matches the given sequence of strings and datatypes, repeated a given minimum and maximum number of times - or, if these aren't provided, repeated any number of times. ",anchor:"macro_p-many",category:"patterns",categoryOrder:"4"},patternmany:{name:"p-many",sig:" [Number], [Number], ...String or Datatype",returnType:"Datatype",aka:["pattern-many"],abstract:"Creates a string pattern that matches the given sequence of strings and datatypes, repeated a given minimum and maximum number of times - or, if these aren't provided, repeated any number of times. ",anchor:"macro_p-many",category:"patterns",categoryOrder:"4"},pins:{name:"p-ins",sig:" ...String or Datatype",returnType:"Datatype",aka:["p-insensitive","pattern-ins","pattern-insensitive"],abstract:"Creates a string pattern that matches the sequence of strings or datatypes given, case-insensitively. ",anchor:"macro_p-ins",category:"patterns",categoryOrder:"5"},pinsensitive:{name:"p-ins",sig:" ...String or Datatype",returnType:"Datatype",aka:["p-insensitive","pattern-ins","pattern-insensitive"],abstract:"Creates a string pattern that matches the sequence of strings or datatypes given, case-insensitively. ",anchor:"macro_p-ins",category:"patterns",categoryOrder:"5"},patternins:{name:"p-ins",sig:" ...String or Datatype",returnType:"Datatype",aka:["p-insensitive","pattern-ins","pattern-insensitive"],abstract:"Creates a string pattern that matches the sequence of strings or datatypes given, case-insensitively. ",anchor:"macro_p-ins",category:"patterns",categoryOrder:"5"},patterninsensitive:{name:"p-ins",sig:" ...String or Datatype",returnType:"Datatype",aka:["p-insensitive","pattern-ins","pattern-insensitive"],abstract:"Creates a string pattern that matches the sequence of strings or datatypes given, case-insensitively. ",anchor:"macro_p-ins",category:"patterns",categoryOrder:"5"},split:{name:"split",sig:" String or Datatype, String",returnType:"Array",aka:["splitted"],abstract:"This splits up the second value given to it into an array of substrings, after finding and removing each occurrence of the first string or pattern (which is used as a separator value). ",anchor:"macro_split",category:"string"},splitted:{name:"split",sig:" String or Datatype, String",returnType:"Array",aka:["splitted"],abstract:"This splits up the second value given to it into an array of substrings, after finding and removing each occurrence of the first string or pattern (which is used as a separator value). ",anchor:"macro_split",category:"string"},trimmed:{name:"trimmed",sig:" [String or Datatype], String",returnType:"String",aka:[],abstract:"This macro takes one string (the last value), and produces a copy with every character matching the given pattern (the first value) removed from the start and end of it. If no pattern is given, it defaults to removing whitespace, as if `whitespace` was the first argument. ",anchor:"macro_trimmed",category:"string"},if:{name:"if",sig:" Boolean",returnType:"Changer",aka:[],abstract:'This macro accepts only booleans, and produces a changer that can be attached to hooks to hide them "if" the value was false. ',anchor:"macro_if",category:"basics",categoryOrder:"6"},unless:{name:"unless",sig:" Boolean",returnType:"Changer",aka:[],abstract:'This macro is the negated form of (if:): it accepts only booleans, and returns a changer that can be attached hooks to hide them "if" the value was true. For more information, see the documentation of (if:). ',anchor:"macro_unless",category:"basics",categoryOrder:"7"},elseif:{name:"else-if",sig:" Boolean",returnType:"Changer",aka:[],abstract:"This macro's result changes depending on whether the previous hook in the passage was shown or hidden. If the previous hook was shown, then this changer hides the attached hook. Otherwise, it acts like (if:), showing the attached hook if it's true, and hiding it if it's false. If there was no preceding hook before this, then an error message will be printed. ",anchor:"macro_else-if",category:"basics",categoryOrder:"8"},else:{name:"else",sig:"",returnType:"Changer",aka:[],abstract:"This is a convenient limited variant of the (else-if:) macro. It will simply show the attached hook if the preceding hook was hidden, and hide it otherwise. If there was no preceding hook before this, then an error message will be printed. ",anchor:"macro_else",category:"basics",categoryOrder:"9"},hidden:{name:"hidden",sig:"",returnType:"Changer",aka:[],abstract:"Produces a changer that can be attached to hooks to hide them. ",anchor:"macro_hidden",category:"showing and hiding"},verbatim:{name:"verbatim",sig:"",returnType:"Changer",aka:["v6m"],abstract:"When attached to a hook or command, the markup inside that would normally be rendered into HTML is instead presented as plain text, as if the verbatim markup was used on it. ",anchor:"macro_verbatim",category:"basics",categoryOrder:"15"},v6m:{name:"verbatim",sig:"",returnType:"Changer",aka:["v6m"],abstract:"When attached to a hook or command, the markup inside that would normally be rendered into HTML is instead presented as plain text, as if the verbatim markup was used on it. ",anchor:"macro_verbatim",category:"basics",categoryOrder:"15"},live:{name:"live",sig:" [Number]",returnType:"Changer",aka:[],abstract:'When you attach this changer to a hook, the hook becomes "live", which means that it\'s repeatedly re-run every certain number of milliseconds, replacing the source inside of the hook with a newly computed version. ',anchor:"macro_live",category:"live",categoryOrder:"1"},event:{name:"event",sig:" Lambda",returnType:"Changer",aka:[],abstract:"Hooks that have this changer attached will only be run when the given condition becomes true. ",anchor:"macro_event",category:"live",categoryOrder:"3"},more:{name:"more",sig:"",returnType:"Changer",aka:[],abstract:'Hooks that have this changer attached will only be run once no other exits - links, (mouseover:) or (mouseout:) elements - are remaining in the passage, and will reveal "more" prose. ',anchor:"macro_more",category:"live",categoryOrder:"5"},after:{name:"after",sig:" Number, [Number]",returnType:"Changer",aka:[],abstract:"Hooks that have this changer attached will only be run once the given amount of time has passed since the passage was rendered. An optional second number specifies that the player can speed up the delay by holding down a keyboard key or mouse button, or by touching the touch device. ",anchor:"macro_after",category:"live",categoryOrder:"4"},hook:{name:"hook",sig:" String",returnType:"Changer",aka:[],abstract:"A changer that allows the author to give a hook a computed tag name. ",anchor:"macro_hook",category:"styling"},for:{name:"for",sig:" Lambda, [...Any]",returnType:"Changer",aka:["loop"],abstract:"When attached to a hook, this repeats the attached hook, setting a temporary variable to a different value on each repeat. ",anchor:"macro_for",category:"basics",categoryOrder:"10"},loop:{name:"for",sig:" Lambda, [...Any]",returnType:"Changer",aka:["loop"],abstract:"When attached to a hook, this repeats the attached hook, setting a temporary variable to a different value on each repeat. ",anchor:"macro_for",category:"basics",categoryOrder:"10"},transition:{name:"transition",sig:" String",returnType:"Changer",aka:["t8n"],abstract:'A changer that applies a built-in CSS transition to a hook as it appears. Give this macro one of these strings (capitalisation and hyphens ignored): `"instant"`, `"dissolve"`, `"fade"`, `"rumble"`, `"shudder"`, `"pulse"`, `"zoom"`, `"flicker"`, `"slide-left"`, `"slide-right"`, `"slide-up"`, `"slide-down"`, `"fade-left"`, `"fade-right"`, `"fade-up"` and `"fade-down"`. ',anchor:"macro_transition",category:"transitions",categoryOrder:"1"},t8n:{name:"transition",sig:" String",returnType:"Changer",aka:["t8n"],abstract:'A changer that applies a built-in CSS transition to a hook as it appears. Give this macro one of these strings (capitalisation and hyphens ignored): `"instant"`, `"dissolve"`, `"fade"`, `"rumble"`, `"shudder"`, `"pulse"`, `"zoom"`, `"flicker"`, `"slide-left"`, `"slide-right"`, `"slide-up"`, `"slide-down"`, `"fade-left"`, `"fade-right"`, `"fade-up"` and `"fade-down"`. ',anchor:"macro_transition",category:"transitions",categoryOrder:"1"},transitiontime:{name:"transition-time",sig:" Number",returnType:"Changer",aka:["t8n-time"],abstract:"A changer that, when added to a (transition:) changer, adjusts the time of the transition. ",anchor:"macro_transition-time",category:"transitions",categoryOrder:"2"},t8ntime:{name:"transition-time",sig:" Number",returnType:"Changer",aka:["t8n-time"],abstract:"A changer that, when added to a (transition:) changer, adjusts the time of the transition. ",anchor:"macro_transition-time",category:"transitions",categoryOrder:"2"},transitiondelay:{name:"transition-delay",sig:" Number",returnType:"Changer",aka:["t8n-delay"],abstract:"A changer that, when added to a (transition:) changer, delays the start of the transition by a given time. ",anchor:"macro_transition-delay",category:"transitions",categoryOrder:"2"},t8ndelay:{name:"transition-delay",sig:" Number",returnType:"Changer",aka:["t8n-delay"],abstract:"A changer that, when added to a (transition:) changer, delays the start of the transition by a given time. ",anchor:"macro_transition-delay",category:"transitions",categoryOrder:"2"},transitionskip:{name:"transition-skip",sig:" Number",returnType:"Changer",aka:["t8n-skip"],abstract:"A changer that, when added to a (transition:) changer, allows the player to skip or accelerate the transition by holding down a keyboard key or mouse button, or by touching the touch device. ",anchor:"macro_transition-skip",category:"transitions",categoryOrder:"6"},t8nskip:{name:"transition-skip",sig:" Number",returnType:"Changer",aka:["t8n-skip"],abstract:"A changer that, when added to a (transition:) changer, allows the player to skip or accelerate the transition by holding down a keyboard key or mouse button, or by touching the touch device. ",anchor:"macro_transition-skip",category:"transitions",categoryOrder:"6"},transitiondepart:{name:"transition-depart",sig:" String",returnType:"Changer",aka:["t8n-depart"],abstract:"A changer that alters passage links, (link-goto:)s, and most every other kind of link, changing which passage fade-out animation the link uses. ",anchor:"macro_transition-depart",category:"transitions",categoryOrder:"4"},t8ndepart:{name:"transition-depart",sig:" String",returnType:"Changer",aka:["t8n-depart"],abstract:"A changer that alters passage links, (link-goto:)s, and most every other kind of link, changing which passage fade-out animation the link uses. ",anchor:"macro_transition-depart",category:"transitions",categoryOrder:"4"},transitionarrive:{name:"transition-arrive",sig:" String",returnType:"Changer",aka:["t8n-arrive"],abstract:"A changer that alters passage links, (link-goto:)s, and most every other kind of link, changing which passage fade-in animation the link uses. ",anchor:"macro_transition-arrive",category:"transitions",categoryOrder:"5"},t8narrive:{name:"transition-arrive",sig:" String",returnType:"Changer",aka:["t8n-arrive"],abstract:"A changer that alters passage links, (link-goto:)s, and most every other kind of link, changing which passage fade-in animation the link uses. ",anchor:"macro_transition-arrive",category:"transitions",categoryOrder:"5"},button:{name:"button",sig:"",returnType:"Changer",aka:[],abstract:"When applied to a link, this changer styles it so that it resembles a button, and makes it take up the entire passage width. It is not recommended that this be used on non-link hooks. ",anchor:"macro_button",category:"styling"},border:{name:"border",sig:" String, [String], [String], [String]",returnType:"Changer",aka:["b4r"],abstract:"A changer macro that applies a CSS border to the hook. ",anchor:"macro_border",category:"borders",categoryOrder:"1"},b4r:{name:"border",sig:" String, [String], [String], [String]",returnType:"Changer",aka:["b4r"],abstract:"A changer macro that applies a CSS border to the hook. ",anchor:"macro_border",category:"borders",categoryOrder:"1"},bordersize:{name:"border-size",sig:" Number, [Number], [Number], [Number]",returnType:"Changer",aka:["b4r-size"],abstract:"When applied to a hook being changed by the (border:) changer, this multiplies the size of the border by a given amount. ",anchor:"macro_border-size",category:"borders",categoryOrder:"3"},b4rsize:{name:"border-size",sig:" Number, [Number], [Number], [Number]",returnType:"Changer",aka:["b4r-size"],abstract:"When applied to a hook being changed by the (border:) changer, this multiplies the size of the border by a given amount. ",anchor:"macro_border-size",category:"borders",categoryOrder:"3"},cornerradius:{name:"corner-radius",sig:" Number, [Number], [Number], [Number]",returnType:"Changer",aka:[],abstract:"When applied to a hook, this rounds the corners by the given number of pixels, causing the hook to become increasingly round or button-like. ",anchor:"macro_corner-radius",category:"borders",categoryOrder:"4"},bordercolour:{name:"border-colour",sig:" String or Colour, [String or Colour], [String or Colour], [String or Colour]",returnType:"Changer",aka:["b4r-colour","border-color","b4r-color"],abstract:"When applied to a hook being changed by the (border:) changer, this changes the border's colour. ",anchor:"macro_border-colour",category:"borders",categoryOrder:"2"},b4rcolour:{name:"border-colour",sig:" String or Colour, [String or Colour], [String or Colour], [String or Colour]",returnType:"Changer",aka:["b4r-colour","border-color","b4r-color"],abstract:"When applied to a hook being changed by the (border:) changer, this changes the border's colour. ",anchor:"macro_border-colour",category:"borders",categoryOrder:"2"},bordercolor:{name:"border-colour",sig:" String or Colour, [String or Colour], [String or Colour], [String or Colour]",returnType:"Changer",aka:["b4r-colour","border-color","b4r-color"],abstract:"When applied to a hook being changed by the (border:) changer, this changes the border's colour. ",anchor:"macro_border-colour",category:"borders",categoryOrder:"2"},b4rcolor:{name:"border-colour",sig:" String or Colour, [String or Colour], [String or Colour], [String or Colour]",returnType:"Changer",aka:["b4r-colour","border-color","b4r-color"],abstract:"When applied to a hook being changed by the (border:) changer, this changes the border's colour. ",anchor:"macro_border-colour",category:"borders",categoryOrder:"2"},opacity:{name:"opacity",sig:" Number",returnType:"Changer",aka:[],abstract:"This styling changer changes how opaque the attached hook is, using a value from 0 to 1. Reducing the value makes it more transparent. An opacity of 0 makes the hook invisible. ",anchor:"macro_opacity",category:"styling"},font:{name:"font",sig:" String",returnType:"Changer",aka:[],abstract:'This styling changer changes the font used to display the text of the attached hook. Provide the font\'s family name (such as "Helvetica Neue" or "Courier") as a string. ',anchor:"macro_font",category:"styling"},align:{name:"align",sig:" String",returnType:"Changer",aka:[],abstract:"This styling changer changes the alignment of text in the attached hook, as if the `===>`~ arrow syntax was used. In fact, these same arrows (`==>`~, `=><=`~, `<==>`~, `====><=`~ etc.) should be supplied as a string to specify the degree of alignment. ",anchor:"macro_align",category:"styling"},textcolour:{name:"text-colour",sig:" String or Colour",returnType:"Changer",aka:["colour","text-color","color"],abstract:"This styling changer changes the colour used by the text in the attached hook. You can supply either a string with a CSS-style colour (a colour name or RGB number supported by CSS), or a built-in colour object. ",anchor:"macro_text-colour",category:"styling"},colour:{name:"text-colour",sig:" String or Colour",returnType:"Changer",aka:["colour","text-color","color"],abstract:"This styling changer changes the colour used by the text in the attached hook. You can supply either a string with a CSS-style colour (a colour name or RGB number supported by CSS), or a built-in colour object. ",anchor:"macro_text-colour",category:"styling"},textcolor:{name:"text-colour",sig:" String or Colour",returnType:"Changer",aka:["colour","text-color","color"],abstract:"This styling changer changes the colour used by the text in the attached hook. You can supply either a string with a CSS-style colour (a colour name or RGB number supported by CSS), or a built-in colour object. ",anchor:"macro_text-colour",category:"styling"},color:{name:"text-colour",sig:" String or Colour",returnType:"Changer",aka:["colour","text-color","color"],abstract:"This styling changer changes the colour used by the text in the attached hook. You can supply either a string with a CSS-style colour (a colour name or RGB number supported by CSS), or a built-in colour object. ",anchor:"macro_text-colour",category:"styling"},textsize:{name:"text-size",sig:" Number",returnType:"Changer",aka:["size"],abstract:"This styling changer changes the text size of the attached hook by the given fraction. Give it a number greater than 1 to enlarge the text, and a number smaller to decrease the text. Providing 1 to this macro will revert the text size back to the default. ",anchor:"macro_text-size",category:"styling"},size:{name:"text-size",sig:" Number",returnType:"Changer",aka:["size"],abstract:"This styling changer changes the text size of the attached hook by the given fraction. Give it a number greater than 1 to enlarge the text, and a number smaller to decrease the text. Providing 1 to this macro will revert the text size back to the default. ",anchor:"macro_text-size",category:"styling"},textindent:{name:"text-indent",sig:" Number",returnType:"Changer",aka:[],abstract:"This styling changer causes the attached hook to be indented by the given number of pixels. ",anchor:"macro_text-indent",category:"styling"},textrotatez:{name:"text-rotate-z",sig:" Number",returnType:"Changer",aka:["text-rotate"],abstract:"This styling changer visually rotates the attached hook clockwise by a given number of degrees. The rotational axis is in the centre of the hook. ",anchor:"macro_text-rotate-z",category:"styling"},textrotate:{name:"text-rotate-z",sig:" Number",returnType:"Changer",aka:["text-rotate"],abstract:"This styling changer visually rotates the attached hook clockwise by a given number of degrees. The rotational axis is in the centre of the hook. ",anchor:"macro_text-rotate-z",category:"styling"},textrotatey:{name:"text-rotate-y",sig:" Number",returnType:"Changer",aka:[],abstract:"This styling changer visually rotates the attached hook clockwise, around the Y axis (vertical), by a given number of degrees, making it appear to lean into the page. The rotational axis is in the centre of the hook. ",anchor:"macro_text-rotate-y",category:"styling"},textrotatex:{name:"text-rotate-x",sig:" Number",returnType:"Changer",aka:[],abstract:"This styling changer visually rotates the attached hook clockwise, around the X axis (horizontal), by a given number of degrees, making it appear to lean into the page. The rotational axis is in the centre of the hook. ",anchor:"macro_text-rotate-x",category:"styling"},background:{name:"background",sig:" Colour or String or Gradient",returnType:"Changer",aka:["bg"],abstract:'This styling changer alters the background colour or background image of the attached hook. Supplying a gradient (produced by (gradient:)) will set the background to that gradient. Supplying a colour (produced by (rgb:) or (hsl:), a built-in colour value like `red`, or a bare colour value like #FA9138) will set the background to a flat colour. CSS strings that resemble HTML hex colours (like "#FA9138") will also provide flat colour. Other strings will be interpreted as an image URL, and the background will be set to it. ',anchor:"macro_background",category:"styling"},bg:{name:"background",sig:" Colour or String or Gradient",returnType:"Changer",aka:["bg"],abstract:'This styling changer alters the background colour or background image of the attached hook. Supplying a gradient (produced by (gradient:)) will set the background to that gradient. Supplying a colour (produced by (rgb:) or (hsl:), a built-in colour value like `red`, or a bare colour value like #FA9138) will set the background to a flat colour. CSS strings that resemble HTML hex colours (like "#FA9138") will also provide flat colour. Other strings will be interpreted as an image URL, and the background will be set to it. ',anchor:"macro_background",category:"styling"},textstyle:{name:"text-style",sig:" ...String",returnType:"Changer",aka:[],abstract:'This applies one or more selected built-in text styles to the hook\'s text. Give this macro one of these strings (capitalisation and hyphens ignored): `"none"`, `"bold"`, `"italic"`, `"underline"`, `"double-underline"`, `"wavy-underline"`, `"strike"`, `"double-strike"`, `"wavy-strike"`, `"superscript"`, `"subscript"`, `"blink"`, `"shudder"`, `"mark"`, `"condense"`, `"expand"`, `"outline"`, `"shadow"`, `"emboss"`, `"smear"`, `"blur"`, `"blurrier"`, `"mirror"`, `"upside-down"`, `"fade-in-out"`, `"rumble"`, `"sway"`, `"buoy"` or `"fidget"`. ',anchor:"macro_text-style",category:"styling"},collapse:{name:"collapse",sig:"",returnType:"Changer",aka:[],abstract:"When attached to a hook, this collapses the whitespace within the hook, in the same manner as the collapsing whitespace markup. ",anchor:"macro_collapse",category:"styling"},hoverstyle:{name:"hover-style",sig:" Changer",returnType:"Changer",aka:[],abstract:"Given a style-altering changer, it makes a changer which only applies when the hook or command is hovered over with the mouse pointer, and is removed when hovering off. ",anchor:"macro_hover-style",category:"styling"},css:{name:"css",sig:" String",returnType:"Changer",aka:[],abstract:'This takes a string of inline CSS, and applies it to the hook, as if it were a HTML "style" property. ',anchor:"macro_css",category:"styling"},testtrue:{name:"test-true",sig:" ...[Any]",returnType:"Changer",aka:[],abstract:"If you want to test your passage, while ignoring a specific changer macro in it, temporarily change that changer macro's name to (test-true:), and it will ignore all of the data given to it, while enabling the hook. ",anchor:"macro_test-true",category:"debugging",categoryOrder:"2"},testfalse:{name:"test-false",sig:" ...[Any]",returnType:"Changer",aka:[],abstract:"If you want to test your passage in order to see what would happen if an (if:), (unless:) or (else-if:) macro would hide the hook it's attached to, you can temporarily change the name of the macro to (test-false:), which causes it to ignore the data given to it and act as if it was given `false`. ",anchor:"macro_test-false",category:"debugging",categoryOrder:"3"},animate:{name:"animate",sig:" HookName, String, [Number]",returnType:"Command",aka:[],abstract:"A command that causes a hook to briefly animate, as if a (transition:) was applied to it. The length of time that the animation plays can be optionally altered by providing a number. ",anchor:"macro_animate",category:"transitions"},box:{name:"box",sig:" String, [Number]",returnType:"Changer",aka:[],abstract:'When attached to a hook, it becomes a "box", with a given width proportional to the containing element\'s width, an optional number of lines tall, and a scroll bar if its contained text is longer than its height can contain. ',anchor:"macro_box",category:"styling"},floatbox:{name:"float-box",sig:" String, String",returnType:"Changer",aka:[],abstract:'When attached to a hook, it becomes a "floating box", placed at a given portion of the window, sized proportionally to the window\'s dimensions, and with a scroll bar if its contained text is longer than its height can contain. ',anchor:"macro_float-box",category:"styling"},str:{name:"str",sig:" ...[Number or String or Boolean or Array]",returnType:"String",aka:["string","text"],abstract:"(str:) accepts any amount of expressions and tries to convert them all to a single String. ",anchor:"macro_str",category:"string",categoryOrder:"1"},string:{name:"str",sig:" ...[Number or String or Boolean or Array]",returnType:"String",aka:["string","text"],abstract:"(str:) accepts any amount of expressions and tries to convert them all to a single String. ",anchor:"macro_str",category:"string",categoryOrder:"1"},text:{name:"str",sig:" ...[Number or String or Boolean or Array]",returnType:"String",aka:["string","text"],abstract:"(str:) accepts any amount of expressions and tries to convert them all to a single String. ",anchor:"macro_str",category:"string",categoryOrder:"1"},source:{name:"source",sig:" Any",returnType:"String",aka:[],abstract:"When given almost any data value, this will produce a string of Harlowe source code that can, when run, create that value exactly. ",anchor:"macro_source",category:"string"},substring:{name:"substring",sig:" String, Number, Number",returnType:"String",aka:[],abstract:"This macro produces a substring of the given string, cut from two inclusive number positions. ",anchor:"macro_substring",category:"string"},lowercase:{name:"lowercase",sig:" String",returnType:"String",aka:[],abstract:"This macro produces a lowercase version of the given string. ",anchor:"macro_lowercase",category:"string"},uppercase:{name:"uppercase",sig:" String",returnType:"String",aka:[],abstract:"This macro produces an uppercase version of the given string. ",anchor:"macro_uppercase",category:"string"},lowerfirst:{name:"lowerfirst",sig:" String",returnType:"String",aka:[],abstract:"This macro produces a version of the given string, where the first alphanumeric character is lowercase, and other characters are left as-is. ",anchor:"macro_lowerfirst",category:"string"},upperfirst:{name:"upperfirst",sig:" String",returnType:"String",aka:[],abstract:"This macro produces a version of the given string, where the first alphanumeric character is uppercase, and other characters are left as-is. ",anchor:"macro_upperfirst",category:"string"},words:{name:"words",sig:" String",returnType:"Array",aka:[],abstract:'This macro takes a string and creates an array of each word ("word" meaning a sequence of non-whitespace characters) in the string. ',anchor:"macro_words",category:"string"},strrepeated:{name:"str-repeated",sig:" Number, String",returnType:"String",aka:["string-repeated"],abstract:"A special shorthand combination of the (str:) and (repeated:) macros, this accepts a single string and duplicates it the given number of times. ",anchor:"macro_str-repeated",category:"string"},stringrepeated:{name:"str-repeated",sig:" Number, String",returnType:"String",aka:["string-repeated"],abstract:"A special shorthand combination of the (str:) and (repeated:) macros, this accepts a single string and duplicates it the given number of times. ",anchor:"macro_str-repeated",category:"string"},strreversed:{name:"str-reversed",sig:" String",returnType:"String",aka:["string-reversed"],abstract:"A special shorthand combination of the (str:) and (reversed:) macros, this accepts a single string and reverses it. ",anchor:"macro_str-reversed",category:"string"},stringreversed:{name:"str-reversed",sig:" String",returnType:"String",aka:["string-reversed"],abstract:"A special shorthand combination of the (str:) and (reversed:) macros, this accepts a single string and reverses it. ",anchor:"macro_str-reversed",category:"string"},joined:{name:"joined",sig:" ...String",returnType:"String",aka:[],abstract:"Using the first string as a separator value, this macro takes all of the other strings given to it, and joins them into a single string. ",anchor:"macro_joined",category:"string"},plural:{name:"plural",sig:" Number, String, [String]",returnType:"String",aka:[],abstract:'This macro takes a whole number and a string, then converts the number to a string, joins them up with a space character, and pluralises the string if the number wasn\'t 1 or -1. By default, this pluralisation is done by adding "s", as in some English plurals. An optional extra string can specify a different plural word to use instead. ',anchor:"macro_plural",category:"string"},strnth:{name:"str-nth",sig:" Number",returnType:"String",aka:["string-nth"],abstract:'This macro takes a whole number, and converts it to a string comprising an English ordinal abbreviation (of the form "nth", such as "1st", "22nd", etc.). ',anchor:"macro_str-nth",category:"string"},stringnth:{name:"str-nth",sig:" Number",returnType:"String",aka:["string-nth"],abstract:'This macro takes a whole number, and converts it to a string comprising an English ordinal abbreviation (of the form "nth", such as "1st", "22nd", etc.). ',anchor:"macro_str-nth",category:"string"},num:{name:"num",sig:" String",returnType:"Number",aka:["number"],abstract:"This macro converts strings to numbers by reading the digits in the entire string. It can handle decimal fractions and negative numbers. If any letters or other unusual characters appear in the number, it will result in an error. ",anchor:"macro_num",category:"number"},number:{name:"num",sig:" String",returnType:"Number",aka:["number"],abstract:"This macro converts strings to numbers by reading the digits in the entire string. It can handle decimal fractions and negative numbers. If any letters or other unusual characters appear in the number, it will result in an error. ",anchor:"macro_num",category:"number"},datatype:{name:"datatype",sig:" Any",returnType:"Datatype",aka:[],abstract:"This macro takes any storeable value, and produces a datatype that matches it. ",anchor:"macro_datatype",category:"custom macros",categoryOrder:"5"},datapattern:{name:"datapattern",sig:" Any",returnType:"Any",aka:[],abstract:"This takes any storeable value, and produces a datatype that matches it, in a manner similar to (datatype:). However, when given an array or datamap, it creates an array or datamap with its values replaced with their datatypes, which can be used as a more accurate pattern with `matches` or (set:) elsewhere. ",anchor:"macro_datapattern",category:"custom macros",categoryOrder:"6"},rgb:{name:"rgb",sig:" Number, Number, Number, [Number]",returnType:"Colour",aka:["rgba"],abstract:"This macro creates a colour using the three red (r), green (g) and blue (b) values provided, whose values are numbers between 0 and 255, and, optionally, the transparency (alpha, or a) percentage, which is a fractional value between 0 (fully transparent) and 1 (fully visible). Anything drawn with a partially transparent colour will itself be partially transparent. You can then layer such elements to produce a few interesting visual effects. ",anchor:"macro_rgb",category:"colour",categoryOrder:"2"},rgba:{name:"rgb",sig:" Number, Number, Number, [Number]",returnType:"Colour",aka:["rgba"],abstract:"This macro creates a colour using the three red (r), green (g) and blue (b) values provided, whose values are numbers between 0 and 255, and, optionally, the transparency (alpha, or a) percentage, which is a fractional value between 0 (fully transparent) and 1 (fully visible). Anything drawn with a partially transparent colour will itself be partially transparent. You can then layer such elements to produce a few interesting visual effects. ",anchor:"macro_rgb",category:"colour",categoryOrder:"2"},hsl:{name:"hsl",sig:" Number, Number, Number, [Number]",returnType:"Colour",aka:["hsla"],abstract:"This macro creates a colour using the given hue (h) angle in degrees, as well as the given saturation (s) and lightness (l) percentages, and, optionally, the transparency (alpha, or a) percentage, which is a fractional value between 0 (fully transparent) and 1 (fully visible). Anything drawn with a partially transparent colour will itself be partially transparent. You can then layer such elements to produce a few interesting visual effects. ",anchor:"macro_hsl",category:"colour",categoryOrder:"1"},hsla:{name:"hsl",sig:" Number, Number, Number, [Number]",returnType:"Colour",aka:["hsla"],abstract:"This macro creates a colour using the given hue (h) angle in degrees, as well as the given saturation (s) and lightness (l) percentages, and, optionally, the transparency (alpha, or a) percentage, which is a fractional value between 0 (fully transparent) and 1 (fully visible). Anything drawn with a partially transparent colour will itself be partially transparent. You can then layer such elements to produce a few interesting visual effects. ",anchor:"macro_hsl",category:"colour",categoryOrder:"1"},lch:{name:"lch",sig:" Number, Number, Number, [Number]",returnType:"Colour",aka:["lcha"],abstract:"This macro creates a colour using three values in the CIELAB colour model - a lightness (l) percentage, a chroma (c) value, and a hue (h) angle in degrees, and, optionally, the transparency (alpha, or a) percentage, which is a fractional value between 0 (fully transparent) and 1 (fully visible). Anything drawn with a partially transparent colour will itself be partially transparent. You can then layer such elements to produce a few interesting visual effects. ",anchor:"macro_lch",category:"colour",categoryOrder:"3"},lcha:{name:"lch",sig:" Number, Number, Number, [Number]",returnType:"Colour",aka:["lcha"],abstract:"This macro creates a colour using three values in the CIELAB colour model - a lightness (l) percentage, a chroma (c) value, and a hue (h) angle in degrees, and, optionally, the transparency (alpha, or a) percentage, which is a fractional value between 0 (fully transparent) and 1 (fully visible). Anything drawn with a partially transparent colour will itself be partially transparent. You can then layer such elements to produce a few interesting visual effects. ",anchor:"macro_lch",category:"colour",categoryOrder:"3"},complement:{name:"complement",sig:" Colour",returnType:"Colour",aka:[],abstract:"When given a colour, this provides a complement to that colour. ",anchor:"macro_complement",category:"colour",categoryOrder:"4"},palette:{name:"palette",sig:" String, Colour",returnType:"Array",aka:[],abstract:"When given a string specifying a palette type, and a colour, this macro produces an array containing the given colour followed by three additional colours that together form a palette, for use with (text-colour:), (background:), and other macros. ",anchor:"macro_palette",category:"colour",categoryOrder:"5"},gradient:{name:"gradient",sig:" Number, ...Number, Colour",returnType:"Gradient",aka:[],abstract:'When given a degree angle, followed by any number of number-colour pairs called "colour stops", this macro produces a gradient that fades between those colours in the direction of the angle. ',anchor:"macro_gradient",category:"colour",categoryOrder:"6"},stripes:{name:"stripes",sig:" Number, Number, Colour, Colour",returnType:"Gradient",aka:[],abstract:"When given a degree angle, a pixel distance, and two or more colours, this macro produces a gradient that draws a striped background, with each stripe as wide as the distance, and alternating through the given colours. ",anchor:"macro_stripes",category:"colour",categoryOrder:"7"},hooksnamed:{name:"hooks-named",sig:" String",returnType:"HookName",aka:[],abstract:"When given a string, this creates a HookName from it. This can be used to dynamically create HookNames. ",anchor:"macro_hooks-named",category:"basics"},cond:{name:"cond",sig:" Boolean, Any, ...Any",returnType:"Any",aka:[],abstract:'When given a sequence of booleans (the "conditions") paired with values, this provides the first value that was paired with a `true` condition. This can give you one value or another based on a quick check. ',anchor:"macro_cond",category:"basics",categoryOrder:"12"},weekday:{name:"weekday",sig:"",returnType:"String",aka:[],abstract:'This date/time macro produces one of the strings "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" or "Saturday", based on the weekday on the current player\'s system clock. ',anchor:"macro_weekday",category:"date and time"},monthday:{name:"monthday",sig:"",returnType:"Number",aka:[],abstract:"This date/time macro produces a number corresponding to the day of the month on the current player's system clock. This should be between 1 (on the 1st of the month) and 31, inclusive. ",anchor:"macro_monthday",category:"date and time"},currenttime:{name:"current-time",sig:"",returnType:"String",aka:[],abstract:'This date/time macro produces a string of the current 12-hour time on the current player\'s system clock, in the format "12:00 AM". ',anchor:"macro_current-time",category:"date and time"},currentdate:{name:"current-date",sig:"",returnType:"String",aka:[],abstract:'This date/time macro produces a string of the current date the current player\'s system clock, in the format "Thu Jan 01 1970". ',anchor:"macro_current-date",category:"date and time"},min:{name:"min",sig:" ...Number",returnType:"Number",aka:[],abstract:"This maths macro accepts numbers, and evaluates to the lowest valued number. ",anchor:"macro_min",category:"maths"},max:{name:"max",sig:" ...Number",returnType:"Number",aka:[],abstract:"This maths macro accepts numbers, and evaluates to the highest valued number. ",anchor:"macro_max",category:"maths"},abs:{name:"abs",sig:" Number",returnType:"Number",aka:[],abstract:"This maths macro finds the absolute value of a number (without the sign). ",anchor:"macro_abs",category:"maths"},sign:{name:"sign",sig:" Number",returnType:"Number",aka:[],abstract:"This maths macro produces -1 when given a negative number, 0 when given 0, and 1 when given a positive number. ",anchor:"macro_sign",category:"maths"},sin:{name:"sin",sig:" Number",returnType:"Number",aka:[],abstract:"This maths macro computes the sine of the given number of radians. ",anchor:"macro_sin",category:"maths"},cos:{name:"cos",sig:" Number",returnType:"Number",aka:[],abstract:"This maths macro computes the cosine of the given number of radians. ",anchor:"macro_cos",category:"maths"},tan:{name:"tan",sig:" Number",returnType:"Number",aka:[],abstract:"This maths macro computes the tangent of the given number of radians. ",anchor:"macro_tan",category:"maths"},floor:{name:"floor",sig:" Number",returnType:"Number",aka:[],abstract:"This macro rounds the given number downward to a whole number. If a whole number is provided, it returns the number as-is. ",anchor:"macro_floor",category:"number"},round:{name:"round",sig:" Number",returnType:"Number",aka:[],abstract:"This macro rounds the given number to the nearest whole number - downward if its decimals are smaller than 0.5, and upward otherwise. If a whole number is provided, it returns the number as-is. ",anchor:"macro_round",category:"number"},trunc:{name:"trunc",sig:" Number",returnType:"Number",aka:[],abstract:'This macro rounds the given number towards zero. This "truncates" the fractional portion of the number, removing it and leaving just the whole portion. ',anchor:"macro_trunc",category:"number"},ceil:{name:"ceil",sig:" Number",returnType:"Number",aka:[],abstract:"This macro rounds the given number upward to a whole number. If a whole number is provided, it returns the number as-is. ",anchor:"macro_ceil",category:"number"},pow:{name:"pow",sig:" Number, Number",returnType:"Number",aka:[],abstract:"This maths macro raises the first number to the power of the second number, and provides the result. ",anchor:"macro_pow",category:"maths"},exp:{name:"exp",sig:" Number",returnType:"Number",aka:[],abstract:"This maths macro raises Euler's number to the power of the given number, and provides the result. ",anchor:"macro_exp",category:"maths"},sqrt:{name:"sqrt",sig:" Number",returnType:"Number",aka:[],abstract:"This maths macro produces the square root of the given number. ",anchor:"macro_sqrt",category:"maths"},log:{name:"log",sig:" Number",returnType:"Number",aka:[],abstract:"This maths macro produces the natural logarithm (the base-e logarithm) of the given number. ",anchor:"macro_log",category:"maths"},log10:{name:"log10",sig:" Number",returnType:"Number",aka:[],abstract:"This maths macro produces the base-10 logarithm of the given number. ",anchor:"macro_log10",category:"maths"},log2:{name:"log2",sig:" Number",returnType:"Number",aka:[],abstract:"This maths macro produces the base-2 logarithm of the given number. ",anchor:"macro_log2",category:"maths"},random:{name:"random",sig:" Number, [Number]",returnType:"Number",aka:[],abstract:"This macro produces a whole number randomly selected between the two whole numbers, inclusive (or, if the second number is absent, then between 0 and the first number, inclusive). ",anchor:"macro_random",category:"number"},either:{name:"either",sig:" ...Any",returnType:"Any",aka:[],abstract:"Give this macro several values, separated by commas, and it will pick and return one of them randomly. ",anchor:"macro_either",category:"basics",categoryOrder:"11"},nth:{name:"nth",sig:" Number, ...Any",returnType:"Any",aka:[],abstract:"Given a positive whole number and a sequence of values, this selects the nth value in the sequence, where n is the number. If n is larger than the number of items in the sequence, the selection loops around to the start. ",anchor:"macro_nth",category:"basics",categoryOrder:"13"}}};this&&this.loaded?(this.modules||(this.modules={}),this.modules.ShortDefs=e):this.ShortDefs=e}.call(eval("this")),function(){var e=void 0,t=function(e){return(e+"").toLowerCase().replace(/-|_/g,"")},a="This markup gives the enclosed text ",r=function(e){return'The "'+e+'" operator produces the boolean value `true` if '},o=" Otherwise, it produces `false`.",n="If they contain strings, numbers, commands or changers, you can place them directly in your prose to display the value, run the command, or apply the changer.",i=function(e){return'The keyword "'+e+'" makes the code on the right into a "'+e+'" lambda clause. '},s={hr:"This is a horizontal rule. It extends across the entire passage width (or the column width, if it's in a column).",bulleted:"The `*` at the start of this line makes this a bulleted list item.",numbered:"The `0.` at the start of this line makes this a numbered list item.",heading:function(e){var t=e.depth;return"This is a level "+t+" "+(1===t?"(largest) ":"")+"heading mark."},align:function(e){var t=e.align;return"This is an aligner mark. The text after this is "+("justify"===t?"justified (spaced out to touch both edges)":"aligned to the "+t)+". Write `<==` for left alignment, `==>` for right alignment, `=><=` for centering, and `<==>` for justified alignment."},column:function(e){var t=e.text,a=e.width,r=e.marginRight,o=e.marginLeft;return t.trim().startsWith("|")&&t.trim().endsWith("|")?"This mark ends all of the preceding columns. The text after this is not in a column.":"The text after this mark is in a column with width multiplier "+a+"x, a left margin of "+o+"em, and a right margin of "+r+"em. Write more consecutive `|` marks to increase the width, and place `=` to the left and right to increase the margin on that side."},em:a+"emphasis style.",strong:a+"strong emphasis style.",bold:a+"bold style.",italic:a+"italic style.",strike:a+"strikethrough style.",sup:a+"superscript style.",comment:"This is a HTML comment. Everything inside it will be ignored by Harlowe.",scriptStyleTag:function(){return s.tag},tag:"This is a HTML tag. Harlowe supports raw HTML in passage code.",hook:function(e){var t=e.type,a=e.name,r=e.tagPosition;return("hook"===t?"These square brackets are a hook, enclosing this section of passage code.":"")+" Changer values can be attached to the left of hooks."+(a?" This hook has a nametag on the "+("prepended"===r?"left":"right")+". This allows the hook to be referred to in macro calls using the hook name ?"+a+".":"")},unclosedHook:function(e){return"This marks all of the remaining code in the passage as being inside a hook."+s.hook(e)},verbatim:"This is verbatim markup. Place text between matching pairs and amounts of ` marks, and Harlowe will ignore the markup within, instead displaying it as-is.",unclosedCollapsed:function(e){return s.collapsed(e)},collapsed:function(e){var t=e.type;return"This is "+("unclosedCollapsed"===t?"unclosed ":"")+"collapsed whitespace markup. All sequences of consecutive whitespace within "+("unclosedCollapsed"===t?"the remainder of the passage ":"the { and } marks")+" will be replaced with a single space. You can use this to space out your code and keep your passage readable. To include a line break within this markup that will be preserved, use a HTML <br> tag."},escapedLine:"This is an escaped line break mark. This removes the line break before or after it from the displayed passage.",twineLink:function(e){return'This is a link to the passage "'+e.passage+'". Links, like hooks and commands, can have changer values attached to the left.'},br:"",url:"",variable:"This is a story-wide variable. After this has been set to a data value, it can be used anywhere else in the story. Use these to store data values related to your story's game state, or changers that are commonly used. "+n,tempVariable:"This is a temp variable. It can be used in the same passage and hook in which it's first set to a data value. Use these to store values temporarily, or that won't be needed elsewhere. "+n,macroName:function(e,t){var a=_slicedToArray(t,2)[1];return s.macro(a)},grouping:"Use these grouping brackets to ensure operations are performed in a certain order. Code in brackets will be computed before the code adjacent to it.",property:function(e){var t=e.type,a=e.name;return(a?"This retrieves the data stored at the `"+a+"` "+(a.match(/^\d+(?:th|nd|st|rd)(?:last)?(?:to\d+(?:nth|nd|st|rd)(?:last)?)?$/g)?"position"+(a.includes("to")?"s":""):"name")+" of the container value on the "+(t.startsWith("belonging")?"right":"left")+".
":"")+"Some types of data values (arrays, datamaps, datasets, strings, colours, gradients, custom macros, and typedvars) are also storage containers for other values. You can access a specific value stored in them using that value's data name (or a string or number value in brackets) by writing value `'s` name, or name `of` value."},possessiveOperator:function(e){return s.property(e)},itsProperty:function(e){return s.property(e)},itsOperator:function(e){return s.identifier(e)},belongingItProperty:function(e){return s.property(e)},belongingItOperator:function(e){return s.property(e)},belongingProperty:function(e){return s.property(e)},belongingOperator:function(e){return s.property(e)},escapedStringChar:"",string:'This is string data. Strings are sequences of text data enclosed in matching " or \' marks. Use a `\\` inside a string to "escape" the next character. Escaped " or \' marks don\'t count as the end of the string.',hookName:function(e){return'This hook name refers to all hooks named "`'+e.name+'`" in this passage.'},cssTime:function(e){return"This is number data in CSS time format. Harlowe automatically converts this to a number of milliseconds, so this is identical to "+e.value+"."},datatype:"This is the name of a datatype. Use these names to check what kind of data a data value is, using the `matches` or `is a` operators. You can also use them in a `(set:)` or `(put:)` to restrict that variable's data for error-checking purposes. (See the documentation for details.)",colour:function(e){return"This is a "+(e.text.startsWith("#")?"HTML colour value. Harlowe can use this as colour data.":"built-in Harlowe colour value. The built-in colours are `red`, `orange`, `yellow`, `lime`, `green`, `cyan` (alias `aqua`), `blue`, `navy`, `purple`, `fuchsia` (alias `magenta`), `white`, `gray` (alias `grey`), `black`, and `transparent`.")},number:"This is number data. Harlowe supports whole numbers (like `2`), negative numbers (like `-2`), and numbers with a decimal fraction component (like `2.2`).",inequality:function(e){var t=e.operator,a=(">"===(t=e.negate?{">":"<=","<":">=",">=":"<","<=":">"}[t]:t)[0]?"greater ":"less ")+"than"+(t.endsWith("=")?" or equal to":"");return r(a)+" the number value on the left is "+a+" the number value on the right."+o},augmentedAssign:"This is an augmented assignment operator, similar to the ones in Javascript.",identifier:function(e){var a=e.text;return(a=t(a)).startsWith("it")?"The keyword it is a shorthand for the leftmost part of an operation. You can write `(if: $candles < 2 and it > 5)` instead of `(if: $candles < 2 and $candles > 5)` or `(set: $candles to it + 3)` instead of `(set: $candles to $candles + 3)`. When accessing a data value from it, you can write it as its, such as in `its length > 0`.":"time"===a?"The keyword time equals the number of milliseconds passed since the passage was displayed.":a.startsWith("exit")?'The keyword exits or exit equals the number of currently available "exits" in a passage - the number of link, mouseover, and mouseout elements that are still active on the page, which could lead to new content and progress.':a.startsWith("visit")?"The keyword visits or visit equals the number of times the current passage has been visited this game, including the current visit. In `(storylet:)` macros, when Harlowe decides whether this passage is available to `(open-storylets:)`, this will often be 0, but when actually visiting the passage, it will be at least 1.":"pos"===a?'The keyword pos should ONLY be used within a "where" or "via" lambda clause. It refers to the position of the current data value that this lambda is processing.':""},whitespace:"Whitespace within macro calls is simply used to separate values. You can use as much or as little as you like to make your code more readable.",error:function(e,t){var a=_slicedToArray(t,1)[0],r=a.message,o=a.explanation;return r+(o?" "+o:"")},boolean:"The keywords true or false are the two boolean values. They are produced by comparison operators (`<`, `>`, `is`, etc.) and other macros.",is:'The "is" operator produces the boolean value `true` if the values on each sides of it are exactly the same.'+o,to:'Use the "to" operator only inside a `(set:)` macro call. Place it to the left of the data, and right of the variable to set the data to.',into:'Use the "into" operator only inside a `(put:)`, `(move:)` or `(unpack:)` macro call. Place it to the right of the data, and left of the destination to put the data.',where:i("where")+"This lambda will search for input values where the right side, once computed, produces `true`.",when:i("when")+"This lambda will cause the macro to only do something when the right side, once computed, produces `true`.",via:i("via")+"This lambda will convert input values into new values via computing the expression to the right.",making:i("making")+"This is used only by the `(folded:)` macro. The lambda makes the temp variable on the right, which becomes the final value of the `(folded:)` call.",each:i("each")+"This causes the macro to, for each input value, place that value in the temp variable on the right, before running the other lambda clauses adjacent to this one (if any).",and:r("and")+"the values on each side of it are both `true`."+o,or:r("or")+"the values on each side of it are both `false`."+o,not:'The "not" operator inverts the boolean value to its right, turning `true` to `false` and vice-versa.',isNot:r("is not")+"the values on each sides of it are NOT exactly the same."+o,contains:r("contains")+"the array, string, or dataset on the left contains the data on the right, or if the datamap on the left has the data name on the right."+o,doesNotContain:r("does not contain")+"the array, string, or dataset on the left does NOT contain the data on the right, or if the datamap on the left does NOT have the data name on the right."+o,isIn:r("is in")+"the data on the left is in the array, string, datamap or dataset on the right."+o,isA:r("is a")+"the data on the left matches the datatype on the right."+o,isNotA:r("is not a")+"the data on the left does NOT match the datatype on the right."+o,isNotIn:r("is not in")+"the data on the left is NOT in the array, string, datamap or dataset on the right."+o,matches:r("matches")+"one side describes the other - that is, if one side is a datatype that describes the other, or both sides are arrays, datamaps, or datasets, with data in positions that matches those in the other, or if both sides are equal."+o,doesNotMatch:r("does not match")+"one side does NOT describe the other."+o,bind:'The bind or 2bind keyword specifies that the variable to the right should be "bound" to an interactable element. This is used only by certain command macros, like `(dialog:)` or `(cycling-link:)`.',comma:"Use commas to separate the values that you give to macro calls.",spread:"This is a spreader. These spread out the values in the array, string or dataset to the right of it, as if each value was individually placed in the call and separated with commas.
Alternatively, if a datatype is to the right of it, that datatype becomes a spread datatype that matches zero or more of itself.",typeSignature:"The -type suffix is used to restrict the variable on the right to only holding data that matches the data pattern on the left. Variables restricted in this way are called typed variables.",addition:"Use the addition operator to add two numbers together, as well as join two strings or two arrays, and combine two datamaps, two datasets, two changers, or two colours.This operator can also combine two hook names, creating a hook name that applies to both names of hooks.",subtraction:"Use the subtraction operator to subtract two numbers, as well as create a copy of the array or dataset on the left that doesn't contain values of the array or dataset on the right.",multiplication:"Use the multiplication operator to multiply two numbers.",division:function(e){return("/"===e.text?"Use the division operator to divide":"Use the modulo operator to get the remainder (modulo) from dividing")+" two numbers. Dividing a number by 0 produces an error."},macro:function(a){var r=a.name;if(void 0===r)return"This macro call is incomplete or erroneously written. Macro calls should consist of `(`, the name (which is case-insensitive and dash-insensitive), `:`, zero or more expressions separated by commas, then `)`, in that order.";if("_"===r[0]||"$"===r[0])return"This is a call to a custom macro stored in the "+r+" variable. Custom macros are created with the `(macro:)` macro, and must be stored in variables in order to be used.";var o=e.Macro[t(r)];if(!o)return"This is a call to a nonexistent or misspelled macro. This will cause an error.";var n,i,s=o.returnType.toLowerCase();return"This is a call to the `("+o.name+":)` macro. "+("instant"===s||"command"===s?'It produces a command, so it should appear in passage code without being connected to a hook.':"changer"===s?'It produces a changer, which can be placed to the left of a hook or a command (passage links are commands), or combined with other changers.':"any"===s||"string"===s?"":'Since it produces a '+s+", it should be nested inside another macro call that can use "+s+" (or any) data.")+""+(n=o.anchor,i="("+o.name+": "+o.sig+") -> "+o.returnType,''+i+"")+""+(o.aka.length?"
Also known as: "+o.aka.map(function(e){return"("+e+":)"}).join(", ")+"":"")+"
"+o.abstract+"
"},text:function(e,t){var a=e.changerAttachment,r=e.text;if(a)return"+"===r.trim()?'If the code to the left and right of this + sign produces two changer values, then they will be added together (even though this text is outside of a macro call), removing the + sign and the surrounding whitespace.
Note that there needs to be a hook or a command after the rightmost changer, so that the combined changer can attach to it.':'If the code on the left produces a changer, and the code on the right is a hook or a command (passage links are commands), then the changer will attach to the right, applying its changes and removing this whitespace.
You can place any amount of whitespace, including newlines, between a changer and the hook or command it\'s attached to.';if(r.trim()&&t.reduce(function(e,t){return void 0===e?"macro"===t.type||"hook"!==t.type&&e:e},void 0))return"This doesn't seem to be valid code. Note that inside macro calls, only other macro calls, data, operators and whitespace are permitted."}},c=document.createElement("div");c.className="harlowe-3-tooltip";var l=0;function h(){l<1?c.style.display="":(l-=1,requestAnimationFrame(h))}this&&this.loaded&&(this.modules||(this.modules={}),e=this.modules.ShortDefs,this.modules.Tooltips=function(e,t,a){if(c.setAttribute("style","display:none"),t.somethingSelected())l=0;else{var r=document.querySelector(".CodeMirror");1&c.compareDocumentPosition(document)&&r.append(c);var o=t.getCursor(),n=a.pathAt(t.indexFromPos(o));if(n.length){var i=_slicedToArray(n,1)[0],d=s[i.type];if("function"==typeof d&&(d=d(i,n)),d){d=d.replace(/`([^`]+)`/g,function(e,t){return""+t+""}),c.innerHTML=d+"