Tenoch

LD13

Revenge of the Orange

This is a cover of BenW’s Chain reaction:

http://www.ludumdare.com/compo/2007/12/16/finally-finished/

Since I met Ludum Dare only at the last compo, I don’t really have a “favorite entry” yet, so I picked one that seemed nice, and changed the gameplay, added personal things, etc.

Revenge

Here is the thing: revenge.zip

EDIT: see here about a Windows version

The goal is to blow the tiles marked by the pulsating squares. If there is only one, fine, but later there will be more, and the tiles marked have to be blown at the same time! To do this you take advantage of the chain reactions provoqued by the terrible Invisible Walker!

It just runs around the world, on the outside tiles, clockwise, and starts explosions as it goes.

To bring these explosions to the marked tiles, you can first move yourself, with arrow keys. You can also move some tiles: with X and V you rotate the 8 tiles around you. And with arrow keys while pressing C, you shift whole rows or columns. Beware: rows, columns and “ring around you” have to be full before they can be moved! No holes!

About holes…  Just don’t walk in them, or your life counter (right side of the screen) will decrease.

The similar counter on the left is the level counter. Of course, difficulty increases with levels…

Technical sadness:

The game is written in Lua and uses a personal lib that itself uses SDL and co. I included a compiled version of the library, made on Ubuntu. I have no idea if it’s going to work on another Linux machine, or even another Ubuntu, so be sure to read the README if you need to compile it yourself.

I unfortunately have no Windows machine available, nor Mac OS X, so no binaries for those. However, it is supposed to be portable, so if anyone manages to make it work, don’t hesitate to send me your binaries, so I can share them.

More details about the compo later.

Tags: cover, final, vector

Revenche of the Orange, now for Windows

Hey!

I apparently managed to set up cross compilation on my Ubuntu machine, so now comes my mini LD 5 entry, for you Windows users.

Grab it here.

Double click “run.bat” to play the game.

See my previous post for more information about the game.

(Note: this is my first experience with cross compilation and pretty much with Windows binaries in general. I may not have done it right or optimaly, but it seems to work. If anyone comes up with a better way to do it, please let me know.)

Enjoy!

LD14

LD14: hello world

Howdy!

My second real LD (did a mini LD and a half too). I’m not sure I’ll have time this week end, but I’ll sure try. Will be using:

Comp:
My tiny EeePC 901 under Ubuntu. And now I got myself a mouse for increased productivity.

