About Mathieu Muller (twitter: @_mathieu_muller)

Entries

 
Ludum Dare 36
 
Ludum Dare 35
 
Ludum Dare 33
 
Ludum Dare 32
 
Ludum Dare 31
 
Ludum Dare 30

Mathieu Muller's Trophies

Mathieu Muller's Archive

GLITCh – A ludum dare 36 post mortem.

Posted by (twitter: @_mathieu_muller)
Wednesday, September 14th, 2016 4:43 am

Introduction

It’s time for a new post-mortem! Today I’ll talk about the game I made for the Ludum Dare 36, G.L.I.T.Ch. Yes, it’s an acronym and stands for “Game that Learns Information Technology to Children”. I must be honest, I got the gameplay idea long before the LD, mostly when I saw the Cubetto project on kickstarter. I told myself “Cubetto is fun in the base concept, but you could extend it a lot more if your robot was virtual”. I left this project/idea on a sheet of paper, extending with new features for weeks. I even talked about it on a forum like four months ago ( in french ).

GLITCh

GLITCh – A ludum dare 36 game

The ludum dare was the opportunity to materialize the concept in a proof of concept. For the theme, I immediately thought about Wall-E, an old robot forsaken on earth (that’s your ancient technology) but the only one “alive” as other, more advanced robots suffered from a glitch. As the player, you would have to program your robot by placing instructions on the level. In it’s core concept, the game is reminiscent from the old Amiga game “Brat” ( gameplay video ).

Saturday

Due to the heat at this end of the month, I woke up at 5 am. As I live in France, the LD theme is announced at 4 am, so it was almost a perfect match. I just checked the theme of the LD and got back to sleep.

At 8 am, I fired up my IDE with MonoGame, a open-source XNA replacement, and with my MonoGame extension libs. Having done mostly platformers with the previous ludum dare, I knew that my lib didn’t have such features as controls (in the Windows sense); I would have to implement draggable items, buttons, control panels, and so on. Also, my lib supports sprite animation but it is very experimental, and I never tested it in a game (only functional and unit testing where done in a previous project, but I didn’t know if the framework put in place to handle the animations was easy to use or not).

I basically started by copy / pasting the initialization code from the LD35, and replaced menu and title images from the previous game with new images. I choose to use pixel-art (upscaled 4 times, that means that each sprite pixels use 16 pixels on screen) because it’s an art style that I’m at ease with, but also because it’s fast to produce.

The day was taken mostly to add basic features and to test the core concept, aka “put arrows in place, make the robot follow the arrows to the exit”. Around midnight, I had my first level working, but very rough controls and input (mostly due to bugs in the draggable code).

Sunday

I had to get back my daughter who was on holidays for a week with my girlfriend’s parents. I only had the time to code/draw late at night (starting from 9 pm to 12pm). I already knew that I could not make it to the compo, and that I’ll have to use the Jam extended time period to finish my game.

However, as the base was working, I could code new tile behaviors (the no command tile). I also had the idea of a switch that can control a distant gate, but my level editor ( which is a simple HTML page where you can drag and drop items on it, generating the XML for the level ) didn’t support editing of properties that aren’t positioning properties (i.e. top left width left and tile type). While for other games, I could dodge this missing feature by using tricks, I had to implement it for the LD 36, as I needed to tell the switch which gate it could open.

Level Editor

The new, improved, level editor with property edition

I also had another problem; in the first design, I thought I could make the robot “fall” from the level if an arrow was misplaced; however this proved difficult to implement as you may run in drawing order changes ( currently, the level is splitted in layers, a bit like photoshop: the background with the tiles, the one where the commands are added, and then the layer containing the robot ). This layering system is a legacy from the previous ludum dare ( it’s nice for a platformer, as you can put items behind or before the player sprite ) but is not so clever for a top down game. So, when falling, my robot should have been occluded by tiles that are at the same ground, but lower from a screen perspective. Due to the false 3D perspective, I would have to encode some kind of Z component on each tile to tell if the robot was occluded by the tile when falling.

