In Chalo Chalo you pilot a slow-moving dot towards a goal at the other side of an abstract landscape. Designer Tomasz Kaye purposely built in ‘rarities’ to spice things up.

“I like when unexpected things happen in games. Better still is when the unexpected thing happens just when you feel you’ve gotten to know how the game world works. Its impact is maximised at that moment.

We have some unexpected things that happen now and then in Chalo Chalo, we call them rarities. They’re designed to foster a sense that the game world has hidden depth and mystery, and to keep players on their toes. Right now the rarities we have implemented are ‘exotic’ types of race map that are generated using different rules to the more regular ones. After a few matches players will probably have experienced a glacier race, but they would have to play a while longer to encounter a grass lava canyon. We have ideas for other rare things that we plan to experiment with during Chalo Chalo’s Early Access phase.

The aim is to have the unusual things happening just as players feel familiar with the game, so the best way to set this up is to arrange things so that the longer you’ve played without seeing anything out of the ordinary, the more likely you are to see something like that in the next race.

Rarity pressure

Chalo Chalo is built to include a concept of Rarity Pressure. You can think of it as something in the air that influences how likely strange things are to happen. The higher the pressure, the more likely that a rarity will manifest itself. When nothing out of the ordinary is happening, the rarity pressure is incremented after each race. We want rare things to be more likely if you didn’t see any for a while, and less likely if you did. So to complete the scheme, each rarity has a rarityPressureRelease value. The rarity pressure drops by this amount after the rarity manifests itself.

We use a JSON file to describe all our rarities. In this file we assign likelihoods. We can also set up relationships between rarities so that they can be nested, and add directives to have rarities exclude or require one another. We have a class that’s responsible for modifying and reporting rarity pressure, and another that’s in charge of parsing the JSON file and selecting rarities for the next race. Because we want rarity pressure to persist between play sessions, we’re currently reading and writing the value to disk.


Rarities: exotic types of race map like Glacier.

Hacky solution

Chalo Chalo is regularly played at festivals and other environments in which many new players are joining in for the first time, and leaving again a few matches later. These players don’t typically play long enough to have a chance to really get to know the game world, or be correspondingly surprised by out of the ordinary things. Moreover when Chalo Chalo is running at a festival the rarity system doesn’t know or care that four new players have taken the controllers, rarity pressure might be very high at that moment. This isn’t ideal since we want new players to get to know Chalo Chalo as it usually is before serving them unusual situations. Our slightly hacky solution to this problem is to add a field to each rarity named minimumNumberOfPreviousRacesThisMatch. If the specified number of races haven’t yet been raced in the current match, this rarity won’t appear. This way we can at least ensure that the first few races of any match won’t have really weird stuff popping up in them.”