본문으로 건너뛰기

페이지 작성

페이지는 공개 저장소 bullet-hero/docs에 있는 Markdown 파일입니다. 변경은 풀 리퀘스트로 들어옵니다: 포크, 브랜치, 모든 언어에 반영한 변경, 스타일 가이드에 따른 확인

저장소

프로젝트의 모든 저장소는 bullet-hero 조직에 있습니다. 공개된 저장소:

저장소담고 있는 것
bullet-hero/releases릴리스에는 게임의 모든 공개 빌드, 이슈에는 플레이어가 올린 게임 관련 버그와 요청
bullet-hero/sdkSDK 코드, 이슈에는 SDK 관련 버그와 요청
bullet-hero/docs이 페이지들과 그 번역
bullet-hero/backend서버, 아직 비어 있음

게임 코드(bullet-hero/game)와 사이트 코드(bullet-hero/frontend)는 비공개입니다

이 페이지는 bullet-hero/docs에 관한 것입니다

변경을 보내는 방법

  1. bullet-hero/docs 저장소를 포크하고 브랜치를 만듭니다
  2. 아래에 설명된 형식으로 페이지를 편집하거나 추가합니다
  3. 모든 언어에서 페이지를 바꾸거나, 아직 변경이 필요한 언어를 풀 리퀘스트에 적습니다. 자세히 - 번역
  4. 텍스트가 스타일 가이드에 맞는지 확인합니다
  5. 무엇을 왜 바꿨는지 짧게 설명을 달아 풀 리퀘스트를 엽니다

사실은 게임, SDK 또는 그 문서에서 가져옵니다. 숫자, 필드 이름, 파일 이름, 단축키, 주소는 절대 추측하지 않습니다. 확실하지 않은 것이 있나요? 페이지가 아니라 풀 리퀘스트에 그렇게 적습니다

승인된 변경은 몇 분 안에 bullethero.space에 나타납니다: master에 푸시할 때마다 사이트가 다시 빌드됩니다

팁

사이트 코드가 비공개이므로 사이트를 직접 빌드할 수는 없습니다. 가장 가까운 미리 보기는 Obsidian입니다: Obsidian에서 찾을 수 없는 링크는 사이트에서도 찾을 수 없습니다

저장소의 구조

  • Markdown만 있습니다. 자체 빌드도 스크립트도 없습니다
  • Obsidian 보관소입니다. 저장소의 루트 폴더를 보관소로 열면 링크, 임베드, 미리 보기가 사이트에서와 똑같이 동작합니다. 다른 Markdown 에디터도 사용할 수 있습니다
  • 사이트의 서브모듈입니다. 사이트는 이 저장소를 content/ 폴더로 포함하고, 빌드할 때 페이지를 컴파일하며 모든 페이지를 미리 렌더링합니다. 사이트는 이 저장소의 최신 master에서 빌드됩니다

무엇이 어디에 들어가는가

경로담고 있는 것사이트 주소
<lang>/docs/1_game/플레이어용: 설치, 플레이, 설정, 메커니즘/docs/game
<lang>/docs/2_editor/레벨 제작자용: 에디터 가이드와 레퍼런스/docs/editor
<lang>/docs/3_sdk/개발자용: 공개 SDK, 레벨 형식/docs/sdk
<lang>/docs/4_server/서버 호스트용: 공식 서버와 커뮤니티 서버/docs/server
<lang>/docs/5_changelog/변경 기록, 게임 버전마다 한 페이지/docs/changelog
<lang>/notes/글, 커뮤니티, 편집 규칙, 공개 문서와 정책, 날짜순/notes/<name>
<lang>/tags/태그 페이지/tags/<tag>
<lang>/download.md다운로드 페이지/download
assets/모든 언어용 이미지페이지에 임베드됨

<lang> 자리에는 언어 폴더가 들어갑니다: en, ru, zh, zh-Hant, ja, ko, es, pt 또는 fr. docs/, notes/, tags/, download.md 밖에 있는 파일은 페이지가 되지 않습니다

