<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://libriscv.no/blog</id>
    <title>RISC-V sandbox Blog</title>
    <updated>2026-04-08T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://libriscv.no/blog"/>
    <subtitle>RISC-V sandbox Blog</subtitle>
    <icon>https://libriscv.no/img/logo.png</icon>
    <entry>
        <title type="html"><![CDATA[Automatia: Update 5]]></title>
        <id>https://libriscv.no/blog/automatia-5</id>
        <link href="https://libriscv.no/blog/automatia-5"/>
        <updated>2026-04-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[It’s been over 2 months since the last update, and I’ve completely forgotten what I wrote about last time. Apparently it was block entities. Since adding block entities I’ve implemented 3 new blocks that don’t emit a block mesh but instead manage an entity that renders a custom animation. I’ve added a service counter bell, a shopkeeper bell (hanging over doors) and a barbershop pole. You can ring the bells manually by right-clicking, and dialogues can triggers bells too, making them very versatile. It’s starting to feel like I’m making a real game and not just a ton of loosely connected game mechanics.]]></summary>
        <content type="html"><![CDATA[<p>It’s been over 2 months since the last update, and I’ve completely forgotten what I wrote about last time. Apparently it was block entities. Since adding block entities I’ve implemented 3 new blocks that don’t emit a block mesh but instead manage an entity that renders a custom animation. I’ve added a service counter bell, a shopkeeper bell (hanging over doors) and a barbershop pole. You can ring the bells manually by right-clicking, and dialogues can triggers bells too, making them very versatile. It’s starting to feel like I’m making a real game and not just a ton of loosely connected game mechanics.</p>
<p>Which leads us to dialogues, I guess.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dialogues">Dialogues<a href="https://libriscv.no/blog/automatia-5#dialogues" class="hash-link" aria-label="Direct link to Dialogues" title="Direct link to Dialogues" translate="no">​</a></h2>
<p>Early prototype of buying from the shop</p>
<iframe width="100%" style="aspect-ratio:16 / 9" src="https://www.youtube.com/embed/9--ife2HcqY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<p>I’ve implemented support for Drafft 2, a game organizing tool, by implementing a converter in Python. The converter produces various loadable data for my game engine. For example, Drafft 2 supports complex dialogue chains that you create by connecting together visual nodes in Drafft 2. I also added support for some inline hints that produce features specific to my game engine in the text, such as <code>[a:talking]</code> will make an NPC appear like he’s talking. Or <code>{event:std,stdRingCounterBell}</code> will call that function during the dialogue, which then can RPC to the server to do something specific like ringing a counter bell, which can be seen and heard by all nearby players.</p>
<p><img decoding="async" loading="lazy" alt="alt text" src="https://libriscv.no/assets/images/Screenshot%20from%202026-04-07%2021-14-26-71d83062614581c7b0bc30710053a3f7.png" width="3774" height="2128" class="img_ev3q"></p>
<p>A dialogue chain that shows what happens if you keep ringing the bell too much</p>
<p>Beardy will pick up the bell and hold it in his hand for a day. 😆</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">PUBLIC </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">beardyTiredOfTheRinging</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Entity ent</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">vector</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ent</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">EndDialogue</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Game</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">server_rpc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Player</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">auto</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> beardy </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">NPCs</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">Get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"beardy"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   beardy</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">npc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setHeldItemByName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">Item</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">Block</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"counter_bell"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   counterBellWalker</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">remove</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   counterBellRemoved </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token class-name">Game</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">call_next_day</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">double</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token keyword" style="color:#00009f">auto</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> beardy </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">NPCs</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">Get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"beardy"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     beardy</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">npc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setHeldItemByName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">Item</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     counterBellWalker</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">Block</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"counter_bell"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     counterBellRemoved </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>C++ running in a tiny sandbox trivializes game scripting.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gametime">GameTime<a href="https://libriscv.no/blog/automatia-5#gametime" class="hash-link" aria-label="Direct link to GameTime" title="Direct link to GameTime" translate="no">​</a></h2>
<p>I have to write about GameTime, sadly. I originally designed time to tick differently depending on which world you were on, however, I realized that doing that meant that things will eventually behave in a way that surprises everyone (me included). If you imagine a world that has very slow time, and then whether or not that worlds time is frozen when nobody is on it or not (it doesn’t matter), at some point during gameplay you’ll reach year 2 in some world, you’ll go back to this world and it’s still year 1. I don’t like that.</p>
<p>So, I’ve started migrating towards a shared time across all worlds, which marches relentlessly forward at the same speed everywhere. I already have a lore reason in my head, which I will forget in a few days. But then I’ll re-remember it at some point later, and probably add some story behind it.</p>
<p><img decoding="async" loading="lazy" alt="alt text" src="https://libriscv.no/assets/images/Screenshot%20from%202026-04-07%2020-59-42-c8415636939610b2ec9d8276f343800f.png" width="2858" height="1625" class="img_ev3q">
NPC routines give people a schedule. Beardy doesn’t work on Saturdays.</p>
<p>The reason that finally made me make the jump to shared time is that I want to have NPCs that travel between worlds. NPCs have routines that allow me to calculate precisely where they are at any time, so if you restart the server, everyone will be in the right place. This is largely incompatible with having different time on each place. At least if finishing a solo game in human time is the goal.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cutscenes">Cutscenes<a href="https://libriscv.no/blog/automatia-5#cutscenes" class="hash-link" aria-label="Direct link to Cutscenes" title="Direct link to Cutscenes" translate="no">​</a></h2>
<p>Yep. I added support for cutscenes out of nowhere. I decided that I wanted to have a very limited form of cutscene in the game where it’s basically just showcasing a place, the first time you go somewhere. Some games have a lot of cutscenes involving NPCs and storyline, but that’s not my cup of tea. I think the types of cutscenes you’d see in something like SM64 is what I’m going for, with a title on the screen introducing the place.</p>
<p>A basic cutscene I made for the farmers shop.</p>
<iframe width="100%" style="aspect-ratio:16 / 9" src="https://www.youtube.com/embed/iFCiP9WxF48" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="public-builds">Public builds<a href="https://libriscv.no/blog/automatia-5#public-builds" class="hash-link" aria-label="Direct link to Public builds" title="Direct link to Public builds" translate="no">​</a></h2>
<p>There are now public builds of the game at my <a href="https://github.com/fwsGonzo/automatia-releases" target="_blank" rel="noopener noreferrer" class="">automatia-releases repository</a>. If you intend to play it, make sure that you don’t build in any of the “permanent” story worlds: limbo and farms (for now). I’ve recently started packaging those worlds and distributing them, so they will be replaced on each update as I am actively making changes.</p>
<p>Thanks for reading!</p>]]></content>
        <author>
            <name>Alf-André Walla</name>
            <email>fwsgonzo@hotmail.com</email>
            <uri>https://libriscv.no/</uri>
        </author>
        <category label="automatia" term="automatia"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Welcome to the libriscv Blog]]></title>
        <id>https://libriscv.no/blog/welcome</id>
        <link href="https://libriscv.no/blog/welcome"/>
        <updated>2026-04-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Welcome to the libriscv blog! This is where we'll share updates, tutorials, and insights about the RISC-V sandbox.]]></summary>
        <content type="html"><![CDATA[<p>Welcome to the libriscv blog! This is where we'll share updates, tutorials, and insights about the RISC-V sandbox.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-to-expect">What to Expect<a href="https://libriscv.no/blog/welcome#what-to-expect" class="hash-link" aria-label="Direct link to What to Expect" title="Direct link to What to Expect" translate="no">​</a></h2>
<p>In this blog, you'll find:</p>
<ul>
<li class=""><strong>Release announcements</strong> - Updates about new versions and features</li>
<li class=""><strong>Technical deep dives</strong> - Detailed explanations of how libriscv works</li>
<li class=""><strong>Tutorials</strong> - Step-by-step guides for common use cases</li>
<li class=""><strong>Performance tips</strong> - Best practices for optimizing your sandboxed applications</li>
<li class=""><strong>Community highlights</strong> - Showcasing interesting projects built with libriscv</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started">Getting Started<a href="https://libriscv.no/blog/welcome#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>If you're new to libriscv, check out our <a class="" href="https://libriscv.no/docs/intro">documentation</a> to get started. Join our <a href="https://discord.gg/n4GcXr66X5" target="_blank" rel="noopener noreferrer" class="">Discord community</a> to connect with other users and contributors.</p>
<p>Stay tuned for more updates!</p>]]></content>
        <author>
            <name>libriscv Team</name>
            <uri>https://github.com/libriscv/libriscv</uri>
        </author>
        <category label="welcome" term="welcome"/>
        <category label="announcement" term="announcement"/>
    </entry>
</feed>