LD 40 December 1–4, 2017

I need Help!

Been so busy the past few weeks and just rememembered I had to rate some games this morning. I put a lot of effort into my game this time and I would really appreciate anyone who could give my game a rating so I can get a final result. I still need about 15 at this point. Anyone who leaves a comment I would gladly rate yours in return. And of course here is the link: https://ldjam.com/events/ludum-dare/40/greed

Thanks in advance! :)

Four more votes to go

Would really appreciate any votes to help me just get pass 20 votes. https://ldjam.com/events/ludum-dare/40/jade

Thank you!

Last chance to try Running With Scissors!

We at Aloft Studio had a lot of fun creating this piece for our very first Ludum Dare. We are overjoyed with the feedback we have received so far and we hope we can continue to work on this little project even more in the future.

There were a lot of awesome submissions and we were glad to play so many of them. I personally enjoyed watching so many submissions being played by various streamers and listening to the great feedback given. The atmosphere created by the LD community is phenomenal, and from us at Aloft Studio, we hope to contribute by bringing you even better submissions next Ludum Dare!

Cheers to all of the participants and have a wonderful New Year!

Running With Scissors

Running with Scissors Planner is a frantically-paced topdown puzzle game, where you guide a classroom of savage, scissor-wielding five-year-olds back to their desks safely!

Try out the WebGL build here: https://ldjam.com/events/ludum-dare/40/running-with-scissors

RunningWithScissorsPlannerScreen1.png

Try my game: Dodgebomb!

Dodgebomb is a fun game about, well, as you probably already guessed, dodging bombs. I would really truly appreciate it if some more people could rate my game as i need about 8 more votes and we have less than 24 hours to play+rate games, and I would like to get a score.

If you choose to try out my game, I thank you.

Link: https://ldjam.com/events/ludum-dare/40/dodgebomb

Signing Off

I had a lot of fun this time round, thanks all! I didn't have nearly as much time as I wanted to rate games, so I fell a little behind on that (sorry, those who were expecting it). Thanks to
@bocodillo @qookiezz @game-coder28 @anaconda-games @x-budsterized-x @moski @solluxx @smogen @wheffle @cpttritium @noethelazydev @saramartins @chipmonkey @urnext7634 and @vkmicro for rating!
Looking forward to LD41!

Last night to try Radioactive Rumble

If you've ever thought "why don't they make any Punch-Out!-likes?" and also "What if punch out got married to Octodad?" well... you my friend have incredibly specific tastes, and your day has come. There are 19 hours left to play and rate Radioactive Rumble.

https://ldjam.com/events/ludum-dare/40/radioactive-rumble

ss.png

Seriously, thank you to everyone who played and rated for all the feedback-- I feel like we get a little faster at this each time we do it. Thanks to the LD folks for the new layout (adding the ability to upload pics and videos in the comments was an AWESOME addition). A very very special thanks to people who posted videos or played on Twitch; that kind of stuff is invaluable in seeing exactly how people approach playing our games.

Anyway, I hope everyone has a safe and happy holiday and as always we are very happy to be a part of this awesome community of artists. To one more year of making games!

My Top 3

So we got to play a total of 27 or so games this LD and we wanted to just give a quick run down of our favorite games and concepts.

3. Close Friends

