<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Belén Albeza</title>
  <subtitle>Blog about software development</subtitle>
  <link href="https://belenalbeza.com/rss.xml" rel="self"/>
  <link href="https://belenalbeza.com/"/>
  <updated>2024-10-08T21:18:00Z</updated>
  <id>https://belenalbeza.com/</id>
  <author>
    <name>Belén Albeza</name>
    <email></email>
  </author>
  
  <entry>
    <title>Ludum Dare #56 post-mortem
</title>
    <link href="https://belenalbeza.com/articles/ludum-dare-56-post-mortem/"/>
    <updated>2024-10-08T21:18:00Z</updated>
    <id>https://belenalbeza.com/articles/ludum-dare-56-post-mortem/</id>
    <content type="html">&lt;p&gt;Last weekend I participated in &lt;a href=&quot;https://ldjam.com/&quot;&gt;Ludum Dare&lt;/a&gt;, my favorite game jam. As always, I opted for the &lt;em&gt;Compo&lt;/em&gt; category, which consists in making a game solo in 48 hours. The theme for this edition was &amp;quot;tiny creatures&amp;quot;.&lt;/p&gt;
&lt;p&gt;You can &lt;a href=&quot;https://ladybenko.itch.io/kokins&quot;&gt;play the game in your browser from my itch.io page&lt;/a&gt;, and that might be helpful to put this post-mortem into context.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ladybenko.itch.io/kokins&quot;&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-56-post-mortem/kokins-gameplay-screenshot.png&quot; alt=&quot;Kokins gameplay screenshot&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Development log&lt;/h2&gt;
&lt;h3&gt;Saturday&lt;/h3&gt;
&lt;p&gt;I started by making a mind map to brainstorm game ideas.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-56-post-mortem/kokins-mindmap.jpeg&quot; alt=&quot;Mindmap for &amp;quot;Tiny Creatures&amp;quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I opted for a &lt;strong&gt;virtual pet&lt;/strong&gt; game and pay homage to Tamagotchi, one of my favorite toys from my childhood.&lt;/p&gt;
&lt;p&gt;In retrospective, I should have made sketches of the UI, think about which attributes I&#39;d like to implement, how the pet would evolve, but… I just went ahead and drew a hatching egg animation in PICO-8&#39;s sprite editor, and a square with two dots as the &amp;quot;pet&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-56-post-mortem/egg.gif&quot; alt=&quot;Hatching of a kokin egg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Then I went on coding a calendar, a few actions, stats and the main core cycle of &amp;quot;selecting an action&amp;quot; → &amp;quot;modify stat&amp;quot; → &amp;quot;tick time&amp;quot;. And I called it a day and went to sleep at a reasonable hour.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-56-post-mortem/saturday-eod.gif&quot; alt=&quot;Game by Saturday night&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Sunday&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;A lot&lt;/em&gt; of basic features were missing, but at the start of the day I made a list of my must-haves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pet death&lt;/li&gt;
&lt;li&gt;A simple mini-game for executing an action&lt;/li&gt;
&lt;li&gt;Pet evolution depending on the stats&lt;/li&gt;
&lt;li&gt;Some sort of &amp;quot;end game&amp;quot; beyond keeping your pet alive… I ended up with an idea of showing a gallery of the different pets you could collect, kind of like a card album.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the mini game, I implemented a simple reflex-based game. Depending on your results, you will get a boost or a debuff to your chosen action.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-56-post-mortem/minigame.png&quot; alt=&quot;Minigame for every action&quot; /&gt;&lt;/p&gt;
&lt;p&gt;As for pet evolution, I definitely needed more stats beyond the two initial ones. I ended up with eight, and I kept tweaking them during the whole day. I still don&#39;t feel satisfied with the balance, but it&#39;s very tricky to nail this in an afternoon. I would have wanted two distinct &amp;quot;evolution branching&amp;quot; events, but ended up with just one. At least I found the sprites adorable.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-56-post-mortem/sprites.png&quot; alt=&quot;Pet sprites&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The last thing I implemented was the &amp;quot;reserve&amp;quot;, aka the album. I did a trick of being able to collect female and male versions of every pet type, so it didn&#39;t look so empty &lt;em&gt;and&lt;/em&gt; players would have an incentive to try to figure out what stats exactly made the pet turn out like it did.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-56-post-mortem/reserve.png&quot; alt=&quot;The kokin reserve&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I had only a couple of hours left till the end of the jam, but I decided to &lt;em&gt;not&lt;/em&gt; try to pull out a background music track and submit that version already, since I was tired.&lt;/p&gt;
&lt;h2&gt;Lessons learned&lt;/h2&gt;
&lt;h3&gt;What went well?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Booking PTO for the following Monday and take it easy during the jam.&lt;/li&gt;
&lt;li&gt;The cute sprites for the pet and egg were a source of motivation.&lt;/li&gt;
&lt;li&gt;Publishing a build by the end of Saturday so people could check the game out already.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What went wrong?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Making assets &lt;em&gt;before&lt;/em&gt; coding the features.&lt;/li&gt;
&lt;li&gt;Balancing stats was very tricky. I should have set up a spreadsheet or something of the like in advance to help me balance everything.&lt;/li&gt;
&lt;li&gt;Introducing new pet stats on the fly.&lt;/li&gt;
&lt;li&gt;Leaving audio till the very end.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Tools&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lexaloffle.com/pico-8.php&quot;&gt;PICO-8&lt;/a&gt; as the game engine.&lt;/li&gt;
&lt;li&gt;Pen &amp;amp; paper&lt;/li&gt;
&lt;li&gt;Git for version control and back up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&#39;s it. I&#39;m quite happy with PICO-8 because it features all the tools I need to make a game, like a sprite and SFX editor. I wish the code editor was better, though, and/or had vim shortcuts.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>PICO Payun post mortem
</title>
    <link href="https://belenalbeza.com/articles/pico-payun-postmortem/"/>
    <updated>2023-07-18T18:30:00Z</updated>
    <id>https://belenalbeza.com/articles/pico-payun-postmortem/</id>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://ladybenko.itch.io/pico-payun&quot;&gt;PICO Payun&lt;/a&gt; is a small, retro &lt;strong&gt;shoot&#39;em up game&lt;/strong&gt; I made with &lt;a href=&quot;https://belenalbeza.com/articles/discovering-pico-8/&quot;&gt;PICO-8&lt;/a&gt;. This article is a &lt;strong&gt;post mortem&lt;/strong&gt; of the development, so I&#39;d recommend you &lt;a href=&quot;https://ladybenko.itch.io/pico-payun&quot;&gt;play the game first&lt;/a&gt; (you can do it directly in your browser).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/pico-payun-postmortem/pico-payun.png&quot; alt=&quot;A level of PICO Payun&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Scope of the project&lt;/h2&gt;
