crmod-api
Version:
A dynamic mod/asset generator for Cosmic Reach
9 lines • 21.7 kB
HTML
<html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>crmod-api</title><meta name="description" content="Documentation for crmod-api"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="assets/style.css"/><link rel="stylesheet" href="assets/highlight.css"/><script defer src="assets/main.js"></script><script async src="assets/icons.js" id="tsd-icons-script"></script><script async src="assets/search.js" id="tsd-search-script"></script><script async src="assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base="."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="index.html" class="title">crmod-api</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><h2>crmod-api</h2></div><div class="tsd-panel tsd-typography"><a id="md:cosmic-reach-modding-api" class="tsd-anchor"></a><h1><a href="#md:cosmic-reach-modding-api">Cosmic Reach Modding API</a></h1><a id="md:dynamic-asset-generation-for-cosmic-reach" class="tsd-anchor"></a><h3><a href="#md:dynamic-asset-generation-for-cosmic-reach">Dynamic asset generation for <a href="https://finalforeach.itch.io/cosmic-reach">Cosmic Reach</a></a></h3><p>This library creates a pipeline for creating and compiling mods using only JavaScript. It can create <strong>blocks</strong> (with many different states), <strong>block events</strong> (referred to as "trigger sheets"), <strong>block models</strong>, and even procedural <strong>textures</strong>.</p>
<a id="md:examples" class="tsd-anchor"></a><h1><a href="#md:examples">Examples</a></h1><a id="md:basic-stone-block" class="tsd-anchor"></a><h3><a href="#md:basic-stone-block">Basic Stone Block</a></h3><p>The following is an example script for a mod that adds a stone block that does, well, nothing.</p>
<pre><code class="language-js"><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">Mod</span><span class="hl-1">, </span><span class="hl-2">BlockModel</span><span class="hl-1">, </span><span class="hl-2">ModelCuboid</span><span class="hl-1">, </span><span class="hl-2">Material</span><span class="hl-1">, </span><span class="hl-2">Writer</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">"crmod-api"</span><span class="hl-1">;</span><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">Box3</span><span class="hl-1">, </span><span class="hl-2">Vector3</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">"three"</span><span class="hl-1">;</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">writer</span><span class="hl-1"> = </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Writer</span><span class="hl-1">(</span><span class="hl-3">"./build"</span><span class="hl-1">); </span><span class="hl-7">// Output directory of the mod</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">mod</span><span class="hl-1"> = </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Mod</span><span class="hl-1">(</span><span class="hl-3">"examplemod"</span><span class="hl-1">, </span><span class="hl-2">writer</span><span class="hl-1">); </span><span class="hl-7">// Create a mod with the prefix "examplemod"</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">block</span><span class="hl-1"> = </span><span class="hl-2">mod</span><span class="hl-1">.</span><span class="hl-6">createBlock</span><span class="hl-1">(</span><span class="hl-3">"stone"</span><span class="hl-1">); </span><span class="hl-7">// Will write to "./build/blocks/block_examplemod_stone.json</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">model</span><span class="hl-1"> = </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">BlockModel</span><span class="hl-1">(</span><span class="hl-3">"stone"</span><span class="hl-1">); </span><span class="hl-7">// Will write to "./build/models/blocks/model_examplemod_stone.json</span><br/><br/><br/><span class="hl-7">/* =====================</span><br/><span class="hl-7"> Create the block model</span><br/><span class="hl-7">======================== */</span><br/><br/><span class="hl-7">// Create a cuboid that spans a whole block (each "unit" is one sixteenth of a block: one pixel in a texture)</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">cube</span><span class="hl-1"> = </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">ModelCuboid</span><span class="hl-1">(</span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Box3</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Vector3</span><span class="hl-1">(</span><span class="hl-8">0</span><span class="hl-1">, </span><span class="hl-8">0</span><span class="hl-1">, </span><span class="hl-8">0</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Vector3</span><span class="hl-1">(</span><span class="hl-8">16</span><span class="hl-1">, </span><span class="hl-8">16</span><span class="hl-1">, </span><span class="hl-8">16</span><span class="hl-1">)</span><br/><span class="hl-1">));</span><br/><br/><span class="hl-7">// Make sure the block will respond to ambient occlusion (the default is `false`)</span><br/><span class="hl-2">cube</span><span class="hl-1">.</span><span class="hl-6">setAmbientOcclusionEnabled</span><span class="hl-1">(</span><span class="hl-4">true</span><span class="hl-1">);</span><br/><br/><span class="hl-7">// Use the default stone texture ("materials" are different texture entries usually found at the top of the</span><br/><span class="hl-7">// model; they're called "textures" in the game, but they behave more like materials with texture maps)</span><br/><span class="hl-2">cube</span><span class="hl-1">.</span><span class="hl-6">setAllMaterials</span><span class="hl-1">(</span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Material</span><span class="hl-1">(</span><span class="hl-3">"stone.png"</span><span class="hl-1">));</span><br/><br/><span class="hl-7">// Models are made up of cuboids with different materials and properties</span><br/><span class="hl-2">model</span><span class="hl-1">.</span><span class="hl-6">addCuboid</span><span class="hl-1">(</span><span class="hl-2">cube</span><span class="hl-1">);</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">state</span><span class="hl-1"> = </span><span class="hl-2">block</span><span class="hl-1">.</span><span class="hl-6">createBlockState</span><span class="hl-1">(</span><span class="hl-2">model</span><span class="hl-1">); </span><span class="hl-7">// Create a default block state with our new model</span><br/><br/><br/><span class="hl-7">/* ==============</span><br/><span class="hl-7"> Compile the mod</span><br/><span class="hl-7">================= */</span><br/><br/><span class="hl-7">// Gets the folders ready for a mod to write to (deletes existing files!)</span><br/><span class="hl-7">// TIP: this leaves `blocks/textures/` intact.</span><br/><span class="hl-7">// (This is a separate function in case multiple mods should be compiled at once)</span><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">writer</span><span class="hl-1">.</span><span class="hl-6">createOutputDir</span><span class="hl-1">();</span><br/><br/><span class="hl-7">// Compiles the mod and writes it to the directory</span><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">mod</span><span class="hl-1">.</span><span class="hl-6">write</span><span class="hl-1">();</span>
</code><button>Copy</button></pre>
<hr>
<a id="md:glowing-cheese" class="tsd-anchor"></a><h3><a href="#md:glowing-cheese">Glowing Cheese</a></h3><p>The following is an example script for a mod that adds a glowing cheese block that, when interacted with, disappears. <em>No cheese for you!</em></p>
<pre><code class="language-js"><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">Mod</span><span class="hl-1">, </span><span class="hl-2">BlockModel</span><span class="hl-1">, </span><span class="hl-2">ModelCuboid</span><span class="hl-1">, </span><span class="hl-2">Material</span><span class="hl-1">, </span><span class="hl-2">TriggerSheet</span><span class="hl-1">, </span><span class="hl-2">BlockAction</span><span class="hl-1">, </span><span class="hl-2">Writer</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">"crmod-api"</span><span class="hl-1">;</span><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">Box3</span><span class="hl-1">, </span><span class="hl-2">Vector3</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">"three"</span><span class="hl-1">;</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">writer</span><span class="hl-1"> = </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Writer</span><span class="hl-1">(</span><span class="hl-3">"./build"</span><span class="hl-1">);</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">mod</span><span class="hl-1"> = </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Mod</span><span class="hl-1">(</span><span class="hl-3">"examplemod"</span><span class="hl-1">, </span><span class="hl-2">writer</span><span class="hl-1">);</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">myBlockId</span><span class="hl-1"> = </span><span class="hl-3">"magic_cheese"</span><span class="hl-1">; </span><span class="hl-7">// So we don't have to type it multiple times</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">block</span><span class="hl-1"> = </span><span class="hl-2">mod</span><span class="hl-1">.</span><span class="hl-6">createBlock</span><span class="hl-1">(</span><span class="hl-2">myBlockId</span><span class="hl-1">); </span><span class="hl-7">// Will write to "./build/blocks/block_examplemod_magic_cheese.json</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">model</span><span class="hl-1"> = </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">BlockModel</span><span class="hl-1">(</span><span class="hl-2">myBlockId</span><span class="hl-1">); </span><span class="hl-7">// Will write to "./build/models/blocks/model_examplemod_magic_cheese.json</span><br/><br/><br/><span class="hl-7">/* =====================</span><br/><span class="hl-7"> Create the block model</span><br/><span class="hl-7">======================== */</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">cube</span><span class="hl-1"> = </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">ModelCuboid</span><span class="hl-1">(</span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Box3</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Vector3</span><span class="hl-1">(</span><span class="hl-8">0</span><span class="hl-1">, </span><span class="hl-8">0</span><span class="hl-1">, </span><span class="hl-8">0</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Vector3</span><span class="hl-1">(</span><span class="hl-8">16</span><span class="hl-1">, </span><span class="hl-8">16</span><span class="hl-1">, </span><span class="hl-8">16</span><span class="hl-1">)</span><br/><span class="hl-1">));</span><br/><br/><span class="hl-2">cube</span><span class="hl-1">.</span><span class="hl-6">setAmbientOcclusionEnabled</span><span class="hl-1">(</span><span class="hl-4">true</span><span class="hl-1">);</span><br/><span class="hl-2">cube</span><span class="hl-1">.</span><span class="hl-6">setAllMaterials</span><span class="hl-1">(</span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Material</span><span class="hl-1">(</span><span class="hl-3">"cheese.png"</span><span class="hl-1">));</span><br/><span class="hl-2">model</span><span class="hl-1">.</span><span class="hl-6">addCuboid</span><span class="hl-1">(</span><span class="hl-2">cube</span><span class="hl-1">);</span><br/><br/><br/><span class="hl-7">/* =============================================</span><br/><span class="hl-7"> Create the block's trigger sheet (block event)</span><br/><span class="hl-7">================================================ */</span><br/><br/><span class="hl-7">// Trigger sheets (called "block events" by the game) are usually unique per block state</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">triggerSheet</span><span class="hl-1"> = </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">TriggerSheet</span><span class="hl-1">(</span><span class="hl-2">myBlockId</span><span class="hl-1">);</span><br/><br/><span class="hl-2">triggerSheet</span><span class="hl-1">.</span><span class="hl-6">addAction</span><span class="hl-1">(</span><span class="hl-3">"onInteract"</span><span class="hl-1">, </span><span class="hl-2">BlockAction</span><span class="hl-1">.</span><span class="hl-6">replaceBlock</span><span class="hl-1">(</span><span class="hl-8">0</span><span class="hl-1">, </span><span class="hl-8">0</span><span class="hl-1">, </span><span class="hl-8">0</span><span class="hl-1">, </span><span class="hl-3">"base:air[default]"</span><span class="hl-1">));</span><br/><br/><br/><span class="hl-7">/*</span><br/><span class="hl-7"> State parameters are added after a block state is created. It cannot be passed while constructing.</span><br/><span class="hl-7"> The second parameter specifies custom options.</span><br/><span class="hl-7"> You can change the block's state parameters by calling `state.id.set("param", "value")`</span><br/><br/><span class="hl-7"> Only parameters added by `block.defaultState.add("param", "defaultValue")` can be changed.</span><br/><span class="hl-7">*/</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">state</span><span class="hl-1"> = </span><span class="hl-2">block</span><span class="hl-1">.</span><span class="hl-6">createBlockState</span><span class="hl-1">(</span><span class="hl-2">model</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">triggerSheet:</span><span class="hl-1"> </span><span class="hl-2">triggerSheet</span><span class="hl-1">,</span><br/><br/><span class="hl-1"> </span><span class="hl-2">lightLevelRed:</span><span class="hl-1"> </span><span class="hl-8">15</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">lightLevelGreen:</span><span class="hl-1"> </span><span class="hl-8">13</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">lightLevelBlue:</span><span class="hl-1"> </span><span class="hl-8">2</span><br/><span class="hl-1">});</span><br/><br/><br/><span class="hl-7">/* ==============</span><br/><span class="hl-7"> Compile the mod</span><br/><span class="hl-7">================= */</span><br/><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">writer</span><span class="hl-1">.</span><span class="hl-6">createOutputDir</span><span class="hl-1">();</span><br/><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">mod</span><span class="hl-1">.</span><span class="hl-6">write</span><span class="hl-1">();</span>
</code><button>Copy</button></pre>
</div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><h4 class="uppercase">Member Visibility</h4><form><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-private" name="private"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Private</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></form></div><div class="tsd-theme-toggle"><h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-index-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#md:cosmic-reach-modding-api"><span>Cosmic <wbr/>Reach <wbr/>Modding API</span></a><ul><li><ul><li><a href="#md:dynamic-asset-generation-for-cosmic-reach"><span>Dynamic asset generation for <wbr/>Cosmic <wbr/>Reach</span></a></li></ul></li></ul><a href="#md:examples"><span>Examples</span></a><ul><li><a href="#md:basic-stone-block"><span>Basic <wbr/>Stone <wbr/>Block</span></a></li><li><a href="#md:glowing-cheese"><span>Glowing <wbr/>Cheese</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="modules.html" class="current"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="assets/icons.svg#icon-1"></use></svg><span>crmod-api</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base="."><li>Loading...</li></ul></nav></div></div></div><div class="tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div></body></html>