DAY 04작업 4일째
방장이 계산하는 파티 플레이를 붙였다
공식 서버 없이 방장 컴퓨터가 던전을 계산하고 참가자는 받은 모습을 그리는 방식으로 최대 네 명 파티를 만들었다.
친구와 같이 던전을 돌 수 있게 하고 싶었다. 다만 공식 서버를 운영할 생각은 없었다. 한 명이 방을 열고 다른 사람이 IP로 들어오거나, 따로 띄운 전용 서버에 붙는 정도면 충분했다. 처음 설계할 때 로직을 화면과 나누고 난수를 시드로 고정해 둔 게 여기서 쓰였다.
누가 계산하나
두 가지를 따져 봤다. 모두가 같은 명령을 받아 각자 계산하는 방식은 주고받는 양이 적지만, 한 틱이라도 어긋나면 화면이 갈라진다. 방장 하나가 계산하고 결과를 나눠 주는 방식은 보내는 양이 많지만 어긋날 일이 없다. 최대 네 명 파티라 보내는 양은 감당할 만하다고 보고 방장 쪽을 골랐다.
참가자: 입력(명령) ──▶ 방장: 던전 한 틱 계산 ──▶ 모든 참가자: 모습(스냅샷) + 이벤트
- 방장은 파티원마다 캐릭터를 세우고, 들어온 입력을 모아 한 틱씩 계산한다.
- 매 틱 모든 액터의 위치, 상태, 체력, 쿨타임 같은 값을 숫자와 문자열 배열로 묶어 보낸다.
- 맞음, 처치, 줍기 같은 이벤트는 효과와 경험치에 필요해서 확실히 도착하는 채널로 따로 보낸다.
- 캐릭터는 각자 자기 컴퓨터에 저장된다. 들어올 때 자기 캐릭터 데이터를 보내고, 방장은 그걸로 계산한다.
파티 규칙도 이때 정했다. 처치 경험치는 모두 받고, 드롭은 먼저 닿은 사람이 가져가고, 누구든 문에 닿으면 모두 다음 방으로 가고, 모두 쓰러져야 실패다.
참가자 화면은 거울 월드
참가자 쪽은 계산하지 않는다. 받은 스냅샷을 거울 월드에 덮어써서 그리기만 한다. 이 거울 쪽 클래스는 던전 화면이 쓰는 원래 던전 진행 클래스와 같은 이름의 값과 함수를 갖추게 했다. 그래서 던전 화면 코드는 혼자 할 때와 파티일 때를 구분하지 않고 그대로 쓴다. 내 몫의 경험치와 주운 것은 방장이 보낸 이벤트에서 내 캐릭터 것만 골라 모은다.
입력이 늦게 도착할 때도 정했다. 밀린 입력이 네 개를 넘으면 합쳐서 지연이 쌓이지 않게 하고, 입력이 안 오면 마지막 이동을 이어 간다.
막힌 곳
확인은 실제로 전용 서버와 참가자 둘을 띄워서 파티 던전을 자동 플레이로 돌리는 테스트로 했다.
감수한 것
IP로 직접 붙는 방식이라 공유기 뒤에 있으면 포트를 열어야 한다. 방장이 나가면 던전도 끝나고 모두 마을로 돌아간다. 계산은 방장 컴퓨터가 다 하니 방장의 사양과 회선이 파티 전체의 체감을 정한다.