Almax

LD 41

Jeff From Accounting - A Retrospective [Code/Design]

Why hello there reader!

Following is a brain dump from my perspective of making Jeff From Accounting.

@hi-im-greg has covered a lot of the art process in his post which you can find here - a recommended read if you wish you know how to do a jam after having appendicitis... sometimes I think that boy is actually a machine.

I’ll be digging into the game design, gameplay systems and technical challenges I dealt with during the jam.

The Unity project - including code and assets - can be found on github here

[Spoilers] If you've not had a chance to play our game yet check it out here


Day 1

We started pretty late on saturday - around 12pm - with a coffee and fryup at a local café. Over food we discussed the theme but initially we were frustrated by the inherent juxtaposition of combining impatable things. We toyed around with some ideas we had pre-jam in unlikely pairings such as making a Dungeon Keeper clone rhythm game, but nothing really felt right. Greg was keen on making an FPS, something none of us had done before and I had been thinking about typing games like the classic ZType and Typing of the Dead. So we spun on that for a while and out popped the idea for reloading what you type, which led us to a typewriter gun and subsequently the office theme. Offices are boring though, and inspired by Davey Wreden’s excellent ‘The Stanley Parable’ we decided to go for a surealist styling.

Our work was kind enough to lend us office space for the jam so we cosied up in a meeting room and assaulted the whiteboard for an hour, sketching out the floor plan and trying to scope out features.

Whiteboard.png

After setting up the github repro and doing a bit of IT Crowd style admin we set off to work. Wanting to get something quick and dirty up and running for Greg to be able to move around the environment he was building I started with grabbing the default Unity StandardAsset FirstPersonCharacter. This turned out to be a total letdown, and I ended up spending a large portion of the day rewriting chunks of it, adding enumerated states, head bob blending, refactoring the step cycle to reset correctly on idle and rewriting Get functions that modify state.
(╯°□°)╯︵ ┻━┻

Next up was the weapon and damage system, I’ve written damage systems many times before but as we wanted to shoot letters I had to build around string buffers and character parsing to allow for non alphabetical skipping (spaces in names for example) and case insensitivity. This was relatively simple and pretty fun to write, and it was quick to get Greg’s first pass of the weapon in afterwards. Unfortunately I didn’t have time to finish writing the projectiles so by the end of the day we had some menacing looking enemy capsules with health, but no way to hurt them!

Day1_LQ.PNG


Day 2

Dale had finished the first bit of music and a load of sound effects, while Greg had roughed out Jeff’s office by the end of the first day, so my initial priority sunday morning was to get these setup up properly so we could get a feel of the character in the environment.

After helping Jeff find his office I moved on to reloading. I expected this to take ages as Greg wanted all the keys to move… but as it turns out I can write some pretty dirty code when I want to. Key GameObjects were found by name and bound to Unity KeyCodes on the assumption that they start with the prefix “Key_”.
KeyCode alphaStart = KeyCode.A; for (KeyCode alphaKey = alphaStart; alphaKey < alphaStart + 26; alphaKey++) { Transform keyTransform = children.Find(t => t.name.StartsWith("Key_" + alphaKey)); if (keyTransform) { GunKeyBinding newBinding = new GunKeyBinding(); newBinding.keyCode = alphaKey; newBinding.transform = keyTransform; newBinding.originalZ = keyTransform.localPosition.z; gunKeys.Add(newBinding); Debug.Log("Found key: Key_" + alphaKey); } } Using these bindings I could then loop over Input.GetKey(keyCode) and animate the keys.

Typewriter.gif

Once we had a functioning typewriter it was time to start shooting things!
My first pass implementation for the projectiles was rough and ready, firing text meshes from the muzzle of the gun and ray casting delta moves, getting Health behaviours from the hit object and applying damage. But not having made an FPS before there were a few classic mistakes I made... more on that later, I could now shoot things!

So I grabbed a chair from Jeff's office, made it an enemy, and called it Greg Greg Greg Greg.

Day2_LQ.PNG

The rest of the day was spent tinkering with HUD, Text and weapon shaders, more player movement tweaks, a Music+SFX fading/queuing/pooling system and implementing a GameManager to help control some of the the more global game logic. I also hacked in a UE4 style "spawn at scene camera" helper to speed up game play iteration time.


Day 3

Monday was a late start and coffee was essential, so we made sure to stock up before heading into the office. By the time we all made it there things were feeling a bit tense; I had the core combat done with basic path finding but we were miles behind on what we wanted visually and Greg had only finished modelling the office, corridor and lift. Audio was in a good place though, Dale had been firing SFX at me faster than I could put them in the game and he had already written the elevator music. So I took that as a sign to get cracking on the "elevator experience".

Day3.PNG

We wanted the elevator to act as a calm before the storm, after the first bit of corridor combat against the now family of chairs. It would allow the player to take a breather, enjoy the surreal decor and absorb the mechanics they had experienced so far, ready for the next bout.

