Please welcome the user interface!

Foreseen Yet Unpredictable Invader

Fight mutating aliens in this unpredictable shooter!

Awards


SHMUP! them like it's 1991
Presented by hop

Generously minuscule hitboxes
Presented by Cosmologicon

Give this entry an award

Scores

Ratings (show detail)

Overall: 3.4
Fun: 3.3
Production: 3.6
Innovation: 3.2

10% respondents marked the game as not working.
Respondents: 25

Files

File Size Uploader Date
FYUI-beta3.zipfinal
Fallback version if I can't post a new one!
1.1 MB ThibG 2011/09/17 22:10
FYUI-beta2.zip
Second beta!
611.4 KB ThibG 2011/09/17 15:20
screen3.png
Please welcome the user interface!
54.3 KB ThibG 2011/09/14 20:30
screen2.png
Can I haz hitboxes?
31.2 KB ThibG 2011/09/13 21:30
screen.png
Mutated alien firing fireworks!
48.6 KB ThibG 2011/09/12 22:08
test.png
Not-so-recent screenshot
51.8 KB ThibG 2011/09/12 16:19

Diary Entries

Foreseen yet Unpredictable Invader: post-mortem #2

So, as promised, here is the second (and last) FyUI postmortem, dealing with the technical aspects of the game!

The whole game revolves around the boss's VM, which is specially studied to run a randomly-mutated code while making the game's difficulty come with the number of mutations.

Attack types

Boss and drones alike have a number of attack types/patterns:
  • A number of bullets launched straight at the player.
  • Bullets equally distributed in a circle, start angle rotating.
  • Bullets randomly distributed in a circle, with random speed. 
Boss have both "automatic"/"default" bullets, fired every 20 frames, and additional attacks launched by its code. Drones have only "default" bullets, fired every 22 frames. 


Basics about VM

Each instruction takes 4 bytes, one byte for the opcode, and the remaining for the operands.
Operands take each 1 byte, and may be unsigned integers or rationals. Their value is stored directly inside the instruction.
Many opcodes match the same instruction, some don't match anything, and the opcode 0 is a special instruction making the code's evaluation stop if all operands' value is 0. Let's call such instructions POST.
If there is no POST instruction, the boss can't regenerate (except in survival mode).

The boss' code is initially blank (only POST instructions), then mutated a bit, then a few POST instructions are added at the end of its code.
The instructions are executed sequentially, most of them after an extra delay precised as one of the instruction's operand. The script is repeated until the death (which can be temporary, since the alien can regenerate... wait... like a Timelord?)

Mutations

A mutation is an inversion of one random bit of the boss' code.
The blank code is mutated a few times before the start of the game, and each time the player hits the boss.
Such mutations could have a huge effect on the game if one uses a traditional representation for numbers: swapping the most significant bit of an unsigned byte could mean a change of about half the maximum value. It would be even worse for floats. Hence the...

Alternate coding of values

The game's VM works only with one-byte values: unsigned integers and unsigned rationals.

Unsigned integers are coded in a way that the most significant part of it is not the usual most significant bit, but the number of bits set. This means 1-bit inverting mutations only have a small effect on the value, and make the mutations feel "progressive" and "coherent".


Rationals are in the [0, 1) range, and their value is merely that of a corresponding unsigned integer divided by 256.

The instruction set

In a smilar way, instructions are mostly ordered by number of bits set in the opcode.
The valid instructions are:
  • The POST instruction, matching only opcode 0, and validating/exiting the program.
  • An instruction to set the boss' life, matching opcode 1, and 2.
  • An instruction to change the boss' wings, matching opcode 4. It's purely aesthetical, and it was initially meant to change more than the wings.
  • An instruction to change the settings of the "default" bullets sent by the boss. This instruction is called with a delay.
  • An instruction to fire some bullets, without affecting the "default" bullets. This instruction is called with a delay.
  • An instruction to fire some bullets without delay.
  • An instruction to modify the speed of all upcoming bullets. No delay.
  • An instruction to change the acceleration and rotation speed of already sent bullets.
  • An instruction to change the "default" bullets sent by a specific drone (sends one if there is none). This is called with a delay. 


I hope this has been understandable and not too boring.
Anyway, you can get a super post-compo hopefully-fixed version of FyUI here!

2 comments

Foreseen yet Unpredictable Invader: post-mortem #1

Hi again!
First, thanks for the ratings!

So, I'll be talking a bit about what I intended to do, what I scrapped down, and why I have made some decisions.

Also, I was pretty surprised by the number of DNW. Could anyone give details on those issues so I can provide a post-compo fixed version?

 
Game Concept

