제작일지

자리가 89바이트 모자랄 때

고친 아이템 설명을 넣으려니 들어갈 칸이 9,728바이트인데 새 덩어리가 9,817바이트였습니다. 89바이트가 모자랐습니다.

옛 게임은 파일 안 자리가 정해져 있어서, 넘치면 그냥 안 들어갑니다. 선택지는 셋이었습니다.

  • 문안을 깎는다 — 애써 고친 문장을 다시 줄여야 합니다.
  • 파일 배치를 다시 짠다 — 뒤 덩어리들을 밀어야 하는데, 102개를 밀어도 320바이트가 모자랐습니다. 게다가 밀린 자리마다 인증값이 깨지면 그림이 통째로 안 뜹니다.
  • 압축을 더 잘한다

세 번째가 답이었다

이 게임이 쓰는 압축은 비용이 고정입니다. 글자 하나를 그대로 쓰면 얼마, 앞에 나온 걸 가리키면 얼마 — 값이 정해져 있습니다. 게다가 가리키는 대상이 결과물 자신이라, 어느 자리에서 무엇을 잡을 수 있는지가 선택과 무관합니다.

그러면 「매번 제일 긴 걸 잡는」 흔한 방식이 최선이 아닙니다. 뒤에서부터 한 번 훑으면 최적이 정확히 풀립니다.

방식크기
늘 제일 긴 것부터 잡기9,817 B안 들어감
한 칸 미뤄 보기 (게으른 매칭)9,732 B안 들어감
최적으로 풀기9,680 B들어감

문안을 한 글자도 깎지 않고 들어갔습니다. 실제 파일 25개로 재보니 평균 1.3% 를 벌어 줍니다. 앞으로 자리가 모자랄 때 제일 먼저 꺼낼 수단이 하나 생긴 셈입니다.

다만 들어가던 것까지 다시 짜지는 않습니다. 멀쩡히 들어가던 덩어리의 바이트가 이유 없이 달라지면 배포용 차이 패치가 쓸데없이 커집니다. 그래서 안 들어갈 때만 이 방식으로 다시 짭니다.

그 뒤에도 한 번 더

훈장 이름을 채우다가 이번엔 5바이트가 모자랐습니다. 같은 수를 써도 안 되길래, 훈장 이름 셋을 손봐 정확히 맞췄습니다 — 「무모자」를 「무모왕」으로, 「초코마인」을 「초코마왕」으로. 마침 옆에 「특기왕」「놀이왕」이 있어서 결도 맞고 원뜻에도 가까워졌습니다.