Developers' Diary

Objectives

by fetjuel on November 30th, 2009 2:00 to Code, Development, Paraplu

Until today, the only way to finish a level was to kill all of the enemies in it. Of course, with our new infinitely enemy-spewing doorway thingys, there would have to be another way. I set up an objectives system that allows us to define any number of different conditions for beating a level.

In the process of testing out the “get a particular item” condition, I became stuck inside a rock. This has been going on since I put together the obstacle collision, and I decided to attack the problem. It turned out to be more difficult than I’d expected. At one point I had a crazy system that checked how many character pixels were overlapping with the obstacle, and compared it to how many would be overlapping were the character allowed to continue on her current course:

overlap.png

In the end, I just did a simple series of four checks (which I originally deemed too tedious) to analyze the x and y components of the character’s velocity, and stopped either one if following it would result in a collision. This lets you slide along an obstacle if at least one of your axes of motion is still valid.

slide.png

mortalGuys

by fetjuel on November 28th, 2009 0:39 to Code, Development, Paraplu

Hi! Tonight I implemented a bunch of stuff to add flexibility to our map objects. When an object is added to the map, it checks a dictionary of dictionaries of dictionaries to find out if it should have any special attributes. One of the possible attributes is an “initStep”, which is the name of a function to call one time when the object is created. This gives us a free pass to do anything we want with a new map object: add it to some special sprite group, give it a weird behavior, and so on.

The initial motivation for this was to be able to create crazy puzzley situations like an enemy spawner which constantly sends dudes across a space toward a hazard that kills them. This creates a sort of doorway of enemies that you have to blast through. Actually the hazard will kill any mortalGuy that comes in contact with it; that includes both enemies and the player…

Of Mirrors and Runframes

by Jules on August 27th, 2009 12:37 to General

The best you can ever do with a project like this is to keep pushing yourself and trying your best. Often, when the context is as easy ‘n’ totally cas like then it’s hard to remain disciplined. I’m extremely bad at this. Recently I very much wanted to try to shed this taxing trait, and after a thoughtful chinwag with Fet, implemented a simple system of understandable boundary-creation and deadline-setting. The complication with our particular situeé is that there is no reprimanding hand to turn us should we be unindustrious. Well.

So far, over the last week or whatever it has worked surprisingly well. The major, and difficult task of re-redoing all of Vivienne’s animation frames and modifying them for a new context is done, and soonly we should have all of the materials we need to fully animate Viv in game.

I don’t want to let up, this pace is great!

Damage

by fetjuel on August 19th, 2009 18:26 to Code, Development, Paraplu

Today I worked on the hit points system for the main character, and the damage and dying mechanisms that that implies. Now the character has a hit point total, can be hurt by enemies and their projectiles, and dies when reaching 0 hp. Pretty basic stuff, but it was taken out for the sake of simplicity when I copied the ship code over from Soft Landing, and it needed to be rewritten.

Thankfully, the code to do all this, including flashing Vivienne red and making her invincible for a short mercy period after taking damage, was quite easy. It only took about half an hour, and worked the first time I tried it!

This should pave the way for building our first few fun, challenging levels, now that the presence of enemies in them actually has some consequence.

Equipment

by fetjuel on August 18th, 2009 22:10 to Code, Development, Paraplu

Over the past couple of days, I’ve done a lot of work on the equipment system. It was harder than I expected, but now you can equip various types of items that determine how your attack works. This is the core of the “algorithmic shooter” concept we originally devised together. In Paraplu, your attack is calculated based on three types of equipment. From our internal planning site:

- Weapon determines ROF, bullet type, range, damage.
- Costume adjusts ROF, damage, range. “Firing upgrade”. No costume should be objectively better than another, and most should offer similar factors of improvement. We want costumes to be valuable and interchangeable throughout the game.
- Accessory adds special effects of all kinds: number and direction of bullets, explode on impact, swirly paths, poison, fire, et cetera. “Meta upgrade”. Practicality of these can vary widely.

Mirror Match

by fetjuel on August 12th, 2009 18:49 to Code, Development, Paraplu

I have got the mirror system working, basically. This is how you equip weapons, accessories, and costumes. It was remarkably difficult to make a system that simply opens up a menu, then opens up another menu based on the item you chose. Those old NES RPGs full of nested menus must be a lot more sophisticated than I ever imagined.

But, in the process of getting that working, I really refined the whole concept of the focused (foremost) interface box, and the management of interface modes. Now the game always knows pretty clearly what is going on, and it should be easy to add more multiple-step interfaces.

I also factored some code out into functions, for doing common things like figuring out the selected item in the foremost menu, constructing the syntax needed to show an item’s icon and name side by side, and unfocusing the focused box.