(https://ldjam.com/events/ludum-dare/40/close-friends)

talk.png

This game is bizarre in so many ways and yet I've never played a LD game that had me more interested in reading nonsensical dialogue.

2. CalligraTree

(https://ldjam.com/events/ludum-dare/40/calligratree)

tree.gif

This concept could be used in so many interesting ways. Win all the zen!

1. Famous Knight

(https://ldjam.com/events/ludum-dare/40/famous-knight)

AND

1. Super Cop Hero

(https://ldjam.com/events/ludum-dare/40/super-cop-hero)

ced1.png cop.png

These games went for kinda the same thing and have alot in common-- one would probably be my clear favorite if it was a little less punishing, but ultimately I could not decide which to leave off this list because they are both top notch. Great pixel art, funny, very fitting for the theme. Seriously, the compliments I would could give each game are eerily similar but it was great to see two different takes on the same satirical notion.

Building the Character Logic in Jazzy Beats!

ProgrammingBanner.png

These weeks certainly went fast, didn't they? It's kind of amusing to think that judging phase ends in less than 24 hours! However, we at Whales And Games still feel like there's still so much we could talk and post about the game's development that we didn't get the chance to cover during this judging phase (for a multitude of reasons).

In similar fashion to how our graphics designer has written a devlog about creating the characters and the art direction and to how our music's composer wrote another in-regards to his workflow and challenges in composing music, now it's my turn to talk about the programming structures and methodologies I used for developing the different character's logic in our Ludum Dare 40 game - Jazzy Beats.

Whales And Games :heart: Unity

Programming1.png

For Jazzy Beats, we decided to stick to what we know and use Unity as the engine to develop the game once again. It's been my tool of choice for almost four years now and I've used it on the past four Ludum Dare's we've participated on. As such, it's an engine I've grown comfortable with, both in terms of workflow, as well as in terms of it's scripting structure (built on top of C#). As for the IDE itself, I use Visual Studio, not only because of all the tools and integrations it offers when paired with Unity, but also because of how standard of an IDE it is for pretty much everything programming, be it standalone programming, be it with other game engines.

Even so, after all these years using the Unity engine and programming, I still find myself learning better and different ways of getting around, and improving my methodologies when it comes to managing code. Looking back to just a few months ago, when we were updating our Ludum Dare 36 game, Colossorama, for it's anniversary update I ended up spending a great amount of time just restructuring some of it's early code in order to optimize it and make it easier to introduce the new mechanics we wanted to add with the new update.

ProgrammingVS.png

The point is, even while working with the same engine for years, you always end up learning more and further stuff that always helps you refine your future projects as you go, and the past projects we've developed were what allowed us to develop Jazzy Beats as it currently stands. One of the programming aspects that ended up being the most important for the game's development that I only really understood the flexibility as off recently, for example, was Inheritance.

The Power of Inheritance

Although Jazzy Beats' behaviours and characters aren't anything ground-breaking or extraordinary, without some code management and methodologies, it would have been hard to develop and iterate on every single character's behaviours at the iteration rate necessary during a game jam.

As a consequence, one of my priorities when it came to the game's development was the code's re-usability, especially when several of the character's actions are shared between all of them - be it the Player, the Enemy, or the Fans. One basic example of these actions was the basic punch, which all of these past three characters feature. In order to aid with this re-usability, one of the things I turned too was abstraction and inheritance.

Programming2.png

Some of the most basic actions are shared between all of the characters, be them controlled by the player or not. For example, all of the characters use and require components such as a Rigidbody2D, and have variables such as health, damageDealt, velocity and feature functions such as TakeDamage()and Knockback(). All of these functions are shared between all of these characters and feature no differences. However, functions that require more specific functionality depending of the character, such as Movement()and Attacking()are marked as abstract and are later overridden, and filled in depending on the character we're working on.

As such, all of the characters on the game derive from one base and template abstract controller known as the CharController which has all the base fields and functionality for a working character. This controller is later inherited and expanded into new and more specific controllers such as the PlayerController in which, for example, the abstract function Movement()is overridden with the code used for recognizing the player's input. These controllers are also expanded with new functions exclusive to that character, such as ApplySparkAttack() function, which allows the player to use their ranged attack and which is exclusive to their controller only.

ProgrammingSpark.png

This allowed any specific base check or tweaking to be made to all the characters at once, if justified, or specifically tweaked according to the functionality of each individual character. With this structure, I was able to save time with several of the programming tasks that would have been needed if I tried to make separate individual controllers for each of the characters.

However, inheritance is always a mold-able and relative. While writing this section, I can think of several points in which this design and template could be improved further upon. However, given the time limit, you can't be a perfectionist in regards to it either. Don't let code perfectionism hold you back while there are features you could be implementing at that moment, but make sure that your code is maintainable to the point you can quickly make changes and adaptations to it.

Character Controllers & Pseudo-AI

With inheritance applied to the characters, the next step was to start connecting this controller structure to the actual gameplay logic of the characters. As referred in the last section, since the base CharController class Movement()and Attacking()functions are marked as abstract, each of the extended controllers have their own different logic for that same function.

For the PlayerController these functions mostly check which input the player has done, such as applying a velocity to the Rigidbody2D depending on the axis that the player is currently inputting, and deploying different attacks depending on their button presses. Not too shabby and a set of controls most likely similar to what most Ludum Dare contestants did with their games as well.

It's worth side-noting that, for the concern of getting up to speed with Player input and being able to include Gamepad Support out of the box, we used the Unity plugin Rewired as an input wrapper, instead of the default one. It's a great extension that I absolutely recommend to everyone that has been struggling with expanding Unity's input for a while now.

ProgrammingRewired.png

However, it's when it comes to other characters that the controllers need to be thought of differently. As opposed to the Player, neither Enemy nor Fans have a direct input, meaning that all their actions and decisions needed to be made through code. As such, both of these feature what I like to call a pseudo-AI through a set of checks that are made to see what types of actions the controller should make depending on their situation. I call it pseudo-AI because their decisions are made up of conditional statements, rather than an adaptive artificial intelligence algorithm (such as machine learning ~~which would be insane for a game jam~~).

The most basic example of these condition checks is with the EnemyController. For Bluessom's movement and attack patterns, she will check for any opposing-affiliation Fans (in this case, Player fans) in a wide zone around her and target the one closest to her. Depending on the attacks that are currently available and not on cooldown, she will roll a random number to decide which attack she should use on the currently target fan, and will continue attacking them until they eventually turn over to her side again. Since the amount of fans quickly ramps up during the game, eventually, one Bluessom's attack will hit more than one fan at a time, converting multiple fans in one ago.

ProgrammingAI.gif

The FanController works in a similar fashion to the Enemy one, except instead of Fans moving only when one of the idols is near them, they'll will always be walking towards the idol opposed to their affiliation (Bluessom's - the Enemy - fans will always move towards Jazzchan - the Player). They'll stop when it's time to perform an attack, at which point they'll perform the same base attack (the punch) that both the main characters have, followed by a cooldown to avoid them constantly doing the attack. Fans don't have any other attacks such as the kick or a ranged attack as to avoid having the player having to think on dodging different Fan attacks, making their main focus avoiding and converting fans as fast as possible.

One of the earlier issues we faced upon once the fan count started increasing was that all the fans targeting a specific idol would eventually converge into a single moving line since they'd all be moving towards a single point (the Player's position) at the exact same velocity. In order to circumvent this, we introduced a slight random variation in their movement speeds (rolled when the fan is spawned), together with a position displacement that's added to their target's position, making each fan target a point around the character, rather than the character's absolute position itself. These two variations alone are enough to make Fans walk and 'mob' in a much more believable fashion.

ProgrammingMovement.png

Finally, for the actual hit-checking when one of the characters performs an attack, each of the controllers will perform a box cast in front of their feet to check for any opposing-affiliation colliders in a small zone in front of them. These box casts are placed by their feet as due to the game world's perspective, as making a box cast of the same size as of the player would make the check return characters that, perspective-wise, seem above the player.

Pictured is the example of these box casts for the different attacks performed by the player. The yellow box represents the zone checked when the player performs a basic punch and the red one for the kicking. Finally, the green circle shows the area of fans converted when the player performs a Ultimate Sax Drop.

ProgrammingHit.png

As a somewhat trivia piece, one of the original designs we had in mind for the Ultimate Sax Drop involved the play having to perform multiple combos in order to charge it before being able to use it. However, concerned that it could create a contrasting design with the other abilities, we eventually decided to stick with having a cooldown for it.

Unfortunately, this ended up making the Ultimate a safe-guard ability, causing most players to just stick to just using it by late-game, and avoid using it during the remainder of the game. Most of the feedback in regards to the game turns around this, which goes on to prove that, sometimes, playing risky in terms of the design can be a much more rewarding, and it's a note we will take in mind for future jams.

The Game Manager & State Management

And, finally, the last thing important to the management of the characters is the ~~dungeon master~~ GameManager! The Game Manager is a singleton entry that is responsible for managing the overall state of the game and keeping references to other, single-entity objects that are used through the game.

One example of these objects is the FanSpawner which will continuously spawn more Fans (which always start with affiliation to the Enemy) as to ramp up the game's difficulty as the game progresses. Having the game starting with only a single Fan allows the player to get a general understanding of the controls before reaching late-game where they have to take multiple Fans into consideration. The FanSpawner will stop spawning new Fans when the total count of them in-game reaches 40 - because y'know, it's Ludum Dare 40.

ProgrammingFans.png

To avoid performance and other issues - especially in WebGL - as the amount of Fans spawned increases, the higher the chance of them spawning without an AudioSource becomes higher. This not only saves a lot of memory allocated exclusively to audio (which was causing some music cut-off issues in early development), but also stops the player from hearing 40 different AudioSources all playing footsteps at the same time.

Finally, the GameManager also keeps track of the current GameState which check what state the game is currently on between three different states (Starting, OnGoing and Over). These states exist to stop the remaining objects in the game of performing certain tasks when they're not supposed too (like the FanSpanwer spawning Fans after the game is Over or Starting). Likewise, the character controllers also check this state for this very same reason, and will, for example, stop characters from moving once the game is Over.

ProgrammingGame.png

Some food for thought for the future is creating a state system for game characters. This would allow for more complex logic and conditions that are not exclusively limited to conditional statements, without potentially creating much additional workload when it comes to programming character and character actions during a game jam.

ProgrammingFlair.png

And that pretty much wraps up this overall programming post! Getting it out in time was one big challenge due to the snowball of occurrences that happened during the whole of the judging period, but here it is, even if it's just a few hours from the end of judging phase. We still have our Timelapse and Post-Mortem on the way which we hope to make available as soon as we can. However, those will most likely have to wait until after the judging to see the light of day.

In behalf of our team thanks for keeping up with us during this Ludum Dare. Yesterday, when @Moski made a post about the coverage we got during this edition, we were baffled that we had almost made it to 200 ratings. However, as of today, we've managed to smash that very goal! A whale of thank you to everyone who has made that possible and to everyone which has played our game during these last three weeks. The feedback and engagement by all of the other developers was amazing and completely broke all of our expectations. :trumpet: If you haven't had the chance to play and rate Jazzy Beats yet, now would be the perfect time to do it!

If you'd like to keep up with us at Whales And Games after this Ludum Dare ends, we have our very own Discord channel! It'd be wonderful to see you there! Again, Thank you! :whale:

Help to Get rid of it!

Hey guys! Rating hours are coming to a close and I still need some ratings for my game! I have rated enough games, but I fear that the natural rating balance won't let me reach the 20 ratings out in time! (And I don't have time to rate more games since I have to go to work)

Would really appreciate it if some of you could give my game a go! It's playable on web and it's short, so it should not take too long :)

