Ludum Dare 53 April 29–May 2, 2023

Ludum Dare - The Benchmark for Game Developers

It might be my exhausted 6am post jam mind, but a thought just crossed my mind that Ludum Dare is basically a benchmark for Game Developers. We all run under the same conditions and try to get the best out of ourselves in those 48 hours. Maybe that's the addicting part about it. You improve your soft and hard skills every day just in order to get a little bit more done jam by jam.

I wonder if what I wrote still makes sense after I wake up. 35 hours of almost non-stop coding certainly have their side effects...

Air Delivery is Released!

airemdelivery/emcover_art-export.png

ezgif.com-resize (1).gif

Phew! I was really trying to cram in as much content as I could last minute. I tried to go a bit more ambitious this time around with the idea. It did cost me some development time to dedicate to polishing everything up, but I think being able to fit this much content in a Pico-8 game in 48 hours was a really good exercise.

Try the game Here and let me know what you think!

https://ldjam.com/events/ludum-dare/53/air-delivery-1

DON'T FORGET TO MAKE A WEB BUILD

I can't play your entry if you don't make a web build :,-(

Remember that game from LD46 that would reboot your machine when you beat it? That's not the worst thing that can happen running random executables made by strangers on the internet...

No progress on Day 2, Cramming for tomorrow!

School and health kicked my behind today, so not much done for today. Luckily what I'm aiming for is largely straight forward, so hopefully I'll snag something tomorrow :)

Ludum Dare 53: a spammy event postmortem

IMPORTANT: If you had problems with your Jam or Compo submissions over the weekend, publish it as an Extra category game and reach out to me over email and I can help out. If you were unable to create an account, do note that we had to blacklist hotmail.com and outlook.com email addresses, as well as reset passwords from these addresses. Follow this link to reset your password.

Yowza!

By now you've hopefully submitted your games and either had it or your account whitelisted. Regrettably this was something I was doing by hand. While y'all were making games, my day(s) looked like this:

Screenshot from 2023-05-02 10-00-26.png

When I was lucky, they looked like this.

Screenshot from 2023-05-02 09-58-37.png

Using that script and some hand crafted snippets of SQL, I managed to crush 6000 spammer accounts, and flag 26000 spam posts or spam games. I spent most of the weekend barely able to keep a few hours ahead, but a lucky few patterns discovered along the way were a huge help.

The first was mentioned above, the fact that a vast majority of spammers had hotmail.com and outlook.com addresses. New accounts were created every few minutes, from completely different IP addresses (both IPv4 and IPv6), and sat on for a few days not to arise suspicion before beginning their assault. Stopping signups from both domains curbed the sign-ups, but when the spam kept flowing from dormant accounts, clearing every hotmail and outlook users passwords was the best way to slow it down.

🎉

That didn't stop all the spam, but the volume now was far more manageable (only a few per hour). The problem now was the huge spam backlog accumulated over the past few weeks and months.

I got lucky a few times, that the super-spammer had some obvious patterns in their work. Many of their usernames looked like 0blahToaster, with a single number prefix and single upper case letter (or number) in the middle. That and a few thousand posts had consistent signatures in the body text, which I appreciated. :laughing:

Screenshot from 2023-05-01 19-29-06.png

After flagging those, it was a lot of grinding, searching for terms like livestream, john-wick, robux, and after a quick inspection flagging the whole lot of them.

