요약
2001년 경영 게임 Fast Food Tycoon 2를 AI와 함께 디컴파일해 도시를 그리는 방식을 밝혔습니다.
개발자 앤드루 힐리가 2004년 쇼핑몰 할인 매대에서 고른 뒤로 잊지 못한 게임을 며칠 동안 뜯어보고 쓴 글입니다. GPT-6.1 Sol Medium으로 에이전트 루프를 꾸리고, 디컴파일 도구 Ghidra와 함께 썼습니다.
왜 중요한가
- 사람이 호기심으로 방향을 잡고 AI 에이전트가 함수 4,046개를 뒤지는 방식으로 며칠 만에 옛 게임의 구조를 밝혔습니다.
- 실행 중인 게임의 메모리 값을 화면과 맞춰 보면 수천 개 함수 가운데 필요한 코드를 좁힐 수 있음을 보여 줬습니다.
핵심 내용
- 도시는 거리와 빈 땅만 그린 큰 배경 그림이고, 건물·사람·차는 그 위에 스프라이트(작은 그림 조각)로 얹습니다.
- 화면에서 바뀐 영역만 배경을 되살린 뒤 다시 그려서, 대부분의 화면은 프레임마다 손대지 않습니다.
- 픽셀마다 색과 밝기를 따로 저장해 두고, 하루 25단계 밝기와 가로등 불빛을 마지막에 합칩니다.
- 사람과 차는 미리 그린 애니메이션을 쓰고, 프레임마다 정해진 거리만큼 옮겨 발과 땅이 어긋나지 않게 합니다.
- 피자는 24개 영역으로 나눠 고르게 덮였는지, 마주 보는 조각이 같은지를 따져 점수를 매깁니다.
HN 반응
- AI는 분석에만 쓰고 글은 사람이 쓴 좋은 사례라는 평가가 많았지만, 문장과 그림 설명에 AI 흔적이 보인다는 반론도 나왔습니다.
- 어릴 때 이 게임을 즐긴 이용자들은 피자 평가 규칙이 단순하다는 데 놀랐고, 독일어판에서 노인을 가리키던 말이 '고스족'으로 옮겨진 것은 오역이라는 지적도 있었습니다.
정말 멋진 글입니다. 저도 어릴 때 이 게임을 정말 좋아했습니다.
피자 점수 규칙이 이렇게 단순하다는 게 흥미롭네요. 게임 속 백과사전에 어린이와 십대는 양이 큰 걸 좋아한다는 내용이 있었던 걸로 기억합니다. 그래서 저는 늘 프라이드치킨 한 마리를 통째로 얹은 피자만 만들었습니다. 재현하기 쉬웠고, 재료비가 크니 마진도 커서 돈이 많이 벌렸고, 평가도 좋았거든요.
그리고 토마토소스를 고르게 바른 피자가 아무것도 안 바른 피자보다 점수가 좋다는 것도 분명히 느꼈습니다. 아마 대칭 규칙 때문이었겠죠. 저는 그냥 사람들이 맨 피자를 싫어하도록 하드코딩해 둔 거라고만 생각했습니다.
번역에 관해 흥미로운 점이 있습니다. 이 게임은 독일 게임이라 익살스러운 맛이 아주 깊게 배어 있어서, 대부분의 인구 집단에 재미있고 아주 구어체인 이름이 붙어 있었습니다. 그런데 "Grufties"를 "Goths"로 번역한 것 같더군요. 독일어 Grufti의 실제 뜻(고스 하위문화 구성원)을 생각하면 이해는 갑니다. 하지만 게임에서는 이 말이 나이 든 어르신들(거의 "Gruft" = "지하 묘실"에 들어갈 사람들)을 웃기게 부르는 말로 쓰였습니다. 그러니 사전에서 단어를 그대로 가져온 명백한 오역입니다. 차라리 "Cryptid"(미확인 생물)였다면 더 어울렸을지도 모르겠네요. :D
AI의 도움을 받은 글은 이래야 한다고 봅니다. AI로 디컴파일하고 이것저것 알아냈지만(글 맨 위에 아주 흥미로운 기법이 몇 가지 나옵니다), 글 자체는 사람이 썼습니다. AI를 자기 이해를 돕는 데 썼지, AI에게 모든 걸 시킨 게 아니라는 게 보입니다.
사람이 썼는지 어떻게 아세요?
저는 원 댓글 작성자는 아니지만 그분 말에 동의합니다. 글이 너무 말이 되거든요. 뜬금없이 끼워 넣은 쓸데없는 헛소리도 없고, 거슬리는 LLM 특유의 말투도 별로 안 보입니다.
물론 제가 틀렸을 수도 있겠지만요.
많이 다듬은 글이긴 한데 LLM의 영향이 분명히 있다고 봐요.
(이름이 붙은 애니메이션 시퀀스)
예전에는 아무도 동사를 이런 식으로 남용하지 않았어요. named animation sequence라니요? 그럼 이름 없는 일회용 애니메이션 시퀀스라도 있다는 건가요?
영어 문법 지식이 부족한 사람이 자기가 못 접해 본 표현을 자신 있게 결함이라고 단정하는 걸 보면 웃깁니다.
좀 딱딱하거나 격식 차린 느낌은 있을지 몰라도, "the named sequence"는 영어를 쓰는 진짜 사람이 100% 쓸 만한 표현입니다. 게다가 애니메이션을 이루는 프레임들의 시퀀스라면 당연히 named animation sequence라고 할 수 있습니다.
저도 이런 표현을 써 본 적이 확실히 있어요.
그리고 이 맥락에서는 말 그대로 그런 뜻이에요. .ani 파일에는 각각 이름이 붙은 애니메이션 시퀀스가 여러 개 들어갈 수 있거든요.
영국 영어라서 그런 건 아닐까요? 저라면 그렇게 표현하겠거든요. 다만 저는 독일인입니다. 그래도 "benannte Animationssequenz"는 독일어에서 아주 올바른 표현이고, 이 맥락에서는 전혀 이상하게 들리지 않습니다.
더 중요한 건 사람이 쓴 글처럼 통한다는 사실입니다.
본문은 괜찮아 보이는데, 이미지 캡션이나 제목에서는 AI 느낌이 좀 나요.
(쇼핑몰에 늘어선 할인 게임들 중에서 골랐는데, 그 뒤로 마음에서 떠난 적이 없습니다.)
저도 좋아하는 PC 게임 대부분을 이렇게 찾았고, 이 게임도 그랬습니다.
가격만 적힌 성의 없는 팻말이 꽂힌 세로형 철망 원통이 있곤 했죠. 거기서 아무 게임이나 층층이 파헤치다 보면 놀랄 만큼 자주 진짜 보석을 건졌습니다.
그 시대 최고의 게임 중 일부가 최악의 게임 중 일부와 비슷한 정도의 인기밖에 못 얻었다는 걸 깨달은 건, 십대 초반이던 저에게 눈이 번쩍 뜨이는 경험이었습니다.
글 잘 읽었습니다. 정말 흥미로웠어요! 덕분에 아침을 좋게 시작했습니다.
지금은 대부분의 분야가 비슷하다고 생각합니다. 음악이나 블로그 글 같은 것들요. 그런데 뭔가를 찾아보려 하면 이상하게도 질 좋은 자료를 찾기가 정말 어렵습니다.
몇 년 전에 추천 알고리즘 쪽에서 수학적 진전이 있었습니다. 그 덕에 상황이 꽤 나아질 수 있었을 텐데, 저는 어리석게도 그 진전을 콘텐츠를 더 팔아먹으려는 또 하나의 수단 정도로 깎아내렸습니다. 그 점은 미안하게 생각합니다. 그 뒤로 생각이 바뀌었습니다.
재능 있는 엔지니어가 AI와 손잡고 디컴파일을 해낸 좋은 사례입니다.
에이전트를 오래 돌리고 돈을 쏟아부어 무식하게 밀어붙이는 사람도 많은 것 같은데, 이 분은 6.1 Sol Medium을 썼더군요. 훌륭하긴 해도 최상위 성능의 AI 모델에 최상위 설정은 아닙니다.
재능과 경험이 AI를 쓸 때의 작업 속도와 비용에 큰 차이를 만든다는, 제가 들어온 이야기와 맞아떨어집니다. 가격에 낀 보조금이 사라지면 이게 엔지니어 성과를 평가하는 핵심 요소가 될 겁니다. "토큰은 엄청 썼는데 보여줄 건 별로 없네요!" 하는 식으로요.
이게 어디로 흘러갈지는 아무도 모르지만, 재능과 AI의 조합이 바이브 작업보다 훨씬 낫다는 건 변함없습니다.
대체로 동의하지만, 토큰 사용량과 비용을 생산성 지표로 쓰는 건 직관에 어긋난다는 점은 짚고 싶습니다. 같은 작업이라도 입력이 어떻든 편차가 극단적으로 클 수 있습니다. 프롬프트 작성에 실력이 없다거나 재능이 중요하지 않다는 뜻은 아니고요.
결국 코드 줄 수로 성과를 재는 것과 꽤 비슷하게 느껴집니다.
대신 인당 예산을 정해 두고 성과는 전통적인 방식으로 평가하는 쪽을 권합니다. 물론 예외적인 상황에는 예외를 허용하고요.
저는 이 용도로 DeepSeek 4.1 Flash를 써서 놀랄 만큼 운이 좋았어요. 시간 효율이 특별히 좋진 않지만, 80년대 후반~90년대 초반의 단순한 DOS 게임들이라면 20달러로도 아주 오래 갑니다.
저도 그걸 느꼈습니다. 여기 해커뉴스에서도 시간당 토큰에 100달러씩 태운다고 자랑하는 사람들이 있는데, 제 친구는 유출된 펌웨어와 레퍼런스 매뉴얼만으로 Claude Code를 몰아붙여서 HSM을 포함한 주변장치까지 갖춘 MCU 에뮬레이터를 통째로 만들게 했습니다. 프로젝트 전체에 50유로도 안 들었고요.
디컴파일된 대략적인 원시 코드를 SQLite에 올리는 것보다, MCP 어댑터를 통해 도구 호출로 Ghidra를 직접 쓰는 편이 결과가 더 좋을 겁니다. 특히 vtable이 얽힌 복잡한 간접 점프 패턴처럼 분석 추적이 실패할 때 중요합니다. 상호 참조(xref)와 패턴 검색은 당연히 기본으로 지원하고, 메모리 스냅샷도 불러올 수 있습니다.
"/goal analyze this codebase, assign names for each function, and creates named structs for parameters." 같은 간단한 지시만으로도 꽤 약한 에이전트에서조차 잘 됩니다. 방대한 텍스트를 훑는 건 에이전트의 특기라는 걸 기억하세요!
이 구성은 PS2, N64처럼 코드를 더 동적으로 불러오는 x86 이외의 특이한 아키텍처에도 통합니다.
추억 여행 고맙습니다. 그런데 필자가 이 게임을 Pizza Connection 2라고 부르는 게 맞는지는 의문입니다. 오히려 게임이 스스로를 Pizza라고 부르는 게 맞다고 생각해요. Pizza Connection, Pizza Connection 2, 그리고 마지막으로 Pizza Syndicate가 있었고, 글에 나오는 게 아마 그 Pizza Syndicate일 겁니다.
그건 그렇고, 저도 이 게임이 그립고 수십 년이 지난 지금도 가끔 생각납니다. 아름다운 세계, 훌륭한 메카닉, 흥미로운 특이점과 시간이 지나며 배우게 되는 것들, 심지어 치트까지 있었죠(조직원들을 체력 바가 텅 빌 때까지 '벌줄' 수 있었는데, 그러고 나면 무적이 됐습니다!). 그 그림을 다시 보고, 어떻게 만들어졌는지 알게 되고, 마침내 피자 평가의 비밀까지 이해하게 돼서 좋았습니다!
그래도 이 게임 최고의 기능 중 하나는 핸드북이었습니다. 피자 레시피가 들어 있어서, 저를 비롯한 수많은 십대 소년들이 처음으로 베이킹에 도전하게 만들었을 겁니다.
필자님께, 그리고 이 멋진 게임을 만든 아티스트분들께는 더 큰 감사를 드립니다. 오늘날에도 이런 게임이 다시 나왔으면 좋겠습니다.
위키백과를 보니 필자가 맞네요. pizza syndicate가 connection 2보다 먼저 나왔습니다 :-) 그리고 2018년에 스팀 리메이크와 오픈소스 프로젝트도 있고요!
(Pizza Tycoon(Pizza Connection)의 뒤를 이어 Software 2000이 개발한 Fast Food Tycoon(Pizza Syndicate)과 Fast Food Tycoon 2(Pizza Connection 2)가 나왔다.[8] 네 번째 게임인 Pizza Connection 3는 2018년 Gentlymad Studios가 개발했다.)
(Pizza Connection 1, 2는 2017년 1월 GOG.com에 출시되었다.[9])
(2026년 3월, Pizza Tycoon 엔진을 오픈소스로 재구현한 Pizza Legacy가 최신 운영체제용으로 출시되었다.[10])
https://en.wikipedia.org/wiki/Pizza_Tycoon
최고 점수가 나오는 피자를 찾아내는 후속 글이 정말 보고 싶어요. 이제 최적화로 극한까지 밀어붙일 수 있을 것 같은데, 그렇지 않나요?
저는 이 게임을 해 본 적이 없는데, 멋지네요! 그런데 이렇게 디컴파일이 활발하다면, 누군가 Math for the Real World의 오픈소스 후속작을 만들어 주지 않을까요? 그러면 정말 멋질 텐데요.
훌륭한 글이고, 이런 게임들이 어떻게 만들어졌는지 AI 도구로 막후를 엿볼 수 있다는 점도 좋습니다.
이게 더 많은 사람들에게 창작 의욕을 불러일으켜서, 이런 게임 메카닉에서 영감을 받은 게임이 더 많이 나오고, 나아가 게임을 만들 때 다들 쓰는 잘 알려진 엔진 몇 가지에서 벗어나는 움직임까지 생기면 좋겠습니다.
멋지긴 한데, dirty rect를 쓴다거나 조명용 룩업 테이블이 있다거나 애니메이션이 스프라이트 시트에서 나온다는 걸 알려고 굳이 게임을 디컴파일할 필요는 없잖아요.
이런 프로젝트들(OpenRCT2, OpenLoco, Open...)은 정말 대단합니다!
그런데 이 프로젝트들에는 전부 한 단계가 더 필요합니다. 크리에이티브 커먼즈 같은 라이선스의 자유 에셋이요.
OpenTTD가 마침내 전부 자유 소프트웨어가 됐을 때의 큰 변화가 기억납니다.
이 프로젝트들을 돕게 Blender3D를 알았으면 좋겠지만, 저는 평범한 IT 직장인입니다.
제가 알기로 이건 디컴파일이 아니라 Unity로 다시 만든 것이고, 개발자의 목표가 Unity를 배우는 것이었기 때문에 AI의 도움 없이 만들었습니다.
그 시절(약 30년 전)에는 "Tycoon" 게임이 줄줄이 나왔습니다. Fast Food Tycoon도 그중 괜찮은 편이었고요. 지금까지도 제가 제일 좋아하는 건 Sid Meyer의 Railroad Tycoon입니다.
고전 Transport Tycoon에서는 도로 건널목에서 기관차를 대기시켜 두면 경쟁사의 트럭과 차량을 들이받아 박살낼 수 있었습니다. 이 게임에도 그런 게 있는지 궁금하네요.
바퀴벌레나 냄새나는 치즈, 쥐를 든 사람을 경쟁 업체에 보내고 나서 위생 검사관에게 신고할 수 있었습니다. 아니면 깡패를 보내 손님들을 겁주거나, 직원들을 두들겨 팰 수도 있었고요(물론 상대가 똑같이 나올 때 맞서 싸울 수 있도록 내 피제리아 근처에도 조직원을 붙여 두는 걸 잊으면 안 됩니다!). 제 기억이 맞다면 조직원들이 은행이나 교도소를 털 수도 있었습니다(붙잡힌 동료를 빼내려고요). 다만 그걸 관리하는 데는 품이 많이 들었어요.
저는 "Patrician 3"가 그랬습니다. 그때 정말 즐겁게 했던 게임이에요. 독학으로 프로그래밍을 배우면서 제일 먼저 따라 만들고 싶었던 게임이기도 했고요. 지금도 가끔 생각이 납니다.
저는 이 시대의 게임들이 정말 좋았습니다. Caesar 3이 특히 좋아하던 작품이었고요. 그리고 물론 RCT1도요.