문서는 지금 어떻게 동작하는지를 설명합니다. 변경의 역사, 의견, 에세이는 notes/에 노트로 씁니다

파일 이름과 순서

  • 사이드바의 순서는 N_ 접두사로 정해집니다. 접두사는 docs/ 안의 모든 파일과 폴더에 붙으며, 1_, 2_, 그 뒤로 10_ 이상까지 이어집니다
  • 접두사는 주소에 들어가지 않습니다. 1_game/3_controls.md 파일은 /docs/game/controls 주소에서 열립니다
  • index.md에는 접두사가 없습니다. 폴더의 랜딩 페이지입니다. 폴더의 위치를 그대로 가지며 사이드바 그룹에 이름을 붙입니다
  • 순서를 바꾸려면 파일 이름을 바꿉니다. Obsidian 설정에서 "Automatically update internal links" 옵션을 켜면 모든 링크가 자동으로 고쳐집니다
  • 접두사를 뺀 이름은 한 언어 안에서 고유합니다. 두 파일이 같은 주소로 겹치면 사이트 빌드가 이를 알립니다
  • 접두사가 붙은 이름은 모든 언어에서 같습니다. en/docs/2_editor/4_craft/3_difficulty-curve.md 파일과 ru/docs/2_editor/4_craft/3_difficulty-curve.md 파일은 같은 페이지입니다
  • notes/에는 접두사도 하위 폴더도 없습니다. notes/cookie-policy 페이지의 이름은 절대 바꾸지 않습니다: 사이트의 쿠키 배너가 이 페이지로 링크합니다

프런트매터, 제목, 설명

모든 페이지는 이렇게 시작합니다:

---
title: Difficulty and the curve
date: 2026-09-24
tags: [level_author]
---

# Difficulty and the curve

One line that says what the page is, up to 200 characters, no markup
  • title, H1, 설명은 페이지의 언어로 씁니다. 위의 예는 영어판에서 가져온 것입니다
  • 프런트매터는 title, date, tags입니다. 다른 것은 읽지 않습니다. date 필드는 YYYY-MM-DD 형식이며, 작성일이 아니라 마지막 업데이트 날짜입니다. 파일을 편집하면 date 값을 편집한 날짜로 바꿉니다
  • # H1 제목은 필수이며 title 값과 같습니다. 사이트는 페이지 본문만 보여 주므로 H1 제목이 화면에 보이는 제목입니다
  • H1 다음의 첫 문단은 설명입니다. 목록, 검색, 링크 미리 보기에 표시되며 200자에서 잘립니다. 링크나 서식 없이 한 줄로 씁니다. 페이지에 무엇이 있는지 설명하는 대신 페이지의 질문에 짧게 답합니다 - 스타일 가이드 › 페이지 도입부
  • 섹션은 ##, 하위 섹션은 ###입니다. 앵커와 목차를 만듭니다. 더 깊은 단계는 필요 없습니다

대상 태그

모든 문서 페이지에는 이 목록에서 고른 태그가 1개에서 3개까지 붙습니다. 태그는 snake_case 형식으로, # 없이 씁니다. 사이트는 태그를 페이지에 표시합니다

태그사이트에서대상
player플레이어일반 플레이어
advanced_player고급 플레이어메커니즘에 관심 있는 플레이어
level_author레벨 제작자에디터에서 레벨을 만드는 사람
developer개발자SDK 위에 무언가를 만들거나 게임을 확장하는 사람
server_host서버 운영자자신과 친구들을 위해 서버를 운영하는 사람
server_advanced고급 서버 운영자서버를 확장하거나 직접 작성할 준비가 된 대규모 서버 호스트
contributor문서 기여자이 저장소의 텍스트와 번역을 편집하는 사람

notes/의 노트에는 대신 주제 태그를 씁니다. 현재는 legal (법률 문서)입니다