By Monday nights end, I was finally through the last 4 weeks of new users, posts, and games. There are still many thousands more pieces of content left to review (roughly 60k pieces of content since I'm aware the spamming started), but the last 4 weeks covers everyone that created accounts while sign-ups were open. :sweat_smile:

Next step: Comments

Comments are a separate table in the database, so when I finish my errands today, I'll dive into those and start cleaning them up.

Switching to "Invite Only" between events

In about 2 weeks we're going to make a rather big change: between events, users will not be able to sign-up for new accounts WITHOUT an invitation.

Screenshot from 2023-05-02 09-48-15.png

The gist of it is that once a user passes some community "trustworthiness" criteria (TBD), they'll be able to generate invitation codes.

I want the bar for this to be low and not require my intervention, but in special circumstances I can whitelist jam site organizers and educators.

I definitely regret that it's come to this, especially given everything else that needs doing or fixing, but spammers don't play fair. 😢

Phew!

That's it from me! Again, feel free reach out if you're still having issues. I'll tackle them later today.

PS: Name and email changes will come a bit later. I want to push-out invite code support first.

The Clockwork Express - Skytrain!

First weekend after LD, and I've found some great games already! Deep Sands Delivery is probably one of my favorites so far, it's so ambitious. I know there's always complaints about the theme, but this time I was actually content with "Delivery". Sure, it's generic and slaps you in the face with pretty obvious directions to go, but I'm just glad it didn't force a mechanic on you.

Feel free to post your game in the comments (particularly if it's an incremental or builder game :wink:) and I'll make sure to give it a go! And if you're interested, please try out our submission, The Clockwork Express.

LD Image.png

Welcome, Captain!

Congratulations, J.B. Gearsworth III. As a newly promoted Captain under Brass & Copper Deliveries, Co., you have been granted command of your very own airship - The Clockwork Express. Ensure our clients receive their packages, no matter the cost. Our profits are in your hands.

clockworkemexpress/emgameplay_compressed.gif

Try it here!

You don’t have to deliver anything today..

Lean in to an ancient art form that relaxes your mind and soothes your soul. Welcome to your new state of mind.

Weave away in this mobile-first web-game

DreamLoom, a weaving game for a meditative state of mind. Follow the patterns that the game generates for you, or create your own freely. Enjoy the colors, sounds, and textures of this ancient artform as you take a break from all today’s chores and distractions.

PLAY HERE

Screenshot 2023-05-01 at 17.43.56.png

A normal Delivery! Enjoy!

Bag.jpg

https://ldjam.com/events/ludum-dare/53/a-bag

Part 2: Days on the Lake Water Tech

By popular demand, here's the follow up to my post about the water tech in my game, Days on the Lake. You can read the first part here: https://ldjam.com/events/ludum-dare/53/days-on-the-lake/simulating-water-in-days-on-the-lake

bbbbbbbbbbb.gif

I'm going to start by showing y'all the simulation code (in HLSL), and then I'll go section by section and explain what's happening. Note: as written this can't be copy-pasted into an HLSL shader. HLSL is C-like and requires forward declaration of functions, and I've reordered a lot of the code here to make it more readable. As well, I don't show my noise implementation. I recommend reading about simple GPU noise implementations here: https://thebookofshaders.com/11/

``` float2 frag(v2fcustomrendertexture IN) { // Sample textures float4 terrainHeight = tex2D(TerrainTex, IN.localTexcoord); float4 currentWater = tex2D(_SelfTexture2D, uv);

// Calculate derivatives and wave speed
float4 d = getDerivatives(IN.localTexcoord);
float2 cSquared = getWaterC(derivatives);

// Calculate forces
float forcing = getForcing(IN.localTexcoord);
float restore = -currentWater.x * _Restore;
float damping = -currentWater.y * _Damping;
float wave = cSquared.x * d.ddx2 + cSquared.y * d.ddy2 + (d.ddx * d.ddx + d.ddy * d.ddy) * _FakeFactor;

// Calculate next wave state
float terrainHeightClamp = _TerrainHeightOffset - terrainHeight.r * _TerrainHeightScale;

float nextVelocity = currentWater.y + (wave + forcing + restore + damping) * _DeltaTime;
float nextHeight = clamp(currentWater.x + v * _DeltaTime, -terrainHeightClamp, TerrainHeightClamp);

return float4(nextHeight, nextVelocity, 0, 1);

}

Derivatives getDerivatives(float2 uv) { Derivatives derivatives;

float texelX = 1 / _CustomRenderTextureWidth;
float texelY = 1 / _CustomRenderTextureHeight;

float4 xy1 = tex2D(_SelfTexture2D, uv);

float4 x0 = tex2D(_SelfTexture2D, uv + float2(-texelX, 0));
float4 x2 = tex2D(_SelfTexture2D, uv + float2(texelX, 0));
derivatives.ddx = (x2.x - x0.x) / (2 * _GridSize);
derivatives.ddx2 = (x0.x + -2 * xy1.x + x2.x) / (_GridSize * _GridSize);

float4 y0 = tex2D(_SelfTexture2D, uv + float2(0, -texelY));
float4 y2 = tex2D(_SelfTexture2D, uv + float2(0, texelY));
derivatives.ddy = (y2.x - y0.x) / (2 * _GridSize);
derivatives.ddy2 = (y0.x + -2 * xy1.x + y2.x) / (_GridSize * GridSize);

return derivatives;

}

float2 getWaterC(Derivatives d) { float wavelengthX = 5 * sqrt(abs(d.ddx2)) + abs(d.ddx); float wavelengthY = 5 * sqrt(abs(d.ddy2)) + abs(d.ddy);

float cxSquared = (_Gravity * wavelengthX) / (2 * PI);
float cySquared = (_Gravity * wavelengthY) / (2 * PI);

return float2(cxSquared, cySquared);

}

float getForcing(float2 uv) { float forcing = valueNoise(float3(uv.x * _ForcingFreq, uv.y * _ForcingFreq, _Time.z * _ForcingTimescale)) - .5; float s = sign(forcing); forcing = forcing * forcing * s;

return forcing * _Forcing;

}

struct Derivatives { float ddx; float ddx2; float ddy; float ddy2; } ```

This is a lot! To we'll look at frag for the basic outline of the method. First, we sample the terrain height and the last water texture at the current pixel. Then we get the derivatives (the du/dx stuff) of the water texture, and calculate wave speed with them. Then we calculate all of the "forces" acting on our water. These are "forces" in a loose sense, but it's a reasonable way to think about them. Then we integrate forward with time, and return it as the next texture step!

In this, I'm integrating forward in time with the forward euler method. The forward euler method is inaccurate and doesn't conserve energy, but it's sufficient for a simple simulation in a game. Simulations with this method take the form you see in the code: nextState = currentState + currentRateOfChange * deltaTime. There are more accurate things you can do here. The midpoint method in time is often better, or a variation of verlet integration. You could also do one of the runge-kutta family of methods, or even an iterative method like the backward euler method. I won't go into these here, but they're good things to read up on if you're interested in simulating things!

In the getDerivatives function, I use the central difference method to get derivatives of the water height field in space. The central difference method is the simplest method to do this. I don't use the built in ddx and ddy functions here because I can't construct second derivatives with them, because of technical limitations. In order to make consistent first and second derivatives, I just manually calculate both. The built in ddx and ddy take advantage of the GPU's parallel execution over many pixels to calculate derivatives quickly, but they're only able to look at 2x2 blocks. This is insufficient to calculate a second derivative, sadly!

Moving on, we have the getWaterC function. This estimates the wave speed of water given the first and second derivatives. I basically played around in graphing software to figure out something that estimated the wavelength well, because we need it to calculate C. What I landed on wasn't great, but was sufficient. It varies a lot over different parts of a wave, but kind of hovers around the actual wavelength. You can read up on the calculation of the actual wave speed, given a wavelength here: https://en.wikipedia.org/wiki/Dispersion(waterwaves). I probably should have implemented the shallow water effects as well at least. It'll be an interesting thing to investigate going forward, as well as the nonlinear large wave effects in deep water.

Next, we have the "forces". I keep putting "forces" in quotes because they're not really forces as you see in rigidbody simulation. I'm not considering the effect of these in relation to a mass, I'm just using them as terms to derive an acceleration. The term "force" is good for intuition though, so I like it. The "forces" I use are damping, restore, forcing, and wave.

damping is just this way of bleeding off velocity, to what would be friction. It's used in a lot of simulations and is usually taken as proportional to velocity.

The restore term is the way I force water to get back to the "normal" water height, and I take it as proportional to height. This is a fictitious force, but I find it helpful in stabilizing these simulations. You can imagine it's a spring pulling each pixel back to center.

The forcing term is what I use to generate the idle motion of water. I won't go too deep into the getForcing function, but it basically samples some value noise and squares it to make the peaks sharper. This is a place you can really get creative! Copy the code and try weird things!

The wave term is the meat of the simulation. It's what makes the waves propagate like real waves! It can be understood in two parts. First is the proper simple wave equation, d^2u/dt^2 = c^2 * d^2u/dx^2. This just says the amount the wave wants to accelerate up or down is proportional to the second derivative of it in space, or how much it's smiling or frowning. Frowning waves want to go down, smiling waves want to go up. The second part is the part I added (dx * dx + dx * dy) * _FakeFactor. This, as the factor's name implies, is fake, and just me trying to make the waves look more interesting. It basically says steep water waves want to stay "up". It's overpowered by the proper wave equation part, but I like to think it does something.

After that, we just integrate forward in time as I've talked about, and return. The clamping to the shore part is something I added later, to make the edges look better.

This has gotten pretty long, so I think I'll end this one here. I have one more post to do about the way I shade the water, so I hope to see folks back for that!

Air Delivery Post-Compo Version Now Available!

A post-jam update version of Air Delivery is available now! Here are some of the changes:

airemdelivery/em0.png

A new title screen based more on the game's thumbnail

airemdelivery/em0.gif

A new transition effect when dying

airemdelivery/em1.gif

And a few new areas to explore!

Extra changes include:

  • Updated main menu and end screen
  • Added a few new areas to explore
  • Improved ladder grabbing
  • Added coyote time to jumping
  • Added counter for found packages
  • Tweaked dialogue

The new version can be played at:

https://pianoman373.itch.io/air-delivery

WitchDelivr - Actual Proper Sprites

First of all, come play this thing. Rate it. Give us attention and validation!

splash-v2.png

I don't think two years ago when @alpacalypse and I started doing this that we foresaw being where we are right now. Six jams our of six where we manage to produce something reasonably complete and three out of three where we consciously aimed for (and got) clean launches without major bugs. We only had two bugs this time around (one of which has been fixed) and I'm not sure that anyone noticed either before we did. Hopefully, we continue the trend of producing something better and better each time.

I'm the one who does the art for our games but I'm not really a pixel artist. I mostly don't do art outside of LD and whenever the jams come up, I learn a bit more and then just try to muddle through by referencing whatever turns up on google and mimicking what actual artists do as best I can. Traditionally, graphics is one of our team's weakest categories. (Innovation was traditionally our strongest but we swung that so far out of our newbie park with 1001N that we've been actively avoiding it, but that's another story.)

Over the last two games, we identified that the weakness was a lack of art direction. Even though I managed decent art here and there, the different parts never really came together. 1001N (LD50) just had pieces of art placed around to fill the screen resolution and we were using totally default sans serif text and filler bar. The icons were designed to be readable but had no stylistic direction. In WC (LD51), I managed to have a tileset but it only covered the walls and some blood splatters while the background floor was just some Paint.NET filter. The item icons I think were okay but some had black outlines while others didn't. The mobs were just whatever came to mind that could be animated quickly and rudimentarily with Piskelapp and had no real theme and the heroine was 62 pixels tall and didn't mesh with either the mobs or the tiles. I'd given her a glowing ring to indicate her hitbox but the fact she wasn't the same size as her surroundings was still one of the most noticeable criticsms.

For LD53, I made it a mission to improve the graphics as much as I could.

screen-03.png

After the theme arrived, we rapidly settled on the idea of Kiki's Delivery Service with a bit of social commentary set either in a single tower block or a street with multiple buildings. Because the gameplay would be so simple and the setting so small (in fact, we think we underscoped this time around, which is not a complaint many LD teams have I'm sure) the game would have to lean hard on visual appeal, which was exciting but intimidating. About 40 minutes into the discussion I said "Let's just take it on" and from then the ball got rolling.

WitchDeliver would become our first game with "proper" sprites and "art direction". The art direction wasn't much at all. Initially I only gave myself two rules: -I'll use the default palette of Paint.NET and stick to those colours. I don't know why they are what they are but maybe someone smarter than me picked them for a reason. -Pink and Cyan are pretty 80s, punky and cool.

I looked up how one might pixel a witch and found good examples at 16, 32, 48 and 64 pixel height. I eventually settled on 24. The biggest factor was that in order to have a unified art direction, all the sprites should have the same level of fidelity and 24 was the most I felt I could handle and still produce a reasonable number of assets. That was the next rule - people are approximately 24 pixels high and everything else scaled from that. Hence each floor of the buildings became 48 pixels high and so forth. In order to make procedural generation of pedestrians work with the palette, I imported the whole thing into a bunch of arrays by hue and parts with highlights were separated into two parts, one of which would have a colour two darker than that of the other. This all turned out to be a bit of a trick since apparently Paint.NET and Godot don't quite speak the same language as far as colours are concerned. Thanks to @alpacalypse taking over music and the overall mechanical parts being so light, I was in full Horizontal Mode by 36 hours. One window with no variation or open state became four windows with four variations, each with an open state. Two stores and two doors (from which pedestrians spawn or despawn) became ten and ten, which was enough for us to enforce uniqueness during generation. And barren roofs and alleys came to life with multiple layers of doodads. All in all nearly 300 frames of sprites plus procedural generation of dogs, pedestrians and the street, so we managed quite a bit of variety. Most importantly, having some direction to the art seems to have worked well if the comments are anything to go by. Crucially, some of the most frequently criticised assets were the delivery markers and the arrows, which is great because those were hastily implemented prototype assets that we somehow never got around to replacing (with three hours to go, we decided we needed dogs instead). The fact that people caught onto those flaws is pretty affirming.

Okay, I'm done. Go play and rate! https://ldjam.com/events/ludum-dare/53/witchdelivr

Rope math: deconstruction of DETOUR's main mechanic

Hello! As last idea for a post about our puzzle-game DETOUR, I wanted to make an overview of how I implemented rope physics (or should I say "wire physics"?)

What do we want? - We want to draw a line between the player and the charging station, and this line to update on player's movement. - When this line touches pillar, we want to "bend" the line around the corner, adding a new turning point for the line.  - Repeat for each corner we meet. - Also, if we start to "unwind" the wire, detach from the pillar when necessary.

example from our final build: Day 3 (small).gif

So, how do we implement it?

One way to do this is use some physics engine: pillars are collidable objects, rope is a chain of collidable objects, they collide with each other. This method was scrapped early on because of one big reason: physics is wonky, rope will wiggle around, glitch at corners, and in general behave not 100% predictable. Not what we want for a puzzle game.

So we choose the "nerdy" way: maths. It actually turned out to be easier than I expected, but still required lots of steps to be implemented. I'll try to explain step by step. I am using Godot and its internal objects like Line2D and Area2D, but the concept should work for any game engine (or even extrapolated to no engine at all, if needed).

1) For visuals, I use Line2D. In its primitive form it's just a set of lines connecting your points in order.

