모래게임 Sandrop TIL 4
규칙을 하나로 두기
판정 기준이 갈라지면 봇과 화면이 다른 말을 한다
기믹이 없을 때는 “꺼낼 수 있는 칸”과 “지금 둘 수 있는 수”가 같았다. 로프(두 바스켓을 묶어 같이 올라가게 하는 장치)가 생기니 갈라졌다. 혼자서는 꺼낼 수 있는데 짝의 사정 때문에 지금은 못 두는 수가 생긴 것이다.
두 개념을 나누고, 승리·패배 판정과 버튼 활성과 봇이 전부 같은 쪽만 보게 했다.
- 같은 것을 판정하는 기준이 둘이면 언젠가 어긋난다. 어긋나면 “봇은 된다는데 화면에서는 안 되는” 상태가 된다
- 개념이 갈라질 때는 이름을 나눠 두는 편이 낫다. 한 이름에 두 뜻이 붙으면 어느 쪽인지 매번 헷갈린다
내가 빠지면 열리는 길이 있다
플레이하다 막혔다. 로프로 묶인 둘 중 하나가 다른 하나의 길을 막고 있는 배치였다. 앞의 것을 치우면 뒤가 뚫리는데, 규칙이 “둘 다 지금 꺼낼 수 있어야 한다”여서 탭이 아예 거부됐다. 사람 눈에는 풀 수 있는 판인데 게임이 안 된다고 우기는 상황이다.
규칙을 “내가 빠졌다고 치면 짝이 뚫리는가”까지 보도록 바꿨다. 실제로 잠깐 빼 보고 판정한 뒤 되돌린다.
- 규칙이 지금 상태만 보면 한 수 뒤에 열리는 길을 못 본다.
- 직접 해 보지 않았으면 못 찾았을 자리다. 판이 안 풀리는 게 아니라 규칙이 안 풀어 주는 경우가 있다
물어보기만 했는데 상태가 바뀌면 안 된다
위의 “빼 보고 판정한다”를 넣으니 다른 게 딸려 왔다. 색을 숨긴 물음표 바스켓은 꺼낼 수 있게 되는 순간 색이 공개되는데, 가정만 해 보는 계산에서도 그 공개가 실제로 일어나 버렸다. 시험 삼아 물어봤을 뿐인데 판의 정보가 까발려진 것이다.
물어보기만 하는 것과 실제로 바꾸는 것을 따로 뒀다.
- 조회처럼 보이는 것이 사실 상태를 바꾸면, 그걸 다른 판정에 재사용하는 순간 사고가 난다
- 시험 삼아 돌려 볼 수 있는 계산과 실제로 진행시키는 계산은 처음부터 나눠 둔다
한 번 보여 준 것은 다시 숨기지 않는다
물음표가 공개된 뒤에 그 바스켓이 다시 막히는 경우가 있다. 규칙대로면 다시 가려야 하는데, 플레이어 입장에서는 “봤는데 왜 또 가려지지”가 된다.
한 번 열리면 계속 열린 채로 두기로 했다.
- 정보를 보여 주는 규칙은 한 방향으로만 간다. 되돌리면 사람은 규칙이 아니라 버그로 읽는다
돈을 쓰게 하기 전에 쓸 수 있는지 검사한다
막힌 바스켓을 강제로 뽑는 유료 아이템이 있다. 그런데 로프로 묶였거나 아직 색이 안 보이는 물음표에 쓰면 규칙이 꼬인다.
검사를 아이템 소모보다 앞에 뒀다. 코인이나 광고를 치른 뒤에 실패하는 것이 제일 나쁘다.
- 대가를 받는 동작은 “받을 수 있는가”를 받기 전에 확인한다. 순서만 바꾸면 되는 일이다
대체로 같은 결과를 내면 다른 곳이 오래 숨는다
같은 규칙을 게임(Dart)과 검증 도구(Python) 양쪽에 짜 두었는데, 벨트 빈자리를 채우는 방향이 한쪽은 오른쪽부터, 한쪽은 왼쪽부터였다. 각각만 보면 둘 다 멀쩡하다.
같은 색 통이 여러 개 실렸을 때만 어느 통이 먼저 비는지가 갈린다. 대부분은 우연히 결과가 같아서 안 드러나다, 특정 레벨에서 봇 궤적이 어긋나며 나왔다.
- 두 구현이 “대체로 같은 결과”를 내면 다른 부분이 아주 오래 숨는다. 결과가 같은 것과 규칙이 같은 것은 다르다
- 순서나 방향처럼 눈에 안 띄는 규칙일수록 문서에 못 박고, 대조 데이터가 그 차이를 드러내게 짜야 한다
새로운 것을 가르치는 법
데뷔에는 하나만 내보낸다
새 기믹을 처음부터 여러 개 뿌리면 낯설고 어렵기만 하다. 그래서 처음 나오는 레벨에는 그것 하나만 단독으로 두고, 이후로 조금씩 늘렸다.
붙이는 자리도 정했다. 로프는 밧줄로 묶인 그림이라 붙어 있는 칸끼리만 묶고, 물음표는 맨 윗줄에는 안 붙인다. 맨 윗줄은 시작하자마자 꺼낼 수 있어서 숨기는 의미가 없다.
- 새 규칙은 한 번에 하나씩, 방해 없이 보여 주는 판이 있어야 배운다
- 기믹이 어디 붙느냐가 그 기믹이 뜻을 갖는지를 정한다. 아무 데나 붙이면 있으나 마나가 된다
재시도에 흔들려도 되는 것과 아닌 것
레벨 하나를 만들 때 난이도가 맞을 때까지 배치를 수십 번 다시 만든다. 그런데 기믹 개수까지 매번 새로 뽑으면 시도마다 “로프 하나짜리 판”이었다 “둘짜리 판”이었다 한다.
기믹 수는 레벨 번호로 한 번만 정하고, 배치만 다시 뽑게 했다.
- 반복해서 시도하는 구조에서는 무엇이 고정이고 무엇이 흔들려도 되는지 먼저 나눈다
- 같은 번호를 넣으면 늘 같은 결과가 나오게 해 두면, 다시 만들어도 판이 달라지지 않는다
비율을 상수로 박으면 규모가 커질 때 깨진다
도안을 난이도별 칸에 나눠 담는데, 그 칸 크기를 고정 비율로 잘라 뒀다. 50레벨에서는 잘 돌았는데 200레벨로 늘리자 같은 그림이 반복되기 시작했다.
보통 난이도 레벨이 140개쯤 필요한데 고정 비율로 자른 칸에는 그만큼 도안이 안 들어 있었다.
칸 경계를 실제 수요에서 계산하게 바꿨다. 이 분량에서 각 난이도가 몇 판 필요한지 세고 그 비율로 나눈다.
- 비율을 상수로 적어 두면 그 규모에서만 맞다. 분량이 바뀌면 조용히 어긋난다
- 수요에서 비율을 끌어내면 분량이 바뀌어도 저절로 맞는다
있는데 안 보이는 색
도안 배경을 가장 많은 색의 옅은 톤으로 깔았더니, 흰색에 가까운 부분이 배경과 거의 같아져 그림이 안 보였다. 사탕 포장지나 눈사람 몸통 같은 것들이다.
전경색과 배경색이 너무 가까우면 충분히 갈릴 때까지 전경을 조금씩 어둡게 당기게 했다.
- 색을 자동으로 정하는 곳에는 하한이 필요하다. 평균적으로 잘 나와도 하한이 없으면 가끔 안 보이는 것이 나온다
보여 주는 방식
멈춘 뒤에 알린다
막혀서 더 둘 수 없게 되면 안내가 뜬다. 그런데 곧바로 뜨니 왜 막혔는지 볼 틈이 없었다.
게임 안의 시간에 배율을 걸어 1초 남짓에 걸쳐 0까지 줄였다. 벨트와 모래가 같이 느려지다 멎고, 완전히 멈춘 뒤 잠깐 있다 안내가 뜬다.
- 결과를 알리기 전에 무슨 일이 있었는지 볼 시간을 준다. 즉시 뜨는 안내는 상황을 지운다
- 게임 안의 시간과 실제 시간을 나눠 두면 이런 연출이 가능해진다. 하나로 붙어 있으면 느려지는 것 자체가 안 끝난다
장식을 덜어내는 게 답일 때가 있다
테스트해 준 사람이 벽이 무슨 칸인지 모르겠다고 했다. 회색 그라디언트에 산 아이콘까지 붙어 있었는데도 그랬다.
더 그리는 대신 걷어냈다. 벽을 작업대 바탕과 같은 밝은 갈색 단색으로 바꾸니 “아직 파지 않은 땅”처럼 보여서 못 지나가는 게 자연스러워졌다.
- 무언가를 “칸이 아니라 배경”으로 읽히게 하려면 장식이 오히려 방해가 된다
- 안 읽히는 것을 볼 때 무엇을 더할지부터 생각하게 되는데, 뺄 것이 답인 경우가 있다