Sorting Center Savant by ZungryWare
A puzzle game about sorting shipping crates. Has twelve challenging levels to play and support for custom levels!

Post-Deadline Changes
- Removed unused files
- Fixed favicon on GitHub Pages
- Fixed some text being unreadable at certain resolutions
- Fixed an infinite loop with cyclical conveyor belts
- Edited and fixed broken controls
- Added gamepad support
Custom Levels
To play a custom level, simply copy the level data to clipboard and press 'L' while in-game. You will probably get a popup asking if you want to allow clipboard. Once you press "Allow", the level should load in. Some browsers (such as Firefox) disable clipboard access entirely, so you will need to use a different browser.
To make custom levels, you will need this base JSON file. Use it as a jumping-off point. But here are what all of the different keys mean:
Root Keys
levelTitle: Level title that will display on the top of the screen.
cratesRequired: How many correct crates need to be deposited to beat the level.
cameraPosition: The location the camera will look towards. This should be roughly the center of your level.
cameraDistance: How far back from cameraPosition the camera will sit.
cameraStartAngle: Yaw and Pitch the camera should start at.
floorHeight: Used for destroying falling elements if they fall out of the level. I recommend setting this to about 3 spaces below the lowest element in the level.
elements: A list of objects, each representing an element in the level. See below for the keys of those elements.
Element Keys
type: What type of element it is. Legal values are block, crate, chute, conveyor, fan, and laser.
position: Coordinates of the element. z is the vertical axis.
angle: Rotation of the element. Legal values are 0, 1, 2, and 3.
color: The element's color, used by conveyors, fans, and lasers. Legal values are red, green, blue, yellow, cyan, purple, orange, and white.
letter: The letter used by crates and chutes. Legal values are a, b, c, d, and e. You can also put an empty string if you want a blank crate that can't be used to score points.
Warning: There is no state validation whatsoever for these custom levels. If you are getting funky bugs or errors, double check your values, refresh the page, and try again.
If you make any custom levels, please share them in the comments below! :) You can use this JSON compressor to put it all in one line.
| Web Embed | https://zungrysoft.github.io/ld53/ |
| GitHub | https://github.com/zungrysoft/ld53 |
| Original URL | https://ldjam.com/events/ludum-dare/53/sorting-center-savant |
Ratings
| Overall | 18th | 4.195⭐ | 43🧑⚖️ |
| Fun | 19th | 4.22⭐ | 43🧑⚖️ |
| Innovation | 12th | 4.366⭐ | 43🧑⚖️ |
| Theme | 93th | 4.159⭐ | 43🧑⚖️ |
| Graphics | 272th | 3.268⭐ | 43🧑⚖️ |
| Audio | 298th | 2.638⭐ | 42🧑⚖️ |
| Given | 79🗳️ | 64🗨️ |
I couldn't solve level 4 with 6/6 :(
Edit: I solved it! I just had to use my brain -once again, really nice job.
Loved:
* Learning how all the different components interact
* The different colored objects reacting to activating the corresponding color was very intuitive
* Seeing new objects that I could interact with over time
* Figuring out how the sequencing of elements was done (conveyor, pushing, handling collisions, fans, etc.)
Small QoL requests:
* would like to pan the camera
* had some trouble figuring out that advancing to the next level is done with the + button (the font rendering of the + looked strange for me and was hard to read)
Simple but pretty clear art-I wasn't *sure* whether the laser was a laser when I first saw it, but with the restart mechanics being so ingrained in the concept it's not really an issue.
With some polish this has a lot of post-LD potential!
I always wondered how to make puzzles like this efficiently. Did you make the puzzles by trial and error or do you have a kind of script/algorithm/math for that?
Anyway, thanks for this entry! I really enjoyed it!
When filling out the set of levels, I tried to come up with the catch first and then design a level that exploited it. For level 4, I knew before I started what the catch would be. It was just a matter of playing around with it on graph paper until I came up with something that made the revelation a requirement to beat the level without making it too obvious that it's what you need to do.
For the last four levels, I didn’t start with the catch, I just had a vague concept for the level. I came up with some elements interacting with each other in interesting ways (like a laser that’s the same color as a fan), then I put it into the game and played around with it. The catches evolved from there. I would see which kinds of board states I could achieve that would require clever use of the game’s mechanics and then adjust the level to make that board state the goal. And if achieving that board state is too trivial, I would try to throw a wrench into the player’s plans that made that trivial solution impossible. Or I would add new things to make new board states possible. In level 9, the cyan fan is the last thing I added, since I wanted the end board state to be that the yellow fan has been moved downward. Adding the cyan fan was a cool way to make that possible.
Level 11 was a particularly lucky one. I didn't edit it whatsoever after constructing it in-game. I just had a feeling it was beatable despite not actually being 100% sure that it was. It took me a good fifteen minutes of playing around until I figured it out!
So yeah, I just started with an idea and played around with it, making changes to mold it into a finished puzzle. Thanks for playing and I'm glad you enjoyed!
Also, there is an undo button. It's listed on the bottom-right of the screen. I would have become too frustrated to play my own game if I didn't implement that. :)
Good luck! 👋
I certainly could have made the animations a bit snappier, but there are very few points in the game where you have to sit there waiting for animations for longer than a second. And the undo button reduces this as well, since one missed input doesn't require restarting the level.
Thanks for playing!
Might be better if level 5 comes before level 4 (to introduce a new hiding mechanism).
Also very helpful for sharing the process of how you come up with the game! Looking forward to make my own puzzle game like this one in the future!
I found in levels 10 and 11 the camera angles added a bit of unneeded difficulty, I prefer having all the information at the start of a puzzle level so I can solve it in my head (or at least make an attempt!)
Other than that, I really enjoyed it! Great game
Love to see GameMakersToolkit referenced here - it shows! The puzzle design is excellent.
Level 6 was, in my option, by far the hardest puzzle - not from complexity, but because I was not fully introduced to the 'shielding' mechanic, and the decoy bin was more confusing because you had not used 'fake' components so far in your design.
But predominantly each puzzle rewarding, well thought-out, and fun!
The assets are very well made - clear and readable. And each mechanic performs beautifully! Not a single bug, despite how complex the interactions can be.
Really excellent work!
@sirlich @blotosaur I used my friend's javascript game engine. It's missing many features you would expect from modern engines, but it implements the basics really well so I didn't have to muck around with rendering individual triangles or handling UV or look vectors.
@jamesw Level 5 is definitely one of the weaker levels. It serves its purposes, which were to A) Give the player a bit of a pacing break from the difficulty of the previous puzzle and B) Get the player more comfortable with using fans to push other fans in preparation for level 9. But it fails as a puzzle because the answer is just too obvious. It was supposed to be easy, but not *this* easy. The reason I put it after level 4 is because I wanted the "fan pushes fan" thing to be the big revelation for that level. And that would just be too obvious if they had already played level 5. I think it's fine to not directly tell the player fans can push other fans because you can indirectly figure that out from the fact that fans can be moved by conveyors, thus making it logical that they might be moved by fans as well.
@ugly-robot In a future version, I might make the fan-shielding thing something that happens in a previous level but isn't part of the revelation to solve it. That way, the player can understand the mechanics of fans better coming in. Although for the fake components thing, level 4 does have a chute that doesn't get used. Maybe I could make it more obvious, like having a second C chute in that level, where there's only one C crate.
@dishwand What did you find awkward about the lasers? Was it that conveyors' visual models don't quite fill up the entire space?
@asieke Ordinarily I would lock the progression of the levels so that you can't skip more than n levels ahead. But doing this was easier than implementing a localstorage save and load system for a jam game. Either way, I would hate for someone to want to continue where they left off but be unable to because they closed the tab.
@alpalcalad @team-gaivot The control scheme was something I struggled with. For a post-jam version, I'm thinking of also having colored levers as part of the UI that you can click on (or tap on for mobile). That also opens me up to having multi-colored levers!
Thanks to everyone who has played so far! I really appreciate all the feedback!