2) Points are stored in an array somewhere in code. First point is always charger (which is immovable), last point is always player (so on player's movement we update last point's position and redraw the line).

3) Also, on player's movement we trigger a special "update detection" function. For each pair of points (at first it's just 2 points in line), we add a rectangular CollisionShape to the Area2D detection of the line, with the length of distance between lines and the width of the line (more or less). It looks something like this:

Godotemv3.5.1-stable/emwin64_4KVf8JlpUX.png

It’s arguably the only use of build-in “physics”, but in our case it’s just for detecting intersections between rectangles, which technically could also be done manually by calculating intersection of two rectangle’s edges :)

4) Add small collision rectangles to each of the 4 corners in each pillar. When some of the corners detects an intersection with one of the line’s collider, it sends its position to the line. Line adds a new point before the last one, basically splitting the last edge in two new edges (not forgetting to add a new collider for newly emerged edge). Corner remembers which two parts of wire it is already touching, so we don’t create new points for them. The result already looks promising:

first.gif

There is only one caveat: we can’t unwind the rope for now. For that, we’ll need more math!

5) How do we check if we should be still touching the rope? The secret is just to compare angles! Let’s assume that line between player and second to last point is angled at Y degrees to the horizon, and second to last + third to last points form an X angle:

IMG_4918.JPG