Dev:
Either evöL, my own tiny Lua+SDL library (https://gna.org/projects/evol/), or Löve, a way cooler Lua game engine (http://love2d.org/). If the theme makes me feel like it, I might use glöwve, a simple script I wrote yesterday to make glowy vector graphics in Löve (here).
Löve is now available for Linux, Windows, and MacOS X, so (almost) everyone’s happy.

Graphics:

Inkscape, Gimp, and no talent. I do also have a camera.

Sound:
I’m tempted to make music as a module, in which case I’ll use MilkyTracker (http://www.milkytracker.net/). Possible sound synthesis with ZynAddSubFX and DrPetter’s sfxr. And my microphone.

Can’t wait for Evolution to make it the final round and not win, as usual. Oh and I wonder what will be the running joke this time.
See you all on the other side!

Back in business

What would LD be without the motivational posters?

Tags: motivation

The desk photo

Journal:

05:40

Waking up after about 5 hours of sleep. I’m feeling peachy. Can’t wait to go o__O at the theme and lose a few hours wondering why the hell I did even bother going up at such an ungodly hour. LD, you gotta love it. Also, breakfast.

Go go go LDers!

Notice how I skillfully include both a desk photo and a food photo at the same time! And notice the tinyness of my EeePC 901 under Ubuntu. And the mouse. The touch-thingy just drives me mad.

‘nough said.

Tags: deskphoto, foodphoto, journal

Last poster before theme

Tags: motivation

Journal entry #2

06:45

Back from a refreshing walk. The morning air and the surrounding environment gave me some ideas. Now back to mind mapping and brainstorming.

Took a few pictures too:

Tags: journal

Poster

(inspired by dock)

Tags: motivation

I can haz screenshot too!

Only… it’s not really fancy…

sucky screenshot

Tags: screenshot

Journal #3

08:12
Decided to go with some kind of destroyable wall of doom. Throw stuff at it to detach pieces, and thus slow the progression. For now I’ll try to work on the geometry bit.
10:03
Stupidely made my own vector library in Lua. Didn’t like the others I found, but inspired from those. Now the fun begins.

11:35
I can has destroyable geometry. Just a line and you dig holes in it.

12:03
Corrected lots of bugs and made the computations more general: more case are covered, includind when you “cut” a bit by drilling all around it. Hungry now. Food now.

Tags: journal, screenshot

Journal #4

13:01
Lunch break is over. Back to coding.

(mmm, noodles and an apple, and chocolate out of the photo)
14:23
Isometric view is complete!

No 3D engine here, just a bit of geometry and vector graphics, oh yeah! Imagine it going slowly downwards, and it’s really scary. Woooh.

Tags: foodphoto, screenshot

Journal #5

16:50
Bullets! With gravity and terrifying blast damage!

17:51
Going to a dampling making/eating party at a friend. I guess I can use a break, my mind is starting to show me weird stuff.

(Too bad I didn’t take my camera, it would have made a nice food photo…)

22:00
Back to work.

23:34
I have boni/powerups on the game, and the effects of the boni are applied with timers that have callback functions. It may be the usual stuff for most people, but I had never used these before, and it feels really cool. “oah it works” :)

In my original plan, I was supposed to have finished coding game mechanics by day one, to have all the time in the world for graphics and sound. Technically, my day one ends 14 minutes ago… I’ll try to have at least 5 hours of sleep, though.

Tags: journal, screenshot

Journal #5 (i think?)

02:44
Have a menu, and more importantly a working “game state” thingy to switch cleanly from menu to game and back, and possibly a help screen or prefs. Not always obvious since Löve don’t let you control the game loop (you overload functions like draw(), update(), mousepressed(), etc, and they are called by the engine). Also, it’s late and I should sleep a bit. Game mechanics are almost complete.

02:51
Yeah, going to bed. I’m affraid I’m now useless.

09:40
Allright, it’s a nice morning to make a winning entry. *Back to work, lazy ass!*

10:38
Now with a goal, a winning condition, and two game modes.

12:16
Added the critters. They just walk around and wait to be blasted away. Oh yeah :)

14:05
Face sorting is working. Took three different algorithms… And I’m pretty sure this one doesn’t cover every case either. But it seems to be quite OK anyway.

16:26
Just lost two hours researching and implementing an ear-clipping algorithm. Cause: opengl (and thus Löve) can’t draw non convex polygons. And I really need to draw one. I must admit I had fun coding that. But still, two hours…

Tags: journal, screenshot

Poster to ease the pain

Tags: motivation

Journal #6. Or #7.

17:46
Ice drawing is almost complete. The ear-clipping algo had mega bugs. Now optimisation (dropped to 5 fps…)

18:11
Ice drawing is *really* done. Or at least I hope, because it’s starting to piss me off.

19:56
Bullets have sprite and particules. So cool.

22:11
Eating. Have starting producing sprites and arranging the interface of the game. It is taking too long. TOO. LONG.

Mmm, pizza ham-pineapple, an apple, and some of the best chocolate in the world. I am now ready for the last 7 hours. With Queen as musical background I can win this compo. Definitely.

Tags: foodphoto, journal

arcticum

If you know what Löve is, and have it installed already, just grab arcticum.love and run it.

If you don’t know what Löve is*, then take the all included ready to roll super dooper binaries for you favorite OS:

Each package contains instructions on how to run the game, and the following Readme. Enjoy!

EDIT:

  • Known bug. When you win (ie get the fourth item), the game crashes (instead of going back to menu). But don’t worry. You still won! =)
  • Game resolution is 1024×600. It might show up weirdly (strech for instance) on 4:3 screens. Press F on title screen to switch to window mode, much nicer.
  • The sources of the game are in the .love file, which is really a renamed zip.

arcticum, seal protection
=========================
The game where we learn that global warming is a seal conspiration.
By Noé Falzon <firstname.lastname(a)aliceadsl.fr>

You play the role of the protector of the seals. On the small island in the bottom right corner of the screen are happy and peaceful seals. Their greatest ennemy, the polar bears, are a constant threat. If the ice shelf ever reaches the island, the bears could cross over and feast on the poor seals.

Hopefuly, ice melts. So seals have fireballs.

