ruruie

Ludum Dare 49

Definitely About Creative Process and Not Just Plugging the Game on the Blog

I and partner in crime @alpacalypse are now three for three on At Least Finish the Game in an LD. More importantly it's the first where I've participated as a full on dev. As things wind down, I see lots of us posting about creative process, art development and so forth. Aside from trawling these posts for tips and, more importantly, tools, I thought I would take my inaugural post as a full on, proper game dev to post the part of the post mortem that spoke most to me, the state of the Recycle Bin after three intense days:

trash.PNG

We kept doing and throwing things away. Eight reactor.tscn (we used Godot) hit the trash by the end of it. How did that happen? I don't know! But it just so happens, that this is a smooth and natural segue to the fact that the resulting game, LD49 entry Witch Reactor can be played and rated right now.

46f62.png

Only want to play a game with an Html5 option? It has that! You can click that link right now be managing your own, safe, high stable Witch Reactor in seconds.

Play it!
Skip past the wall of text!
Drag icons into boxes!
Be confused!
Game over to opaque mechanics!
Like the game anyway because the icons are Artbreeder anime portraits!

Witch Reactor!

Ludum Dare 50

Ludum Dare 51

Nope

denounce.PNG

Witch Contractor

Eleven months ago, I and partner in crime @alpacalypse were three for three on At Least Finish the Game. Now, we are five for five. Accordingly, we advanced our metrics of success to consist of A Clean Launch, With Crisp Presentation and No Game Breaking Bugs.

This, we have done.

screen3.png

I have, as I have made publicly known, a thorough disdain for this round's theme. Hence our decision this time around to do something a bit more traditional. Well trodden ground, you might say. All this one is, at the end of the day, is a decent shooter. That was the target. Make a decent shooter that works and is crisp without being too ambitious for the two people with three days on it. Suffice to say we shouldn't be 31st in Innovation this time around, but look, you can WASD around on screen and the universe doesn't explode. You can fly. You can shoot. The procedural generation doesn't create outright impossible levels. The buttons go bong when you mouse over them and everything. You can go ahead and play this shit on HTML5 right now.

https://ldjam.com/events/ludum-dare/51/witch-contractor

Come and play either the jam version or else the just released v1.1 patch which was, indeed, mostly just balancing. Because we had only a single bug of significance (and it only rarely manifested; two reports over many testers and hours of play) and that is now fixed. Come play this shit right now, rate it, and ease the unquenchable thirst for validation that we all know and share.

Witch Contractor Has Enough Ratings Yet Still We Pine For Your Attention (I)

LD51 is drawing to a close and our game, Witch Contractor, has the requisite ratings to score, yet still we pine for your attention. And you know why, don't you? After all, we are all here who have done the same thing and even those who think (wrongly!) that they have birthed an abomination can understand that this is a hunger that cannot be sated. However, if my attempts to pander for clicks is too blatant, I fear that my post will be shunned.

So you want substance in this blog post and I want you to play and rate our game. A transaction then. I offer you an accord: play our game; make our fell child's numbers go up higher, and in exchange I shall show you a glimpse of the spaghettal abyss from which it was spawned.

title.jpg We didn't make it clear but the fiery pink halo is her actual hitbox.