&lt;p&gt;The idea for the game came up due to &lt;a href=&quot;https://www.youtube.com/playlist?list=PLea8cjCua_P3Sfq4XJqNVbd1vsWnh7LZd&quot;&gt;this tutorial series&lt;/a&gt;. While I quickly diverged in the codebase it is a good tutorial in terms of &lt;em&gt;which features&lt;/em&gt; to implement. It also put a lot of emphasis in &lt;strong&gt;visual effects&lt;/strong&gt; and feedback to the user (a concept often referred as &lt;em&gt;juiciness&lt;/em&gt; in game design), which is something I never put too much attention in PICO-8. So I decided to take the gist of each video, implement it my way, and add / remove stuff as I saw fit.&lt;/p&gt;
&lt;p&gt;In the end, PICO Payun &lt;strong&gt;features&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;8 different levels (including two boss battles)&lt;/li&gt;
&lt;li&gt;2 weapons (1 main weapon and 1 special attack)&lt;/li&gt;
&lt;li&gt;Pickable power-up&#39;s.&lt;/li&gt;
&lt;li&gt;6 different enemies, each with a unique attack.&lt;/li&gt;
&lt;li&gt;Background music.&lt;/li&gt;
&lt;li&gt;Score.&lt;/li&gt;
&lt;li&gt;Loads of visual effects (explosions, sparks, shooting muzzles, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&#39;re not familiar with PICO-8, it&#39;s a &amp;quot;fantasy console&amp;quot; with limitations that force you to think out of the box &lt;em&gt;and&lt;/em&gt; keep your games small. The most relevant restrictions are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Palette of 16 colors (including 1 transparent color)&lt;/li&gt;
&lt;li&gt;128x128 pixels display&lt;/li&gt;
&lt;li&gt;8192 source code tokens (for instance, a variable name is a token, special characters like &lt;code&gt;(&lt;/code&gt; or &lt;code&gt;=&lt;/code&gt; are tokens too)&lt;/li&gt;
&lt;li&gt;Limited memory for storing graphics (bank of 128 8x8 sprites)&lt;/li&gt;
&lt;li&gt;4 channels of audio&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Code&lt;/h3&gt;
&lt;p&gt;Nothing too complicated in this regard. Half of the codebase relates to the enemies and levels, and the code ended up being quite messy until I started to put some &amp;quot;order&amp;quot; in the new stuff I was implementing (I did not refactor previous code).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It turns out PICO-8 has &lt;strong&gt;coroutines&lt;/strong&gt;! They are amazing to implement sequences. I used them to implement the cinematic sequence when you finish the game and the ship moves on its own.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The final &lt;strong&gt;boss&lt;/strong&gt; is implemented with an actual &lt;strong&gt;finite state machine&lt;/strong&gt;, since it has a few attack patterns, plus the transitions between them, &lt;em&gt;plus&lt;/em&gt; its destroy sequence. The other enemies&#39; attacks are also FSM but they are not implemented cleanly that way, and it&#39;s painful to see (luckily I didn&#39;t need to modify existing behavior because enemies worked well).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Collisions&lt;/strong&gt; are implemented with rectangular and circle bounding boxes. It&#39;s a quick system and enough for this game. Of course, the size of the bounding boxes are tweaked so the player feels that they&#39;re &amp;quot;fair&amp;quot;. For instance, the one for the ship is very small, so enemies clearly need to hit the player&#39;s ship in order to damage it. However, power-up&#39;s have a large bounding box so it&#39;s easy to pick them up.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In total, the codebase takes 7300+ tokens, which is near the limit of PICO-8&#39;s 8192 tokens. I didn&#39;t optimize for this and have a lot of auxiliary functions that make the code more readable, but with more tokens.&lt;/p&gt;
&lt;h2&gt;Development&lt;/h2&gt;
&lt;p&gt;The game was implemented over a span of &lt;strong&gt;~2 months&lt;/strong&gt;. I didn&#39;t work on it every day, and when I was up to the task it was usually in small chunks of time (20-60 mins at a time).&lt;/p&gt;
&lt;p&gt;I ended up consuming most of the tokens and a lot of the space in the sprite banks (but I didn&#39;t bother to optimize for any of this, so I guess I could have added a few more enemies, power-up&#39;s or weapons…)&lt;/p&gt;
&lt;p&gt;I tweeted the whole process (you can follow the thread here), which was good for morale and also for getting feedback. I even published a playable release at the middle of the development for people to try out! I got good feedback (and bugs!) and the game was definitely fun to play, so that gave me the energy to push forward and finish.&lt;/p&gt;
&lt;h3&gt;Art&lt;/h3&gt;
&lt;p&gt;I wanted the game to be cute and colorful. This can get tricky with PICO-8&#39;s small color palette, but I think I ended up achieving it.&lt;/p&gt;
&lt;p&gt;Most of the &lt;strong&gt;animations are just 2 or 3 frames&lt;/strong&gt; long. For instance, the main ship is just a 3-frame 8x8 sprite (one frame for staying still, and then two different ones for each direction). The animation for the engine thrust is a separate sprite, and keeping it separate gives the illusion of a more complex sprite.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/pico-payun-postmortem/ship-spritesheet.png&quot; alt=&quot;Spritesheet for the player&#39;s ship&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/pico-payun-postmortem/ship.gif&quot; alt=&quot;Animated ship&quot; /&gt;&lt;/p&gt;
&lt;p&gt;For the &lt;strong&gt;enemies&lt;/strong&gt; I chose them to be &amp;quot;organic&amp;quot;, kind of like alien monsters. That helped to be cohesive and to differentiate them from the player&#39;s ship —which is &amp;quot;mechanic&amp;quot;.&lt;/p&gt;
&lt;p&gt;All of the enemies —including the bosses— feature a 2-frame animation that is a &lt;a href=&quot;https://en.wikipedia.org/wiki/Squash_and_stretch&quot;&gt;squash and stretch&lt;/a&gt;. They shrink and squash agains a virtual surface, and then they &amp;quot;rebound&amp;quot; and stretch to their original size. Again, this helps with coherence (and also with production!). It&#39;s seen most clearly with the slime alien:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/pico-payun-postmortem/slime.gif&quot; alt=&quot;Slime alien&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Most special &lt;strong&gt;visual effects&lt;/strong&gt; are based on drawing filled or unfilled circles. There&#39;s a primitive (due to the fact that PICO-8 doesn&#39;t allow for transparency or blending mode) &lt;strong&gt;particle system&lt;/strong&gt; in place, that is used for explosions, weapons, etc. Example:&lt;/p&gt;
&lt;video controls=&quot;&quot; width=&quot;512&quot;&gt;
  &lt;source src=&quot;https://belenalbeza.com/articles/pico-payun-postmortem/pico-payun-missile.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&gt;
&lt;h3&gt;Audio&lt;/h3&gt;
&lt;p&gt;Sound effects are core to this &amp;quot;juiciness&amp;quot; we were referring to, and the game features different sound effects for shooting, impacts, pick-up&#39;s, etc.&lt;/p&gt;
&lt;p&gt;The most lacking aspect is &lt;strong&gt;background music&lt;/strong&gt;, in which I struggled a lot to compose something that made sense and that did not occupy all the audio channels (PICO-8 only has 4) to leave space for the sound effects to be played.&lt;/p&gt;
&lt;p&gt;The main track for the game ended up more cheerful that I intented, but I didn&#39;t want to spend a lot of time on this task, so I went with it anyway.&lt;/p&gt;
&lt;video controls=&quot;&quot; width=&quot;512&quot;&gt;
  &lt;source src=&quot;https://belenalbeza.com/articles/pico-payun-postmortem/pico-payun-bgm.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&gt;
&lt;h2&gt;Lessons learned&lt;/h2&gt;
&lt;h3&gt;What went well&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Project is &lt;strong&gt;finished&lt;/strong&gt; and didn&#39;t took ages!&lt;/li&gt;
&lt;li&gt;The game is quite &lt;strong&gt;polished&lt;/strong&gt;, specially in terms of audio and visual feedback given to the player.&lt;/li&gt;
&lt;li&gt;It was a &lt;strong&gt;stress-free&lt;/strong&gt; process, since it was done in very small chunks of time and I didn&#39;t have a deadline looming in the air.&lt;/li&gt;
&lt;li&gt;I was able to &lt;strong&gt;limit the scope&lt;/strong&gt; —specially given there was no deadline— so the game could be released.&lt;/li&gt;
&lt;li&gt;PICO-8 limitations in terms of &lt;strong&gt;graphics&lt;/strong&gt; (palette, sprite bank size, etc.) actually helped me a lot in achieving a balance between art that was &amp;quot;good enough&amp;quot; and time spent on it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What went wrong&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;code for enemy behavior&lt;/strong&gt; is a mess. I was very, very lucky I didn&#39;t have to modify it significantly out of feedback from players.&lt;/li&gt;
&lt;li&gt;Near the end of the project I took a few weeks&#39; break and then I felt &lt;strong&gt;unmotivated&lt;/strong&gt; to actually take it up again and finish it. Breaks are fine, but I should have made myself easier to return to the project, like a list of what was actually left (very little!) and notes on what to do next exactly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;To try next time&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Have an actual &lt;strong&gt;list of tasks&lt;/strong&gt;, even if the project is small (I usually keep one, but didn&#39;t for this project)&lt;/li&gt;
&lt;li&gt;Keep using PICO-8 for small games and prototypes. Jump to a fully-featured engine like Godot for more feature-packed projects.&lt;/li&gt;
&lt;li&gt;Put a bit more emphasis in code readability, even if it&#39;s just a small Lua game.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Talk – Learning Superpowers: Leveraging Obsidian for technical learning
</title>
    <link href="https://belenalbeza.com/articles/talk-learning-superpowers/"/>
    <updated>2023-05-31T18:00:00Z</updated>
    <id>https://belenalbeza.com/articles/talk-learning-superpowers/</id>
    <content type="html">&lt;p&gt;It&#39;s been many years since I presented on staged, so it&#39;s nice to be back and this time in my home town. Thanks to the nice people of the &lt;a href=&quot;https://www.meetup.com/es-ES/alicante-frontend/&quot;&gt;Alicante Frontend meetup&lt;/a&gt; for inviting me to speak.&lt;/p&gt;
&lt;p&gt;In the talk, I show how I&#39;ve been using Obsidian to aid my technical learning and build reference material. It has a companion &lt;a href=&quot;https://github.com/belen-albeza/obsidian-starter-vault&quot;&gt;Github repository with an starter vault&lt;/a&gt; to get you up and running.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://belenalbeza.com/articles/talk-learning-superpowers/learning-superpowers.pdf&quot;&gt;Download the slides&lt;/a&gt; here.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Leaving Mozilla
</title>
    <link href="https://belenalbeza.com/articles/leaving-mozilla/"/>
    <updated>2021-09-14T09:30:00Z</updated>
    <id>https://belenalbeza.com/articles/leaving-mozilla/</id>
    <content type="html">&lt;p&gt;I&#39;ve been working at &lt;strong&gt;Mozilla for almost six years, and today is my last day&lt;/strong&gt;. We finished the last project I was working on, and I felt it was a good time to have a break and then go do something different. Six years is a lot of time in tech, so I wanted to write this to reflect about my work there.&lt;/p&gt;
&lt;p&gt;I joined Mozilla as a &lt;strong&gt;developer advocate&lt;/strong&gt;. My role involved a lot of divulgation and outreach around Web standards. Beyond the usual CSS, JS and HTML, I focused on those standards and APIs related to video games and virtual reality. Many articles for &lt;a href=&quot;https://hacks.mozilla.org/author/balbezamozilla-com/&quot;&gt;Mozilla Hacks&lt;/a&gt;, the MDN or even here at my blog; talks at conferences or meetups (including View Source in Berlin) and even a &lt;a href=&quot;https://hacks.mozilla.org/2017/04/html5-games-workshop-make-a-platformer-game-with-javascript/&quot;&gt;multi-day workshop on game development&lt;/a&gt;… And then, after almost three years, I left this advocacy role to switch teams and join the &lt;strong&gt;Firefox &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Tools&quot;&gt;Developer Tools&lt;/a&gt; team&lt;/strong&gt; as a developer.&lt;/p&gt;
&lt;p&gt;I&#39;ve had the chance to contribute to multiple Developer Tools, such as implementing support for Web Components in the Inspector, completely re-vamp the &lt;code&gt;about:debugging&lt;/code&gt; (aka &amp;quot;remote debugging&amp;quot;) tool, code a brand new tool from scratch (the Application panel) and lastly, migrate the Storage panel to the new &lt;a href=&quot;https://hacks.mozilla.org/2021/05/introducing-firefox-new-site-isolation-security-architecture/&quot;&gt;Fission architecture&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&#39;m grateful to have had some great teammates and to have met some interesting people as well. But it&#39;s time to move forward now.&lt;/p&gt;
&lt;p&gt;I &lt;strong&gt;still don&#39;t know what my next adventure is&lt;/strong&gt;. I&#39;m planning to take some time off (I had to cancel my summer vacation, so I&#39;m definitely intending to have it now), tinker with new tech, maybe join a game jam, learn new cooking recipes and get some clarity on how I would want my next position to look like.&lt;/p&gt;
&lt;p&gt;I know two things for sure: 100% remote work is a must, and I&#39;d also like to keep doing work as an individual contributor (i.e. not a manager). Other than that, I haven&#39;t decided the kind of company, product or tech stack I would like to work with. Although I will not be actively looking for a new position for a while if you&#39;d like to get in touch in the meantime, feel free to &lt;a href=&quot;https://belenalbeza.com/about/&quot;&gt;write me an e-mail&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Ludum Dare #48 post-mortem
</title>
    <link href="https://belenalbeza.com/articles/ludum-dare-48-post-mortem/"/>
    <updated>2021-04-27T18:30:00Z</updated>
    <id>https://belenalbeza.com/articles/ludum-dare-48-post-mortem/</id>
    <content type="html">&lt;p&gt;It had been around a year and a half since my latest &lt;a href=&quot;https://ldjam.com/&quot;&gt;Ludum Dare&lt;/a&gt;, so I was really eager to join the game jam this past weekend. My goal: make a game from scratch (code, art, music) in 48 hours. The &lt;strong&gt;theme&lt;/strong&gt; for this edition was “&lt;em&gt;Deeper and deeper&lt;/em&gt;” and I made a tiny game about an elf trying to return home, which &lt;a href=&quot;https://ladybenko.itch.io/ld48&quot;&gt;you can play on Itch.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ladybenko.itch.io/ld48&quot;&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-48-post-mortem/cover_ludum.png&quot; alt=&quot;Title screen of &amp;quot;Exiled&amp;quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In this &lt;strong&gt;post-mortem&lt;/strong&gt; you will find a short development log for the game, the tools I used, and what I learned while making this game.&lt;/p&gt;
&lt;h2&gt;Development log&lt;/h2&gt;
&lt;h3&gt;Saturday&lt;/h3&gt;
&lt;p&gt;I woke up at 7:30 AM and saw the theme: “&lt;em&gt;Deeper and deeper&lt;/em&gt;”. I had a short workout at home (thanks, RingFit Adventure), and then brainstormed some ideas while having a coffee. For this, I like to do mind maps:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-48-post-mortem/brainstorming.png&quot; alt=&quot;Mind map with ideas around the theme&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I was unsure of what to make out of it, so I went for a walk, and then did some house chores while still thinking on which kind of game I’d be making. At lunchtime, I settled down for a Diablo-like game about a dark elf having to return to his home in the Underground after having been cast out. I quickly drew a mockup of how I wanted it to look like.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-48-post-mortem/mockup.png&quot; alt=&quot;Doodle mockup of the game&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On game jams, I usually like to spend Saturdays coding and leave Sundays for art, music and level design. However, this time I got “trapped” into doing 1-bit retro pixel art —a poor decision in retrospective, but I was having fun!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-48-post-mortem/draft.png&quot; alt=&quot;Some pixel art&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And quickly after that, I re-designed the main character to make it cuter and have black skin (like the dark elves from &lt;em&gt;Forgotten Realms&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-48-post-mortem/main_character.png&quot; alt=&quot;Main character&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;loved&lt;/em&gt; how it turned out. I posted it on Twitter and people really liked the character as well.&lt;/p&gt;
&lt;p&gt;I implemented rendering a level based on tiles, and also the character with basic movement. At this stage I decided not to follow &lt;em&gt;Diablo&lt;/em&gt;’s controls with mouse, and rely on arrow keys or d-pad, like &lt;em&gt;Zelda&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-48-post-mortem/rendering_level.png&quot; alt=&quot;A level map with the character on it&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I called it a day, and went to bed at a reasonable time.&lt;/p&gt;
&lt;h3&gt;Sunday&lt;/h3&gt;
&lt;p&gt;I was behind schedule in any way possible, so drastic measures had to be taken: I dropped combat mechanics and introduced &lt;strong&gt;dialogues&lt;/strong&gt; instead, so I could tell a story while the character was travelling down the different levels.&lt;/p&gt;
&lt;p&gt;And I hit a wall with this because I still don’t fully understand how Godot handles UI, and it turns out that implementing a box that will expand and shrink depending on the length of the text is not trivial.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-48-post-mortem/balloon.png&quot; alt=&quot;Main character speaking with a comic balloon&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In the end I managed to implement it, but I wasted a lot of time doing it. I could just have drawn boxes with three or four sizes and just picked one depending on text length. It would not have been perfect, but it would have been much quicker.&lt;/p&gt;
&lt;p&gt;It was getting late, and I realised I still didn’t have a &lt;strong&gt;title screen or an end screen&lt;/strong&gt;, so I made those two. I used the title screen to display a short &lt;strong&gt;tutorial&lt;/strong&gt;, and I re-used the main character and my new shiny dialogue bubbles to achieve that.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://belenalbeza.com/articles/ludum-dare-48-post-mortem/tutorial.png&quot; alt=&quot;Tutorial from within the title screen&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;SPOILER ALERT&lt;/strong&gt;: You may want to play the game before you continue reading!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I only had a few hours left, so I quickly &lt;strong&gt;decided the story&lt;/strong&gt;: the elf couldn’t win. He had been banished forever by some cruel gods, and he would be forever stuck in a loop trying to get home in vain. To reinforce this idea of looping, I made the player to go through the same levels a few time before displaying the “end” screen, and the main character would say something before going downstairs to switch to the new level.&lt;/p&gt;
&lt;p&gt;And to make the levels a bit more interesting, I decided to introduce &lt;strong&gt;doors and keys&lt;/strong&gt;, so the player would need to explore the level a bit before finishing it.&lt;/p&gt;
&lt;p&gt;Once everything was in place, I added some retro sound effects I generated, and also quickly composed something in Garage Band as the soundtrack. I wanted something repetitive, that felt like endless work.&lt;/p&gt;
&lt;p&gt;And I was done! The game turned out like nothing I thought in the beginning, but I’m happy I could submit something that felt complete somehow.&lt;/p&gt;
&lt;h2&gt;Lessons learned&lt;/h2&gt;
&lt;h3&gt;What went well&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;I had no problems when &lt;strong&gt;exporting&lt;/strong&gt; the game to HTML5 with Godot.&lt;/li&gt;
&lt;li&gt;Rendering a &lt;strong&gt;tile map&lt;/strong&gt; with multiple layers was a piece of cake.&lt;/li&gt;
&lt;li&gt;I designed a &lt;strong&gt;super cute main character&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;1-bit pixel-art&lt;/strong&gt; style was quick to draw.&lt;/li&gt;
&lt;li&gt;I like the &lt;strong&gt;story&lt;/strong&gt; and I think the game does a decent job telling it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What went wrong&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;It took &lt;em&gt;hours&lt;/em&gt; to implement the comic-like &lt;strong&gt;text balloon&lt;/strong&gt; for the character to speak. And my ego kind of got in the way of me settling for a dirty hack.&lt;/li&gt;
&lt;li&gt;I had a very &lt;strong&gt;slow morning&lt;/strong&gt; on Sunday, and it took me a while to get to work on the game. I also decided to watch Barça’s game in the afternoon, so I lost an extra two hours there.&lt;/li&gt;
&lt;li&gt;Since I made the art assets &lt;em&gt;before&lt;/em&gt; implementing the game, I ended up with &lt;strong&gt;assets I couldn’t use&lt;/strong&gt; (a walk animation, a sword, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Tools I used&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Game engine: &lt;a href=&quot;https://godotengine.org/&quot;&gt;Godot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Art: &lt;a href=&quot;https://pyxeledit.com/&quot;&gt;Pyxel Edit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Music: Garage Band&lt;/li&gt;
&lt;li&gt;SFX: &lt;a href=&quot;https://sfxr.me/&quot;&gt;jsfxr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ideas and mockups: Apple Notes&lt;/li&gt;
&lt;li&gt;Project management: &lt;a href=&quot;https://notion.so/&quot;&gt;Notion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
</feed>