Unfortunately, fireballs are a very temporary solution. This is why seals have devised the best weapon against ice: global warming. If they could collect four sources of global warming, they would permanently get rid of the polar bear scum.

Game controls
————-

Mouse: aiming the fireball cannon
Left click: firing the fireball cannon
Right click or space bar: switch weapon

Tab: pause game
Escape: quit
F: toggle fullscreen (in titlescreen)

There are three kind of bonuses, with effect limited in time:
– larger blast radius (red ring)
– faster fireball (green triangle)
– slower ice (blue square)

Bonuses take effect if they reach the island. To help them do that, use the fireball explosions.

Collect the goals in the same way.

The game is over if the ice reaches the island or when you have collected the four goals.

Game modes
———-

There is a normal mode, as described previously.
There is a survival mode, for the hardcore players. In the survival mode, there are no global warming crap thingies to collect. The ice is faster, and the only goal is to survive as long a possible. Notice the timer counter in the top right corner.

Notes
—–

Of course, the bigger cannon is slower too aim.
Due to time constraints, the bears are implemented but don’t have sprites…
The drawing of ice can be buggy if some faces cross each other.
There is no real winning screen.
This global warming thing is all made up. And fireball? Seriously…

License
——-

The source code is under GNU GPL v3.
All graphics, sound and music are cc-by-nc-sa.

(* you just do as your toooold)

Tags: final, screenshot

Journal #too many. The final countdown.

22:43
Continuing sprites.

01:25
All boni have sprites. The ice and the sea are colored too. The bullets now have trails of smoke.

02:15
There is an island and a bunker on it. How come that took me 50 minutes??

Here stops the log because I clearly had something else to do than write a log… But this is what happened:
I drew the sprites for the collectible boni, which took a while. Then I made the seal sprite. I realised it was so small that I could cheat and rotate/flip it to make 3 other directions. Then I made the sprite used for the last two direction, and the code to take care of the drawing depending on the angle.
At that point I was supposed to do the same for the bears, but I realised it would take me took long, so I delayed indefinitely. Instead I made the opening screen.
Then some sounds, really fast with sfxr. I decided not to lose too much time with that. Actually I *was* fast. In maybe 20 minutes it was done.

Came the terrifying moment of parameters tuning and play testing. I must confess I didn’t do too much of this, so there is a chance the game is too easy, or too hard.

Then I had one hour left, and thought it would be awesome to make music while checking nervously the clock and all the people on IRC saying that they were done already. It went pretty well too.
Now five minutes before deadline, it was time for packaging. Which, with Löve, is supposed to be as simple as zipping stuff up and posting it proudly on the dev blog. Heh, something *had* to go wrong. The “compiled” game didn’t run. Cause: I used Lua modules to divide the game in several files. Worked OK as long as the running directory actually contains these files. Once inside the .love file, you can access them only with Löve’s special require function. So OK, I changed that. But then something else broke. The game half worked. Some stuff was there, some was not. The biggest weirdest Heisenbug I had ever produced. After half an hour of not finding the problem I still posted the game, instructing to run it unzipped (which forces people to install Löve, which I knew for sure would discourage 90% of them).
When I still didn’t find anything, I went to bed, at about 8:30.

A good day’s sleep later, I tried again to beat the beast. And it took a while. Finally, the problem was as follows (non Lua people, you may skip). At first, I used modules to separate my app states (menu and game), so every variable created inside of them was stored in the corresponding table. When I had to switch to non module separate files, almost nothing changed: instead of being table members, all new variables were simply global. Since I did happen to have no variable collision, it didn’t change anything. Except that one variable did collide, “debug”. debug is a standard Lua table, and overloading it with my debug boolean switch did screw everything up. I suppose that Löve uses these debug functions.
So all this time I just had to rename debug to debugmode and tadaa.
Packaging followed.

Now I have to play the 122 other games.

Tags: journal

Comments

Banni
20. Apr 2009 · 15:01 UTC
I had exactly the same issue, with minutes to go. Thanks to some helpful advice from IRC, I found that if you are using ‘require’ to link multiple .lua files, then you must use the full filename (with extension) to make it work in the .love file.
Tenoch
20. Apr 2009 · 16:03 UTC
Unfortunately it was more complex than that… My other files were not just plain code, they had a module structure, which doesn’t work quite well with love’s require() function…