독자는 태그 코드를 보지 않습니다. 라벨은 태그 페이지 <lang>/tags/<code>.md에서 옵니다:

  • 그 페이지의 title 값이 라벨입니다
  • 첫 문단은 대상 독자를 설명합니다
  • 태그가 붙은 페이지 목록은 사이트가 직접 추가합니다

새 태그에는 모든 언어에 이런 페이지가 필요합니다

텍스트에서 태그를 언급하려면 그 페이지로 링크합니다: [[level_author]]. 링크는 독자의 언어로 된 라벨을 보여 줍니다

링크

대상방법
다른 페이지[[3_difficulty-curve]], 접두사를 포함한 전체 파일 이름으로
페이지의 섹션[[3_difficulty-curve#Anchor]]
폴더 랜딩 페이지[[2_editor/4_craft/index]], 이런 페이지는 이름이 모두 index이므로 경로를 포함해서
외부 사이트[text](https://…), 스킴을 포함한 전체 주소로

링크는 언어가 없는 주소로 이어지므로, 하나의 소스가 모든 언어에서 동작합니다. [[cookie-policy]] 링크는 영어 독자를 영어 페이지로, 러시아어 독자를 러시아어 페이지로, 중국어 독자를 중국어 페이지로, 일본어 독자를 일본어 페이지로, 한국어 독자를 한국어 페이지로, 스페인어 독자를 스페인어 페이지로, 포르투갈어 독자를 포르투갈어 페이지로, 프랑스어 독자를 프랑스어 페이지로 보냅니다

존재하는 페이지로만 링크합니다. 사이트 빌드는 해결하지 못한 링크를 모두 알립니다

이미지

이미지는 저장소 루트의 assets/에 있으며 ![[file.png]] 구문으로 임베드합니다

하나의 폴더가 모든 언어에 쓰입니다. 이미지 안에 그려진 텍스트는 페이지와 함께 번역되지 않습니다

콜아웃

구문색용도
> [!note], > [!info], > [!tip]파랑맥락, 지름길, 권장
> [!warning], > [!caution]노랑시간이나 품질을 잃음, 작업을 날림
> [!danger], > [!bug]빨강렌더링되지만 스타일 가이드에서는 쓰지 않음

어떤 콜아웃을 고를지, 그 제목, 페이지당 두 개라는 한도 - 스타일 가이드

숫자, 버전, UI 라벨

게임이 정하는 숫자 - 아바타의 속도, 설정 기본값, 크기 한도 - 그리고 현재 버전은 페이지에 직접 입력하지 않습니다. 이 값들은 저장소 루트의 values.yaml에 있고, 페이지에는 사이트가 빌드할 때 채워 넣는 플레이스홀더를 씁니다:

  • {{v:avatar.move-speed}} 형태는 values.yaml의 값입니다. 사이트는 페이지 언어가 숫자를 쓰는 방식대로 씁니다: 영어에서는 0.15, 러시아어에서는 0,15
  • {{ui:menu_main_sandbox-btn}} 형태는 game/<lang>.yaml의 UI 라벨이며, 페이지 자체의 언어로 표시됩니다
  • {{ 표기는 중괄호 두 개를 문자 그대로 씁니다

존재하지 않는 키는 사이트 빌드를 멈추게 하므로, 새 숫자는 먼저 values.yaml에 넣습니다. 역사 속 한 시점으로 언급한 버전("gv 1.0.0부터")은 텍스트로 남깁니다. Obsidian에서는 플레이스홀더가 쓰인 그대로 보입니다

코드와 기타 마크업

  • 코드 하이라이팅은 ts, tsx, js, json, csharp, bash, yaml, css, md에만 있습니다. 다른 언어는 일반 텍스트로 표시됩니다
  • GFM 표, 작업 목록, 각주, ==highlights== 모두 동작합니다
  • MDX도 JSX도 없습니다. {, < 기호는 그대로 표시됩니다

이 페이지를 링크한 곳