That was really too complicated, especially due to the time frame left. It was simplier to stop the robot in a fail-safe mode (OK, it is ancient technology, but even the Roomba has sensors to prevent to fall from stairs :D) and indicate the player that he was stuck. And that was doing the trick!

Monday

Again, as I was working, I did know that I only would have 3 or 4 hours more to work on the game on Monday. I usually spend Mondays on polishing the game: adding transitions, tests, timers, fading screens and so on. Usually, the game without these things shows a gameplay concept, but taking time to adding non critical things like this gives your game a polished look. I prefer, in general, have less features but a well finished game than putting a lot of untested / badly tested features in a game. And most of the time, some last added features proves to be bad features. Keep It Simple and Stupid (KISS) principle prevails in all of my games :D.

Unfortunately, there are some things that I could not finish in time:

  • The robot animations (move left and right were made, but I also wanted to include rotations and move up / down animations). Drawing the robot rotation in pixel-art proved to be a real challenge.
  • More levels. Like said, the ideas are not missing for this game. The robot already includes a battery (it’ll fail if you start an loop ingame due to battery depletion), but there is no representation of it in game. The robot could also use tiles that replenishes it’s batteries (induction anyone? :D). Threading could be represented through multiple robots doing tasks concurrently. Robots could pick up items (in a stack), so you could technically make a level that would allow a Tower of Hanoi kind of problem to be solved. Pressures plates could be a thing to (similar to a dead-man switch where you have to stay on the switch to allow it to function). Logical gates (Switch A and B must be activated to open a gate). Arithmetics counters tiles. There are really a lot of things doable for such a game…

Conclusion

This game was made essentially to teach the basics of computer science to my daughter; It was time for her to test the game. After explaining her the base concepts of the game, she was able to play through level 1 to 4, but the fifth level proved to be a bit difficult for her, and I had to accompany her and explain her some tricks to finish the level.

Now, I have a question for you all. The game was intended to be played on a mobile device (tablet, or smartphone), and some testers asked me for more levels (and I didn’t forgot you at all, I was working on code upgrades/clean up required for these new levels). Should I really continue this game? I have lots of features ideas (that could teach the principles of threading, stacks and so on) that I could put in it, but only if more people are interested in this game. If you say yes, I could maybe work more on the game, and release it, but I’m unsure about it as it wasn’t my original plan at all…

Link to the game’s entry: GLITCh

Post mortem of Omn Nom

Posted by (twitter: @_mathieu_muller)
Monday, December 8th, 2014 3:49 am

Hello all,

Omn Nom is my second entry for a ludum dare. The first entry (Connected Worlds) was done with HTML / Javascript, but for this one, I wanted to use something new: The MonoGame framework, based on Microsoft XNA’s one. I prepared my tools Thursday evening, struggling to install Visual Studio 2013 Community Edition due to low space on my system disk. However, I already had Visual Studio 2010 Express installed, so I told myself “Scrap VS2013, let’s use VS2010 Express!”.

I did some checks, trying to compile Monogame and run the basic game framework on my system. Everything was working fine, I though I was ready to start the ludum dare #31 the moment I would wake up on saturday morning (CET time here)… I was soooooo wrong!

Saturday morning

Waking up at 8am (yay, 4 hours less to code!), I check the theme… “Entire Game on One Screen”. Ewwww. Not inspiring at all, I think, and nothing comes up. Then my wife comes and tells me that I need to go fetch a christmas tree, throw the garbage at the local waste disposal, and take a package from the local post office. “Why not?” I say, I usually have ideas when I’m doing completely something else.

It’s now 11am… and I still don’t even have a start of an idea. I’m beginning to panicking, thinking of giving up; for my first ludum dare, I had the idea within 5 minutes, so I’m really worried if I can still do something within the 48h timeframe of the compo… my first idea come juste before lunch: a top view tank game in a city where the player need to kill other tanks.

I start to code and… wait, how to add assets in MonoGame? Searching a bit, I tumble upon the MonoGame Content Project… which my version of VisualStudio 2010 Express refuses to instanciate. Looking up on the net, this problem is known with my version of Visual Studio. Screw it! How to fix this now? It’s 1pm and I didn’t even start one line of code.

