SHMµP

SHMµP is a little game I work on during my spare time. I felt like it reached the point where I can show it, so here we go. It is by no means finished, but more like a demo at the current state; yet it is totally playable.

screenshot color blocks image

What is this game about ?

Minimalism

Going for graphic minimalism is certainly an easy way to avoid doing art. My art skills being non-existent, it allowed me to have a very small amount of assets (basically a single 64*8 texture) in the game, and to give it a coherent look and feel.

The block is the elementary unit in the game. The player’s ship, enemies, bullets, everything is composed of blocks.

Blocks are important for the gameplay, of course. They are what you will use to build your ship, making it unique. Each block has a particular effect on your ship, and so the do on enemies!

blocks everywhere

Yet no mining, no crafting.

Procedural content

I am lazy, so this game includes 0 stages. The good news is, no stage means infinite stage: the enemies are generated on the fly, by a clever algorithm (soon™). As time passes, the difficulty increases. By beating enemies, getting bonus and avoiding getting hit, the player increases his skill-o-meter. Waves will then adapt the way they generate enemies based on these 2 parameters, among others.

The game relies heavily on random, but every run can be replayed: you just need to enter the same seed once again.

Scripting

Enemies are scripts.

Waves are scripts.

Scripts are simple lua files one can drop in the scripts folder and they will just work. They use a very simple API, making it easy for anybody with basic programming knowledge to write one.

Sample enemy script

BLOCKS = {
    blocks.None,    blocks.None,    blocks.None,    blocks.None,    blocks.None,
    blocks.None,    blocks.Blue,    blocks.Blue,    blocks.Blue,    blocks.None,
    blocks.None,    blocks.Blue,    blocks.Blue,    blocks.Blue,    blocks.None,
    blocks.None,    blocks.Blue,    blocks.Blue,    blocks.Blue,    blocks.None,
    blocks.None,    blocks.None,    blocks.None,    blocks.None,    blocks.None
}

local onScreen = false
local start

function init(enemy)
    enemy:setMaxLife(1)
    enemy:setLife(1)
end

function update(enemy)
    if not onScreen then
        start = game.time
        onScreen = true
    end
    local duration = game.time:since(start):asSeconds()
    enemy:setSpeedY(math.cos(2*duration)*60)
end

External links

  1. Download
  2. Scripting documentation