모래게임 Sandrop TIL 18
도안이 모자란 줄 알았다
소스가 바닥났다고 보고 다른 이모지 세트를 찾기로 했다
노토 이모지 1440장을 전부 시도했는데 쓸 수 있는 건 589종이었다. 소스가 바닥났다고 판단하고 다른 이모지 세트를 찾아보기로 했다. 그런데 다른 세트는 같은 사과, 같은 물고기를 다르게 그린 것뿐이라 새 소재가 늘지 않았다. 전날 Kenney를 재 본 것도 이 판단에서 나왔다.
- 같은 것을 다르게 그린 소스는 소재를 늘려 주지 않는다. 늘어나는 건 그림체지 그림 수가 아니다
사실은 절반이 사각지대에 갇혀 있었다
버려지는 이유를 뜯어보니 원인은 소스가 아니었다. 색을 다루는 기준이 둘 있는데 서로 어긋나 있었다.
- 비슷한 색을 하나로 합치는 기준은 거리 38 미만
- 통과시키는 기준은 색끼리 45 이상 떨어져야 함
거리가 38~45인 색 짝은 합쳐지지도, 통과하지도 못한다. 여기에 걸린 도안이 268종이었다. 떨어진 도안을 살리려고 다시 시도하는 단계도 있었지만, “색이 모자라서” 떨어진 경우만 구제하는 방향이라 “색이 너무 비슷해서” 떨어진 도안은 오히려 나빠졌다.
통과 기준보다 세게 합치는 단계를 하나 붙이자 268종이 살아났다. 합친 뒤에는 색이 더 벌어지니 구분 기준은 오히려 엄격해졌다.
앞선 TIL 15에서 “더 없다”는 느낌은 세어 보기 전까지는 확인된 게 아니라고 했다. 이번에는 세어 봤는데도 틀렸다. 센 것은 통과한 수였지 쓸 수 있는 수가 아니었다.
- 거르는 기준과 고치는 기준이 따로 있으면 둘 사이에 아무도 통과 못 하는 구간이 생기지 않는지 본다
- 실패에 방향이 둘이면 구제 수단도 둘이어야 한다
- 소스를 더 찾기 전에 가진 소스를 왜 버리고 있는지 먼저 본다
64로 올리니 버렸던 것이 돌아왔다
게임 캔버스는 원래 64칸인데 도안은 32칸으로 만들어 두 배로 확대해 넣고 있었다. 도안 원본을 64로 뽑게 하니 모래량과 플레이타임은 그대로고 그림 디테일만 네 배가 됐다.
예전에 뭉개져서 못 쓴다고 통째로 건너뛴 노토 조합 이모지(👨🚀 우주비행사처럼 여러 이모지를 합친 것)를 다시 보니 64에서는 대부분 읽혔다. 246종이 들어왔다. 예전에 뺐던 도안 중 12종도 64에서 쓸 만해져 되살렸다.
Claude가 32에서 64로 바꾸며 남은 도안, 되살아난 도안, 떨어진 도안을 나눠 보고했고 그 목록을 내가 검토했다. 잃은 것도 있었다. 32에서 통과하던 도안 167종이 64에서 떨어졌다. 32로 줄일 때는 미묘한 음영이 뭉개져 뚜렷한 한 색이 됐는데, 64에서는 그 음영이 살아남아 비슷한 두 색으로 갈라졌다.
도안을 그린 사람은 태극 도안의 검은 테두리가 갑자기 두꺼워졌다고 했다. 테두리 두께를 전체 크기에 대한 비율로 정해 뒀더니 32에서 1.6칸이던 선이 64에서 3.2칸이 된 것이다.
- 조건이 바뀌면 예전의 “못 쓴다” 판정도 다시 본다. 그 판정은 그때 조건에서 내린 것이다
- 해상도를 올리면 디테일과 함께 줄일 때 걸러지던 잡음도 살아난다
- 비율로 정한 값은 해상도를 따라 절대 크기가 변한다. 선 두께처럼 “몇 칸”이 중요한 값은 따로 챙긴다
Kenney 자연 킷이 한 장도 통과하지 못했다
Kenney에서 음식·물고기·가구 킷으로 178종을 얻었다. 그런데 자연 킷은 241장이 전부 “너무 희박함”으로 떨어졌다.
그림이 나빠서가 아니었다. 타일 격자에 맞춘 큰 캔버스 안에 물체가 작게 들어 있어, 줄이고 나면 물체가 캔버스의 3%만 채웠다. 검사는 캔버스 대비 비율을 보니 여백이 곧 탈락 사유가 된 것이다. 받을 때 투명 여백을 잘라내고 정사각형으로 맞추니 0장이 153종이 됐다.
마지막으로 내가 도안 뷰어로 전부 다시 보며 250종을 뺐다. 최종 1108종이 됐다.
- 소재가 통째로 떨어지면 소재의 품질인지 포장(여백·크기)인지부터 본다
- 기계 검사로 늘린 뒤에는 눈으로 한 번 거른다. 검사는 “읽히는가”를 모른다
봇의 숫자와 사람의 체감
아홉 판을 해 보고 봇과 대조했다
난이도는 봇이 잰 클리어율로 배정하고 있었지만, 그 숫자가 실제 체감과 맞는지는 확인한 적이 없었다. 실기기에서 아홉 판을 직접 해 보고 체감을 적어 봇의 값과 나란히 놓았다. 순서가 정확히 일치했다.
| 봇 클리어율 | 체감 |
|---|---|
| 0.71 | 딱히 생각 안 해도 됨 |
| 0.64~0.57 | 생각은 해야 하나 쉬움 |
| 0.36 | 쉽고 적당함 |
| 0.31 | 재밌다 |
| 0.25 | 멈칫하게 됨 |
- 자동 측정값을 계속 쓰려면 사람 판단과 한 번은 맞춰 본다. 맞는 걸 확인하고 나서야 그 값에 더 기댈 수 있다
어려운 쪽과 쉬운 쪽은 같은 오차가 아니었다
대조하다 보니 방향에 따라 의미가 달랐다. 목표보다 어렵게 나온 판은 “적당히 신경 쓰이는” 좋은 판이었고, 목표보다 쉽게 나온 판은 그대로 싱거웠다. 봇은 일부러 실수를 섞어 두기 때문에 사람보다 비관적으로 잰다. 그래서 봇이 어렵다고 한 판은 사람에게 조금 덜 어렵다.
그런데 목표를 벗어나도 봐주는 폭을 양쪽 다 0.15로 같게 두고 있었다. 벗어난 201판 중 194판이 그냥 통과하고 있었다. 어려운 쪽은 넉넉히(0.15), 쉬운 쪽은 좁게(0.05) 나눴다.
- 오차 허용은 방향마다 비용이 다르면 따로 정한다. 같은 0.15라도 한쪽은 좋은 판이고 다른 쪽은 싱거운 판이다
해 본 사람이 너무 잘하는 편이었다
그 아홉 판을 해 본 나는 가장 어려운 등급(crazy) 판을 아이템 없이 네 번 만에 깨는 수준이었다. 그러면 내 체감이라도 믿을 수 있는 것과 없는 것이 갈린다.
- “싱겁다”는 믿을 수 있다. 잘하는 사람에게도 싱거우면 누구에게나 싱겁다
- “안 어렵다”는 못 쓴다. 일반 플레이어에게는 충분히 어려울 수 있다
그래서 “싱겁다”는 신호만 근거로 삼았다. “안 어렵다”까지 받아들였으면 난이도 곡선 전체를 올려 일반 플레이어 앞에 벽을 세울 뻔했다.
- 체감을 근거로 쓸 때는 내용보다 먼저 그 사람이 어느 쪽에 서 있는지 본다. 내 체감도 예외가 아니다. 한쪽 방향의 신호만 믿을 수 있는 경우가 있다
소리가 안 꺼졌다
설정에서 꺼도, 앱을 나가도 붓는 소리가 계속 났다
모래를 안 붓는데 붓기 소리가 계속 났다. 설정에서 효과음을 꺼도, 앱을 나가도 안 멈추고 강제종료해야만 꺼졌다. 붓는 도중에 일시정지를 열면 바로 재현됐다.
앞선 TIL 17에서 붓기 소리를 바구니마다 따로 켜고 끄게 했다. 그 소리들을 목록으로 관리하는데, 붓기가 끝나 서서히 줄어드는 중이던 소리가 한꺼번에 정리할 때 목록에서 빠져 버렸다. 목록에 없으니 다시 끌 방법이 없었다.
목록을 믿지 않고 소리 채널 전체를 끄게 했다. 효과음을 끄면 지금 나고 있는 붓기 소리도 즉시 끊기게 하고, 붓기가 끝난 순간을 놓치지 않게 매 순간 상태를 맞추게 했다.
- 끄는 일은 기록이 아니라 실물 전체를 기준으로 한다. 기록은 새고, 새는 순간 끌 길이 없어진다
- 끄는 스위치가 “다음 소리를 막는 것”뿐이면 이미 나는 소리는 남는다. 끄기를 확인할 때는 지금 나는 것도 끊기는지 본다
광고를 붙이면서
개인정보처리방침의 한 문장이 거짓이 됐다
블로그에 있던 개인정보처리방침에 “앱은 제3자 분석·광고·추적을 쓰지 않는다”고 적혀 있었다. 게임에 광고를 붙이면 이 문장이 거짓이 된다. 광고 SDK(광고를 띄우는 외부 부품)는 광고 ID를 수집한다.
문장을 지우지 않고 범위를 좁혔다. “광고가 없는 앱은”으로 바꿔서 다른 앱에 한 약속은 그대로 지키고 게임만 예외가 되게 했다. 스토어의 데이터 보안 양식에도 같은 내용을 신고해야 한다. 방침과 양식이 어긋나면 그 자체가 위반이다.
- 기능을 더하면 그 기능이 기존 문서의 어떤 문장을 거짓으로 만드는지 본다
- 여러 제품이 한 방침을 나눠 쓰면 문장을 지우지 말고 범위를 좁힌다
살 수 없는 유료 카드를 뺐다
상점에 “₩5,500” 가격과 할인 표시까지 붙은 카드가 “준비 중”인 채 코드에 남아 있었다. 화면에는 안 나오는 상태였지만 실수로 노출되기 쉬웠다.
결제는 붙이지 않고 광고만으로 수익화하기로 정했다. 가격이 붙은 채 살 수 없는 상품은 오해를 부르는 표시가 되니 카드를 지우고, 나중에 결제를 붙일 때 이어 쓸 값만 남겼다.
- 수익 모델을 정하면 그 모델에 없는 것은 화면에서 지운다. 숨겨 둔 것은 언젠가 샌다