GetRidOfItTutorial.png

In my game you are a hacker that gets caught and you have to get rid of all the stuff by slicing it in order not to get caught!

Here's the link: https://ldjam.com/events/ludum-dare/40/get-rid-of-it

Thanks ya'll

Interested in a post-LD game jam?

Hey LD jammers!

I know some of you are keen for a post-LD game jam, so I'm hosting the Movie Game Jam in February, where you make a game based on your favourite movie scene! :clapper: :projector: :sunglasses:

Movie Game Jam Logo.png

There'll also be ~$200 in game prizes! :video_game:

which everyone will have a random chance to win just by participating! :trophy:

PLUS we've organised YouTubers and streamers to play your entries and give you great feedback!

Join Movie Game Jam ->

You can also join our Game Jammer Discord community and follow MovieGameJam!

There is also a follow-up game jam in March called Meta Game Jam ->

We made it!

So yeah, we finally achieved the 20+ review to grant us the possibility of being ranked in the results that will be live tomorrow. A big shoutout to everybody that helped us by playing, rating and reviewing our game, we are deeply grateful. If you haven't played it yet you can still give it a try:

https://ldjam.com/events/ludum-dare/40/i-just-hate-my-fans

24824467em10214808655427877/em596209757_n.png

Help! Demon Hunt needs more votes.

