About pkenney (twitter: @pkenneydev)


Ludum Dare 37
Ludum Dare 35
Ludum Dare 34
Ludum Dare 33
Ludum Dare 32
Ludum Dare 31
Ludum Dare 29
Ludum Dare 28

pkenney's Trophies

pkenney's Archive

Turn-Based for a Change!

Posted by (twitter: @pkenneydev)
Saturday, December 17th, 2016 5:39 pm

Previously my games were arcade-type action games, and I felt confident about being able to make them.

This time I tried something turn-based, and was a bit worried going in!  But I’m fairly content with the result, I think it’s fairly satisfying to splat slime on these demonic teddy bear things and watch them go up in a sploosh of blood!  That’s what they get for trying to steal my eggs.

I’ve also been pretty happy with my transition from pixel-style graphics to vector-based graphics.


I’m In, #8 but also a first

Posted by (twitter: @pkenneydev)
Friday, December 9th, 2016 10:17 am

All 7 times I’ve used the same custom starter kit.  It’s realtime, and physics-based.  I know it works, and how to design for it.

For #8, I take a new weapon into battle:  A turn-based, grid-based kit I’ve been building.  It has flaws.  Turn-based games have different design problems I’m not familiar with.  Risk++, not sure how it will go… but excited to find out.


  • Unity
  • Inkscape or GraphicsGale
  • Reaper+VSTs and my MIDI controller, or BFXR

I’m In

Posted by (twitter: @pkenneydev)
Friday, April 15th, 2016 7:52 pm

I’m in for my 7th solo-compo LD.

Last time I got first place in compo Fun, which was always my target category.  I guess now I have to try something new!

So this time I think I’m going to switch from a pixel style in GraphicsGale to a vector style in Inkscape.  It will still be programmer art but hopefully I can learn basic competence and/or blatantly rip off real artists.

Here is my art test…


art test



Yeah, it’s a blatant ripoff with tweaks, from the famous tutorial here:


For sound effects I will either use the traditional bfxr, or I may revisit the process I improved last time with PsychoTennis, which is to use a chiptune synthesizer as the core of my sound effects, and apply a bit of music theory to make them harmonious.

For an engine I will use Unity, and I will begin with my “Unity LD Starter Kit” codebase.  Since I’ll be using UnityGUI instead of the “old stuff” this time, my codebase will be lacking in some UI bits, which could prove trouble… or maybe will go smoothly.  Right??

It’s extremely unlikely I will attempt music for the first time during the compo.

Have fun, everyone!

#1 in Fun?? Guess I’d Better Do That Update!

Posted by (twitter: @pkenneydev)
Tuesday, January 5th, 2016 7:55 am

Thanks for #1!!

Thanks everyone for the kind words and generous votes for my game, PsychoTennis, which placed #1 in the compo for Fun.

I am already expanding the game so that it offers a deeper experience rather than just the fun quick play that it has now, and this gold metal is a real motivator.  If you’d like to hear when a new version comes out, then follow me on twitter @pkenneydev and I’ll keep you posted.

If you haven’t seen the game in action, you can get a quick idea from this shot here:


Shooting for Fun

Since I’m just a programmer (and I guess “designer” too?), Fun is always the category I’ve focused on across my 6 compo Ludum Dares.  Learning enough art and sound skills to get by has been a fantastic experience, but I never had a goal to win those categories.  So it really is a huge thrill for me to land in the top spot in Fun.

I learn new lessons every single time I do an LD, but as you can see, it has not been a straight upward trajectory:


Failures and Lessons Along the Way

A few comments on the 2-game downward trajectory may be worth making.

In LD31 my fun score started to go down, but it was a valuable lesson.  That’s one my own favorite games, but I made it too confusing.  That game was actually my biggest success after I dramatically streamlined it in a post-compo build, as it was featured on GameJolt and got a small write-up on RPS, drawing several thousand players to try it.  So it’s a dip on the graph, but one I’m very happy with.

LD32 on the other hand was a total unmitigated disaster, and showed me that a GameJolt feature didn’t mean I couldn’t still get my ass kicked hard.  The core mechanic simply was not fun in that game, and honestly the ranking there was maybe a bit generous from you fine folks.  I think my main takeaway from that experience is that indirect methods of player control risk being too uncontrollable, and they can tank the entire experience by giving the player no agency or control.

So I was a bit scared with the tennis ball interaction in Psychotennis.  Could I make it FUN to hit the ball?  Could I make it CONTROLLABLE?  I spent an awful lot of time in this LD simply hitting the ball against the wall, over and over and over without even having any bricks, and trying to make the impact feel really good, sanding off any rough edges, and trying to create visibility into the way the ball was coming off the racket and why.

