Devlog: Day 1


A bit of background about my jam participation

I've recently rekindled my interest in participating in game jams. I've always participating in jams as learning initiatives and never really tried to hard to finish anything; I've done all of the classic blunders, the most notable is switching to a new game engine after the jam started.

The few exceptions where I did complete something for a jam were a couple of historic Ludum Dare (as far back as approximately #21 or #22); as well as I submitted an entry to the Global Game Jam in 2013 and joined several Saturday-only game jams. Most/all of my games were lost to the internet black hole over the years.

My engine of choice has historically been overwhelmingly LÖVE. Over the past couple of years I did a bit of dabbling in Pico-8 and I really liked the engine but never had time to dive in. I recently completed my first game in Pico-8 for Ludam Dare #48.

I finally have a bit of time for myself so here I am, jammin' again.

Level-up Circle Jam

After having so much fun in the last Ludum Dare, I decied to check out Itch.io's jam listing and found this jam and decided to join. Seems to be a fairly positive community so far.


Day 1

I went to bed about 2 hours before the theme was announced: "Temperature is the Key".  Once I woke up; I spent the majority of the day with the theme idling in my mind, unable to come up with a game idea that I wanted to spend the week with.  So I decided to think about arcade games of my youth to see if any ideas came up; and once my mind settled on Space Zap, I knew I could do something with that. It's a easy to learn game that was quite enjoyable.


Overview of Space Zap

Space Zap was an arcade game released in 1980 that had a unique control mechanism (at least at the time): you are responsible for protecing a base from invaders by shooting your defensive lasers in one of 4 directions. The game is fast paced and is as fun as it simple.


Getting started on the jam

With most of the day gone dinner down the hatch, I fired up Pico-8 and began getting to work.

I had a bit of a short wishlist I wanted to accomplish on Day 1:

  • Get a character on-screen
  • Have the character turn based on user input
  • Implement a missile system that shoot in 4 directions based on player input
  • have generic mobs approach from all 4 directions for the player to hit

That was it, a simple list to get started on day one; which I managed to do:


I like to set up my code tabs in Pico-8 (limited to 8 tables) to have a dedicated table for a major component of the game. My current project has the following tabs

  • tab0 - Core Pico-8 API callbacks and UI elements (may become tab7)
  • tab1 - Helper functions: used throughout the code (like distance calculations, sprite outlining, etc)
  • tab2 - Player object handling
  • tab3 - Missile objects handling
  • tab4 - Enemy objects handling
  • tab5 - Level management (just reserved, currently not in use)
  • tab6 - particles handling

Since game engines built around LUA scripting have their object management left up to the developer; I knew start out with setting up the relevant tables. Here is how my core tab0 is set up:

function _init()
    player=player_init()
    enemies=enemies_init()
    missles=missiles_init()
    particles=particles_init()
end
function _update60()     cls(0)     player_update()     enemies_update()     missles_update()     particles_update() end function _draw()     player_draw()     enemies_draw()     missles_draw()     particles_draw() end

And a typical tab for one of the above functions would look like this:

function enemies_init()
    local enemies = {}
    --- currently just an empty table but is future proof if I want to put something global here
    return {}
end
function enemy_init(origin,type)
    local enemy={}
    --- set coordinate, direction of travel, enemy type,
    --- hitpoints... etc via enemy.variables (e.g. enemy.hp=100, enemy.type=type)
    add(enemies,enemy) -- add to the global enemies table
end
function enemies_update()
    -- for update cycles in object tables, go in reverse
    -- so that you can delete an object from the table without
    -- screwing up the iteration of the table
    for n=#enemies,1,-1 do
        enemy_update(enemies[n])
    end
end
function enemy_update(enemy)
    --- update enemy.x, enemy.y
    --- check collisions and resolve response
    --- kill if conditions are right (delete from enemies table)
end
function enemies_draw()
    for enemy in all(enemies) do
        enemy_draw(enemy)
    end
end
function enemy_draw(e)
    spr(e.spr,e.x,e.y)
end

Day 1 Overperformance

I ended up prototyping my to-do list quite quickly; so I ended up adding a lot more features on Day 1:

  • element switching (between fire and ice, to target the theme)
  • particle system
  • player level graphics
  • hooks for ui to show selected element
  • enemies responding properly to the element type of the missle (take damage or speed up)
  • health and mana bars complete with regen

And here is the status of the game at the end of Day  1:


Files

lucj_test_1.gif 209 kB
May 09, 2021

Get Anisotherm

Leave a comment

Log in with itch.io to leave a comment.