I'd not used Unity's timeline before and was surprised at how flexible it was, setting up trigger volumes, sequencing the audio, animating the doors and hooking up music queuing took less than an hour! I'm looking forward to using this more in future projects.

After a quick chat over yet more coffee we decided to scope back our original plan to have smaller rooms off of the main chamber so we could focus on polish. So Greg finished off a quick pass on the floor geometry and I rebaked the navmesh and started setting up enemies in the level.

Next I went back to the gun play, added a reticule and raycasts from the camera to resolve fire direction, but quickly ran into what I now realise is a classic FPS problem, if the muzzle is inside something your bullets shoot backwards! As we rendered the player in a second pass this was initially hard to debug as visually the gun was not intersecting anything. In the end I wrote some debug rendering for the projectile motion and hit locations, which highlighted the problem immediately - bit of a face palm moment really...

picard-facepalm.jpg

The next few hours are a blur, lots of stuff broke, got fixed and broke again. Many tables were flipped, more coffee was drunk and finally, miraculously we squeezed out a build for submission.


Post Jam Feels

For a start we were all exhausted, but more than that, proud. It wasn't quite as epic as we had planned in our heads, but giving ourselves time to polish made a big difference to the final presentation and allowed us to address more subtle niggles like text fading, prompts for reloading and lighting.

As I alluded to earlier the projectile implementation was fairly naive, and resulted in a frustrating bug where projectiles would sometimes pass through enemies - something a number of commentators and streamers picked up on. After a day or two of R&R I got a chance to look it over and discovered the issue stemmed from a subtle and annoyingly simple issue with the motion cast.

If an enemy was moving towards the player and the projectile stopped just short of hitting it, the next frame the cast might start within the enemy's collider, resulting in no hit response from the raycast. I feel like this is probably a typical problem with simulated bullets and my quick solution was to offset the trace origin backward by the delta move each frame. Of course this might result in incorrect hits against bodies moving perpendicular or faster than the projectile, perhaps solved by a secondary cast backwards, but a quick fix was all I needed :)

``` private void FixedUpdate() { float distanceToMove = speed * Time.fixedDeltaTime; m_distanceTraveled += distanceToMove;

if (m_distanceTraveled > maxDistance)
{
    OnExpired();
}

Vector3 castMoveDelta = m_castDirection * distanceToMove;
Vector3 traceOrigin = m_castPosition - castMoveDelta; //we trace from one frame back to avoid missing objects coming towards us
m_castPosition += castMoveDelta;

float castDistance = Vector3.Distance(traceOrigin, m_castPosition);

//do cast
RaycastHit hitInfo;
bool validHit = Physics.Raycast(traceOrigin, m_castDirection, out hitInfo, castDistance, hitMask);
RaycastHit damageHitInfo;
if (Physics.SphereCast(traceOrigin, damageRadius, m_castDirection, out damageHitInfo, castDistance, damageMask))
{
    hitInfo = damageHitInfo;
}
if (hitInfo.collider)
{
    OnHit(hitInfo);
}

} ```


Conclusion and Thanks

We have been completely overwhelmed by the feedback you guys have given us and would like to take a moment to thank you all not just for your kind comments but also for the critical feedback on our and every other game this Ludum Dare. This will have been @hi-im-greg and my 7th Jam together, my 13th since LD26, and @dale-smith's first ever!

Lumdum Dare is a fantastic opportunity, pulling us back time and time again to help us grow and test both our creative and caffeine consumption limits :)

We are hugely grateful to all the hard work put into the event by organisers and admins behind the scenes.

And until next time, may Sittatron the Magnificient First of his Name keep watch over you all!

Aaron

Jeff's Game of the Day

Jeff from Accounting has been playing a bunch of games today and he's been blown away by the shear number of high quality, polished entries. One in particular stood out however and he wanted me to make a noise about it because it's not even reached 20 ratings yet!!

Dark Soil by @pietro-ferrantelli 13f16.gif

I mean, look at those pixels, aren't they just the cutest?!

Jeff From Accounting - Post Jam

We're currently working on putting together new areas, enemies and bosses for Jeff From Accounting (more pictures to come), but thought we should release the pile of tweaks, improvements and bug fixes we've been sitting on in the meantime :smiley:

  • Checkpoints
  • Improved lighting
  • Improved enemy/level layout
  • New enemy names
  • Enemy knockback
  • Enemy attack/movement animations and audio
  • Hit/miss response feedback improvements
  • Sprint prompting
  • Improved reload deletion responsiveness
  • AZERTY support

A full list of changes can be found in the source on github


Play the PostJam web build now!


Let us know what you think of the new changes in the comments or leave a message on our entry page

You can follow myself @almax or @hi-im-greg to get notified when we release the new level content - hopefully by the end of next week.

For now I'll leave you with some pretty screenshots of the latest build :sunglasses:

Office.png Punctuator.png Hall.png


Blog posts and Retrospectives

LD 43

My suggest-ions

Themeception... :laughing:

Ludum Dare 45