equip.png

Cabinet vs. Wardrobe

by fetjuel on June 2nd, 2009 1:26 to Code, Development, Paraplu

Not a whole lot of work today, but I’m trying to keep some momentum going. I added a wardrobe object (with awful programmer art, of course) to accompany the cabinet object in the atelier. Now, different types of items are stored in the different containers: materials in the cabinet, and costumes in the wardrobe. We’ll need to add a vanity for accessories, too, once we have some of those.

It occurred to me lately how strange it is that at work I’m a designer who keeps his hands off the code, and in MOMO PAX I’m a programmer who keeps his hands off the graphics.

K Groove

by fetjuel on May 31st, 2009 18:06 to Code, Development, General, Paraplu

I had a nice time coding in the little food court at Whole Foods today.

10685915

- After several hours of work, taught our most basic enemy how to avoid obstacles. This is way harder than it seems, and I had to write in a bunch of psychedelic drawing effects to visualize what what happening in the code. It turned out I was telling it to go in a direction only if any obstacle existed that it wouldn’t hit, rather than if there were no obstacles that it would hit.
- Fixed a weird string-length bug that became apparent when resetting the description box for an item.
- Started moving the main character to a specific spot on the screen when moving between areas, so that you can’t arrive stuck inside a bush.

A Groove

by fetjuel on May 30th, 2009 13:36 to Code, Development, General, Paraplu

I was determined to get into a Paraplu groove today, because it was the first time in a couple of months that I had a significant chunk of free time to myself. After getting energized by some bass-playing, coffee, pinball, and Ar tonelico music, I sat down to plow through some coding and planning tasks. It went well!

- Designed a master chart for all enemies, the items they drop, item rarities, and crafting recipes.
- Wrote a system for enemy spawners.
- Added a spawning effect for when enemies appear from a spawner.
- Wrote the item drop probability system. Enemy types have the possibility of dropping one of each of a common, uncommon, or rare item. The probabilities of dropping one of these rarities of item, or any item at all, is customizable per enemy.
- Made it so that items you collect in adventures properly appear in your inventory when you visit your atelier.
- Filled in all of the items, rarity rates, and recipes for the items we have in the game so far. You can theoretically craft a Peasant Dress in the game now if you keep at it, but once I collected the ingredients I immediately got stuck inside a bush.

**Update:** I’m unstoppable!

- Subclassed Interface as TextBox and ViewBox, because once again that class had gotten huge. It was taking up half of the “guys” source file! Really cleaned up how the interface guys work.
- Added enemy portrait and description, in their own little boxes, to the bestiary system.
- Added item description, in its own box, to the inventory system. We have written lots of cute little bits of text about the inhabitants and artifacts of Nettle-Belfry, so this is a big step.

**Update:** My unstoppability continues!

- Set up statistics for how many times you have beaten a certain type of enemy.
- Made the bestiary hide enemy info until you beat that enemy at least once.

Paraplu: GMS + GMI

by Jules on April 29th, 2009 11:25 to General

Progress is steady now. I am working pretty much every evening on Plu, and managing to tick off boxes every day. Feels good! We will soon have all the parts required to make a working, fun level, which is a very important step to take, obviously. We are simultaneously slimming down un-needed parts of the game to speed up progress, and overall the feeling of progress is wonderful!

vivstatic_downmushskullidolboth2

Arc

by fetjuel on April 25th, 2009 22:06 to General

Visited Julian’s house today, and got to work on our stationary stone idol enemy. It spits magma-veined eggs at you, which explode on impact. Figuring out how to make objects fly in parabolic arcs within our pretty 2-dimensional system was fun.

Item icons in text boxes!

by fetjuel on April 23rd, 2009 20:51 to Code, Development

This was surprisingly difficult to keep from clashing with our line-break-insertion system, because item names can contain spaces. But now, like in so many classic games, we can insert item icons into our boxes, inline with the text! This will work for any Interface object, whether it’s a menu, a dialog box, or a speech bubble.

pastedgraphic

Maths

by fetjuel on April 21st, 2009 19:09 to Code, Development

My work was canceled this afternoon so that people could go outside and enjoy the first really nice day in Seattle this year, but I only got as far as the lobby. I made an iced soy latte and got to work on improving the main character’s movement in Paraplu. The protagonist (or “Ship”, as it’s still called in the code because of Soft Landing) had a pretty naïve way of moving, such that you can run diagonally √2 times as fast as you can run orthogonally. Also, all of the inertia code from SL was ripped out for the time being.

I set about improving the movement algorithms to yield consistent speeds in all directions, and incorporating an inertia system. I tried several complicated methods which failed in colorful ways, before settling on a cleanly simplified but almost precisely correct method. Now, it takes a moment to get up to speed, change direction, or stop, and it takes twice as long to turn around.

