대본을 프로그램이 읽을 수 있는 데이터로 바꾸는 방법: 노드, 선택지, 조건과 결과
대본을 프로그램에 연결할 때 핵심은 Word 파일을 JSON에 복사하는 것이 아니라 안정적인 서사 데이터 계약을 만드는 것입니다. 각 노드는 무엇을 재생하고 언제 상호작용을 표시할지 설명합니다. 각 선택지는 표시 조건, 플레이어의 의도, 상태 변화 결과와 대상 노드를 설명합니다. 텍스트, 미디어, 로직은 서로 참조하면서도 각각 추적 가능한 버전을 갖습니다.

들어가며
대본을 프로그램에 연결할 때 핵심은 Word 파일을 JSON에 복사하는 것이 아니라 안정적인 서사 데이터 계약을 만드는 것입니다. 각 노드는 무엇을 재생하고 언제 상호작용을 표시할지 설명합니다. 각 선택지는 표시 조건, 플레이어의 의도, 상태 변화 결과와 대상 노드를 설명합니다. 텍스트, 미디어, 로직은 서로 참조하면서도 각각 추적 가능한 버전을 갖습니다.
안정적인 ID부터 시작하기
챕터, 장면, 노드, 선택지, 에셋에는 모두 고유한 ID가 필요합니다. 표시 제목은 바꿀 수 있지만, 제작에 사용되기 시작한 ID는 재사용하지 않습니다. 예를 들어 노드는 C02_S04_N030, 선택지는 C02_S04_N030_O2, 영상은 C02_S04_N030_main_v07.mp4로 지정할 수 있습니다. 프로그램, 자막, 이벤트 계측, 결함 보고서는 모두 같은 식별자를 사용합니다.
ID에는 배우 이름, 감정, 최종 대사를 포함하지 않습니다. 이런 정보는 바뀔 수 있기 때문입니다. 폐기한 ID는 변경 기록에 남겨 이전 저장 데이터나 로그가 새 콘텐츠를 잘못 가리키지 않도록 합니다.
노드 구조의 각 부분에는 하나의 책임만 부여하기
노드 데이터에는 id, media, entryConditions, onEnter, interactions, onExit, fallback, tags가 포함될 수 있습니다. 미디어 필드는 에셋 목록을 참조하며 로컬 절대 경로를 직접 섞어 넣지 않습니다. 조건은 상태를 읽기만 하고, 효과는 허용된 상태에만 값을 씁니다.
{
"id": "C02_S04_N030",
"media": "VID_C02_S04_N030_MAIN",
"entryConditions": ["evidence_recording == true"],
"interactions": ["C02_S04_N030_O1", "C02_S04_N030_O2"],
"fallback": "C02_S04_N040"
}
이 예시는 역할의 경계만 보여 줍니다. 실제 형식은 JSON, 스프레드시트 내보내기 파일 또는 서사 스크립트를 사용할 수 있습니다. 중요한 것은 같은 사실을 관리하는 기준 위치가 하나뿐이어야 한다는 점입니다.
선택지에는 표시 방식과 결과를 함께 기록하기
선택지에는 문구 키, 표시 조건, 선택 가능 조건, 시간 제한 규칙, 상태 효과, 대상 노드가 필요합니다. 보이지만 선택할 수 없다면 플레이어에게 이유를 알려야 합니다. 완전히 숨긴다면 빈 버튼을 남겨서는 안 됩니다. 문구에는 현지화 키를 사용하고, 중국어 원문을 로직 판단 기준으로 삼지 않습니다.
효과에는 불리언 값 설정, 자원 추가, 관계 단계 변경처럼 제한된 연산을 사용하는 것이 좋습니다. 각 선택지 안에 임의의 스크립트를 숨길 수 있게 하면 작가의 데이터가 검토할 수 없는 프로그램으로 바뀝니다. 복잡한 동작은 이름이 있는 명령을 통해 런타임에서 구현하도록 합니다.
조건은 검증하고 설명할 수 있어야 합니다
조건은 변수 표의 정식 이름을 참조하고 비교 유형을 제한합니다. 불리언 값과 문자열을 혼용하지 않고, 열거형은 유효한 값만 허용하며, 숫자에는 상한과 하한을 설정합니다. 편집기나 빌드 스크립트는 내보내기 과정에서 알 수 없는 변수, 도달할 수 없는 노드, 출구 없는 순환, 누락된 대상을 검사합니다.
복잡한 조건은 이름이 있는 규칙으로 나눕니다. 예를 들어 can_publish_truth는 핵심 증거가 모두 갖춰졌는지, 기자가 여전히 협력하는지, 자원이 충분한지로 구성됩니다. 테스트 로그에는 규칙의 결과와 기초 값을 함께 출력해야 플레이어에게 특정 선택지가 보이지 않은 이유를 설명할 수 있습니다.
미디어 목록과 서사 데이터 분리하기
노드는 논리적 에셋 ID만 참조합니다. 에셋 목록은 이 ID를 플랫폼, 언어, 화질별 파일에 매핑합니다. 이렇게 하면 편집본을 v06에서 v07로 바꿔도 분기 로직을 수정할 필요가 없습니다. 모바일에서 더 낮은 비트레이트를 사용하더라도 노드 전체를 복제하지 않습니다.
목록에는 최소한 파일, 체크섬, 재생 시간, 해상도, 오디오 트랙, 자막, 버전, 검토 상태를 기록합니다. 런타임은 로딩 전에 체크섬과 재생 시간을 검증해 잘못된 영상이나 잘린 영상이 정식 배포 패키지에 들어갈 가능성을 줄일 수 있습니다.
명확한 실행 순서 설계하기
노드 진입, 미디어 준비, 재생, 선택지 표시, 선택 제출, 효과 적용, 노드 이탈의 순서를 정합니다. 상태를 먼저 기록하는지, 먼저 이동하는지에 따라 다음 노드의 진입 조건 판단이 달라집니다. 선택 제출은 원자적 트랜잭션으로 처리하는 것을 권장합니다. 여전히 선택 가능한지 검증하고, 결과를 기록하고, 로그를 남긴 다음 이동합니다. 실패하면 상태를 변경하지 않고 복구 방법을 제공합니다.
시간 초과, 건너뛰기, 저장 데이터 불러오기, 반복 클릭도 같은 상태 머신을 거쳐야 합니다. 버튼은 제출 직후 잠가 더블 클릭으로 두 번 기록되는 것을 막습니다. 나갔다가 다시 들어올 때는 제출 완료 표시에 따라 복원하며 보상을 다시 지급하지 않습니다.
데이터 검증과 읽기 쉬운 로그 구축하기
빌드할 때마다 ID의 고유성, 참조 대상의 존재, 최소 하나의 출구, 변수 유형의 정확성, 현지화 키의 완전성, 미디어를 찾을 수 있는지를 자동으로 검사합니다. 경고와 오류는 심각도에 따라 구분합니다. 선택 사항인 메모가 없으면 경고할 수 있지만, 대상 노드가 없으면 반드시 빌드를 막아야 합니다.
실행 로그는 구조화된 이벤트로 세션, 노드, 선택지, 변경 전후의 상태 요약, 시간, 버전을 기록합니다. 로그에는 불필요한 개인정보를 포함해서는 안 됩니다. 디버그 빌드는 더 자세히 기록할 수 있지만, 정식 분석 이벤트는 개인정보 보호 및 동의 요건을 준수해야 합니다.
프로그래머가 아닌 사람도 검토할 수 있게 하기
기계가 읽을 수 있다고 해서 사람이 읽기 어려워야 하는 것은 아닙니다. 같은 데이터에서 노드 표, 분기 그래프, 플레이 가능한 미리보기를 생성하면 작가는 대사를, 제작자는 에셋을, 테스터는 경로를 확인할 수 있습니다. 수작업으로 만든 모든 사본에는 원본에 다시 반영할 수 없다고 표시해 여러 사람이 서로 다른 기준 데이터를 관리하는 일을 막습니다.
다음 단계: 노드 열 개를 골라 최소 데이터 스키마를 정의하고, 올바른 예시 하나와 의도적으로 잘못 만든 예시 세 개를 작성합니다. 빌드 검사가 알 수 없는 변수, 연결 대상이 없는 출구, 누락된 미디어를 정확히 차단하는 것을 확인한 뒤 전체 대본을 가져옵니다.


