Time to JAM
Nothin better than toast and jam!!
So close !!!!
Nothin better than toast and jam!!
So close !!!!
What a jam! It's hard to believe there have been 50 of these things. I've been around since LD32's "An Unconventional Weapon" with a game about a young child waking up in a hospital fighting zombies with a pillow, custom pygame based engine, staying up all night each night. How different this jam was!
If you haven't played the game, you can see it here. It is a simple game about brushing your teeth :)

An interesting theme this time. I jammed in person with a few people and we thought there would be a lot of games about death, so I didn't want to do that. How did I come up with teeth brushing? Well, my bedtime is usually around 9:30, so when the theme was announced I was sitting on the couch and I realized I needed to brush my teeth! I thought that using the mouse to control a brush would be fun, it reminded me of WarioWare type mini games, and I think I played a flash game back in the day with a similar mechanic (if you didn't know, all ideas were done by flash games back in the day).
3D was a struggle for me. I have always been against 3D games, I find their cameras difficult to control and the whole thing is rather unintuitive to me. But, lately I've been playing Banjo Kazooie on NSO, and it really has been fun to play in 3D! Also, the idea of getting the brush to go in-between teeth was too compelling to pass up, so 3D was decided.
The core mechanic of the game. I'm a big believer in having your game (jam games especially) have one core mechanic that the rest of the game builds off of. Platformers have their gimmicks, farming games are about, well, farming, and this game was about moving the mouse to brush your teeth! This immediately hit me with a problem of how that was going to work. Fortunately, I had Math on my side.
There were two problems to solve with brushing: positioning and orienting. These two often come in a pair, and orienting is usually more difficult, Brush it Up! was no exception. Positioning was rather simple, simply raycast from the camera onto the teeth, and place the brush head at the closest intersection.
The idea is to have the brush follow the mouse, trying to get the brush in-line with the movement of the mouse. Orienting was handled with some linear algebra, if you have ever seen the workings of a camera's "look at" function, it is similar to that. Here's the math (using my C# naming convention):
forward = (new_mouse_position - old_mouse_position).Normalize();
up = raycast_hit_result.Normal().Normalize();
right = forward.Cross(up);
And here's a picture so you can see:

There is some more logic involved, regarding if the mouse is moving forward or backward in the mouth, and for interpolating the orientation smoothly, but that's the basics!
Overall the brush is my favorite part of the game, and based on the comments I think it resonated with people. The main downside is it is hard to control given the size of the mouth, especially in the back where there isn't much tooth to brush. A better approach could be to have a layered solution, with the brush initially raycasting on a large shell around the teeth, then raycasting down to the teeth from that position. Something to iterate on if Brush it Up! ever gets an update.
Ah the camera, the most important part of 3D games if the Journey devs are to be believed. Like I said earlier, I've always struggled with 3D cameras, they've always been hard for me to wrap my head around. Brush it Up! definitely had a... clunky camera system to say the least. I wanted to emulate the feeling of a dentist looking down into the mouth, so it was important to me that the mouth itself could not be moved, and the initial main view was looking down into the patient's mouth. And, I did not want the player to have too much freedom in moving the camera around, I really thought it would ruin the internal world of the game, and make it have less of an impact on players. That being said, the players actually needed to see a full 360 degree view of the mouth in order to brush it all.
So, I went with an approach that gave the player four active views into the mouth, one main view and three sub views. The player was also able to double-click one of the sub-views to turn it into the main view. See here:

This... honestly did not go well. Definitely not well enough to be proud of the results, although I do think it looks cool. One commenter suggested that it would be nice to have keyboard controls to switch between views, this is probably the way to go. Some commenters pointed out that they really liked having the sub-views, and enjoyed that they could interact with the game world through them, so I don't think the idea was a total loss.
A solution could be a full rethinking of how the players sees the mouth. I'm imagining a dentist and how they use those little mirror friends to be able to see around a patient's mouth. It could be fun to control the mirror friend with the keyboard and the brush with the mouth (or perhaps even use TWO MICE for controls???)
Another solution could be to have nicer camera angles for the player, I'm not convinced the four I chose are the best for the game. Another aspect to iterate on.
The final note I wanted to touch on was sound. Honestly these were VERY rushed, literally all of it was put in during the final hour of the jam. In addition, I ended up using the song maker from google instead of my usual GarageBand because GarageBand somehow was not installed on my iPad and it is about a 30 minute download.
But a lesson to all you new jammers out there, ALWAYS add sound effects (and music if you can). Even 15 minutes fiddling on SFXR is enough to turn your computer program into a game. I fully believe without those sound effects nobody would have liked brushing their teeth as much as they've commented they do.
So what of this jam. As always, I had a blast creating something I love with around 5,000 of my closest friends (and a few of my actual closest friends). I got out of my comfort zone and did 3D for the first time, I used Godot's C# implementation (which is much more stable now than it was a year ago), and I learned a lot! The feel of how the player interacts with the game is worth spending even a full day on in my mind, the camera system probably should not be redesigned three times, and even crappy sound effects are better than silence!
Thanks to all who played, rated, and commented on Brush it Up! If you'd like to as well, here is a link.
Feel free to drop your games in the comments and I'll play them :D

This was my first time making a pico-8 game, it was really fun! Try your hand at helping Lorelei run a cow daycare here: https://ldjam.com/events/ludum-dare/51/moo-moo-care

This is a game about running a cow daycare. You get more money the happier the cows and customers are, save up $500 to retire!
Overall I'm pretty happy with this game, it is definitely in my top 3 jam games I've made. I've made idk 20 or so jam games throughout the years, so I've been around for a little while!
My favorite aspect of this game is how the systems work together naturally instead of having artificial forces pushing the player. Why plant grass? To make the cows happy. Why build fences? To make sure the cows don't run away, and to help them eat grass. Why build multiple pens? So cows aren't over crowded, making them unhappy. The list goes on, I'm very satisfied with how all of the systems came together (more details below).
Probably my least favorite aspect of the game are the controls. Movement (as many in my comments pointed out) is a struggle sometimes, and it is easy to get confused as to which button does what. For reference, each button can do up to five different actions depending on what Lorelei is looking at! I've never designed a game which needed such a complex control scheme, definitely a learning experience here!

For anybody who has never balanced a system like this, let me tell you it is a lot of work to get right! I devoted a whole 2 hours of development time just to balancing and getting some crucial play-testing in. Warning, this part may spoil the game if you haven't played yet!
First I had to create a target end-time for the game, I went with approximately 10 minutes. That might be a bit long for some, but I wanted people who really enjoyed the game to be able to get a good experience out of it. You can understand the core mechanics in a few minutes, but it takes a good five-seven minutes before you've really mastered everything. I felt like ten minutes was a good target for somebody who really liked the game.
After that, it's a matter of how many cows the player will experience through the game. I went with about 24, meaning each cow would have to give about 20 money on average, taking about 25 seconds per cow. In the end I went with 30 seconds per cow, 25 felt a bit fast for my taste.
Now how to give the player cash? There always needs to be multiple interacting systems for a player to find something interesting, so I had four things influencing cash. They all work roughly against each-other, though some more than others.
To balance these, we used desmos to graph some functions!

The phone rings every ten seconds, if the player chooses to answer the phone then after a certain amount of time a customer arrives. The amount of time really determines the difficulty of the game! It is a trade off though. Obviously a long wait-time will make the game easier, as that is more time for the player to do things before needing to interact with the customer. However, a very short wait-time is also easy! Because there is no context-switching between answering the phone and picking up the cow. Thus, the hardest time is a medium-length time. I went with five seconds as the minimum lag time between answering the phone and a customer arriving.
Beyond that, I chose a logarithmic function to generate the wait time between 10 and 5 seconds. Logarithms have a way of feeling natural to players for difficulty curves, so I thought it would be a good fit.
After picking up, every customer takes 30 seconds to come back and pick up their cows. I didn't think it was needed to vary this timer much.
The player can spend 2 money to plant grass, this was my first stab at a number and it seemed to work well. Players can also spend one money to build a fence, and three to build a gate. These all seemed to work well, so I didn't tweak them much. The main concern was how happy eating grass made the cow! I started this number at 5 money, but after much testing it would up being $15! Goes to show, it always helps to get playtesting in for balance!
Other factors weren't really that important to me, so I didn't spend much time on them. But a cow will lose 5 happiness every time it bumps into another cow, and lose 2 every time it eats poop. These factors combine, so cows that are too cramped start losing a lot of happiness quick.
This is balanced by the timer on how often movement vs eating occurs. Movement occurs 4 times faster than eating, so if the cow bumps 75% of the time, any increase in happiness from eating would cancel out! This felt pretty good to me, I didn't want to punish players too much since it is just a quick jam game. In general, I wanted to err on the side of giving the player more money.
In conclusion, this game more than any I've made was about balance! It was a lot of fun to really be able to sink my teeth into something like that during a jam game, and I think the results paid off! So far, three people have beaten Moo Moo Care, and they seemed to like it a lot!
If you want to give it a try after reading, check it out here: https://ldjam.com/events/ludum-dare/51/moo-moo-care