세상에 하나뿐인 나만의 포켓몬

개요

플레이 도중 선택한 여섯 단어에서 AI가 새로운 포켓몬 종을 생성한다. 몇 분 뒤 그 종은 풀숲에 나타나고, 플레이어는 만나고, 포획하고, 별명을 붙일 수 있다. 모습과 이름뿐 아니라 타입, 종족값, 기술, 게임 안에서 작동하는 데 필요한 데이터까지 만드는 연구 프로토타입이다.

프로토타입에서는 대화, 단어 입력, 백그라운드 생성, 야생 조우, 포획, 명명까지를 게임을 멈추지 않고 하나의 경험으로 연결했다. 새로운 종은 단순한 이미지가 아니라 기존 게임 시스템이 다룰 수 있는 종으로 등록된다.

중심에 둔 것은 생성 모델 자체가 아니라, 사람이 게임 밸런스와 시각적 일관성을 지키는 조건을 정하고 AI가 그 경계 안을 탐색하게 하는 프레임워크다. 프로토타입을 직접 플레이하며, 유일무이하다는 사실만으로 애착이 생기는지도 예비적으로 살펴보았다.

질문 — 유일무이하면 애착이 생길까?

게임에서는 캐릭터를 고르고, 키우고, 이름을 붙이며 ‘나만의 존재’로 만들어 가는 즐거움을 느낀다. 그러나 그 관계의 출발점은 여전히 개발자가 마련한 선택지 안에 있다. 생성형 AI로 캐릭터의 출발점부터 플레이어 고유의 존재를 만들 수 있다면, 애착은 더 강해질까?

이 질문을 살피려면 이미지 한 장을 생성하는 것만으로는 부족하다. 생성된 존재가 게임 세계에 들어오고, 조우하고, 포획되며, 이후에도 사용할 수 있어야 한다. 그래서 플레이어의 관여 정도가 다른 두 가지 경로를 만들었다. 할아버지에게 말을 걸면 입력 없이 생성되고, 할머니에게 말을 걸면 플레이어가 여섯 단어를 고른다. 먼저 말을 건 인물에 따라 그 플레이의 생성 방식이 정해진다.

이 프로토타입의 목적은 애착에 대한 결론을 내리는 것이 아니다. 생성 콘텐츠를 평범한 플레이에 통합하는 방법을 마련하고, 이후 연구에서 비교할 수 있는 조건을 찾아내는 데 있다.

플레이의 흐름

아래는 플레이어가 단어를 고르는 관여 생성 경로다. 페탈버그 숲에서 할머니에게 말을 걸고, 게임에 원래 있는 간편 대화 어휘에서 여섯 단어를 고른다. 플레이를 계속하는 동안 백그라운드에서 생성이 진행되고, 준비가 끝나면 울음소리가 들린다. 풀숲에 들어가면 새로운 종이 나타나며, 다른 야생 포켓몬과 같은 조작으로 포획할 수 있다. 이름, 타입, 종족값, 기술, 앞·뒤 배틀 스프라이트, 파티 아이콘은 실행할 때마다 생성된다. 전체 흐름은 데모 영상에서 확인할 수 있다.

페탈버그 숲에 노부부가 서 있다. 대화창에 “그래… 어떤 생물을 떠올리고 있니?”라고 적혀 있다.
할머니에게 말을 거는 것으로 시작된다.
“떠올린 생물:”이라는 제목의 간편 대화 입력 화면. BEAUTIFUL, ATTACK, FIRE라는 단어가 입력되어 있다.
에메랄드에 원래 있는 간편 대화 시스템으로 여섯 단어를 건넨다.
플레이어가 풀숲 옆 숲속에 서 있다. 대화창에 “풀숲이 흔들리고 있다… 무언가가 있다!”라고 적혀 있다.
생성은 PC에서 몇 분 동안 진행된다. 울음소리가 준비를 알린다.
배틀 화면. 머리에 불꽃이 달린 붉은 도마뱀이 플레이어와 마주 서 있다. “Wild FLAMEREL appeared!”라고 표시되어 있다.
흔들리는 풀숲에서 불꽃 타입 도마뱀 FLAMEREL이 나타난다.
배틀 중에 FLAMEREL을 향해 몬스터볼이 던져지고 있다.
다른 어떤 종과도 똑같이 몬스터볼로 잡을 수 있다.
FLAMEREL의 별명을 묻는 이름 입력 화면. GGG가 입력되어 있다.
다른 어떤 종과도 똑같이 별명을 붙일 수 있다.
파티 화면. 생성된 종이 자기 파티 아이콘을 달고 평범한 포켓몬 세 마리와 나란히 있다.
다른 어떤 종과도 똑같이 자기 아이콘을 달고 파티에 들어간다.
FLAMEREL의 포켓몬 정보 화면. 불꽃 타입, Blaze 특성, 짓궂은 성격, 페탈버그 숲에서 레벨 7에 만난 것으로 표시되어 있다.
다른 어떤 종과도 똑같이 요약 화면이 작동한다.