And apparently it paid off!  I feel like I slayed the demon of my LD32 failure with this win, and I’m excited to see what happens with a bit of an update.

Post-Compo Goals, and Call for Comments

My goals for the update:

  • Reward a longer play session with a more meaningful feeling of progression
  • Smooth out the difficulty curve once you’re past the first few levels.

I have some concrete ideas I’m in the middle of implementing, but if you have some thoughts of your own I would love to hear them in the comments below.

Also I’m having a kind of “now what?” feeling in terms of what to do with an updated version if I make a nice one.  I welcome any wisdom about that as well.

And is there something I can do to kind of bump the art up a level?  I’m somewhat happy with it but it’s not great.

Thanks again for the honor, everyone!  Don’t forget to follow @pkenneydev on twitter if you’d like to hear when there’s an improved version to play.

Expanding Psychotennis to Best-of-5 Matches

Posted by (twitter: @pkenneydev)
Sunday, January 3rd, 2016 5:09 am

I think my game Psychotennis works pretty well as a quick LD game, where you can expect a player to sit and play for a bit.  It’s quick and fun with a very short game loop, so there’s a minimum of fluff and just straight gameplay.

But for a post-compo expansion I would want to reward a longer play session.  To that end I’ve already changed the game from a one-game Match, to a “Best of 5” format, where you advance to new Matches by winning 3 games, and the fail/retry loop is at the level of this larger Match.

This also invites the idea of an “Adversary” who can apply some character to the procedural generation of levels and make a few taunting comments for some flavor.

Of course, expanding in this way can be at odds with a tight game loop, and mapping out the new expanded game flow in advance helps me to know what I’ll need to build before jumping into coding.

So here’s a map of the game flow before and after:


I made this map pretty easily on draw.io and it helps me to minimize the button presses required from the player to move between states (Red) and know what I’ll have to implement in terms of UI (Blue) for the various states.

Data-Driven Procedural Level Generation

Posted by (twitter: @pkenneydev)
Saturday, January 2nd, 2016 5:05 am

For most of my LD games I go with procedural level generation, rather than hand-crafted levels.

Why Proc-Gen?

I’m always shooting for the “Fun” category, and I’m aiming for a cocktail like this:

  • A core physics-based action that’s fun to just do on its own.
  • Obstacles with some variation, that can be procedurally mixed up in varied combinations
  • A quick retry loop so the “you lose” moment gets the “one more try” response rather than the player quitting
  • A score mechanism that lets the player be challenged but doesn’t overly punish someone just having a good time

I don’t always succeed in getting the balance right – for example my LD29 game about navigating a ship between icebergs was far too difficult to be accessible.  LD31 was much too confusing.  LD32 was a total failure because the core action simply wasn’t sufficiently controllable.  So there are many pitfalls,  but when it works I feel like this is a good approach, at least for me.

The procedural generation is a key piece because it keeps the game fresh, even for myself, and facilitates that “one more try” feeling upon failure.  LD games are played in a quick sitting to evaluate, so I hate to ask the player to repeat anything.  I don’t even send them back to the start of the difficulty curve when I’m doing generated levels… I want them to push one button and immediately be back in the flow but seeing something new.

How I Approach Proc-Gen

I have developed a bit of a system…  here is a screenshot of me mapping out the difficulty curve and then adding elements to my level generator in Unity:


On the left in the spreadsheet I have mapped out what I want to achieve in a sort of visual way.  In Psychotennis the player is on the left, bouncing  a ball to break bricks, like this:


The different bricks have different behaviors, some taking more shots to break and others hitting the ball back to you with various amounts of speed-boosting.  So it’s important to make sure they’re placed in some meaningful way.

Designing the Generation

You can read the spreadsheet (which is the design doc) like this:  Each row is a “match” aka a level, and each column is a possible placement of bricks.  In the early matches 1-5, the player should face bricks relatively far away, consisting of fluff and a bit of “light structure” which is a term I use to describe bricks that take more than one shot to remove, and thus create a durable shape to each match.

By the midgame we have threats in the back portion, covered with some structure, and a bit of easy-to-clear fluff nearer the player.  By the endgame there’s a complex sandwich with a few threats close to the player, which are especially hard to deal with.

You can also see that although there are three big “zones” of 1-5, 6-12, and >12, I do some additional minor transitions, such as levels 6 and 7 lacking the “fluff” nearest to the player.

