단톡방 시상식 안드로이드 앱 비공개 테스트를 열었습니다
카카오톡 공유 목록에서 대화 파일을 바로 넘겨 여는 안드로이드 앱이 구글 플레이 비공개 테스트에 올라갔습니다. 지금은 등록된 테스터만 설치할 수 있고, 웹판은 그대로 누구나 쓸 수 있습니다. 앱에는 광고가 들어가며 대화 내용은 광고에도 넘기지 않습니다.
개별 개발 기록과 분리한 짧은 변경 내역입니다. 각 기록은 작성 당시의 상태를 설명합니다.
카카오톡 공유 목록에서 대화 파일을 바로 넘겨 여는 안드로이드 앱이 구글 플레이 비공개 테스트에 올라갔습니다. 지금은 등록된 테스터만 설치할 수 있고, 웹판은 그대로 누구나 쓸 수 있습니다. 앱에는 광고가 들어가며 대화 내용은 광고에도 넘기지 않습니다.
카페 채팅방 메뉴(≡) → 설정 → 대화 내보내기로 받은 txt 파일을 넣으면 카카오톡 대화와 같은 시상식이 열립니다. 대화 파일은 지금처럼 브라우저 안에서만 읽고 어디로도 올리지 않습니다.
프로덕션 검토를 통과해 공개 스토어 페이지가 열렸습니다. 이제 테스터로 등록하지 않아도 안드로이드에서 설치할 수 있습니다. 웹판은 그대로이고, 앱에는 웹판에 없는 하단 배너와 원할 때만 보는 보상형 광고가 있습니다.
프로덕션 검토를 통과해 공개 스토어 페이지가 열렸습니다. 이제 테스터로 등록하지 않아도 안드로이드에서 설치할 수 있습니다. 웹판은 그대로이고, 앱에는 웹판에 없는 별 제한과 광고가 있습니다.
깎아 만든 인형이던 브롤러를 사람 모델로 교체했습니다. 스크랩은 전술 요원, 노바는 갑옷 전사, 모르타르는 여전사이고 실루엣이 서로 다릅니다(Adobe Mixamo). 달리기·대기 애니메이션이 속도에 따라 섞입니다. 손이 간 곳은 셋입니다 — 받은 달리기 애니메이션에 루트 모션이 있어 몸이 발밑 링에서 떨어져 나가길래 Hips 의 수평 이동만 0 으로 눌렀고, 소총 조준 자세인데 총이 없어 허공을 잡길래 킷별 무기를 오른손 뼈에 붙였는데 뼈에 캐릭터 전체 스케일이 걸려 있어 처음엔 무기가 건물만 했습니다. 그리고 상자가 캐릭터보다 높으면 뒤에 선 사람이 통째로 사라진다는 걸 이번에도 다시 확인했습니다.
깎아 만든 도형이던 엄폐물을 실제 모델로 바꿨습니다. 파란 컨테이너, 나무 궤짝, 꽃 핀 회양목, 가로등입니다(모델: dogfooter, kArchive 3D Models). 원본은 개당 최대 2.8MB 였고 용량의 88%가 텍스처 한 장이어서, 512px 로 줄이고 WebP 로 바꿔 다섯 개 1.8MB 로 맞췄습니다. 시간이 더 걸린 쪽은 높이였습니다 — 상자가 캐릭터보다 높으면 뒤에 선 사람이 통째로 사라지고, 벽과 상자가 같은 높이면 부술 수 있는 것과 없는 것이 구분되지 않습니다. 맵 테두리만은 모델을 쓰지 않았습니다. 경계는 장식이 아니라 '여기가 끝'이라는 신호라서입니다.
효과음 18개와 배경음 하나를 붙였습니다. 총성·폭발·상자 파괴가 플레이어 기준 거리로 작아지고 좌우로 갈립니다. 제가 소리를 들을 수 없어서 출력 파형을 직접 재서 확인했습니다 — 무음 0, 사격 0.11, 26m 밖은 아예 재생하지 않고, 음소거를 누르면 정확히 0 입니다. 음원은 CC0(OpenGameArt)와 직접 합성한 총소리 두 갈래이고, 같은 라이브러리의 CC-BY 파일은 의도적으로 뺐습니다.
여섯이 한 아레나에서 마지막 하나가 남을 때까지 싸우는 탑다운 대전입니다. ntsapp.dev/brawl 에서 바로 해볼 수 있습니다. 한 판이 도는 동안 해가 기울어서, 정오의 짧은 그림자가 황혼의 긴 그림자를 지나 달빛과 가로등으로 넘어갑니다. T 를 누르면 시간대를 건너뛰어 바로 비교할 수 있습니다.
정오 화면을 보고 '그림자가 안 나온다'고 판단해 그림자 코드를 의심했습니다. 껐다 켜며 화면 밝기를 재 보니 차이가 0.8%. 버그가 아니라 태양 고도를 74도로 잡아서 그림자가 물체 밑에 완전히 가려진 것이었습니다. 고도를 56도로 낮추니 화면의 16%가 그림자로 바뀌었습니다. 눈으로 '있는 것 같다'는 판정 기준이 못 됩니다. 밸런스도 같은 이유로 봇 200판을 돌려 재는데, 거기서 곡사탄이 조준 지점이 아니라 늘 최대 사거리에 떨어지는 버그가 잡혔습니다.
소개를 실제 게임에 맞춰 다시 썼습니다. 캐릭터 열두 명 중 셋을 파티 슬롯에 넣고, 장마다 스테이지 열 개를 에너지를 써서 출격합니다. 돌아오면 골드·균열 파편·기억의 조각 같은 재화로 키우고 의상을 갈아입힙니다. 처음 올릴 때 회색박스 화면밖에 없어 그렇게 적어 뒀는데, 실제 화면을 받아 전부 교체했습니다.
상의·하의·신발을 부위별로 섞어 입는데, 그냥 얹으면 입힌 만큼 그릴 것이 늘어납니다. 파티가 셋이니 곱해지고요. 실행 중에 한 벌로 합쳐 구워서 몇 개를 끼워도 표면이 하나만 늘어납니다. 꾸미라고 만든 시스템이 안 꾸미는 쪽을 권하면 안 됩니다.
파티 셋을 실시간으로 갈아타며 싸우는 쿼터뷰 액션 RPG입니다. ntsapp.dev/monster 에서 바로 해볼 수 있습니다. TAG로 조종 대상을 바꾸고, 나머지 둘은 스스로 싸웁니다. 게임 안에서 얼굴과 체형을 만들고 의상을 갈아입힙니다.
gzip으로는 97.4MB까지밖에 안 줄어 여전히 한도의 네 배였습니다. 패키지를 20MiB 조각 일곱 개로 자르고 워커가 이어 붙입니다. 한꺼번에 받으면 137MB가 워커 메모리에 얹혀서, 한 조각씩 순서대로 받아 흘려보냅니다. 엔진 실행 파일은 압축이 통해 37.7MB가 9.8MB가 됐습니다.
Unity로 만들었던 것을 Godot 4.7.2로 다시 썼습니다. 기능이 모자라서가 아니라 빌드와 반복이 무거워 손이 안 가서였고, 로직과 수치는 옛 프로젝트에서 그대로 옮겼습니다 — 엔진과 규칙을 같이 바꾸면 나중에 뭐가 원인인지 못 가립니다. 33커밋으로 온라인 대전과 안드로이드 빌드까지 왔습니다.
원을 그리고 사이를 이어 붙이던 것을 메타볼 셰이더로 바꿨습니다. 각 칸이 주변에 퍼뜨리는 값을 더해 임계값을 넘는 곳을 칠하면 합쳐지는 모양이 저절로 나오고, 같은 색끼리만 더하니 다른 색은 섞이지 않습니다. 손으로 그리던 넥·블롭·스쿼시 보조 함수가 전부 없어졌습니다.
오가는 데이터를 세어 보니 격자 128자와 염색조 8자, 점수뿐이라 실시간 채널만으로 충분했습니다. P2P를 쓰면 네이티브 확장이 필요한데 얻는 게 없었습니다. 방 번호가 곧 채널 이름이고, 벙개벙개가 쓰던 백엔드를 그대로 씁니다. 그리고 APK를 뜯으면 평문으로 읽히던 접속 정보를 빌드에서 뺐습니다.
이름이나 @로 부르면 답하고, 켜 두면 가끔 먼저 거듭니다. 방마다 성격과 능력을 정하고 실시간 검색·사진 분석을 따로 켤 수 있습니다. 하루 답변 상한을 둬서 명시적으로 불러도 예산을 넘지 않게 했고, 프롬프트에는 "범용 비서가 아니라 이 방의 대화 참가자"라는 울타리를 상시 넣었습니다.
답변 상한 120토큰 중 117을 사고에 쓰고 답이 빈 문자열로 끝나던 것, 그리고 검색을 켜면 응답이 JSON이 아니라 산문으로 오는데 받는 쪽이 JSON만 기다려 멀쩡한 답을 버리던 것. 둘 다 오류가 나지 않아 로그가 깨끗했습니다. 이제 검색이 막히면 검색 없이 다시 불러서, 라이브 정보만 못 줄 뿐 답은 합니다.
물때 위젯에 이름만 붙여 두고 비워 뒀던 "파고" 자리를 채웠습니다. 파고·너울·파주기·파향을 받아 오고, 큰 값 기준 1.0m부터 주의 1.5m부터 위험을 표시합니다. 키가 필요 없는 자료를 골랐습니다 — 유료 구독으로 시작하면 그 구독이 끊기는 날 기능도 끊깁니다.
이 값은 파도가 오는 방향인데 화살표가 그쪽을 가리켜서, 파도가 육지에서 바다로 나가는 것처럼 보였습니다. 문서만 믿지 않고 같은 시각의 풍향과 파향을 세 항구에서 비교했습니다(여수 13°·부산 4°·인천 6° 차이). 화살표는 진행 방향으로 돌리고, 카드에는 오는 방향을 한글 8방위로 함께 적었습니다.
평균 13ms인데 뚝뚝 끊긴다는 제보가 계속 왔습니다. 스무 프레임 중 하나가 33ms로 튀면 눈에는 그게 전부입니다. 봇 아홉이 시야 검사를 같은 프레임에 몰아 하던 것, 합친 메시로 충돌까지 세워 레이 하나가 20만 삼각형을 때리던 것, 그리고 판 도중 2.9초씩 멈추던 셰이더 링크를 잡았습니다. 한국 마을 웹 실측 평균 19.0 → 12.2ms.
멀티에서 남의 캐릭터를 서버가 준 자리에 그대로 갖다 놓고 있었습니다. 스냅샷은 초당 스무 번, 화면은 예순 번이라 뚝뚝 끊기고, 패킷 순서가 뒤바뀌면 지나갔던 자리로 되돌아갑니다. 이제 목표로만 받아 두고 매 프레임 다가갑니다. 되감기 판정용 경로는 즉시 반영이라 따로 뒀습니다.
윈도우 실행 파일을 낼 수 있게 했습니다. 맵은 웹에서 그랬듯 실행 파일 옆 폴더에서 읽습니다. 엔진도 4.7.2로 옮겼고, 조준 자세는 총 길이가 아니라 실제 모델의 윗면과 뒤끝을 재서 잡도록 다시 고쳤습니다 — 같은 길이라도 모델마다 몸통 높이가 달라서 기관단총이 조준점을 덮고 있었습니다.
받아 온 GLB 맵 다섯 옆에 예전 상자 맵 여섯을 그대로 뒀더니, 무작위로 시작할 때 절반이 옛 맵이었습니다. 새 맵을 다섯 개 만들어 놓고 절반만 쓰던 셈이라 여섯을 뺐습니다. 그리고 재질별로 메시를 합칠 때 지오메트리 20%가 조용히 사라지고 있던 것도 고쳤습니다 — 한국 마을이 231,900에서 278,352 삼각형이 되면서 전통 대문과 기와지붕이 돌아왔습니다.
조준 자세 좌표가 상자로 총을 만들던 시절 값이라, 진짜 모델을 끼우자 개머리판이 눈에서 11cm 앞에 섰습니다. 저격총은 아예 카메라 뒤였습니다. 이제 총 길이에서 계산합니다. 판 설정이 두 번 떠서 고른 값이 날아가던 것, 폭파 모드에서 총을 살 수 없던 것도 함께 고쳤습니다.
캐릭터마다 UV가 다르고 한 캐릭터도 몸·머리카락·눈썹이 서로 다른 원본을 써서, 스킨을 원본 텍스처 이름으로 갈아 끼우게 했습니다(여성 6종×12, 남성 9종×9). 무손실이면 226MB라 512px 압축으로 10.8MB까지 줄였습니다. 사이트의 FPS 소개도 다시 썼습니다 — 복셀·맵 6종·"외부 에셋 없음"이 전부 사실이 아니게 돼 있었습니다.
폭파 모드에 크레딧 경제가 들어갔습니다. 킬과 라운드 승패로 벌어 총을 사고, 죽으면 산 총을 잃습니다. 진 팀도 받습니다 — 아무것도 못 받으면 한 번 밀린 팀이 영영 못 따라옵니다. 요원 스킬 셋(연막·섬광·벽)이 붙어 "서로를 먼저 본 쪽이 이긴다"를 사고팔 수 있게 됐고, 판이 끝나면 금화가 남아 옷과 도색을 삽니다.
절차적으로 짓던 여섯에 통째로 받아 오는 다섯(비전 유적·해동 해안·네오 서울·K타워 넥서스·한국 마을)이 더해졌습니다. 다섯을 전부 담으면 첫 화면까지 84MB를 기다려야 해서 고를 때 받습니다. 캐릭터는 복셀 몸에서 3D 모델 18종으로 바뀌었고, 그에 맞춰 앱 소개의 "내려받은 에셋 0"도 사실대로 고쳤습니다.
3D 캐릭터가 브라우저에서만 복셀 몸으로 떨어졌습니다. 폴더 이름 대소문자였는데, 윈도우는 안 가리고 배포 패키지는 가립니다. 고치니 전부 T자세로 걸어 다녔고(폴더를 나열하면 원본이 아니라 껍데기 이름이 나옵니다), 그것도 고쳤는데 여전히 안 움직였습니다(등록 이름에도 껍데기가 붙었습니다). 검사가 "실렸는가"만 묻고 "움직이는가"를 묻지 않아 전부 통과하고 있었습니다.
평면 그림은 UV와 안 맞아 그냥 못 씁니다. T자세 앞뒤 두 장을 모델에 쏘아 붙인 뒤 원래 UV로 다시 구워, UV 배치를 몰라도 옷이 붙게 했습니다. 여섯 캐릭터에 각각 다른 의상이 들어갑니다. 무기 6종도 새 모델로 갈았고, 원화 작업 폴더가 배포에 섞여 있어 빼면서 웹 전송량이 49.3MB에서 24.5MB가 됐습니다.
애드센스 대응으로 얇은 페이지를 고친 뒤 다시 재다가, 게임 경로 아홉 개가 본문 7~391자인데 전부 색인이 열려 있는 것을 발견했습니다. 화면 전체가 캔버스라 읽을 글자가 로딩 문구뿐입니다. robots.txt로 막았습니다 — 게임은 각자 다른 워커가 서빙해서 Pages 헤더가 닿지 않기 때문입니다. 실제 소개 문서인 /tiny/ 와 /fps/ 는 열어 뒀습니다.
코스를 도는 레이싱을 섬에서 섬으로 가는 항해로 바꿨습니다. 원에는 목적지가 없어서, 나빠지는 날씨도 차오르는 선체도 랩타임 손해일 뿐이었습니다. 배수를 공짜에서 배터리를 쓰는 일로 바꾸자 고리가 닫혔습니다 — 거친 물은 쫓는 배를 떨구지만 선체를 채우고, 펌프는 배터리를 쓰고, 배터리가 죽으면 레이더가 함께 죽습니다. 접속하지 않은 동안에도 배가 갑니다.
3D 캐릭터가 복셀보다 프레임 타임이 두 배였습니다. 재질 공유·그림자 끄기·원거리 생략·화면 밖 정지를 넣었고 넷 다 실제로 걸렸는데 프레임 타임은 안 움직였습니다. 하나씩 통째로 꺼 보니 남는 값이 전부 그리는 횟수였고, 부위별로 나뉜 메시를 합쳐 절반 가까이 줄였습니다. 3인칭 시점과 상체 조준도 함께 붙였습니다.
등장 일정이 문자 그대로 초당 한 마리로 시작하고 있었습니다. 웨이브 최소치를 3으로 두고 간격을 줄여 초반이 초당 다섯 마리로 열립니다. 1분 시점 처치 수가 64에서 330이 됐습니다. 후반은 이미 상한에 묶여 있어 거의 그대로입니다. 핵 아이콘이 물약과 8픽셀에서 같은 그림이던 것도 버섯구름으로 바꿨습니다.
물색과 식생, 바위를 남해 쪽으로 다시 잡았습니다. 소나무와 화강암, 맑은 열대 해수 대신 남해 물색입니다. 하늘 조도 계산을 한 곳으로 모으고 노출 규약을 통일했으며, 오래 남아 있던 미해결 항목 두 개는 다시 재서 정정했습니다.
심사에서 「가치가 별로 없는 콘텐츠」로 거절당했습니다. 재 보니 분량이 아니라 얇은 페이지의 위치가 문제였습니다. 검색창뿐인 127자 페이지가 색인 대상이었고, 정작 스토어에 출시한 앱 넷의 소개가 가장 얇았습니다. 읽을 것이 없는 페이지는 색인에서 빼고, 출시작 소개는 화면 사진과 함께 다시 썼습니다.
FFT 바다 엔진에서 갈라져 나온 레이싱입니다. ntsapp.dev/racing 에서 볼 수 있습니다. 코스는 씨앗 하나에서 생성되고, 게이트 통과는 반경이 아니라 평면 교차로 판정합니다 — 반경으로 재면 빠른 배가 그냥 뚫고 지나갑니다. AI 상대는 사람과 똑같이 스로틀과 타 두 값만 만집니다.
뉴스와 재무제표를 규칙으로 점수화해 종목을 훑는 리서치 보조 도구입니다. 매일 아침 GitHub Actions가 스스로 갱신합니다. 다만 성과 추적이 없어 이 점수가 실제로 맞았는지는 검증되지 않았습니다. 투자 추천이 아니고, 개인용을 전제로 만들어 검색 색인에서는 빼 뒀습니다.
루어의 어종별 매력도 표를 채우지 않아 전부 0으로 조회됐고, 매력도 0이면 물고기가 즉시 떠납니다. 참돔도 감성돔도 돌돔도 우럭도 이론상의 존재였습니다. 채비 11개 × 어종 19종을 누락 0으로 채우고, 미끼와 밑밥을 넣었습니다. 실제 입질 엔진을 그대로 돌리는 시뮬레이터로 루어별 서열까지 확인했습니다.
"버튼이 안 먹는다"는 제보 셋이 전부 같은 모양이었습니다. 막힌 게 맞는데 막힌 이유가 안 보였습니다. 거절 사유를 낚시 중에는 숨겨지는 패널에 적고 있었고, 좌초는 매 프레임 계산해 놓고 아무도 읽지 않았습니다. 조타 잠금도 낚싯대를 든 것이 아니라 줄이 나간 것에 다시 묶었습니다.
알파벳 키 아홉 개로만 되던 조작을 아이콘 버튼으로 옮겼습니다. 이동과 스페이스는 키에 남겼습니다 — 누른 채로 있고 다른 데를 보면서 쓰는 조작이라 버튼이 더 나쁩니다. 장비는 실물 치수로 다시 쟀습니다. 3000번 릴 몸통이 55mm인데 68mm로 들어가 있었습니다.
FFT 바다 엔진에서 갈라져 나온 보트 낚시입니다. ntsapp.dev/fishing 에서 바로 해볼 수 있습니다. 캐스팅부터 입질, 파이팅, 랜딩까지 한 바퀴가 돌아갑니다. 바다와 물속과 섬은 그대로 물려받았고 그 위에 낚시 규칙과 어체 12종을 새로 얹었습니다.
수중을 상수 색으로 칠하던 것을 굴절 패스로 바꿨습니다. 바다와 하늘을 뺀 씬을 따로 그린 뒤 물 셰이더가 화면 좌표를 굴절시켜 읽습니다. 물기둥 두께는 가정하지 않고 깊이로 재기 때문에 외해에서는 광로가 길어져 항이 스스로 사라집니다. 그 위에 돌고래·상어·열대어가 얹혔습니다.
프로브 항력이 전체 저항의 92%를 차지하며 전진까지 묶고 있었습니다. 히브와 롤을 잡으려고 저면적 기준으로 크기를 잡은 항이라 전후 방향에는 과대했습니다. 속도가 오르자 느릴 땐 닿지 못하던 결함 둘이 드러나 함께 고쳤습니다 — 피치 69도로 영구 고착되던 것과, 선수가 처박혀도 추력이 계속 나오던 것입니다.
쇄파선을 고정된 원이 아니라 파고로 정해지는 수심 등고선으로 잡았습니다. 미풍이면 수심 1.5m 부근, 강풍이면 8m까지 밀려납니다. 배에는 지형 접촉이 아예 없어 섬을 뚫고 지나갔는데, 부력과 같은 프로브에 접촉을 걸어 완만한 해변에는 선수부터 얹히게 했습니다.
일반 몹의 체력을 70%로 낮췄습니다. 정예 판정 이후에 적용해서 정예 배수와 보스 곡선은 건드리지 않습니다. 같은 시간의 처치 수는 거의 그대로인데(1211→1248) 처치 속도가 아니라 등장 속도가 상한이기 때문이고, 실제로 바뀌는 것은 한 마리당 때리는 횟수로 30% 줄어듭니다.
일시정지에서 판 설정으로 갈 때 포인터를 다시 잠갔다가 곧바로 푸는 왕복이 있었습니다. 웹에서 잠금을 풀면 커서가 브라우저가 정한 자리로 돌아가는데, 모니터가 둘이면 그게 다른 화면이라 설정 창은 떠 있는데 아무것도 못 눌렀습니다.
"몇몇만 총을 쏜다"는 피드백이 맞았습니다. 발사가 한 번에 한 발이었고 쏘는 놈을 무작위로 뽑아서, 200마리를 모아도 한 마리가 쏘는 것처럼 보였습니다. 앞줄 사수 여럿이 번갈아 쏘고 총구마다 섬광이 켜지게 했습니다. 무기 티어 6단계도 넣었는데, 인원수는 발사 빈도만 티어는 탄의 모양만 바꾸도록 축을 갈랐습니다.
서비스워커가 HTML 껍데기까지 캐시 우선으로 주고 있었습니다. 껍데기는 해시가 붙은 번들 이름을 가리키는데 새 배포가 옛 해시를 지우므로, 캐시된 껍데기가 사라진 파일을 요청해 게임이 아예 안 떴습니다. 껍데기만 네트워크 우선으로 바꾸고 캐시를 통째로 비웠습니다.
봇전만 되던 게임을 실제로 연결했습니다. 서버는 중계만 하고 판정은 접속한 사람 중 하나가 맡습니다. 방 목록에서 골라 들어가거나 비밀번호와 초대 코드로 열 수 있고, 한글 방 이름도 됩니다. 사람이 들어오면 봇이 자리를 비켜 줍니다.
각자 맵을 따로 뽑고 있어서 6분의 1 확률로만 실제로 만나졌습니다. 어긋난 맵의 높이 차이 때문에 상대가 지형 안에 서 있거나, 예측 보정에 끌려가 무한 낙사에 걸렸습니다. 호스트가 맵을 알리게 고친 뒤 예측 오차 평균이 1.923m에서 0.111m가 됐습니다.
포인터 잠금이 뱉는 수천 픽셀짜리 이동량 하나가 시점을 605도 돌리고 있었습니다. 상한을 두고 잠금 직후 첫 이벤트를 버리게 했습니다. 브라우저가 잠금을 거절해도 엔진은 잠겼다고 답하던 것, 키가 눌린 채 굳던 것도 같이 고쳤습니다.
손님은 판정을 안 돌려 팀 점수까지 0:0이었습니다. 호스트가 전적을 실어 보내게 만들면서 어시스트를 새로 넣었습니다. 죽기 전 10초 안에 피해를 준 사람이 대상이고, 막타와 아군 오사는 빠집니다.
"여섯 맵 겹침 0쌍"이 거짓 초록불이었습니다. 엄폐물을 가리는 기준이 윗면 0.9m 초과인데 드럼통 윗면이 정확히 0.9라 부두의 열두 개가 통째로 빠져 있었습니다. 미니맵에도 안 뜨고 검사에도 안 잡혔습니다. 통짜 소품에는 "제 몸의 40%" 기준을 함께 적용하도록 고쳤고, 같은 종류를 두 곳 더 찾았습니다.
여덟 명이 붙으면 동시에 울려야 하는 소리가 30개를 넘는데 자리가 20개였습니다. 게다가 빈 자리를 두고도 순서가 된 자리를 뺏어서 울리는 중인 총성을 잘랐습니다. 자리를 32개로 늘리고 노는 자리부터 쓰게 했습니다.
컨테이너·상자·방벽·드럼통·파렛트를 블렌더 스크립트로 구워 얹었습니다. 판정은 그대로 상자라 얇은 벽 보장과 되감기 비용이 안 바뀝니다. 실루엣이 생기면서 배관이 건물에 묻혀 있던 것 같은 겹침이 드러나 일곱 곳을 바로잡았고, 미니맵 바닥에는 맵 평면도를 깔았습니다.
Google Play 프로덕션 심사를 통과해 스토어에 올라갔습니다. 이제 누구나 받을 수 있습니다. 비공개 테스트 14일을 채우고 v1.2.46까지 온 끝입니다. 다음은 시즌 랭킹과 도전 과제입니다.
군중 러너 슈터를 ntsapp.dev/furball 에서 바로 해볼 수 있습니다. 털복숭이 무리가 관문을 지날 때마다 곱해지거나 깎이고, 머릿수가 곧 화력이자 방어력입니다. 캐릭터는 부팅 때 한 번 구운 아틀라스라 2000마리까지 버팁니다.
emsdk 경로가 이 PC 에 박혀 있어서 다른 기계에서는 빌드가 바로 죽었습니다. 환경변수와 흔한 위치를 차례로 뒤지게 바꾸고, 못 찾으면 설치 방법을 알려주고 멈추게 했습니다. 사내망 TLS 우회도 기본 꺼짐으로 돌려 필요할 때만 켜게 했습니다.
절차적으로 깎던 배를 실측 가능한 선체 모델로 바꾸고, 그 메시를 재서 부력 프로브 14개를 다시 배치했습니다. 폭풍에서 뒤집힌 채 안 돌아오던 문제도 복원 모멘트를 붙여 고쳤습니다. 안내서도 같이 올렸습니다.
브라우저 판에 소리가 붙고 최고 기록과 스크랩이 새로고침을 넘어 남습니다. 함께 테마 4종과 보일러에 템포가 물린 칩튠, 날짜가 곧 시드인 데일리 런, 스크랩으로 사는 영구 강화 5종이 들어갔습니다. 안내서도 같이 올렸습니다.
공개된 해양학·그래픽스 기법만으로 처음부터 구현한 실시간 바다를 ntsapp.dev/ocean 에서 바로 볼 수 있습니다. 풍속을 올리면 파고가 물리 공식대로 따라 올라가고, 배는 파면을 따라 흔들립니다. 게임이 아니라 기술 실험입니다.
달리는 열차 지붕 위를 뛰어다니며 막는 방어 게임을 ntsapp.dev/rail 에서 바로 해볼 수 있습니다. 규칙은 하나입니다. 적이 서 있는 칸에서는 그 칸의 일을 할 수 없습니다.
지도 정중앙에 조준점을 항상 띄웁니다. 지금 보고 있는 화면의 한가운데가 어디인지 알아야 포인트를 정확히 찍을 수 있어서요. 지도 조작은 그대로 통과시키고, 밝은 지형에서도 위성 사진에서도 보이게 흰 헤일로를 넣었습니다.
스웜에서 끊긴다는 제보의 원인이 성능이 아니라 히트스톱 폭주였습니다. 게임 프레임의 43.5%가 시간이 0인 채로 지나가고 있었고, 1.9%로 내렸습니다. 45분 엔딩 보스가 너무 튼튼해진 것도 시간 배율에 상한을 걸어 검증된 값으로 되돌렸습니다.
산만하던 타이틀을 패널 구조로 다시 짜고 하위 화면 네 곳의 겹침을 고쳤습니다. 그리고 이 게임 최초로 강해지지 않는 보상인 칭호 9종이 들어갔습니다. 착용하면 이름 앞에 붙고, 조건을 더 이상 만족하지 않으면 조용히 내려갑니다.
소총병, 저격병, 장교, 기관총 사수, 돌격병, 군견으로 갈랐습니다. 장교는 주변 아군의 반응을 빠르게 하고, 기관총 사수는 선회가 느려 측면이 약점이고, 군견은 냄새로 쫓아서 시야각이 없습니다. 어느 쪽을 먼저 무력화할지가 판단이 됩니다.
뛰기·서기·앉기·포복 네 자세가 속도와 발각률과 발소리를 바꾸고, 엎드리면 철조망 밑으로 지나갑니다. 숨을 참으면 조준이 안정되지만 3.5초 뒤 강제로 내쉽니다. 난이도는 적 시야·반응·화력·처형 유예 네 축을 따로 조정합니다.
직접 해보니 부위가 화면에서 겹쳐 조준이 안 됐습니다. 옆에서 보는 시점으로 바꾸니 머리에서 발까지가 화면 세로로 펼쳐집니다. 마우스를 올리면 머리, 내리면 다리를 겨눕니다. 평면이 되면서 점프도 생겼습니다.
맨손으로 시작하도록 초반 조각을 치우고, 웨이브 사이 휴식을 4.5초에서 9초로 늘려 파츠 회수할 틈을 만들었습니다. 적은 역할별로 도색과 실루엣이 갈리고, 뒤로 걸으며 쏘기만 하는 것도 막았습니다.
버벅인다는 말을 듣고 감으로 깎는 대신 먼저 쟀습니다. 조각의 면 수를 줄이고 잔해의 그림자를 끄고 탄 메시를 공유하게 바꿔 드로우콜 551에서 345, 삼각형 258k에서 75k가 됐습니다.
실내 화면 아래쪽에서 두 안내 문구가 겹쳐 뭉개지던 것을 고치고, 같은 일이 다시 생기지 않도록 화면에 떠 있는 모든 라벨의 사각형을 비교해 겹치면 실패시키는 테스트를 넣었습니다. 그 테스트가 HUD 패널이 조이스틱을 덮던 버그를 하나 더 찾아냈습니다.
로봇 대전을 ntsapp.dev/robo 에서 바로 해볼 수 있습니다. 적은 체력이 0이 되어 죽는 게 아니라 팔다리를 잃고 못 싸우게 됩니다. 부위 파괴와 열, 현장에서 무기를 주워 무장하는 조달, 역할 4종의 웨이브까지 돌아가는 프로토타입입니다.
방문할 수 있는 실내 25곳 전부에 할 일이 생겼습니다. 미니게임 34종에 메커닉 8종이고, 답이 화면에 없어 찍을 수 없는 계량 방식을 새로 넣었습니다. 점수는 전부 서버가 다시 계산합니다.
방송국, 정수장, 하수처리장, 변전소, 통신 기지국, 지하철역, 공영 주차장, 댐, 태양광 단지, 대학교, 유치원, 요양원, 종합경기장, 컨벤션 센터, 놀이공원을 더했습니다. 지하철은 광역 교통의 여섯 번째 수단이 됐습니다.
학교, 진료소, 도서관, 문화회관, 우체국에 이어 경찰서와 소방서를 따로 나누고 공장, 창고, 군 시설까지 들어갈 수 있게 했습니다. 하단 메뉴가 화면 밖으로 잘리고 HUD가 상단 바를 침범하던 것도 함께 고쳤습니다.
무엇을 수집하고 무엇을 수집하지 않는지, 브라우저에 남는 값이 무엇인지, 광고를 게재하게 되면 어떤 쿠키가 쓰이고 어떻게 끄는지를 항목별로 다시 적었습니다.
낚시일기, 낚시대회플랫폼, 벙개벙개, LiquidPvP를 왜 만들었고 무엇으로 만들었는지 글로 정리했습니다. 개발 기록이 11편이 됐습니다.
대회에 나가기 전에 챙길 것을 한 페이지에 모았습니다. 갯바위, 선상, 방파제, 백사장, 민물과 원투 중에서 고르면 해당 항목만 남습니다. 체크한 상태는 브라우저에 남고, 그대로 인쇄하면 종이 체크리스트가 됩니다.
3D 도시 건설 RPG를 ntsapp.dev/city 에서 바로 플레이할 수 있습니다. 사실상 무한한 지형에 도로와 구역을 놓으면 시민이 이사 오고, 가족의 시간표와 상점의 장부, 날씨와 교통까지 한 도시 안에서 함께 돌아갑니다. 웹 버전은 오프라인 도시로 시작합니다.
쿼터뷰 도트 잠입 액션을 ntsapp.dev/mission 에서 바로 플레이할 수 있습니다. 매 판 새로 생성되는 적진에 침투해 포로 3명을 데리고 착륙지대로 복귀하면 임무 성공입니다. 지형 5종이 투입 수단과 침투로를 바꿉니다.
HUD를 다시 짰습니다. 무기와 패시브는 상단 아이콘 바로 올라가고, 스킬·보호막·궁극기·물약·폭탄은 캐릭터 초상화 둘레에 호로 놓였습니다. 이동하는 손을 떼지 않고 누를 수 있고 발동하면 짧게 진동합니다.
보스전에 결계가 생겨 잡몹 없이 1:1로 붙습니다. 원형 액션 허브 HUD, 클래스별 보호막·궁극기 7종, 몽크와 네크로맨서 합류, BGM과 클래스별 피격 보이스까지 추가했습니다.
도감에 물고기 이미지를 올리면 흰 배경과 격자무늬를 알아서 지워 투명하게 만듭니다. 올릴 때마다 따로 다듬을 필요가 없어졌습니다.
통계 탭에서 출조 점수의 근거를 볼 수 있습니다. 점수만 보여주면 믿을 이유가 없으니, 내가 어떤 조건에서 잘 잡았는지를 같이 보여줍니다.
내 조과가 있는 지역을 고르면 매일 아침 물때를 푸시로 보냅니다. 그리고 조과를 이미지 카드로 만들어 그대로 공유할 수 있게 했습니다. 소통 게시판에는 관리자에게만 보이는 비공개 문의도 생겼습니다.
Tiny Knight Rush에 이어 Little City Story와 도트 일병 구하기를 시작했습니다. 이 달부터 만드는 것의 중심이 앱에서 게임으로 옮겨 갔습니다.
그때까지 만든 앱들을 한 주소에 모아 소개할 허브로 ntsapp.dev를 준비했습니다.
5월 말에 시작한 첫 Unity 프로젝트를 6월 중순까지 붙잡고 핵심 대전 루프를 돌아가게 만들었습니다. 떨어지는 조각을 쌓는 퍼즐에 블록을 깨는 조작을 얹은 대전 게임입니다.
3월에 만든 낚시일기를 다시 손봤습니다. 이후로도 7월까지 계속 업데이트하고 있습니다.
처음으로 Unity를 잡았습니다. 그때까지 만든 것이 전부 웹 기술이라 씬 구성부터 입력 처리까지 다시 배워야 했습니다.
낚시에서 한 걸음 벗어난 첫 앱입니다. 공통사를 가진 주변 사람들과 부담 없이 이어지는 것을 목표로 잡았고, 대화방에 가장 많은 시간을 썼습니다.
개인 기록에서 대회 운영으로 넘어갔습니다. 운영자가 다 볼 수 없는 것을 앱이 대신 보게 만드는 것이 목표였습니다.
처음 만든 앱입니다. 다녀온 낚시 자리가 기억에만 남아 잊어버리는 것이 싫어서 시작했습니다. 만드는 방법을 하나도 몰라 AI와 검색으로 배워 가며 만들었습니다.