이 글은 Sandrop 시리즈의 31번째 기록입니다. (총 38개)

오늘 한 일

  • 도안 검토 페이지에 레벨 번호 표시와 출처 필터, 표시 전환(전체 / 레벨순 / 안 쓰인 것) 추가
  • 예전에 뺐던 도안 8종을 다시 풀에 넣음
  • 승인 후 특정 레벨의 도안만 갈아끼우는 절차를 확인해 문서에 남김

막힌 부분

무엇이 몇 탄인지 안 보여서 고칠 대상을 못 짚었다

심사가 아직 안 끝나서, 그동안 도안을 더 다듬어 두려고 검토 페이지를 다시 열었다.

그런데 페이지가 도안을 이름순으로만 보여 준다. “이 그림 별로다” 싶어도 그게 몇 탄인지 알 수가 없으니, 고치자는 판단이 실제 작업으로 이어지질 않았다.

레벨은 이미 동결돼 있고, 각 레벨 파일 안에 자기가 쓰는 도안 이름이 들어 있다. 그러니까 답은 이미 파일에 있었고, 방향만 뒤집어 읽으면 됐다.

def _level_map() -> dict[str, list[int]]:
    out: dict[str, list[int]] = {}
    for f in sorted(os.listdir(LEVEL_DIR)):
        d = json.load(open(os.path.join(LEVEL_DIR, f), encoding="utf-8"))
        out.setdefault(d["name"], []).append(d["id"])
    return out
  • 도안마다 “137탄” 배지가 붙고, 검색창에 숫자를 넣으면 그 레벨 도안이 나온다
  • 매핑을 따로 저장하지 않았다. 레벨 파일이 원본이니 매번 읽으면 어긋날 일이 없다

목록을 고르는 자리가 둘이 되려던 참이었다

출처 필터를 넣으면서 셀렉트에 개수를 같이 적었다. 그런데 목록을 고르는 코드가 그리는 쪽과 개수 세는 쪽 두 군데에 생겼다.

이 상태에서 “레벨순”과 “안 쓰인 것” 전환을 얹으면, 한쪽만 고쳐도 개수와 실제 목록이 어긋난다.

function baseList() {
  const all = document.getElementById('showExcl').checked ? EXCLUDED : POOL;
  const mode = document.getElementById('use').value;
  if (mode === 'used')
    return all.filter(it => it.lv.length).sort((a, b) => a.lv[0] - b.lv[0]);
  if (mode === 'unused') return all.filter(it => !it.lv.length);
  return all;
}
  • 목록을 고르는 자리를 하나로 모았다. 그리는 쪽도 개수 세는 쪽도 여기만 부른다
  • 지난번에 같은 이유로 한 번 당했다. 그때는 이미 어긋난 걸 찾아 고쳤고, 이번엔 갈라지기 전에 모았다

승인 후에 도안을 갈아끼울 수 있는지부터 확인했다

검토해서 목록을 만들어도, 이미 나간 500탄의 도안을 못 바꾸면 소용이 없다. 그래서 도구가 어떻게 동작하는지 먼저 봤다.

동결 옵션은 별도 목록을 들고 있지 않고 폴더에 실제로 있는 파일을 기준으로 동결 대상을 정한다. 그러니까 레벨 파일 하나를 지우면 그 번호만 “안 만들어진 것”이 되고, 나머지는 손을 안 댄다.

  • 파일을 지우는 것이 곧 “이 번호만 다시 만들어라”가 된다. 따로 옵션이 필요 없었다
  • 다시 만들면 그림만이 아니라 바구니 배치·벽·기믹·난이도가 전부 새로 뽑힌다. 진행 상황은 레벨 번호 기준이라 이미 깬 레벨은 깬 채로 남는다

동결 모드에서는 안 도는 로직이 하나 있었다

한국 도안 19종은 8탄부터 300탄까지 일정 간격으로 흩어 놓는 코드가 따로 있다. 그런데 그 코드가 동결 모드에서는 통째로 건너뛴다.

이미 배치가 끝난 상태에서 다시 흩으면 동결한 레벨과 부딪히니 맞는 동작인데, 부분 재생성에서는 다른 뜻이 됩니다 — 한국 도안이 든 레벨을 지우고 다시 만들면 그 자리는 아무 도안으로나 채워진다.

  • 그 19개 번호를 문서에 적어 뒀다. 도안을 갈아끼울 때 이 번호는 건드리지 않는다
  • 특수 배치 로직이 있으면 부분 재생성에서 빠지는지 먼저 본다. 전체 생성만 생각하고 짠 코드라 부분 재생성은 검사 범위 밖이었다

뺐던 도안을 되살릴 때는 뺀 이유도 같이 지운다

검토 결과로 8종을 되살렸다. 그런데 제외 목록은 리뷰 차수별로 “실루엣 애매·징그러움” 같은 주석을 달아 쌓아 온 목록이다.

이름만 빼면 다음 전수 리뷰에서 같은 이유로 또 빠진다.

  • 목록 맨 위에 “7차 리뷰에서 되살린 것 — 다시 빼지 않는다”로 8종을 적었다
  • 이름을 뺀 줄의 주석도 같이 고쳤다. 목록에 없는 것이 주석에만 남으면 다음 사람이 헷갈린다

다음에 할 일

  • 심사 결과 확인
  • 도안 검토해서 교체 목록 확정 — 승인 나면 업데이트에 같이 넣는다
  • 소프트 런칭
  • 광고 제거 상품 — 리텐션과 광고 노출 수를 보고 판단
  • 클라우드 저장 — 기기를 바꾸면 진행 상황이 사라진다. 요청이 들어오면 착수
  • 인게임 문의 버튼 — 앱 안에서 바로 문의 메일을 쓸 수 있게
  • 100탄씩 추가 배포

Series: Sandrop

1 모래게임 Sandrop 0 2 모래게임 Sandrop 1 3 모래게임 Sandrop 2 4 모래게임 Sandrop 3 5 모래게임 Sandrop 4 6 모래게임 Sandrop 5 7 모래게임 Sandrop 6 8 모래게임 Sandrop 7 9 모래게임 Sandrop 8 10 모래게임 Sandrop 9 11 모래게임 Sandrop 10 12 모래게임 Sandrop 11 13 모래게임 Sandrop 12 14 모래게임 Sandrop 13 15 모래게임 Sandrop 14 16 모래게임 Sandrop 15 17 모래게임 Sandrop 16 18 모래게임 Sandrop 17 19 모래게임 Sandrop 18 20 모래게임 Sandrop 19 21 모래게임 Sandrop 20 22 모래게임 Sandrop 21 23 모래게임 Sandrop 22 24 모래게임 Sandrop 23 25 모래게임 Sandrop 24 26 모래게임 Sandrop 25 27 모래게임 Sandrop 26 28 모래게임 Sandrop 27 29 모래게임 Sandrop 28 30 모래게임 Sandrop 29 31 모래게임 Sandrop 30 읽는 중 32 모래게임 Sandrop 31 33 모래게임 Sandrop 32 34 모래게임 Sandrop 33 35 모래게임 Sandrop 34 36 모래게임 Sandrop 35 37 모래게임 Sandrop 36 38 모래게임 Sandrop 37

Suggested Posts