Konoko Payne, June 2009 release
July 2nd, 2009
Here is a new Konoko Payne release. That’s the good thing about not having a job anymore, you get some free time for side projects
The changelist, grosso-modo:
- AI: added global timestamp for taunt sounds, to make sure we don’t play N taunt sounds from N different characters at the same time
- fixed bug with console unlocking even when player doesn’t have a datapad
- added MB steam sound
- added thug taunt sound (c17_99_01thug.wav, “don’t make me hurt you”)
- reworked sound for exploding monitors
- added one more taunt sound for ninja
- added zoom sound for digital camera
- reworked transitions for taunt anim from “run stop” motions
- bugfix: “game over” was not correctly centered in 640*480
- gun pickup is now easier when a lot of them are at the same place
- engine: added hot loading of DDS files
- nothing happens when touched by gun while jumping => should be fixed now
- added blownup anims
- added new weapon: portable mortar
- added explosions
- crates now glow when hit by plasma riffle & mb
- added helicopter fight in “compound” scene
- continued main gameplay/story
- engine: added DEVIL wrapper in SystemPlugs
- fixed small hiccup/lag when the datapad is spawned in compound redux
- weapon overlay not correctly displayed in 640*480 => fixed
- added sound instances to fix volume issues with sound emitters
- fixed Muro’s face in monitors (was glowing too much)
- monitor screens are now dds files
- added “bonus objects” to collect
- added achievements (using Xbox360 achievement bitmap & sound)
- engine: billboards are now depth-sorted
- + the usual lot of bugfixes and misc tweaks
So basically a lot of random stuff. The first version of the helicopter fight I previously mentioned is in. It’s interesting to see that gameplay, what makes your game a game, what makes your game fun, is not really tied to complex algorithms or clever optimizations. At the end of the day, what counts is all the tedious grunt work required to link A to B when C happens under circumstances D. If the player doesn’t figure out what to do after 60 seconds, start a special event to help him. If he does, make sure the help event is canceled. If he reaches the boss without a weapon, make sure there’s still a way to win the fight. If he defeats all the small guys, start this cutscene to show that the big guy is taking over. If he defeats the big guy, start this other cutscene. If he wants to use this item at that moment on that guy, make sure it works as the player would expect. Etc, etc. Lots of small, dirty, “ugly”, conditional code that wouldn’t win anything in a beauty contest, but that contributes a lot to the final fun factor.
In my role of newbie game designer here, I think the trick is to make sure the player is never bored. That’s probably why I keep adding new gameplay features, at the risk of never finishing this thing. For example this new release now has achievements - yep, the same as on Xbox. In ONI, if you got tired of hand-to-hand combat, you could switch to weapons. Now if you get tired of shooting, hey, you can collect those bonus objects. In the may release I also introduced the “puppet master” mode, which allows you to take control of enemies (like in Ghost in the Shell). It gives the player one more option: if he’s tired of combat, he can try the sneaking / ghost approach and walk undetected nearby enemies. The big issue of course is to make sure all the game mechanics work well together, instead of phagocyting eachother savagely. They must be well-balanced and all that. I’m certainly not there yet!
Another aspect is to make sure you thought about everything the player can try - and implemented a proper reaction. It’s like in Dungeon Master on ST in 1987. Part of why that game was so great is because no matter what you tried, the devs had thought about it first and there was an appropriate reaction in the game. Like, you’re at the very end of the game, seconds away from the ending… and no, you decide to go back all the way from level 13 to level 00 with the Firestaff… and bam! They thought about it too, alternate ending.
Posted in Oni / Konoko Payne | No Comments »
AZERTY keyboards are better :)
June 25th, 2009
Oh you gotta love those absolutely non provocative titles.
I only use AZERTY keyboards. I’m useless with a QWERTY (or worse, the swiss QWERTZ). Each time people tried to use my PC in the office, they sat down, typed for 10 seconds, stopped, looked confused, looked down at the keyboard… and asked me why the hell I wasn’t using a “normal” keyboard.
So, for the records: the AZERTY keyboard (or at least the AZERTY layout, I guess none of you still looks at the keyboard while typing, right?) is more efficient for coding, because it gives you the best of both worlds:
- if you want to type a number, you can use the numeric keypad on the right. Sorry guys, I know a lot of you hate it and just never use it, but hey, I grew up with this thing typing hexadecimal numbers from source code published in magazines. Trust me: for entering a lot of numbers at the same time, nothing beats the keypad.
- if you want to type a bunch of symbols widely used while programming, like:
& ” ‘ ( ) - _ = ! :
…well they are all available without pressing SHIFT. All of them. Compare this to the QWERTY layout which “wastes” keys by having “redundant” direct entries for all the numbers. Forcing you to press SHIFT much more often than AZERTY users.
So, AZERTY, less SHIFT pressing, better.
What do you mean you’re not convinced ?!
Posted in Programming | 4 Comments »
OMG I’m a geek
June 18th, 2009
Yesterday I woke up from what must be the geekiest nightmare ever.
In the dream, I was back to my old Atari ST days. A friend of mine was at home, using my ST to watch demos and play games. Suddenly he complains that the drive doesn’t work anymore, and that all the disks he tries are failing. I check it out, and I realize that the moron managed to insert 2 floppies at the same time in the drive! Shivers down my spine: it’s the 2 disks of Blood, and I’m starting to panic because he may just have killed my only copy. I painfully remove the 2 disks from the drive, then put one disk back to check everything still works. I reset the ST by pressing the small button in its back. The drive starts reading the disk sectors slowly… one at a time… tac… tac… tac… Something’s wrong. The frequency of the “tac” sounds is too low, like one per second. Should be much faster, like when booting Return To Genesis, here it sounds like the horrible Atari ST version of Out Run, which was loading for ever, super slowly. tac… tac… tac… I’m white with fear, the asshole killed my ST ?! tac… tac… tac… It loads ad infinitum, nothing happens… the thing is dead… tac… tac… tac…
The dream blends out, reality blends in. I emerge from that nightmare. Slowly.
Something is still wrong. I still hear the drive.
tac… tac… tac…
Half asleep I turn my head towards the noise.
And I see that loud, annoying, fucking alarm clock that my girlfriend recently bought in a cheap chinese bazar. Tac… tac… tac… tac… tac… That thing makes the same noise as an Atari ST floppy disk controller, and it took a nightmare for me to realize it.
Posted in Atari ST, Life | No Comments »
Some KP screenshots & a gameplay code rant
June 18th, 2009
Some screenshots of what has been going on in the KP world recently:
http://www.codercorner.com/Pictures/KP_Mortar.jpg
http://www.codercorner.com/Pictures/KP_Helico8.jpg
http://www.codercorner.com/Pictures/KP_Helico3.jpg
http://www.codercorner.com/Pictures/KP_Helico11.jpg
http://www.codercorner.com/Pictures/KP_Explo06.jpg
http://www.codercorner.com/Pictures/KP_Explo04.jpg
http://www.codercorner.com/Pictures/KP_Dialog02.jpg
http://www.codercorner.com/Pictures/Depot03.jpg
I know, not really next-gen looking. But hey, that’s fixed function pipeline and I’m the only “artist” involved, so back off. Currently trying to do nice looking explosions without killing the fillrate.
Also trying a “boss fight” against an helicopter. It’s a 2-parts fight where you have to finish it off by deflecting mortars shot at you from the helicopter - a bit similar to what Hibana was doing to missiles in Nightshade.
At Grin, one guy once told me something like “trust me, you don’t want to implement gameplay code in C++”. He meant we should only do it in LUA. I think I disagree. Using a scripting language does not necessarily translate to better gameplay, as the recently released Grin games unfortunately proved. For me, using LUA gave me the feeling I was programming with my left hand, while the right one was tied in my back. No power, and kind of awkward. Using C++ and having access to the full engine anytime gives me a lot more freedom and a lot more control. Going back to C++ gameplay code after one year of LUA in Wanted is incredibly liberating.
As for the argument that LUA scripts give faster iteration times because you can reload them without leaving the engine, well, there is some truth to this but it comes with the proverbial grain of salt. If you put your gameplay code in a separate DLL, there is not much difference in the end between your “game” and, say, a custom format plug-in for Flexporter. Remember Flexporter? Did you have to shut down 3DS MAX to compile your plug-in and try your changes? Nope, you just had one button to press in Flex. How long did it take to recompile your custom format plug-in? Exactly : something like 2 seconds. Iteration times for developping your own format plug-in in Flex were super fast. Well there is no difference with KP. Flexporter is the game engine, the format plug-in is Konoko Payne. It does not compile as quickly as a real Flexporter format plug-in because, of course, there is more code in a “full” game, but the idea is the same, and the iteration times are fast. Sometimes way faster than what we had at Grin.
Posted in Oni / Konoko Payne, Rant | 3 Comments »
Time to remove that grin from my face
May 28th, 2009
I’m basically looking for a new job. If you want to know the details, if you have a nice position to offer, or if you just want to say hello, please use the previously created email.
Posted in Life | No Comments »
New email
May 28th, 2009
Please use this new email from now on. Hopefully that one will remain active each time I have issues with this website.
Posted in Life | No Comments »
Immature game development
May 28th, 2009
I just noticed this post here, that I somehow missed before. I suppose it means game development was immature at Grin before February 2009? This might explain that.
Posted in Rant | No Comments »
Character slicing demo
May 28th, 2009
Here is a small “character slicing” demo that I was working on recently. It started as an innocent discussion at work. Somebody asked if it would be technically possible to cut a character at runtime with an arbitrary plane, and have the cut pieces continue using the character’s animation file for some frames, before going ragdoll. Some people said “forget it” because of the huge amount of work involved. I said “yes you can”, and then went ahead and proved it:
www.codercorner.com/Code/CharacterCutDemo.rar
The demo was made at home in the evenings, using an old Unreal character. Here is a video featuring a more modern character:
http://www.codercorner.com/Movies/CharacterCut.avi
There is a ridiculous amount of steps in this algorithm, although all of them are relatively simple. On top of my head:
- do software skinning for one frame, to get access to the character’s geometry
- cut the graphical mesh with a plane. This creates new vertices and triangles.
- compute new vertex data for the new vertices. You can lerp your way out of troubles for position / UVs / normal(s) / colors, but you can not interpolate the skinning data, so you need something else to figure out bone IDs and weights.
- triangulate the hole(s) you just created in the character’s surface. Replicate boundary vertices, compute new vertex data for those.
- optional: update vertex colors so that the vertices nearby the cut plane get a red tint.
- re-split the character for HW rendering (e.g. see “Skin Splitting for Optimal Rendering” in GPG6). When using HW skinning the character has already been cut to several batches, each batch using a limited number of bones depending on HW constraints. The nasty thing is that you can not cut each batch individually, as it creates troubles later on when triangulating the holes. So you need to put the skin back in a single batch, cut it, then re-split it according to HW limits.
- slice the bones’ bounding volumes. This may only work with boxes and convexes, as a sliced sphere or capsule gives you a non-trivial shape that your physics API might not support. Recreate physics shapes for cut volumes.
- duplicate physics bodies across the cut line. One issue here is that a vertex on one side of the cut plane might still reference bones located on the other side. So you need to choose between either fixing all the (now) invalid bone references in the vertex buffer, or let the bones exist as ghosts on the other side of the plane. Both approaches have pros and cons.
- disable joints across the cut line. Some subtleties here.
- create two new skins with the newly created graphics data, skinning data and physics data…
- optional: add extra effects like particles or blood spats, and sounds
I’m glossing over a fair amount of minor details and potential refinements, but that’s the rough road map.
Posted in Programming | No Comments »
Konoko Payne demo mode
May 21st, 2009
I quickly captured a video of Konoko Payne’s demo mode. This is a fight between Konoko and a Tanker. Enjoy!
http://www.codercorner.com/Movies/KP_DemoMode_KonokoVSTanker.divx
NB: you need a DivX codec to play this.
Posted in Oni / Konoko Payne | No Comments »
Stop The Lamers
May 21st, 2009
Sometimes I forget why ICE is the coolest engine ever. I was working with another engine and this happened:
Object3D* some_object;
delete some_object;
and then of course it immediately crashes somewhere because of some stupid container still containing the pointer:
std::vector<Object3D*> mSomeContainer;
Fair enough, vanilla stuff. Still, it’s been years since I last saw such a primitive crash in ICE. Because my non-STL, non-standard-compliant, “ugly” containers are still smart enough to remove the dead pointers from themselves, automatically! Hell, I even forgot I had that feature. It’s been the backbone of the whole engine, for about 9 years now… I can savagely delete any “managed” object anywhere anytime, and the underlying kernel just fixes up whatever needs fixing.
STL, meh! The industry couldn’t even standardize matrix conventions between D3D and GL, everybody has to re-learn the company’s custom, in-house matrices / points / quaternions / whatever anyway. Maybe they should standardize this instead of somewhat trivial containers.
Posted in Programming, Rant | No Comments »