We decided from the start that we would focusing on presentation rather than being different this time around. (Somehow, our 4th game half a year ago, scored 31st in Innovation, which I don't think we will top for some time.) Hence, Witch Contractor is a dumb shooter. Your character faces the mouse pointer, you hold down the button and shoot at things that go zot once you reduce their hp to 0 and you have to do that to all of them fast enough to not game over. The one thing that maybe sets this thing apart somewhat is scale.

Firstly, mobs. It has 11 enemy types and the progression to support it made possible by decent architecture. My partner in crime @alpacalypse has explored this a bit already: https://ldjam.com/events/ludum-dare/51/witch-contractor/solid-architecture-builds-big - I was that horizontal developer. I don't really have a chance to code outside of LD (nor make sprites or music) but the five jams I've been on are where I've learned those things. It's hard for me to solve problems from a blank slate but once I've got a model, I can reproduce it. During most of development, we had three mobs. By about the middle of the second day, Alpacalypse was calling for about four mobs. I was pixeling a clock with squiggly lines underneath it.

no.JPG

I then pixeled up seven more mob sprites, including the infamous Orange.

mobemg.png *Oh how many of you tried to collect it, only to hear the playerdamage sound and find your life hearts draining away. Delicious.*

At that point, I couldn't implement a mob easily - I didn't know how - and our lead programmer was busy with the main game so the issue of how many mobs (and progression) we would have fell to the wayside for the time being. In the end, Day 2 produced a number of things that didn't get implemented like a directional bullet and various ideas coming from me (I wanted beams!) but since I'm not really a programmer, it's hard for me to make things real while the real coder is busy. Not impossible like it would have been two or three years ago, but difficult. I imagine ours isn't the only team faced with this sort of project management issue, especially when I see larger teams that have a lot of sound and art folks but like one programmer who must be absolutely busting the whole way.

So let's fast forward. It's middle of Day 3 and we have 10 hours left.

problem.JPG

At this point, the Dome shoots but doesn't move and doesn't have the movement code. The Tentacle doesn't move. The Blob does move and has the damage on collision and doesn't have the code to shoot even if we wanted it to. They're also different types of things - either Area2D or KinematicBody2D (Godot folks will know what those are). So basically that was a mess and our programmer hasn't had time to fix it yet. I do have time though, so I was going to have to fix it. I tore out all the code from each of the mobs and turned it all into a class.

For all of you proper programmers, a Class is probably just second nature. I'm not a proper programmer. I've been exposed to code for five LDs and a few other occasions and can search documents and copy and paste. What does that make me? I don't know but it took me about half an hour to go from having an inkling that such things were theoretically possible to putting it down in a working form in Godot. I then spun up my seven additional sprites into new mobs. They are still based on two abilities of course - whether or not they follow the Witch, and whether or not they shoot - but they look different and have different numbers. In the end, we went to having a problem that had to be set aside for over a day to the point where, about three hours from release, I decided that we needed an eleventh mob to satisfy the progression through forty levels of play so I just casually doodled up another sprite and then just spun up an eleventh mob in minutes. This was the Flower, which was the last to be added to the game and filled the gap between the early game Dome and the high damage late game Prism.

mob_k.png

So for all of those teams out there with multiple talented artists, many of whom don't think they're programmers but have been exposed to code repeatedly, but relatively few programmers, this might be your ticket to scale. Take the time to make this stuff easy and try to leverage the people in your team who might have spare time but can't contribute with just notepad. You just might end the jam with more coders than you started with.

I think for the next post, I'm going to talk about the level generation but now it time for you to seal our pact. Come! Fulfill your end of our bargain and play Witch Contractor: https://ldjam.com/events/ludum-dare/51/witch-contractor

Witch Contractor Has Enough Ratings Yet Still We Pine For Your Attention (II)

Yes yes, back I am for another evening, here once more to seal our Pact. Even though out of all of you who read the previous post, only a single one amongst you upheld our bargain! Disappointing. But not unexpected. Nor unacceptable. Beggars can't be choosers after all, and we are nothing if not cursed to be beggars, every last one of us. We shall take what souls we can.

Let me offer another glimpse then, into the festering morass of jam coding. Know you the riddle of Procedural Map Generation?

title.jpg

One person who played our game described procedural generation during a jam as a Decision. Ambitious. It pleases me that its presence pleases or impresses at least some of you. Others have said that the map geometry made ten second clears very difficult. This is fair and also true. Plus, we're hardly the only ones with procedural arenas and I'm sure there are entries out there with more sophisticated implementations. But hey, like I've said, one of the few things setting this project apart from the pack is scale. By the third day, Witch Contractor could well have been on the way to being a project of ten levels and a few dozen meaningful maps. Instead we managed forty encounters and something like 1.6 billion possible maps.

Quite early on, I unilaterally decided that the game would be lower resolution than all our previous ones. I wanted to try doing smaller pixel sprites than before. In the end, the art direction of the game never really came together. Much as I'm not really a programmer, I'm also not really a pixel artist. I just kind of mimic and bullshit my way through. Some of the flaws you can see (but maybe don't notice or quite put your finger on) is how we have black outlines for most things but no outline on the heroine. However, the point is, the 540 pixel tall screen stuck.

At some point, we noticed that my equally arbitrary 14 pixel margins left us with 512 pixels in one direction. 512 is, of course, a power of 2, an integer replete with numerological significance and magical qualities. If we used 32 pixel tiles, we'd comfortably have a play area composed of six blocks of 8 x 8 tiles. We decided to base any eventual procedural generation on this geometry. Now of course, I can already hear you lot whispering: "But what about noise generation? What about random rooms using physics boxes? Or waveform collapse? Or A-star that Godot has an object for? Look. I don't know what any of that stuff is! Heck, I didn't learn until a week after the jam how to make a camera follow a dude around. You can look back at all our previous games - all single screens! This 6-block format was immediately attractive to us because we strongly suspected that trying to have our main coder learn something more exotic would be project management suicide. The six-block format was closer to our actual skill level as devs, would let me contribute to it, and would still offer good variety.

Much as with mobs, the game spent most of development with a very limited number; just three 8x8 map blocks in addition to a fallback block, which was a block that has both mob and PC spawns and was composed entirely of empty tiles. Some hasty logic was put in place to put those in if map generation screwed up somehow. The composition was, at this point, totally random. We were now into the third day (the first part of it, just before I also fixed mobs) so there was no question of rewriting the placeholder entirely. The question was how I could improve it and expand it horizontally within my own abilities without taking up too much of the main coder's time. One part of this was that I spent a great deal of time playtesting my own game. The foundation of procedural generation, I believe, is doing the thing enough to come up with some rules and then taking those rules to generalise more and more. Letting RNG do all the work is bound to create insanity that needs to continually be patched by more and more rules. Gaze at the abyss and it will look back. One of the regrets we have is that we didn't put in the cheat early (because I, in fact, cannot clear my own game) so a lot of the bugs that crept in were related to later levels but that's an aside. Testing was also key to putting the player's speed, rate of fire and spread of fire values to where they were at launch. The player gained a great deal of speed from early development versions and then lost most of it again when we were sure we would have time to put in powerups. Rate of fire was greatly increased because shooting more bullets feels good and mobs were given escalating hp to compensate. Finally, accuracy was placed where it was and then tightened up a bit post launch in the balance patch.

While testing, one of the immediate concerns I had was that spawning next to mobs sucked because the timer is strict and most likely, every player hits every level with one direction key or another held down. So mob and player spawns had to be separated. The magic circle shares a spawn with players and I wanted it to be in a different place from where the player starts some but not all of the time. Finally, we needed to make sure every map was clearable. The simple implicit rule that all the existing blocks followed up to then was to keep blocks 4 and 5 clear at the edges of every rank and file, guaranteeing corridors between every block. That became very noticeable however, so I needed at least something to break that up some of the time. So what about blocks that break that rule? With two of them, it was possible to seal off a corner of the map and make it unclearable. Now obviously I could have done more sophisticated manipulations with the positions of the blocks and their orientation and so forth but with relatively limited time, I went with a simple rule of only having one block at most that would break this rule and also added an additional rule that every single block's spaces had to be contiguous - you can shoot every space in a given block that could spawn a mob no matter which side you enter from. In order to guarantee this composition, I split the blocks into three pools and then sat down and made about sixty of them. This is what it looked like in the end:

blocks.JPG

Is it elegant or sophisticated? No, but it works and it was something we knew that I could handle and expand upon when the time came. Every block is just a bunch of arrays describing the tiles that the game needs to set into each cell when the map is built. Then there's a list of spawn points for mobs, whether or not it can spawn a player or magic circle (requires a 4x4 cross in the middle). The blocks are split into three (or I guess four) pools:

Spawn Blocks contain no mobs and all have a clear area, clear exits in the middle of each side, and can spawn a player or a magic circle. There is one guaranteed per map and a 33% chance of a second.

Dead Blocks disobey the clear exit rule, even though they might be relatively clear overall. They may or may not spawn mobs or players/circles but never both. If you look at the screenshot above, the top right block is actually a dead block. It seems relatively open, but it is classed as Dead because it does not allow access from the middle of the top or bottom sides. There is a 50% chance of having one on a map, and a 50% of there being none.

Normal Blocks spawn mobs but not players or circles and have clear exits.

Fallback Block: In all of the testing we had, we had a single report of this actually triggering. It's extraordinarily rare and I think it requires the RNG to pick a certain set of blocks combined with a certain set of mob encounters that require large numbers of spawns. Hell if I know. That isn't fixed. If you're extremely lucky, you should technically still be able to cause a fallback map to spawn.

In this way, we went from "We don't have enough map!" to "We have enough blocks that I can comment out a few if they turn out to be problematic. One of the candidates was the infamous death corner:

deathcorner.jpg That is, it is infamous among those who have played this game and tasted the fearsome Corner Orange.

During testing, I did notice that this formation of blocks was maybe the most difficult the game had to offer. The bottom left block isn't a Dead block because it allows entry from all sides (it only looks blocked at the bottom because of the final outer wall). However, it has less clearance than other blocks so you can only loop around the north if it happens to be end on against the wall of the arena. Put a high hp enemy in the corner, like an Orange, and it can easily end your run. In the end though, I didn't remove it and maybe that's why this game still hasn't been cleared yet by the community though several have made it into the mid thirties.

Now come! Cast your lot and fulfill our Accord. We pine for your presence! Throw yourself unto the Abyss of Bottomless Time and taste the bittersweet futility of the Corner Orange.

Witch Contractor: https://ldjam.com/events/ludum-dare/51/witch-contractor

Ludum Dare 53

WitchDelivr - Actual Proper Sprites

First of all, come play this thing. Rate it. Give us attention and validation!

splash-v2.png

I don't think two years ago when @alpacalypse and I started doing this that we foresaw being where we are right now. Six jams our of six where we manage to produce something reasonably complete and three out of three where we consciously aimed for (and got) clean launches without major bugs. We only had two bugs this time around (one of which has been fixed) and I'm not sure that anyone noticed either before we did. Hopefully, we continue the trend of producing something better and better each time.

I'm the one who does the art for our games but I'm not really a pixel artist. I mostly don't do art outside of LD and whenever the jams come up, I learn a bit more and then just try to muddle through by referencing whatever turns up on google and mimicking what actual artists do as best I can. Traditionally, graphics is one of our team's weakest categories. (Innovation was traditionally our strongest but we swung that so far out of our newbie park with 1001N that we've been actively avoiding it, but that's another story.)

Over the last two games, we identified that the weakness was a lack of art direction. Even though I managed decent art here and there, the different parts never really came together. 1001N (LD50) just had pieces of art placed around to fill the screen resolution and we were using totally default sans serif text and filler bar. The icons were designed to be readable but had no stylistic direction. In WC (LD51), I managed to have a tileset but it only covered the walls and some blood splatters while the background floor was just some Paint.NET filter. The item icons I think were okay but some had black outlines while others didn't. The mobs were just whatever came to mind that could be animated quickly and rudimentarily with Piskelapp and had no real theme and the heroine was 62 pixels tall and didn't mesh with either the mobs or the tiles. I'd given her a glowing ring to indicate her hitbox but the fact she wasn't the same size as her surroundings was still one of the most noticeable criticsms.

For LD53, I made it a mission to improve the graphics as much as I could.

screen-03.png

After the theme arrived, we rapidly settled on the idea of Kiki's Delivery Service with a bit of social commentary set either in a single tower block or a street with multiple buildings. Because the gameplay would be so simple and the setting so small (in fact, we think we underscoped this time around, which is not a complaint many LD teams have I'm sure) the game would have to lean hard on visual appeal, which was exciting but intimidating. About 40 minutes into the discussion I said "Let's just take it on" and from then the ball got rolling.

WitchDeliver would become our first game with "proper" sprites and "art direction". The art direction wasn't much at all. Initially I only gave myself two rules: -I'll use the default palette of Paint.NET and stick to those colours. I don't know why they are what they are but maybe someone smarter than me picked them for a reason. -Pink and Cyan are pretty 80s, punky and cool.

I looked up how one might pixel a witch and found good examples at 16, 32, 48 and 64 pixel height. I eventually settled on 24. The biggest factor was that in order to have a unified art direction, all the sprites should have the same level of fidelity and 24 was the most I felt I could handle and still produce a reasonable number of assets. That was the next rule - people are approximately 24 pixels high and everything else scaled from that. Hence each floor of the buildings became 48 pixels high and so forth. In order to make procedural generation of pedestrians work with the palette, I imported the whole thing into a bunch of arrays by hue and parts with highlights were separated into two parts, one of which would have a colour two darker than that of the other. This all turned out to be a bit of a trick since apparently Paint.NET and Godot don't quite speak the same language as far as colours are concerned. Thanks to @alpacalypse taking over music and the overall mechanical parts being so light, I was in full Horizontal Mode by 36 hours. One window with no variation or open state became four windows with four variations, each with an open state. Two stores and two doors (from which pedestrians spawn or despawn) became ten and ten, which was enough for us to enforce uniqueness during generation. And barren roofs and alleys came to life with multiple layers of doodads. All in all nearly 300 frames of sprites plus procedural generation of dogs, pedestrians and the street, so we managed quite a bit of variety. Most importantly, having some direction to the art seems to have worked well if the comments are anything to go by. Crucially, some of the most frequently criticised assets were the delivery markers and the arrows, which is great because those were hastily implemented prototype assets that we somehow never got around to replacing (with three hours to go, we decided we needed dogs instead). The fact that people caught onto those flaws is pretty affirming.

Okay, I'm done. Go play and rate! https://ldjam.com/events/ludum-dare/53/witchdelivr

Ludum Dare 56

one (1) a cute

It still doesn't take much for me start humming the Portal song to myself.

huge-success.png

Ludum Dare 57

trust

copy.PNG

Doors is a great theme

Trust me. Doors is a great theme. Doors are primal. We've had doors and entrances since we've had shelter, which is longer than we've had some other pretty primal things, like planting seeds for example. You probably live on seeds as food, but many of us can go a few days without seeing a whole one. The fact you're reading this lets me know 100% you're in the same room as a door, or you can see a door across the road, or you're in a car with four of them. The idea of door has a ton of words in various languages and it's lent its meaning to everything from abstracts like life paths and opportunities to weird tech nonsense like networking. It can take any verb you like and to door can be a verb too. It's simultaneously the least constricting yet most directed theme in the lot.

Doors is a great theme.

Please vote doors.

doors.PNG

Ludum Dare 58

We are at 62.875% capacity

Let it be known that due to a combination of health, work, scheduling and things_happening, our team be at 62.875% productive and creative capacity and my posting this hereby affirms our commitment to appropriate project scaling and mental health.

But we're in.