Some people suggest to use an external content pipeline, like XNB Builder, available on sourceforge. I try it, compiling some textures, and adding them to my project. It works, but the process is very tedious. Now, back to the code.

Saturday afternoon

I recover old code files from my XNA tutorial website, mainly code to handle basic stuff like input components, basic graphic components, and so on. At least, this code is still working and was pretty well tested when I coded it some years ago. Now, I need a level. How to load level data? The answer is XML definition files, supported natively by XNA. But I first need a level editor, and I start to work on it (i thought that manually editing XML files would be very tedious, and prone to errors). One hour after, my HTML/Javascript level editor is ready (thanks jQuery!) and generates a standard XNA XML definition file…

Which I can’t load in the XNB Builder! The program refuses completely to compile my XML asset certainly due to missing references to the data structure… Since I already had to install XNA 4.0 to make XNB Builder work, i thought: let’s use XNA 4.0! I know that XNA 4.0 is working flawlessly with Visual Studio 2010 due to my previous experiments. I close the project, create a new project with the XNA 4.0 Windows game template, reimport all my code and assets… and everything compiles and run perfectly!

Now, I’m still thinking about my tank game, and I want them to run in a city street’s. I start to draw in some kind of pixel art a tank hull, and road chunks. After I finished I’m thinking: “That’s OK for my skill level in drawing”. I draw the streets in my level editor, loads up the XML in my game and the streets are showing nicely.

Saturday evening

Next step: control a tank hull throught the streets. I’m going back to code, implementing base movement throught arrow keys, and collision detection. Ideally, I’d like to control the tank turret with the mouse, but this means I will have to implement a better collision detection than purely cell based collision detection. This means that I still have a lot of code to implement, half of the compo time has been used, and I plan to sleep tonight. I face a decision: either I sacrifice some of the core gameplay, either I change everything so I’ll have less code to do.

By chance, after testing what I already did, the gameplay did feel like something I already played in the past… PAC-MAN! Despite of the “tank in a city” skin, the basic gameplay was exactly the gameplay of the old good fashioned pac-man. And Pac-man didn’t have to deal with turret, mouse control, and/or bullets. So much for that for the “Innovation” part of the notation, i’ll do some kind of a Pacman clone. I took the end of the evening to redo the graphics, The pac-man, and the paths for the level: this time, I want to draw something with a “Tron” feeling: every item, path, and mobile would have some kind of neon glow.

Sunday morning

Waking up at 8am, with a good night sleep, I feel confident that I can at last finish the core of my game. I post the first screenshot of my game on my twitter account:

First screenshot of my game entry for the Ludum Dare 31

I have to take care of enemies: my game without enemies would be dull to play, so I implement a really basic random based I.A. which I think would do the trick. A.I. is never simple, and my first iteration of the ghost A.I. simply did turn around in circles, without ever going to the center of the labyrinth. Back to the drawing desk!

The second iteration of the A.I. is much better: at each cross, it’ll evaluate possible directions, and pick one random. “That’s sufficient for now!” I tell myself, but I promise to implement a better one based on the player’s position if I ever have enough time.

Sunday afternoon

Running around in a labyrinth is fun, but my game is still missing core mechanics. And a start screen. Which needs to be in the same screen, due to the theme of the compo. And sound. And power-ups. And music. So much to do, and so little time to do it. First, implementing a scoring system and a life system, so the game can end and the player can score. This is relatively easy to set-up, just and two variable to keep track of the lives and score. I draw a heart and number in the same fashion as the other items of the level, with some kind of glow.

For the first time, I sense that I may finish in time. Next thing to do: sounds. My first game for the ludum dare didn’t have any sounds at all, and this is a topic where I am not really easy with. Speaking with a friend online, he suggest me the name of the game “Omn Nom”. Simply brilliant! I start to make sounds with my microphone (yes, the “nom”, “wee”, and “ouch” sounds are all voiced by myself :D), distort them a bit to make them less “human”, and add them to the game.