Now we can see that if Y>X, then player is still “around the corner” and the wire should still touch the corner. And if the player backtracks and Y becomes lesser than X, then we should “unsnap” from the corner by deleting the second to last point. Sounds good? Let’s test:

second.gif They got us in the first half, not gonna lie.

But we missed just one last calculation:

6) If we wrap around the corner “counterclockwise” (in comparison to “clockwise in step 5”), we should actually wait for Y to become greater than X, because everything is mirrored. There is an easy fix: when our line collides with the corner, we also check which side from the edge is the corner situated. It’s actually also just a math comparison between two angles:

IMG_4919.JPG

We store this side alongside line’s points and use it to determine whether we should use “>” or “<” in step 5.

Well, seems like that's it! How does it look?

Level 3 Final.gif Awesome, it works now!


Of course, this is a generalisation of the whole idea. I had to implement some “usual game hacks” to make it work as expected: - Corner’s point is a bit outside corner’s collider - I needed some “small negative delta angle” in unsnapping function so I don’t unsnap immediately after snapping, - Comparison between angles behaves funnily at +-180 degrees

Also, this logic has limitations. I can’t have moving blocks (but should be easy enough to implement, just moving points inside line and more angle comparisons). Also I tried to do a maze level and failed miserably because line touches dozens of corners at the same time (and I was too lazy to fix that for only one level): photoem2023-04-30/em20-44-54.jpg