설계 과제 — 자유롭게 생성하면 게임이 무너진다

AI가 새로운 캐릭터를 생각해 내는 능력과 그 캐릭터가 게임 안에서 성립하는 능력은 별개의 문제다. 능력이 지나치게 높으면 난이도 밸런스가 무너지고, 타입과 기술이 맞지 않으면 육성하기 어렵다. 모습이 너무 복잡하면 64×64픽셀 스프라이트로 바꿨을 때 형태를 알아볼 수 없다.

반대로 모든 것을 고정하면 실행할 때마다 다른 것이 태어나는 의미가 없다. 필요한 것은 AI의 자유를 없애는 일이 아니라, 플레이로서 지켜야 할 부분과 변화를 허용할 부분을 나누는 일이었다.

그래서 디자인의 대상을 한 마리의 포켓몬에서 포켓몬이 생성될 수 있는 공간으로 옮겼다. 사람이 목적, 제약, 금지 사항, 검증 방법을 정의하고 AI는 그 틀 안에서 후보를 구체화한다. 이 프로토타입은 나의 디자인 철학에서 말한 제약 기반 접근을 실제로 작동하게 만든 것이다.

접근 — 결과물이 아니라 생성 조건을 디자인한다

LLM에 자유문을 쓰게 하는 대신, 이름, 타입, 종족값, 기술, 체형, 색처럼 미리 정한 항목을 채우게 한다. 모든 출력은 채택하기 전에 검증기가 검사한다. 규칙을 어기면 어떤 규칙이 위반되었는지 모델에 알려 주고, 모든 조건을 만족할 때까지 다시 생성하게 한다.

  1. 사람이 경계를 정한다. 게임 밸런스, 스프라이트 크기에서의 가독성, 금지 표현을 명시적이고 검사 가능한 규칙으로 만든다.
  2. AI가 후보를 구체화한다. 플레이어의 단어를 바탕으로 허용된 항목의 값을 제안한다.
  3. 시스템이 규칙을 검증한다. 수치 범위, 기술 조합, 금지 표현을 자동으로 확인한다.
  4. 위반만 피드백한다. 규칙을 어긴 후보는 이유와 함께 돌려보내 다시 생성한다.

플레이를 지키는 제약. 종족값 합계는 280~360 범위로 정하고 각 능력치에도 상한과 하한을 두었다. 기술은 게임 소스에서 추출해 해당 종의 타입 또는 노멀 타입에 맞는 것으로 제한했다. 여기에 일격필살기, 자폭기, 고정 대미지 기술, 지나치게 강한 기술을 제외하고, 공격 기술의 수와 같은 타입 기술의 유무도 검사했다. 포획률, 성장 속도 등은 고정해 생성에 따른 차이가 비교 가능한 범위 안에 머물도록 했다.

외형을 지키는 제약. 체형은 작은 스프라이트에서도 윤곽을 유지하기 쉬운 후보에서 고르고, 색과 특징의 어휘도 제한했다. 인간적인 특징, 유혈, 무기, 문자는 제외한다. 마지막으로 ‘한 개체만’, ‘전신’, ‘팔다리를 더 만들지 말 것’과 같은 붕괴 방지 조건을 이미지 생성 지시에 항상 덧붙인다.

한 기록에서 모델은 처음에 종족값 합계 380을 제안했다. 프레임워크가 위반을 찾아 재생성을 요청했고, 결국 320인 사양으로 수렴했다. 중요한 점은 우연히 좋은 결과가 나왔다는 것이 아니라, 틀 밖의 결과를 채택하지 않는 과정을 설계했다는 것이다.

경험을 게임 안에서 완결한다

