Be Stiff! is a small game developed ni XNA, soon to be released in different flavors. The nicest flavor is the free one. Come here soon for videos, screenshots and more info.
I’ve been heavily working on graphics, here’s a comparison of how the barrels have evolved:
Also I have big changes on the tilesets and in the lighting system to make the game nicer and more consistent in terms of gameplay (if you have seen the videos, you already know the lighting affects gameplay, as it represents the main character’s field of view).
Long time without updates. Here’s a video showing some graphical changes, and the hacking, which is a feature I’ve been working lately. Finally, I can say that all the features I initially thought on, are in the game. So now it’s time to actually finish the game. So, here’s the video:
This is taking a lot of time, but I think we are getting there. Be Stiff! is being modified… a lot. You see, some time ago I mentioned I needed a graphics designer or someone who knows about making stuff looking nice. Well since a couple (or three) months ago, I’ve been working with a great guy who indeed knows some stuff about graphics and design. So I expect to have soon some new screens and videos to show.
In the meantime, I’ve been playing around with Java. More specific with the LibGdx library which happens to be quite awesome. I’ve been porting part of the Be Stiff! code there as an excersise (I’m not planning to port the full game -for now- as some parts are Directx specific and I really don’t know how to convert that to OpenGL) like the 2D skeleton animation engine. Mayebe something for Android with emerge from this. Or maybe not.
I’ve been working on fixing a couple of bugs. The good news is that the Xbox version is working nice and the garbage has been significantly reduced, which means that I have a constant 60 frames per second on the console.
I’ve been working on a new tileset, so here’s a video showing it. But I want to talk a little on the game’s AI too. Look at the video, at the 7th second you’ll see that the enemy is calling for help (“F1″ he screams), then the guy with a pistol takes the elevator for checking out what’s going on.
I wanted to make the enemies smart enough to make the game challenging and force the player to at least think twice before entering shooting like crazy. That’s why the field of view is restricted, you cant run all the time, and the enemies try to attack in a coordinated way.
If an enemy spots you, he will call the closest partners. Then they try to coordinate by surrounding the player, by blocking the exits from the zone the player is in. Let me explain this with a couple of images:
Be Stiff Game AI Example
This image shows part of the map in the map editor (I’m using OGMO editor, if someone is interested), the yellow squares represent zones in the map, and the blue squares represent portals (not this kind of portals!). The portals represent a connection between two zones, indicating the enemy which action they should take to move from one zone to another (walk, jump, take an elevator…), so moving from one point to another is just an implementation of the A* algorithm for finding the best path, and tell the enemy to move to all the portals and perform the needed actions until he reaches the destination. The idea was inspired from this great article in Gamasutra.
So, what happens if an enemy spots the player? He calls for help (the “F1″ from the video), and when the help comes, they try to cover all the portals of the zone the player is in. In our example, if the player is spotted in the roof, the enemy will call for help, and they will cover the two portals the player should use in case he wants to flee:
Game AI Anemy Positioning
If the player kills one of the enemies, the “enemy team” reorganizes itself trying to cover as good as they can the player’s position. If the enemy team realizes that it can’t accomplish its goal (kill the player), it dissolves and then each enemy individually attacks the player (without any kind of coordination).
Pfew! That was a lot of text, anyway this was a quick view on how the AI works, I hope someone finds this interesting.
God, this is killing me. I’ve been through the whole development deciding which graphics style I want for the game. Now I have some kind of pixel art, but I’m still not convinced. Playing with Inkscape I finally got something, but still… not convinced at all, here is an before/after comparison:
OK, here’s the todo list (of the most urgent stuff to add):
- Add the storyline.
- Add more levels.
- Improve the code for hanging from the ledges (automatically hang?)
- Code for limited ammo and the chance to pick up a pistol when unarmed.
- Add the arena levels: Arena levels are infinite time levels where enemies are constantly spawning, so your score depends on how long you survived (and how many bad guys you killed). In some levels you are unarmed, in others you have the pistol.
Then I’ll work on graphics and music to improve them (or look for someone to improve them).
Aprovecho una pausa para hacer una pequeña actualización con el sistema de puntos en el juego, que ha sido uno de los temas espinosos durante el diseño. Resulta que por un lado quería que hubieran puntos en el juego, me encanta el concepto del High Score, es parte el espíritu que quería darle. El problema era cómo enfocar los puntos. Lo más lógico hubiera sido, un enemigo muerto, una cantidad de puntos, un objetivo alcanzado, otros puntos más. El problema de este enfoque es que el máximo puntaje por cada nivel es bastante estático: Hay cinco enemigos, tres objetivos, 100 puntos por enemigo, 50 puntos por objetivo, pues el puntaje máximo de ese nivel serían 650, y superarlos sería imposible.
Lo que pretendo es que el máximo puntaje sea algo más difícil de conseguir, de hecho que ni siquiera se pueda calcular cual es el máximo puntaje por cada nivel. Una solución a ese problema era la de, en lugar de puntuar objetivos y enemigos, que el puntaje estuviera determinado por el tiempo en acabar el nivel. A menor tiempo, mejor resultado. El problema es que ese enfoque rompe con toda la idea que tenía del juego, de que no fuera un juego de ir a toda velocidad, que estamos aquí para infiltrarnos en edificios y cosas así, no para cruzar corriendo por las pantallas. Está bien ir rápido, pero que no sea la única motivación.
La solución a la que llegué finalmente fue una mezcla entre las dos cosas, puntos por objetivos y tiempo. Resulta que los puntos tienen un valor fijo que está ponderado según el tiempo que se tardó en conseguirlo (S es el puntaje final, P el puntaje base por el objetivo y T el tiempo transcurrido en milisegundos):
Con esto, por ejemplo si a un objetivo le damos un puntaje base de 800, el puntaje que se consigue según la cantidad de segundos transcurrida es:
Parece complicado, pero no lo es una vez se ven los resultados, el puntaje se estabiliza cerca del minuto donde ya no es tan necesario ir con prisas. Igualmente se registra el tiempo con el que se consigue acabar un nivel, con lo que el jugador tiene la posibilidad de elegir cómo orientar cada nivel, e incluso el recorrido dentro de éste.
A ver como traduzco todo esto al inglés, por cierto…
English
So much time without an update. At least in the devblog, because the game development has continued without pause… well with some pauses. First the graphics: I changed the animations from a sprotesheet approach to a 2d skeleton system (inspired from here), the results are smoother animations, yay! The the lights and shadows system, which at the first I used Catalin Zima’s fantastic approach, as seen on the next video.
Castellano
Buf, bastante tiempo sin actualizar. Bueno, sin actualizar el devblog, pero el desarrollo sí que ha avanzado bastante. Primero, los gráficos, de los que me extenderé un poco más adelante. Cambié de un sistema basado en sprites animados a un sistema de esqueletos en 2D, el resultado, animaciones mucho más fluidas. Luego, el sistema de luces y sombras, en un principio usé la fantástica implementación de Catalin Zima basada en sombras a partir de píxeles en lugar de polígonos, aquí un video explicándolo:
English
The results were quite good, but I wasn’t totally happy with the shadows, that looked a little crispy, so I moved onto Krypton XNA great library. And now I’m happier:
Castellano
Los resultados estaban bastante bien, pero las sobras no me convencían del todo, así que me cambié Krypton XNA. Ahora sí: