CS2 Practice Host 1 - 스크립트를 앱으로, 친구를 링크로
오늘 한 일
- PowerShell 프로토타입을 C#으로 옮겨 exe 하나로 만들었다
- 이유: 스크립트는 받는 사람 PC의 실행 정책에 걸리고, 검은 콘솔 창을 숨기려면 꼼수가 필요했다. 공개할 물건이라 더블클릭하면 창이 뜨는 형태여야 한다
- .NET Framework 4.8로 맞췄다. Windows에 이미 들어 있어 받는 사람이 런타임을 따로 깔 필요가 없다. 결과물은 DLL 없는 exe 하나
- 특정 PC에서만 돌던 부분 다섯 가지를 앱이 직접 하게 바꿨다
- 박아뒀던 CS2 경로를 레지스트리와 Steam 라이브러리 목록으로 찾게 했다. 못 찾으면 폴더를 직접 고르는 창이 뜬다
- 로그를 남기는 옵션과 단축키 설정을 실행할 때 인자로 붙인다. Steam 속성을 손으로 건드릴 일이 없어졌다
- 설정 저장 위치를 앱 옆이 아니라 사용자 폴더로 옮겼다
- 친구가 아무것도 설치하지 않고 들어오는 방법을 찾았다
- Steam 프로토콜 링크를 누르면 CS2가 켜지면서 그 서버로 바로 접속된다. 두 번째 PC로 확인했다
- 원래 계획은 친구용 앱을 따로 만드는 것이었는데 통째로 필요 없어졌다. 배포할 물건이 둘에서 하나로 줄었다
- 게임 중에 단축키로 서버를 새로 열어도 앱이 알아서 새 주소를 복사하게 했다
- 이유: 앱 버튼으로 열 때만 주소를 잡아주면, 게임 안에서 연 서버는 주소를 손으로 가져와야 한다
- 이름을 CS2 Practice Host로 정하고 아이콘을 만들었다
- 스코프 조준경 모양. 파일 속성에 회사와 「비공식 도구, Valve 및 Counter-Strike와 무관」을 넣어 exe 자체가 출처를 밝히게 했다
- 창 아이콘도 게임 실행 파일에서 꺼내 쓰던 것을 자체 아이콘으로 바꿨다. 이제 남의 자산을 전혀 쓰지 않는다
- 게임용 PC에 남아 있던 프로토타입 시절 설정을 전부 지우고 다시 확인했다
- 이유: 그 설정이 남아 있으면 앱이 일한 건지 옛 설정이 일한 건지 구분이 안 된다. 지우고 나서도 동작해야 남의 PC에서도 도는 것이다
- 참가 링크를 중계하는 웹 페이지를 만들고 Cloudflare Pages에 올렸다
- 이유: 메신저가 게임을 여는 주소를 누를 수 있는 링크로 만들어 주지 않고, 주소 안의 공백에서 뒤를 잘라 버린다. 일반 웹 주소는 어디서든 링크가 되니 중간에 한 단계를 둔다
- 주소를 붙여넣는 칸도 뒀다. 처음엔 시험용이었는데, 링크가 어디선가 잘렸을 때 주소만 받아 들어가는 길이 되기도 한다
- 휴대폰에서 열면 접속 버튼 대신 PC에서 열라는 안내가 나온다. 메신저는 휴대폰으로 보는 사람이 많다
- 앱이 복사하는 링크를 그 페이지 주소로 바꿨다. 사슬 전체를 확인했다
- 링크 전송부터 게임 접속까지 이어지는 것을 실기로 확인했다. 브라우저가 공백을 바꿔서 넘기는데도 게임이 알아들었다
막힌 부분
- 참가 링크를 카카오톡에 붙여넣으면 뒤가 잘렸다
- 원인: 링크 안에 공백이 하나 있어서, 메신저가 거기서 주소가 끝났다고 본다. 게다가 메신저 대부분은 일반 웹 주소만 누를 수 있는 링크로 만들어 준다
- 해결: 주소를 받아 게임으로 넘겨주는 중계 페이지를 두고, 앱이 그 페이지 주소를 복사하게 했다. 일반 웹 주소라 공백도 없고 어디서든 링크가 된다
- 공백을 바꿔서 넘겨도 게임이 알아듣는지가 미지수였는데, 페이지를 만들어 눌러보는 것이 곧 그 확인이었다
- 페이지를 올렸는데 주소를 열자 404가 나왔다
- 원인: 페이지가 하위 경로에 있는데 맨 위 주소로 열었다. 맨 위에는 아직 아무 파일도 없다
- 해결: 하위 경로로 열어 동작을 확인했다. 맨 위는 설명서 자리로 남겨둔다
- 게임 안에서 단축키를 눌렀는데 아무 일이 없었다
- 원인: CS2 단축키는 맵에 들어가 있을 때만 먹고 메인 화면에서는 안 먹는다. 방장이 나가면 서버가 닫혀 메인 화면으로 나와지니, 그 상태에서 단축키를 누르면 아무 일도 일어나지 않는다
- 해결: 앱 안내에서 「게임 중」을 「맵 안에서」로 바꿨다. 「게임 중」은 CS2가 켜져 있을 때로 읽혀서 헷갈린다
더블클릭해도 아무 일이 일어나지 않았다
만든 exe를 게임용 PC로 옮겨 실행했는데 창도 오류도 없이 조용했다. 백신이 지웠나, 파일이 막혔나부터 의심했는데 둘 다 아니었다.
화면을 여는 준비 과정에서 오류가 나면 오류창을 띄우는 장치가 아직 붙기 전이라, 프로그램이 그냥 사라진다. 사용자 눈에는 더블클릭이 먹지 않은 것으로 보인다.
- 해결: 시작 단계 전체를 감싸서 오류를 붙잡고, 내용을 창으로 보여주면서 클립보드에도 복사하게 했다. 그 뒤 다시 실행하니 원인이 한 줄로 나왔다
- 실제 원인은 저장된 설정을 되살리는 순서였다. 첫 항목을 정하는 순간 「설정이 바뀌었으니 저장해」가 딸려 실행되는데, 그때는 나머지 항목이 아직 안 정해진 상태라 없는 값을 읽다 터졌다
- 개발 PC에는 게임이 없어서 그 코드에 닿기도 전에 종료돼, 멀쩡한 것처럼 보였다
서버가 닫힌 뒤에도 옛 주소가 복사됐다
게임이 남기는 기록 파일은 게임을 껐다 켜도 지워지지 않는다. 주소 복사가 그 파일의 마지막 주소를 시각도 보지 않고 집어 오고 있었다.
그래서 서버가 이미 닫힌 뒤에 복사를 눌러도 아무 일 없는 것처럼 주소가 나왔다. 친구에게 이미 죽은 링크를 보내게 된다.
- 해결: 게임이 켜져 있는지, 그 게임이 앱으로 켠 것인지, 서버가 지금 열려 있는지를 차례로 확인하고 살아 있을 때만 주소를 준다. 아니면 어느 단계에서 막혔는지 알려준다
봇을 일곱으로 해도 넷만 나왔다
봇 수를 일곱으로 두고 한쪽 팀으로 몰았는데 실제로는 넷만 들어왔다. 게임 콘솔에서 확인해보니 우리가 쓴 값은 일곱으로 제대로 들어가 있었다. 설정은 먹었는데 스폰만 막힌 것이다.
숫자를 대조해보니 한 팀이 상대 팀보다 두 명 넘게 많아질 수 없다는 규칙에 걸린 거였다. 사람 한 명이면 봇 셋, 둘이면 넷. 양쪽에 섞으니 일곱이 전부 나와 4대 4가 됐다.
이 제한을 끄는 설정이 있어서 껐더니 매치가 시작되는 순간 게임이 되돌려놨다. 모드가 강제하는 값이라 우리가 못 끈다.
- 해결: 싸우지 않고 알려주기로 했다. 봇을 한쪽으로 골랐을 때만 「한 팀으로 몰면 봇은 사람 수 + 2까지만 나와요」와 해결책을 띄운다
- 고를 수는 있는데 그만큼 안 나오는 상태가 제일 나쁘다. 쓰는 사람은 그걸 고장으로 본다
다음에 할 일
- 중계 페이지에 소유 도메인을 붙이고, 새 실행 파일로 링크가 실제로 열리는지 확인한다
- 중계 페이지에 광고 자리를 잡는다. 접속 버튼까지 가는 길에 광고가 끼지 않게 두고, 이런 성격의 페이지에 광고를 붙여도 되는지 정책을 먼저 확인한다
- 맨 위 주소에 보일 페이지를 만든다. 설명서 자리이기도 하다. 첫 줄은 「게임은 이 앱으로 켜세요」여야 한다
- 두 페이지 디자인을 같은 결로 다듬고, 그다음 로그스톤 샵 무료 앱 선반에 올린다
- 함께 플레이한 사람이 단축키 두 개가 헷갈린다고 했다. 하나는 친구가 남고 하나는 전부 끊기는데 생김새가 비슷하다. 위험한 쪽을 없앨지 정해야 한다
- 코드 정리. 하루 만에 몰아쳐서 죽은 코드와 한 파일에 몰린 덩어리가 남았다
- 릴리스 전용 저장소 만들기
- 확인이 남은 것들 — 봇 난이도 값 대조, 탈환 모드에서 옵션이 잠기는지, 새 실행 파일로 친구가 실제로 접속되는지