플레이어가 접하는 것은 게임 속 대화, 단어 선택, 풀숲에서의 조우뿐이다. 생성을 위해 별도의 화면을 열 필요가 없다. 계산량이 큰 처리는 PC의 Python 프로세스가 맡고, 게임과 파일을 통해 협력한다. mGBA의 Lua 스크립트가 둘을 연결해 기존 게임 같은 조작감을 유지하면서 외부 AI 처리를 분리했다.

  1. 사양을 만든다. 로컬 언어 모델이 여섯 단어를 검증된 종 데이터로 바꾼다.
  2. 모습을 만든다. 이미지 모델이 참조 일러스트를 그리고, 거기서 시각적으로 일관된 앞·뒤 스프라이트와 파티 아이콘을 만든다.
  3. 게임 데이터로 변환한다. 이미지를 15색으로 줄이고 GBA가 다룰 수 있는 스프라이트와 팔레트로 변환·압축한다.
  4. 실행 중인 게임에 반영한다. 예약 영역에 데이터를 쓰고 게임을 재시작하지 않은 채 새 종을 등장시킨다.

같은 데이터를 디스크에도 기록하므로 생성된 종은 게임을 다시 불러와도 남는다. 생성은 한 번뿐이고 되돌릴 수 없다. 플레이어가 도망치거나 조우에서 패하면 포켓몬은 세계에 남지만, 쓰러뜨리면 다시 나타나지 않는다. 이 비가역성이 ‘세상에 하나뿐’이라는 말에 체험 속 결과를 부여한다.

프로토타입에서 확인한 것

이것은 한 사람이 만든 실현 가능성 검증이며, 완성된 게임이나 사용자 실험이 아니다. 도달한 지점과 아직 검증하지 않은 범위는 다음과 같다.

직접 플레이하며 배운 것 — 유일무이하다는 사실만으로는 애착이 생기지 않았다

프로토타입을 직접 플레이했을 때 생성된 포켓몬에 강한 애착은 생기지 않았다. 이는 구현자 한 사람의 개인적인 소감일 뿐 일반화할 수 있는 실험 결과가 아니다. 하지만 다음 비교에서 무엇을 바꿔야 할지를 보여 주는 단서는 되었다.

애착에 영향을 줄 가능성이 큰 조건은 두 가지로 보인다.

반면 자동 게임 파이프라인 밖에서 여러 생성형 AI와 반복해 대화하고 직접 다듬어 만든 하나기쓰네(Hanagitsune)에는 애착을 느낀다. 후보를 비교하고 세부를 고치며 만족할 때까지 계속했다. 결과물의 품질과 판단·반복을 포함한 과정이 모두 있었기 때문이라고 생각한다.

하나기쓰네의 앞모습. 꼬리가 꽃이 핀 덩굴로 흘러내리는 옅은 초록빛 여우. 하나기쓰네의 뒷모습. 꽃이 핀 꼬리의 전체 길이가 보인다.
하나기쓰네 — 꽃이 핀 꼬리를 가진 숲의 수호자. 지나간 자리마다 풀과 꽃이 돋아나, 메마른 땅에도 새로운 생명을 불러들인다. 그 모습은 숲이 미래를 향해 자라나는 징표로 여겨진다.
Hanagi2ne의 포켓몬 정보 화면. 풀 타입, Overgrow 특성, 용감한 성격, 페탈버그 숲에서 레벨 7에 만난 것으로 표시되어 있다. 스프라이트는 꽃이 핀 꼬리를 가진 옅은 초록빛 여우다. 배틀 화면. 뒷모습으로 보이는 Hanagi2ne가 야생 Poochyena와 마주 서 있다. “Hanagi2ne used ABSORB!”라고 표시되어 있다.
반복적인 대화와 수작업으로 다듬어 만든 하나기쓰네를, 게임 안의 한 종으로 구현했다.

이 프로토타입은 ‘생성 콘텐츠가 애착을 낳는가?’라는 질문에 답한 것이 아니다. 모호했던 질문을 의도적으로 바꿀 수 있는 두 요소, 즉 결과물의 품질과 관여의 깊이로 나누었다. 다음 검증에서는 제작 과정에 선택, 비교, 수정을 넣고 결과물의 품질을 일정 수준으로 맞춘 뒤 여러 참가자를 비교해야 한다.

구현

생성 파이프라인, 제약·검증 프레임워크, GBA 데이터 변환, 게임 쪽 변경 사항은 GitHub 저장소에 공개했다.

pret/pokeemerald 디컴파일을 바탕으로 개인 연구로 제작했다. ROM, ROM 패치, 게임 내 애셋은 어느 것도 배포하지 않으며, 여기에 실린 스프라이트는 모두 AI가 생성한 오리지널이다. 포켓몬은 닌텐도, 주식회사 크리처스, 주식회사 게임프리크의 상표이며, 이 프로젝트는 이들 기업과 아무 관계가 없고 승인도 받지 않았다.