texnoforgehttps://texnoforge.dev/2024-03-23T23:23:00+01:00wheels of progress cannot be stoppedWords of Power devlog #9: TexnoLatin Alphabet in Training2024-03-23T23:23:00+01:002024-03-23T23:23:00+01:00voice of texnoforgetag:texnoforge.dev,2024-03-23:/n/words-of-power-devlog-9-texnolatin-in-training/<p>It's my immense pleasure to finally announce alpha version of <strong>TexnoLatin</strong> alphabet!</p>
<p><a href="https://github.com/texnoforge/texnolatin/">TexnoLatin</a> initially consists of <strong>24</strong> symbols:</p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/fire" title="fire">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/fire.svg" alt="fire" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/ice" title="ice">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/ice.svg" alt="ice" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/electro" title="lightning">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/electro.svg" alt="lightning" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/water" title="water">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/water.svg" alt="water" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/air" title="air">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/air.svg" alt="air" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/earth" title="earth">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/earth.svg" alt="earth" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/life" title="life">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/life.svg" alt="life" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/death" title="death">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/death.svg" alt="death" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/bolt" title="bolt">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/bolt.svg" alt="bolt" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/ball" title="ball">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/ball.svg" alt="ball" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/beam" title="beam">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/beam.svg" alt="beam" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/space" title="area">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/space.svg" alt="area" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/cone" title="cone">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/cone.svg" alt="cone" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/self" title="self">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/self.svg" alt="self" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/friend" title="friend">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/friend.svg" alt="friend" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/enemy" title="enemy">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/enemy.svg" alt="enemy" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/close" title="close">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/close.svg" alt="close" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/far" title="far">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/far.svg" alt="far" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/weak" title="weak">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/weak.svg" alt="weak" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/strong" title="strong">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/strong.svg" alt="strong" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/big" title="big">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/big.svg" alt="big" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/small" title="small">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/small.svg" alt="small" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/fast" title="fast">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/fast.svg" alt="fast" />
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/slow" title="slow">
<img class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/slow.svg" alt="slow" />
</a></p>
<p><br style='clear: both;'></p>
<p>Each symbol contains:</p>
<ul>
<li><strong>SVG image</strong> (vector-based and thus infinitely scalable)</li>
<li><strong>20</strong> to <strong>50</strong> <strong>drawings</strong> (training data)</li>
<li>working <strong>Gaussian Mixture Model</strong> (<strong>GMM</strong>) for symbol recognition</li>
</ul>
<p>I've strived to create a set of distinct …</p><p>It's my immense pleasure to finally announce alpha version of <strong>TexnoLatin</strong> alphabet!</p>
<p><a href="https://github.com/texnoforge/texnolatin/">TexnoLatin</a> initially consists of <strong>24</strong> symbols:</p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/fire" title="fire">
<img alt="fire" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/fire.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/ice" title="ice">
<img alt="ice" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/ice.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/electro" title="lightning">
<img alt="lightning" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/electro.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/water" title="water">
<img alt="water" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/water.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/air" title="air">
<img alt="air" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/air.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/earth" title="earth">
<img alt="earth" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/earth.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/life" title="life">
<img alt="life" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/life.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/death" title="death">
<img alt="death" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/death.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/bolt" title="bolt">
<img alt="bolt" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/bolt.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/ball" title="ball">
<img alt="ball" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/ball.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/beam" title="beam">
<img alt="beam" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/beam.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/space" title="area">
<img alt="area" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/space.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/cone" title="cone">
<img alt="cone" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/cone.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/self" title="self">
<img alt="self" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/self.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/friend" title="friend">
<img alt="friend" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/friend.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/enemy" title="enemy">
<img alt="enemy" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/enemy.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/close" title="close">
<img alt="close" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/close.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/far" title="far">
<img alt="far" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/far.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/weak" title="weak">
<img alt="weak" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/weak.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/strong" title="strong">
<img alt="strong" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/strong.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/big" title="big">
<img alt="big" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/big.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/small" title="small">
<img alt="small" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/small.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/fast" title="fast">
<img alt="fast" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/fast.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/slow" title="slow">
<img alt="slow" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/slow.svg"/>
</a></p>
<p><br style="clear: both;"/></p>
<p>Each symbol contains:</p>
<ul>
<li><strong>SVG image</strong> (vector-based and thus infinitely scalable)</li>
<li><strong>20</strong> to <strong>50</strong> <strong>drawings</strong> (training data)</li>
<li>working <strong>Gaussian Mixture Model</strong> (<strong>GMM</strong>) for symbol recognition</li>
</ul>
<p>I've strived to create a set of distinct symbols of similar drawing complexity
while providing as much semantic consistency as possible:</p>
<ul>
<li>Symbols with opposite meanings are visually similar but contrasting,
usually anti-symmetrical.</li>
<li>Symbols with "positive" meanings tend to point up, symbols with "negative"
meanings tend to point down.</li>
<li>Spell shape symbols tend to go from left to right.</li>
<li>Most symbols reuse existing human associations, they should be quick to
learn.</li>
</ul>
<p>Even though symbol recognition using Gaussian Mixture Models already works
surprisingly well, some symbols are simply annoying to draw. I'll keep
gathering feedback and iterate as needed, possibly replacing offending symbols
with better alternatives.</p>
<p>However, <strong>TexnoLatin</strong> already meets minimal requirements for usage in <a href="https://texnoforge.dev/words-of-power/">Words
of Power</a> game and it's only going to get better.</p>
<p>To celebrate this milestone, let me invoke a <strong>strong fire ball</strong> or <strong>fortis
ignis sphaera</strong> in <strong>TexnoLatin</strong>:</p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/strong" title="fortis">
<img alt="fortis" class="medium-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/strong.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/fire" title="ignis">
<img alt="ignis" class="medium-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/fire.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/texnolatin/ball" title="shpaera">
<img alt="sphaera" class="medium-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/texnolatin/ball.svg"/>
</a></p>
<p><br style="clear: both;"/></p>
<ul>
<li><strong>TexnoLatin</strong> source repo: <a href="https://github.com/texnoforge/texnolatin/">github.com/texnoforge/texnolatin</a></li>
<li>view <strong>TexnoLatin</strong> online: <a href="https://wop.texnoforge.dev/abc/texnolatin">wop.texnoforge.dev/abc/texnolatin</a></li>
</ul>
<h2>Focusing Magic Contributions</h2>
<p>It's been 2 years since previous Words of Power <a href="/n/words-of-power-devlog-8-online-magic/">devlog</a>
and I've been busy learning the wonderful
<a href="https://godotengine.org/">Godot</a> engine through game jams and various prototypes.</p>
<p>After hundreds of hours of game and tool development in Godot over tens of
different projects, I've confirmed that I'm able to implement all systems
needed for the first <a href="https://texnoforge.dev/words-of-power/">Words of Power</a> game in Godot so the time has come once
again to return to the underlying <a href="https://texnoforge.github.io/texnomagic/">TexnoMagic</a> symbol recognition tech and get
it production ready.</p>
<p>I've managed to persuade few friends (and one random internet citizen called
Dan) to actually draw me an arbitrary alphabet of <strong>26</strong> symbols. Thank you all,
dear Progenitors of Magic ♥ As much as this was useful and valuable, I must
admit it's silly to expect people to willingly spend their time creating a
made-up lexicon of symbols.</p>
<p>Furthermore, it takes a fair amount of data to train reliable symbol recognition
models, so even if users were interested in creating their own alphabets, it's
unlikely for a single individual to generate sufficient training data set.</p>
<p>In other words, it takes a lot of effort and collaboration to create a magic
alphabet. Instead of splitting effort, I decided to focus on a single reference
alphabet first and foremost.</p>
<p>People are also generally unwilling to install obscure software on their machines,
not to mention how painful it is to support various platforms. I'll try to make
the collaboration easy for users by providing online tools which can be run from
any device and system with a modern web browser without the need to install
anything. It should be as easy as clicking a link.</p>
<h2>Gathering Drawings for Model training</h2>
<p>In order to achieve reliable symbol recognition, a considerable amount of
training data is required to train robust symbol models. Ideally, this data
(drawings) should come from various users, machines, systems, and pointing
devices to ensure models are general enough.</p>
<p>I've devised a web-based solution to collect anonymous user drawings from any
device with a modern web browser thanks to Godot web exports and the power of
Python.</p>
<p>First, I've created "perfect" symbol images in SVG format (as you can see above)
to serve as desired symbol shapes.</p>
<p>Next, I wrote a simple Godot webapp called <strong>Words of Power Trainer</strong>
(<a href="https://github.com/texnoforge/woptrainer">woptrainer</a>) available online on <a href="https://train.texnoforge.dev">train.texnoforge.dev</a> for the
singular purpose of collecting user symbol drawings.</p>
<p>User is tasked with simply drawing the symbol image on the screen:</p>
<div class="figure"><a href="https://train.texnoforge.dev"><img src="/images/woptrainer.png" title="Words of Power Trainer @ train.texnoforge.dev"/></a></div>
<p>Upon pressing <strong>GOOD</strong> or <strong>BAD</strong> button, the drawing is anonymously sent to new
<strong>Words of Power Vault</strong> (<a href="https://github.com/texnoforge/wopvault">wopvault</a>) python server living at
<a href="https://wopvault.texnoforge.dev">wopvault.texnoforge.dev</a> where it's stored as CSV file for later processing.
You can view online <a href="https://wopvault.texnoforge.dev">Vault report</a> on collected
drawings. At the time of writing, there are more than <strong>1400</strong> user submitted drawings in the Vault, with roughly <strong>70 %</strong> imported into <a href="https://github.com/texnoforge/texnolatin/">TexnoLatin</a>.</p>
<div class="figure"><a href="https://wopvault.texnoforge.dev"><img src="/images/wopvault_report.png" title="Words of Power Vault Report"/></a></div>
<p>Finally, new <strong>Words of Power Laboratory</strong> (<a href="https://github.com/texnoforge/woplab">woplab</a>) tool allows to
conveniently import the collected data from the Vault into <a href="https://github.com/texnoforge/texnolatin/">TexnoLatin</a> with its
<code>woplab vault export</code> command.</p>
<p>Existing symbol models are used to judge Vault drawings quality and only
drawings with recognition score above certain threshold are exported. This
allows continuous auto-import of user drawings without worrying about
introducing bad data.</p>
<div class="figure"><img src="/images/wopvault_export.png" title="woplab vault export"/></div>
<p><a href="https://texnoforge.github.io/texnomagic/">TexnoMagic</a> received a new colorful CLI and a bunch new features and
improvements related to new functionality - check out <a href="https://texnoforge.github.io/texnomagic/news/">TexnoMagic News</a> (which
are brand new as well).</p>
<div class="figure"><img src="/images/texnomagic_recognize.png" title="texnomagic drawing recognize"/></div>
<h2>Help by Drawing 🧙♂️</h2>
<p><a href="https://train.texnoforge.dev">train.texnoforge.dev</a></p>
<p>There is no such thing as too much training data - <strong>thank you for your contribution</strong> ♥</p>
<p><br/></p>
<p><a href="https://texnoforge.dev/words-of-power/">Words of Power</a></p>Litany of Curses - new 🅃🅈🄿🄸🄽🄶 game2023-04-07T23:23:00+02:002023-04-07T23:23:00+02:00voice of texnoforgetag:texnoforge.dev,2023-04-07:/n/litany-of-curses-intro/<p>I've really enjoyed our
<a href="https://texnoforge.dev/n/temple-of-unstable-god-intro/">previous jam</a>
so I've entered <a href="https://godotwildjam.com/">Godot Wild Jam</a> once more, but this time without an artist.</p>
<p>I've always enjoyed the obscure niche of typing games so I've decided to
create one myself by only using text. I humbly present <strong>Litany of
Curses</strong>:</p>
<iframe frameborder="0"
src="https://itch.io/embed/1923105?bg_color=000000&fg_color=ffffff&link_color=5b98dd&border_color=353535"
width="552" height="167"><a
href="https://texnoforge.itch.io/litany-of-curses">Litany of Curses by …</a></iframe><p>I've really enjoyed our
<a href="https://texnoforge.dev/n/temple-of-unstable-god-intro/">previous jam</a>
so I've entered <a href="https://godotwildjam.com/">Godot Wild Jam</a> once more, but this time without an artist.</p>
<p>I've always enjoyed the obscure niche of typing games so I've decided to
create one myself by only using text. I humbly present <strong>Litany of
Curses</strong>:</p>
<iframe frameborder="0" height="167" src="https://itch.io/embed/1923105?bg_color=000000&fg_color=ffffff&link_color=5b98dd&border_color=353535" width="552"><a href="https://texnoforge.itch.io/litany-of-curses">Litany of Curses by
texnoforge</a></iframe>
<p>(play in browser, keyboard required)</p>
<p>It's basically a glorified Words Per Minute (WPM) counter with curses, fancy letter
animations, great sounds by <a href="http://janondra.com/">Apheo</a>, spooky music by
<a href="https://www.youtube.com/channel/UCnFc_CyFVxznGN24MeSYRtg">Dr. Avocadough</a>,
and most importantly harsh judgements about your typing skills.</p>
<p>Have a great time cursing while we work on more serious projects 🧙</p>Temple of Unstable God - new jam game2023-02-12T23:23:00+01:002023-02-12T23:23:00+01:00voice of texnoforgetag:texnoforge.dev,2023-02-12:/n/temple-of-unstable-god-intro/<p>After <a href="https://texnoforge.dev/n/black-and-white-jam-8-report/">previous jam struggles</a>
with art, we got lucky and found ourselves a great pixel artist in the <a href="https://godotwildjam.com/">Godot
Wild Jam</a> and we managed to create a standout game on our second try!</p>
<iframe frameborder="0"
src="https://itch.io/embed/1713415?bg_color=000000&fg_color=FFFFFf&link_color=5b98dd&border_color=333333"
width="552" height="167"><a
href="https://texnoforge.itch.io/temple-of-unstable-god">Temple of Unstable
God</a></iframe>
<p>I'm busy working on the next jam game with the crew, so have …</p><p>After <a href="https://texnoforge.dev/n/black-and-white-jam-8-report/">previous jam struggles</a>
with art, we got lucky and found ourselves a great pixel artist in the <a href="https://godotwildjam.com/">Godot
Wild Jam</a> and we managed to create a standout game on our second try!</p>
<iframe frameborder="0" height="167" src="https://itch.io/embed/1713415?bg_color=000000&fg_color=FFFFFf&link_color=5b98dd&border_color=333333" width="552"><a href="https://texnoforge.itch.io/temple-of-unstable-god">Temple of Unstable
God</a></iframe>
<p>I'm busy working on the next jam game with the crew, so have fun in the
<a href="https://texnoforge.itch.io/temple-of-unstable-god">Temple of Unstable God</a>!</p>Black and White Jam #8↷∞ Report - DROOP2022-08-02T23:23:00+02:002022-08-02T23:23:00+02:00voice of texnoforgetag:texnoforge.dev,2022-08-02:/n/black-and-white-jam-8-report/<p>I've decided to join my first game jam in order to test my gamedev skills as
well as meet and cooperate with artists who share my enthusiasm for creating
games.</p>
<iframe frameborder="0"
src="https://itch.io/embed/1481036?bg_color=000000&fg_color=FFFFFf&link_color=5b98dd&border_color=333333"
width="552" height="167"><a href="https://texnoforge.itch.io/droop">droop by
texnoforge</a></iframe>
<p>I was delighted to discover that <a href="https://itch.io/jams">itch.io/jams</a> has
a calendar full of indie game jams …</p><p>I've decided to join my first game jam in order to test my gamedev skills as
well as meet and cooperate with artists who share my enthusiasm for creating
games.</p>
<iframe frameborder="0" height="167" src="https://itch.io/embed/1481036?bg_color=000000&fg_color=FFFFFf&link_color=5b98dd&border_color=333333" width="552"><a href="https://texnoforge.itch.io/droop">droop by
texnoforge</a></iframe>
<p>I was delighted to discover that <a href="https://itch.io/jams">itch.io/jams</a> has
a calendar full of indie game jams! Folks are jamming all the time and there
is a huge selection of jams of different sizes, topics, rules... there's
something interesting for everyone.</p>
<p>I've decided to go for
<a href="https://itch.io/jam/black-and-white-jam-8">Black and White Jam #8↷∞</a>
which required participants to create a game in 12 days while using only two
colors. I do enjoy Black & White aesthetics quite a lot, as you can tell from
this website. The theme of the jam was revealed to be <strong>loop</strong>.</p>
<p>Many participants joined the jam on their own as individuals and I often find
myself in a lone wolf position as well, but this time I wanted to try
cooperation.</p>
<p>I've managed to assemble a crew:</p>
<ul>
<li>🐒 coder</li>
<li>🎨 graphic artist</li>
<li>🎵 music composer</li>
<li>🔊 sound engineer</li>
</ul>
<p>We actually <strong>created a simple game in 12 days</strong> and you can play
it in your browser as long as you have a keyboard or a controller:</p>
<iframe frameborder="0" height="167" src="https://itch.io/embed/1481036?bg_color=000000&fg_color=FFFFFf&link_color=5b98dd&border_color=333333" width="208"><a href="https://texnoforge.itch.io/droop">droop by
texnoforge</a></iframe>
<p>Be sure to listen to the music, which was voted to be the game's strongest
point. Sounds are also of good quality i think, we only didn't get much
graphics because the artist was busy. Gameplay is... well, <strong>loop</strong>. We ran
out of time.</p>
<p>While the result isn't a great game, it is <strong>a game</strong> and I'm happy with it
given this was a first try and we wasted half of our time on visions too grand
for the little time we got.</p>
<h2>Insights from the Jam</h2>
<p>I've found the deadline frustrating, but it was definitely worth the time
and effort invested. The experience of going through full gamedev cycle
including release is very valuable and so is the experience of cooperation
with artists, because I can now take the art workflow into consideration and
optimize code/pipelines/processes to quickly integrate new and updated assets
into the game.</p>
<p>But what I like the most is the opportunity to meet like-minded artists,
test creative compatibility on a non-critical yet interesting project, and
continue cooperation beyond jam if all sides enjoyed it. It's extremely
hard to find motivated people willing and able to spend their time creating
digital arts together, and game jams are literally full of them. </p>
<p>To sum up, I really love the idea of game jams (learn by doing), and I'm sure
to participate every now and then. If you have a slightest interest in gamedev,
I recommend you <a href="https://itch.io/jams">try it</a> as well, it's fun and
educational at the same time.</p>
<p><br/></p>Words of Power devlog #8: Online Magic2022-03-24T23:23:00+01:002022-03-24T23:23:00+01:00voice of texnoforgetag:texnoforge.dev,2022-03-24:/n/words-of-power-devlog-8-online-magic/<p>First <a href="https://texnoforge.dev/words-of-power/">Words of Power</a> game is now finally in development after
3 years of research on available game engines and tools 🥳</p>
<p><a href="https://godotengine.org/">Godot</a> fits my indie needs the best while being fun to use even after some
real coding and my experiments indicate it should be able to handle the
<a href="https://texnoforge.dev/n/words-of-power-devlog-7-better-world/">dynamic …</a></p><p>First <a href="https://texnoforge.dev/words-of-power/">Words of Power</a> game is now finally in development after
3 years of research on available game engines and tools 🥳</p>
<p><a href="https://godotengine.org/">Godot</a> fits my indie needs the best while being fun to use even after some
real coding and my experiments indicate it should be able to handle the
<a href="https://texnoforge.dev/n/words-of-power-devlog-7-better-world/">dynamic world</a> I desire.</p>
<p>With the essential technological questions finally answered, I'm now
able to proceed with the game development beyond prototype phase.</p>
<h2>Back to Magic 🧙</h2>
<p>Game assets and code aside, two primary magic-related tasks
remain:</p>
<ul>
<li>create official <a href="https://texnoforge.github.io/texnomagic/">TexnoMagic</a> alphabet (symbols)</li>
<li>create spell grammar to translate spells for use in the game</li>
</ul>
<p>These are tightly interconnected as spell forms depend on available symbols.
Furthermore, maximum alphabet size is limited by real world machine performance
as each symbol adds extra computation step during recognition. Adding a new
required symbol to the spell grammar is disruptive as it makes all existing
alphabets which don't contain the symbol incomplete. In other words it's
extremely important to choose a good starting alphabet.</p>
<p><a href="https://texnoforge.github.io/wopeditor/core_symbols.html">Core Symbols Challenge</a> was a first well-defined set of symbols required in a
magic alphabet. I persuaded few mages to contribute their symbols (thanks!) and
results are aggregated on the <a href="https://wop.mod.io">wop.mod.io</a> mod portal.</p>
<p>However, it's already clear that these first magic alphabets are missing symbols
required to represent all possible spells in a coherent manner. </p>
<p>In order to figure out which symbols are really needed I need to have a
full-featured spell grammar. In order to figure out the spell grammar, I need
to experiment in the <a href="https://texnoforge.dev/n/words-of-power-devlog-7-better-world/">game world</a> which isn't quite ready yet
for such complex interactions and I'm also missing art assets to give them
proper form.</p>
<p>It's now impossible to accurately determine final symbol set, however, some
symbols from <a href="https://texnoforge.github.io/wopeditor/core_symbols.html">Core Symbols Challenge</a> are certain to be included and thus it's
about time I processed the user magic on <a href="https://wop.mod.io">wop.mod.io</a> and started working on
the official Words of Power alphabet that will serve as a default in the game.</p>
<h2>Words of Power online browser</h2>
<p>In order to make browsing and comparing existing community magic easy and
accessible without the need to install a software, I've deployed new
<a href="https://wop.texnoforge.dev">wop.texnoforge.dev</a> online app which displays all community magic from
<a href="https://wop.mod.io">wop.mod.io</a> mod portal in one place on any device with internet and a browser.</p>
<p>Symbols are rendered as simple SVG images so they can be scaled to
any resolution without quality loss. <a href="https://wop.texnoforge.dev/symbols">Symbols Overview</a> is available which
lists all different forms of a symbol across alphabets - a feature that will
come in handy when creating the default alphabet based on community creations.</p>
<p>See the magic for yourself:</p>
<h3><a href="https://wop.texnoforge.dev">wop.texnoforge.dev</a></h3>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/fire" title="fire">
<img alt="fire" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/fire.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/ice" title="ice">
<img alt="ice" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/ice.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/lightning" title="lightning">
<img alt="lightning" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/lightning.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/water" title="water">
<img alt="water" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/water.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/air" title="air">
<img alt="air" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/air.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/earth" title="earth">
<img alt="earth" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/earth.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/life" title="life">
<img alt="life" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/life.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/death" title="death">
<img alt="death" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/death.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/bolt" title="bolt">
<img alt="bolt" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/bolt.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/ball" title="ball">
<img alt="ball" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/ball.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/beam" title="beam">
<img alt="beam" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/beam.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/area" title="area">
<img alt="area" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/area.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/cone" title="cone">
<img alt="cone" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/cone.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/self" title="self">
<img alt="self" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/self.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/friend" title="friend">
<img alt="friend" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/friend.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/enemy" title="enemy">
<img alt="enemy" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/enemy.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/close" title="close">
<img alt="close" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/close.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/far" title="far">
<img alt="far" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/far.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/weak" title="weak">
<img alt="weak" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/weak.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/strong" title="strong">
<img alt="strong" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/strong.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/random" title="random">
<img alt="random" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/random.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/all" title="all">
<img alt="all" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/all.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/big" title="big">
<img alt="big" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/big.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/small" title="small">
<img alt="small" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/small.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/fast" title="fast">
<img alt="fast" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/fast.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/slow" title="slow">
<img alt="slow" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/slow.svg"/>
</a></p>
<p><a class="symbol-preview" href="https://wop.texnoforge.dev/symbol/firstmage/homing" title="homing">
<img alt="homing" class="small-size" src="https://wop.texnoforge.dev/dynamic/img/symbols/firstmage/homing.svg"/>
</a></p>
<p><br style="clear: both;"/></p>
<p>As with all Words of Power core tech, this application is free and open source,
you can see/fork its sources on <a href="https://github.com/texnoforge/wopweb">texnoforge github</a>, and even deploy your
instance if you want.</p>
<p>You can also use the <code>wopweb.cli</code> to render SVG/PNG images from <a href="https://texnoforge.github.io/texnomagic/">TexnoMagic</a> symbols.</p>
<p><br/></p>
<p>Next log: <a href="/n/words-of-power-devlog-9-texnolatin-in-training/">9: TexnoLatin Alphabet in Training</a></p>Words of Power devlog #7: In Search of a Better World2021-10-26T23:23:00+02:002021-10-26T23:23:00+02:00voice of texnoforgetag:texnoforge.dev,2021-10-26:/n/words-of-power-devlog-7-better-world/<p>I'm very pleased with the accuracy and speed of <a href="https://texnoforge.github.io/texnomagic/">TexnoMagic</a> symbol
recognition system while its universal interface allows integration with any
other system/engine/language.</p>
<p>With the technomagical core of <a href="https://texnoforge.dev/words-of-power/">Words of Power</a> in existence, I need a world to
cast this magic upon!</p>
<h2>The Dream of Dynamic Destructible World …</h2><p>I'm very pleased with the accuracy and speed of <a href="https://texnoforge.github.io/texnomagic/">TexnoMagic</a> symbol
recognition system while its universal interface allows integration with any
other system/engine/language.</p>
<p>With the technomagical core of <a href="https://texnoforge.dev/words-of-power/">Words of Power</a> in existence, I need a world to
cast this magic upon!</p>
<h2>The Dream of Dynamic Destructible World</h2>
<p>For magic to really shine and feel meaningful and powerful, it must affect the
world in meaningful and powerful ways. Magic should affect and interact with
<strong>all</strong> objects in the world as well as the world itself in a persistent
manner.</p>
<p>Quite a few games presented really dynamic and interactive worlds but it's
still far more common for game worlds to be mostly static with only selected
few objects offering meaningful interaction with rest being static decorations
impervious to any change. Grenade, rocket, laser, a nuclear blast... nothing
has the power to change these static meshes.</p>
<p>I understand this is for performance as well as for simplicity reasons as it's
impossible to simulate all the subtle complexities of reality but
<strong>Populous 3: The Beginning</strong> was released in <strong>1999</strong> with:</p>
<ul>
<li>3D spherical worlds (planets)</li>
<li>dynamic terrain (could be terraformed in real time)</li>
<li>dynamic buildings (simulated damage part by part)</li>
<li>dynamic units (affected by magic, world, and each other)</li>
</ul>
<p>What an impressive technological feat! I thought this would be a standard some
quarter century later but I feel the industry regressed towards prettier
graphics instead.</p>
<p><strong>Worms</strong> presented randomly generated fully destructible levels in <strong>1995</strong> and I'm
sure we could trace dynamic worlds farther into the past but I hope I've made my point
that game worlds <strong>can</strong> be dynamic, devs just don't usually bother.</p>
<h2>3D Voxel Terrain</h2>
<p>To my best knowledge, no mainstream game engine of current generation supports
dynamic destructible worlds out of the box, a custom solution is required
which involves nontrivial amount of programming.</p>
<p>To that end, I've experimented with <a href="https://voxelplugin.com/">Voxel Plugin</a> for Unreal Engine and I was
able to create worlds using math and destroy them dynamically with
satisfactory performance and visuals. However, it's impossible to simulate
every voxel every frame. On the contrary, many smart tricks are used within
voxel engines to cast the illusion of consistent world, but in reality it's all
smoke and mirrors.</p>
<p>The difference between 2 and 3 dimensions is fairly small as far as math goes,
but it's a huge difference from performance perspective.</p>
<p>Let's assume I'd like to simulate each cell of a 200x200 grid map ("Normal" map
size in Age of Empires 2) based on neighbouring cells in the spirit of cellular
automata such as Conway's Game of Life. This gives us <strong>40 000 cells</strong> to
update each simulation tick. Each cell has <strong>8 neighbours</strong>.</p>
<p>Now let's add one more dimension - a cube voxel world of 200x200x200 cells
has <strong>8 000 000</strong> cells to update each tick. Each cell has <strong>26 neighbours</strong>.</p>
<p>Computational and memory complexity of such simulation increases drastically
with extra dimensions.</p>
<p>I think I prefer to simulate 2D world in greater detail. Furthermore,<br/>
dominant human input interface is still the 2D screen and I can't
afford to waste too much time with performance optimization.</p>
<h2>Heightmap Terrain</h2>
<p>2D matrix can be used to describe surface elevation of each map cell
effectively representing 3D terrain. This is commonly called a <strong>heightmap</strong>.</p>
<p>Heightmaps are supported by most game engines and terrain related software and
they're very fast to work with including runtime generation and modification.
However, heightmap can't represent overhanging terrain which might be
an acceptable compromise for games with top-down camera such as RTS, but it
becomes problematic in first person games especially with dynamic terrain
deformation. No holes, no caves...</p>
<h2>Start Simple</h2>
<p>After experimentation with tools and resources currently available to me, I've
decided to go for the simplest possible approach first and only add complexity
(such as dimensions) later when it turns out they're really needed.</p>
<p>I'm currently prototyping a 2D grid based world for <strong>Words of Power</strong>
rendered from a top-down 2D perspective as a simplest possible approach with
following advantages:</p>
<ul>
<li>primary PC output interface is still 2D (screen) </li>
<li>Godot Engine supports 2D rendering well</li>
<li>2D graphics are easy to create</li>
<li>I like games with top-down camera the most</li>
</ul>
<p>If I don't hit any fundamental issues in my retrofuturistic 2D journey,
<strong>Words of Power 2D</strong> might become a thing. Or it's yet another
prototype - only one way to find out ᕕ( ᐛ )ᕗ </p>
<p><br/></p>
<p>Next log: <a href="/n/words-of-power-devlog-8-online-magic/">#8: Online Magic</a></p>Words of Power devlog #6: Introducing TexnoMagic2021-06-11T23:23:00+02:002021-06-11T23:23:00+02:00voice of texnoforgetag:texnoforge.dev,2021-06-11:/n/words-of-power-devlog-6-introducing-texnomagic/<p>It's only been 2 months since the <a href="/n/words-of-power-devlog-5-introducing-wopeditor">introduction</a> of <code>python-wopeditor</code> and
I've already <a href="https://texnoforge.github.io/wopeditor">rewritten it</a> yet again, now in Godot Engine
¯\_(ツ)_/¯</p>
<p>More importantly, I managed to create the core of texnoforge magic along the
way called <strong><a href="https://texnoforge.github.io/texnomagic">TexnoMagic</a></strong> 🧙🏻♂️</p>
<p>Let me tell you the story of how this unusual …</p><p>It's only been 2 months since the <a href="/n/words-of-power-devlog-5-introducing-wopeditor">introduction</a> of <code>python-wopeditor</code> and
I've already <a href="https://texnoforge.github.io/wopeditor">rewritten it</a> yet again, now in Godot Engine
¯\_(ツ)_/¯</p>
<p>More importantly, I managed to create the core of texnoforge magic along the
way called <strong><a href="https://texnoforge.github.io/texnomagic">TexnoMagic</a></strong> 🧙🏻♂️</p>
<p>Let me tell you the story of how this unusual magic project came into existence.</p>
<h2>TexnoMagic Genesis</h2>
<h3>MK0: Python loves science</h3>
<p>I've created the first prototype of a magic recognition system based on my
<a href="https://texnoforge.dev/n/words-of-power-devlog-1-theory-of-magic/">Theory of Magic</a> in Python's brilliant <code>numpy</code>/<code>scipy</code>/<code>scikit-learn</code>
scientific libs as a Jupyter notebook in May 2020. It was an efficient,
interactive, and overall pleasant experience. I've confirmed my analytical
approach is viable within two weeks and I've moved on to search for the right
engine/framework to write Words of Power in.</p>
<div class="figure"><img src="/images/wop/wop-mk0.png" title="training of symbol model from data in Jupyter
notebook"/></div>
<h3>MK1: Unreal suffering C++ edition</h3>
<p>Then I've spent 2nd half of 2020 writing Words of Power in Unreal Engine which
is itslef written in C++. Using built-in Unreal features is pleasant, but
integration of external code proved to be an incredible
<a href="https://texnoforge.dev/n/indie-game-devs-rant-on-unreal-engine-4/">struggle</a>. After a month of pure frustration I've managed to
integrate <a href="https://www.mlpack.org">mlpack</a> C++ machine learning library as an Unreal plugin and get
a basic UI and symbol recognition working but it was by far the most
frustrating task I've faced so far. Compiling the plugin was pain, Unreal
build system, integration, interface, and docs were suffering. I've managed to
overcome these challenges just to prove I could but never again shall
I inflict such pain on myself willingly. It's doable, but I don't posses the
willpower necessary to fight the pointless fight against the Unreal Engine.</p>
<div class="figure"><img class="image-process-article-image" src="/images/wopmk1/derivatives/article-image/symbol.png" title="Words of Power MK1 Unreal Edition - science done through mlpack"/></div>
<p>This exercise in futility only sharpened the contrast between working with
right tools for the job (python/scikit-learn) and wrong tools for the job
(Unreal/C++). The speed of development of the science/magic features was
between 10-100 times faster in python where I could implement thoughts in
minutes as opposed to Unreal-crippled C++ where any basic task could take days
for the most obscure if not obscene reasons.</p>
<p>One of the <a href="/n/words-of-power-devlog-3-lessons-from-prototype-mk1/">lessons</a> learned thanks to this traumatic experience is
that I need to develop the magic/scientific core with the right tools for the
job effectively making it independent on the Words of Power game and mod editor so
that it can be (re)used from any tech/language/engine/framework. It was clear
python/scikit-learn is the answer.</p>
<h3>MK2: back to the power of sneck 🐍</h3>
<p>I've started the development of <a href="https://texnoforge.github.io/python-wopeditor">python-wopeditor</a> the Words of Power Editor
in the beginning of 2021 using python/scikit-learn combo used in MK0 for core
and <a href="https://kivy.org">Kivy</a> framework for UI. I managed to create a working magic editor during
3 months including <a href="https://texnoforge.github.io/python-wopeditor/install/">easy installation</a> on Windows and Linux
systems, mod integration and <a href="https://texnoforge.github.io/python-wopeditor">more</a>.</p>
<div class="figure"><img class="image-process-article-image" src="/images/wop/derivatives/article-image/wop-mk2.png" title="wopeditor MK2 Kivy edition - the origin of TexnoMagic"/></div>
<p>Even though I love Python for its many amazing libraries for science and
engineering, my experience with Python's UI/game frameworks has always been tragic.
Even the <a href="https://kivy.org">Kivy</a> cross-platform UI framework I've used this time after
a considerable research and effort proved to be incredibly hard to use and
never working as expected without non-intuitive tinkering.</p>
<p>After writing a functional mod editor on 1500 lines of python/Kivy code,
I've discovered that development in Kivy isn't efficient and it's definitely
not fun. It feels like a flashback into the old days of software engineering
of the 20th century with each feature requiring hard work and suffering to
implement. That's not how we write software in the future so I've killed this
abomination of a project in an act of mercy.</p>
<p>Luckily, the time invested into <a href="https://texnoforge.github.io/python-wopeditor">python-wopeditor</a> was far from wasted. The UI
itself is certainly important, but I can create that in a month or two in any
framework/engine as I've already demonstrated in Unreal, Kivy, and Godot.</p>
<p>More importantly, under the hood of <code>python-wopeditor</code> I've created a general
system and format for digital magic described in my <a href="https://texnoforge.dev/n/words-of-power-devlog-1-theory-of-magic/">Theory of Magic</a>. After
maturing a little, I've split the <strong>magic core</strong> into a separate project
called <a href="https://texnoforge.github.io/texnomagic">TexnoMagic</a>.</p>
<p>Even though <code>python-wopeditor</code> is dead, <a href="https://texnoforge.github.io/texnomagic">TexnoMagic</a> has finally reached
usable stage including universtal system-agnostic interface and it's going to
serve as a magic core of texnoforge creations including but not limited to
<a href="https://texnoforge.dev/words-of-power/">Words of Power</a>.</p>
<h3>MK3: TexnoMagic + Godot = Future</h3>
<p>In May 2021 I've started working on the new <a href="https://texnoforge.github.io/wopeditor">wopeditor</a> written in
<a href="https://godotengine.org/">Godot</a> and I'm <strong>finally</strong> happy with the tools I've chosen. I've had a good
time with UI design in Godot and <code>wopeditor</code> is already more usable than any
previous iteration.</p>
<div class="figure"><img src="/images/wop/wop-mk3.png" title="wopeditor MK3 powered by TexnoMagic server"/></div>
<p>The last remaining challenge is that of an interface between Words of Power
(Editor) and <strong>TexnoMagic</strong> which provides all the magic tech. I need to use
<strong>TexnoMagic</strong> from Godot and generally from anywhere I want, not only from
Python.</p>
<p>That's why I've been working on a simple TCP server now included in
<a href="https://texnoforge.github.io/texnomagic">TexnoMagic</a> to allow using its magical powers from any
software/language/system/framework/engine.</p>
<p>I've already got this working - <code>wopeditor</code> is able to ask <strong>TexnoMagic</strong>
server to train a symbol model or get a visual model preview without doing
any magic itself. It needs more polish but I'm finally looking forward to
a first <code>wopeditor</code> release which will allow comfortable creation of
<strong>TexnoMagic</strong> alphabets as well as sharing through <a href="https://wop.mod.io">wop.mod.io</a>.</p>
<p><a href="https://texnoforge.dev/words-of-power/">Words of Power</a> game(s) will reuse <strong>TexnoMagic</strong> the very same way.</p>
<h2>TexnoMagic is free as in freedom</h2>
<p>In accord with <a href="https://texnoforge.dev/n/words-of-power-devlog-4-free-and-open-core/">Free and Open Core</a> statement, <a href="https://texnoforge.github.io/texnomagic">TexnoMagic</a> is provided as
Free and Open Source Software under permissive MIT license so everyone can use
it.</p>
<p>It needs more time to mature for general audience but I'm very happy with how
it's shaping and you can expect new <a href="https://texnoforge.github.io/wopeditor">wopeditor</a> to bring <a href="https://texnoforge.github.io/texnomagic">TexnoMagic</a> to
life with the power of <a href="https://wop.mod.io">community</a>.</p>
<p>More good news later ⊂(✰‿✰)つ</p>
<p><br/></p>
<p>Next log: <a href="/n/words-of-power-devlog-7-better-world/">#7: In Search of a Better World</a></p>Words of Power devlog #5: Introducing wopeditor2021-04-06T04:20:00+02:002021-04-06T04:20:00+02:00voice of texnoforgetag:texnoforge.dev,2021-04-06:/n/words-of-power-devlog-5-introducing-wopeditor/<p>It's my great pleasure to finally introduce first ever texnoforge Free and Open
Source project as promised in <a href="/n/words-of-power-devlog-4-free-and-open-core/">Free and Open Core devlog</a>!</p>
<p>Behold, the <a href="https://texnoforge.github.io/python-wopeditor">Words of Power Editor python Kivy edition</a>
or <code>python-wopeditor</code> for short 🥳</p>
<p><strong>EDIT:</strong> <code>python-wopeditor</code> was superseded by the new <a href="https://texnoforge.github.io/wopeditor">wopeditor</a>
written in Godot Engine.</p>
<h2>Core Symbols …</h2><p>It's my great pleasure to finally introduce first ever texnoforge Free and Open
Source project as promised in <a href="/n/words-of-power-devlog-4-free-and-open-core/">Free and Open Core devlog</a>!</p>
<p>Behold, the <a href="https://texnoforge.github.io/python-wopeditor">Words of Power Editor python Kivy edition</a>
or <code>python-wopeditor</code> for short 🥳</p>
<p><strong>EDIT:</strong> <code>python-wopeditor</code> was superseded by the new <a href="https://texnoforge.github.io/wopeditor">wopeditor</a>
written in Godot Engine.</p>
<h2>Core Symbols Challenge</h2>
<p>In case you want to test <del>python-wopeditor</del> <a href="https://texnoforge.github.io/wopeditor">wopeditor</a> in
a meaningful way, I've prepared a creative challenge for you that will help me
with the development:</p>
<ul>
<li><a href="https://texnoforge.github.io/wopeditor/core_symbols.html">Core Symbols Challenge</a> </li>
</ul>
<p>You can also complete the challenge with pen & paper or any other drawing
method if you don't want to play with <code>python-wopeditor</code>.</p>
<p>First analog submission is <strong>awesome</strong> and I'm looking forward to more
community creations!</p>
<h2>Central Mod Repo - wop.mod.io</h2>
<p><code>wopeditor</code> includes modding integration from the very first version.</p>
<p>TexnoMagic alphabets can be exported from <code>wopeditor</code> using <strong>export</strong> button
into a single <code>.zip</code> file which can be uploaded to <a href="https://wop.mod.io">wop.mod.io</a> as
a mod. It's simple - see
<a href="https://wop.mod.io/guides/words-of-power-mod-upload-howto">mod upload HOWTO</a>.</p>
<p>Furthermore, all mods from <a href="https://wop.mod.io">wop.mod.io</a> are displayed by default in
<code>wopeditor</code> and can be downloaded for local use and modifications in a single
click.</p>
<p><img src="/images/wopeditor_mods.png"/></p>
<p><a href="https://wop.mod.io">wop.mod.io</a> is going to serve as a central mod repository for all
software using TexnoMagic format like <code>wopeditor</code> and future Words of Power
(and hopefully other) games. This should allow building large amount of high
quality community content over time which can be enjoyed and reused in multiple
different games/apps making contribution meaningful in a long run.</p>
<p><br/></p>
<p>Next log: <a href="/n/words-of-power-devlog-6-introducing-texnomagic/">#6: Introducing TexnoMagic</a></p>Words of Power devlog #4: Free and Open Core2021-04-04T04:20:00+02:002021-04-04T04:20:00+02:00voice of texnoforgetag:texnoforge.dev,2021-04-04:/n/words-of-power-devlog-4-free-and-open-core/<p>After finishing <a href="/n/words-of-power-devlog-3-lessons-from-prototype-mk1/">prototype MK1</a>, the time has come for me to decide
which game engine to use for <strong>Words of Power</strong>. The choice of proper tools is
critical to any project so I've spent much time searching.</p>
<p>Finally, I can reveal the exciting future of <strong>Words of Power</strong> ⊂(✰‿✰)つ</p>
<h2>Free …</h2><p>After finishing <a href="/n/words-of-power-devlog-3-lessons-from-prototype-mk1/">prototype MK1</a>, the time has come for me to decide
which game engine to use for <strong>Words of Power</strong>. The choice of proper tools is
critical to any project so I've spent much time searching.</p>
<p>Finally, I can reveal the exciting future of <strong>Words of Power</strong> ⊂(✰‿✰)つ</p>
<h2>Free and Open Source Software in Games</h2>
<p>First, let me talk about Free and Open Source Software (FOSS) as someone who's
been writing and using FOSS for nearly two decades. I've even been paid to work
exclusively on FOSS for over 10 years and all that work is available for anyone and
everyone to reuse and improve for free under open licenses.</p>
<p>I proudly live the free and open way and I consider the movement to be
the much-needed counter-weight for the ever-escalating horrors of late capitalism.
I fight for a world where the basic human need to share is a basic right, not
something to be monetized, repressed, and labeled "piracy". Sharing is caring.</p>
<p>The experience of developing FOSS with the community is so great and fulfilling
that writing closed software (usually to generate profit for some greedy
incompetent managers) seems like utter waste of time in comparison.</p>
<p>FOSS has penetrated most areas of technolgical world but videogames are
proving particularly resilient. There are quite a few open source games but
they're usually rather simple, unpolished, low-performing, and/or overall
underwhelming compared to commercial titles. There are few exceptions to this
such as <a href="https://store.steampowered.com/app/334920/ZeroK/">Zero-K</a> which
I consider <strong>the best</strong> of Total Annihilation/Supreme Commander style of RTS
games with <strong>94 % Very Positive</strong> steam review score.</p>
<p>Exceptions aside, there are little to no top-tier FOSS games. There are many
open source ports of older games which behave much better than the originals
but game mechanics, graphics, sounds, and other assets are usually reused from
original game.</p>
<p>Even though the FOSS community learned to write decent software, videogames
require much more than technical skill. Games are complex works of art which
require... well, art! It's unlikely for one person to posses all the
technical and artistic skills required to create a masterpiece. This includes
graphics, animation, sound, music, writing, character design, level design,
and more. Creating a successful one-person game is an epic feat and getting
together a team of people with all the different skills required and ensuring
their efficient cooperation for year(s) sounds even more daunting.</p>
<p>Taking all this into consideration I understand why non-trivial games still
continue to cost money although other closed software is being replaced by open source
alternatives. It indeed takes an incredible amount of focused human work
incomparable to fixing a random bug in a FOSS project.</p>
<p>That's why I'm going to sell <strong>Words of Power</strong> on steam for a reasonable
price instead of making it free. However, I still strongly prefer to use FOSS
in the process.</p>
<h2>Game Engines of the Future</h2>
<p>After researching available engines and their features I discovered my choice
basically boils down to two most popular offerings - <strong>Unreal Engine</strong> and
<strong>Unity</strong>.</p>
<p>After a lot of staring into steam game news, changelogs, and posts I noticed
there's a neverending stream of issues related to Unity, upgrades between
Unity versions being especially problematic. And then I've discovered that
<strong>Unity</strong> doesn't provide source code, so you're getting a binary blob and
complete dependence on Unity developers - nice vendor lock-in! That might be
acceptable for devs releasing games they don't really plan to maintain but
it's totally unacceptable for me and my long-term projects. <strong>No Unity for
me</strong>.</p>
<p>Although <strong>Unreal Engine</strong> isn't trully free as in freedom, at least its
source code is available and monetization model is fair. I have
<a href="/n/indie-game-devs-rant-on-unreal-engine-4/">other problems with UE</a> but
it's still probably the closest to what I need.</p>
<p>Or is it? </p>
<h2>Waiting for Godot</h2>
<p><img src="/images/steer2godot.png"/></p>
<p>When I first looked at FOSS <a href="https://godotengine.org">Godot engine</a> some time ago I liked it but it
was missing certain features and its performance was in question. It looked like
a decent choice for 2D but seemed too risky for VR where performance is
critical.</p>
<p>Since then I've discovered that <a href="/n/vr-report-1-too-much-hassle/">VR is still too much hassle</a>
so I don't necessarily need to use 3D yet and even if I do I don't have to worry
about performance as much as in VR where anything less than 90 FPS @ 4k means
inferior user experience.</p>
<p>Now is a good time to point out the brilliance of the <strong>Godot</strong> engine name
itself. I've been waiting for a good FOSS game engine for as long as
I remember and I'm certainly not alone. In a funny and extremely fitting
reference to the famous 20th century play
<a href="https://en.wikipedia.org/wiki/Waiting_for_Godot">Waiting for Godot</a>, the Godot engine
claims to be "the game engine you waited for".</p>
<p>In fact, I had a great experience and fun with Godot so far, well worth the wait!
I'll leave the details why Godot rules for a future post when I have more
experience with it but let me share my limited insight on the Godot project in
the mid and long term.</p>
<p>In my day job as FOSS packager, I often judge projects by activity from various
sources in order to determine if they're alive enough to depend on. Looking at
<a href="https://github.com/godotengine/godot">godot source repo</a>, I was shocked to
discover <strong>34k commits</strong>, <strong>38k stars</strong>, <strong>7k forks</strong>, <strong>18k closed pull
requests</strong>, <strong>22k closed issues</strong> and <strong>5k open issues</strong> which are being
actively managed and worked on.</p>
<p>In other words, <strong>Godot is extremely alive</strong> and rising to power at
astonishing rate. It's already catching up with Unreal and Unity in terms of
features and performance while being more pleasant to use. The upcoming Godot
4.0 in the works already packs massive amount of features and improvements
including Vulkan support (faster 3D rendering).
All that is topped with permissive MIT license, good docs, free assets
library, interesting plugins, awesome community and more. I believe Godot's
future will be bright and I definitely plan to be involved.</p>
<p><strong>First Words of Power game is going to be written in <a href="https://godotengine.org">Godot engine</a> ᕕ( ᐛ )ᕗ</strong></p>
<h2>Words of Power Open Core</h2>
<p>After much though I've decided to take hybrid approach between what I believe
is right (FOSS) and what I need to do as part of my existence (obtain
resources to survive). Even though the <strong>Words of Power</strong> game itself won't be
free, I will provide the interesting core tech as well as related tools
including powerful magic and mod editor as <strong>free and
open source software</strong> available to everyone in hopes of building a thriving
open community of people interested in languages, digital magic, and machine
learning. </p>
<p>I've updated the <a href="/p/words-of-power/">Words of Power project description</a> with more
information including following overview diagram:</p>
<p><img class="invert-on-black" src="/images/wop/wop-overview.png"/></p>
<p>Posts about individual components will follow.</p>
<p><br/></p>
<p>Next log: <a href="/n/words-of-power-devlog-5-introducing-wopeditor/">#5: Introducing Words of Power Editor</a></p>
<p><a href="/p/words-of-power/">Words of Power</a></p>Words of Power devlog #3: Lessons from Prototype MK12021-01-23T04:20:00+01:002021-01-23T04:20:00+01:00voice of texnoforgetag:texnoforge.dev,2021-01-23:/n/words-of-power-devlog-3-lessons-from-prototype-mk1/<p>I consider Words of Power prototype MK1 finished as I
<a href="/n/indie-game-devs-rant-on-unreal-engine-4/">grow tired of Unreal Engine</a> so
I took my time to think about what I actually learned and how to get closer
to a great game while having fun.</p>
<p>In first iteration I focused on core systems for magic symbol …</p><p>I consider Words of Power prototype MK1 finished as I
<a href="/n/indie-game-devs-rant-on-unreal-engine-4/">grow tired of Unreal Engine</a> so
I took my time to think about what I actually learned and how to get closer
to a great game while having fun.</p>
<p>In first iteration I focused on core systems for magic symbol creation,
training, and recognition. I've created proof of concept symbol and alphabet
editor using Unreal Engine featuring:</p>
<ul>
<li>drawing symbols using mouse</li>
<li>realtime visualisation of symbol drawing using particle systems</li>
<li>save drawn symbols into data files</li>
<li>use Gaussian Mixture Models (GMM) to model individual symbols</li>
<li>use GMMs to classify/detect user drawn symbols</li>
<li>integration of mlpack scientific C++ library into Unreal Engine as a plugin</li>
<li>procedurally generated voxel world</li>
</ul>
<p>I was able to implement core systems but it was a painful and long process,
especially compared to prototype MK0 in python in which I was able to
test entire symbol recognition pipeline in about two weeks of slacking.</p>
<p>You can look at these screenshots from prototype MK1 and optionally press F
to pay respects.</p>
<div class="splide">
<div class="splide__track">
<ul class="splide__list">
<li class="splide__slide"><img src="/images/wopmk1/abc.png"/></li>
<li class="splide__slide"><img src="/images/wopmk1/symbol.png"/></li>
<li class="splide__slide"><img src="/images/wopmk1/drawing.png"/></li>
<li class="splide__slide"><img src="/images/wopmk1/draw.png"/></li>
<li class="splide__slide"><img src="/images/wopmk1/kek.png"/></li>
</ul>
</div>
</div>
<p><link href="https://cdn.jsdelivr.net/npm/@splidejs/splide@latest/dist/css/splide.min.css" rel="stylesheet"/></p>
<script src="https://cdn.jsdelivr.net/npm/@splidejs/splide@latest/dist/js/splide.min.js"> </script>
<script>
new Splide( '.splide' ).mount();
</script>
<h2>Power to the People</h2>
<p>Why go for a single alphabet when I have a tech for training symbol models
from human drawings? I need to aim higher and make it possible for the strange
beings of the internet to create any symbols and alphabets they want.</p>
<p>I've already experimented with <a href="https://mod.io/">mod.io</a> modding platform
which I like a lot and I've designed symbols/alphabets to be mod friendly so
Words of Power should feature full integration of user-generated content from
early versions.</p>
<p>Furthermore, I should make the entire TexnoMagic framework (including all the
user content) easily reusable in various projects such as future texnoforge
games but it'd be even better to make it available to everyone to play
with or even use in games of their own in the spirit of open source.</p>
<h2>Powerful editor required</h2>
<p>I guess modders would enjoy messing with my data files directly in
their favourite editors but in order to penetrate the cyberspace,
a convenient and comfortable editor must be created and made easily available.</p>
<p>However, as I attempted to create in-game editor I realized that the needs of
a game and the needs of a symbol/alphabet/model editor vary greatly. In fact
they're completely different problems and I should treat them as such. Thus
I've decided to <strong>make a dedicated Words of Power editor independent on the main
game</strong> so I can use right tools for each job.</p>
<p>More info (including exciting news) on the editor is coming soon.</p>
<h2>Complexity of Presentation</h2>
<p>After playing with various Unreal subsystems I discovered most of them are
dedicated to some aspect of presentation:</p>
<ul>
<li>materials/shaders</li>
<li>lightning</li>
<li>character design</li>
<li>character rigging</li>
<li>character animation</li>
<li>asset design</li>
<li>level design</li>
<li>particle systems</li>
<li>UI</li>
</ul>
<p>This made me realize I'm a single person and I want to focus on interesting
concepts and tools as opposed to chasing beautiful graphics. I need to be
<strong>minimalist</strong> in all aspects but in graphics especially.</p>
<p>Going along the minimalist lines I further realized most of my favorite games
are top-down 2D or isometric and screens also happen to be 2D so it kind of
makes sense. Taking into consideration <a href="/n/vr-report-1-too-much-hassle/">VR isn't really comfortable enough for
long-term use yet</a>
I can afford to drop one dimension and go full 2D without Unreal which
would significantly simplify... <strong>everything</strong>.</p>
<p>Simple but well done graphics allow players to focus on what's going on in the
game as opposed to how things look and leave room for imagination to fill in the
details. Games like RimWorld, Prison Architect or Dwarven Fortress offer
unrivaled level of immersion while using very simple graphics.</p>
<p>To further prove my point, let's look at one of the oldest board games still
being played to this day after 4000 years - the game of Go (also known as Weiqi
or Baduk). I consider Go the best board game in existence which makes Chess
look like a kid's toy. Graphically speaking, it's extremely simple. The board
is a grid. Only pieces in play are round stones. No AAA graphics are needed in
Go because the game is interesting on its own. Anything other than basic
shapes would be a distraction from incredible patterns on the board.</p>
<h2>Beauty of Simulation</h2>
<p>The game of Go only has 1 piece/token/unit type - a stone. Players place
stones on the board in turns one at a time. There are only 6 basic rules which
can be explained in few minutes.</p>
<p>However, even though the rules are simple, the game itself certainly isn't. On
the contrary, Go was one of the last human games to resist the rising power of
AI opponents long after Chess grandmasters suffered an overwhelming defeat.</p>
<p>Similarly to Go, I'd like to connect simple atomic elements using simple rules
to form a complex living system. In other words I plan to create a <strong>magic simulator</strong>.
So far I focused on the simulation of magic casting/invocation but the
effects of individual spells on the game world must be simulated as well in
order to be belivable and provide sense of power.</p>
<p>All objects in Words of Power including terrain, buildings, and units must
properly interact with magic as well as each other through the means of
simulation.</p>
<h2>Power of Python</h2>
<p>Finally, I noticed that the scientific subproblems involved when processing data, models, GMMs,
language, and similar are incredibely pleasant to work with in python
using numpy/scipy and other scientific libraries and I should stick to it if
possible. Python is too slow to write entire game in, but it's excellent for
great number of problems I need to solve in Words of Power so I should find
a way to solve these in python while writing the game's core in a performant
game engine/framework.</p>
<h2>The Prototype is dead, long live The Prototype!</h2>
<p>This concludes the summary of lessons I learned in Words of Power prototype MK1
and I already started working on the next (hopefully final) iteration using
completely different tools. Let's see how it turns out this time, I'll keep
you updated.</p>
<p><br/></p>
<p>Next log: <a href="/n/words-of-power-devlog-4-free-and-open-core/">#4: Free and Open Core</a></p>
<p><a href="/p/words-of-power/">Words of Power</a></p>VR report #1: too much hassle2021-01-10T04:21:00+01:002021-01-10T04:21:00+01:00voice of texnoforgetag:texnoforge.dev,2021-01-10:/n/vr-report-1-too-much-hassle/<p>After more than a year of owning VR headsets it's about time for the first VR
report.</p>
<p>As of beginning of 2021, PC VR situation with Valve Index and Oculus Rift S is
best summarised with following quote:</p>
<h3>"It's too much hassle."</h3>
<p><em>-- fire of texnoforge</em></p>
<p>VR is really an impressive …</p><p>After more than a year of owning VR headsets it's about time for the first VR
report.</p>
<p>As of beginning of 2021, PC VR situation with Valve Index and Oculus Rift S is
best summarised with following quote:</p>
<h3>"It's too much hassle."</h3>
<p><em>-- fire of texnoforge</em></p>
<p>VR is really an impressive technology already, we finally have:</p>
<ul>
<li>almost decent resolutions</li>
<li>great sensors (eps. Valve Index Controllers) </li>
<li>sufficient FPS (I was able to get smooth 90 FPS out of few games)</li>
<li>games making proper use of new features</li>
</ul>
<p>Both the input and output devices are advanced enough to bring full immersion
<strong>but</strong>... it's ergonomy that prevents me from using it regularly:</p>
<ul>
<li>headset is <strong>heavy</strong></li>
<li>headset is attached with a <strong>fat cable</strong></li>
<li>headset must be sitting on head preciselly</li>
<li>movement is unpleasant due to cable pull and worsened vision as headset
slides out of its position on head</li>
</ul>
<p>In games with movement, it takes about 20 minutes for me to get annoyed and
rage quit. I can remain longer in sitting games with a top time of 6 hour in Elite:
Dangerous but the overall experience is simply such a hassle I rather leave
the VR kit turned off and use good old flat screen.</p>
<p>VR is currently good for short experiences but poor ergonomy prevents me from
long-term usage including development. In current implementation VR remains an
enthusiast's toy. The progress is great and number of VR devices grows as does
VR ecosystem but it's not yet in a state I'd recommend it for general use.</p>
<h2>recommended steam VR games</h2>
<h3>voice of texnoforge</h3>
<ul>
<li>Vox Machinae</li>
<li>GORN</li>
<li>Blade & Sorcery</li>
<li>Keep Talking and Nobody Explodes</li>
<li>Until You Fall</li>
<li>Jet Island</li>
<li>Elite: Dangerous</li>
<li>Compound</li>
</ul>
<h3>fire of texnoforge</h3>
<ul>
<li>Moss</li>
<li>Half-Life: Alyx</li>
<li>Vox Machinae</li>
<li>Elite: Dangerous</li>
<li>Paper Beasts</li>
</ul>
<h3>honorable mention</h3>
<ul>
<li>Fractal Alchemist (not really a game but an impressive VR fractal tool)</li>
</ul>indie game dev's rant on Unreal Engine 42021-01-10T04:20:00+01:002021-01-10T04:20:00+01:00voice of texnoforgetag:texnoforge.dev,2021-01-10:/n/indie-game-devs-rant-on-unreal-engine-4/<p>We've spent last year and a half learning Unreal Engine 4. It's indeed
a powerful and high performance engine with impressive graphical results which
is pushing game industry forward. However, as a single indie game developer
following certain vision, I found Unreal unfit for my purposes to a point
where …</p><p>We've spent last year and a half learning Unreal Engine 4. It's indeed
a powerful and high performance engine with impressive graphical results which
is pushing game industry forward. However, as a single indie game developer
following certain vision, I found Unreal unfit for my purposes to a point
where I've grown frustrated with it and I don't have fun using it anymore.
So let me welcome 2021 with a rant!</p>
<h2>game development is complex and so is Unreal</h2>
<p>Game development is a complex process requiring wide array of different skills. That's
why games are usually made by groups of people each specializing in certain
aspects such as:</p>
<ul>
<li>character design</li>
<li>level design</li>
<li>sound design</li>
<li>animation</li>
<li>shaders</li>
<li>programming</li>
<li>...</li>
</ul>
<p>Unreal engine is a platform for all of those people to work together. It
allows artists to focus on art and programmers focus on programming without
needing to know things outside of their individual expertise.</p>
<p>However, I'm just one person needing to do most of these tasks myself and
I found using Unreal Engine like single-handedly operating a huge battleship
which is obviously built for larger crew. Not fun at all, what I truly need is
just a fast small boat which I can fully control alone.</p>
<h2>right tool for the job?</h2>
<p>Unreal provides nice tools/workflows for creating levels and assets by hand
but no real support for procedural generation which I intentd
to abuse as much possible.</p>
<p>Unreal doesn't support dynamic/destructable terrain. I use third-party
Voxel Plugin to workaround this but it comes with its own set of challenges,
most notably a need for custom dynamic 3D navigation system.</p>
<p>One of my main reasons for using 3D (aside VR) was the vision of playing on
planets. Unreal has no support for planets. As a matter of fact, the gravity
vector always points down the Z axis so even a simple thing like directional
gravity requires custom code. Built-in navigation can't be used on planets.</p>
<p>Unreal doesn't really provide me much in terms of what I need so I still need to
create all that stuff myself but with the restrictions imposed by the engine.
On the other hand it provides lots of stuff I don't need which gets in my way.</p>
<h2>visual programming with Unreal Blueprints</h2>
<p>I was initially very excited to try visual programing in the form of Unreal
Blueprints because I'm passionate about computer languages and I spent lots of
time exploring them. So I wrote (drawn?) most of my Unreal code in Blueprints
including slightly complex problems and I hit following issues:</p>
<ul>
<li>Blueprints are static and not very flexible - inferior to C++ code</li>
<li>graphs are harder to read than standard code </li>
<li>graph management is pain</li>
<li>refactoring is nightmare</li>
<li>basic tools I'm used to when programming are missing</li>
</ul>
<p>I conclude that Blueprints aren't suited for general programing and should
only be used to prototype or as an interface for non-programmers. Blueprints are
completely useless for my use case - back to C++.</p>
<h2>Unreal C++ programming experience</h2>
<p>In order to create something grand, I'm surely going to need some external
libraries. For <a href="https://texnoforge.dev/p/words-of-power/">Words of Power</a>
prototype, I integrated beautiful open-source C++ scientific library called
<a href="https://www.mlpack.org/">mlpack</a> as an Unreal plugin because you can't
simply compile libraries into the engine and use them... because reasons. And
that was truly a horrible experience. What would be 5 minutes in python took
two weeks of Unreal-inflicted pain. As usual Unreal documentation is such that
I had to reverse engineer other plugins and search depths of the web to
actually get mine working. Hot reload isn't working for plugins so I need to
close and re-open Unreal every time I made a change making iteration
unpleasant and slow. Unreal build system is poorly documented too and I feel
like I have no control over it regardless of hours spent looking at it.</p>
<p>I was able to integrate my plugin and train a GMM model with it from within Unreal
Blueprints but each time I had to touch the code and deal with Unreal
bullshit, my will to do so again dropped drastically. At this point my will to
do Unreal C++ is at negative values because it's a direct opposite of fun.</p>
<h2>Unreal documentation</h2>
<p>Unreal documentation is... well, unreal. While there appears to be lots of
text, when I actually go google a solution to a particual Unreal problem, it's
never the official documentation that holds answers. Large part of Unreal
learning materials is in video format which I don't like. When I'm writing C++
(text) I want text, not video.</p>
<p>It's now clear to me that the only real documentation for Unreal Engine is its
source code. I'm used to high quality docuemnation and examples and that's where
Unreal consistentnly lets me down. Learning is earned with sweat and
blood.</p>
<h2>Unreal way of life</h2>
<p>Unreal Engine is a huge battleship of a sofware that provides mortals with
unseen power but at a cost of their souls. In order to become proficient with
individual subsystems, one needs to specialize and spend large quantities of
time and effort learning and experimenting. Poor documentation ensures this
process is painful. In other words it's a hard work.</p>
<p>I reckon that might be nice for people looking for a stable job at a gaming
company. I believe Unreal developers and artists won't have shortage of work
anytime soon and high entry barrier means that people who traversed it are more
valued.</p>
<p>However, I already have a nice job as an open source packager and game
development is my hobby/passion. That implies I want to have fun and Unreal
became the opposite of fun to me as soon as I stopped playing with it and
started to solve real problems. Furthermore I prefer generalization over
specialization so after a careful research and consideration I find myself
unwilling to offer my soul as a sacrifice to Unreal Engine's eternal hunger.</p>
<h2>research complete</h2>
<p>With this I consider my 1.5 years long research into Unreal Engine 4 as
completed. I studied most of its subsystems to some depth and I'm ready to
join an Unreal-based project with others if needed (for example VR project),
but I found it unfun and unfit for my purposes as an single game developer.</p>
<p>Time to play with some other tech that's actually fun to use.
<a href="https://godotengine.org/">Godot</a> looks promising, I think I'll give it
a shot.</p>Words of Power devlog #2: Invocation of Magic2020-11-11T04:20:00+01:002020-11-11T04:20:00+01:00voice of texnoforgetag:texnoforge.dev,2020-11-11:/n/words-of-power-devlog-2-invocation-of-magic/<p>After <a href="/n/words-of-power-devlog-1-theory-of-magic/">intro to Theory of Magic</a>
let's think about <strong>Invocation of Magic</strong> and human-to-magic interfaces next.
In particular let's focus on ways spells can be triggered by mages in
videogames.</p>
<p>All videos in this post were made in-game by me, and they are all under
1 minute so don't be …</p><p>After <a href="/n/words-of-power-devlog-1-theory-of-magic/">intro to Theory of Magic</a>
let's think about <strong>Invocation of Magic</strong> and human-to-magic interfaces next.
In particular let's focus on ways spells can be triggered by mages in
videogames.</p>
<p>All videos in this post were made in-game by me, and they are all under
1 minute so don't be afraid to watch them.</p>
<h2>Common Invocation</h2>
<p>In a vast majority of video games featuring magic, spells are cast by
pressing a button - be it mouse button, keyboard button or controller button.</p>
<p>Many different systems for acquisition, creation, modification, and
combination of spells have been implemented over the years but these are
separate from the casting itself. During gameplay, spells are usually selected
by pressing corresponding combination of buttons.</p>
<p>MOBA/RTS games brought us the innovation of <strong>fast cast</strong>/<strong>smart cast</strong> when
a spell is selected by pressing a button down and cast by releasing the very
same button. Targeting indicator can be shown while the button is held down
allowing the player to aim after selecting spell and reducing effective amount
of key presses by 50 % - very nice! Modern spellcasting is indeed very fast
when you wire your brain to correct buttons.</p>
<h2>Magickal Invocation</h2>
<p>Few PC games dared to deviate from the beaten path of <strong>one button per spell</strong>. Most
notably Magicka series
- <a href="https://store.steampowered.com/app/42910/Magicka/">Magicka</a>,
<a href="https://store.steampowered.com/app/238370/Magicka_2/">Magicka 2</a> and now dead
online Magicka: Wizard Wars.</p>
<p>Magicka spells are invoked in real time by
selecting up to 5 elements and triggering a cast type (self, forward,
around, weapon). Depending on selected elements and cast type, different
spells can be invoked. All element combinations result in a spell and some
specific sequences result in premade spells (Magickas).</p>
<video class="video-js vjs-big-play-centered" controls="" data-setup="{}" height="480" loop="" poster="/videos/invocation_magicka_poster.jpg" width="720">
<source src="/videos/invocation_magicka.mp4" type="video/mp4"/>
</video>
<p>This introduces new options/features to the game such as:</p>
<ul>
<li>complex/longer spells require more time and mental effort to cast - a price
much more personal to the player than abstract mana points/cooldown number</li>
<li>ability to experiment and create new spells during battle - knowledge and
understanding of magic system are rewarded with real power in-game</li>
<li>ability to cast random/unexpected spells by mistake</li>
<li>endless ways to kill yourself by accident</li>
</ul>
<p>Magicka features one of the best dynamic magic systems so far and I fully
recommend studying it, especially with friends. However, it's still button
based. Is there no other way?</p>
<h2>Godlike Invocation</h2>
<p>One-of-a-kind god simulator <strong>Black & White</strong> (B&W) from ancient year 2001 is the
first game where I encountered <strong>gesture recognition</strong>. It allowed players to
invoke miracles using gesture drawing with a simple one gesture per miracle
mapping:</p>
<video class="video-js vjs-big-play-centered" controls="" data-setup="{}" height="480" loop="" poster="/videos/invocation_black_and_white_poster.jpg" width="720">
<source src="/videos/invocation_black_and_white.mp4" type="video/mp4"/>
</video>
<p>In other words players <strong>draw</strong> gestures on-screen using mouse in real time to
be recognized (or not) by the game and cast associated miracles. Technically
buttons are still involved to start and end drawing but it's the trajectory
of the mouse that selects particular miracle.</p>
<h2>Arch Invocation</h2>
<p>In the following year 2002, our world was blessed with <a href="https://store.steampowered.com/app/1700/Arx_Fatalis/">Arx
Fatalis</a> the RPG
featuring the most original and interesting magic system I ever witnessed. As
a testimony to its greatness, the community created a cross-platform open source
port <a href="https://arx-libertatis.org/">Arx Libertatis</a> which still works on modern
systems so people can play it even after two decades.</p>
<p>Like B&W, Arx uses <strong>gesture recognition</strong> system to cast spells but on top of
that each spell is composed of multiple runes in specific sequence. There is
a predefined set of <a href="https://wiki.arx-libertatis.org/Spells">spells</a> invoked by
<strong>drawing</strong> corresponding
<a href="https://wiki.arx-libertatis.org/Category:Runes">runes</a> in correct order:</p>
<video class="video-js vjs-big-play-centered" controls="" data-setup="{}" height="480" id="arx-video" loop="" poster="/videos/invocation_arx_poster.jpg" width="720">
<source src="/videos/invocation_arx.mp4" type="video/mp4"/>
</video>
<p>Each rune has few things associated with it:</p>
<ul>
<li>shape: <img alt="Yok" class="invert-on-black" src="/images/rune_yok.png"/></li>
<li>name: Yok</li>
<li>meaning: fire</li>
</ul>
<p>Knowing rune shapes is neccessary for casting spells and knowing rune meanings helps
with remembering correct rune sequences for individual spells. We'll look at meaning
and magic languages in future post, for now let's focus on the <strong>drawing as
a means of input</strong>.</p>
<h1>Words of Power Invocation</h1>
<p>In <a href="https://texnoforge.dev/p/words-of-power/">Words of Power</a> I'm
implementing state-of-the-art magic invocation system based on symbol drawing
not unlike Arx Fatalis but with some notable differences/improvements to
address limitations and frustrations of existing systems.</p>
<p>Words of Power currently use a generic probabilty-based model (GMM) to recoginze
drawn symbols with additional machine learning tools under consideration.
By design, the model doesn't care about sequence or speed of drawing, it's only the
<strong>resulting symbol shape</strong> that matters unlike Arx/B&W with gesture-based
approach. I believe my symbol-based approach should lead to a more comfortable experience closer
to real world handwriting/drawing including more individuality as opposed to
enforcing a specific way and speed of drawing. Furthermore, I allow symbols to
be composed of multiple curves which permits representation of a wider range of
symbols.</p>
<p>I need to finish in-game symbol and alphabet editor before spending time on
presentation but let me at least tease you with current version of TexnoMagic
Invoker prototype which is in charge of recording and rendering user drawings:</p>
<video class="video-js vjs-big-play-centered" controls="" data-setup="{}" height="480" id="WoPI-video" loop="" poster="/videos/invocation_words_of_power_poster.jpg" width="720">
<source src="/videos/invocation_words_of_power.mp4" type="video/mp4"/>
</video>
<p>I fully intend to include tools I use to draw symbols in-game and empower
players to create and share entire magic alphabets of their own, be it
existing favorites or entirely new creations. This makes the development much
more demanding but why settle with a single hardcoded alphabet when you can
have as many as someone is willing to create and share through steam workshop
and other means?</p>
<p>Aside from being a game, Words of Power will also serve as a creative tool
providing more demanding magic users with means to create functional magic
alphabets by drawing individual symbols and training models to recognize them.
Creating new symbols, words, alphabets, and languages is <strong>fun</strong> and Words of Power
will allow a lot of that with an added bonus of shedding some light on the magic
of symbol recognition/machine learning for those who care.</p>
<p><link href="https://vjs.zencdn.net/7.8.4/video-js.css" rel="stylesheet"/></p>
<script src="https://vjs.zencdn.net/7.8.4/video.js"></script>
<p><br/></p>
<p>I hope the next log is going to be about groundbreaking progress on the
symbol editor, see you next time!</p>
<p><br/></p>
<p>Next log: <a href="/n/words-of-power-devlog-3-lessons-from-prototype-mk1/">#3: Lessons from Prototype MK1</a></p>
<p><a href="/p/words-of-power/">Words of Power</a></p>Words of Power devlog #1: Theory of Magic2020-09-20T04:20:00+02:002020-09-20T04:20:00+02:00voice of texnoforgetag:texnoforge.dev,2020-09-20:/n/words-of-power-devlog-1-theory-of-magic/<p>Welcome to the first ever texnoforge devlog about magic system in our upcoming
game <a href="/p/words-of-power/">Words of Power</a> which is focused on
spellcasting and interactive invocation of magic using hand-drawn symbols. </p>
<p>This post describes high level concepts of proposed magic system such as
symbols, words, alphabets and sentences without going into …</p><p>Welcome to the first ever texnoforge devlog about magic system in our upcoming
game <a href="/p/words-of-power/">Words of Power</a> which is focused on
spellcasting and interactive invocation of magic using hand-drawn symbols. </p>
<p>This post describes high level concepts of proposed magic system such as
symbols, words, alphabets and sentences without going into detail
about technical implementation.</p>
<h2>Basis of Magic</h2>
<p>Let's start by the most well-known of Arthur C. Clarke's three laws:</p>
<p><em>"Any sufficiently advanced technology is indistinguishable from magic."</em></p>
<p>I'll go a little bit further and state that magic is, in fact, a technology not
understood by the observer. To many, today's computers are magic in this sense
and thus modern videogaming systems are magical systems that can be used
to simulate magic. </p>
<p>One doesn't need to understand magic in order to use it, but one needs to
understand magic in order to create it.</p>
<p>I want to create state of the art magic system so I need to understand both
the underlying computer magic and the magic system itself. I try to describe
its core concepts here in order to gain better understanding of what exactly
I'm creating.</p>
<h2>Symbol</h2>
<p>Wikipedia defines <a href="https://en.wikipedia.org/wiki/Symbol">symbol</a> as follows:</p>
<p><em>"A symbol is a mark, sign, or word that indicates, signifies, or is understood
as representing an idea, object, or relationship."</em></p>
<p><em>"All communication (and data processing) is achieved through the use of
symbols. Symbols take the form of words, sounds, gestures, ideas, or visual
images and are used to convey other ideas and beliefs."</em></p>
<p>Symbol is indeed a very basic, universal, and powerful concept. In Words of
Power, symbols are the basic atomic elemnts of the magic system and take form
of visual images much like symbols of latin alphabet used to transfer this
text into your brain.</p>
<p>Here's a few examples of symbols:</p>
<div class="symbol-list">
A
速
☢
🗲
<img class="invert-on-black" src="/images/rune_yok.png"/>
</div>
<h3>Symbol Drawing</h3>
<p>In practice, a single symbol can have many different representations, for
example see following drawings of letter A in various fonts:</p>
<p><img class="invert-on-black" src="/images/symbol_drawings.png"/></p>
<p>This is especially important in Words of Power where symbols are drawn
by user's hand and the system must be able to recognize various drawings of
symbols by different individuals.</p>
<h3>Symbol Model</h3>
<p>Symbol model is a model that represents all possible drawings of a symbol and
it can be used to recognize drawings that refer to a particualr symbol.</p>
<p>In current implementation, I use many drawings of a symbol to train Gaussian
Mixture Model which is able to determine a probabily of a particular point
belonging to a symbol. Basically, I describe symbols as probability
distributions in space using multiple 3D gaussian curves.</p>
<p>This works surprisingly well for a relatively simple approach, but models can
be changed as needed. It's likely Words of Power will support multiple
different models for symbols in the end to accomodate various kinds of
symbols.</p>
<h3>Symbol Name</h3>
<p>For convenience, each symbol has a unique name in english alphabet. Symbol
names (which are symbols themselves) make it easier to refer to individual
symbols.</p>
<table class="symbol-table">
<tr><td>A</td><td>A</td></tr>
<tr><td> 速 </td><td> haya </td></tr>
<tr><td> ☢ </td><td> radiocative </td></tr>
<tr><td> 🗲 </td><td> lightning </td></tr>
<tr><td> <img class="invert-on-black" src="/images/rune_yok.png"/> </td><td> yok </td></tr>
</table>
<h2>Word</h2>
<p>Let's refer to Wikipedia once more for a definition of the word
<a href="https://en.wikipedia.org/wiki/Word">word</a>:</p>
<p><em>"In linguistics, a word of a spoken language can be defined as the smallest
sequence of phonemes that can be uttered in isolation with objective or
practical meaning. For many languages, words also correspond to sequences of
graphemes ("letters") in their standard writing systems that are delimited by
spaces wider than the normal inter-letter space, or by other graphical
conventions."</em></p>
<p>In written form, words in latin-based alphabets are usually composed of
multiple letters and individual letters don't carry particular
meaning (such as letter E).</p>
<p>I decided such complexity is unnecessary in my magic system and thus magic
words will be composed of exactly one symbol.</p>
<p>In Words of Power, <strong>words are symbols</strong> and <strong>symbols are words</strong>.</p>
<h3>Word Meaning</h3>
<p>Each word/symbol is supposed to be associated with certain meaning/concept and
its effect in spells should be consistent with its meaning.</p>
<p>For example, Yok rune from Arx Fatalis means "fire" and it's always used to
create fire spells:</p>
<p><img alt="Yok" class="invert-on-black" src="/images/rune_yok.png"/></p>
<h2>Alphabet</h2>
<p>Alphabet is a set of symbols.</p>
<p>Words of Power aim to support multiple different magic alphabets and even
creation of new ones from user drawings.</p>
<p>An example of <a href="https://wiki.arx-libertatis.org/Category:Runes">rune alphabet</a>
from Arx Fatalis:</p>
<p><img class="invert-on-black" src="/images/alphabet_arx.png"/></p>
<h2>Spell</h2>
<p>Spell is a specific sequence of words (a setnence) with associated effects.</p>
<p>A valid sequence of words will result in a spell with effects determined by
meanings of words used.</p>
<p>An example of <a href="https://wiki.arx-libertatis.org/Fireball">fireball spell</a> from
Arx Fatalis:</p>
<p><img alt="Aam Yok Taar" class="invert-on-black" src="/images/spell_fireball.png"/></p>
<p>(create fire missile)</p>
<h2>Language</h2>
<p>Magic language is a set of spells.</p>
<p>In simplest form, magic language could be a mapping of words sequences to
individual spells, but I plan to use the power of today's linguistic tools
so in Words of Power, magic language will be defined by a grammar. I plan to
use Parsing Expression Grammar
(<a href="https://en.wikipedia.org/wiki/Parsing_expression_grammar">PEG</a>) or similar
to formally describe flexible, dynamic, and consistent magic language.</p>
<p>I also plan to support multiple magical languages and I'd like them to be
usable across different magic alphabets if possible.</p>
<p><br/></p>
<p>Next log: <a href="/n/words-of-power-devlog-2-invocation-of-magic/">#2: Invocation of Magic</a></p>
<p><a href="/p/words-of-power/">Words of Power</a></p>first year of texnoforge 🎂2020-07-23T04:20:00+02:002020-07-23T04:20:00+02:00voice of texnoforgetag:texnoforge.dev,2020-07-23:/n/first-year-of-texnoforge/<p><img src="/images/achievement_one_year.png"></p>
<p><strong>texnoforge</strong> completed one full orbit around the central star ᕕ( ᐛ )ᕗ</p>
<h2>first projects announced!</h2>
<p>Please see the new <strong><a href="/p/projects/">projects page</a></strong> as we finally
<strong>announce first 3 official texnoforge <a href="/p/projects/">projects</a></strong>!</p>
<p>Expect us to update projects with more information as we work on them and
hopefully some blog posts focused on …</p><p><img src="/images/achievement_one_year.png"/></p>
<p><strong>texnoforge</strong> completed one full orbit around the central star ᕕ( ᐛ )ᕗ</p>
<h2>first projects announced!</h2>
<p>Please see the new <strong><a href="/p/projects/">projects page</a></strong> as we finally
<strong>announce first 3 official texnoforge <a href="/p/projects/">projects</a></strong>!</p>
<p>Expect us to update projects with more information as we work on them and
hopefully some blog posts focused on specific problems/techs we encounter on the
road towards technological enlightenment.</p>
<h2>wheels of progress cannot be stopped</h2>
<p>Since the beginning of time until year 2018, there was no <em>texnoforge</em>. The
symbol <em>texnoforge</em> meant nothing as there were no thoughts associated with
it.</p>
<p>Today, <strong>texnoforge exists</strong> as a:</p>
<ul>
<li>company</li>
<li>entity</li>
<li>project</li>
<li>website</li>
<li>symbol with associations in human minds</li>
</ul>
<p>As a company, we didn't generate any profit but that wasn't our goal for this
cycle. Instead, we've summoned <em>texnoforge</em> into existence from
t͙̝͍͖h͓̣̣̻̬e̸͓̫͓̪͉ͤ͒̾͆͊̔̔ ͍͈̘ͪ̓͞v̵͔͚̯͔̘͉̏̐̐ͥo̐i̢̼̳͍̤͕̻̋͆ď̞̯͎̤̒͋̑̂
and empirically proven that its existence is not only possible, but
sustainable regardless of harsh realities of global financial system.</p>
<p>I reckon we surpassed minimum requirements for survival by quite a bit as
I meet friends who proudly wear our limited edition texnoforge t-shirts and
they indeed <em>know</em> that <em>texnoforge exists</em> and even what it <em>is</em> to some
degree. The number of people who already know and support us is surprisingly
high given the fact we created nothing extraordinary yet. </p>
<p>We're slowly accelerating towards our goals as we learn new technologies -
progress is undeniable and our speed only increases with time as we gain
skill. It's entirely within our grasp to produce something
<strong>extraordinary</strong> eventually and we're not really in a hurry. On the
contrary, great things take time and passion and we currenlty posses both.</p>
<h2>year two plans</h2>
<ul>
<li>continue doing what we're doing :)</li>
<li>find artists to make great art with - <a href="/p/texnoart/">TexnoArt</a>
project</li>
<li>make demos for you to play with</li>
<li>get closer to steam releases</li>
<li>create new FAQ page to answer various questions about texnoforge</li>
</ul>status update: FULL UNREAL mode engaged2020-05-22T04:20:00+02:002020-05-22T04:20:00+02:00voice of texnoforgetag:texnoforge.dev,2020-05-22:/n/full-unreal/<h4>good news, everyone!</h4>
<p>After a much needed break from corporate exploitation and
work in general, <strong>texnoforge</strong> has gone <strong>FULL UNREAL</strong>!</p>
<p>We've been occasionally playing with Unreal Engine past year and we hit no
critical issues. We also ran out of good videogames to play so now we're
developing our own …</p><h4>good news, everyone!</h4>
<p>After a much needed break from corporate exploitation and
work in general, <strong>texnoforge</strong> has gone <strong>FULL UNREAL</strong>!</p>
<p>We've been occasionally playing with Unreal Engine past year and we hit no
critical issues. We also ran out of good videogames to play so now we're
developing our own games in Unreal Engine on a daily basis ᕕ( ᐛ )ᕗ </p>
<h2>new stage of history & new skills page</h2>
<p>Our Unreal Engine knowledge and <a href="/p/skills/">skills</a> are approaching a level where
we can help with real game development and accept first texnoforge contracts.</p>
<p>I've updated the <a href="/p/status/">status</a> to reflect this and also
created a brand new <a href="/p/skills/">skills</a> page which attemps to visualize our software
skill tree in order to make it easier for others to decide whether we can
help them or not. It's incomplete yet but I'm happy with the first iteration.</p>
<h2>future is now!</h2>
<p>In the near future I plan to add similar chart for our Unreal and game
development skills too in order to make the <a href="/p/skills/">skills</a> page a definitive
reference to our abilities and problems we're able to help with efficiently.</p>
<p>Aside from funding our existence and honing our unreal skills, we're also
interested in artistic kind of interactions. I'm afraid we're much better
engineers than we are artists but videogames are art so we need to
establish cooperation with the right artists in order to succeed. I need to
make our desire to create great works of art with others explicit, probably
on a new <strong>art</strong> page.</p>
<h2>prototypes</h2>
<p>We're finally getting to play with some interesting game systems so expect
blog posts about our prototypes appearing increasingly more often. Here, have
a sneak peak.</p>
<p>This is a screenshot from <strong>fire of texnoforge</strong>'s mysterious prototype which I'm
not gonna spoil. What exactly is in the picture is left as an excercise to the
dear reader.</p>
<div class="figure"><img class="image-process-article-image" src="/images/derivatives/article-image/pt_circular_files.png"/></div>
<p>Here you can witness primitive huts I modelled in Blender being randomly
placed on procedurally generated voxel terrain: </p>
<div class="figure"><img class="image-process-article-image" src="/images/derivatives/article-image/pt_buildings.png"/></div>Voxel Planet tech demo ᕕ( ᐛ )ᕗ2020-03-12T04:20:00+01:002020-03-12T04:20:00+01:00voice of texnoforgetag:texnoforge.dev,2020-03-12:/n/voxel-planet-unreal-tech-demo/<p>Behold first texnoforge planetary tech demo!</p>
<iframe width="750" height="422" src="https://www.youtube-nocookie.com/embed/VYTo_RCIkkM" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>In 1998 a very special videogame was released called <strong>Populous: The
Beginning</strong> (Populous 3). It's one of very few god videogames ever created
(wikipedia only lists
<a href="https://en.wikipedia.org/wiki/List_of_god_video_games">42</a>)
and it's also one of first games to feature dynamic 3D spherical maps -
planets. As if that …</p><p>Behold first texnoforge planetary tech demo!</p>
<iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="422" src="https://www.youtube-nocookie.com/embed/VYTo_RCIkkM" width="750"></iframe>
<p>In 1998 a very special videogame was released called <strong>Populous: The
Beginning</strong> (Populous 3). It's one of very few god videogames ever created
(wikipedia only lists
<a href="https://en.wikipedia.org/wiki/List_of_god_video_games">42</a>)
and it's also one of first games to feature dynamic 3D spherical maps -
planets. As if that wasn‘t revolutionary enough, Populous‘ planets can be
transformed using powerful magic - raise land above water to create bridges
between islands/continents, lower land below water level to drown entire
villages, summon explosive volcanoes, etc. I was really impressed back then and
I‘m still impressed after replaying it in 2020. Even after 22 years of game
development all over the planet, Populous 3 remains unmatched. </p>
<p><img src="/images/populous.png"/></p>
<h2>Planets in Unreal Engine 4</h2>
<p>Even though technology to simulate planets is available for at least two
decades, games that properly utilize spherical worlds are still rare to this
day. I‘d like to lead by example and create games on planets, but
Unreal Engine 4 isn‘t particularly helpful in this regard:</p>
<ul>
<li>AI Navigation susbsystem assumes „up“ is always along Z axis, making it unusable on planets and requiring custom navigation.</li>
<li>Gravity always points down the Z axis which isn‘t the case for planets. There is a free plugin called
<a href="https://www.unrealengine.com/marketplace/en-US/product/directional-planet-gravity">Directional & Planet Gravity</a>
though.</li>
<li>Most skyboxes and various other assets assume flat map and thus are unusable on planets.</li>
</ul>
<p>It‘s much easier to use classic flat map in UE4, but I insist on using planets anyway ¯\_(ツ)_/¯</p>
<h2>Voxels, Math, and Asteroids</h2>
<p>Unreal Engine is built for a workflow where artists create levels by hand and
provides nice tools for doing that, but there is poor to no built-in support
for procedurally generated levels or dynamic modification of terrain.</p>
<p>I want to create pseudo-random planets using math and I want the player to be
able to modify the world in real time. After some research, I decided to use
<a href="https://voxelplugin.com/">Voxel Plugin</a> which allows me to do exactly that and
and more in Unreal Engine without writing everything from scratch myself.</p>
<p>Look how simple it is to create a random planet using Voxel Plugin and
its custom graph language:</p>
<p><img class="image-process-article-image" src="/images/derivatives/article-image/planet_graph.png"/></p>
<p>To test that my voxel planets can be edited in real time, I created a tech demo
with simple voxel planet and an option to bombard the planet with meteors that
create holes after impact in order to measure Voxel Plugin performance. It's
decent even with much larger planets than shown in the demo and I look forward
to more testing in VR.</p>
<h2>texnoforge logo 3D edition</h2>
<p>I also had fun converting texnoforge logo from 2D vectors (SVG) to 3D model
using Blender and then animating that in Unreal Engine.</p>
<p><img src="/images/texnoforge3d.png"/></p>
<p>It took quite some time but I‘m happy with the result and I learned a lot about
Blender and its integration with UE. Blender is an impressive piece of open
source software and I really enjoy using it, especially since version 2.8.</p>
<h2>Conclusion</h2>
<p><img src="/images/its_something.jpg"/></p>best mods for Age of Empires 2: Definitive Edition (aoe2de)2020-01-14T04:20:00+01:002020-01-14T04:20:00+01:00voice of texnoforgetag:texnoforge.dev,2020-01-14:/n/best-aoe2de-mods/<p>We've started 2020 by playing 20 years old Real-Time Strategy which got
significant new (re)release called <strong>Age of Empires 2: Definitive Edition</strong>.</p>
<p>While previous AoE2 HD edition was basically an update for modern systems,
Definitive Edition brings significant and much needed improvements which make
the two-decades-old game more playable …</p><p>We've started 2020 by playing 20 years old Real-Time Strategy which got
significant new (re)release called <strong>Age of Empires 2: Definitive Edition</strong>.</p>
<p>While previous AoE2 HD edition was basically an update for modern systems,
Definitive Edition brings significant and much needed improvements which make
the two-decades-old game more playable and enjoyable, most notably:</p>
<ul>
<li>farms and fish traps can be automatically renewed ᕕ( ᐛ )ᕗ</li>
<li>improved UI shows amounts of villagers assigned to individual resources</li>
<li>improved command, building, and waypoint queues</li>
<li>new AI (daaayum it's good)</li>
<li>new civilizations (35 total)</li>
<li>fabulous updated HD (and even Ultra HD with optional free DLC) graphics
including building destruction simulation</li>
<li>Art of War challenges provide a tool for noobs to to learn and train
game essentials</li>
<li>ranked matchmaking</li>
<li>cross-play (yes, people play AoE2 on xbox :-O)</li>
<li>more quality of life improvements like zoom, grid, research indication,
improved saves & replays, achievements, Empires War mode, ...</li>
<li><strong>integrated mod support</strong></li>
</ul>
<p>The game is really great on its own, but the search for perfection never ends
and there is integrated mod support, so let's talk about few essential mods
that improve the game even further!</p>
<p>All these mods are UI/graphics/sounds utility mods or scenarios that don't
interfere with game data so you can safely use them in online matches
including ranked and they're easily available from the in-game mod browser.</p>
<h2>What did the monk say?</h2>
<p>First and foremost, let's talk about the game's most distincive if not
signature unit - <strong>the monk</strong>.</p>
<p><img src="/images/monk-vs-monk.png"/></p>
<p>I don't think I need to explain what <strong>WOLOLO</strong> means. In fact, it's a top
tier meme that's still strong after two decades and I never quite understood
why AoE 2 replaced the legendary conversion sound with a boring and generic
"holy sound".</p>
<p>Modding community provided fixes for this critical regression in the past like
<a href="https://steamcommunity.com/sharedfiles/filedetails/?id=1364338554">Wololo Monks</a> mod
for AoE2 HD, but Definitive Edition changed sound engine so old sound mods
don't work.</p>
<p>This was the only mod I was really missing to complete my AoE experience so
I wrote it myself and uploaded to the in-game mod browser:</p>
<ul>
<li><a href="https://www.ageofempires.com/mods/details/2888">Full WOLOLO Monks - Definitive AYOOYOYO Edition</a></li>
</ul>
<p>Now you can <strong>WOLOLO</strong> like any self-respecting person would, courtesy of
texnoforge ;)</p>
<h2>Taming the Trees</h2>
<p>The new graphics are nice, but trees are so big they sometimes make selection,
commands, and building placement more difficult than it needs to be.</p>
<p><img src="/images/trees-default.png"/></p>
<h4>There are several options to make trees smaller, pick one:</h4>
<ul>
<li><a href="https://www.ageofempires.com/mods/details/2695">Improved Small Trees</a><br/>
<img class="spacy-vert" src="/images/trees-small.png"/></li>
<li><a href="https://www.ageofempires.com/mods/details/1919">Bamboo Only (Small Trees)</a><br/>
<img class="spacy-vert" src="/images/trees-bamboo.png"/></li>
<li><a href="https://www.ageofempires.com/mods/details/2678">CubeTrees</a><br/>
<img class="spacy-vert" src="/images/trees-cubes.png"/></li>
</ul>
<p>If you happen to actually like CubeTrees, you can convert all resources to
cubes using the infamous
<a href="https://www.ageofempires.com/mods/details/2698">Age of Cubes</a> mod ¯\_(ツ)_/¯</p>
<h2>git gud</h2>
<p>I really like the Art of War series of tutorials/challenges that explain
and let players train essential aspects of the game. If you'd like to improve
your opening and individual build orders even more, there's a great mod
which works much like the Art of War but includes 10 different build
orders to train with A-F rating for you to improve on.
Activate through <em>Game Mode</em> -> <em>Custom Scenario</em>.</p>
<ul>
<li><a href="https://www.ageofempires.com/mods/details/2359">Interactive Build Order Guide</a><br/>
<img class="spacy-top" src="/images/buildorder.png"/></li>
</ul>
<p>You can also train hotkeys to construct various building quickly and reliably,
giving you more time to focus on important things and less rage over
that lumber camp on gold that should've been mining camp.
Activate through <em>Game Mode</em> -> <em>Custom Scenario</em>.</p>
<ul>
<li><a href="https://www.ageofempires.com/mods/details/2015">Hotkey Trainer Buildings</a></li>
</ul>
<p>Unless you remember details of all 35 civs, consider displaying condensed
version of tech tree of your current civ at all times, which is especially
useful when playing random.</p>
<ul>
<li><a href="https://www.ageofempires.com/mods/details/1062">Improved Tech Tree UI Mod</a><br/>
<img class="spacy-top" src="/images/techtree.png"/></li>
</ul>
<h2>Blood for the Blood God</h2>
<p>By default, dead bodies of units disappear quite fast and no skeletons are left
behind in DE. And thus my final reccomendation adds blood to the game which stays for quite
some time. Aside from the obvious visual pleasure of good slaughter, it
provides utility of marking the spots of battle for quite some time. </p>
<ul>
<li><a href="https://www.ageofempires.com/mods/details/1370">Crimson Blood</a><br/>
<img alt="blood for the blood good. skulls for the skull throne." class="spacy-top" src="/images/blood.png"/></li>
</ul>
<h3>Good Luck & Have <a href="https://www.youtube.com/watch?v=0-_T7E360Zo">Fun</a>!</h3>status update: research and chill mode engaged2019-10-29T04:20:00+01:002019-10-29T04:20:00+01:00voice of texnoforgetag:texnoforge.dev,2019-10-29:/n/research-and-chill/<p>Initial <strong>texnoforge boostrap is complete</strong> and we're now entering
<strong>research and chill</strong> mode. Read more about it in the updated and extended
<a href="/p/status/">status page</a>.</p>
<p><img src="/images/vrchat_4.jpg"/></p>
<p>I've also created new <a href="/p/mission/">mission statement</a> to explain where
we're headed in the long run.</p>
<p>Finally, look at these <strong>fabulous screenshots</strong> of us doing all the …</p><p>Initial <strong>texnoforge boostrap is complete</strong> and we're now entering
<strong>research and chill</strong> mode. Read more about it in the updated and extended
<a href="/p/status/">status page</a>.</p>
<p><img src="/images/vrchat_4.jpg"/></p>
<p>I've also created new <a href="/p/mission/">mission statement</a> to explain where
we're headed in the long run.</p>
<p>Finally, look at these <strong>fabulous screenshots</strong> of us doing all the <em>research</em> in VRChat ;)</p>
<div class="figure"><img class="image-process-article-image" src="/images/derivatives/article-image/vrchat_2.jpg"/></div>
<div class="figure"><img class="image-process-article-image" src="/images/derivatives/article-image/vrchat_5.jpg"/></div>
<div class="figure"><img class="image-process-article-image" src="/images/derivatives/article-image/vrchat_6.jpg"/></div>
<div class="figure"><img class="image-process-article-image" src="/images/derivatives/article-image/vrchat_1.jpg"/></div>
<div class="figure"><img class="image-process-article-image" src="/images/derivatives/article-image/vrchat_3.jpg"/></div>virtual interface online2019-08-16T04:20:00+02:002019-08-16T04:20:00+02:00voice of texnoforgetag:texnoforge.dev,2019-08-16:/n/virtual-interface-online/<p><strong>Behold</strong>, the first photo of enigmatic <em>fire of texnoforge</em> interfacing with VR
using Oculus Rift S.</p>
<p><img alt="fire of texnoforge interfacing with VR :)" class="image-process-article-image" src="/images/derivatives/article-image/fire_of_texnoforge.png"/></p>
<p>In the name of science, of course.</p>
<p><img alt="voice of texnoforge interfacing with VR :)" src="/images/voice_of_texnoforge.png"/></p>voice of texnoforge is free yet again ⎝༼ ◕д ◕ ༽⎠2019-08-14T04:20:00+02:002019-08-14T04:20:00+02:00voice of texnoforgetag:texnoforge.dev,2019-08-14:/n/freedom-of-voice/<p>Today I finally ended my full-time work contract after nearly 7 years of being
a corporate asset!</p>
<p>Even though I enjoyed working with and on free and open source software,
I myself wasn't free in any way. My working hours, goals, responsibilities,
individual tasks, and rewards were decided by someone …</p><p>Today I finally ended my full-time work contract after nearly 7 years of being
a corporate asset!</p>
<p>Even though I enjoyed working with and on free and open source software,
I myself wasn't free in any way. My working hours, goals, responsibilities,
individual tasks, and rewards were decided by someone else and this external
management was extremely ineffective compared to me doing whatever I want.
The power of motivation isn't to be underestimated.</p>
<p>In ancient times, I started as a freelancer jumping from project to project
as I pleased/needed and I'm returning to that state of being my own master
after nearly a decade as it seems to be the only state that really suits me.
I'm also fairly certain I value illusion of freedom above illusions of
stability and security and thus from now I'm gonna carve my own path and bear
full consequences of my actions - fruits of success and bitterness of failure.</p>
<p><strong>texnoforge</strong> is the missing artifact I created to channel my craft into this
world in a sustainable way.</p>
<p>I am finally <strong>free</strong> yet again, my spirit is unbreakable, and my <strong>voice</strong>
shall shape</p>
<h2>texnoforge, the Forge of Virtual Worlds</h2>
<p>in order to create that which has never been and find purpose on the way.</p>texnoforge summoning complete!2019-07-23T04:20:00+02:002019-07-23T04:20:00+02:00voice of texnoforgetag:texnoforge.dev,2019-07-23:/n/summoning-complete/<p><strong>texnoforge s.r.o.</strong> is now a state-recognized legal entity ᕕ( ᐛ )ᕗ</p>
<p>It wasn't a pleasant process (as words "state" and "legal" imply), but</p>
<p><img alt="IT'S DONE" src="/images/itsdone.png"/></p>
<p>and to be honest, none of the fetch quests involved were worse than an average
corporate meeting that shoud've been an email. ¯\_(ツ)_ …</p><p><strong>texnoforge s.r.o.</strong> is now a state-recognized legal entity ᕕ( ᐛ )ᕗ</p>
<p>It wasn't a pleasant process (as words "state" and "legal" imply), but</p>
<p><img alt="IT'S DONE" src="/images/itsdone.png"/></p>
<p>and to be honest, none of the fetch quests involved were worse than an average
corporate meeting that shoud've been an email. ¯\_(ツ)_/¯</p>R-R-R-RAGE QUIT2019-07-12T04:20:00+02:002019-07-12T04:20:00+02:00voice of texnoforgetag:texnoforge.dev,2019-07-12:/n/RAGEQUIT/<p>Today, a decision has been made to finally escape the invisible chains of
corporate slavery. The guarantee of a stable corporate pay and benefits
combined with human laziness and greed are too powerful of a drive, almost an
unstoppable force. And it only costs your soul! 8+ hours of meaningless …</p><p>Today, a decision has been made to finally escape the invisible chains of
corporate slavery. The guarantee of a stable corporate pay and benefits
combined with human laziness and greed are too powerful of a drive, almost an
unstoppable force. And it only costs your soul! 8+ hours of meaningless work
a day makes the will to live fade away. But one needs to make a living, right?</p>
<p><strong>Not like this.</strong> Not like a replacable part of a giant machine where value
of an individual converges towards zero. Not like a corporate drone that must be
utilized for maximum profit at all times in the name of profit and nothing
else.</p>
<p>Enough, the time has come! <strong>FINAL RAGE-QUIT PROTOCOL</strong> has been engaged. We now
seek termination of our slave contracts at the earliest opportunity. And after
that...</p>
<p><strong>We will be free.</strong></p>
<p>And so begin the tales of <strong>texnoforge</strong>!</p>
<p><img class="image-process-article-image" src="/images/derivatives/article-image/ragequit.jpg"/></p>texnoforge is being summoned into existence ᕕ(ᐛ)ᕗ2019-07-02T04:20:00+02:002019-07-02T04:20:00+02:00voice of texnoforgetag:texnoforge.dev,2019-07-02:/n/first-emission/<p><strong>Half a year remains</strong> until the official texnoforge launch but The Forge already
projects itself onto the material world! We have basic infrastructure in place
including this humble server on <a href="https://texnoforge.dev">texnoforge.dev</a>
domain and a source control/CI system to host our spectacular creations.</p>
<p>We also started to explore and …</p><p><strong>Half a year remains</strong> until the official texnoforge launch but The Forge already
projects itself onto the material world! We have basic infrastructure in place
including this humble server on <a href="https://texnoforge.dev">texnoforge.dev</a>
domain and a source control/CI system to host our spectacular creations.</p>
<p>We also started to explore and familiarize ourselves with our future tools of
trade - most notably Unreal Engine 4 and its impressive visual blueprint programming
language.</p>
<p>The best way to learn something is to simply do it. And thus we started first
texnoforge prototypes in order to explore the true power of tools we intend to
use to create virtual worlds that never were before.</p>
<p>I started with a simple game about controlling primeval helicopter where
I tackled fundamental Unreal Engine concepts and tools and I'm thoroughly impressed by
the amount of power and flexibility provided out of the box. Blueprints
visual/graph language is almost surprisingly pleasant to use even though I've
been writing code the old school way with vim past decade. It's actually so
good we decided to go full blueprint and only include C++ on demand.</p>
<p>Behold a screenshot!</p>
<p><img class="image-process-article-image" src="/images/derivatives/article-image/ugh_mass.png"/></p>