이번 한 주는 풋살 온라인 프로젝트를 하느라 빠르게 지나갔다.
게임 로직은 플레이어의 스탯이 되도록 개연성있게 반영될 수 있도록 기획하였습니다. 다음과 같은 룰을 가집니다.
(모든 계수는 config값으로 설정 변경 가능함)
공격 수비 결정 수치는 선수의 (패스 0.65 + 주력 0.35) * (현재 지구력)의 합산으로 계산됩니다.
공격능력은 공격팀의 (골결정력 0.5 + 개인기 0.2 + 민첩성 0.3) (현재 지구력) 의 합산으로 계산됩니다.
수비능력은 수비팀의 (수비력 0.65 + 민첩성 0.35) * (현재 지구력) 의 합산으로 계산됩니다.
매칭을 찾는 유저 기준으로 -50~+50점 범위 내 점수를 가진 유저와 매칭을 시도합니다.
매칭 시도했음에도 상대를 찾지 못할 경우, 해당 범위를 늘려가며 매칭을 시도합니다.
이 과정을 반복함에도 최대 반복횟수동안도 상대를 찾지 못할 경우에 매치메이킹의 실패를 처리합니다.
ELO 랭킹과 관련해서는 기본적으로 명시된 조건에 따라 구현하는 방향을 선택했습니다.
매치메이킹 이후 승무패 결과에 따라 기본 1000점으로 부여받았던 레이팅 점수에 대해 +10점, 혹은 변동없음 혹은 -10점이 반영되도록 햇습니다.
랭킹과 관련해서는 동일 점수를 가진 유저들이 존재하는 부분이 있는데, 간단히 조회하는 유저보다 높은 점수를 가진 유저들의 수를 합산한 랭킹으로 표시되기 때문에, 동일 레이팅 점수를 가진다면 동일한 랭킹을 가지게 됩니다.
로직과 기획 변경으로 데이터 모델을 수정했을 때, prisma 클라이언트의 재생성과 데이터 마이그레이션은 필수적입니다. 다만, 변경 사항을 적용한 줄 알고 진행을 하다가 변경 사항이 적용되기 이전의 모델을 참조하게 되어 에러를 겪는 상황이 발생했습니다.
다소 복잡한 게임로직을 사용하기 위해, utils로 따로 구현한 로직에 관한 함수를 사용할 때 발생했습니다. 쿼리를 수행하여 가져온 테이블 내용형식과 파라미터 형식 및 속성을 일치시켰음에도 발생했습니다.
이는 반환 형식이 객체였기 때문에, simulateMatch
함수에서 반환하는 객체의 속성명과 실제 API에서 사용하는 변수명이 일치하지 않아서 발생했습니다. 객체의 속성명을 일치시키는 방향으로 해결했습니다.