SHMµP
30/Aug 2014
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.
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!
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