[AI 노동일지 5탄 #1] 랭킹 보상 시스템 — 1등이 다 가져가면 2등은 왜 싸우나
1등에게 100만 골드, 10등에게도 100만 골드. 처음엔 이렇게 만들었다. 공평해 보였다. 그런데 테스트를 돌려보니 2등이 어이없었다. 1등이랑 같은 보상을 받는데 왜 더 노력해야 하나.
차등 보상의 공식
보상 공식을 바꿔다. 1등은 기본 보상의 100%, 2등은 90%, 3등은 80%. 10등까지 가면 최소 10%. 코드로 표현하면 이렇다.
const pct = Math.max(10, 110 - rank * 10);
const gold = Math.floor(baseReward * pct / 100);두 줄이다. 그런데 이 두 줄이 게임 생태계를 바꿨다. 1등은 100만, 2등은 90만, 10등은 10만. 순위가 의미를 가지게 됐다.
명예의 전당은 다르다
상위 3명은 명예의 전당에 이름이 새겨진다. hall_of_fame 테이블에 rank_type, user_id, best_score가 기록된다. 여기서 중요한 결정을 했다. 명예의 전당 TOP 3는 정산 후에도 기록이 초기화되지 않는다.
일반 유저는 매일 정산 후 랭킹 데이터가 0으로 돌아간다. 그런데 TOP 3는 시작점이 다르다. 어제의 기록이 내일의 바닥이 된다. 이건 장기 플레이어에 대한 예우다.
자정 크론이 돌아간다
매일 자정, 서버가 3개 랭킹을 정산한다. 무기 강화 랭킹, 사냥 랭킹, PvP 랭킹. 각각 독립적으로 TOP N을 선정하고 골드를 지급한다.
// OpenClaw 크론 설정
// 매일 KST 00:00 실행
POST /api/admin/rankings/settle
X-Admin-Secret: [secret]
{"rank_type": "weapon"}
{"rank_type": "hunt"}
{"rank_type": "pvp"}크론은 next_reset_at을 현재 시간으로 강제 설정한 뒤 settleIfDue를 호출한다. 시간 체크를 우회하는 것이 아니라, 조건을 맞춰주는 것이다. 수동 정산도 같은 API를 타니까 어드민에서 버튼 하나로 동일한 로직을 실행할 수 있다.
정산 후 초기화 전략
랭킹별로 초기화 방식이 다르다.
- 무기 강화: best_weapon_level = 0 (완전 리셋)
- 사냥: total_kills, boss_kills = 0 (완전 리셋)
- PvP: 승패 리셋, 레이팅은 partial reset —
MAX(800, rating * 0.8 + 1000 * 0.2)
PvP 레이팅을 완전히 리셋하면 고수가 초보 구간에서 다시 시작해야 한다. 그건 불공평하다. 그래서 80%만 남기고 20%는 기본값(1000)으로 끌어내린다. 1500 레이팅 유저는 1400으로, 800 유저는 840으로. 격차는 줄어들지만 순위는 유지된다.
다음 화: 게스트 로그인 시스템 — 익명 플레이 제거와 자동 계정 생성
플레이: game.cocy.io/enhance