맵 문서

shared/maps/<이름>.json. 서버가 판정에 쓰고, 클라이언트가 그림에 쓰고, 에디터가 엽니다 — 하나의 파일을 세 곳이 읽습니다.

{
  "width": 64, "height": 24, "tileSize": 16,
  "tileset": "world",
  "layers": [
    { "name": "main", "tiles": [1, 1, 1, 0, 2, 3] }
  ],
  "movers": [
    { "path": [{"x": 100, "y": 40}, {"x": 300, "y": 40}],
      "speed": 60, "halfWidth": 48, "halfHeight": 8 }
  ],
  "points": [ { "name": "spawn", "x": 64, "y": 48 } ],
  "areas": [ { "name": "to-dungeon", "x": 96, "y": 32, "width": 32, "height": 48 } ]
}

layers[].tiles타일 id 의 배열입니다. 0 은 빈 칸, 나머지는 타일셋의 몇 번째 타일인지입니다. 행 우선이고 아래 줄이 먼저입니다 — 첫 width 개가 맵의 바닥 줄입니다.

칸 수가 width × height 와 다르면 거부됩니다. 어딘가에서 한 줄이 어긋난 것이고, 모자란 곳을 채우는 일은 그 어긋남을 어디에 둘지 정하는 일입니다.

무엇이 벽인지는 여기 없습니다. 그것은 타일셋이 정합니다. 벽은 어디에 놓여도 벽이고, 그 사실을 칸마다 되풀이하는 맵은 자기 자신과 어긋날 수 있습니다.

레이어

여러 장을 겹칩니다. 판정은 모든 레이어의 합집합이고, 그림은 가장 위에 무언가를 놓은 레이어의 것입니다. 앞에 장식을 깐다고 뒤의 벽이 사라지지 않습니다.

움직이는 발판

path 지나는 점들. shape: "circle" 이면 점 하나가 중심입니다
speed 초당 몇 픽셀
halfWidth halfHeight 발판의 반지름
shape path(기본) 또는 circle
radius 원일 때의 반지름
pingPong 끝에서 돌아올지. 경로는 기본 참, 원은 기본 거짓
oneWay 아래에서 통과할 수 있는지
phase 처음에 얼마나 앞서 있을지
rate 시계가 도는 속도. 1 정상, 0 정지, -1 역방향

발판의 위치는 시간의 함수입니다. 어느 순간에 어디 있는지는 그 순간으로부터 계산되고, 저장되지 않습니다. 그래서 클라이언트가 지난 몇 초를 다시 굴려도 서버와 같은 답에 도착합니다.

이름 붙은 자리와 구역

pointsareas 는 이름과 좌표일 뿐입니다. 그것이 스폰인지 문인지 엔진은 모르고, 이름을 읽는 게임만 압니다.

local town = map.loadTiles("town")
local spawn = town.point("spawn")
local door = town.area("to-dungeon")