This set of macros/functions aim to provide an easy way to set up content which is revealed bit-by-bit via user interaction.
Using nested <<linkreplace>> and <<linkappend>> works, but gets tedious and is often prone to errors. The CTP (Click To Proceed: original-est name ever) macros make it a bit easier by turning them into blocks instead of nests.
If using the Twine desktop/web app, copy contents of CTP.js to Story JavaScript, and contents of CTP.css to Story Stylesheet.
If using a compiler like Tweego, drop CTP.js and CTP.css to your source folder.
<<ctp "testID">>
This is the first string.
<<ctpNext clear>>
Second! It cleared the first one out!
<<ctpNext nobr>>
Third, but with nobr...
<<ctpNext t8n>>
And the final one. With a transition!
<</ctp>>
<<link "Next">>
<<ctpAdvance "testID">>
<</link>>id: (string) Unique ID to be used to identify the chain of content. Naming rule follows the same as those of SugarCube variable names (learn more here).
Example:
<<ctp "ID_of_the_year">>
Bare minimum...
<</ctp>>To be used inside <<ctp>> to separate the content into blocks.
keywords: (optional|string) The following keywords can be used to alter behavior of the macro:clear: Clears content of previous block. Use for replacing.nobr: Appends content in the same line as last block instead of going to a new line.t8nortransition: Custom CSS animation based transition (250ms fade-in by default).
Example:
<<ctp "fancyCTP">>
One.
<<ctpNext clear>>
Two with clear.
<<ctpNext nobr>>
Three on the same line.
<<ctpNext t8n>>
Fading four.
<</ctp>>The 'proceed' part of Click To Proceed... Used to move the train forward and show the next blocks.
id: (string) Unique ID which was set up in<<ctp>>.
NOTE: Use with user interaction (inside a <<link>> or <<button>>) or inside a <<timed>> macro to ensure the DOM is loaded and has the element on page for the macro to target.
Example:
<<ctp "ID_of_the_year_once_again">>
<!-- stuff -->
<</ctp>>
<<link "Next">>
<<ctpAdvance "ID_of_the_year_once_again">>
<</link>>The CTP custom object is set up as follows:
id: (string) Unique ID.
selector: (string) CSS selector to target to output to. When used by the macro, this is the slugified form of id.
Example:
var ctpTest = new CTP({
id: "ctpTest",
selector: "#ctp-test-id"
});Other properties which are used under the hood:
stack: (array) Contains the content of all blocks.
log: (object) Keeps track of blocks amd their behaviors:
index: (whole number) Current index of block (zero-based).clear: (array) Indices of blocks at which to clear the output element before appending new content.nobr: (array) Indices of blocks where no<br>is added.transition: (array) Indices of blocks which have the CSS transition (Target the class.macro-ctp-entry-t8nto customize).
Object methods:
Adds content to the end of the stack and returns the CTP object for chaining.
content: (string) The actual content in the block.keywords: (string) Space-separated list of keywords (clear, nobr, t8n, transition) to modify behavior of the blocks.
Example:
ctpTest
.add("This is the first string.")
.add("Second! It cleared the first one out!", "clear")
.add("Third, but with nobr...", "nobr")
.add("And the final one. With a transition!", "t8n");Does the same as <<ctpAdvance>>, moving to the next block. Returns the CTP object for chaining.
Example:
ctpTest.advance();Returns the html output for a single block at the index passed into it.
index: (whole number) Index of block to return.
Example:
ctpTest.ctpEntry(2);
// Assuming ctpTest is the same as in the previous examples, this returns:
// <span class="macro-ctp-entry macro-ctp-entry-index-2">Third, but with nobr...</span>Returns the html output for entire chain from the last 'clear' to the current index.
Example:
// Assuming current index is 3
ctpTest.out()
/* Returns:
*
* <span class="macro-ctp-entry macro-ctp-entry-index-1">Second! It cleared the first one out!</span>
* <span class="macro-ctp-entry macro-ctp-entry-index-2">Third, but with nobr...</span>
* <br>
* <span class="macro-ctp-entry macro-ctp-entry-index-3">And the final one. With a transition!</span>
*/Complete usage:
JavaScript:
State.variables.ctpTest = new CTP({
id: "ctpTest",
selector: "#ctp-test-id"
});
State.variables.ctpTest
.add("This is the first string.")
.add("Second! It cleared the first one out!", "clear")
.add("Third, but with nobr...", "nobr")
.add("And the final one. With a transition!", "t8n");In Passage:
<div id="#ctp-test-id">
<<= $ctpTest.out()>>
</div>
<<link "Advance">>
<<run $ctpTest.advance()>>
<!-- Because $ctpTest was created manually, using the <<ctpAdvance>> macro won't work. To be able to use <<ctpAdvance>>, the CTP object needs to be set as a property of State.variables["#macro-ctp-dump"] as that is what is used internally to store CTP objects created via the macros. -->
<</link>>- Add CSS time keyword to delay before next block appears.