The first half of May is focused on character death, butchery, and meal prep. We've also got a little surprise cooking for players who decide they like the taste of man-flesh. Our community Discord should be online by the end of this week!

ReactReply

Today we hooked up new shadows. Previously, shadows were dark, long, and reacted to the movement of the sun. This felt distracting and heavier than our visual style needed. The new approach is to simplify and aim at a cartoon inspired feel that supports and enhances the character art style.

ReactReply

A new long form post is up discussing our migration away from Rust.

Migrating away from Rust.
deadmoney.gg
ReactReply

Dynamic lighting has made a lot of progress this week. At night a LUT applies a tone map to the entire scene. Lights provide both scene illumination and gameplay effects and attenuate the amount the LUT contributes to tinting the scene.

ReactReply

A modest early game shack equipped with a tinker's table for building tools. Some additional upcoming features will be interior lighting and a roof-edge treatment to indicate this is a fully enclosed room.

😅1ReactReply

The journey begins at this humble wagon, a nod to our beloved Dwarf Fortress.

ReactReply

Sometimes we have to draw the very sad things. We never said building a Temple to Ultimate Evil was going to be all flowers and sunshine.

ReactReply

Since implementing the farming feature, we've realized that the Wheat assets were too detailed and difficult to interpret. Here's an improved version that's less noisy, uses a better color coding, and introduces two new growth stages: Dry and Dead. Remember to keep your crops watered!

ReactReply

Using Bevy's AsyncComputeTaskPool to find the shortest path to any destination among a set of potential destinations without blocking the main thread. Rust is neat!

// Find the shortest path to any tile in a set of tiles.
fn calculate_shortest_path(
    start: TilePos,
    destinations: HashSet,
    tilemap_id: TilemapId,
) -> Result>, HommletError> {
    // Resolve the operation asynchronously.
    let async_task = AsyncComputeTaskPool::get().spawn(async move {
        // For each destination tile, calculate a path.
        // Then, find the shortest path.
        AsyncComputeTaskPool::get()
            .scope(|s| {
                destinations.iter().for_each(|&destination| {
                    s.spawn(async move { path_to_tile(tilemap_id, start, destination) })
                });
            })
            .into_iter()
            .flatten()
            .min_by_key(|path| path.nodes.len())
            .ok_or(HommletError::FailedToFindPathInSet)
    });

    Ok(async_task)
}
🤙1ReactReply

Spent a couple days this week working on basic farming. We don't expect the cult will farm wheat for long, but it makes for a good start.

ReactReply

We're experimenting with a new character style!

🤩3ReactReply