<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Javascript on Nathaniel Inman</title><link>https://nathanielinman.com/tags/javascript/</link><description>Recent content in Javascript on Nathaniel Inman</description><generator>Hugo -- 0.147.7</generator><language>en-us</language><copyright>Nathaniel Inman</copyright><lastBuildDate>Sun, 06 Jan 2019 00:00:00 +0000</lastBuildDate><atom:link href="https://nathanielinman.com/tags/javascript/index.xml" rel="self" type="application/rss+xml"/><item><title>Async Await Chaining</title><link>https://nathanielinman.com/async-await-chaining/</link><pubDate>Sun, 06 Jan 2019 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/async-await-chaining/</guid><description>&lt;p>Creating synchronously chained functions is straight forward. &lt;a href="https://codepen.io/NathanielInman/pen/f2c6f77986160188091575625ba1604b">&lt;strong>Codepen&lt;/strong>&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> UserCollectionSync &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> find(id&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> document&lt;span style="color:#f92672">.&lt;/span>writeln(&lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> this;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> update(){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> document&lt;span style="color:#f92672">.&lt;/span>writeln(&lt;span style="color:#e6db74">&amp;#39;2&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> this;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> save(){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> document&lt;span style="color:#f92672">.&lt;/span>writeln(&lt;span style="color:#e6db74">&amp;#39;3&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> this;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>UserCollectionSync
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">.&lt;/span>find()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">.&lt;/span>update()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">.&lt;/span>save();
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>But when we decide to just throw some &amp;lsquo;async&amp;rsquo; &amp;lsquo;await&amp;rsquo; flags on those functions everything doesn&amp;rsquo;t work. &lt;strong>FOLLOWING CODE IS WRONG:&lt;/strong> &lt;a href="https://codepen.io/NathanielInman/pen/c8306ad8a473d6cfe79d26cf9fee1624">&lt;strong>Codepen&lt;/strong>&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">//&lt;/span> delay is used to represent some asynchronous work
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>function delay(ms){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> new Promise(resolve &lt;span style="color:#f92672">=&amp;gt;&lt;/span> setTimeout(resolve, ms));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>} &lt;span style="color:#f92672">//&lt;/span>end delay()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> UserCollectionAsync &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> async find(id&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> await delay(&lt;span style="color:#ae81ff">1000&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> document&lt;span style="color:#f92672">.&lt;/span>writeln(&lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> this;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> async updateFor(options&lt;span style="color:#f92672">=&lt;/span>{}){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> await delay(&lt;span style="color:#ae81ff">50&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> document&lt;span style="color:#f92672">.&lt;/span>writeln(&lt;span style="color:#e6db74">&amp;#39;2&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> this;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> async save(){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> await delay(&lt;span style="color:#ae81ff">50&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> document&lt;span style="color:#f92672">.&lt;/span>writeln(&lt;span style="color:#e6db74">&amp;#39;3&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> this;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>UserCollectionAsync
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">.&lt;/span>find()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">.&lt;/span>updateFor(&lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">.&lt;/span>save();
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The reason it fails is because when the &amp;lsquo;find()&amp;rsquo; is called it returns a promise that hasn&amp;rsquo;t resolved instead of the &amp;lsquo;UserCollectionAsync&amp;rsquo; object (Factory pattern.) Therefor you can&amp;rsquo;t find a function &amp;lsquo;update()&amp;rsquo; on a promise. One common way of solving the issue is by allowing the factory to maintain a queue and force the user to add &amp;lsquo;done()&amp;rsquo; at the end of the chain: &lt;a href="https://codepen.io/NathanielInman/pen/cdb094f0c87a5a7673d2c67fb7f1a88f">&lt;strong>Codepen&lt;/strong>&lt;/a>.&lt;/p></description></item><item><title>Generating Exhumed River Channel</title><link>https://nathanielinman.com/generating-exhumed-river-channel/</link><pubDate>Mon, 06 Aug 2018 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/generating-exhumed-river-channel/</guid><description>&lt;p>I recently did some work in generating rivers in a 2d game. Revisiting this work to create an exhumed river channel, I decided it might be fun to revisit how to generate it to make the channel look more realistic. Instead of using a drunken walker, this is a more expensive but interesting map generator:&lt;/p>
&lt;ul>
&lt;li>Start by generating 2d simplex noise where&lt;/li>
&lt;li>less &amp;lt;0.6 is floor&lt;/li>
&lt;li>rest is walls&lt;/li>
&lt;li>Generate terminal lines at each map exit (north, south, east, west). Shuffle those lines and randomly choose a start and end location for the river based on two of those lines.&lt;/li>
&lt;/ul>
&lt;p>Later you can add another line with terminal point to allow a split river channel&lt;/p></description></item><item><title>Balancing Game Mechanics</title><link>https://nathanielinman.com/balancing-game-mechanics/</link><pubDate>Wed, 06 Jun 2018 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/balancing-game-mechanics/</guid><description>&lt;p>Two of the most influential components to decreasing LOE in balancing game mechanics is &lt;strong>automating&lt;/strong> the most essential parts of testing those mechanics, and providing meaningful and easy to understand &lt;strong>graphs&lt;/strong>. Some meaningful questions to better lay the foundation of balancing and creating these components:&lt;/p>
&lt;ul>
&lt;li>What are the actual &amp;lsquo;core stat(s)&amp;rsquo; that identify survival? (Usually health)&lt;/li>
&lt;li>What are the &amp;lsquo;ancillary stat(s)&amp;rsquo; that help facilitate the increase or decrease that core? (damage, strength, dexterity, etc.) I&amp;rsquo;m assuming all actors here are equal and we aren&amp;rsquo;t comparing apples and oranges.&lt;/li>
&lt;li>What are the &amp;lsquo;supplemental stat(s)&amp;rsquo; that may contribute to the increase or decrease of the ancillary stats? (class, rank, level)&lt;/li>
&lt;li>What are the &amp;rsquo;extraneous stat(s)&amp;rsquo; that don&amp;rsquo;t affect the other stats already identified.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>I found that creating a tree by drawing lines connecting these identified stats provided incredible insight and direction.&lt;/p></description></item><item><title>Pigeon Hole Stepping v2</title><link>https://nathanielinman.com/pigeon-hole-stepping-v2/</link><pubDate>Tue, 08 May 2018 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/pigeon-hole-stepping-v2/</guid><description>&lt;p>I had originally written an article on how to implement PHS. Having found the maps generated slightly redundant I decided to take another look. Here are the steps taken to successfully generate a more realistic &lt;code>town.&lt;/code> It&amp;rsquo;s essentially a drunken walker like &lt;a href="https://en.wikipedia.org/wiki/Diffusion-limited_aggregation">Diffusion Limited Aggregation&lt;/a> mixed with a hallway constraint that mimics the large part of PHS.&lt;/p>
&lt;ol>
&lt;li>Start somewhere in the middle, add this and all possible directions up to a certain dynamic length (I used a standard deviation of 1.4 with a mean of 5, ) as nodes: &lt;code>[{x,y,direction},...]&lt;/code>.&lt;/li>
&lt;li>We will be looping until all &lt;strong>nodes&lt;/strong> and &lt;strong>edges&lt;/strong> (we&amp;rsquo;ll describe that shortly,) are gone.&lt;/li>
&lt;li>When we have node then check to see if the path between it&amp;rsquo;s &amp;lsquo;x,y&amp;rsquo; and &amp;lsquo;x2,y2&amp;rsquo; (given the length and direction) is clear. If it is, then add the entire path minus the start and end as &lt;strong>edges&lt;/strong>, and add the end as a new node. Shuffle nodes after adding a new one. After building the path run through the path array randomly attempting to build a room in all directions. (this won&amp;rsquo;t be entirely possible and will leave negative space to fill with edges.)&lt;/li>
&lt;li>If there are no nodes, repeat step 3 except with edges (this helps fill the map negative space.)&lt;/li>
&lt;li>After all nodes and edges are gone then cover all cells adjacent to floors with walls if it&amp;rsquo;s empty.&lt;/li>
&lt;/ol>
&lt;p>I found it helpful to use this simple formula to generate hallway lengths with a mean and standard deviation constraint. Both the x and y would work fine, here we&amp;rsquo;re using the y only.&lt;/p></description></item><item><title>Generating Ancient Ruins</title><link>https://nathanielinman.com/generating-ancient-ruins/</link><pubDate>Thu, 03 May 2018 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/generating-ancient-ruins/</guid><description>&lt;p>While creating algorithms for random continent generation, I came across an old algorithm I had worked with called &lt;a href="https://en.wikipedia.org/wiki/Coupled_map_lattice">Coupled Map Lattice&lt;/a>. Using that to create a continent was hard but I was able to accomplish it doing layers of filters:&lt;/p>
&lt;ul>
&lt;li>generate map with noise between -1 and 1&lt;/li>
&lt;li>apply CML using Spatiotemporal Intermittency settings&lt;/li>
&lt;/ul>
&lt;p>(a = 1.75, ε = 0.6)&lt;/p>
&lt;ul>
&lt;li>I found that using something too chaotic didn&amp;rsquo;t have a noticeable affect compared to just generating noise in general.&lt;/li>
&lt;/ul>
&lt;p>normalize values to between 0 and 255
apply a gaussian blur
normalize values to between 0 and 1
apply slight height restrictions based on distance to center of map&lt;/p></description></item><item><title>Angular was dead on arrival</title><link>https://nathanielinman.com/angular-was-dead-on-arrival/</link><pubDate>Mon, 10 Jul 2017 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/angular-was-dead-on-arrival/</guid><description>&lt;p>I&amp;rsquo;m commonly asked why more people don&amp;rsquo;t choose &lt;code>angular2&lt;/code> which in my head I correct to &lt;code>angular&lt;/code>. (we&amp;rsquo;re on angular 3 alread.. no, 4,&amp;hellip; no.) Quite simply, the answer is Typescript. Whether we like it or not the majority of javascript developers in our field are new or mediocre developers who don&amp;rsquo;t have the time or cognitive ease to attempt to &lt;em>learn another language.&lt;/em>&lt;/p>
&lt;p>It was a huge mistake for the team to release the library with the small amount of constantly outdated documentation entirely in Typescript. &lt;em>Most &lt;strong>stackoverflow&lt;/strong> searches for angular aren&amp;rsquo;t even relevant or accurate given the constantly changing api&lt;/em>. Without good documentation, and so much irrelevant or outdated answers on stackoverflow these developers lose hope, and angular lost potential users.&lt;/p></description></item><item><title>Responsive Game Interfaces</title><link>https://nathanielinman.com/responsive-game-interfaces/</link><pubDate>Fri, 24 Mar 2017 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/responsive-game-interfaces/</guid><description>&lt;p>&lt;img alt="game_interface" loading="lazy" src="https://nathanielinman.com/content/images/2022/11/game_interface.png">&lt;/p>
&lt;p>It&amp;rsquo;s abundantly clear that making interfaces for portals, single page applications, analytics or CRUD apps is &lt;strong>so&lt;/strong> much easier than creating applications for games. UX within games is much more complicated. Now add upon that complication a responsive design.&lt;/p>
&lt;p>It took the better part of 8 hours to get a design mock-up that worked on the smallest iphone device (man they&amp;rsquo;re tiny!) and that scales up to the largest phablet. I still need to work on detaching the pane and having a more &amp;lsquo;diablo-esque&amp;rsquo; two-pane character panel / inventory approach for desktop users.&lt;/p></description></item><item><title>Textures make a difference</title><link>https://nathanielinman.com/textures-make-a-difference/</link><pubDate>Wed, 22 Mar 2017 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/textures-make-a-difference/</guid><description>&lt;p>I&amp;rsquo;ve been playing around with textures in exploring the bleak to see how much of a difference it would make. Essentially I&amp;rsquo;m torn between two ideas:&lt;/p>
&lt;ol>
&lt;li>Make the floors all a plain color and glow them based on the environment color so as not to be too realistic and keep a more roguelike feel.&lt;/li>
&lt;li>Struggle with having textures that blend together between sectors so it has a more natural feel albeit simple in perspective to traditional 3d games.&lt;/li>
&lt;/ol>
&lt;p>At the moment I&amp;rsquo;m leaning towards number two, but I haven&amp;rsquo;t been able to reproduce a reliable glow postprocessing effect that I actually like and that feels natural. I&amp;rsquo;ll follow down both roads further before making a discrete decision.&lt;/p></description></item><item><title>Building A Modern Roguelike in 2017</title><link>https://nathanielinman.com/building-a-modern-roguelike-in-2017/</link><pubDate>Wed, 08 Mar 2017 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/building-a-modern-roguelike-in-2017/</guid><description>&lt;p>Building games has become easier to do with the increase in quality of tooling and specialization software. The unfortunate side effect is the developer has to become more trained and specialized in a variety of facets in order to maintain competency in the field. Ergo building games is also harder.&lt;/p>
&lt;p>This year for the 7DRL competition I&amp;rsquo;ve been pretty lazy, which doesn&amp;rsquo;t help much to making deadlines. Setting aside &lt;em>playing&lt;/em> games for &lt;em>making&lt;/em> games I decided to finally venture into the competition whole heartedly.&lt;/p></description></item><item><title>Space Invaders Released</title><link>https://nathanielinman.com/space-invaders-released/</link><pubDate>Fri, 02 Dec 2016 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/space-invaders-released/</guid><description>&lt;p>So I&amp;rsquo;ve recently compiled a bunch of my libraries together into a collection I call &amp;lsquo;ion-cloud&amp;rsquo; available on &amp;rsquo;npm&amp;rsquo;. In order to best test these, I&amp;rsquo;ve recreated my own adaptation of &amp;lsquo;Space Invaders&amp;rsquo; available free to play here on my website by clicking the &lt;code>games&lt;/code> above or &lt;a href="https://theoestudio.github.io/space-invaders/">here&lt;/a> and &amp;lsquo;open source&amp;rsquo; on github &lt;a href="https://github.com/NathanielInman/space-invaders">here&lt;/a>.&lt;/p></description></item><item><title>Coterie Released</title><link>https://nathanielinman.com/coterie-released/</link><pubDate>Wed, 03 Aug 2016 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/coterie-released/</guid><description>&lt;p>(Aug 3, 2016 Update: Coterie is now playable on mobile or touch devices as well. &lt;a href="https://coterie.nathanielinman.com">Play Coterie&lt;/a>)&lt;/p>
&lt;p>Growing up I deeply enjoyed two specific cards games: &lt;em>Triple Triad&lt;/em> in Final Fantasy VIII and &lt;em>Tetra Master&lt;/em> in Final Fantasy IX. Having some extra time this past week I developed a simple card game variant called &lt;strong>Coterie&lt;/strong>. What started as an excuse to get more familiar with flexbox in css ended up actually being fun to play!&lt;/p></description></item><item><title>Cleaner complex IF Statements</title><link>https://nathanielinman.com/cleaner-complex-if-statements/</link><pubDate>Thu, 12 May 2016 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/cleaner-complex-if-statements/</guid><description>&lt;p>Writing clean code like Uncle Bob describes can be complicated sometimes. So you have this long if statement that&amp;rsquo;s relatively simple in design but ugly to the eyes and somewhat hard to read.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>if(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> x1&amp;gt;=img.left&amp;amp;&amp;amp;x1=img.top&amp;amp;&amp;amp;y1=img.left&amp;amp;&amp;amp;x2=img.top&amp;amp;&amp;amp;y2=lowerX&amp;amp;&amp;amp;x1=lowerY&amp;amp;&amp;amp;y1=lowerX&amp;amp;&amp;amp;x2=lowerY&amp;amp;&amp;amp;y2=a&amp;amp;&amp;amp;this=img.left&amp;amp;&amp;amp;x1=img.left&amp;amp;&amp;amp;x2=img.top&amp;amp;&amp;amp;y2=img.top&amp;amp;&amp;amp;y2r)){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> img.scaling = Math.pow(x1-x2,2)+Math.pow(y1-y2,2);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>} //end if
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>At what point does sacrificing performance become worth it for code readability?&lt;/p></description></item><item><title>NPM Module: Jugs</title><link>https://nathanielinman.com/npm-module-jugs/</link><pubDate>Sat, 30 Jan 2016 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/npm-module-jugs/</guid><description>&lt;p>App generator &lt;strong>jugs&lt;/strong> makes development fun again! You can view the source code &lt;a href="https://github.com/nathanielinman/jugs">here&lt;/a>.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/vitejs/vite">Vite.js&lt;/a> : &lt;em>Performant Module bundler with&lt;/em> &lt;strong>tree-shaking&lt;/strong>, &lt;strong>hot module reloading&lt;/strong> &lt;em>&amp;amp;&lt;/em> &lt;strong>minification&lt;/strong>&lt;/li>
&lt;li>&lt;a href="https://github.com/babel/babel">Babel&lt;/a> : &lt;em>Transpile modern javascript, formerly called 6to5&lt;/em>&lt;/li>
&lt;li>&lt;a href="https://github.com/eslint/eslint">Eslint&lt;/a> : &lt;em>Lint your javascript in its modern format&lt;/em>&lt;/li>
&lt;li>&lt;a href="https://github.com/stylus/stylus">Stylus&lt;/a> : &lt;em>Powerful CSS Preprocessor with a beautiful syntax&lt;/em>&lt;/li>
&lt;li>&lt;a href="https://github.com/ion-cloud/ion-cloud">Ion-Cloud&lt;/a> : &lt;em>A micro library for animations &amp;amp; game development&lt;/em>&lt;/li>
&lt;/ul>
&lt;p>Simply install this app generator globally:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>npm i -g jugs
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir appName
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cd appName
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>jugs
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>File Structure:&lt;/strong>&lt;/p></description></item><item><title>Automata Generated Caverns</title><link>https://nathanielinman.com/automata-generated-caverns/</link><pubDate>Fri, 13 Nov 2015 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/automata-generated-caverns/</guid><description>&lt;p>Randomly generated dungeons are a lot of fun to program, but sometimes they can be pretty difficult to originally wrap your head around. For this years 7DRL I added Automata Generated Caverns as one of the algorithms I wanted to figure out completely. You can read more specifically on the theory &lt;a href="https://www.wikiwand.com/en/Automata_theory">here&lt;/a>.&lt;/p></description></item></channel></rss>