But I converted everything back to normal files, and indeed used the full name with love’s require. Then the other bug came =)

Ah, coding is fun.

The story of arcticum

A good week-end that was. I am pretty satisfied with what I came up with.
Here comes a (rather long) reflexion about the process of creation.


The theme
Advancing wall of whaa? It is a classic, it was tough finding something original. I tried to mindmap my brainstorming around the theme, but it only confused me more with thhe possibilities. One continuous wall/many separate elements. Rectilign/soft-shaped. You’re the wall/the wall is the enemy. Possible actions again the wall (ie gameplays): run away, slow it down, destroy or damage it, protect yourself, go through it, push it back… After a walk to see the sunrise (woah it’d been ages since I woke up so early that I could see the sunrise…) I had narrowed down to three main ideas. A classic sidescroller where a bunny is chased by a wally cloud of darkness. A space-sim where you control a band of space pirates and have to use linked ships (as a “wall”) to take over other ships and planets. Or (as the sea outside is still frozen) a thing with ice that threatens an island.

I discarded the first one because it implied a lot of content to create, and possibly level design (or randomly generated levels, which might be difficult to make interesting). I discarded the second one (although it would have allowed me to use my cool glowy vector graphics script) because it would have needed too much AI, and I was really not sure of what control scheme to use. And a classic STR “click to select and order” seemed daunting to code. So seals and bears and moving ice. The fact that the wall is not a frontier, but the side of solid matter seemed original enough.

The game mechanics
The base principal was simple: advancing ice, make it melt as it gets closer. Surely I was counting on the “cool, fireballs!” effect, but I’m not sure how fun that is. With the boni it makes it a bit challenging, because the only way to get them is to use the fireballs. If you concentrate too much on getting a bonus, you let the ice get dangerously close, and vice versa: if you just keep melting ice, you never get any bonus.
Here is the important thing: you don’t need the boni, since melting ice is enough to keep you safe. The goal of the game would then be to survive as long as possible.
It took me a while to realise that this was not enough (well my mind was busy with broken geometrics algorithms…) So I needed a winning condition, to do something else than just clicking on some ice forever. Having no time to implement anything radically new (and having no other idea anyway) I just made special boni, that you collect. They are more rare, and you need one of each to complete the game. I made up the pretext later.

The “play until you die” type of game is not my favorite. It seems too “easy” from the designer. Like they didn’t even bother. I think the winning condition turns a toy (even if it’s a complex simulation) into a game: there is another goal than just playing the game per se.

The technology
Deformable wall meant I was in for a treat. Good thing I like geometry. The wall is simply modeled by a sequence of points. It’s not even a closed line, the ends are just outside the screen. This is OK conceptualy, but it made things more complex later on. Especially for the drawing. The two big difficulties were:
– the vertical faces. They needed to be drawn in the correct order, of course (far first, close last). But it requires to deal with a lot of special cases. The algorithm makes a lot of assumptions (notably, the line shouldn’t self intersect).
– the ice top. I thought “easy, just close the line somewhere outside the screen, and call love.polygon()” Myeah right. OpenGL can draw correctly only convex polygons. There was a big moment of panic when I realised the whole game could be ruined by such an stupid thing. I though of doing it otherwise, like abandoning the neat regular side and “paint” the area with sprites. But someone on IRC told me tesselation was not too hard to implement and should take an hour or so. It took a bit more, but I got it running, with the help of mighty google. Then when you think it’s over, you have to revise the algorithm several times for stupid reasons like counter-clockwise polygons and stuff. Also, the tesselation take time (O(N^3) algorithm. Had no time to optimise), so I had to make sure it was computed only when necessary.
By the way, known bug: when the line intersects itself, the polygon is not simple anymore (it’s crossed), and the algo fails. But I tried to optimize the blast radii so that it doesn’t happen too often. I’m proud I managed to avoid losing more time on that.

Add isometric projection on top of that, and you find yourself converting coordinates between screen space and game space all the time. But I like how it worked out. I think it was worth it.

Löve’s particules are full of awesome. Instant fireball gratification. Well, almost instant.

Also, Lua, I’m loving it more and more. Everything is so easy. People criticize its lack of features. I think it’s what makes it so good. Instead of using a specific method of a specific container class for each different purpose, here you can just call the same thing all the time. table.insert, table.remove. Doing things “myself” with just two functions makes me work faster than having to check a class’ interface documentation.