So creating that spreadsheet is how I design the difficulty curve and overall shape I want from the procedural generation.

Implementing the Generation

Looking back at the screenshot, in the Unity editor on the right you can see how I enter this design into the game’s level generator that I wrote.  This is a critical bit – although there is a lot of custom logic in the generator, it is even more driven by the data that I enter, which allows me to more rapidly input/edit the design.

I create a series of entries, each of which defines a range of “layers” (the horizontal position) at which this entry can be spawned, as well as a level range at which it occurs.  Then there are a set of four prefabs, one brick each, representing what will be placed if this entry is instantiated.  It’s four bricks rather than one because I somewhat arbitrarily decided that I’d do the generation in “quads” of 2×2 bricks.  So I kind of generate by the molecule instead of the atom, if you will.

The weight is usually one, but can be adjusted to make certain entries more rare or common.  I put all eligible entries into a “Weighted Random Grab-Bag” and then pull from that bag to select the item to be instantiated.  A rather high “skip placement” chance is then applied, first at the quad level and then again at each brick level, which creates the empty spaces and makes the “shape” of each level different.  Early on it was a giant wall of bricks like atari breakout, but that was a lot more repetitive and thus less fun.

“Concrete” – the unbreakable bricks seen in the clip above – required a lot of care since they can create impossible-to-win levels and even get the ball completely stuck.  The game creates a “budget” for concrete that will not be exceeded, and has a lot of restrictions on where and how closely concrete can be placed.

A Flaw in the Approach

In general there is a problem with this pattern:  The player plays for a while, gets past the easy stuff and to their skill level.  If they lose, I make them restart but from the current level… so I generate a new level but don’t send them backward in the difficulty curve.  This works well for a while, keeping the player challenged.  But if they play for a very long time, they will get some lucky easy levels and push further into the difficulty curve.  Then they will be playing in an incredibly hard level and be stuck there, losing and losing.  Hopefully the game is still fun then, but it’s not a very nice way to leave them.  In post-compo work on pychotennis, this is the primary thing I’m trying to address.  The game just gets too hard and then strands you there.

There are other flaws in that a player can be served a bad level that is either too hard or too easy.  But with short levels and fresh generation each time, I don’t worry too much about this.  As long as the game is not generating totally game-breaking levels then I think it’s okay if the player has the occasional silly experience.

My Games Using This Approach

To see this in action, you can check out my current entry, Psychotennis.

If you’re even more interested than that, you can check out my games list page for past entries.  The ones that use this approach most clearly are Hammer Control and Splash Europa.


PsychoTennis Gameplay Example

Posted by (twitter: @pkenneydev)
Sunday, December 20th, 2015 3:42 pm


This is my 6th Ludum Dare compo, and I’m pretty excited because I think I’ve submitted my best game yet!

The sound effects I made with a new process I improvised during the compo, and they’re maybe my favorite part.  To see it in action with sound, you can check out the following youtube vid:

If I can get some time before the holidays I’ll write up a technical post on how I went about the sound effects.  Before the ones you hear in the game, I made a full set in my usual tool, bfxr, but somehow they just didn’t cut it…  So I used a more music-oriented approach and I’m very happy with the results!

Of course the full experience only comes from playing.  Here’s the game’s page on LD: http://ludumdare.com/compo/ludum-dare-34/?action=preview&uid=30865

I’m In – but I miss Unity’s web player builds

Posted by (twitter: @pkenneydev)
Friday, December 11th, 2015 9:47 am

I’m in for LD34 compo.  It is my 6th Ludum Dare.

My tools are Unity, GraphicsGale, and BFXer.  I have a personal “UnityLDStarterKit” which is code for a skeleton game that I use, boiled down from previous entries.  It helps to hit the ground running.

The loss of the Unity WebPlayer support in browsers is a concerning problem.  Test builds of the WebGL are not encouraging – they work, but the builds take a lot longer to perform, and result in a 140MB javascript file?!

140MB of javascript sounds insane to me, and obviously the experience is terrible for the user to have to wait for that to download.

My Unity WebPlayer plugin games, by contrast, were usually well under 1MB until I added sound, and then would go a bit over that.

So I am displeased by the 100x increase in download time that I feel I should expect my users to suffer.

I guess my strategy will be to build for two platforms:  PC standalone and WebGL.



I’m In!

Posted by (twitter: @pkenneydev)
Friday, August 21st, 2015 7:43 pm

My 5th LD compo will be telling.

Last time was the first time I thought I took a step backward, and wasn’t happy with my result.

So the ever-upward trend was bucked, and I was humbled.  Can I get back on track with LD33??