Back when the 13th iteration of PyWeek was announced, I was working on reimplementing a famous bullet-hell game. Then, someone told me the challenge was about to start, and I voted for the themes, without giving them much though. Then, at night time, my sick brain began to apply the “Mutate!” theme to what I've been working on.
So, the basic idea of the game has been unchanged since then: fighting enemies whose code would be mutating as you hit them (I'll explain the details later on).
 
When the theme was decided, I began to think more about the game mechanics, and shortly decided the player would have to fight one (and only one) mutating boss which would launch “drones”, which are simple, stationary enemies shooting bullets in a way similar to the boss.
I had a hard time deciding whether the boss should move or not, and I ended up making him stationary. And I can't recall why!

No, about the mutation part. It's a core feature of the engine, but doesn't really show up in the gameplay. Why? Because I wanted consistent scoring. I figured having a non-deterministic mutation path would easily make the scoring inconsistent, and that would have taken far more than a week to balance properly. It might have been a bad choice of mine, since it's prevented me to use the theme in the gameplay.


What I've scrapped down

I'm pretty happy with how the game ended up, but there are a few things I wanted to get in the game that I didn't to.

  •   Music. I've even spent hours searching for suitable musics. And I've found some. Unfortunately, pyglet kept segfaulting on my computer, so I had to forget about the whole the idea (or ship uncompressed WAV files, but well...). Here is the list of planned musics:
    1. Startdrive — Good morning
    2. Startdrive — A new day
    3. Dr. Salt — Hide your sadness
    4. Startdrive — Digital Surfing
  • Super-awesome pokémon-like intro. I've written a funny intro full of references to popular games, shows, etc. and had a clear idea in mind. But then I tried to do the graphics for it, and pixel-art really is not my thing. Not to mention it would have needed a fair amount of additional code to work.
  • Backgrounds. I wanted scrolling backgrounds so hard. It would have really easy to code, but I really had no idea what I could (try to) draw. 

And that's it for the first post-mortem! The next one will be about the technical aspects of the game.

Once again, if the game did not work for you or if you have found a bug, please detail it, I plan on making a post-compo bugfix version!

3 comments

My first PyWeek comes to an end, please welcome the unpredictable invader!

Hi again,
PyWeek comes to an end! Well, there are still a little than two hours left, but I don't think I'll achieve anything more.
So, here is my final (or almost) version, please test it and all! It even includes a copy of pyglet for debarra (sorry guy, no exe, I don't do exe)!

I'm pretty happy with the result, as it works quite well and is pretty addictive.
However, I had to cut down on various things: I originally planned to make an awesome, playable intro, but I soon came to the realisation that I am no graphist.
The same happened to the game's background: I planned to do one for each level, and in the end, there are none.
Until a few hours ago, I wanted to include music (I've even found 4 decent tracks under a free license), however, avbin segfaults on my own computer, so, I won't take the risk (I could do everything in wav, though, but I fear it would take way too much space).

Anyway, this has been fun and I hope you'll enjoy Foreseen yet Unpredictable Invader!
Please give feedbacks so anything worthy could be fixed before the deadline!

Add a comment

Foreseen Yet Unpredictable Invader — First version available!

Hi all!
My game is now fully functional and uploaded!
This is not the final version, though: I will select levels (the levels available in this version haven't been tested, or anything), I'll try to add some graphics, sounds, and things like that...

So, how does it work? You are a pilot fighting against aliens with the use of your fighting spaceship! But aliens can't really be killed, since they regenerate as soon as you kill them!
However, your ship's bullets temper with the alien's regeneration process, and will eventually kill them, but cause different mutations in the process, making the invader's attacks change!

Use [CTRL] to fire, [SHIFT] to move slower (and see hitboxes), and [X] to use the bomb system!

Have fun!
(and any feadback would be welcome :))

5 comments

A bit more on those mutating firework-shooting aliens

Hi again!

As expected, I have made almost no progress today. I've only worked on the in-game user interface (and on another small surprise you'll discover when playing the game).


 
But anyway, I'll take a bit more time than usual to go a bit deeper in the details of the way those aliens work.

As I said earlier, you're fighting only one boss at a time. This alien has an initially blank code (all-0 code), of which one random bit is swapped each time you hit the boss. The code runs in a VM specially studied to make the boss more interesting at each mutation, by mapping more ellaborate instructions to opcodes with a higher number of set bits. The same goes with any value, there are no float, only 8-bit integers and rationals, where the most significant part is not any individual bit, but the number of set bits.

This system seems to work quite well, although it would need a bit more tweaking to make the challenge come a bit earlier in the game. Anyway I'm quite happy with the results!

Hopefuly I'll be able to do some menus, intros and things like that tomorrow!

1 comment

End of the third day

Hi everyone!
This third day has been less productive than expected, but at least the gameplay is 100% done!
In addition, I've added the ability to show the bullet's hitboxes, added a few animations and improved a bit the graphics.
I'll have less during the remaining of the week, but well... I have something functional already!
Next will be the UI, it would be cool to have our remaining lives displayed somewhere. It could be handy, really...




 
Anyway, a bit on the game engine: the alien you can see on the screenshot above starts with a blank code and then mutates as you shoot at it. The more it mutates, the more interesting and challenging it gets!

Add a comment

And that's how the second day ends

Hey again!
00:00 UTC+2, time to stop for today, I guess!
Today has been quite a productive day: the core of my game is now complete.
It's quite a simple shooter, you are in a ship, fighting an alien boss. This alien boss have simple attacks. But as you kill it repeatedly, it mutates and becomes stronger (or weaker, but it has less chances to do so) and use varied attacks until it dies for good.
Tomorrow will be focused on user interface and data, I guess.

Add a comment

Err... I am supposed to talk?

Hi all!
So, I was supposed to say something? Better late than never I guess...
Anyway, what a good news the theme anouncement was!
The theme "Mutate!" was the first to draw my intention, and it stole me a few hours of sleep, while my sick mind was trying to apply the "Mutate!" theme to a bullet hell.
So, my game was mostly ready in my head before the start of the challenge!
In addition, I was working on a bullet hell reimplementation right before the compo, so, I have everything in mind. It leads to really similar code organization (mostly the same module names, and the code is probably similar in a lot of ways, too), and things like that, but I did not look at my original code *at all* once Foreseen Yet Unpredictable Invader started.
Now, I'm going back to add a few missing gameplay features in FyUI!

Add a comment