The graphics
All the ice is vector graphics, which is quite easy (once you managed to compute some coordinates). Compute a color depending on an angle, call drawing functions.
The sprites, well. Harder to make. Half was made solely in Inkscape (the boni, the seal island). The rest was handdrawn, photographied, and used a model in Gimp. Working at high resolution slightly masks the horrible mouse drawing. It still took a lot of time.
Also, so much time that I couldn’t draw the bears, while I had them coded. They random walk and stay away from the border of the ice. It’s useless, but it gives life to the game. The seals do the same and random walk while staying close to the center. I didn’t bother to draw them in the z-order by the way, so they might be buggy.

The sound
Sound effects in sfxr. Three clicks, hop, done. It was too late to be more creative.
The music was tracked in Milkytracker, in the XM format. On my computer the render done by Löve (so SDL_mixer) isn’t really nice, but I hope it’s only a problem of performance. Making the music was fun. Heavy use of repetition. Modules for the win.

The wonders of time managment
Here in Europe it started saturday morning at 6. I think it’s close to the optimal solution.
If you sleep before theme announcement, then you have the full saturday with full energy to code. Then a small night sleep, and another full day of awesome, barely tired. And of course you make the final rush last until the deadline.
It’s only 5-7 hours of sleep over compo time, but you’re still at best performance (except in the last hour, where panic makes you slightly unconfortable…).

Compare with starting friday evening: theme announcement, excitement, starting coding, w00ps, it’s 7 in the morning already. Well too late to sleep. Then you continue during saturday, but you lack of sleep makes you do crap. Maybe you consider a nap, and wake up 10 hours later. w00ps.
I mean, if you try the normal sleep schedule, it has two nights on compo time. If you want to skip one, better if it’s at the end.

In total I worked 36h on the game. It has about twice as many lines of code than my previous entry. You can see on this bzawesome graph the repartition of time among categories of tasks. The major time eater was making 3D in vector graphics. I mean, it was so cool to code, but that’s what 3D engines are for.

The conclusion
Ludumdare is hard. Because you have to complete a chalenging technical task (programming) while making sure that the game will be interesting. Programming is easy. It just takes time. Finding a good concept is hard. It doesn’t take time, it takes imagination, cleverness, genius for some. I have absolutely no idea how fun is my game. None whatsoever. What I’m sure of is the performance of my tesselation algorithm, the quality of my vector library, or the extent of their suckiness.
I may know some programming, and some math, it doesn’t make me a good game designer. Actually I realise I don’t play that much. I find most games boring. I’m looking forward to the day when I’ll have an idea and think “Wow, *i* would love to play that game”. That day, I’ll feel like a game designer. In the meantime I’ll train for the developing part, to be competent when I’ll need it.

I’m happy that I managed to make a complete game. From the three ideas I had, this was probably the simplest, gameplaywise. And this is how it should be. Simple means better chances to implement it correctly and have an enjoyable game. I hope.


It was pleasure being around the IRC playing with old memes and following people’s progress. Grade wisely.

See you all next time!

Tags: postmortem

Comments

Simon
22. Apr 2009 · 18:46 UTC
Very interesting post-mortem. Thanks!
23. Apr 2009 · 15:27 UTC
Very insightful :)

LD15

Declaration of maybe

I’m kinda moving back to Finland this week end, so even if I’m just getting back to my own place, I might have things to do like buying food, seeing people, going to barbeques, having sauna + beer, and boring real life stuff like that.

If I don’t, on the other hand, I will certainly compete for my third LD (woohoo), and try to get a position in other categories than Journal, for once.

My tools are as usual:

  • EeePC 901 running Ubuntu 8.10 (yeah I need an upgrade), with a mouse
  • LÖVE or evöL (my own Lua wrapped SDL engine, which now supports OpenGL through LuaGL, in the last SVN version) or C + SDL
  • Inkscape, GIMP, Digital Camera
  • GoatTracker (XM tracker) or Rosegarden (MIDI sequencer) + Qsynth (soundfont player) + ZynAddSubFX (soft synth) + any other linux audio soft
  • Bazaar + Launchpad’s personnal junk space for backup

And ‘course lotsa motivationnal posters.

Now that I’ve spammed the compoblog a bit, I can get back to packing properly.

First things first.

Tags: motivation