"HackerBot" is a 3D stealth game in which you control a little hacking robot trying to break into a space-based installation and steal data. You can "hack" into (and take control of) more powerful NPCs in order to help complete objectives (hence you're behind everything!).
Requires pygame, numpy and PyOpenGL (sorry, needed for 3D).
Windows users installing PyOpenGL: see installation notes in readme.txt.
BUG FIX: Updated source distribution and Windows version contain a bug-fix and remove unnecessary dependance on GLUT.
Part 1 of 2: https://www.youtube.com/watch?v=YN396a8V9c4
Part 2 of 2: https://www.youtube.com/watch?v=XREVjt1dKNY
Best secret agent... in space!
Presented by Cosmologicon
Now I Sees Ya...
Presented by gummbum
Ratings (show detail)
Final Game (Post-competition bug-fix)
Standalone Windows Application
Final Game (Updated readme with Windows PyOpenGL installation notes)
HackerBot sneaking around
day 3 screenshot
day 3 screenshot
Day 3: Progress
The themes were pretty cool this year; I was pretty happy with the outcome ... not my top choice but I had a few ideas lined up. I'm working with the concept of a stealth game in which you can "hack" into and take control of more powerful NPCs (hence you as a player being "behind" everything) and get them to do your biddings in order to complete some pre-defined mission objectives.
I'm going solo this comp, hence down on 2D art skills, so I'm going to try and do something 3D using PyOpenGL, because I'm keen to learn a bit of 3D graphics programming. Hence, I'm also trying to add a bit of a 3D bent to the stealth aspects of the game: what I've got so far is that the player controls a little "hackerbot" that is basically trying to break into a space-based defence installation ... you can drift between asteroids and other space debris, hide behind them and then "hack" into NPCs that come into range.
Day 1: played around alot with PyOpenGL, got some basic functionality for textured models. Day 2: got some basic environment assets started, control system basics mapped out. Day 3: some basic HUD, some basic NPC behaviours, mechanics for "hacking" starting to be fleshed out.
I'm a bit concerned that I'm over-scopeing and also concerned that I don't really have a good game concept fleshed out yet, just a bunch of experimental mechanics ... oh well, I am enjoying learning the ins and outs of OpenGL.
Day 7: Finished!
I'm pretty happy with what I managed to get finished: the game mechanic came together in the last few days .. I think it works although I can't say whether the 3D aspects work or not. The only thing I really didn't manage to get done was put a few more mechanics in the final boss battle ... I just ran out of time and had to wrap it up, so what I've got I think will do OK.
Day 4: Spent this time starting to build the models for some of the static targets and NPCs, worked on getting the basic titlescreen, pause screen and out game loop working well.
Day 5: developed the mechanic for NPC visibility (so you can sneak behind them) and behaviours for when they notice you and go to investigate vs. they flat out see you and start blasting at you. Developed frills like explosions etc.
Day 6: fleshed out a basic message tutorial system that spits out helpful(?) messages in the first few levels, designed these levels
Day 7: Did the modelling for the "HackerBot". I was a bit concerned because at this stage my protagonist was still just a little green placeholder ball rolling around, so I spent a bit of time building a little spider-like robot model for him (I'm pretty happy how he turned out!). It took me a while to get the moving legs happening. Did all the rest of the level design and implemented the whole ending boss sequence. This was a pretty epic 12 hour straight grind to the finish line. 6:40am: went to sleep .... for like 20 minutes before my 4 year old son woke me up :)
Game Bug Fix :(
It occurs whenever you fire a laser from a hacked sentry bot at an active shield.
If you want to fix it, you can add the line "self.juggernaut = None" to the empty line 288 in src/game.py, or alternatively don't fire lasers at active shields (it doesn't do anything anyway).
I thought I’d write a few notes about the game development:
Using PyOpenGL and 3D models:
This was my first time using OpenGL 3D in a game, so it was a bit of an experiment, but I found it was relatively OK to understand. Two past pyweek games that I studied a lot to help me understand PyOpenGL were Bouncy the Hungry Rabbit and Eclipsed (I am still amazed that Eclipsed generates all of its 3D models in the code using no external resources). In order to generate the 3D models, I started off trying to teach myself to use Blender, but quickly found that the learning curve was too steep, and time was too short. In the end I fell back on some tools I’d previously used: I used Sculptris to generate the (randomish) asteroids (and followed a Blender tutorial to put a simple texture on it). I used OpenSCAD to do all the other models. I used Wings3D to colour all the 3D models (was using this for the first time this competition, and it was really nice and easy to use) and Meshlab to convert model formats.
One thing I never got to work properly was dealing with semi-transparent objects: I couldn’t understand out to depth filter all of these properly with the blending, so there are a few strange artifacts when the player’s view intercepts with a shield for example.
I think I got a bit lucky with the gameplay/balancing on this one (although some people mentioned the game was a bit hard), because I was rushed at the end, and spent relatively little time trying to tune this. I left the level development until pretty much the last day. The good thing about a stealth game is that there ends up being lots of ways to get through, and in a lot of cases, most of them probably make the player feel like they are doing to right thing, even if the game designer didn’t intend for the player to be able to get through a certain way. I also feel like I could have added a bit more variation in terms of different types of sentries, different objectives etc. if I had more time.
3D aspects of gameplay:
Probably the most challenging part of this experience for me was figuring out all the vector/rotation coordinate systems and working out how to make the controls feel natural and liberating instead of difficult and unintuitive. I spent pretty much a full day (I think around day 2) figuring out how the control system would work: in the end, the direction the hackerbot moves depends on the view: the ASDW keys map to camera-centric moving that are parallel to the vertical/horizontal directions of the screen. One issue here is that when you are standing on the “horizon” of an asteroid, the up/down keys probably feel more like they should move into/out of the screen, rather than up/down: I experimented with a system that blended between these modes based on how close the hackerbot was to the horizon (based on camera view), but I found the result made the controls feel even more confusing.
In terms of viewing angle, I made the decision early on to stick with camera perspectives that are fixed to the horizon i.e. the camera can pitch and yaw about the OpenGL XY axes, but not “roll” about the axis that sticks into the screen. I think this helps with visual orientation (which some people mentioned got a bit confusing anyway) but it gives the unfortunate side effect that the controls have “singularities” around the poles of the asteroids. I studied games like Super Mario Galaxy to see how they handle the camera perspective: there’s definitely a much more “fluid” feeling with this game, but the gameplay in this case is focussed purely on the “planetoid” you are currently on. In Hackerbot, I wanted the player to be able to have a “synoptic” view of the whole game space at any time, so they can plan where they will jump, navigate around, watch out for sentries etc. so this was my reasoning for keeping the camera this way.
Boss Battle and Future Work:
To me, when a game has a conclusive boss battle it adds so much: this gives a sort of “story arc” by creating a distinctive climax to the experience. I worked hard on trying to get a good boss battle for this game, but I only got about halfway through what I wanted to achieve. To be perfectly honest, it’s pretty much a stretch to implement this sort of thing in a pyweek with such a short time timeframe. My original concept for the “Juggernaut” was to have it slowly move around the play space and to create a situation where you had to “lure” it to certain asteroids and then jump away to create a situation where you could lead it’s laser fire into destroying shield generators. Then would come the “missile hacking”, after which hitting it with a few missiles, the Juggernaut would become “disabled” for 30 seconds, giving you an opportunity to “jump” onto it, crawl around and hack into a data port mounted on it’s back which when hacked would allow you to trigger a 10 second self destruct sequence. With another day to spend on it, I could have possibly got this all working and tune the difficulty so it wasn’t too hard. I basically ran out of time on the last day, so just ended up implementing the missile hack with a static Juggernaut (which was probably the most disappointing part of the final game for me). This is something that I might try to work on and include in an update for the game.
If you have actually read this far, thanks again, and hope to see you in six months for the next pyweek! I’m super happy that this comp exists and at the amount of time and effort people put into it!