VOID

From playing on a whiteboard with money for tokens and defaced playing cards, to a playable video game in 72 hours.

https://ldjam.com/events/ludum-dare/45/void-6

https://ldjam.com/events/ludum-dare/45/void-6

Retrospective to come

Cool points to anyone who can correctly guess which two indie games we were inspired by!

And here's a link to the game, woop

VOID

Start the jam with a solid game design on paper...

CHECK

With less than 72 hours to make it, obtain a wheelbarrow load of steamed buns, gyōzas and instant noodles...

CHECK

Nothing quite like a deadline to become heavy dependant on caffeine for a weekend. Buy coffee...

CHECK

Finish with something!

https://ldjam.com/events/ludum-dare/45/void-6

CHECK

VOID - Source code

Hi all!

We've just uploaded the source and assets for VOID to github in all their jammy glory

For anyone interested in taking a look we used Unreal Engine 4.23 and a combination of Blueprints and C++

Get the source here!

Play the game here!

https://ldjam.com/events/ludum-dare/45/void-6

Ludum Dare 46

A.D.A.M and E.V.E

Title.gif

``` Plaform: "PlaySphere" Account: "Adam"

Initialising... please wait...

Status... Life support low

Directive... KEEP THE CHILD ALIVE
```
Play the game here!

Incubator.gif

BabyDeath_Small.gif

A.D.A.M and E.V.E

Title.gif

``` Plaform: "PlaySphere" Account: "Adam"

Initialising... please wait...

Status... Life support low

Directive... KEEP THE CHILD ALIVE
```
Play the game here!

Incubator.gif

BabyDeath_Small.gif

A.D.A.M and E.V.E - Music

Title640x512.png ``` Bootstrapping audio module

Drums... 'ONLINE' Base... 'ONLINE'

Configuration complete

Please connect to the sound cloud to continue ``` https://soundcloud.com/hookshot12345/sets/adam-and-eve

A.D.A.M and E.V.E

Our game was done in a PS1 style and our artist Greg made a fake console startup video!

Check it out :smile:

Splash.gif

Play the game here!

A.D.A.M and E.V.E

A robot and the last remaining human child make a bid for freedom from a underground laboratory.

But the child's life support is failing, and lurking in the darkness are creatures with a fondness for flesh.

Can you escape and keep the baby alive?

Play A.D.A.M and E.V.E, and let us know if you do!

Incubator.gif

A.D.A.M and E.V.E

Title640x512.png ``` Bootstrapping audio module

Drums... 'ONLINE' Base... 'ONLINE'

Configuration complete

Please connect to the sound cloud to continue ``` https://soundcloud.com/hookshot12345/sets/adam-and-eve

A.D.A.M and E.V.E - Post Jam

Title640x512.png

We've released a post jam version for A.D.A.M and E.V.E with a few tweaks based on the fantastic feedback we've received!

Thank you everyone who has played it so far, we love to hear your experiences :smile:

Play it here!

The post jam version primarily addresses the high combat difficulty level.
Changes include: * Decreased enemy health * Increased enemy count * Improved enemy AI

Hopefully this will mean not seeing our game over screen so much :sweat_smile:

BabyDeath_Small.gif

A.D.A.M and E.V.E

Hey all! We've uploaded our UE4 project including assets and audio to GitHub if you're interested in seeing under the hood of A.D.A.M and E.V.E :smile:

https://github.com/Almax27/LD46-ADAM-AND-EVE

We also uploaded our music to soundcloud!

https://soundcloud.com/hookshot12345/sets/adam-and-eve

playerBP.PNG

Level.PNG

EnemyAnim.PNG

Ludum Dare 47

Time Raider

https://itch.io/game/edit/780740

=============================================

Welcome to the tomb.

You have been imprisoned in a time loop by the evil wizard Jack-In-A-Pot.

Fight your way through the monstrous minions of this malicious mage's malcontent andd discover mysterious hidden secrets to become powerful enough to escape the curse that keeps you bound.

Can you make it out in time?

Play Now!

=============================================

https://itch.io/game/edit/780740

CONGRATULATIONS

Just wanted to say congratulations to everyone who submitted!

It's awesome to see so many creative games come out of a single weekend, and regardless of how you place in the rankings...

YOU MADE A GAME. Be proud!

Game jams truly are a wonderful thing :smile:

The next one can't come soon enough

Ludum Dare 48

THE PIT - Speedrun

We've done a post jam update and added a speed run mode to our game THE PIT!

It's a fast paced FPS hack and slash, with cultists, magic skulls, wall running, ledge climbing, and a "party" at the bottom :laughing:

If you've not given it a play yet you can check it out here!

wallrunslash.gif

Ludum Dare 50

Akubi - The Narcoleptic Samurai

I have come to have a deep appreciation for caffeine and the submission hour this Ludum Dare :rofl:

Looking forward to playing other people's games this evening.
If you have any recommendations, please post them in the comments!

Here's ours :smile:

AkubiTitle.png