What is the moral of the story? Idk, maybe that some complex looking ideas can become simple enough if you can destructure them into simple steps.

If you liked this post (I genuinely don’t know if this was an interesting read), please leave a like and play our little rope-based arcade-puzzle DETOUR :)

https://ldjam.com/events/ludum-dare/53/detour

Beetle Dynasty on SteamDeck

Turns out my game (almost) runs on the Steam without too much trouble :D Still need to do some key mapping, but Godot makes it really easy.

steam.jpg

If you want to give it a go : https://ldjam.com/events/ludum-dare/53/beetle-dynasty

Cheers !

Witch Brunnette - A Simple Arcade Game

Looking for a quick little game with WEB version? Try out my entry Witch Brunnette!

Witch Brunnette vid cutted.gif

Content: - Fly around, collect items and throw them on cauldron in a easy to master controls; - Cute pixel art; - Compete for best score in a online leaderboard;

screenshot-04-export.png

Session time:
- 2 ~ 4 minutes

Rating games!

Hey everyone! Are you ready to take to the skies and deliver some packages and try to complete it?

skyemdrop/embanner.png

Sky Drop

Drop the boxes in my game and your game links in the comments in this post and I'll try to play as much as I can!

Have a nice trip in our game!

Potion Delivery Service Post-Jam UPDATE

