Quick answer: GameMaker buffer_write_string adding a null terminator byte? C-string semantics; subsequent reads see N+1 bytes.

Serialize a 10-char string; read back gets 11 bytes (10 + null); offset calculations break.

Length-prefix instead

buffer_write(buf, buffer_u32, len);
buffer_write_text(buf, str);

Explicit length; no null surprise.

Or use buffer_text

Doesn't include null terminator. Cleaner for length-prefixed.

Audit string write callers

Each call's expected size. Null terminator surprises = bug.

“buffer_write_string is C-string-ish. Modern serialization wants explicit lengths.”

Standardize on buffer_text + length prefix for new code. C-string semantics aren't usually what you want.

Related reading