Unity5, graphicsgale, bfxr


Collision Problem Fixed

Posted by (twitter: @pkenneydev)
Saturday, April 18th, 2015 3:03 am

I guess in Unity2D you cannot have two objects that both check OnCollision colliding with each other, or it’s a coin toss whether they’ll both get the OnCollision event actually called.  Or maybe it’s just one of them?

Either way I cut the OnCollision from the player’s mirror shield and replaced it with a call from the projectile’s OnCollision so there’s just one function.  Now when projectiles hit it they consistently flash and tween.


(Wow everything still looks jerky at that frame rate!  Didn’t want to load a huge gif though)


Missing Collisions in Unity2D

Posted by (twitter: @pkenneydev)
Saturday, April 18th, 2015 1:31 am

I wonder why my collisions intermittently fail in Unity.  Note the times where the flash doesn’t appear and the debug count doesn’t go up.  All of these collisions should behave the same… strange issue.


(Wow juice looks so much worse in an animated gif with terrible settings!)


I’m In, 4th Time

Posted by (twitter: @pkenneydev)
Friday, April 17th, 2015 6:39 pm

No real jitters this time, I haven’t gotten wound up looking over the themes, and I don’t have some pre-formed idea cluttering up my head.  Am I too relaxed and open, though?


– Unity

– GraphicsGale

– bfxr

– My base code available here: http://savagehillgames.com/LD32/UnityLDStarterKit.zip

– Some other generative/transformative tools I may use.


This has been so much more brutal than my other 2 LDs.

I stayed up until 8am both nights because I had this jumble of game parts and a center, but it wasn’t coming together.  Then I finally saw what the game wanted to be…  it was so much further from my initial concept than either of my other LD entries.  I was very worried until I saw the proper scope finally at 11pm Saturday.  I commented out the jetpack and the guns, and now I have something that really surprised me because I never would have designed it.

If anyone spares a minute to try it out, I could use feedback.  I’m so fried I have zero clue if it’s fun, too weird, too confusing, too hard, too easy, or what.

You move with WASD, the rest should be discoverable by experimenting:

Sound is what it most needs, and light in-game instruction.  That’s tomorrow, though, I’m going to bed.  Hope I don’t sleep through submission time.
Good luck to everyone!


Before/After All-Nighter

Posted by (twitter: @pkenneydev)
Saturday, December 6th, 2014 5:59 am


Midnight Friday



8am Saturday after an all-nighter

Guess I’m gonna head to bed for some sleep now.  Four hours sound about right?

Arena Rotates!

Posted by (twitter: @pkenneydev)
Friday, December 5th, 2014 10:35 pm

All on one screen.  So I figure the screen should do something interesting, and that something should be the core of the game.

I decided the screen will rotate.

I have a long list of possible features but my first sprint here was to get an arena that rotates when the player walks over a trigger.  I accomplished this by rotating the camera and not the world, but of course this creates havoc with the coordinate system.  I anticipated this but I ran into a bit of trouble re-orienting the input vector to the world vector based on the camera’s rotation.

I’ve solved this issue and now I can rotate the world and still move around intuitively!

The tiles were made in SPArtAn, the rest is total placeholder.

Rotating Arena

Arena rotation accomplished

Additional Declarations of Dependence

Posted by (twitter: @pkenneydev)
Friday, December 5th, 2014 7:55 am

Going through my tools one more time and I want to make sure I report a few of them so I’m fully disclosed, and so others reading these posts might get ideas for tools to fill in the gap in their own toolbox!


I’ll declare that I’ve got a Shure SM58 Mic and a Mackie mixer, plus a few live instruments around the house, and while I’ve never done any live recording in previous LDs that’s a tool I might call on for sound effects, voice, or music bits.

I just discovered a program called Bosca Ceoil that lets you compose music in a way that I find straightforward and time-effective, so I’m going to declare it for the roster!  I have a terrible ear for melody (just terrible…) but a mechanical understanding of music theory basics so I might grind something out in there if there’s time.

There’s also a chance that if I can get a MIDI output from Bosca (and it doesn’t look like I can) that I will use that crazy GXCC tool to twerk the sound.


I also should declare the sprite generator from here on the LD site, I used it for creatures in my last LD game so I might try to avoid using it again, but I want it on the bench just in case I need to call it up.

I have still not found an entirely satisfactory palette generator, but there’s one here that I might make use of:  http://mudcu.be/sphere/

And I’ll likely end up using GifCam during the compo to upload animated gifs to the blog here.


Good luck to everyone this weekend!

[cache: storing page]