본문으로 건너뛰기

기능

Tabbit이 하는 일을 한자리에 모았습니다.

각 항목의 자세한 내용은 링크에 있습니다.

문서 목록으로


입력

엑셀과 구글 스프레드시트를 모두 읽습니다.

팀이 편한 쪽을 고르면 되고, 한 프로젝트에서 섞어 써도 하나로 합쳐집니다.

Tabbit의 규칙으로 작성되지 않은 시트도 읽습니다.

레이아웃을 소스마다 지정하므로, 규칙이 다른 시트를 한 번에 섞어 읽을 수 있습니다. 시트에 무엇을 적을 수 있나에 예제가 있습니다.

서버와 클라이언트 중 한쪽에만 필요한 데이터를 나눌 수 있습니다.

테이블과 컬럼에 TargetSide를 지정하면 그쪽 빌드에만 들어갑니다.

워크북을 객체 모델로 펼치지 않고 스트리밍으로 읽습니다.

349개 시트를 읽는 실행에서 최대 메모리가 7.4 GB에서 2,757 MB로 줄었습니다. 설계와 실측

시트에 담을 수 있는 것

표현내용
중첩 필드Group.Member 표기로 컬럼 여러 개를 레코드 하나로 접습니다. 깊이 제한이 없어 멤버가 다시 레코드여도, 배열이어도 됩니다
합성 값 타입벡터, 회전, 색을 셀 하나에 적습니다. (1,2,3) · #3366CC · red
bitset플래그 묶음을 값 하나로 받습니다. 진법 리터럴을 쓰고, 빈 칸은 오류입니다
text번역 대상 문자열입니다. 그룹마다 파일 하나로 수집되고, 값은 string 그대로이므로 출력 바이트가 달라지지 않습니다
asset애셋 이름입니다. 그 이름의 파일이 있는지 확인하고, 없으면 어느 셀인지 함께 보고합니다
매트릭스 선언:matrix — 행과 열이 둘 다 키인 격자입니다. 선언 하나가 테이블 둘이 되고, At(행키, 열키) 가 나옵니다. 축의 키는 정수가 아니어도 됩니다
매트릭스 표:matrix 로 적지 않은 격자를 판독 규칙으로 알아보는 쪽입니다. 값은 배열 하나로, 컬럼 id는 옆 테이블로 나옵니다
행 벌한 테이블에 데이터를 여러 벌 둡니다. 지역 변종이 대표적이고, 타입은 하나입니다
STRUCT DSL임베딩 오브젝트와 enum을 시트 밖의 .tbs 파일에 선언합니다. 같은 레코드 타입을 테이블마다 다시 적지 않아도 됩니다
setmap중복 없는 목록과 키·값 쌍입니다. 형식은 그대로 — set은 배열 컬럼 하나이고 map은 길이가 같은 둘입니다. 조회를 순회한 순서는 보장하지 않으므로 순서는 배열이 정합니다

.tbs 를 쓰는 동안 편집기가 판정합니다.

문법 강조 · 진단 · 정의로 이동 · 호버 · 자동완성입니다. 오타와 잘못 적은 타입 이름이 변환을 돌리기 전에 그 자리에서 드러납니다. 편집기

검증

빌드 단계에서 걸러낼 수 있는 문제는 최대한 걸러냅니다.

게임에서 문제가 생긴 뒤에 찾는 대신, 데이터를 만들 때 알게 됩니다.

문제가 발생한 셀을 함께 보고합니다.

구글 스프레드시트라면 링크를 눌러 해당 셀로 바로 이동할 수 있습니다.

여러 문제를 한 번에 모아서 보고합니다.

하나 고치고 다시 실행하기를 반복하지 않아도 됩니다.

타입으로 표현할 수 없는 제약도 시트에서 읽습니다.

범위, 허용값, 필수 여부입니다. 컬럼 제약

검증 결과를 보고서로 남깁니다.

실행이 끝나면 HTML 한 장과 JSON 한 장이 남습니다. 직전 실행과 비교해 신규, 지속, 해소를 구분하고, 경고 이상이면 브라우저가 열립니다. 사용 · 설계

지금 고칠 수 없는 문제는 적어 두고 넘어갑니다.

recipe에 위치와 이유를 적으면 보고는 Info로 남고 실행이 멈추지 않습니다. 다만 건수가 달라지거나 아무것도 맞추지 못한 항목은 오류입니다. 설계