Fortunately, XNA makes playing sounds very easy: load the asset in a SoundEffect, and just call Play() whenever needed. It’s time to test the game… and it’s maybe the first time I had to giggle so hard when coding. The “nom nom nom nom” was just SOOO right when the player was eating the littleĀ  dots. I tell my friend: “You HAVE to listen to this!”; it was also a way to me to test the Visual Studio 2010 packaging system, and ensure that everyone could install the game on their home computer.

Next step, the music. Well for this, I have to “remix” some title that was just perfect for the theme: The Heavy Omn nom Theme. It’s completely fubar, hits you on the nerve, especially since I made it some kind of chipmunk song by pitching the voice and accelerating the music. And it’s just perfect for the set of power ups that I have planned for the game.

But first, I still have to implement some kind of menu system to start, pause, and exit the game. I used the center zone of the game which need a special set of movement to attain to put theses commands: a blue play triangle, and a red stop square. When the player moves on it, it starts or quit the game. Moving on the play command will show the pause command instead, so the player is able to pause the game.

I promised myself to work again on the A.I. I take two hours of my time, thinking that the evening will be sufficient to implements all, or at least some of the power-ups that I wanted to put in the game. Believe me, these two hours were the most wasted hours of my precious time. I’m unable to create a more intelligent ghost, that finds the best way to the player. Yes I know A* algorithms, but I thought myself: “I don’t have the time to implement and test A* in such a limited time-frame”.

I end by adding 3 ghosts instead of one in my game. That does the trick. And the “random movement” algorithm is sometimes surprisingly following the player, giving the feeling of a real intelligent pattern behing (and sometimes, ghosts are really dumb, missing the player which is in the next cell).

Sunday evening

It’s power-up time! The first power-up that I implement is the heart that gives you an additional life. It’s also time to implement safe bounds checks to the score and lives count. The next power-up is the invulnerability power-up, that allows the player to hit ghosts without losing a life. Those two power-ups are almost implemented, as invulnerability is given to the player whenever he lose a life.

Remember that music that hits you on the nerves? The next power-ups I implement are “stop the music” and “start the music” (which is more some kind of power down, imho :D). It’s fun to control the meta game within the game, and I find myself surprisingly avoiding the “start the music” power-up (I really have enough heard the music…).

Next, the “overdose” power up that slows you down. Because it’s to big. And you need to digest. While the ghosts are chasing you. Another “power-up”: A block that closes a path (yes, you can be stuck…). And the last: bonus points power-ups shown as an apple. It’s now midnight, I’m sleepy, and I don’t have the time to finish the end screen (when the player hits 0 lives). It’s time to publish my game on the ludum dare website!

The finished game

Ending notes

I really lost plenty of time due to the ininspiring theme… and my non-working tools. Also, I priorize family life before anything else; I make this for fun (and to teach myself new things). The things I would have the time to do:

  • The better A.I.
  • Color based “keys” that allows the player to go throught special colored block. The player would “eat” the key, change to the color of the key, and then be able to move thought level parts that had the same color as the player
  • Color based ghosts that would have the same powers as the player
  • More weird power-ups (was thinking of some kind of teleporter, freeze mines against ghosts and the player, combo power ups with colors)

 

My first Ludum Dare

Posted by (twitter: @_mathieu_muller)
Sunday, August 24th, 2014 3:26 pm

Today I’ve submitted my first game, Trading Worlds for the 30th ludum dare. It’s also my first ludum dare. Frankly, I don’t know how I did manage to produce a “fun” game in such a short time frame (I had only 12h of work on it, as I had to go in my family). It’s a small web-based puzzle game, in which players must connect planets to each other via trade routes. Bigger the route, bigger the score. However, they also need to watch for the timer, and watch out not to lock the board by creating trade routes impossible to finish.

I’m pretty glad to what I could achieve 12h. I had plenty more ideas, but I’ll not implement them for the ludum dare. If people find this game fun, I could continue the work on it.

[cache: storing page]