update thing.png Thank you for giving our game a chance and providing it with lots of valuable feedback! We took your thoughts into account and tried to improve the game as much as possible! Please read trough these update notes as well check out our new post-jam version, too! Thank you!♡

  1. We improved the gameplay by making it less button-mashy! From now on you do not need to confirm most of the gardening and watering steps!
  2. From now on you can refill the water can whenever you feel like! And now it can contains whole 6 points of water, too!
  3. We made some of the UI parts of our game much more visual! We hope it will improve your experience! photoem2023-05-10/em00-40-14.jpg
  4. We rewrote some of the endings to make it easier to understand whether you delivered the right potion or not.
  5. We also proud to announce that from now on you can play our game via web! For that you just have to visit our site and press the button "Run the game" at the very top! (Surprisingly enough this way you can even play it using your phone!)
  6. We have also ported our game for Linux due to request! I hope you'll be able to play it! Thank you!
  7. Our guest @Whitemoonblackbunny created a new piece of music called "What A Lovely Day"! From now on you can listen to it in the main menu.
  8. Мы так же перевели игру на русский! Если языковой барьер ранее не позволил вам насладиться игрой, прошу, попробуйте сыграть в нее с вышедшим переводом!

\Please note that during 10th of the May we'll present our game for the wide russian speaking audience due to event. Which is why for some big amount of time you'll see a russian web-version of the game on our site! We apologize for possible inconvenience!

