dev
Baba Is you 모작


Baba Is You 모작

bookmark

작업기간

2024-12-11 ~ 2025-01-19

기술 스택

  • C++
  • Windows API
  • FMOD

개요

Windows API를 사용해 Baba Is You를 모작한 개인 프로젝트입니다. 단어의 배열에 따라 승리 조건과 상호작용 대상이 달라지는 원작의 규칙이 어떻게 구현되는지 궁금해 시작했습니다.

그리드 기반의 게임 진행, 블록 특성과 키워드의 매칭, 되돌리기, 스테이지 제작용 툴을 구현했습니다.

프레임워크

게임의 이동과 상호작용은 그리드 안에서 처리하도록 구성했습니다. Windows API를 이용해 UI와 마우스의 화면 공간 내 충돌을 판정했고, FMOD를 연결해 사운드를 재생했습니다.

이 프로젝트에서는 게임 규칙을 표현하는 그리드 데이터와, 이전 상태로 돌아가기 위해 보관하는 그리드 정보를 중심으로 기능을 구성했습니다.

게임 로직

단어 배열을 규칙으로 변환

CGrid::CheckSentence는 그리드에서 명사 블록을 모은 뒤, 오른쪽과 아래쪽의 연속된 세 칸을 검사합니다. 명사 → 동사 → 명사 또는 속성으로 구성된 조합을 찾으면 CRule의 주어·동사·목적어로 연결합니다.

ApplyRule에서는 주어에 대응하는 오브젝트를 찾고, IS 규칙의 목적어가 명사이면 대상의 형태를 바꾸고 속성이면 해당 속성을 추가합니다. 문장이 끊기면 기존 규칙을 비활성화하고 속성을 제거하는 경로도 마련했습니다. 원작의 모든 문법을 지원하는 범용 파서가 아니라, 연속된 세 블록의 기본 문장 규칙을 중심으로 구현했습니다.

연쇄 밀기와 이동

YOU 속성을 가진 오브젝트를 이동시키고, 앞에 PUSH 블록이 있으면 CheckPushChain에서 경계와 이동 가능 여부를 재귀적으로 확인합니다. STOP, HOT/MELT, DEFEAT 등 속성별 판정도 그리드의 이동·상호작용 처리에 연결했습니다.

되돌리기

이동 처리 전에 CLevel::SaveMove가 CGrid 복사본을 stack<CGrid>에 저장하고, Z 입력 시 Undo가 스택 최상단의 배치를 현재 그리드로 옮깁니다.

다만 CCell의 블록 목록은 원시 포인터를 보관하며, 그리드 복사와 복원에서도 블록 참조가 공유되는 구조입니다. 따라서 모든 블록 속성과 규칙까지 독립적인 스냅샷으로 보존된다고 보장할 수는 없습니다. 완전한 상태 복원을 위해서는 블록 값·규칙 참조·소유권을 함께 검증하는 작업이 필요합니다.

그리드

스테이지마다 필요한 크기의 그리드를 만들고, 그 안에 타일과 블록을 배치했습니다. 화면 전체의 자유로운 좌표 대신 그리드 안의 배치를 기준으로 게임을 구성해, 퍼즐에 필요한 오브젝트와 단어를 같은 공간에서 다룰 수 있도록 했습니다.

툴

CEdit에서 방향키로 그리드의 가로·세로 크기를 조절하고, 블록 패널에서 고른 항목을 마우스로 배치할 수 있도록 했습니다. S와 L 입력으로 CBlockManager의 저장·불러오기를 호출합니다.

맵 파일에는 가로·세로 크기와 블록의 위치·종류·이미지 키를 WriteFile로 기록하고, ReadFile로 읽어 그리드를 구성합니다. 반복적인 배치 코드를 데이터 파일로 옮긴 형태이며, 파일 형식 버전 관리나 잘못된 파일의 안전한 복구까지 갖춘 범용 에디터로 구현한 것은 아닙니다.

결과와 한계

그리드, 규칙에 사용할 키워드, 스테이지 제작, 되돌리기를 한 프로젝트 안에서 연결하며 혼자서 게임 프로젝트를 마무리한 경험을 얻었습니다.

다만 캐릭터 이동 보간과 충분한 이펙트는 구현하지 못했습니다. 개발 중 모작 대상을 바꾸면서 시간이 부족해졌고, 계획했던 스테이지를 모두 제작하지 못했습니다.

시연 영상

코드 근거와 분석 범위

GitHub 저장소의 main 커밋 1cb1e23 기준입니다.

개발 기간은 기존 프로젝트 기록을 따랐습니다. 저장소의 마지막 커밋 날짜만으로 실제 개발 종료일을 단정하지 않았으며, 빌드·플레이 재검증은 수행하지 않았습니다.