About SteveSalmond (twitter: @stevesalmond)

Game Developer based in Auckland, New Zealand.

Entries

 
Ludum Dare 35
 
Ludum Dare 34
 
Ludum Dare 32
 
Ludum Dare 30
 
Ludum Dare 29
 
Ludum Dare 27
 
7dRTS

SteveSalmond's Trophies

SteveSalmond's Archive

Mr. Squiggles Hungry!

Posted by (twitter: @stevesalmond)
Wednesday, April 20th, 2016 7:18 am

Just a bunny, doing bunny things..

Pointless room rotating mechanic!

AlteredBunnyLoop30fps
Gratuitious splash screen!
Title

 

Altered Bunny

Check it out here!

Once more unto the breach, dear friends, once more..

Posted by (twitter: @stevesalmond)
Friday, April 15th, 2016 4:55 pm

Think this will be #5 for me.  Good luck to everyone, may your jam be fruitful!

Links

Tools

  • Unity 5
  • Visual Studio Community 2015
  • Photoshop
  • Audacity
  • Garageband

Plugins

We’re In!

Posted by (twitter: @stevesalmond)
Friday, August 21st, 2015 7:19 pm

Trying the Jam this time with my friend Moritz.  We haven’t come up with a team name yet… :)

Tools

  • Unity 3d
  • Photoshop
  • Garageband
  • Audacity
  • Blender
  • GitHub + Sourcetree

Vac ‘n Smash Post Mortem

Posted by (twitter: @stevesalmond)
Friday, May 1st, 2015 5:41 am

Here’s a post mortem for Vac ‘n Smash, a game about hoovering up junk and recycling robots. You can also view this post on my site.

I’ve organized this one as a running commentary, interspersed with some playable progress snapshots from the game (the ones with the ‘play’ button overlay). These were generated by winding back to selected moments in the project’s Git history and building the game as it existed at that point in time.

Day 1 (+0 hrs): Theme announced

The theme for this jam was ‘An Unconventional Weapon’. I had looked at the 20 shortlisted themes the night before and made some notes about possible game ideas, but hadn’t considered this one at all. Unfortunate! Spent about an hour trying to think of a good game concept. Tentatively settled on a ‘randomizer gun’, a cross between a poker machine and a weapon. The gun would have 3 dials, each controlling a different aspect of behaviour. For example, the first dial might have entries like ‘Mighty, Slow, Tiny, Huge’, the second ‘Double, Bouncy, Reflecto’, and the third ‘Rabbit, Baseball, Tomato, Vortex, Cat’ etc. So by pressing the Random button you might get a ‘Mighty Double Cat Cannon’ or a ‘Tiny Bouncy Tomato Launcher’. The player would get powerups that would let them press the Random button. Well, that was the idea at least. I hadn’t really thought about how much work that would mean.


A set of projectile sprites for the ‘Randomizer Gun’ concept (later discarded).

Day 1 (+7 hrs): Basic player movement

The first thing I did once I had a basic game idea was to paint a hero character, then sliced it into pieces and created a spritesheet. Next was putting everything back together by building a 2D animation rig in Unity. Once the rig was assembled, I started coding up a player controller script. This converts control inputs from the player into forces that are applied to the character’s physics simulation. I continued to play around with player movement for a few hours, implementing jumping and tweaking physics settings. It’s surprisingly difficult to get a good control feel when you drive player motion using the physics system.


The player is built from a set of 2D sprites connected together in a rig.

Day 1 (+7 hrs): Basic player movement

Day 1 (+12 hrs): Parallax Background

After a while I tired of messing with the player and decided to add some more graphics to get motivation levels back up for the next day. I was really keen to try out 2D parallax scrolling, and ended up spending a number of hours creating a moving background layer. This stage was a lot of fun, but I think I got tired and spent too long here. I ended up using a perspective camera and placing the background elements at various (+Z) distances from the camera. This technique gave a nice convincing parallax effect, but was a bit inconvenient to edit. Called it a night about 1am local time.


Graphic elements used to create the backdrop.

Arranging elements in the scene – further objects have greater Z values.

Day 1 (+12 hrs): Parallax Background

Day 2 (+22 hrs): Vacuum Gun

Woke up the next day and realized the Randomizer Gun concept was probably going to be too much work. I ended up deciding on a Vacuum gun instead, can’t remember why though. Perhaps I thought it would be nice and simple to implement.. :) I guess that was it, as the basic gun system didn’t take too long to get up and running.


Day 2 (+22 hrs): Vacuum Gun

