본문으로 건너뛰기
문서
이 페이지의 내용

결정론

시드가 같은 레벨은 어떤 기기에서든, 어떤 프레임 레이트에서든 똑같이 플레이됩니다. 레벨의 무작위성은 시드로부터 계산되며, 플레이어의 행동은 레벨에 영향을 주지 않습니다

레벨은 시간의 함수

레벨은 타임라인 위에 만들어집니다. 모든 오브젝트는 프레임 구간 위에 존재하며 키프레임을 따라 움직입니다

레벨은 플레이어의 행동을 읽지 않습니다. 그래서 1200번째 프레임은 플레이어가 살아 있든, 죽었든, 대시 중이든, 봇이 대신 플레이하든 똑같이 보입니다

영향은 한 방향으로만 흐릅니다. 레벨은 아바타의 크기를 바꾸고, 속도를 늦추고, 조작을 빼앗고, 충돌을 끌 수 있습니다. 아바타에서 레벨로 거꾸로 이어지는 경로는 없습니다

트리거는 없습니다. 향후 버전을 위해 논의되고 있지만 정해진 것은 없습니다

레벨은 실제 시간에 따라 진행됩니다. 프레임 레이트는 화면을 얼마나 자주 다시 그리는지만 정합니다. 같은 플레이는 초당 30프레임에서도 144프레임에서도 똑같이 진행됩니다

시드

시드는 설정되어 있는 첫 번째 위치에서 가져옵니다:

  1. 레벨 화면의 플레이어 시드 (무작위 버튼은 새 시드를 고르고, 비우기 버튼은 시드를 지웁니다)
  2. 제작자가 설정한 레벨 자체의 시드
  3. 이번 플레이를 위한 새 시드

0은(는) "설정 안 됨"을 뜻합니다. 그래서 일반 레벨은 불러올 때마다 새 시드를 받습니다

결과 창에는 플레이의 시드가 표시되고, 기록에도 저장됩니다. 그래서 운 좋았던 플레이를 다시 반복할 수 있습니다

무작위성의 작동 방식

레벨의 무작위 값은 상태를 기억하는 난수 생성기에서 나오지 않습니다. 그 값은 자신의 주소로부터 계산됩니다:

Hash(seed, keyframe frame, layer, start frame, track, channel)

같은 주소는 언제나 같은 수를 냅니다. 어떤 기기에서든, 어떤 계산 순서에서든. 주소의 모든 부분은 제작자가 편집하는 값입니다. 그래서 같은 배치는 같은 플레이를 반복합니다

이것으로 얻는 것

  • Warm 봇은 플레이가 시작되기 전에 레벨 전체를 지나는 경로를 계획합니다. 계획한 바로 그 레벨이 그대로 재생되기 때문에 가능한 일입니다
  • Reflex 봇은 현재 프레임보다 앞선 프레임들을 만들어 보고 그에 따라 피합니다
  • 체크포인트로 되감기는 무언가를 취소하는 것이 아니라 필요한 프레임을 다시 만듭니다
  • 에디터는 어떤 프레임이든 처음부터 만들기 때문에 스크럽이 즉시 이루어집니다
  • 기록과 통계는 어떤 기기에서든 같은 의미를 가집니다

알려진 한계

레벨 쪽은 결정론적입니다. 아바타 쪽에는 아직 고쳐지지 않은 알려진 결함이 있습니다:

  • 두 장애물이 같은 프레임에 아바타를 맞힌 경우. 둘 중 어느 것이 넉백 방향을 정하는지는 플레이마다 다를 수 있습니다
  • 레벨이 시작될 때 아바타의 시계가 초기화되지 않습니다. 레벨을 불러오는 데 걸린 시간에 따라 대시가 한 프레임 더 길거나 짧게 지속될 수 있습니다

같은 빌드에서 같은 봇 플레이를 반복해 측정했을 때 마지막 자릿수까지 일치했습니다. 그러니 이 결함들이 모든 레벨에서 나타나는 것은 아닙니다. 이 결함들 때문에 플레이는 실제로는 재현 가능하지만 보장되지는 않습니다