DemonHuntSG_01.png

Please check out the post Jam version of my game Demon Hunt and be sure to rate and comment so I can return the favor. Help Demon Hunt reach the 20 votes it needs to qualify.

Also, if you want me to look at your game leave a mention in the comments.

Running out of time, need a few more ratings

Hello friends, I still need a few ratings, I'll be very thankfull if you guys got to play and rate my game. If your game needs to be rated too, please comment on this post and I'll play and rate yours too.

hang loose.gif

https://ldjam.com/events/ludum-dare/40/bighead

Neon Hell - Gameplay (with classic controls)

Just a short video of my game with the "Classic" control scheme. You can switch to the "Direct" control scheme directly on the main menu.

https://www.youtube.com/watch?v=PaFXcGzXuW4 (make sure to watch the video at 60FPS, though the youtube compression doesn't help with the visuals).

Play here for yourself: http://www.fatihtavukcu.de/ludumdare

Video description from youtube: Neon Hell is a Shoot 'em up / Bullet Hell like game that I had initially developed over a 48 hour period for the Ludum Dare 40 competition.

On display is version 0.2.4.1

Classic controls:

Rotate clockwise/counter clockwise by pressing the left and right arrow key, press up arrow to accelerate.

Direct controls:

Your ship will follow your keyboard input. As long as you keep the key down it will accelerate in that direction. Tapping once on an arrow key will quickly rotate in the desired direction instead of a slow turn.

