lennnnart.bsky.social
@lennnnart.bsky.social
Shout out to @raysan5.bsky.social for creating raylib.
Assets by kenney(dot)nl.
January 6, 2026 at 6:43 PM
Currently has: isometric tile rendering (duh..), Tiled level importer, interactive entities, an event queue, inventory, a quest system, and more.
Collision detection is still "future me's problem." I'm way more interested in NPC dialogue anyway.
January 6, 2026 at 6:43 PM
Both @cissyspeaks.bsky.social and Sean Vanaman were kind enough to comment on it on Twitter back when I uploaded it
July 29, 2025 at 11:14 PM
In the middle of my little production, news broke that a production company had acquired the rights for a film adaptation @keithcalder.com
July 29, 2025 at 11:14 PM
I shot it in Manning Park, BC. After weeks of research I found a lookout that looks very similar to the one in the game: Monument 83
July 29, 2025 at 11:14 PM
I wrote it all up — including a Python implementation — in my latest post:
How Hash Maps Work (From Scratch)

🛠️ Buckets, hashes, resizing, the whole thing:
👉 lbreede.github.io/quartz/how-h...

#BuildSlowThings
#TIL
#programming #hashmaps #rust #python #dataStructures
How-Hash-Maps-Work-(From-Scratch)
lbreede.github.io
July 11, 2025 at 3:19 AM
That’s what makes hash maps fast:

Good hashing
Resizing at the right time
Rehashing keys to rebalance the buckets
All this work to make map["key"] feel instant.
July 11, 2025 at 3:19 AM
When the load factor (length / capacity) crosses ~0.7, we double the array size...

…and then we rehash every key.

Because:

hf("some key") % 3 == 1
hf("some key") % 20 == 10

Changing the capacity changes everything.
July 11, 2025 at 3:19 AM
Okay, but what happens if you keep inserting?

Buckets get longer → scan time goes up → things get slow.
So we resize.
July 11, 2025 at 3:19 AM
Insertion = scan the bucket.
If the key exists, update the value.
If not, append it.

Lookup? Same thing:
Hash, mod, scan the bucket for a match.
July 11, 2025 at 3:19 AM
But what if two keys land in the same slot?
We don’t overwrite — we use separate chaining:

[
[],
[("a", 1), ("b", 2)],
[]
]

Each bucket is a list of key–value pairs.
July 11, 2025 at 3:19 AM
You start with a hash function: something like
hf(key) -> int

Hash the key → turn it into an index with % capacity → store it in an array.

Simple, right?
July 11, 2025 at 3:19 AM
Thank you!
May 5, 2025 at 8:13 PM
Moving away from Rust is sad but man it feels good to just write code without fighting with your borrow-checker
May 5, 2025 at 12:59 AM
Huge shoutout to @gingerbill.org for his gamedev live streams. I was on my own for my fights agains xml and csv though.. skill issue?
May 5, 2025 at 12:58 AM