시트로 표현할 수 없는 규칙은 C#으로 작성합니다.

프로젝트의 .cs 파일을 빌드할 때 함께 컴파일해 실행합니다. 검증은 모든 출력보다 먼저 수행되므로, 실패한 실행은 파일에도 데이터베이스에도 결과를 남기지 않습니다. 검증

산출

지원하는 모든 언어로 코드를 생성합니다.

C#(.NET과 유니티), TypeScript, C++, C, Go, Rust, Python, Java, Kotlin, Swift, Lua, Ruby, PHP, Dart와 언리얼 모듈입니다. 언어별 가이드

테이블끼리 참조할 수 있습니다.

같은 값을 여러 시트에 옮겨 적지 않아도 됩니다. 참조는 파일에 인덱스로 저장되고, 로드한 뒤 실제 레코드 참조로 연결됩니다.

파일 대신 데이터베이스로 바로 적재할 수 있습니다.

MySQL, PostgreSQL, MongoDB, Redis입니다. 내보내기

컬럼마다 데이터 특성에 맞는 인코딩을 선택합니다.

사전, RLE, 델타, 비트폭 패킹입니다. 바이너리 형식

로드된 데이터를 HTML로 확인할 수 있습니다.

값이 제대로 들어갔는지 눈으로 보고 넘어갈 수 있습니다.

별도로 설치할 것이 없습니다.

바이너리를 읽는 코드까지 출력 폴더에 함께 생성됩니다. Go는 go.mod, Rust는 Cargo.toml, 언리얼은 Build.cs까지 같이 나옵니다.

데이터만 따로 패치할 수 있습니다.

출력 결과를 CDN에 올려두면 생성된 업데이터가 바뀐 파일만 받아 최신으로 유지합니다. 해시로 검증하고, 일시적인 장애는 재시도하며, 실패하면 이전 데이터를 그대로 둡니다.

실행

변경되지 않은 데이터는 다시 만들지 않습니다.

이전 실행에서 무엇을 읽고 무엇을 생성했는지 기록해 두었다가 비교합니다. 전체 빌드가 필요한 경우에는 왜 필요한지도 함께 출력합니다. 사용 · 설계

검증만 수행하는 실행이 있습니다.

--validate-only는 산출물을 만들지 않습니다. PR 검사가 사용하는 방식입니다.

도구가 출력하는 메시지는 다섯 언어를 지원합니다.

영어, 한국어, 중국어 간체, 중국어 번체, 일본어입니다. 메시지마다 ID가 있어 CI가 종류로 걸러낼 수 있습니다. 설계

안전

빌드가 중간에 실패해도 이전 결과는 그대로 남습니다.

파일은 스테이징 영역에 모았다가 마지막에 한 번에 옮깁니다. 데이터베이스는 섀도 테이블에 채운 뒤 통째로 교체합니다.

읽는 쪽도 같습니다.

이미 로드한 테이블을 다시 읽어도(데이터 패치, 핫 리로드) 전부 읽고 참조까지 연결한 다음 교체합니다. 중간에 실패하면 이전 데이터가 그대로 남고 이유를 알려주므로, 빈 테이블이나 절반만 채워진 테이블이 생기지 않습니다.

스키마가 달라졌을 때 조용히 잘못 읽지 않습니다.

읽을 수 있으면 정확하게 읽고, 읽을 수 없으면 필드 이름과 양쪽 타입을 알려주고 멈춥니다. 바이너리 형식

변조를 검출합니다.

파일 시그니처와 MAC이며, 모든 런타임이 지원합니다. 설계

원자성은 저장소 하나 단위입니다. 파일 여러 개와 데이터베이스 여러 개를 한 트랜잭션으로 묶는 것은 분산 트랜잭션 없이는 되지 않으므로, 각각이 따로 안전하게 교체되도록 만들었습니다.

추적

누가 언제 무엇을 바꿨는지 셀 단위로 남습니다.

--serve로 웹 브라우저에서 확인할 수 있습니다. Summary와 히스토리

데이터 패치와 코드 배포 중 무엇이 필요한지 판정합니다.

커밋마다 히스토리를 비교합니다. 상수만 고쳐 놓고 데이터를 올리는 헛배포, enum 값이 밀린 채 코드만 나가는 사고를 배포 전에 보고합니다.