I implemented the Vacuum gun by taking advantage of Unity’s 2D physics system. For Intake mode, all that was required was to identify nearby objects by casting a circle away from the gun’s muzzle, then applying appropriate forces to those objects at each physics simulation update. I made the applied forces diminish over distance, which gave a nice feel to the gun. A circular trigger area at the gun’s muzzle detected when objects entered it, and ‘captured’ those objects by hiding and disabling them, adding them to an internal tracking stack. Exhale mode was a pretty straightforward projectile setup – pop an object from the stack of captured items, place it at the muzzle’s position and give it a large initial velocity to kick it towards the target. There was a fair bit of tweaking to do after that, but the basics were in place to smash stuff up!

Day 2 (+26 hrs): Breakable Robots

The Vacuum gun was pretty fun to play around with, but there was nothing to shoot at yet. This is when I came up with the idea of robots that you could smash into parts by firing junk at them. You could then use the robot parts as more ammo for your gun! Seemed like an interesting plan, but I wasn’t sure how fun it would end up being.


Day 2 (+26 hrs): Breakable Robots

The initial implementation used 2D hinge joints to tie everything together. This gave nice results when breaking the robot into pieces – simply destroying the joint component did the trick. However, there were a few issues that forced me to try a different approach. Firstly, I couldn’t easily make the robot change it’s facing direction from left to right. For the player I just flip the rig’s X scale from +1 to -1 when they face left, but doing this to the robots made all the hinge joints completely freak out. Secondly, it looked like it was going to be tough to animate – I would have to apply torques to joints at appropriate times to make it move properly. I ended up ditching joints and directly animating the robots, same as the player. Bit of a shame, but it saved some time.

Day 2 (+32 hrs): Music

Once the first robot was up and running, I whipped up some music in Garageband. This is one of the highlights of the game jam for me, as it’s a rare opportunity to get away from coding. Of course, I almost immediately started feeling worried about all the stuff left to do, and rushed through the music creation process as quickly as possible. I would like to allocate a bigger budget for this phase next time around.

I started by messing around on the keyboard looking for a catchy hook, added a few drum layers, then a bit of subby bass to thicken things up. That was pretty much it! I went with 120 bpm because it makes the calculations for seamless looping super easy. Also, visual effects set to run at 1Hz or 2Hz feel properly synchronized with the music.


Day 2 (+32 hrs): Music

Day 2 (+36 hrs): More graphics!

Fatigue was seriously setting in at this stage. I decided to relegate all remaining gameplay stuff to the final day, and focus on getting some more 2D artwork ready to go. This was nice and relaxing – just set some music blasting, gulp down endless cups of tea, and paint away. Not too much brainpower required!


Character sprite sheet.

Environment sprite sheet.

Day 2 (+36 hrs): More graphics!

Day 3 (+43 hrs, T-5 hrs): Victory condition

When the final day dawned, I realized that most games have a victory condition and a failure condition. This one had neither, yet. After a brief panic session, I decided to make the game about recycling! I mean, who doesn’t like vacuuming the house and collecting up trash? I quickly whipped up some recycling dumpsters, then coded up some logic around collecting the robot parts and shooting them into the dumpsters. Job done! In the final frantic rush, I neglected to add clear instructions about how to win the game. Oops. I did add some signs to that effect, but in hindsight they are too subtle – most players seem to treat them as background art and filter them out. A lesson for next time – always put clear instructions in the game!


Day 3 (+43 hrs, T-5 hrs): Victory condition

Day 3 (+48 hrs): Submission

This one went right down to the wire. There was a last minute problem with exporting the Web player build, probably due to a beta version of Unity. Managed to get around it by installing Unity 5 and building from that instead. Luckily the automatic project upgrade went very smoothly. I created a quick logo in the dying minutes and captured a few screenshots, uploaded to itch.io, and crossed my fingers. The Ludum Dare site stayed up throughout submission hour – big props to Mike Kasprzak for his recent work there. When the game was finally submitted, I crawled into bed in the middle of the day and promptly fell asleep. Good times!


Vac ‘n Smash!

Day 3 (+48 hrs): Submission

Final thoughts

I really enjoyed the jam this time around, and am pretty happy how things went overall. There are still a lot of things to work on though:

  • Coming up with a solid game idea up front, and taking time to explore the design space.
  • ‘Snappy’ control feel (it still eludes me!)
  • Allocating enough time for level design.
  • Spending more time on music.
  • Teaching players how to play directly in the game.

Oh well, should be fun next time around. See you then..

You can give the finished product a go here:
Play Vac ‘n Smash!

Recycle Robots with extreme prejudice!

Posted by (twitter: @stevesalmond)
Wednesday, April 22nd, 2015 5:54 am