answer sticker 3.png None of these updates could have been done without you! Thank you for playing our game! Let's keep doing our best!

TukTuk Delivery: Our Gamejam Experience

We recently participated in Ludum Dare 53 and created a game called TukTuk Delivery. It was a fun and challenging experience, and we learned a lot from it. Here are some of our thoughts on what went well and what we could improve upon.

What Went Well:

  • We were able to create a functional game within the given time frame.
  • The game had a clear objective and gameplay mechanics that were easy to understand.
  • The team collaborated well and each member contributed their skills effectively.
  • The GPS was challenging but satisfactory to see it work after
  • The driving experience with wheel colliders was very fun even if it was the first time we play with this in Unity

What Could Have Been Better:

  1. Finish Condition: We missed including a finish condition such as a timer or a number of deliveries, which left the player without a clear goal to achieve.

  2. AI Driving: We wished we had more time to add AI driving other cars on the road to increase the game's challenge.

  3. Camera View: We realized that the camera could have been adjusted to avoid trees blocking the view, which could have improved the player's experience.

Overall, we are proud of what we accomplished in the gamejam. We want to thank @ArgmenBalian, @Bananian, @Zammoy, and @MrBamboo for their contributions and teamwork.

We hope you enjoyed playing TukTuk Delivery as much as we enjoyed creating it. Let us know your thoughts in the comments below.

Play the game => https://ldjam.com/events/ludum-dare/53/tuktuk-delivery

cover.jpg

Lost And Found!!

Thank you to those of you who have reviewed our game and given feedback!! I am posting again just to hopefully boost exposure to people who may have not seen my previous post.

I have been the solo artist for all the game jams I've participated in and I am actually proud of how this one turned out so if anyone is willing to check it out it would mean a lot to me!

https://ldjam.com/events/ludum-dare/53/lost-found

also just a fun update that isn't really an update, just something I wanted to share with yall: I made some vinyl stickers of our player character, Oliver, for the three members of our team as a cute memento.

Here's the stickers and some screenshots of our game :)) 20230509_121911.jpg5b37f.png5b380.png5b37e.png

also a friendly hint in case it may not be clear, The campfire compass leads to the center of the map!

Final bugs squashed, and desktop executables

It seems like the more I play, the more bugs I found. I did some post-jam fixes only to find another bug one day after, finally, I thick that this is the final update until the big content update I'm planning.

Also, I finally had the chance of making a Windows executable (I use a Chromebook from my college, so I had to find a Windows somewhere), so now if you want to save it on your hard-drive to play later you can.

And if you haven't had the chance of playing My Flavor-ite Kidnapper consider checking it out: cover.png https://ldjam.com/events/ludum-dare/53/my-flavor-ite-kidnapper

(Now with 95% less bugs)

Rush Delivery v1.4

New version is out! I added a better menu and quit popup menu so people don't feel like they have to alt+F4 the game. If you haven't played my game check it out. https://ldjam.com/events/ludum-dare/53/rush-delivery

rd4.PNG