Day 4 Screenshot

My Enemy's Enemy is my Friend

"My Enemy's Enemy is my Friend" is a 3D tactical space shooter using pygame and numpy to generate 3D flat shaded graphics. When an oppressive Earth government attacks insurgents on your asteroid colony, your family is killed and you are recruited by the insurgency, "The Brotherhood of Free Men", to work for them. You control a spacecraft and must follow the ship's on-board AI "Leila" as she directs objectives for you to complete on behalf of the "Brotherhood". Will you discover a sense of closure along your path of vengeance, or will the fighting only lead to more pain?

Requires pygame and numpy. Please play with sound on!

Playthrough Videos:

Part 1 of 3:

Part 2 of 3:

Part 3 of 3:

Alternate Ending:


hand-drawing 3D
Presented by xmzhang1

Give this entry an award


Ratings (show detail)

Overall: 4.1
Fun: 4
Production: 4.8
Innovation: 3.5

8% respondents marked the game as not working.
Respondents: 11


File Size Uploader Date
Final Game
6.3 MB mit-mit 2017/02/25 18:29
Day 4 Screenshot
57.9 KB mit-mit 2017/02/22 09:22

Diary Entries


Thanks to everyone who played the game and left feedback! I was very happy with how the game turned out overall; after a few early set backs in the first 24-48 hours, I was really questioning whether the whole 3D with numpy/pygame only was a good idea or not, but I'm glad I stuck in there. Even though the game didn't turn out great, and I sacrificed time spent on making the game better by trying to get this to work, I'm really glad I did it, because it was a good experiment, and I learnt a lot from the experience. Some of the things I was most happy with:

Array of 3D effects: All of the 3D effects are essentially drawn using three functions: "pygame.draw.line", "", and "pygame.draw.polygon". In the first 48 hours I had in mind how I was going to use these to draw flat-shaded polygons and projectile effects, and I was just lucky that it pretty much worked out off the bat. I experimented a bit with trying to get texture mapping to work efficiently using pygame.draw.surfarray and numpy functions, but it was pretty much a failure. The only bit of texture mapping I kept was the thin halo of the milky way in the background, which I put in mainly to help with visual orientation.

Motion Dust: The little lines that fly past you as you move. I put these in in the last 12 hours, and I'm really glad they worked (not perfectly) as it's really hard to gauge your motion otherwise, particularly when things are far away.

Ship AI Voice: After playing Universe Factory's last few pyweek entries, I knew I really wanted voice in my game (because it has given their games such a boost in my opinion), but I didn't have the people for it. I ended up using osx built-in command line function "say" using the voice "Vicki" to generate all the in-game AI conversations, and I liked how it turned out (even if she has slightly odd pronunciation at times :) ).

Music: I sat down for at least half a day to try compose and produce the background music for the game. I'm not a composer, so for me I was really happy with how the music turned out; it was exactly the right ambience I wanted that game to have. I wrote the score up in Musescore using a couple of sections of strings, brass, a timpani and a snare drum, and did a little post-processing in Audacity. I really had fun doing this, and it's something I'd like to work on more (I love it when games have good music, something I will aspire to)

I was grinding pretty hard on development for basically every waking hour I had spare over the week, so I'm pretty sure I wouldn't have been able to make it any better in the time I had. In any case, if I did have a bit of extra time I would have concentrated on a getting a few extra things working:

More variation in gameplay and missions: I really wanted to have a few different mission modes (for example a defence related objective, an objective where you are required to disable and board a ship) but I just didn't get anywhere near finished in time to do this. I felt like the gameplay therefore was a bit repetitive. Also, unfortunately, I left very little time for game polish, so alot of the missions I didn't really space out properly (too much time spent travelling between objectives, firing at things really far away). I guess I knew from the start that the game was going to be technically ambitious, and therefore I was going to have to sacrifice having time to polish it, and actually make it a really good game.

Better Story and Alternative Endings: I knew from the start how I was going to use the story to match the theme, but in terms of actually developing the narrative, I did this mostly in little five minute gaps throughout the week, in-between getting the mechanics of the game implemented. So basically the story was a bit ho-hum, but that said, I'm hardly a writer, so it might not have gotten any better with extra time spent :). Also, I was going to have an alternative ending mapped out and feature this a bit more, but I just ran out of time ... I got to 6am after minimal sleep over the past 3 nights and I was just too exhausted to keep going, so I left it as it was. If I had more time I would have made this better.

This was a fun pyweek with lots of great games. Congratulations to the winners Tee and Universe Factory, two really great games! and congrats to everyone who participated and made a game! See you all next comp!

Add a comment

Playthrough Videos

Playthrough videos now available at:

Part 1 of 3:

Part 2 of 3:

Part 3 of 3:

Alternate Ending:

Unfortunately my laptop hates running pygame and recording video from the screen at the same time, so the framerate of the game is reduced to half of what it would normally be :( ... hence sorry about the videos being a bit long. Hope you enjoy!


Day 4-7

Pheww! Just got it in and super dead tired after approximately 3 hours sleep in the last 48 hours. I'm pretty happy with the result. Honestly, I got everything done I hoped to get, but I really had to grind hard towards the end. Really hoping that this one works for everyone. Also hoping that people's machines can achieve acceptable frame rates (high computational load in rendering busy scenes).

Thing I was most excited about this comp is I actually sat down to properly compose and produce the in-game music, and I was pretty happy with the result: a nice orchestral theme, which I felt captured the ambience I wanted in the game.

Hope you like it, and please let me know any bug reports!

Add a comment

Day 1-3

I wasn't that keen on this theme, because I was hoping to make a pleasant and relaxing game this year, but I just can't brainstorm anything good that meets the theme like this :).

I'm going solo this comp (Lucid is sitting this one out), and hence down on artistic talent and ability :( .. therefore I decided this was agood opportunity to go for something 3D. I'm doing a tactical space shooter (inspired by games like colony wars and x-wing vs. tie fighter) with a backstory involving working for a terrorist cell against a government responsible for the killing of your family. 

I'm going a bit different by avoiding opengl or hardware rendering, and attempting to see how far I can get with numpy + pygame alone. I've had issues with pyopengl and panda3d before on various machines, and I'm concerned about the playability of games with lots of dependencies. It's working out pretty well so far, although I've quicky learnt how difficult it is to create texture mapping using numpy alone in an efficient way. Most of what I have so far is flat shaded polygons, which I think will fit the bill OK.

I spend most of day 1 and 2 developing a rendering system for polygons and blobs that uses colour and lighting. I got some basic spacecraft physics working towards the end of day 2 and some modelling, other visual effects and a basic HUD working day 3. Making good progress, but concerned still that I'm overscoping on this one :) ... oh well, thats all part of the fun, isn't it?