Here’s a little sequence from Vac ‘n Smash showing off the mighty Vacmaster 3000 (TM) in action.

You can give it a whirl here:
http://ludumdare.com/compo/ludum-dare-32/?action=preview&uid=24965

In

Posted by (twitter: @stevesalmond)
Friday, April 17th, 2015 5:10 pm

This will be my 4th LD now – super excited!  Best of luck everyone – may your code flow freely, your sprites be sick, and your tunes be badass :)

Engine: Unity 3d
2D: Photoshop
3D: Blender
Music: GarageBand
Sound: Audacity
Coding: VS 2013, C#
Libraries: Maybe InControl, iTween or DOTween, possibly Tiled2Unity.
Hosting: itch.io

John and the Arbitrary Gem Hunt – Post Mortem

Posted by (twitter: @stevesalmond)
Friday, August 29th, 2014 12:39 am

final_screen_01

Play the game here!

 

Introduction

Well, as usual there were a bunch of amazing entries. Congratulations to everyone who finished a game! I’ve been reviewing a bunch since then and can highly recommend the following:

As for my own efforts, I’m pretty happy overall with how things went this time around. Read on for the good, the bad and the downright ugly!

What went right

Freeform gravity field

I think some technical aspects of the game worked nicely, such as the gravity system. I came up with a technique to allow the player to feel attractive forces from arbitrarily shaped objects in the scene. Basically, the game fires out a bunch of rays from the player every frame, looking for nearby surfaces marked as ‘Ground’. It then averages out all the surface normals (weighted by distance) and comes up with an overall gravity direction. This means you can smoothly transition from running on a planet surface to climbing a beanstalk, and can jump off the end of a stalk and ‘freefall’ to a nearby planet. Neato! The key method looks like this:


/** Return a gravity force vector, given a point in world space. */
public Vector3 ForceAt(Vector3 point)
{
  // Scatter rays out randomly, looking for solid ground.
  // When we hit it, accumulate the resulting surface normal.
  Vector3 gravity = Vector3.zero;
  for (int i = 0; i < Samples; i++)
  {
    Vector3 direction = Random.onUnitSphere;
    if (Physics.Raycast(point, direction, out hit, GroundMaxDistance, GroundLayers))
      gravity -= (hit.normal * 1 / (hit.distance * hit.distance));
  }

  // Return the overall gravity direction.
  return gravity.normalized * Strength;
}

I then use this gravity vector to apply force to and orient the player. You can check out the full source on GitHub.

Beanstalk growth algorithm

A pretty straightforward system, but injected some much needed life into the game. The beanstalk is created using a set of growth rules. At each stage, the plant figures out what possible rules it can apply given the current growth state, then performs a weighted random selection to pick one. The selected rule then produces some stalk or leaf pieces that are positioned in the correct location, and scaled up over time using coroutines. You can find the relevant code here.

 

Go go gadget beanstalk!

Go go gadget beanstalk!

GarageBand

In previous Ludum Dares I have either used procedural music or recorded myself playing some bad guitar/drums. Luckily, I stumbled upon GarageBand a few months ago. What a great piece of software! It’s really easy to lay down a few notes, fix the timing/emphasis and loop them, add the next layer, and so on. Before you know it you have something that sounds like music!

 

What went wrong

Vague initial concept

When the starter gun fired, I quickly decided to make something involving orbiting planets (a sort of orrery puzzle), and jumped straight into coding up a system for free-form gravity. It became clear as Day 1 progressed that moving the planets in orbits was going to be a bit tricky. With a naive implementation, the player was bouncing off planets or being left stranded in space as they drifted away!

I would have had to figure out a way to reset the physics system when the player touched down, so that the planet became the new ‘center of the universe’ – stationary and centered about the origin. I think that should be possible, but it seemed too big a challenge to my frazzled brain at the time.

Without orbiting planets, I suddenly realized that I had no core gameplay mechanic to work with! I had some ‘bridges’ between the planets, but the whole thing seemed like it might turn out to be extremely boring. The beanstalk idea was a bit of a Hail Mary, born on Day 2 out of sheer desperation.

Initial Concept

Initial Concept

Floaty controls

I had a lot of trouble with getting the controls to feel good. In the end they turned out very ‘floaty’, like you’re skating on ice. I have a pretty good solution for that in the pipeline, which incidentally make the beanstalk climbing feel better too.

Crazy camera

A number of reviewers mentioned the camera going crazy as they climbed – I think the beanstalk leaves were causing that. I had inadvertently marked them as both solid and gravity-inducing, so you can get into all sorts of trouble if you bump into them. This one can easily be fixed by moving the leaves onto a different physics layer.