We got a whole lot / going on and on and on

by Jules on April 21st, 2009 10:33 to General

Had really good crack at getting some illustrations done last night and something isn’t right. I’m not sure if it’s just normal “hiatus sickness” or my own sensitivity to the environment I am working in (different computer, different application, different hardware, different location). I am having a hard time feeling comfortable drawing, and the machine I have isn’t really powerful enough to properly run Photoshop, which in turn isn’t as nice as OpenCanvas. Despite all that I am a pretty firm believer in the philosophy that you shouldn’t blame the tools for your own shortcomings. Maybe I am just rusty. Regardless, it’s difficult and depressing to spend hours trying to do something you know you can do, only to ultimately have nothing to show at the end of it.
Ugh, here’s hoping I can get through this rough patch quickly and get something back into it. The mind is willing.

On that note, anyone have a powerful laptop they aren’t using? :D

No? :D

Oh well, worth a shot.

Optimization

by fetjuel on April 15th, 2009 1:12 to Code, Development, Paraplu

Well, today I did some serious drawing engine improvement.

We now have a new type of Guy called Scenery, which has a strictly limited functionality consisting of sitting there and doing nothing at all. At the moment they can’t even animate, be transparent, or have a tint. We could add those functions in later if we find that we need them.

We now only redraw the map layer guys when a moving guy passes over them. This means we save a ton of cost that we were expending to redraw every single map tile every single frame. I made an awesome effect to test this; it causes the color of the scenery to fluctuate wildly each time it’s redrawn. (Jules, you can see it by uncommenting line 217 in guys.py.)

I started an experimental algorithmic shadow rendering that I think is kinda neat.

I hope Sofuran isn’t too lonely.

by Jules on April 14th, 2009 10:12 to General

Poor Sofuran.

Welcome home, big bro.

by Jules on April 13th, 2009 14:38 to General

Working on character artwork. I haven’t been drawing for a long time so just trying to work out the kinks right now. Ordered a new, smaller tablet (Wacom Bamboo Small), I’ve always found the GIGANTOR one that I’m stealing/borrowing from hachi to be a little cumbersome, and usually just corral a tiny area in the middle for use anyway. I hope this will present me with more opportunity to do artwork in the later hours of night\wee hours of the morning more frequently.

Seeing Fet’s beautiful work recently and playing the almost unbearably excellent Persona 4 has been immensely inspiring, and I’m feeling pretty gung-ho about making games right now.

Let’s see how that goes!

1D Inventory

by fetjuel on April 9th, 2009 19:36 to Code, Development, General, Paraplu

Goodness, has it really been 8 months since I posted? We have been very busy with real-life stuff, but the Momo Pax spirit continues. For a while I was working on implementing a 2-dimensional inventory grid like in Diablo, but it turned out to be pretty prohibitively complex. In the *getting something done* spirit that started Paraplu in the first place, I scrapped the 2D inventory and whipped up this 1D one in about half an hour.

1d-inventory

Paraplu: Ordered Layers!

by fetjuel on August 11th, 2008 18:22 to Code, Development, General, Paraplu

Whoa, I just completed the ordered layer drawing system. Before, all Guys on a particular layer were drawn in whatever dang order the game pleased. This was fine in Soft Landing, because it had a purely side-on view and it was unlikely to matter which of any given pair of peers on a layer draws in front of the other. But Paraplu has a kind of hybrid top-down and side-on view, like A Link to the Past. So when two Guys overlap, it’s important for the one that’s higher up on the screen to appear behind the one that’s lower down.

Python made this pretty easy with its custom comparison functions for sorting. These ordered layers just use this loop for drawing:

for oneGuy in sorted(layer.sprites(), cmpY):

Instead of this one:

for oneGuy in layer.sprites():

And the cmpY function is just this:

return -cmp(a.rect.bottom, b.rect.bottom)

Super simple! Thanks, Python and Pygame!



Paraplu: Sequential dialog boxes

by fetjuel on August 3rd, 2008 15:31 to Code, Development, Paraplu

It was surprisingly tricky to create a system for a series of dialog boxes that appear one after another. Soft Landing’s novel part is based on conversation scripts for doing just that, but in Paraplu’s running-around-shooting-stuff engine, we didn’t really have any way of doing it. Now the game keeps track not just of whether there’s a dialog on screen to be dismissed, but also what kind of dialog it is, so that it knows whether to bring up another when that one is gone. Currently the only thing that uses this is the “workshop” where you can craft items into other items, but in the future we might want to be able to just load arbitrary lists of strings in there and set up long narratives.