Keep in mind: Gravity will pull you down and as long as you are accelerating you will turn slower!

Other controls:

Hold SHIFT to shoot and switch weapons with the X key. You can see your currently selected weapon in the bottom left corner.

You have a short boost at your disposal by pressing CTRL. Keep in mind that your boost can only be used when fully recharged (bottom right corner).

Tips and tricks:

  • If you should leave the arena an indicator in the shape of your ship will appear on the center of the screen to indicate in which direction your ship is currently facing. Use this help to quickly return to the arena before your ship takes too much damage.

  • Every destroyed enemy increases your multiplicator, which is applied to every single enemy kill. The multiplicator slowly fades away and once vanished it will reset. But beware, the higher your multiplicator is, the quicker enemies will spawn.

  • Enemies always spawn in 2 or 3 packs.

  • The plasma cannon has high damage and quick fire rates. Use it to quickly destroy your enemies.

  • The photon cannon's projectiles are very slow but destroy enemies in one hit, but the low fire rate makes it unsuited to use against a big number of enemies. It's also quite useful to keep your multiplicator going.

  • The machine cannon is the least powerful weapon, but unarmored enemies do not stup these high performance bullets, thus they pierce through them and highly irritate enemy pilots.

  • Enemy pilots will only shoot at you if you are in front of them. Shooting them will irritate them and make them lose control so that they can not target you properly anymore.

Specs:

Recorded on an Intel Xeon 3.4GHz, 16GB RAM, GeForce GTX970, Chrome 63

Happy new year!!

Hey guys!!

This is my last post in this LD40, so I wish u all a happy new year 2018!! for more and better ludum dares!

Other times I tried to post some of my experience, improve my entry with images, videos,.. but this time I had some problems (I was 3 weeks without internet, I moved to another house,...)

workingdeath resized2.gif

You can play and rate Working Death -> here <-

See you at LD41 !! (I hope)

Thank You and PSA

Well, my game has reached twenty ratings. Honestly didn't expect that to happen when I started rating games this late into the voting period, but it did. Thanks to everyone who rated, and to @pov for helping out us super-late-bloomers by switching the default filter back to Smart.

And, now that I can safely say that I don't need more ratings, I have a PSA:
Please only rate games that do not yet have enough ratings to be ranked.

Certainly it's nice to have a couple extra ratings, as that lets you know that your ranking is more statistically legitimate. But rating games that are already ranked takes precious time away that could be spent getting more games to be ranked in the first place.

Games that are already ranked do not need your rating; your rating will at the very most change their score by 4/21, a value less than 0.19 -- and that's only if they have the minimum of twenty ratings, and you rank it at the opposite of its current score. Your influence only gets less and less as the number of ratings they already have goes up. Certainly this influence is not zero, as 0.19 can very well change a game's ranking, but it's far less influence than the influence you have in changing a game's ranking from "unranked."

In a similar effort to help get more games ranked, I've put the following message at the top of my game:
markdown **Hey -- I already have twenty ratings. Instead of rating this game, try rating [some other game](https://ldjam.com/games/smart/all) that doesn't yet have enough to be ranked. Thanks!**
and I encourage others who have been ranked to put similar messages at the top of their pages.

Finally, I would also like to request that if you do already have a ranking to not ask for more ratings. The reason I say this is because I have witnessed in the past few hours some games with a large number of ratings ask for more and get them, when the time spent on those ratings would be much more meaningful if spent rating games that have not yet been ranked. I make this request basically in the interest of the community, and to some extent in my own interest, as just a few hours ago I was also unranked.

Thank you. :slight_smile:

My Game: Overdose

Please review my second LD jam entry. http://ldjam.com/events/ludum-dare/40/overdose