Limited gameplay

I ran out of time to implement enemies or other interesting gameplay elements. The plan was to have a hungry giant wandering around on each planet, giving you a definite incentive to jump from one to the next at the right time! The gems are a pretty but kinda cheap solution I shoehorned in at the eleventh hour (hence the name of the game).

Future work

I’ve been doing a bit of work towards a tidied-up post-compo version. A few of the improvements I’d like to get in:

– Improved control feel.
– Enemies (or at least other lifeforms – giants perhaps?)
– Fix beanstalk leaves
– Experiment with orbiting planets?

Well, that about wraps it up for this one. Hope to see you at the next Ludum Dare!

Play the game here!

Planetary botanist?

Posted by (twitter: @stevesalmond)
Saturday, August 23rd, 2014 1:53 pm

Spent the whole of yesterday coding without a clear idea of gameplay.  So stressful when you don’t have a strong idea in your head!  Woke up this morning with a harebrained scheme involving procedurally generated plants. Like Jack and the Giant Beanstalk, but between planets! This game could crash and burn if it doesn’t pan out, but I guess that’s part of the fun, right?

Second Concept

 

Now for the minor problem of building the damn thing…   It cheers me up to think that there are a ton of like-minded people going through the same challenges.  Let’s get cracking ladies and gents!  If you’re struggling, grit your teeth and push on through – you’ll be proud of yourself at the other end.

EDIT: I have dev blog going at http://stevesalmond.com/ludum-dare-30/ for posterity.

In with a grin

Posted by (twitter: @stevesalmond)
Friday, August 22nd, 2014 1:10 am

I’ve been looking forward to the next LD for at least 3 months!  Who knows what wonders the next few days will bring? :)

Tools:

  • Unity – for the game engine
  • Photoshop – for 2D graphics/textures
  • GarageBand – for music!
  • Blender – for 3d (maybe)

Let’s have some fun and make some sweet games ladies and gents!

Finito!

Posted by (twitter: @stevesalmond)
Sunday, April 27th, 2014 4:53 pm

Didn’t think I was going to make it, but here we are!  I present to you..  Berserker!  A game about a mighty barbarian with anger management issues. Gameplay Obligatory screenshot: Berserker You can give it a try here: Ludum Dare 29 – Berserker!

I’m In

Posted by (twitter: @stevesalmond)
Friday, April 25th, 2014 3:38 pm

Hi guys, this will be my second attempt at LD. Should be fun!  Best of luck to you all :)

Software

  • Unity3d
  • Photoshop
  • Blender
  • Audacity

Badger Bolt Complete!

Posted by (twitter: @stevesalmond)
Sunday, August 25th, 2013 3:24 pm

Made it to the finish line.. 😀
Check out Badger Bolt!

Badger and friends

Update 006

Posted by (twitter: @stevesalmond)
Sunday, August 25th, 2013 5:16 am

Okay, I’m pretty much wrapped up for tonight (GMT +12).  Turns out Ludum Dare is a lot of fun!  Any last minute suggestions are most welcome, by the way.  Not sure if I’ll have any time to implement them though.. :)

Play Badger Bolt in your browser!

BadgerBoltLogo

Controls: WSAD/Arrow keys to move, space to jump. ENTER to go fullscreen.

Update 005

Posted by (twitter: @stevesalmond)
Saturday, August 24th, 2013 9:55 pm

Hope everyone is having fun! 😀

‘Badger Stroll’ now technically qualifies as a game, I think.  Stretch goal: make the game more interesting, and hopefully enjoyable..

Play Badger Bolt in your browser!

Controls: WSAD/Arrow keys to move, space to jump. ENTER to go fullscreen.

The finish line is in sight!

Update 004

Posted by (twitter: @stevesalmond)
Saturday, August 24th, 2013 5:26 pm

The game is slowly starting to take shape.  I’m going for a ‘tortoise versus hare’ racing scenario, except with a badger and rat thrown in. :)  The plan now is to get some obstacles and powerups in there ASAP, and figure out the game over conditions.

Play Badger Bolt in your browser!

Controls: WSAD/Arrow keys to move, space to jump. ENTER to go fullscreen.

Badger and friends

 

Update 003

Posted by (twitter: @stevesalmond)
Saturday, August 24th, 2013 5:41 am

One last update before catching a bit of sleep.  I present ‘Infinite Badger Runner’ for your consideration, 10 second edition.

Play Infinite Badger Runner in your browser!

 

Run, Badger, Run

[cache: storing page]